NRDOT Collector (推奨) または自動 Pod 検出機能を備えた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が表示されます。
NRDOT Collectorを構成する
Kubernetes マニフェストを使用して NRDOT Collector をインストールできます。Helm チャートのサポートは近日中に開始される予定です。
基本的なKubernetes OpenTelemetryマニフェストのインストールが完了したら、次の手順に従ってRabbitMQ監視を構成します。
NRDOT Collector を使用するには、コレクター イメージを更新します。
ローカルの
renderedディレクトリにあるdeployment.yamlファイルとdaemonset.yamlファイルの両方で、イメージを次のように更新します。image: newrelic/nrdot-collector:latestRabbitMQ監視の
deployment-configmap.yamlを更新します。deployment-config.yamlコンテンツ全体を RabbitMQ 固有の設定に置き換えます。extensions:health_check:endpoint: 0.0.0.0:13133k8s_observer:auth_type: serviceAccountobserve_pods: trueobserve_nodes: truereceivers:receiver_creator/rabbitmq:watch_observers: [k8s_observer]receivers:rabbitmq:rule: type == "pod" && labels["app"] == "rabbitmq"config:endpoint: 'http://`endpoint`:15672'username: adminpassword: passwordcollection_interval: 30smetrics:rabbitmq.consumer.count:enabled: truerabbitmq.message.delivered:enabled: truerabbitmq.message.published:enabled: truerabbitmq.message.acknowledged:enabled: truerabbitmq.message.dropped:enabled: truerabbitmq.message.current:enabled: truerabbitmq.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.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: trueresource_attributes:rabbitmq.server.endpoint: 'http://`endpoint`:15672'rabbitmq.port: '15672'processors:batch:send_batch_max_size: 1000timeout: 30ssend_batch_size: 800memory_limiter:check_interval: 1slimit_percentage: 80spike_limit_percentage: 25resource/cluster:attributes:- key: k8s.cluster.namevalue: "your-cluster-name"action: inserttransform/rabbitmq:metric_statements:- context: resourcestatements:- 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"]], ":"))- set(attributes["rabbitmq.deployment.name"], attributes["k8s.pod.name"])transform/metadata_nullify:metric_statements:- context: metricstatements:- set(description, "")- set(unit, "")exporters:otlp_http/newrelic:endpoint: "https://otlp.nr-data.net"headers:api-key: ${env:NR_LICENSE_KEY}service:extensions: [health_check, k8s_observer]pipelines:metrics/rabbitmq:receivers: [receiver_creator/rabbitmq]processors: [batch, resource/cluster, transform/rabbitmq, transform/metadata_nullify, memory_limiter]exporters: [otlp_http/newrelic]RabbitMQ設定をカスタマイズします。
- RabbitMQ ポッドのラベルに合わせて
ruleを更新します admin/passwordRabbitMQ の認証情報に合わせて変更しますyour-cluster-name実際のクラスタ名に置き換えますotlp_http/newrelicエクスポーターの下のendpointを更新します。OTLP エンドポイント設定 ドキュメントを参照して、地域に適したエンドポイントを選択してください。
- RabbitMQ ポッドのラベルに合わせて
更新されたマニフェストを適用し、デプロイメントを再起動します。
bash$kubectl apply -n newrelic -R -f rendered$kubectl rollout restart deployment nr-k8s-otel-collector-deployment -n newrelic
デプロイメントとデータ フローを確認する
コレクター ポッドが実行されていることを確認します。
$kubectl get pods -n newrelic --watchコレクター ログを表示してポッドの検出を確認します。
$kubectl logs deploy/nr-k8s-otel-collector-deployment -n newrelic --tail=50New Relic でデータを検証します。
データが表示されるまで 2 ~ 3 分待ってから、書き込みビルダーで次のコマンドを実行します。
SELECT count(*)FROM MetricWHERE metricName LIKE 'rabbitmq.%' AND instrumentation.provider = 'opentelemetry' AND k8s.cluster.name = 'your-cluster-name'FACET k8s.pod.name, metricNameSINCE 10 minutes agoヒント
5 分経ってもデータが表示されない場合は、以下のトラブルシューティングのセクションを確認してください。
あなたが始める前に
環境が次の要件を満たしていることを確認してください。
管理エンドポイントを確認する
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"])transform/metadata_nullify:metric_statements:- context: metricstatements:- set(description, "")- set(unit, "")exporters:otlp_http/newrelic:endpoint: "${NEWRELIC_OTLP_ENDPOINT}"headers:api-key: "${NEWRELIC_LICENSE_KEY}"service:extensions: [health_check, k8s_observer]pipelines:metrics/rabbitmq:receivers: [receiver_creator/rabbitmq]processors: [batch, resource/cluster, transform/rabbitmq, transform/metadata_nullify]exporters: [otlp_http/newrelic]ヒント
ラベルセレクターのカスタマイズ: 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 メトリクスを視覚化するカスタムダッシュボードを作成します