Gjallar؛ مانیتورینگ کل سرویسها با یه باینری Go
خلاصهٔ کاملتر
نویسنده تو این پست تعریف میکنه چرا بهجای سرهم کردن Prometheus و Alertmanager و Grafana، ابزار مانیتورینگ خودشو نوشته. اون باید یه مشت سرویس ناهمگون رو میپایید: endpointهای HTTP، پایگاههای PostgreSQL و Oracle، Redis، ایندکسهای Elasticsearch و ماشینهایی که باید به ping جواب بدن. به گفتهٔ خودش برای چند ده تا چک، راه انداختن یه سیستم توزیعشدهٔ دوم منطقی نبود. نتیجه شد Gjallar: یه باینری استاتیک، یه فایل YAML، یه فایل SQLite و حدود ۳۴۰۰ خط Go با لایسنس MIT.
کل پروژه با CGO_ENABLED=0 بیلد میشه، یعنی هیچ وابستگی به کتابخونههای C نداره. این کار ممکن شده چون هر درایوری که قبلاً به یه کتابخونهٔ C وصل میشد، حالا جایگزین خالص Go داره: pgx برای PostgreSQL، go-ora برای Oracle که دیگه نصب Oracle Instant Client رو لازم نداره، pro-bing برای ICMP و modernc.org/sqlite برای ذخیرهسازی. چک Redis هم اصلاً درایور نمیخواد و مستقیم با پروتکل حرف میزنه. خروجی یه باینری حدوداً ۳۶ مگابایتیه که با scp دیپلوی میشه.
خط لولهٔ هشدارها هیچ قفلی نداره. هر مانیتور تو goroutine خودش چک میکنه و نتیجه رو میریزه تو یه channel مشترک، و فقط یه goroutine مصرفکننده کل پاییندست رو دست میگیره: ماشین حالت up/down و نوشتن تو SQLite. چون فقط یه goroutine به state و کانکشن دیتابیس دست میزنه، چیزی برای قفل کردن نمیمونه و SQLite هم که از نویسندهٔ همزمان بدش میاد، دقیقاً یکی میگیره.
دوتا تصمیم به گفتهٔ نویسنده تو پروداکشن جواب داده: حالت هر مانیتور موقع بالا اومدن از incidentهای باز تو SQLite بازسازی میشه، پس ریاستارت وسط یه قطعی نه دوباره آلارم DOWN میده نه پیام برگشت رو از دست میده. ارسال نوتیفیکیشن هم async و با تایماوت ۱۵ ثانیه انجام میشه تا یه SMTP کند کل خط لوله رو قفل نکنه. آلارم بعد از N شکست پشتسرهم میزنه، نه با اولین لغزش. تنظیمات هم همه تو یه فایل YAML جمعه:
defaults:
interval: 60s
failure_threshold: 3
alerts: [ops-telegram]
monitors:
- name: app-db
type: postgres
query: "SELECT count(*) FROM jobs WHERE status = 'stuck'"
rule: "== 0"reload با SIGHUP فقط بعد از اعتبارسنجی کاملِ کانفیگ اعمال میشه، پس یه YAML خراب سرویسِ در حال اجرا رو نمیکشه و فقط خطا لاگ میشه؛ یه فلگ -check هم برای اعتبارسنجی خشک تو CI هست. نویسنده میگه چیزهایی که Gjallar عمداً نداره مهمترین بخش ماجراست: نه کلاستر، نه ایجنت، نه پلاگین، نه داشبورد سریزمانی، و تاریخچه هم پیشفرض بعد از ۳۰ روز هرس میشه. به اعتقاد اون هر ابزار مانیتورینگی که رها کرده از یه بیماری مرده: کمکم پلتفرم شده و یه روز خودِ مانیتورینگ به مانیتورینگ احتیاج پیدا کرده.
نکات کلیدی:
- حدود ۳۴۰۰ خط Go، لایسنس MIT، یه باینری استاتیک حدوداً ۳۶ مگابایت
- بیلد با CGO_ENABLED=0 و درایورهای خالص Go مثل pgx، go-ora و modernc.org/sqlite
- چک کردن Oracle بدون نصب Oracle Instant Client
- بدون قفل: یه goroutine برای هر مانیتور، یه channel و یه مصرفکنندهٔ واحد
- ریاستارت وسط قطعی آلارم تکراری نمیده، چون state از incidentهای باز SQLite خونده میشه
- تاریخچه پیشفرض بعد از ۳۰ روز پاک میشه تا فایل SQLite کوچیک بمونه




