自動ポッド検出機能を備えた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: deployment
image: repository: otel/opentelemetry-collector-contrib pullPolicy: IfNotPresent
command: name: otelcol-contrib
resources: limits: cpu: 500m memory: 300Mi requests: cpu: 100m memory: 100Mi
extraEnvs: - name: NEWRELIC_LICENSE_KEY valueFrom: secretKeyRef: name: newrelic-licenses key: NEWRELIC_LICENSE_KEY - name: NEWRELIC_OTLP_ENDPOINT valueFrom: secretKeyRef: name: newrelic-licenses key: NEWRELIC_OTLP_ENDPOINT - name: K8S_NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName - name: K8S_CLUSTER_NAME value: my-rabbitmq-cluster - name: RABBITMQ_USERNAME value: admin - name: RABBITMQ_PASSWORD value: password
clusterRole: create: true rules: - 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:13133
k8s_observer: auth_type: serviceAccount observe_pods: true observe_nodes: false
receivers: receiver_creator/rabbitmq: watch_observers: [k8s_observer] receivers: rabbitmq: # Discover pods with label "app=rabbitmq" # Adjust the label selector to match your RabbitMQ pods rule: type == "pod" && labels["app"] == "rabbitmq" config: endpoint: 'http://`endpoint`:15672' username: ${env:RABBITMQ_USERNAME} password: ${env:RABBITMQ_PASSWORD} collection_interval: 30s metrics: # Queue Metrics (essential for message flow and backlog) rabbitmq.consumer.count: enabled: true rabbitmq.message.delivered: enabled: true rabbitmq.message.published: enabled: true rabbitmq.message.acknowledged: enabled: true rabbitmq.message.dropped: enabled: true rabbitmq.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: true rabbitmq.node.disk_free_limit: enabled: true rabbitmq.node.disk_free_alarm: enabled: true rabbitmq.node.mem_used: enabled: true rabbitmq.node.mem_limit: enabled: true rabbitmq.node.mem_alarm: enabled: true rabbitmq.node.mem_used_details.rate: enabled: true rabbitmq.node.fd_used: enabled: true rabbitmq.node.fd_total: enabled: true rabbitmq.node.sockets_used: enabled: true rabbitmq.node.sockets_total: enabled: true rabbitmq.node.proc_used: enabled: true rabbitmq.node.proc_total: enabled: true rabbitmq.node.uptime: enabled: true rabbitmq.node.run_queue: enabled: true rabbitmq.node.processors: enabled: true rabbitmq.node.context_switches_details.rate: enabled: true rabbitmq.node.gc_num_details.rate: enabled: true rabbitmq.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: true rabbitmq.node.io_read_bytes_details.rate: enabled: true rabbitmq.node.io_read_avg_time_details.rate: enabled: true rabbitmq.node.io_write_count_details.rate: enabled: true rabbitmq.node.io_write_bytes_details.rate: enabled: true rabbitmq.node.io_write_avg_time_details.rate: enabled: true rabbitmq.node.io_sync_count_details.rate: enabled: true rabbitmq.node.io_sync_avg_time_details.rate: enabled: true rabbitmq.node.io_seek_count_details.rate: enabled: true rabbitmq.node.io_seek_avg_time_details.rate: enabled: true rabbitmq.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: true rabbitmq.node.mnesia_disk_tx_count_details.rate: enabled: true rabbitmq.node.msg_store_read_count_details.rate: enabled: true rabbitmq.node.msg_store_write_count_details.rate: enabled: true rabbitmq.node.queue_index_write_count_details.rate: enabled: true rabbitmq.node.queue_index_read_count_details.rate: enabled: true
# Connection/Channel/Queue Lifecycle Metrics rabbitmq.node.connection_created_details.rate: enabled: true rabbitmq.node.connection_closed_details.rate: enabled: true rabbitmq.node.channel_created_details.rate: enabled: true rabbitmq.node.channel_closed_details.rate: enabled: true rabbitmq.node.queue_declared_details.rate: enabled: true rabbitmq.node.queue_created_details.rate: enabled: true rabbitmq.node.queue_deleted_details.rate: enabled: true
resource_attributes: rabbitmq.server.endpoint: 'http://`endpoint`:15672' rabbitmq.port: '15672'
processors: batch: send_batch_size: 1024 timeout: 30s
resource/cluster: attributes: - key: k8s.cluster.name value: ${env:K8S_CLUSTER_NAME} action: upsert
transform/rabbitmq: metric_statements: - context: resource statements: # 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: gzip
service: 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ライセンスキーに置き換えます。
$kubectl create secret generic newrelic-licenses \> --from-literal=NEWRELIC_LICENSE_KEY=YOUR_LICENSE_KEY \> --from-literal=NEWRELIC_OTLP_ENDPOINT=https://otlp.jp.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 メトリクスを視覚化するカスタムダッシュボードを作成します