How-To Guides

تسلط بر مشاهده‌پذیری برنامه: راهنمای جامع مانیتورینگ با Prometheus

در منظره مدرن توسعه نرم‌افزار، به‌ویژه در محیط‌های میکروسرویس و کانتینری، تکیه بر بررسی‌های ساده در دسترس بودن دیگر کافی نیست. توسعه‌دهندگان و مهندسان قابلیت اطمینان سایت (SREs) به بینش عمیقی درباره عملکرد سیستم، استفاده از منابع و سلامت برنامه در زمان واقعی نیاز دارند. اینجاست که Prometheus، یک ابزار مانیتورینگ و هشداردهی سیستم‌های متن‌باز که در ابتدا در SoundCloud ساخته شد، به عنوان استاندارد پیش‌فرض ظهور کرده است. این راهنما شما را از مراحل اساسی پیاده‌سازی مانیتورینگ Prometheus برای برنامه‌هایتان عبور می‌دهد و بر پیاده‌سازی عملی تمرکز دارد، نه صرفاً تئوری.

چرا Prometheus را انتخاب کنیم؟

قبل از ورود به تنظیمات، درک این نکته حیاتی است که چرا Prometheus انتخاب ترجیحی بسیاری از تیم‌های مهندسی است. برخلاف ابزارهای مانیتورینگ سنتی که به متریک‌های مبتنی بر Push یا لاگ‌های مبتنی بر Pull تکیه دارند، Prometheus از معماری Pull-based استفاده می‌کند. این بدان معناست که آن متریک‌ها را از برنامه شما از طریق endpointهای HTTP در فواصل زمانی مشخص جمع‌آوری (scrape) می‌کند. این انتخاب طراحی مزایای متعددی دارد: 1. **سادگی:** عامل‌ها (Agents) نیازی به مدیریت خطاهای شبکه ندارند؛ سرور مرکزی مسئول تلاش مجدد و رفع مشکلات اتصال است. 2. **مقیاس‌پذیری آسان:** قابلیت‌های مقیاس‌پذیری افقی به شما اجازه می‌دهد سرورهای بیشتری اضافه کنید بدون اینکه نیاز باشد کد برنامه خود را به طور قابل توجهی تغییر دهید. 3. **زبان پرس‌وجوی قدرتمند (PromQL):** Prometheus یک زبان پرس‌وجوی بسیار انعطاف‌پذیر ارائه می‌دهد که امکان تحلیل و تجمیع پیچیده متریک‌ها را فراهم می‌کند.

مرحله ۱: ابزارگذاری (Instrumenting) برنامه شما

برای مانیتورینگ یک برنامه، باید متریک‌های خود را در فرمتی که Prometheus بتواند درک کند، معمولاً فرمت OpenMetrics یا فرمت نمایش Prometheus، در دسترس قرار دهد. اکثر زبان‌های محبوب کتابخانه‌های کلاینتی دارند که این فرآیند را ساده می‌کنند. برای مثال، اگر از Go استفاده می‌کنید، می‌توانید از کتابخانه رسمی `prometheus/client_golang` استفاده کنید. در اینجا یک قطعه کد ساده برای نمایش یک هیستوگرام برای تأخیر درخواست‌های HTTP آورده شده است:
package main

import (
    "net/http"
    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/promhttp"
)

var requestLatency = prometheus.NewHistogramVec(
    prometheus.HistogramOpts{
        Name:    "http_request_duration_seconds",
        Help:    "Duration of HTTP requests.",
        Buckets: prometheus.DefBuckets,
    },
    []string{"method", "status"},
)

func main() {
    prometheus.MustRegister(requestLatency)

    http.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) {
        start := time.Now()
        // ... process request ...
        latency := time.Since(start).Seconds()
        requestLatency.WithLabelValues(r.Method, "200").Observe(latency)
        w.WriteHeader(http.StatusOK)
    })

    http.Handle("/metrics", promhttp.Handler())
    http.ListenAndServe(":8080", nil)
}
در این کد، ما یک متریک هیستوگرام تعریف می‌کنیم که مدت زمان تماس‌های API را، دسته‌بندی شده بر اساس روش HTTP و کد وضعیت، ردیابی می‌کند. endpoint `/metrics` این مقادیر را در فرمت متن ساده‌ای که برای Prometheus مورد نیاز است، ارائه می‌دهد.

مرحله ۲: پیکربندی Prometheus

پس از اینکه برنامه شما متریک‌ها را در دسترس قرار داد، باید Prometheus را برای جمع‌آوری آن‌ها پیکربندی کنید. این کار از طریق فایل پیکربندی `prometheus.yml` انجام می‌شود. شما «کارهایی» (jobs) را تعریف می‌کنید که به اهداف ثابت (نمونه‌های برنامه شما) اشاره دارند و فاصله جمع‌آوری را تنظیم می‌کنید.
global:
  scrape_interval: 15s

evaluation_interval: 15s

scrape_configs:
  - job_name: 'my-application'
    static_configs:
      - targets: ['localhost:8080']
این پیکربندی به Prometheus می‌گوید که هر ۱۵ ثانیه متریک‌ها را از `localhost:8080` جمع‌آوری کند. در یک محیط تولید، معمولاً از کشف سرویس (مانند کشف سرویس Kubernetes) برای تشخیص خودکار نمونه‌های جدید برنامه شما هنگام مقیاس‌دهی به بالا یا پایین استفاده می‌شود.

مرحله ۳: نوشتن کوئری‌های موثر با PromQL

قدرت واقعی Prometheus در زبان پرس‌وجوی آن، PromQL نهفته است. برخلاف SQL که پایگاه‌های داده را پرس‌وجو می‌کند، PromQL داده‌های سری زمانی را پرس‌وجو می‌کند. برای تجسم متریک‌های خود، معمولاً Prometheus را به یک ابزار داشبورد مانند Grafana متصل می‌کنید. برای به دست آوردن میانگین تأخیر درخواست برای API خود، ممکن است از کوئری زیر استفاده کنید:
rate(http_request_duration_seconds_sum{job="my-application"}[5m]) 
/ 
rate(http_request_duration_seconds_count{job="my-application"}[5m])
این کوئری نرخ افزایش ثانیه‌به‌ثانیه میانگین مجموع تأخیرها را در ۵ دقیقه گذشته محاسبه می‌کند و آن را بر تعداد درخواست‌ها تقسیم می‌کند که به طور مؤثر میانگین تأخیر را به شما می‌دهد.

نتیجه‌گیری

پیاده‌سازی مانیتورینگ Prometheus، برنامه شما را از یک جعبه سیاه به یک سیستم شفاف و قابل مشاهده تبدیل می‌کند. با ابزارگذاری کد خود، پیکربندی جمع‌آوری‌کننده‌ها و تسلط بر PromQL، بینش‌های لازم را برای تشخیص ناهنجاری‌ها قبل از تأثیرگذاری بر کاربران به دست می‌آورید. با رشد زیرساخت شما، این تمرینات ستون فقرات یک استراتژی مشاهده‌پذیری قوی را تشکیل می‌دهند و قابلیت اطمینان و عملکرد را در مقیاس بزرگ تضمین می‌کنند. کوچک شروع کنید، حیاتی‌ترین خدمات خود را ابزارگذاری کنید و به تدریج پوشش مانیتورینگ خود را برای ساختن یک سیستم مقاوم گسترش دهید.
Share: