Grafana, Prometheus ve Alertmanager ile birlikte, Kubernetes kümelerini izlemek için yaygın olarak kullanılan bir çözümdür.
Grafana, Prometheus ve Alertmanager ile birlikte, Kubernetes kümelerini izlemek için yaygın olarak kullanılan bir çözümdür. Bu stack (yığın) evrensel olarak uygulanabilir ve hem bulut hem de bare-metal kümelerde kullanılabilir. İşlevseldir, kolayca entegre edilebilir ve ücretsizdir; bu da onun popüler olmasının başlıca nedenidir.
Bu yazıda Grafana’yı Alertmanager ile nasıl entegre edeceğinizi, Grafana üzerinden sessizleştirmeleri (silences) nasıl yöneteceğinizi, Alertmanager’ı uyarıları engelleyecek şekilde nasıl yapılandıracağınızı ve bu yapılandırmayı gelecekteki senaryolar için kodla nasıl saklayabileceğinizi göstereceğim. Aşağıda açıklanan adımları takip ederek şunları öğreneceksiniz:
Kod ile Grafana’ya Alertmanager veri kaynağı eklemek
Alertmanager’ı, uyarıları düzgün bir şekilde görselleştirmek için yapılandırmak
Alertmanager yapılandırması aracılığıyla bazı uyarıları bastırmak
kube-prometheus-stack Helm chart’ı (sürüm 39.5.0) kurulmuş bir Kubernetes kümesine ihtiyacınız olacak. Mevcut kümenizi kullanabilir veya test ortamı oluşturabilirsiniz.
v8.0 sürümünden itibaren Grafana, çeşitli harici kaynaklardan alınan metrikler ve loglar üzerinde işlem yapabilen entegre bir uyarı sistemiyle birlikte gelmektedir. Aynı zamanda Grafana, varsayılan olarak Alertmanager ve Prometheus ile uyumludur – bu da Kubernetes kümelerini izlerken sektörün büyük bir kısmının faydalandığı bir kombinasyondur.
Alertmanager’ı, Grafana’nın yerel uyarı sistemine tercih etmemizin sebeplerinden biri, yapılandırmalarımız kodla tanımlandığında otomasyonu daha kolay hale getirmesidir. Örneğin, Grafana tarafından yönetilen görselleştirme panellerini kodla tanımlayabilir ve tekrar kullanabilirsiniz, ancak bu oldukça zor olacaktır. Öte yandan Alertmanager, Prometheus ile birlikte kube-prometheus-stack Helm chart’ında gelmektedir – biz de Kubernetes kümelerini izlemek için bu kaynağı kullanıyoruz.
İstersen bunu bir blog yazısı formatına uygun hale getirip sitende paylaşabileceğin şekilde düzenleyebilirim. İstiyor musun?
Yapmamız gereken ilk şey, Grafana’nın Alertmanager ile entegrasyonunu yapılandırmaktır.
Bunu otomatik hale getirmek için, aşağıdaki kodu kube-prometheus-stack values dosyasına ekleyin:
grafana:
additionalDataSources:
- name: Alertmanager
type: alertmanager
url: <a class="c-link" tabindex="-1" href="http://monitoring-kube-prometheus-alertmanager:9093/" target="_blank" rel="noopener noreferrer" data-stringify-link="http://monitoring-kube-prometheus-alertmanager:9093" data-sk="tooltip_parent" data-remove-tab-index="true">http://monitoring-kube-prometheus-alertmanager:9093</a>
editable: true
access: proxy
version: 2
jsonData:
implementation: prometheus
Eğer sizin ortamınızda farklıysa, url: anahtarının değerini özelleştirin.
Kodu kümenize deploy edin ve ardından Grafana veri kaynaklarında kontrol edin.

Ardından aktif uyarıları kontrol edin – en az bir varsayılan uyarı görmelisiniz.

