RRabbitMQ Handbook

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.

RabbitMQ Cluster Node 1 Node 2 Node 3 :15692 /metrics Prometheus Scrape interval: 15s TSDB retention: 15d Alert rules Grafana Dashboards RabbitMQ Overview Per-queue detail Alertmanager PagerDuty Slack Email scrape query alert

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_prometheus

Bu, port 15692'de /metrics endpoint'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. $queue template 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ış.