Zabbix’te Telegram ile Alarm Bildirimi Entegrasyonu
Üretim ortamında bir sunucu çökmeye başladığında, bunu öğrenmek için sabah gelip Zabbix dashboard’una bakmak istemezsiniz. Telegram entegrasyonu bu yüzden var; telefon cebinizde iken bile anında haberdar oluyorsunuz. Bu yazıda Zabbix ile Telegram’ı entegre etmenin en güvenilir yolunu, gerçek prodüksiyon deneyimlerinden damıtılmış notlarla birlikte anlatacağım.
Neden Telegram?
E-posta bildirimleri yavaş, SMS pahalı, PagerDuty gibi araçlar ek maliyet demek. Telegram ise ücretsiz, hızlı ve API’si son derece iyi belgelenmiş. Bir Telegram botu dakikalar içinde kurulabiliyor ve grup mesajlaşması sayesinde tüm sysadmin ekibine aynı anda bildirim gönderebiliyorsunuz. WhatsApp’ın aksine resmi bir bot API’si var, yani bu entegrasyonu yasal ve sürdürülebilir şekilde yapabiliyorsunuz.
Birkaç yıldır farklı müşteri ortamlarında Zabbix kullanıyorum. Kimi zaman 50 sunuculu küçük bir altyapı, kimi zaman 500+ node’lu büyük bir ortam. Hepsinde Telegram bildirimi ilk kurulan şeylerden biri oldu. Neden? Çünkü bir alarm geldiğinde saniyeler içinde telefona düşmesi, ekibin tepki süresini dramatik biçimde kısaltıyor.
Ön Koşullar
Başlamadan önce şunların hazır olması lazım:
- Zabbix 6.x veya 7.x kurulu ve çalışıyor olmalı
- Zabbix server’a SSH erişiminiz olmalı
- Telegram hesabınız olmalı
curlpaketi Zabbix server’da kurulu olmalı
Zabbix versiyonu önemli çünkü media type yapılandırması 5.x ile 6.x arasında biraz farklılaşıyor. Bu yazıda 6.4 ve 7.0 üzerinde test edilmiş adımları takip edeceğiz.
Telegram Bot Oluşturma
Her şeyden önce bir Telegram botu oluşturmanız gerekiyor. Bu kısım beş dakika sürer.
Telegram’ı açın ve @BotFather kullanıcısını aratın. Bu Telegram’ın resmi bot yönetim servisi. Doğrulama işareti olan hesabı seçin.
/newbot
BotFather size bot adı soracak. Bunu şöyle düşünün: ProdAlertBot veya InfraMonitorBot gibi anlamlı bir isim verin. Sonra kullanıcı adı isteyecek, bu _bot ile bitmek zorunda: sirket_monitor_bot gibi.
İşlem tamamlandığında BotFather size şuna benzer bir mesaj gönderir:
Harika! Bot oluşturuldu. Botu kullanarak bu URL'e erişebilirsiniz:
t.me/sirket_monitor_bot
Token:
7234567890:AAHxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Bu token’ı bir yere not edin, gizli tutun. Token ele geçirilirse botu kötüye kullanabilirler.
Şimdi bot’un mesaj gönderebilmesi için Chat ID’ye ihtiyacınız var. Bunun için iki yol var: Bireysel bildirim için kendi chat ID’niz, grup bildirimi için grup chat ID’si.
Chat ID Öğrenme
Bota bir mesaj gönderin (herhangi bir şey yazın), sonra şu API endpoint’ini çağırın:
curl -s "https://api.telegram.org/bot<TOKEN>/getUpdates" | python3 -m json.tool
Dönen JSON içinde chat.id alanını bulacaksınız. Bu sizin chat ID’niz. Negatif bir sayı çıkıyorsa grup chat ID’sidir, bu normal.
Örnek çıktıdan chat ID’yi hızlıca parse etmek için:
curl -s "https://api.telegram.org/bot<TOKEN>/getUpdates" |
python3 -c "import sys,json; data=json.load(sys.stdin);
print(data['result'][0]['message']['chat']['id'])"
Test mesajı göndererek doğrulayalım:
curl -s -X POST "https://api.telegram.org/bot<TOKEN>/sendMessage"
-d "chat_id=<CHAT_ID>"
-d "text=Zabbix test mesaji"
-d "parse_mode=HTML"
Telefonunuza mesaj düştüyse kurulum doğru ilerliyor demektir.
Zabbix’te Media Type Tanımlama
Bu kısım entegrasyonun kalbi. Zabbix’in Telegram’a nasıl mesaj göndereceğini burada tanımlıyoruz.
Zabbix web arayüzüne girin. Administration > Media Types yolunu izleyin. Zabbix 6.x’te bu yol Alerts > Media Types olarak değişti.
Zabbix aslında built-in Telegram media type ile geliyor. Listeye bakın, Telegram görüyorsanız onu düzenleyin. Görmüyorsanız yeni oluşturacağız.
Add butonuna tıklayın:
- Name: Telegram
- Type: Script
- Script name: telegram.sh (bunu az sonra oluşturacağız)
- Script parameters:
– {ALERT.SENDTO} – {ALERT.SUBJECT} – {ALERT.MESSAGE}
Eğer Zabbix’in webhook özelliğini kullanmak istiyorsanız (önerilen yöntem), Type olarak Webhook seçin. Webhook yöntemi daha temiz ve script dosyası gerektirmiyor.
Webhook Yöntemi (Önerilen)
Webhook yönteminde JavaScript kodu doğrudan Zabbix arayüzüne yazılıyor. Bu yaklaşım daha taşınabilir ve bakımı kolay.
Media type ekranında Type: Webhook seçin. Parameters bölümüne şunları ekleyin:
- ParseMode: HTML
- HTTPProxy: (boş bırakın, proxy kullanıyorsanız doldurun)
- Token: bot token’ınız
- To: {ALERT.SENDTO}
- Subject: {ALERT.SUBJECT}
- Message: {ALERT.MESSAGE}
Script alanına şu JavaScript kodunu yapıştırın:
var params = JSON.parse(value),
token = params.Token,
to = params.To,
message = '<b>' + params.Subject + '</b>nn' + params.Message,
request = new HttpRequest(),
response,
data;
if (typeof params.HTTPProxy === 'string' && params.HTTPProxy.trim() !== '') {
request.setProxy(params.HTTPProxy);
}
request.addHeader('Content-Type: application/json');
data = JSON.stringify({
chat_id: to,
text: message,
parse_mode: params.ParseMode,
disable_web_page_preview: true
});
response = request.post(
'https://api.telegram.org/bot' + token + '/sendMessage',
data
);
response = JSON.parse(response);
if (request.getStatus() !== 200 || response.ok !== true) {
throw 'Cannot send Telegram message: ' + JSON.stringify(response);
}
return 'OK';
Script Yöntemi (Alternatif)
Eski Zabbix kurulumlarında veya webhook desteklemeyen senaryolarda script yöntemi kullanılır. Zabbix server’a SSH ile bağlanın:
sudo nano /usr/lib/zabbix/alertscripts/telegram.sh
Aşağıdaki içeriği yapıştırın:
#!/bin/bash
BOT_TOKEN="7234567890:AAHxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
CHAT_ID="$1"
SUBJECT="$2"
MESSAGE="$3"
TEXT="<b>${SUBJECT}</b>
${MESSAGE}"
curl -s -X POST
"https://api.telegram.org/bot${BOT_TOKEN}/sendMessage"
-H "Content-Type: application/json"
-d "{
"chat_id": "${CHAT_ID}",
"text": $(echo "$TEXT" | python3 -c "import json,sys; print(json.dumps(sys.stdin.read()))"),
"parse_mode": "HTML",
"disable_web_page_preview": true
}"
Script’e çalıştırma izni verin:
sudo chmod +x /usr/lib/zabbix/alertscripts/telegram.sh
sudo chown zabbix:zabbix /usr/lib/zabbix/alertscripts/telegram.sh
Script’i komut satırından test edin:
sudo -u zabbix /usr/lib/zabbix/alertscripts/telegram.sh
"<CHAT_ID>"
"TEST Alarmi"
"Bu bir test mesajidir. Zabbix calisiyor."
Kullanıcı Media Tanımlama
Bot hazır, script hazır. Şimdi Zabbix kullanıcısına bu medyayı tanımlamanız gerekiyor.
Administration > Users (veya yeni versiyonda Users > Users) bölümüne gidin. İlgili kullanıcıyı seçin ve Media sekmesine tıklayın.
Add diyerek yeni media ekleyin:
- Type: Telegram (az önce oluşturduğunuz)
- Send to: Chat ID’nizi buraya yazın (örnek:
-100123456789) - When active: 1-7,00:00-24:00 (tüm zamanlar aktif)
- Use if severity: Burası kritik! Hangi seviyedeki alarmlarda bildirim alacağınızı seçin.
Severity seçimi konusunda bir not: Hepsini seçmek cazip geliyor ama Information ve Warning seviyesindeki alarmlar çok sık tetiklenebilir. Başlangıç için Warning, Average, High, Disaster seçmenizi öneririm. Bir süre sonra ortamınıza göre ayarlarsınız.
Action Tanımlama
Media type ve kullanıcı ayarları bitti. Şimdi hangi durumlarda bu bildirimin tetikleneceğini belirleyen Action’ı tanımlayacağız.
Configuration > Actions > Trigger Actions yolunu izleyin (Zabbix 6.x’te Alerts > Actions > Trigger Actions).
Create Action diyerek yeni bir action oluşturun.
Action sekmesi:
- Name: Telegram Bildirimleri
- Conditions kısmına gerekirse filtre ekleyin (örneğin belirli host grupları için)
Operations sekmesi:
Operations (Alarm durumunda) için Add diyerek işlem ekleyin:
- Send message to users: İlgili kullanıcıyı seçin
- Send only to: Telegram
Default operation step duration: 1h (bir saat içinde problem çözülmezse tekrar bildirim gönderir)
Recovery operations (Alarm geçtiğinde) için de benzer şekilde kullanıcı ekleyin. Bu sayede hem alarm başladığında hem de düzeldiğinde haberdar olursunuz.
Mesaj Formatını Özelleştirme
Varsayılan mesaj formatı biraz çiğ kalıyor. Anlamlı ve hızlı okunan bir format şart.
Operations kısmında Default message yerine özel mesaj yazabilirsiniz. Alarm mesajı için önerdiğim format:
🔴 ALARM: {TRIGGER.NAME}
Sunucu: {HOST.NAME} ({HOST.IP})
Şiddet: {TRIGGER.SEVERITY}
Durum: {TRIGGER.STATUS}
Değer: {ITEM.VALUE}
Açıklama: {TRIGGER.DESCRIPTION}
Zaman: {EVENT.DATE} {EVENT.TIME}
Event ID: {EVENT.ID}
Recovery mesajı için:
✅ DÜZELDI: {TRIGGER.NAME}
Sunucu: {HOST.NAME} ({HOST.IP})
Problem Süresi: {EVENT.DURATION}
Düzelme Zamanı: {EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}
Bu formatlar telefonda tek bakışta durumu anlamanızı sağlıyor. Emoji kullanımı da önemli; kırmızı daire gözü hemen çekiyor.
Grup Bildirimi ve Ekip Yönetimi
Bireysel bildirimler iyi ama ekip çalışmasında Telegram grubu çok daha verimli. Tüm alarmlar tek bir grupta toplandığında kim neye baktı, kim müdahale etti hepsi şeffaf oluyor.
Telegram’da bir grup oluşturun ve botu gruba ekleyin. Botu gruba ekledikten sonra grubun Chat ID’sini öğrenmek için yine getUpdates endpoint’ini kullanın. Grup ID’leri negatif sayı olur: -1001234567890 gibi.
Önemli bir detay: Bot’u gruba ekledikten sonra bota grup içinde bir mesaj göndermeniz gerekiyor ki getUpdates’te görünsün. Sadece gruba eklemek yetmiyor.
Birden fazla ekip veya ortam için farklı gruplar kullanabilirsiniz:
- Prod-Alarms: Üretim ortamı kritik alarmlar
- Dev-Alarms: Geliştirme ortamı alarmlar
- All-Alerts: Tüm alarmlar (referans için)
Zabbix’te farklı host grupları için farklı action’lar tanımlayarak bu grupları ayrı ayrı besleyebilirsiniz.
Gerçek Hayatta Karşılaşılan Sorunlar
Bot Mesaj Gönderemiyor
En sık karşılaşılan sorun: Script çalışıyor ama mesaj gitmiyor. Kontrol listesi:
# Zabbix alertscripts log'una bakın
tail -f /var/log/zabbix/zabbix_server.log | grep -i telegram
# Script manuel çalıştırarak test edin
sudo -u zabbix bash /usr/lib/zabbix/alertscripts/telegram.sh
"CHAT_ID" "Test" "Test mesaji"
# Network erişimini kontrol edin
curl -v "https://api.telegram.org/bot<TOKEN>/getMe"
Bazı kurumlarda Telegram API’ye doğrudan erişim engellenmiş olabiliyor. Bu durumda proxy kullanmanız gerekebilir. Script içinde:
curl -s -X POST
--proxy "http://proxy.sirket.com:8080"
"https://api.telegram.org/bot${BOT_TOKEN}/sendMessage"
...
SELinux Engeli
SELinux aktif sistemlerde script çalışsa bile ağ bağlantısı engellenebilir:
# SELinux durumunu kontrol edin
getenforce
# Zabbix'in ağa erişmesine izin verin
setsebool -P zabbix_can_network on
# Hala sorun varsa audit log'a bakın
ausearch -c 'zabbix_server' --raw | audit2allow -M zabbix_net
semodule -i zabbix_net.pp
Çok Fazla Bildirim (Alert Storm)
Üretimde karşılaştığım en can sıkıcı durum: Bir ağ kesintisi sırasında 200+ alarm birden geliyor ve telefon durmuyor. Bunun için Zabbix’te correlation ve maintenance kullanın, ayrıca action’da operation step duration süresini ayarlayın.
Acil durum için botu susturmak gerektiğinde:
# Botu geçici olarak devre dışı bırakmak için
# Zabbix arayüzünde Action'ı disable edin
# veya kullanıcının media'sını geçici silin
Zabbix 7.x ile Gelen Değişiklikler
Zabbix 7.0 ile media type yapısında bazı değişiklikler geldi. Message templates artık action içinde değil, doğrudan media type içinde tanımlanabiliyor. Bu aslında çok daha temiz bir yapı.
Media type içinde Message templates sekmesine gelip her trigger durumu için ayrı template tanımlayabilirsiniz:
- Problem
- Problem recovery
- Problem update
- Service (SLA bildirimleri için)
Bu özelliği kullanırsanız action tarafında mesaj yazmak zorunda kalmıyorsunuz, her şey media type üzerinden yönetiliyor.
Monitoring Açısından Bir Adım Öteye
Telegram entegrasyonu tamamlandıktan sonra birkaç ek şey daha yapabilirsiniz.
Alarm özetleri: Her sabah saat 09:00’da gece boyunca gelen alarmların özetini Telegram’a gönderen bir script yazabilirsiniz:
#!/bin/bash
# /etc/cron.d/zabbix-daily-summary
ZABBIX_URL="http://localhost/zabbix"
API_USER="api_user"
API_PASS="sifre"
BOT_TOKEN="TOKEN"
CHAT_ID="CHAT_ID"
# Zabbix API ile son 24 saatteki problem sayısını çek
PROBLEM_COUNT=$(curl -s -X POST "${ZABBIX_URL}/api_jsonrpc.php"
-H "Content-Type: application/json"
-d '{
"jsonrpc": "2.0",
"method": "problem.get",
"params": {
"time_from": '$(date -d "24 hours ago" +%s)',
"countOutput": true
},
"auth": "AUTH_TOKEN",
"id": 1
}' | python3 -c "import sys,json; print(json.load(sys.stdin)['result'])")
MESSAGE="📊 Günlük Özet
Son 24 saatte toplam ${PROBLEM_COUNT} problem kaydı."
curl -s -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage"
-d "chat_id=${CHAT_ID}"
-d "text=${MESSAGE}"
-d "parse_mode=HTML"
Sonuç
Zabbix-Telegram entegrasyonu doğru kurulduğunda altyapı yönetiminde ciddi bir fark yaratıyor. Teorik olarak e-posta bildirimleri de çalışır, ama pratikte bir alarm geldiğinde Telegram mesajına bakma refleksi e-postaya bakmaktan çok daha hızlı gelişiyor.
Kurulum sürecini özetlersek: Bot oluşturma, Chat ID öğrenme, media type tanımlama, kullanıcıya media atama ve action oluşturma. Bu beş adım tamamlandığında temel entegrasyon çalışır hale geliyor.
Ama işin püf noktası konfigürasyonun ötesinde: Hangi alarmların gerçekten önemli olduğunu belirlemek, mesaj formatını ekibinizin hızlı anlayacağı şekilde düzenlemek ve alarm yorgunluğunu önlemek için doğru severity filtrelerini seçmek. Bunlar zamanla öğrendiğiniz şeyler.
Başlangıç olarak şunu öneririm: Sadece High ve Disaster alarmlarıyla başlayın. Bir ay sonra ne kadar bildirim geldiğine bakın, gerekirse eşiği indirin. Alarm yorgunluğuna düşmemek için bu kademeli yaklaşım en sağlıklısı.