Mevcut entegrasyon sırasında bazen uyarıların (alert) yinelenmesinden kaçınmak mümkün olmayabilir, ancak çoğu durumda bu mümkündür. Uyarıları yinelenmeden görebilmek için Alertmanager’ı doğru şekilde yapılandırmanız gerekir. Bu da her uyarı için tek bir receiver (alıcı) tanımlamak anlamına gelir.
Bizim örneğimizde basit tutmak için iki alıcı ekleyeceğiz:
blackhole – önemsiz (sıfır öncelikli) ve gönderilmesine gerek olmayan uyarılar için
default – bilgi (info), uyarı (warning) ve kritik (critical) seviyesindeki uyarılar için
default alıcısı (receiver) gerekli tüm bildirim kanallarına sahip olmalıdır. Bizim örneğimizde iki kanal bulunuyor: telegram ve slack.
Alertmanager yapılandırmasını otomatik hale getirmek için, aşağıdaki kodu kube-prometheus-stack yaml dosyasına ekleyin:
alertmanager:
config:
global:
resolve_timeout: 5m
route:
group_by: [...]
group_wait: 9s
group_interval: 9s
repeat_interval: 120h
receiver: blackhole
routes:
- receiver: default
group_by: [...]
match_re:
severity: "info|warning|critical"
continue: false
repeat_interval: 120h
receivers:
- name: blackhole
- name: default
telegram_configs:
- chat_id: -000000000
bot_token: 0000000000:00000000000000000000000000000000000
message: |
'Status: <a href="<a class="c-link" href="https://127.0.0.1/" target="_blank" rel="noopener noreferrer" data-stringify-link="https://127.0.0.1" data-sk="tooltip_parent">https://127.0.0.1</a>">{{ .Status }}</a>'
'{{ .CommonAnnotations.message }}'
api_url: <a class="c-link" href="https://127.0.0.1/" target="_blank" rel="noopener noreferrer" data-stringify-link="https://127.0.0.1" data-sk="tooltip_parent">https://127.0.0.1</a>
parse_mode: HTML
send_resolved: true
slack_configs:
- api_url: <a class="c-link" href="https://127.0.0.1/services/00000000000/00000000000/000000000000000000000000" target="_blank" rel="noopener noreferrer" data-stringify-link="https://127.0.0.1/services/00000000000/00000000000/000000000000000000000000" data-sk="tooltip_parent">https://127.0.0.1/services/00000000000/00000000000/000000000000000000000000</a>
username: alertmanager
title: "Status: {{ .Status }}"
text: "{{ .CommonAnnotations.message }}"
title_link: "<a class="c-link" href="https://127.0.0.1/" target="_blank" rel="noopener noreferrer" data-stringify-link="https://127.0.0.1" data-sk="tooltip_parent">https://127.0.0.1</a>"
send_resolved: true
Kodu kümenize deploy edin ve aktif uyarıları kontrol edin – uyarıların yinelenmemiş olması gerekir.

Bazı durumlarda uyarıları silence (sessizleştirme) yöntemiyle devre dışı bırakmak isteriz, ancak bazen bunu kod üzerinden yapmak daha iyidir. Silence geçici bir önlemdir. Kalıcı değildir ve eğer boş bir kümeye yeniden deploy yaparsanız tekrar oluşturmanız gerekir. Buna karşın, uyarıları kod üzerinden devre dışı bırakmak daha sürdürülebilir bir çözümdür ve tekrarlanan deploy’larda kullanılabilir.
Silence ile uyarıları devre dışı bırakmak oldukça basittir – sadece Silences sekmesini açın ve istediğiniz süreyle bir silence oluşturun, örneğin 99999d. Eğer Alertmanager için kalıcı depolama (persistent storage) etkinleştirilmişse, bu silence kalıcı olacaktır.

