Monitoree RabbitMQ que se ejecuta en clústeres de Kubernetes utilizando el OpenTelemetry Collector con descubrimiento automático de pods. Esta guía le explica cómo desplegar el colector mediante Helm con detección dinámica de brokers basada en el observador de Kubernetes.
Sugerencia
¿Ejecuta RabbitMQ en hosts Linux? Consulte la guía de instalación autohospedada para implementaciones en máquinas virtuales o bare metal.
Cómo funciona la integración
Esta implementación nativa de Kubernetes proporciona descubrimiento y monitoreo automáticos:
Componentes clave:
Observador de Kubernetes: Observa continuamente los pods de RabbitMQ basándose en selectores de etiquetas
Creador de receptores: Crea dinámicamente receptores de RabbitMQ para cada pod descubierto
Atribución de recursos: Enriquece automáticamente las métricas con metadatos de Kubernetes:
k8s.cluster.name- Su identificador de clústerk8s.namespace.name- Espacio de nombres del podk8s.pod.name- Nombre del pod individualrabbitmq.deployment.name- Derivado del nombre del pod
Modelo de despliegue: El recopilador se ejecuta como un despliegue de Kubernetes (réplica única) con permisos RBAC para listar y observar pods en todos los espacios de nombres. Cuando se crean nuevos pods de RabbitMQ o se eliminan los existentes, el observador actualiza automáticamente la configuración del colector.
Importante
El recopilador requiere permisos de get, list y watch en los pods para descubrir instancias de RabbitMQ automáticamente.
Pasos de instalación
Siga estos pasos para desplegar el OpenTelemetry Collector con monitoreo de RabbitMQ.
Antes de que empieces
Asegúrese de que su entorno cumpla con estos requisitos:
Verificar el punto de conexión de gestión
Asegúrese de que los pods de RabbitMQ tengan habilitado el plugin de administración:
$kubectl exec deploy/<your-rabbitmq-deployment> -n <rabbitmq-namespace> -- curl -I -u admin:password http://localhost:15672/api/overviewDebería ver HTTP/1.1 200 OK en la respuesta.
Crear archivo de valores de Helm
Cree un archivo llamado otel-collector-values.yaml. Esta configuración utiliza el receiver_creator con k8s_observer para descubrir automáticamente pods de RabbitMQ.
Actualice estos marcadores de posición:
my-rabbitmq-cluster: Nombre de su clúster de Kubernetesrabbitmq: El valor de la etiquetaapppara sus pods de RabbitMQadmin/password: Sus credenciales de RabbitMQ15672: El puerto de la API de gestiónopentelemetry-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]Sugerencia
Personalización del selector de etiquetas: Si sus pods de RabbitMQ utilizan etiquetas diferentes, actualice la línea
rule. Por ejemplo:Pods de StatefulSet:
type == "pod" && labels["app.kubernetes.io/name"] == "rabbitmq"Implementaciones del operador:
type == "pod" && labels["app.kubernetes.io/component"] == "rabbitmq"Ejecute
kubectl get pods --show-labels -n <namespace>para ver las etiquetas de su pod.
Crear secreto de Kubernetes
Guarde sus credenciales de New Relic en un secreto de Kubernetes.
Selecciona la región que corresponde a tu cuenta de New Relic (revisa la URL de tu navegador cuando inicies sesión en 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 newrelicReemplaza YOUR_LICENSE_KEY por tu clave de licencia de 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 newrelicReemplaza YOUR_LICENSE_KEY por tu clave de licencia de New Relic.
Desplegar con Helm
Agregue el repositorio Helm de OpenTelemetry:
$helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts$helm repo updateInstale o actualice el colector:
$helm upgrade --install rabbitmq-otel-collector \> open-telemetry/opentelemetry-collector \> --namespace newrelic \> --create-namespace \> --values otel-collector-values.yamlEsto crea:
- Una implementación llamada
rabbitmq-otel-collectoren el espacio de nombresnewrelic - Una cuenta de servicio con permisos RBAC para observar pods
- ConfigMaps que contienen la configuración del recopilador
Verifique el despliegue y el flujo de datos
Compruebe que el pod del colector se esté ejecutando:
$kubectl get pods -n newrelic -l app.kubernetes.io/name=opentelemetry-collectorResultado esperado:
NAME READY STATUS RESTARTS AGErabbitmq-otel-collector-6d8c5c5d8d-abc12 1/1 Running 0 2mVea los logs del recopilador para verificar el descubrimiento de pods:
$kubectl logs deploy/rabbitmq-otel-collector -n newrelic --tail=50Busque mensajes que indiquen el descubrimiento de pods y la recolección de métricas exitosos:
INFO k8sobserver/extension.go:150 Discovered pod {"kind": "pod", "name": "rabbitmq-0", "namespace": "default"}INFO RabbitmqReceiver Successfully scraped rabbitmq metrics from pod rabbitmq-0Verifique sus datos en New Relic:
Espere de 2 a 3 minutos para que aparezcan los datos, luego ejecute esta consulta en el generador de consultas:
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 agoDebería ver métricas de cada pod de RabbitMQ con atributos de Kubernetes:
k8s.cluster.name- Su identificador de clústerk8s.namespace.name- Espacio de nombres del podk8s.pod.name- Nombre del pod individualrabbitmq.deployment.name- Derivado del nombre del pod
Sugerencia
Si no ve datos después de 5 minutos, consulte la sección de solución de problemas a continuación.
Resolución de problemas
¿Que sigue?
Ahora que tiene configurado el monitoreo de RabbitMQ, puede mejorar su observabilidad:
Explore sus datos:
- Explora las métricas de RabbitMQ - Lista completa de métricas con ejemplos de consultas NRQL
Mejorar el monitoreo:
- Crear alertas - Configura alertas para la profundidad de las colas y la salud de los pods
- Crear paneles - Cree paneles personalizados para visualizar sus métricas de RabbitMQ