자동 패드 검색 기능이 있는 OpenTelemetry Collector 사용하여 쿠버네티스 클러스터에서 실행 중인 RabbitMQ 모니터링합니다. 이 가이드는 Kubernetes 옵저버 기반의 동적 브로커 감지 기능을 사용하여 Helm 통해 수집기를 구현하고 배포하는 방법을 안내합니다.
팁
Linux 호스트에서 RabbitMQ를 실행하시겠습니까? 가상 머신 또는 베어 메탈 구현, 배포에 대한 자체 호스팅 설치 가이드를 참조하세요.
통합 작동 방식
이 Kubernetes기본 구현인 배포는 자동 검색 및 모니터링을 제공합니다.
주요 구성 요소:
Kubernetes 옵저버: 레이블 선택기를 기반으로 RabbitMQ 파드를 지속적으로 감시합니다.
리시버 생성기: 발견된 각 파드에 대해 RabbitMQ 리시버를 동적으로 생성합니다.
리소스 속성 부여: Kubernetes 메타데이터를 사용하여 메트릭을 자동으로 보강합니다.
k8s.cluster.name- 클러스터 식별자k8s.namespace.name- 파드 지우스페이스k8s.pod.name- 개인 파드 이름rabbitmq.deployment.name- 파드 이름에서 유래
구현, 배포 모델: 수집기는 지우스페이스 전체에서 파드를 나열하고 감시할 수 있는 RBAC 권한이 있는 Kubernetes 구현, 배포(단일 복제본)로 실행됩니다. 새로운 RabbitMQ 파드가 생성되거나 기존 파드가 제거될 때, 옵저버는 수집기의 설정을 자동으로 업데이트합니다.
중요
수집기가 RabbitMQ 자동으로 검색하려면 파드에 대한 get, list 및 watch 권한이 필요합니다.
설치 단계
RabbitMQ 모니터링을 사용하여 OpenTelemetry Collector 구현하고 배포하려면 다음 단계를 따르세요.
시작하기 전에
사용 환경이 다음 요구 사항을 충족하는지 확인하십시오.
관리 엔드포인트를 확인하세요
RabbitMQ 파드에 관리 플러그인이 활성화되어 있는지 확인하십시오.
$kubectl exec deploy/<your-rabbitmq-deployment> -n <rabbitmq-namespace> -- curl -I -u admin:password http://localhost:15672/api/overview응답에 HTTP/1.1 200 OK 표시되어야 합니다.
Helm 값 파일을 생성합니다.
otel-collector-values.yaml 이라는 이름의 파일을 생성하세요. 이 설정은 receiver_creator 과 k8s_observer 를 사용하여 RabbitMQ 파드를 자동으로 검색합니다.
다음 플레이스홀더를 업데이트하세요:
my-rabbitmq-cluster: 쿠버네티스 클러스터 이름rabbitmqRabbitMQ 파드에 대한app레이블의 값입니다.admin/password: RabbitMQ 자격 증명15672: 관리 API 포트opentelemetry-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]팁
레이블 선택기 사용자 지정: RabbitMQ 파드에서 다른 레이블을 사용하는 경우
rule줄을 업데이트하세요. 예를 들어:StatefulSet 파드:
type == "pod" && labels["app.kubernetes.io/name"] == "rabbitmq"연산자 구현, 배포:
type == "pod" && labels["app.kubernetes.io/component"] == "rabbitmq"파드 레이블을 보려면
kubectl get pods --show-labels -n <namespace>실행하세요.
Kubernetes 시크릿을 생성합니다.
뉴럴릭 자격 증명을 Kubernetes 시크릿에 저장하세요.
뉴렐릭 계정과 일치하는 지역을 선택하세요(뉴렐릭에 로그인할 때 브라우저 URL을 확인하세요):
$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 newrelicYOUR_LICENSE_KEY 뉴렐릭 클러스터 키로 바꿉니다.
$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 newrelicYOUR_LICENSE_KEY 뉴렐릭 클러스터 키로 바꿉니다.
Helm사용하여 구현하다, 배포하다
OpenTelemetry Helm 저장소를 추가하세요:
$helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts$helm repo update수집기를 설치하거나 업그레이드하세요.
$helm upgrade --install rabbitmq-otel-collector \> open-telemetry/opentelemetry-collector \> --namespace newrelic \> --create-namespace \> --values otel-collector-values.yaml이렇게 하면 다음과 같은 결과가 생성됩니다.
newrelic지우스페이스에rabbitmq-otel-collector라는 이름의 배포- RBAC 권한을 가진 서비스 계정으로 파드를 감시할 수 있습니다.
- 수집기 설정을 포함하는 ConfigMap
구현, 배포, 데이터 흐름 검증
수집기 패드가 실행 중인지 확인합니다.
$kubectl get pods -n newrelic -l app.kubernetes.io/name=opentelemetry-collector예상 출력:
NAME READY STATUS RESTARTS AGErabbitmq-otel-collector-6d8c5c5d8d-abc12 1/1 Running 0 2m패드 검색을 확인하기 위해 수집기 로그 보기:
$kubectl logs deploy/rabbitmq-otel-collector -n newrelic --tail=50파드 발견 및 수집 성공을 나타내는 메시지를 찾아보세요.
INFO k8sobserver/extension.go:150 Discovered pod {"kind": "pod", "name": "rabbitmq-0", "namespace": "default"}INFO RabbitmqReceiver Successfully scraped rabbitmq metrics from pod rabbitmq-0뉴렐릭에서 데이터를 확인하세요:
데이터가 나타날 때까지 2-3분 정도 기다린 후 쿼리 빌더 에서 다음 쿼리를 실행하세요.
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 agoKubernetes 속성이 있는 각 RabbitMQ 파드의 지표가 표시되어야 합니다.
k8s.cluster.name- 클러스터 식별자k8s.namespace.name- 파드 지우스페이스k8s.pod.name- 개인 파드 이름rabbitmq.deployment.name- 파드 이름에서 유래
팁
5분 후에도 데이터가 표시되지 않으면 아래 문제 해결, 해결 섹션을 확인하세요.
문제점 해결
다음은 뭐지?
이제 RabbitMQ 모델 설정이 완료되었으므로 옵저버빌리티를 향상할 수 있습니다.
데이터를 살펴보세요:
- RabbitMQ 메트릭 살펴보기 - NRQL 쿼리 예제를 포함한 전체 메트릭 목록
모니터링 강화: