در دنیای توسعه و عملیات نرمافزار مدرن، دیدن توانایی است. وقتی برنامهها در سیستمهای توزیعشده مقیاس مییابند، لاگگیری سنتی اغلب برای شناسایی گلوگاههای عملکرد یا خرابیهای سیستم بهصورت بلادرنگ کافی نیست. اینجاست که Prometheus، یک ابزار پایش و هشدار متنباز که در ابتدا توسط SoundCloud ساخته شد، درخشش میکند. به عنوان استاندارد غیررسمی برای محیطهای کانتینری و معماریهای بومی ابری، Prometheus یک مدل داده چندبعدی قوی و یک زبان پرسوجوی قدرتمند به نام PromQL ارائه میدهد.
این راهنما شما را با اصول اولیه راهاندازی Prometheus، درک Exporterها و پیکربندی اولین هشدارهای شما همراهی میکند. چه یک معماری میکروسرویس اجرا کنید و چه یک برنامه تکتکه (Monolithic) روی یک سرور واحد، پیادهسازی Prometheus میتواند قابلیت اطمینان سیستم شما و زمان پاسخگویی تیم شما به حوادث را بهطور قابلتوجهی بهبود بخشد.
درک معماری
قبل از غرق شدن در پیکربندی، درک نحوه جمعآوری دادهها توسط Prometheus حیاتی است. Prometheus متریکها را ارسال (Push) نمیکند؛ بلکه آنها را دریافت (Pull) میکند. این مدل مبتنی بر دریافت، امنیت و مقیاسپذیری را ساده میکند. سرورهای Prometheus در فواصل زمانی منظم، نقاط پایانی (Endpoints) متریکهایی را که توسط برنامه یا اجزای زیرساخت شما در معرض قرار گرفتهاند، اسکن (Scrape) میکنند. این نقاط پایانی معمولاً دادهها را در یک قالب متنی ساده به نام Exposition Format برمیگردانند.
از آنجا که بیشتر برنامهها بهطور پیشفرض متریکها را در معرض قرار نمیدهند، ما از «Exporterها» استفاده میکنیم. یک Exporter قطعه کدی است که متریکهای سطح سختافزار یا سیستمعامل را از یک جزء خاص جمعآوری کرده و آنها را به فرمتی ترجمه میکند که Prometheus بتواند اسکن کند. برای مثال، Node Exporter استفاده از CPU و حافظه را جمعآوری میکند، در حالی که cAdvisor متریکهای کانتینر را ارائه میدهد.
پیکربندی Prometheus
هسته اصلی Prometheus فایل پیکربندی آن است که معمولاً با نام prometheus.yml شناخته میشود. این فایل YAML تنظیمات سراسری، اهداف اسکن و فایلهای قوانین را تعریف میکند. یک پیکربندی پایه شبیه به قطعه کد زیر است که localhost را در پورت 9090 (پورت پیشفرض Prometheus) و پورت 9100 (پورت پیشفرض Node Exporter) هدف قرار میدهد.
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node-exporter'
static_configs:
- targets: ['localhost:9100']
در این پیکربندی، scrape_interval تعیین میکند که Prometheus هر چند وقت یکبار دادهها را دریافت میکند. تنظیم این مقدار بر اساس نیازهای خاص شما—مانند افزایش آن برای کاهش بار در دورههای کمترافیک یا کاهش آن برای جمعآوری دادههای با فرکانس بالا—یک تکنیک بهینهسازی رایج است.
یکپارچهسازی برنامههای سفارشی
در حالی که متریکهای سیستمی حیاتی هستند، متریکهای منطق کسبوکار نیز به همان اندازه مهماند. فرض کنید یک برنامه وب پایتون با استفاده از Flask اجرا میکنید. شما میتوانید کد خود را برای در معرض قرار دادن متریکهای سفارشی، مانند تأخیر درخواست یا نرخ خطا، با استفاده از کتابخانهای مانند prometheus_client ابزارمند (Instrument) کنید.
با تعریف یک هیستوگرام برای مدت زمان درخواست، میتوانید بینش عمیقی درباره عملکرد برنامه خود تحت بار کسب کنید. در اینجا یک مثال سادهشده از نحوه تعریف یک متریک در برنامه شما آورده شده است:
from prometheus_client import Histogram, start_http_server
import time
REQUEST_DURATION = Histogram('request_duration_seconds', 'Description of histogram')
@app.route('/api/data')
def handle_data():
with REQUEST_DURATION.time():
# Simulate some work
time.sleep(1)
return "Data processed"
این کد بهطور خودکار یک نقطه پایانی /metrics را در معرض قرار میدهد که Prometheus میتواند آن را اسکن کند. اطمینان حاصل کنید که برنامه شما به 0.0.0.0 متصل میشود تا سرور Prometheus، که ممکن است در یک کانتینر جداگانه اجرا شود، بتواند به آن دسترسی پیدا کند.
بصریسازی و هشداردهی
Prometheus در ذخیرهسازی و پرسوجوی دادهها عالی است، اما فاقد رابط کاربری بصری داخلی برای داشبوردهای پیچیده است. اینجاست که Grafana وارد عمل میشود. با اتصال Grafana به منبع داده Prometheus خود، میتوانید داشبوردهای بصری و بلادرنگی ایجاد کنید که روندها را در طول زمان نمایش میدهند.
علاوه بر این، Prometheus میتواند هشدارها را بر اساس قوانین تعریفشده فعال کند. برای مثال، میتوانید پیکربندی کنید که اگر استفاده از CPU بیش از 80 درصد برای بیش از پنج دقیقه ادامه یابد، یک هشدار فعال شود. این هشدار میتواند به ابزارهایی مانند Slack، PagerDuty یا ایمیل ارسال شود، اطمینان حاصل میکند که تیم شما بلافاصله از مشکلات حیاتی مطلع میشود.
نتیجهگیری
پیادهسازی Prometheus یک گام بنیادین به سمت یک فرهنگ DevOps بالغ است. این کار عیبیابی واکنشی را به پایش پیشدستانه تبدیل میکند. با درک Exporterها، پیکربندی صحیح اهداف اسکن و یکپارچهسازی متریکهای برنامه سفارشی، شما دیدی جامع از سلامت سیستم خود کسب میکنید. با اصول اولیه شروع کنید، پوشش پایش خود را به تدریج گسترش دهید و از Grafana برای تبدیل دادههای خام به بینشهای عملیاتی استفاده کنید. شما در آینده—و کاربران شما—به خاطر قابلیت اطمینان و عملکرد بهبودیافته از شما سپاسگزار خواهند بود.