Bu bölüm ağırlıklı olarak ikinci duruma değinmektedir, çünkü silence’ı kod olarak eklemek kolay bir iş değildir. Biz, varsayılan olarak her zaman tetiklenen Watchdog alert’i aracılığıyla iki test uyarısını devre dışı bırakacağız.
Aşağıdaki kodu kube-prometheus-stack yaml dosyasına ekleyin:
inhibit_rules:
- target_matchers:
- alertname =~ "ExampleTwoAlertToInhibit|ExampleOneAlertToInhibit"
source_matchers:
- alertname = Watchdog
Ortaya çıkan kod aşağıdaki gibi görünmelidir:
alertmanager:
config:
global:
resolve_timeout: 5m
route:
group_by: [...]
group_wait: 9s
group_interval: 9s
repeat_interval: 120h
receiver: blackhole
routes:
- receiver: default
group_by: [...]
match_re:
severity: "info|warning|critical"
continue: false
repeat_interval: 120h
inhibit_rules:
- target_matchers:
- alertname =~ "ExampleAlertToInhibitOne|ExampleAlertToInhibitTwo"
source_matchers:
- alertname = Watchdog
receivers:
- name: blackhole
- name: default
telegram_configs:
- chat_id: -000000000
bot_token: 0000000000:00000000000000000000000000000000000
message: |
'Status: <a href="<a class="c-link" tabindex="-1" href="https://127.0.0.1/" target="_blank" rel="noopener noreferrer" data-stringify-link="https://127.0.0.1" data-sk="tooltip_parent" data-remove-tab-index="true">https://127.0.0.1</a>">{{ .Status }}</a>'
'{{ .CommonAnnotations.message }}'
api_url: <a class="c-link" tabindex="-1" href="https://127.0.0.1/" target="_blank" rel="noopener noreferrer" data-stringify-link="https://127.0.0.1" data-sk="tooltip_parent" data-remove-tab-index="true">https://127.0.0.1</a>
parse_mode: HTML
send_resolved: true
slack_configs:
- api_url: <a class="c-link" tabindex="-1" href="https://127.0.0.1/services/00000000000/00000000000/000000000000000000000000" target="_blank" rel="noopener noreferrer" data-stringify-link="https://127.0.0.1/services/00000000000/00000000000/000000000000000000000000" data-sk="tooltip_parent" data-remove-tab-index="true">https://127.0.0.1/services/00000000000/00000000000/000000000000000000000000</a>
username: alertmanager
title: "Status: {{ .Status }}"
text: "{{ .CommonAnnotations.message }}"
title_link: "<a class="c-link" tabindex="-1" href="https://127.0.0.1/" target="_blank" rel="noopener noreferrer" data-stringify-link="https://127.0.0.1" data-sk="tooltip_parent" data-remove-tab-index="true">https://127.0.0.1</a>"
send_resolved: true
Kodu kümenize deploy edin. Ardından aşağıdaki kod ile test uyarıları ekleyin:
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: test-rules
namespace: monitoring
spec:
groups:
- name: "test alerts"
rules:
- alert: ExampleAlertToInhibitOne
expr: vector(1)
- alert: ExampleAlertToInhibitTwo
expr: vector(1)
Test uyarıları ile birlikte kodu kümenize deploy edin ve test kurallarının rules listesinde varlığını kontrol edin. Test uyarılarını görmek için 1–3 dakika bekleyin; bu uyarılar bastırılmış (suppressed) olmalıdır.

Bu makalede, Grafana’nın Alertmanager ile entegrasyonunun genel bir örneğini inceledik, Grafana üzerinden silences (sessizleştirmeleri) nasıl yöneteceğimizi öğrendik ve Alertmanager aracılığıyla uyarıları kod ile nasıl bastırabileceğimizi gösterdik.
Artık uyarılarınızı kolay ve tekrarlanabilir bir şekilde, minimum kod kullanarak yönetebileceksiniz. Temel kod örnekleri projelerinizde kullanılmaya hazırdır ve herhangi bir yapılandırmaya uygulanabilir.
Your email address will not be published. Required fields are marked *