Linkerd 2.19以降では、追加のトレーシングバックエンドやcert-managerのセットアップを必要とせずに、メッシュサイドカーから直接、プロキシされたすべてのリクエストのスパンをエクスポートできます。インストゥルメントされたアプリケーションポッドと組み合わせることで、これらのプロキシスパンはエンドツーエンドのトレースに接続され、リクエストがメッシュ内をどのように移動したかを正確に示します。
使い方
トレーシングの有効化には2つの部分があります:
- メッシュレベルのトレースエクスポート:Linkerdプロキシは、リクエストごとにスパンをOTel Collectorにエクスポートします。これだけで、アプリケーションに触れることなく、プロキシレベルのトレース(再試行、mTLSハンドシェイク、ホップごとのレイテンシ)を取得できます。
- アプリケーションの計装:アプリのポッドは、プロキシが使用するのと同じW3Cトレースコンテキストを伝播し、独自のスパンをエクスポートします。両方を組み合わせることで、クライアントアプリからLinkerdプロキシを経由してバックエンドアプリに至るまで、同じトレース内に完全なウォーターフォールが表示されます。
あなたが始める前に
以下のものを用意してください:
Linkerd edge-26.7.0以降(2.19以降)。以前のリリースでのプロキシトレーシングには、個別のコレクターサービスとcert-managerのインテグレーションが必要でしたが、このガイドでは説明していません。アップグレードが必要な場合は、Linkerdのスタートガイドを参照してください。
LinkerdインスタンスでNRDOTまたはOTel Collector Contribが稼働していること:
トレースするネームスペースでインジェクションが有効になっていること。
ディストリビューティッド(分散)トレーシングの設定
Linkerd 2.19以降、プロキシトレースのエクスポートはコントロールプレーンで直接構成され、cert-managerや個別のポートは必要ありません。2つの手順が必要です:コレクターがトレースを受信できるようにしてから、プロキシからのトレースのエクスポートをオンにします。
手順1:コレクターにトレースの取り込みを追加する
NRDOTチャートとは異なり、コミュニティのopen-telemetry/opentelemetry-collectorチャートにはデフォルトでotlpレシーバーが含まれていません。NRDOTタブで使用されているのと同じプロセッサとともに、これを明示的に追加します。
手順2:プロキシトレースのエクスポートを有効にする
1. コレクターをメッシュ化します。Linkerdプロキシは、それ自体がメッシュ内にあるコレクターにのみトレースをエクスポートできます。NRDOTチャートのnr-k8s-otel-collector-gatewayとは異なり、OTel Collector ContribマニフェストまたはHelmチャートには、デフォルトでコレクターポッドをメッシュに挿入するものは何もありません:
$kubectl annotate namespace newrelic linkerd.io/inject=enabled$kubectl rollout restart deployment/my-opentelemetry-collector -n newrelic重要
以下のmeshIdentityスタンザは必須です。Linkerdはメッシュ内にあるコレクターにのみトレースをエクスポートできます。これは、上記のコマンドが実行したことです。
2. Linkerdプロキシでトレースを有効にします:
手順3:アプリケーションのメッシュ化されたポッドを再起動する
これは手順2のコレクターの再起動とは異なります — 実際にトレースしているポッドに新しいプロキシトレース構成を適用します:
$kubectl rollout restart deployment -n <YOUR_NAMESPACE>アプリケーションポッドの計装
トレースコンテキストヘッダーを伝播するために、OTel Javaエージェント(または使用する言語のエージェント)を追加します。Linkerdは、W3CトレースコンテキストとB3フォーマットの両方をサポートしています。OTelエージェントはこれを自動的に処理します。
ヒント
spec.exporter.endpoint 以下は、マニフェストを使用したOTel Collector ContribページのServiceを指しています。NRDOTコレクターをデプロイした場合は、代わりにhttp://nr-k8s-otel-collector-gateway.newrelic.svc.cluster.local:4317を使用します。
その他の言語(Python、.NET、Node.js、Go)および、サイドカーとinit-コンテナのインジェクション、リソース制限、マルチコンテナポッドなどの高度なOperator設定については、OpenTelemetry Operatorの自動計装に関するドキュメントをご覧ください。
アプリのメトリクスをAPMと関連付ける(オプション)
アプリが(トレースだけでなく)OTel SDKメトリクスもコレクターにエクスポートする場合は、以下を追加してAPM互換のメトリクスパイプラインにルーティングしてください。
追加するプロセッサ:
metricstransform/apm_compat: transforms: - include: http.server.request.duration action: insert new_name: apm.service.transaction.duration追加するパイプライン:
metrics/otlp: receivers: [otlp] processors: [memory_limiter, resourcedetection, transform/metadata_nullify, metricstransform/apm_compat, batch] exporters: [otlp_http/newrelic]デプロイしたコレクター設定に両方を追加し、再適用してください:
| デプロイした場合 | 追加先 | 再適用方法 |
|---|---|---|
| NRDOT - Helm | のdeployment.configMap.extraConfig values.yaml | helm upgrade nr-k8s-otel-collector newrelic/nr-k8s-otel-collector --namespace newrelic --reuse-values -f values.yaml |
| NRDOT - マニフェスト | deployment-configmap.yaml | kubectl apply -f rendered/deployment-configmap.yaml -n newrelic && kubectl rollout restart deployment -n newrelic |
| OTel Collector Contrib - Helm | のconfigセクション values.yaml | helm upgrade my-opentelemetry-collector open-telemetry/opentelemetry-collector -f values.yaml -n newrelic --create-namespace --install |
| OTel Collector Contrib - マニフェスト | のConfigMapのconfigキー otel-collector.yaml | kubectl apply -f otel-collector.yaml && kubectl rollout restart deployment/my-opentelemetry-collector -n newrelic |