چطوری بدون ترکوندن دیتا به prometheus تارگت جدید اضافه کنیم.

خب حالا چرا ریستارت Prometheus برای اضافه کردن تارگت بده ؟
بذارید یه سناریوی دردناک رو با هم مرور کنیم. فرض کنید یه شب خوشحال نشستید و دارید سرورهای جدیدی رو به مانیتورینگ اضافه میکنید. تغییرات رو توی prometheus.yml انجام میدید و بعد خیلی با اعتماد به نفس میزنید
systemctl restart prometheus or docker restart prometheus
و بوووم! 🤯 یه لحظه به خودتون میاید و میبینید همهی چانک هایی که کش شده در حافظه پر! و تا دوباره prometheus بیاد بر اساس wal فایل هایی که داره دوباره چانک هارو بسازه data gathering نداری!! یعنی چی؟ یعنی اگه توی این مدت متریکهای لحظهای مهمی وجود داشته باشه، از دست رفته حسابشون کن!
حالا شاید بگی مگه چقدر طول میکشه؟ آره اگر توی محیط های کوچیک اینکارو انجام بدی چیزی حس نمیکنی ولی اگر توی محیطی باشه که تارگت ها زیاده یا حجم متریک ها زیاد باشه ممکنه حتی ۵ دقیقه طول بکشه :) یعنی دیتای اکسپورتری که در دسترسه رو برای ۵ دقیقه نداری. مثلاً اگر توی همین لحظه یه سرور داشت میترکید، شما هیچ وقت نمیفهمید :)
پس برای جلوگیری از این فاجعه، باید Prometheus رو بدون ریستارت آپدیت کنیم! 😎 و اینجاست که دو راهکار خفن داریم.
روش اول: استفاده از API ریلود (روش باحال و ایمن)
با استفاده از --web.enable-lifecycle میتونیم یه API رو فعال کنیم که فقط کانفیگ رو ریلود کنه، بدون اینکه Prometheus رو از اول راهاندازی کنه.
- اجرای Prometheus با قابلیت ریلود:
prometheus --config.file=prometheus.yml --web.enable-lifecycle
- تغییر کانفیگ Prometheus
مثلا تارگت جدیدو اضافه میکنیم
scrape_configs:
- job_name: 'static_targets'
static_configs:
- targets: ['localhost:9090']
- targets: ['192.168.1.100:9100'] #NewTarget
- ارسال درخواست ریلود
به جای اینکه Prometheus رو ریستارت کنیم، این درخواست ساده رو میفرستیم:
curl -X POST http://localhost:9090/-/reload
حالا میدونی خوبیش چیه ؟ این api ریلود قبل از ریلود کردن syntax check هم برات انجام میده اگر خطایی باشه اعمال نمیشه. چی از این بهتر ؟
روش دوم: استفاده از Service Discovery (راه حل خودکار و هوشمندانه)
مشکل روش قبلی چیه؟ اینکه باید API رو صدا بزنیم. خب اگه یادمون بره چی؟ 😅 یا اگه خودمون یه سیستم خودکار داشته باشیم که داره سرورها رو به مانیتورینگ اضافه میکنه؟
اینجاست که Service Discovery میاد وسط و مشکل رو حل میکنه.
- تغییر کانفیگ برای استفاده از SD
برای این کار اول باید کانفیگ prometheus رو کلا ادیت کنی که از sd استفاده کنه.
scrape_configs:
- job_name: 'sd_targets'
file_sd_configs:
- files:
- 'targets.json'
refresh_interval: 30s
🚀 این تنظیمات باعث میشه Prometheus هر 30 ثانیه فایل targets.json رو چک کنه و بدون نیاز به ریلود، تغییرات رو اعمال کنه!
- فایل targets.json رو ایجاد کنیم
اولین نسخه:
[
{
"targets": ["localhost:9090"],
"labels": { "env": "dev" }
}
]
حالا میخوایم یه سرور جدید اضافه کنیم، فقط کافیه فایل رو آپدیت کنیم:
[
{
"targets": ["localhost:9090"],
"labels": { "env": "dev" }
},
{
"targets": ["192.168.1.10:9100"],
"labels": { "env": "prod" }
}
]
✅ Prometheus این تغییرات رو بدون نیاز به هیچ دستوری، هر 30 ثانیه چک میکنه و سرور جدید رو اضافه میکنه.
💡 دیگه نیاز به API کال هم نداریم!