UZMAN
Monitoring & Alerting
Sistem çalışıyor ama sağlıklı mı? Queue'lar şişiyor mu, consumer'lar yetişiyor mu, disk doluyor mu? Bunları gerçek zamanlı izleme ve "şu olursa beni uyar" kuralları ile takip edersin.
Seviye: Uzman — Prometheus, Grafana ve alerting pipeline deneyimi gerektirir.
📖 Teknik detay: Üç ana araç: Management UI (web panel, built-in), Prometheus endpoint (:15692/metrics, scraping ile), CLI (rabbitmqctl, diagnostics). Production'da Prometheus + Grafana ile sürekli izleme kurulur.
Ne Zaman Hangi Aracı Kullan
| Senaryo | Araç | Neden | Gerçek Hayat |
|---|---|---|---|
| Anlık debugging, tek queue inceleme | Management UI (:15672) | Görsel, filtrelenebilir, anında | Dev: "queue neden bişiyor?" → browser aç |
| Sürekli izleme + alerting (production) | Prometheus + Grafana | Trend analizi, threshold alert, dashboard | SRE: queue depth 5dk üzerinde 10K → PagerDuty |
| Node diagnostics, cluster health | CLI tools (rabbitmq-diagnostics) | SSH, scripting, automation | Ops: node restart öncesi 'check_alarms' |
| Incident response, root cause | CLI + Prometheus birlikte | CLI: anlık state. Prometheus: geçmiş trend | Postmortem: "memory ne zaman spike yaptı?" |
| Capacity planning | Prometheus (long retention) | Haftalık/aylık trend, growth projeksiyon | CTO: "3 ay sonra kaç node lazım?" |
Kritik Metrikler & Alert Thresholds
| Metrik | Prometheus Query | Warning | Critical | Açıklama |
|---|---|---|---|---|
| Queue depth | rabbitmq_queue_messages |
> 10K | > 100K | Consumer yetişemiyor, scale-out gerekli |
| Consumer utilization | rabbitmq_queue_consumer_utilisation |
< 0.7 | < 0.3 | Consumer idle, prefetch düşük olabilir |
| Unacked messages | rabbitmq_queue_messages_unacked |
> prefetch × 2 | > prefetch × 5 | Consumer stuck veya çok yavaş |
| Memory usage | rabbitmq_process_resident_memory_bytes |
> 70% watermark | > 90% | Memory alarm tetiklenecek |
| Disk free | rabbitmq_disk_space_available_bytes |
< 5GB | < 2GB | Disk alarm → tüm publishing durur |
| Connection count | rabbitmq_connections |
> 5K | > 10K | FD exhaustion riski |
| Channel count | rabbitmq_channels |
> 10K | > 50K | Memory overhead, channel leak |
| Publisher confirm rate | rate(rabbitmq_queue_messages_published_total[5m]) |
Sudden drop > 50% | Drop = 0 | Publisher'lar bağlanamıyor |
Memory & Disk Alarms: RabbitMQ memory veya disk watermark'ı aşıldığında tüm publisher'ları bloklar. Bu, tüm sistemi durduran global bir mekanizmadır. Alert'leri alarm tetiklenmeden ÖNCE kurun.
Önkoşul: Prometheus metrics endpoint'i aktifleştirmek için her node'da plugin'i enable edin:
rabbitmq-plugins enable rabbitmq_prometheusBu, port 15692'de
/metricsendpoint'ini açar. Management UI portu (15672) ile karıştırmayın.
# prometheus.yml
scrape_configs:
- job_name: 'rabbitmq'
metrics_path: '/metrics'
scrape_interval: 15s
static_configs:
- targets:
- 'rabbit-node1:15692'
- 'rabbit-node2:15692'
- 'rabbit-node3:15692'
# Per-object metrics (detailed but expensive)
params:
family: ['queue_metrics', 'connection_metrics', 'channel_metrics']
---
# alert_rules.yml
groups:
- name: rabbitmq
rules:
- alert: RabbitMQQueueDepthHigh
expr: rabbitmq_queue_messages > 100000
for: 5m
labels:
severity: critical
annotations:
summary: "Queue {{ $labels.queue }} depth > 100K"
- alert: RabbitMQDiskSpaceLow
expr: rabbitmq_disk_space_available_bytes < 2147483648
for: 1m
labels:
severity: critical
annotations:
summary: "Node {{ $labels.instance }} disk < 2GB"
- alert: RabbitMQNoConsumers
expr: rabbitmq_queue_consumers == 0 and rabbitmq_queue_messages > 0
for: 2m
labels:
severity: warning
annotations:
summary: "Queue {{ $labels.queue }} has messages but no consumers"
{
"title": "RabbitMQ — Queue Depth & Consumer Lag",
"uid": "rabbitmq-queue-overview",
"panels": [
{
"title": "Queue Depth (messages_ready)",
"type": "timeseries",
"gridPos": { "h": 8, "w": 12, "x": 0, "y": 0 },
"targets": [
{
"expr": "rabbitmq_queue_messages_ready{queue=~"$queue"}",
"legendFormat": "{{ queue }}"
}
],
"fieldConfig": {
"defaults": {
"thresholds": {
"steps": [
{ "value": 0, "color": "green" },
{ "value": 10000, "color": "yellow" },
{ "value": 50000, "color": "red" }
]
}
}
}
},
{
"title": "Unacked Messages (Consumer Lag)",
"type": "timeseries",
"gridPos": { "h": 8, "w": 12, "x": 12, "y": 0 },
"targets": [
{
"expr": "rabbitmq_queue_messages_unacked{queue=~"$queue"}",
"legendFormat": "{{ queue }} unacked"
}
]
},
{
"title": "Publish Rate vs Consume Rate",
"type": "timeseries",
"gridPos": { "h": 8, "w": 12, "x": 0, "y": 8 },
"targets": [
{
"expr": "rate(rabbitmq_queue_messages_published_total{queue=~"$queue"}[5m])",
"legendFormat": "{{ queue }} publish/s"
},
{
"expr": "rate(rabbitmq_queue_messages_delivered_total{queue=~"$queue"}[5m])",
"legendFormat": "{{ queue }} consume/s"
}
]
},
{
"title": "Consumer Utilisation",
"type": "gauge",
"gridPos": { "h": 8, "w": 12, "x": 12, "y": 8 },
"targets": [
{
"expr": "rabbitmq_queue_consumer_utilisation{queue=~"$queue"}",
"legendFormat": "{{ queue }}"
}
],
"fieldConfig": {
"defaults": {
"min": 0, "max": 1,
"thresholds": {
"steps": [
{ "value": 0, "color": "red" },
{ "value": 0.5, "color": "yellow" },
{ "value": 0.9, "color": "green" }
]
}
}
}
}
],
"templating": {
"list": [
{
"name": "queue",
"type": "query",
"query": "label_values(rabbitmq_queue_messages, queue)",
"multi": true,
"includeAll": true
}
]
},
"time": { "from": "now-1h", "to": "now" },
"refresh": "30s"
}
Kullanım: Grafana UI → Dashboards → Import → JSON yapıştır.
$queuetemplate variable ile spesifik queue'ları filtrele. Consumer Utilisation < 0.5 ise consumer'lar yetişemiyor demektir — prefetch artır veya consumer scale-out yap.
CLI — Hızlı Diagnostics Komutları
# Genel cluster health
rabbitmq-diagnostics check_running
rabbitmq-diagnostics cluster_status
rabbitmq-diagnostics check_alarms
# Memory breakdown
rabbitmq-diagnostics memory_breakdown
# Queue detayları
rabbitmqctl list_queues name type messages consumers memory state
# Connection detayları (leak detection)
rabbitmqctl list_connections name state channels peer_host
# Channel detayları
rabbitmqctl list_channels connection name consumer_count messages_unacknowledged prefetch_count
Gerçek hayat senaryosu: Fintech platformunda Grafana dashboard'unda queue depth grafiği ani spike gösterdi. Alert tetiklendi (5 dakika üzerinde 10K). Investigation: Consumer pod'ları OOMKilled olmuş. Immediate action: HPA limit artır + pod restart. Root cause: Mesaj boyutu büyümüş, memory limit yetersiz kalmış.