چطور یه Metrics Exporter مخصوص کوبرنتیز بسازیم
خلاصهٔ کاملتر
Kubernetes بهطور پیشفرض فقط CPU و حافظه رو مانیتور میکنه، ولی خیلی از تصمیمهای اسکیل کردن واقعی به دادههایی نیاز دارن که کاملاً بیرون از این محدودهان؛ مثلاً چندتا پیام تو صف منتظرن، آخرین batch job چقدر طول کشیده، یا چندتا کانکشن WebSocket فعاله. نویسنده تو این پست قدمبهقدم نشون میده چطور یه exporter از صفر بنویسیم، توی یه کانتینر بستهبندیش کنیم و به کلاستر وصلش کنیم تا Prometheus و در نهایت HorizontalPodAutoscaler بتونن ازش استفاده کنن.
طبق مقاله، قبل از نوشتن کد باید نوع سیگنال رو مشخص کنی: Counter فقط زیاد میشه (مثل تعداد jobهای پردازششده)، Gauge یه مقدار لحظهایه که هم بالا میره هم پایین (مثل عمق صف)، و Histogram توزیع مقادیری مثل تأخیر رو ثبت میکنه تا بشه صدکهایی مثل p99 رو حساب کرد. اسم متریکها هم باید از الگوی __ پیروی کنن. ثبت یه Gauge با کتابخونه Prometheus برای Go اینشکلیه:
queueDepth = prometheus.NewGauge(prometheus.GaugeOpts{
Name: "worker_queue_depth",
Help: "Current number of jobs waiting in the queue.",
})prometheus.MustRegister اگه یه متریک تکراری ثبت بشه panic میکنه، که مشکلات کانفیگ رو همون اول کار مشخص میکنه.
برای بهروز نگهداشتن مقدارها، یه گوروتین polling هر چند ثانیه یهبار مقدارهای واقعی رو از دیتابیس یا صف پیام میخونه و متریکها رو آپدیت میکنه؛ نویسنده تأکید میکنه این فاصله باید کوتاهتر از فاصله scrape Prometheus باشه (معمولاً پونزده ثانیه) تا هر بار مقدار تازه دیده بشه. بعد از تست لوکال، exporter با یه build چندمرحلهای توی یه ایمیج داکر کوچیک بستهبندی میشه:
FROM golang:1.21-alpine AS builder
WORKDIR /src
RUN CGO_ENABLED=0 go build -o /exporter .
FROM gcr.io/distroless/static:nonroot
COPY --from=builder /exporter /exporter
ENTRYPOINT ["/exporter"]استفاده از distroless/static:nonroot باعث میشه ایمیج نه شلی داشته باشه نه پکیجمنیجری، و پیشفرض هم غیر روت اجرا بشه.
برای دیپلوی، یه Deployment ساده با محدودیت منابع کم و یه liveness probe روی مسیر /healthz، بههمراه یه Service که پورتش رو با اسم metrics معرفی میکنه کافیه. بعدش بسته به اینکه Prometheus چطور نصب شده، یا از طریق Prometheus Operator و یه ServiceMonitor بهش میگی این سرویس رو اسکرپ کنه، یا مستقیم از هر Pod اسکرپ میگیره.
نکات کلیدی:
- Exporter یه HTTP سرور کوچیکه که وضعیت اپلیکیشن رو روی مسیر /metrics به فرمت متنی Prometheus منتشر میکنه
- سه نوع متریک اصلی: Counter (فقط افزایشی)، Gauge (بالا و پایین)، Histogram (توزیع مقادیر و صدکها)
- کتابخونه Prometheus برای Go رایجترین انتخاب توی اکوسیستم Kubernetesه
- ساخت ایمیج چندمرحلهای با base ایمیج distroless حجم و امنیت رو بهتر میکنه
- دیپلوی نهایی فقط به یه Deployment و Service نیاز داره تا Prometheus بتونه اسکرپ کنه




