Sürüm: 1.4.9Bu dokümantasyon Spitfire 1.4.9 içindir.
Altyapı izleme — Kafka, RabbitMQ ve ActiveMQ
Kafka, RabbitMQ ve ActiveMQ metrikleri Tower üzerinden toplanır. Ekleme adımları veritabanlarıyla aynıdır.
Kafka
Hızlı kurulum
Komutu bir Kafka broker'ında çalıştırın, soruları yanıtlayın.
curl -fsSL "https://<spitfire>/api/v1/setup/ds/kafka.sh?t=<token>" -o /tmp/sf-kafka.sh && bash /tmp/sf-kafka.shBu satırı görünce bitti.
OK: Kafka Spitfire'a eklendi, ilk metrikler ~1 dk içinde
Ürün arayüzünde (Hızlı kurulum sekmesi) komut adresiniz ve yeni bir token ile hazır gelir; token 1 saat geçerlidir ve tek bir izlenen sistem ekler. Betik SASL yöntemini sorar; SCRAM'da spitfire_monitor'ü oluşturur, ACL varsa yalnız Describe yetkisi verir. İsterseniz broker'a JMX exporter'ı kurar (Kafka yeniden başlar).
Manuel kurulum
SCRAM kullanıyorsanız kullanıcıyı oluşturun.
/opt/kafka/bin/kafka-configs.sh --bootstrap-server localhost:9092 --alter --entity-type users --entity-name spitfire_monitor --add-config 'SCRAM-SHA-512=[iterations=8192,password=<password>]'ACL varsa Describe yetkilerini verin.
/opt/kafka/bin/kafka-acls.sh --bootstrap-server localhost:9092 --add --allow-principal User:spitfire_monitor --operation Describe --cluster /opt/kafka/bin/kafka-acls.sh --bootstrap-server localhost:9092 --add --allow-principal User:spitfire_monitor --operation Describe --topic '*' /opt/kafka/bin/kafka-acls.sh --bootstrap-server localhost:9092 --add --allow-principal User:spitfire_monitor --operation Describe --group '*'Broker'ın yanıt verdiğini deneyin.
/opt/kafka/bin/kafka-broker-api-versions.sh --bootstrap-server <host>:9092 >/dev/null && echo 'OK: Kafka yanıt verdi'Altyapı izleme → Kafka → Manuel kurulum ile ekleyin.
Kafka başka bir klasördeyse /opt/kafka kısmını değiştirin. Adres alanına broker'ları virgülle yazın (kafka1:9092,kafka2:9092). SASL mekanizması none dışındaysa kullanıcı ve şifre gerekir.
Broker metrikleri (JMX exporter, isteğe bağlı)
Bytes/mesaj hızı, request p99, under-replicated ve offline partition'lar, controller, heap ve GC broker'ın JMX'inden gelir. Her broker'da Prometheus JMX exporter javaagent olarak çalışır. Adımları her broker'da yapın:
Javaagent'ı indirin:
sudo mkdir -p /opt/jmx-exporter && sudo curl -fsSL -o /opt/jmx-exporter/jmx_prometheus_javaagent.jar https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/1.0.1/jmx_prometheus_javaagent-1.0.1.jarConfig dosyasını yazın (sayfadaki Broker metrikleri (JMX exporter) kutusunda da vardır):
sudo tee /opt/jmx-exporter/kafka-jmx.yml >/dev/null <<'EOF' # Spitfire: Kafka broker metrics for the Prometheus JMX exporter javaagent. lowercaseOutputName: false includeObjectNames: - "kafka.server:type=BrokerTopicMetrics,*" - "kafka.server:type=ReplicaManager,*" - "kafka.controller:type=KafkaController,*" - "kafka.network:type=RequestMetrics,name=TotalTimeMs,*" - "java.lang:type=Memory" - "java.lang:type=GarbageCollector,*" rules: - pattern: 'kafka.server<type=BrokerTopicMetrics, name=BytesInPerSec><>Count' name: kafka_broker_bytes_in type: GAUGE - pattern: 'kafka.server<type=BrokerTopicMetrics, name=BytesOutPerSec><>Count' name: kafka_broker_bytes_out type: GAUGE - pattern: 'kafka.server<type=BrokerTopicMetrics, name=MessagesInPerSec><>Count' name: kafka_broker_messages_in type: GAUGE - pattern: 'kafka.server<type=BrokerTopicMetrics, name=TotalProduceRequestsPerSec><>Count' name: kafka_broker_produce_requests type: GAUGE - pattern: 'kafka.server<type=BrokerTopicMetrics, name=TotalFetchRequestsPerSec><>Count' name: kafka_broker_fetch_requests type: GAUGE - pattern: 'kafka.network<type=RequestMetrics, name=TotalTimeMs, request=(Produce|FetchConsumer|FetchFollower)><>99thPercentile' name: kafka_broker_request_p99_ms labels: request: "$1" type: GAUGE - pattern: 'kafka.server<type=ReplicaManager, name=UnderReplicatedPartitions><>Value' name: kafka_broker_under_replicated_partitions type: GAUGE - pattern: 'kafka.controller<type=KafkaController, name=OfflinePartitionsCount><>Value' name: kafka_broker_offline_partitions type: GAUGE - pattern: 'kafka.controller<type=KafkaController, name=ActiveControllerCount><>Value' name: kafka_broker_active_controllers type: GAUGE - pattern: 'java.lang<type=Memory><HeapMemoryUsage>used' name: kafka_broker_heap_used_bytes type: GAUGE - pattern: 'java.lang<(?:type=GarbageCollector, name=([^,>]+)|name=([^,>]+), type=GarbageCollector)><>CollectionTime' name: kafka_broker_gc_time_ms labels: gc: "$1$2" type: GAUGE EOFsystemd ile kurulu Kafka'da agent'ı ekleyip yeniden başlatın (servis adı
kafkadeğilse değiştirin):sudo mkdir -p /etc/systemd/system/kafka.service.d && sudo tee /etc/systemd/system/kafka.service.d/spitfire-jmx.conf >/dev/null <<'EOF' [Service] Environment="KAFKA_OPTS=-javaagent:/opt/jmx-exporter/jmx_prometheus_javaagent.jar=7071:/opt/jmx-exporter/kafka-jmx.yml" EOF sudo systemctl daemon-reload && sudo systemctl restart kafkaDocker compose'da broker servisine ekleyin, sonra
docker compose up -d:environment: KAFKA_OPTS: "-javaagent:/opt/jmx-exporter/jmx_prometheus_javaagent.jar=7071:/opt/jmx-exporter/kafka-jmx.yml" volumes: - /opt/jmx-exporter:/opt/jmx-exporter:ro ports: - "7071:7071"Kontrol (sayı 0'dan büyük olmalı):
curl -s http://localhost:7071/metrics | grep -c kafka_broker_Kafka kaynağında JMX exporter'lar alanına exporter adreslerini virgülle yazın (
kafka1:7071,kafka2:7071) → Kaydet.
Consumer lag tablosu
Kafka dashboard'unun altında Consumer lag tablosu her consumer group'un toplam lag'ini gösterir, en geride olan üstte. Bir topic'e tıklayınca partition'ları açılır. Değerler son 15 dakikanın en yeni noktalarıdır; lag sınırını (10.000) aşan group'un değeri uyarı renginde görünür.
RabbitMQ
Hızlı kurulum (bir RabbitMQ node'unda)
Komutu kopyalayın, terminale yapıştırıp çalıştırın.
curl -fsSL "https://<spitfire>/api/v1/setup/ds/rabbitmq.sh?t=<token>" -o /tmp/sf-rabbitmq.sh && bash /tmp/sf-rabbitmq.shWindows'ta bunun yerine PowerShell'de çalıştırın.
Invoke-WebRequest "https://<spitfire>/api/v1/setup/ds/rabbitmq.ps1?t=<token>" -OutFile "$env:TEMP\sf-rabbitmq.ps1"; & "$env:TEMP\sf-rabbitmq.ps1"OK: rabbitmq ...satırını görünce bitti.
Ürün arayüzünde bu satırlar adresiniz ve yeni bir token ile hazır gelir. Betik management plugin'i açmadan önce sorar, spitfire_monitor'ü monitoring tag'iyle oluşturur (varsa yeni şifreyi verir), her vhost'a okuma izni verir ve management API'yi test eder.
Manuel kurulum
Management plugin'i açın.
rabbitmq-plugins enable rabbitmq_managementMonitoring kullanıcısını oluşturun.
rabbitmqctl add_user spitfire_monitor '<password>' && rabbitmqctl set_user_tags spitfire_monitor monitoringHer vhost'a okuma izni verin.
for v in $(rabbitmqctl -q --no-table-headers list_vhosts name); do rabbitmqctl set_permissions -p "$v" spitfire_monitor '' '' '.*'; doneManagement API'yi test edin.
curl -fsS -o /dev/null -u spitfire_monitor:'<password>' http://<host>:15672/api/overview && echo "OK: spitfire_monitor"Altyapı izleme → RabbitMQ altında ekleyin, adres
http://<host>:15672.
monitoring tag'i management API'yi okur; '' '' '.*' izni kuyrukları okur ama yapılandıramaz ve publish edemez. Her vhost'ta okuma izni kuyruk tablosunun tüm kuyrukları göstermesini sağlar.
Canlı görünüm
RabbitMQ dashboard'unda Canlı görünüm kartı vardır. Şimdi oku her kuyruğu ready ve unacked mesajları, consumer sayısı ve publish/deliver hızlarıyla gösterir; sıralamak için sütun başlığına tıklayın (tersine çevirmek için tekrar). Mesajı olup consumer'ı olmayan kuyruk sarı işaretlenir. Yanında node'lar bellek, disk, file descriptor ve socket kullanımlarıyla görünür.
ActiveMQ
ActiveMQ Classic ve Artemis tek bir ActiveMQ izlenen sistemdir (Beta). Tower broker'ın web konsolundaki Jolokia REST API'sini doğrudan okur; Collector gerekmez. Bir broker ya da bir cluster tek izlenen sistem sayılır: cluster'ın ya da primary/backup çiftinin adreslerini virgülle verin.
Hızlı kurulum (broker sunucusunda)
Komutu kopyalayın, terminale yapıştırıp çalıştırın.
curl -fsSL "https://<spitfire>/api/v1/setup/ds/activemq.sh?t=<token>" -o /tmp/sf-activemq.sh && bash /tmp/sf-activemq.shWindows'ta bunun yerine yönetici PowerShell'de çalıştırın.
Invoke-WebRequest "https://<spitfire>/api/v1/setup/ds/activemq.ps1?t=<token>" -OutFile "$env:TEMP\sf-activemq.ps1"; & "$env:TEMP\sf-activemq.ps1"OK: activemq ...satırını görünce bitti.
Ürün arayüzünde bu satırlar adresiniz ve yeni bir token ile hazır gelir. Betik Classic ya da Artemis'i sorar, her dosyayı bir kez .spitfire.bak olarak yedekler, yalnız değişen dosyayı yazar ve broker'ı yalnız gerekiyorsa, onay alarak yeniden başlatır. İzleme kullanıcısının parolasını üretir ve yalnız Spitfire'a gönderir; admin parolasını sormaz.
Manuel kurulum: ActiveMQ Classic (/opt/apache-activemq)
Dosyaları yedekleyin.
for f in users.properties groups.properties jolokia-access.xml; do cp -n /opt/apache-activemq/conf/$f /opt/apache-activemq/conf/$f.spitfire.bak; doneİzleme kullanıcısını ekleyin.
grep -q '^spitfire_monitor=' /opt/apache-activemq/conf/users.properties || printf '\nspitfire_monitor=%s\n' '<password>' >> /opt/apache-activemq/conf/users.propertiesKullanıcıyı
usersgrubuna ekleyin.grep -q '^users=.*spitfire_monitor' /opt/apache-activemq/conf/groups.properties || { grep -q '^users=' /opt/apache-activemq/conf/groups.properties && sed -i 's/^users=\(..*\)$/&,spitfire_monitor/; s/^users=$/users=spitfire_monitor/' /opt/apache-activemq/conf/groups.properties || printf '\nusers=spitfire_monitor\n' >> /opt/apache-activemq/conf/groups.properties; }Jolokia'yı salt okunur yapın.
printf '%s\n' '<?xml version="1.0" encoding="UTF-8"?>' '<restrict>' ' <cors><strict-checking/></cors>' ' <commands><command>read</command><command>list</command><command>version</command><command>search</command></commands>' '</restrict>' > /opt/apache-activemq/conf/jolokia-access.xmlBroker'ı yeniden başlatın.
/opt/apache-activemq/bin/activemq restartOkumayı test edin.
curl -fsS -u 'spitfire_monitor:<password>' -H 'Origin: http://localhost' 'http://localhost:8161/api/jolokia/read/org.apache.activemq:type=Broker,brokerName=*/BrokerVersion' | grep -q '"status":200' && echo "OK: spitfire_monitor"Altyapı izleme → ActiveMQ altında ekleyin: tür
classic, adreshttp://<host>:8161.
Manuel kurulum: ActiveMQ Artemis (/var/lib/artemis-instance)
Dosyaları yedekleyin.
for f in artemis-users.properties artemis-roles.properties artemis.profile management.xml; do cp -n /var/lib/artemis-instance/etc/$f /var/lib/artemis-instance/etc/$f.spitfire.bak; doneİzleme kullanıcısını hash'li parolayla ekleyin.
grep -q '^spitfire_monitor *=' /var/lib/artemis-instance/etc/artemis-users.properties || printf '\nspitfire_monitor = ENC(%s)\n' "$(/var/lib/artemis-instance/bin/artemis mask --hash '<password>' | sed -n 's/^result: //p')" >> /var/lib/artemis-instance/etc/artemis-users.propertiesspitfirerolünü verin.grep -q '^spitfire *=' /var/lib/artemis-instance/etc/artemis-roles.properties || printf '\nspitfire = spitfire_monitor\n' >> /var/lib/artemis-instance/etc/artemis-roles.propertiesRolü konsola ekleyin.
grep -q '^HAWTIO_ROLES=.*spitfire' /var/lib/artemis-instance/etc/artemis.profile || sed -i "s/^HAWTIO_ROLES='\([^']*\)'/HAWTIO_ROLES='\1,spitfire'/" /var/lib/artemis-instance/etc/artemis.profileRole salt okunur MBean izni verin.
grep -q 'roles="amq,spitfire"' /var/lib/artemis-instance/etc/management.xml || sed -i 's#<match domain="org.apache.activemq.artemis">#&<access method="getFirstMessageAsJSON" roles="amq"/><access method="get*" roles="amq,spitfire"/><access method="is*" roles="amq,spitfire"/>#' /var/lib/artemis-instance/etc/management.xmlBroker'ı yeniden başlatın.
/var/lib/artemis-instance/bin/artemis-service restartOkumayı test edin.
curl -fsS -u 'spitfire_monitor:<password>' -H 'Origin: http://localhost' 'http://localhost:8161/console/jolokia/read/org.apache.activemq.artemis:broker=*/Version' | grep -q '"status":200' && echo "OK: spitfire_monitor"Altyapı izleme → ActiveMQ altında ekleyin: tür
artemis, adreshttp://<host>:8161.
Classic'te izleme kullanıcısı yalnız read, list, version ve search komutlarını çalıştırabilir; queue silme, mesaj gönderme gibi işlemler (exec) Jolokia'da herkese kapanır, konsolun bu düğmeleri de çalışmaz. Classic'in users grubu web konsolun salt okunur sayfalarını açabilir; bu sayfalar mesaj içeriğini gösterebilir. Artemis'te spitfire rolü yalnız get* ve is* okur, getFirstMessageAsJSON (mesaj içeriği) amq'ya kalır ve işlem çalıştıramaz. Artemis kullanıcı ve rol dosyalarını kendisi yeniden okur; artemis.profile ve management.xml için yeniden başlatma gerekir. Cluster'da adımları her broker'da tekrarlayın ve broker'ları tek tek başlatın. Web konsol yalnız localhost'u dinliyorsa (etc/bootstrap.xml, Classic'te conf/jetty.xml) Tower'ın erişeceği adrese açın.
Queue tablosu
ActiveMQ dashboard'unda en derin 20 queue'nun tablosu vardır: bekleyen mesaj, consumer, in-flight, en eski mesajın yaşı (Artemis) ve DLQ'lar. Mesajı olup consumer'ı olmayan queue consumer yok etiketiyle işaretlenir. Backup broker yalnız ayakta sayılır; metrikleri primary'den gelir.
Eşik bulguları
| Teknoloji | Bulgu |
|---|---|
| Kafka | Bir consumer group'un lag'i 10.000'in üstünde (uyarı) |
| Kafka | Under-replicated partition var (uyarı, JMX) |
| Kafka | Offline partition var (kritik, JMX) |
| Kafka | Aktif controller sayısı 1 değil (kritik, JMX) |
| RabbitMQ | Kuyrukta bekleyen (ready) mesaj 10.000'in üstünde (uyarı) |
| RabbitMQ | Bir node'da bellek ya da disk alarmı: publisher'lar bloklanır (kritik) |
| RabbitMQ | Unacknowledged mesajlar 15 dakikada 1000'den fazla büyüyor (uyarı) |
| RabbitMQ | Kuyrukta mesaj var ama consumer yok (uyarı, canlı görünüm) |
| RabbitMQ | Bir cluster node'u çalışmıyor (kritik, canlı görünüm) |
| ActiveMQ | Broker yanıt vermiyor (kritik) |
| ActiveMQ | Bellek, store ya da temp kullanımı %80'in üstünde (uyarı), %95'in üstünde (kritik: flow control producer'ları durdurur) |
| ActiveMQ | Bir queue'da 10.000'den fazla mesaj (uyarı) |
| ActiveMQ | Mesajı olan ama consumer'ı olmayan queue (uyarı) |
| ActiveMQ | DLQ büyüyor ya da mesajların süresi doluyor, 15 dakikada (uyarı) |
Başarı kontrolü
- Son test = Bağlandı.
- Kafka dashboard'unda Broker sayısı broker adedinize eşit; RabbitMQ'da Consumer sayısı çiziliyor (RabbitMQ metrikleri kuyruk başınadır: hiç kuyruk yoksa dashboard boş kalır).
- ActiveMQ dashboard'unda Broker erişilebilir 1 ve queue tablosu dolu.