デフォルトでは、New RelicはAPMアプリケーションとElasticsearchクラスタを2つの独立した、接続されていない項目としてモニターします:アプリが実際にそのクラスタを呼び出していることを示すものは何もありません。
このページでは、ElasticsearchのネイティブなOpenTelemetryディストリビューティッド(分散)トレーシングを使用して、そのギャップを埋めます。Elasticsearchは、メトリクスにすでに使用しているのと同じOpenTelemetryコレクター(NRDOTまたはOTel Collector Contrib)を介して、アプリケーションごとの変更なしに独自のトレーススパンをエクスポートします。結果:遅いトランザクションは、それを処理したクラスタに直接つながります。
内部的には、アプリケーションとElasticsearchはそれぞれ、同じリクエストのそれぞれの部分を単一の共有トレースに提供します。New Relicは、両側が互いに関連していることを認識し、サービスとクラスタの関係を自動的に構築します。
ヒント
ディストリビューティッド(分散)トレーシングは、APMをElasticsearchと関連付ける2つの方法のうちの1つです。これにより、リクエストレベルの完全な詳細が得られますが、追加のトレースデータによって取り込み量が増加します。クラスタを関連エンティティとして表示するだけでよい場合は、代わりにAPMアプリケーションのテレメトリーにクラスタ名でタグ付けすることができます — これはどのElasticsearchバージョンでも機能しますが、エンドツーエンドのトレースの詳細はスキップされます。
互換性のある計装
この関連付けは、W3Cトレースコンテキスト伝搬をサポートするすべてのアプリケーションで機能します。これには以下が含まれます:
- OpenTelemetry SDKでインストゥルメントされたアプリケーション(任意の言語)
- OpenTelemetry自動インストゥルメンテーション(Java、.NET、Python、Node.js)
- New Relic APMエージェント(Go、Java、.NET、Node.js、Python、Ruby、PHP)で、ディストリビューティッド(分散)トレーシングが有効になっているもの
計装アプローチを混在させることができます。たとえば、New Relic APMエージェントを使用するJavaサービスと、OpenTelemetry SDKを使用するPythonサービスは、どちらも同じElasticsearchクラスタを呼び出すことができ、それぞれがNew Relic内で正しくリンクされて表示されます。
必要なこと
始める前に、以下があることを確認してください:
ディストリビューティッド(分散)トレーシングの設定
設定には2つの部分があります:Elasticsearchでトレースをオンにすることと、コレクターにトレースパイプラインを追加することです。
トレースを有効にすると、Elasticsearchは独自のOpenTelemetryスパンを発行し、traceparentヘッダーを介してアプリケーションのトレースに結合し、それぞれにes.cluster.nameをスタンプします。New Relicは、その共有トレースを使用して関係を自動的に結び付けます。
デプロイメントに一致するセクションを展開します。
Elasticsearchでトレースをオンにする
すべてのノードのelasticsearch.ymlに以下を追加します。次に、(ES_JAVA_OPTSまたはjvm.options経由で)-Dtelemetry.otel.traces.enabled=trueを設定し、各ノードを再起動します:
telemetry.tracing.enabled: true
telemetry.export.endpoint: http://YOUR_COLLECTOR_HOST:4317
telemetry.tracing.sample_rate: 1.0
コレクターにトレースパイプラインを追加する
次に、Elasticsearchが送信するトレースを受信し、クラスタがそれ自体を呼び出しているように見せてしまうスパンを除外するようにコレクターを設定します。otlpレシーバーとfilter/drop_rootless_esおよびtransform/strip_es_hostプロセッサーをtracesパイプラインに追加します:
- 'instrumentation_scope.name == "elasticsearch" and IsRootSpan()'
- delete_key(attributes, "http.request.headers.host") where instrumentation_scope.name == "elasticsearch"
- delete_key(attributes, "server.address") where instrumentation_scope.name == "elasticsearch"
processors: [filter/drop_rootless_es, transform/strip_es_host, batch]
コレクターを再起動します
<collector-service>をコレクターのサービス名(たとえば、nrdot-collectorまたはotelcol-contrib)に置き換えます:
$sudo systemctl restart <collector-service>
スパンが到着していることを確認する
Elasticsearchがクラスタ名でタグ付けされたトレースを送信していることを確認します:
FROM Span SELECT count(*) WHERE es.cluster.name = '<elasticsearch-cluster-name>' SINCE 30 minutes ago
SINCE句は、クエリがどれくらい遡って検索するかを設定します。状況に合わせて調整してください — たとえば、以前にトレースを有効にしており、より長い期間を確認したい場合はSINCE 2 hours agoにします。
Elasticsearchポッドでトレースをオンにする
以下をelasticsearch.yml(ConfigMap、Helm値、またはECK nodeSets)に追加します。次に、ES_JAVA_OPTSを介して-Dtelemetry.otel.traces.enabled=trueを設定し、ポッドをロールアウトします:
telemetry.tracing.enabled: true
telemetry.export.endpoint: http://YOUR_COLLECTOR_SVC.YOUR_NAMESPACE.svc.cluster.local:4317
telemetry.tracing.sample_rate: 1.0
コレクターにトレースパイプラインを追加する
次に、Elasticsearchが送信するトレースを受信し、そのままではクラスタが自身を呼び出しているように見えてしまうスパンを除外するようにコレクターを構成します。コレクター設定のtracesパイプラインに、otlpレシーバーと、filter/drop_rootless_esおよびtransform/strip_es_hostプロセッサーを追加します。コレクターがgRPCポート4317を公開していることを確認します:
- 'instrumentation_scope.name == "elasticsearch" and IsRootSpan()'
- delete_key(attributes, "http.request.headers.host") where instrumentation_scope.name == "elasticsearch"
- delete_key(attributes, "server.address") where instrumentation_scope.name == "elasticsearch"
processors: [filter/drop_rootless_es, transform/strip_es_host, batch]
コレクターを再デプロイする
更新された設定を適用し、コレクターポッドをロールアウトして設定を反映させます。コレクターをインストールしたときに使用したのと同じConfigMapファイル、Deployment名、およびネームスペースを使用します — たとえば、マニフェストベースのインストレーションに従った場合はnr-k8s-otel-collector-deploymentです:
$kubectl apply -f <your-collector-config>.yaml -n <namespace>
$kubectl rollout restart deployment/<collector-deployment> -n <namespace>
Helmを使用してコレクターをデプロイした場合は、kubectl applyの代わりに更新された値を使用してhelm upgradeを再実行します。
スパンが到着していることを確認する
Elasticsearchがクラスタ名でタグ付けされたトレースを送信していることを確認します:
FROM Span SELECT count(*) WHERE es.cluster.name = '<elasticsearch-cluster-name>' SINCE 30 minutes ago
SINCE句は、クエリがどれくらい遡って検索するかを設定します。状況に合わせて調整してください — たとえば、以前にトレースを有効にしており、より長い期間を確認したい場合はSINCE 2 hours agoにします。
トレースを表示する
スパンが流れ始めたら、それらをクエリして、相関するサービスマップを検査できます。クエリの例とNew Relicでサービスマップを見つける場所については、ディストリビューティッド(分散)トレーシングとAPMの相関関係の表示をご覧ください。
トラブルシューティング
スパンが表示されない場合、クラスタが自身への関係を示している場合、またはアプリケーションがクラスタにリンクしていない場合は、トラブルシューティングガイドのAPMの相関とディストリビューティッド(分散)トレーシングのセクションを参照してください。