Monitorez RabbitMQ exécuté dans des clusters Kubernetes à l'aide de l'OpenTelemetry Collector avec découverte automatique des pods. Ce guide vous accompagne dans le déploiement du collecteur via Helm avec la détection dynamique des brokers assurée par l'observateur Kubernetes.
Conseil
Vous exécutez RabbitMQ sur des hôtes Linux ? Consultez le guide d'installation auto-hébergée pour les déploiements sur machine virtuelle ou bare metal.
Fonctionnement de l'intégration
Ce déploiement natif Kubernetes fournit une découverte et un monitoring automatiques :
Composants clés :
Observateur Kubernetes: surveille en continu les pods RabbitMQ basés sur des sélecteurs de labels
Créateur de récepteurs: Crée dynamiquement des récepteurs RabbitMQ pour chaque pod découvert
Attribution des ressources: enrichit automatiquement les métriques avec les métadonnées Kubernetes :
k8s.cluster.name- Votre identifiant de clusterk8s.namespace.name- Espace de noms du podk8s.pod.name- Nom du pod individuelrabbitmq.deployment.name- Dérivé du nom du pod
Modèle de déploiement : Le collecteur s'exécute en tant que déploiement Kubernetes (réplica unique) avec des permissions RBAC pour lister et surveiller les pods dans les espaces de noms. Lorsque de nouveaux pods RabbitMQ sont créés ou que des pods existants sont supprimés, l'observateur met automatiquement à jour la configuration du collecteur.
Important
Le collecteur nécessite les permissions get, list et watch sur les pods pour découvrir automatiquement les instances RabbitMQ.
Étapes d'installation
Suivez ces étapes pour déployer le collecteur OpenTelemetry avec le monitoring de RabbitMQ.
Avant de commencer
Assurez-vous que votre environnement répond à ces exigences :
Vérifier le point de terminaison de gestion
Assurez-vous que le plugin de gestion est activé sur les pods RabbitMQ :
$kubectl exec deploy/<your-rabbitmq-deployment> -n <rabbitmq-namespace> -- curl -I -u admin:password http://localhost:15672/api/overviewVous devriez voir HTTP/1.1 200 OK dans la réponse.
Créer un fichier de valeurs Helm
Créez un fichier nommé otel-collector-values.yaml. Cette configuration utilise le receiver_creator avec k8s_observer pour découvrir automatiquement les pods RabbitMQ.
Mettez à jour ces espaces réservés :
my-rabbitmq-cluster: Votre nom de cluster Kubernetesrabbitmq: La valeur de l'étiquetteapppour vos pods RabbitMQadmin/password: Vos identifiants RabbitMQ15672: Le port de l'API de gestionopentelemetry-collector:mode: deploymentimage:repository: otel/opentelemetry-collector-contribpullPolicy: IfNotPresentcommand:name: otelcol-contribresources:limits:cpu: 500mmemory: 300Mirequests:cpu: 100mmemory: 100MiextraEnvs:- name: NEWRELIC_LICENSE_KEYvalueFrom:secretKeyRef:name: newrelic-licenseskey: NEWRELIC_LICENSE_KEY- name: NEWRELIC_OTLP_ENDPOINTvalueFrom:secretKeyRef:name: newrelic-licenseskey: NEWRELIC_OTLP_ENDPOINT- name: K8S_NODE_NAMEvalueFrom:fieldRef:fieldPath: spec.nodeName- name: K8S_CLUSTER_NAMEvalue: my-rabbitmq-cluster- name: RABBITMQ_USERNAMEvalue: admin- name: RABBITMQ_PASSWORDvalue: passwordclusterRole:create: truerules:- apiGroups: [""]resources: ["pods", "nodes", "nodes/stats", "nodes/proxy"]verbs: ["get", "list", "watch"]- apiGroups: ["apps"]resources: ["replicasets", "deployments", "statefulsets"]verbs: ["get", "list", "watch"]clusterRoleBinding:name: ""config:extensions:health_check:endpoint: 0.0.0.0:13133k8s_observer:auth_type: serviceAccountobserve_pods: trueobserve_nodes: falsereceivers:receiver_creator/rabbitmq:watch_observers: [k8s_observer]receivers:rabbitmq:# Discover pods with label "app=rabbitmq"# Adjust the label selector to match your RabbitMQ podsrule: type == "pod" && labels["app"] == "rabbitmq"config:endpoint: 'http://`endpoint`:15672'username: ${env:RABBITMQ_USERNAME}password: ${env:RABBITMQ_PASSWORD}collection_interval: 30smetrics:# Queue Metrics (essential for message flow and backlog)rabbitmq.consumer.count:enabled: truerabbitmq.message.delivered:enabled: truerabbitmq.message.published:enabled: truerabbitmq.message.acknowledged:enabled: truerabbitmq.message.dropped:enabled: truerabbitmq.message.current:enabled: true # Crucial for monitoring queue backlog, includes 'ready' and 'unacknowledged' states# Node Health Metrics (critical for server resource monitoring)rabbitmq.node.disk_free:enabled: truerabbitmq.node.disk_free_limit:enabled: truerabbitmq.node.disk_free_alarm:enabled: truerabbitmq.node.mem_used:enabled: truerabbitmq.node.mem_limit:enabled: truerabbitmq.node.mem_alarm:enabled: truerabbitmq.node.mem_used_details.rate:enabled: truerabbitmq.node.fd_used:enabled: truerabbitmq.node.fd_total:enabled: truerabbitmq.node.sockets_used:enabled: truerabbitmq.node.sockets_total:enabled: truerabbitmq.node.proc_used:enabled: truerabbitmq.node.proc_total:enabled: truerabbitmq.node.uptime:enabled: truerabbitmq.node.run_queue:enabled: truerabbitmq.node.processors:enabled: truerabbitmq.node.context_switches_details.rate:enabled: truerabbitmq.node.gc_num_details.rate:enabled: truerabbitmq.node.gc_bytes_reclaimed_details.rate:enabled: true# I/O Metrics (important for understanding disk and network activity)rabbitmq.node.io_read_count_details.rate:enabled: truerabbitmq.node.io_read_bytes_details.rate:enabled: truerabbitmq.node.io_read_avg_time_details.rate:enabled: truerabbitmq.node.io_write_count_details.rate:enabled: truerabbitmq.node.io_write_bytes_details.rate:enabled: truerabbitmq.node.io_write_avg_time_details.rate:enabled: truerabbitmq.node.io_sync_count_details.rate:enabled: truerabbitmq.node.io_sync_avg_time_details.rate:enabled: truerabbitmq.node.io_seek_count_details.rate:enabled: truerabbitmq.node.io_seek_avg_time_details.rate:enabled: truerabbitmq.node.io_reopen_count_details.rate:enabled: true# Mnesia and Store Metrics (for internal database and message storage)rabbitmq.node.mnesia_ram_tx_count_details.rate:enabled: truerabbitmq.node.mnesia_disk_tx_count_details.rate:enabled: truerabbitmq.node.msg_store_read_count_details.rate:enabled: truerabbitmq.node.msg_store_write_count_details.rate:enabled: truerabbitmq.node.queue_index_write_count_details.rate:enabled: truerabbitmq.node.queue_index_read_count_details.rate:enabled: true# Connection/Channel/Queue Lifecycle Metricsrabbitmq.node.connection_created_details.rate:enabled: truerabbitmq.node.connection_closed_details.rate:enabled: truerabbitmq.node.channel_created_details.rate:enabled: truerabbitmq.node.channel_closed_details.rate:enabled: truerabbitmq.node.queue_declared_details.rate:enabled: truerabbitmq.node.queue_created_details.rate:enabled: truerabbitmq.node.queue_deleted_details.rate:enabled: trueresource_attributes:rabbitmq.server.endpoint: 'http://`endpoint`:15672'rabbitmq.port: '15672'processors:batch:send_batch_size: 1024timeout: 30sresource/cluster:attributes:- key: k8s.cluster.namevalue: ${env:K8S_CLUSTER_NAME}action: upserttransform/rabbitmq:metric_statements:- context: resourcestatements:# Create a display name combining Kubernetes metadata- set(attributes["rabbitmq.display.name"], Concat(["server","k8s",attributes["k8s.cluster.name"],attributes["k8s.namespace.name"],"pod",attributes["k8s.pod.name"],"rabbitmq",attributes["rabbitmq.port"]], ":"))# Use pod name as deployment name- set(attributes["rabbitmq.deployment.name"], attributes["k8s.pod.name"])exporters:otlphttp:endpoint: "${NEWRELIC_OTLP_ENDPOINT}"headers:api-key: "${NEWRELIC_LICENSE_KEY}"compression: gzipservice:extensions: [health_check, k8s_observer]pipelines:metrics/rabbitmq:receivers: [receiver_creator/rabbitmq]processors: [batch, resource/cluster, transform/rabbitmq]exporters: [otlphttp]Conseil
Personnalisation du sélecteur d'étiquettes : Si vos pods RabbitMQ utilisent des étiquettes différentes, mettez à jour la ligne
rule. Par exemple :Pods StatefulSet :
type == "pod" && labels["app.kubernetes.io/name"] == "rabbitmq"Déploiements d'opérateurs :
type == "pod" && labels["app.kubernetes.io/component"] == "rabbitmq"Exécutez
kubectl get pods --show-labels -n <namespace>pour afficher les labels de vos pods.
Créer un secret Kubernetes
Stockez vos identifiants New Relic dans un secret Kubernetes.
Sélectionnez la région qui correspond à votre compte New Relic (vérifiez l'URL de votre navigateur lorsque vous êtes connecté à New Relic) :
$kubectl create secret generic newrelic-licenses \> --from-literal=NEWRELIC_LICENSE_KEY=YOUR_LICENSE_KEY \> --from-literal=NEWRELIC_OTLP_ENDPOINT=https://otlp.nr-data.net:4318 \> --namespace newrelicRemplacez YOUR_LICENSE_KEY par votre clé de licence New Relic.
$kubectl create secret generic newrelic-licenses \> --from-literal=NEWRELIC_LICENSE_KEY=YOUR_LICENSE_KEY \> --from-literal=NEWRELIC_OTLP_ENDPOINT=https://otlp.eu01.nr-data.net:4318 \> --namespace newrelicRemplacez YOUR_LICENSE_KEY par votre clé de licence New Relic.
Déployer avec Helm
Ajouter le dépôt Helm OpenTelemetry :
$helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts$helm repo updateInstaller ou mettre à jour le collecteur :
$helm upgrade --install rabbitmq-otel-collector \> open-telemetry/opentelemetry-collector \> --namespace newrelic \> --create-namespace \> --values otel-collector-values.yamlCela crée :
- Un déploiement nommé
rabbitmq-otel-collectordans l'espace de nomsnewrelic - Un compte de service avec des permissions RBAC pour surveiller les pods
- ConfigMaps contenant la configuration du collecteur
Vérifier le déploiement et le flux de données
Vérifiez que le pod du collecteur est en cours d'exécution :
$kubectl get pods -n newrelic -l app.kubernetes.io/name=opentelemetry-collectorRésultat attendu :
NAME READY STATUS RESTARTS AGErabbitmq-otel-collector-6d8c5c5d8d-abc12 1/1 Running 0 2mConsultez les logs du collecteur pour vérifier la découverte des pods :
$kubectl logs deploy/rabbitmq-otel-collector -n newrelic --tail=50Recherchez des messages indiquant la réussite de la découverte des pods et de la collecte de métriques :
INFO k8sobserver/extension.go:150 Discovered pod {"kind": "pod", "name": "rabbitmq-0", "namespace": "default"}INFO RabbitmqReceiver Successfully scraped rabbitmq metrics from pod rabbitmq-0Vérifiez vos données dans New Relic :
Attendez 2 à 3 minutes que les données apparaissent, puis exécutez cette requête dans le générateur de requêtes:
SELECT count(*)FROM MetricWHERE metricName LIKE 'rabbitmq.%' AND instrumentation.provider = 'opentelemetry' AND k8s.cluster.name = 'my-rabbitmq-cluster'FACET k8s.pod.name, metricNameSINCE 10 minutes agoVous devriez voir des métriques de chaque pod RabbitMQ avec des attributs Kubernetes :
k8s.cluster.name- Votre identifiant de clusterk8s.namespace.name- Espace de noms du podk8s.pod.name- Nom du pod individuelrabbitmq.deployment.name- Dérivé du nom du pod
Conseil
Si vous ne voyez pas de données après 5 minutes, consultez la section de dépannage ci-dessous.
Dépannage
Quelle est la prochaine étape ?
Maintenant que vous avez configuré le monitoring de RabbitMQ, vous pouvez améliorer votre observabilité :
Explorez vos données :
- Explorer les métriques RabbitMQ - Liste complète des métriques avec des exemples de requêtes NRQL
Améliorer le monitoring :
- Créer des alertes - Configurez des alertes pour les profondeurs de file d'attente et la santé des pods
- Créer des dashboards - Créez des dashboards personnalisés pour visualiser vos métriques RabbitMQ