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.

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.

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))


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.


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"
}
]
}

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
