Prometheus ve Alert Manager İle Alarmlarınızı Ustaca Yönetin

Uygulamaların ve servislerin sorunsuz çalışması için sadece metrik toplamak yetmez. Asıl önemli olan, bu metriklerde olağan dışı bir durum olduğunda haberdar olabilmektir. İşte burada Prometheus + Alertmanager ikilisi devreye giriyor. Aslında bu yazıda biraz daha Prometheus üzerinden yapılabilen alarmlar üzerine duracağım. Kavramları netleştirmek adına Alertmanager biraz daha işin bonusu gibi olacak.

Yazının sonunda kendinizin de deneyebileceği bir lab ortamı sunacağım size. Docker Compose ile kendiniz bu lab ortamını ayağa kaldırabilir ve denemelerinizi yapabilirsiniz.

Kesinlikle Bu Prometheus O Prometheus Değil

Alertmanager nedir? Ne işe yarar?

Prometheus, belirlediğiniz kurallara göre metrikleri sorgular ve bir eşik aşıldığında alarm üretir. 7/24 Prometheus Alerts ekranını izliyor olsaydınız, alarmları yakalamanız olasıydı. Ancak bu hiçbir şekilde gerçekçi bir senaryo olmadığından, bu alarmları bir bildirim sistemi ile almak isteyeceksiniz. İşte Alertmanager tam da bu noktada devreye girer.

Alertmanager’ın görevleri:

  • Gelen alertleri ilgili kişilere/servislere yönlendirmek (Slack, e-posta, PagerDuty, OpsGenie, WebHook vs.)
  • Aynı tip alertleri gruplayıp tek bildirim olarak göndermek
  • Belirli koşullarda bazı alertleri bastırmak (ör. bir sunucu tamamen down olmuşsa “CPU düşük” uyarısının bir anlamı kalmıyor.)
  • Sessize alma (silence) imkânı sağlamak

Kısacası, Alertmanager “alert router” olarak düşünülebilir.

Bu Prometheus da O Prometheus Değil

Prometheus Kuralları ile alarm nasıl oluşturulur? (Basit bir örnek)

Örneğin bir uygulamanız için son 2 dakikada gelen toplam HTTP istek sayısının 100’ün altında kalması sizin için kritik bir durum ve bu durum hakkında bilgilendirilmek istiyorsunuz. Bunun için önce Prometheus’ta bir kural tanımlarsınız:

groups:
- name: webapi-rules
rules:
- alert: LowRequestRate
expr: increase(http_request_count_total{instance=~"webapi.*"}[1m]) < 100
for: 2m
labels:
severity: warning
annotations:
summary: "Low request rate on {{ $labels.instance }}"
description: "Instance {{ $labels.instance }} received fewer than 100 requests in the last 2 minutes."

Bu senaryoda, adı webapi ile başlayan bütün instancelarınızda dakikalık periyotlar halinde istek sayısı 2 dk boyunca (for: 2m) 100’ün altında kalır ise alarm oluşacaktır.

Daha Karmaşık Senaryolar

Gerçek dünyada çoğu zaman “tek eşik değerine bak” tarzı basit senaryolar yeterli olmaz. İşte Prometheus’un güçlü sorgu dili PromQL burada devreye girer.

1. Instance bazlı istek sayısı kontrolü

Farm içinde onlarca instance olabilir. Bir tanesinde trafik düşmüşse bunu yakalamak için:

sum by(instance) (increase(http_request_count_total{instance=~"webapi.*"}[2m])) < 100

Burada sum by(instance) her sunucuyu ayrı değerlendirir.

2. Offset ile pencereleri karşılaştırma

Bazen önemli olan “mutlak değer” değil, ani değişimlerdir. Örneğin:

Son 2 dakikadaki istek sayısı, önceki 2 dakikanın %30’undan az ise alarm ver.

sum by (instance) (increase(http_request_count_total{instance=~"webapi.*"}[2m]))
<
0.3 *
sum by (instance) (increase(http_request_count_total{instance=~"webapi.*"}[2m] offset 2m))
Yükü keskin bir şekilde azaltarak SharpDropInRequests kuralımı tetiklettim.

3. Down olan instance’ları ayırmak

Sunucu tamamen düştüyse (exporter yanıt vermiyorsa) increase hiç değer üretmez. Bu nedenle de ilk kurallara takılmayıp alarm da üremeyecektir. Bunu ayrı bir kuralla yakalamak gerekir:

up{instance=~"webapi.*"} == 0

Ve Alertmanager inhibit kuralıyla, “InstanceDown” varken “LowRequestRate” alarmını bastırabilirsiniz. Bu sayede alarm kalabalığını da önlersiniz ve özellikle büyük sistemlerde kök neden analizi karmaşıklaşmaz.

web2 instance’ını Down durumuna getirdim ve sonuç

Alertmanager ile Webhook Kullanımı

Prometheus alert kurallarını yazdınız, Alertmanager da bu alertleri aldı. Peki bildirimleri nasıl alacaksınız? En basit yöntemlerden biri webhook.

Alertmanager konfigi (örnek)

route:
receiver: "webhook-demo"

receivers:
- name: "webhook-demo"
webhook_configs:
- url: "http://my-webhook:5001/alerts"
send_resolved: true

Webhook’i karşılayan basit Python/Flask uygulaması

from flask import Flask, request

app = Flask(__name__)

@app.route("/alerts", methods=["POST"])
def alerts():
data = request.json
print("=== Gelen Alert ===")
print(data)
return "ok", 200

if __name__ == "__main__":
app.run(host="0.0.0.0", port=5001)

Alertmanager’in gönderdiği JSON örneği

{
"status": "firing",
"receiver": "webhook-demo",
"groupLabels": { "instance": "webapi-2" },
"commonLabels": { "alertname": "InstanceDown", "instance": "webapi-2" },
"alerts": [
{
"status": "firing",
"labels": { "alertname": "InstanceDown", "instance": "webapi-2" },
"annotations": { "summary": "Instance webapi-2 is DOWN" },
"startsAt": "2025-09-19T15:30:45Z"
}
]
}
WebHook’uma Yansıyan Alarmlar

Sonuç

Alertmanager, modern sistemlerde alert gürültüsünü azaltmak ve doğru kişiye doğru zamanda bilgi göndermekiçin vazgeçilmezdir. Basit eşiğe dayalı kurallardan, geçmiş pencerelerle karşılaştırmalı karmaşık senaryolara kadar her türlü kontrolü Prometheus tarafında tanımlayabilir; Alertmanager ile de yönetebilirsiniz.

Doğru kurallar ve iyi ayarlanmış Alertmanager konfigürasyonu sayesinde, kritik problemleri hızlıca fark eder, gereksiz bildirimlerden kurtulursunuz. 🚀

Github Linki: https://github.com/idylmz/Prometheus-AlertManager-DemoLab

Similar Posts

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir