自動ポッド検出機能を備えたOpenTelemetry Collectorを使用して、 Kubernetesクラスタで実行されている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が作成されるか、既存の RabbitMQpod が削除されると、オブザーバーはコレクターの設定を自動的に更新します。
重要
コレクターが 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: Kubernetesクラスタ名rabbitmq: RabbitMQの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シークレットを作成する
New Relic の認証情報を Kubernetes シークレットに保存します。
New Relic アカウントに一致するリージョンを選択します (New Relic にログインしたらブラウザの 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 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 newrelicYOUR_LICENSE_KEY New Relicライセンスキーに置き換えます。
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-0New Relic でデータを検証します。
データが表示されるまで 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 クエリ例を含むメトリクスの完全なリスト
監視の強化:
- アラートの作成- キューの深さとポッドの健全性に関するアラートを設定します
- ダッシュボードの構築- RabbitMQ メトリクスを視覚化するカスタムダッシュボードを作成します