پایش پایپلاینهای داده با متریکهای سفارشی Prometheus
چگونه برای صفهای کافکا و jobهای ETL متریکهایی بسازیم که واقعاً خرابی را زودتر از کاربر اعلام کنند: lag، نرخ شکست و هشدارهای بیصدا.
سهراب حسینیمهندس داده و اتوماسیون
پایپلاینی که «سالمند» نباشد، بیصدا میمیرد: ساعتها پیام جا میماند و کسی خبردار نمیشود تا گزارش ماهانه ناقص از راه برسد. در این مقاله، حلقه پایشی را میسازیم که خرابی را با متریک، نه با تلفن کاربر اعلام میکند.
سه متریکی که واقعاً چیزی میگویند
کلیشههای CPU و RAM برای پایپلاین کافی نیستند. متریکهای اصلی ما:
- Consumer lag: فاصله آخرین offset مصرفشده با آخرین offset پارتیشن — مادرِ همه هشدارهای صف.
- نرخ شکست بهازای هر مرحله: خطاها را بهازای هر stage بشمارید، نه کل job.
- سن داده (data freshness): قدیمیترین رکورد پردازشنشده چند ساعته است؟
# ساخت Gauge سفارشی برای lag هر consumer group
from prometheus_client import Gauge
KAFKA_LAG = Gauge(
"kafka_consumer_lag",
"Offset lag per partition",
["topic", "partition", "consumer_group"],
)
def report_lag(consumer, assignment):
end = consumer.end_offsets(assignment)
pos = consumer.position # موقعیت فعلی
for tp, offset in end.items():
KAFKA_LAG.labels(tp.topic, str(tp.partition), consumer.group).set(
max(offset - pos[tp], 0)
)
هشدارهایی که بیصدا نمیمانند
قاعده طلایی: هشدار باید یا «اقدام فوری» داشته باشد یا حذف شود. سه هشدار اصلی ما:
- lag > ۵ دقیقه ترافیک، ۱۰ دقیقه پیاپی → صفحه بیدار (severity: page).
- نرخ شکست stage بیش از ۲٪ در ۱۵ دقیقه → تیکت خودکار با آخرین ۱۰۰ خطای لاگ.
- سن داده گزارش شبانه > ۲ ساعت بعد از SLA → پیام به کانال تیم داده.

groups:
- name: pipeline-lag
rules:
- alert: KafkaConsumerLagHigh
expr: kafka_consumer_lag > 5000
for: 10m
labels:
severity: page
annotations:
summary: "lag پارتیشن {{ $labels.partition }} بالاست"
داشبوردی که میتوان با آن تصمیم گرفت
داشبورد اصلی فقط سه پنل دارد: lag بهازای topic، نرخ شکست بهازای stage، و سن داده. بقیه چیزها (CPU، حافظه، اتصالها) در داشبورد تفصیلیاند — جایی که فقط موقع بررسی ریشه مشکل باز میشوند.
| سیگنال | آستانه هشدار | هدف پاسخ |
|---|---|---|
| Consumer lag | ۵ دقیقه | زیر ۱۵ دقیقه |
| نرخ شکست stage | ۲٪ در ۱۵ دقیقه | زیر ۱۰ دقیقه |
| سن داده گزارش | ۲ ساعت از SLA | زیر ۵ دقیقه |
نتیجهگیری
پایشِ خوب پایپلاین یعنی سؤال «الان چیزی از دست رفته است؟» در ۳۰ ثانیه جواب داشته باشد. اگر متریکهای شما به این سؤال جواب نمیدهند، در حال اندازهگیری چیز اشتباهی هستید.
برچسبها
سهراب حسینی
مهندس داده و اتوماسیوندرباره نویسنده
طراحی پایپلاینهای ایونتمحور، صفهای توزیعشده و سامانههای پایش برای سازمانهای با دادههای تراکنشی سنگین.
مقالات نویسنده

