サービスメッシュと OpenTelemetry の連携を探る: 分散トレース

サービスメッシュと OpenTelemetry の連携を探る: 分散トレース

この記事が公開された後、一部の読者から javaagent の「非侵入性」についてコメントがありましたが、ここで説明する必要があります。 「非侵入的」とは、主にアプリケーションのビジネス ロジック コードを変更せずに実装できる機能を指します。透過的でアプリケーションを意識する必要がないため、開発者はビジネス開発に集中できます。同時に、アプリケーションコードを変更する必要がないため、統合が容易になります。また、メンテナンスも簡単で、複数の言語やフレームワーク間での機能の一貫性も確保されます。

Java エージェントは JVM の起動時にロードされ、アプリケーションのソース コード レベルを変更するのではなく、実行時にバイトコードを変更して追跡コードを挿入します。

背景

分散トレース

分散トレースは、マイクロサービス リクエスト フローを監視および診断するための重要なテクノロジであり、可観測性の重要なコンポーネントであり、マイクロサービス アーキテクチャにおける複雑な相互作用やパフォーマンスの問題に関する深い洞察を提供します。サービス間のリクエスト リンクを明確に表示することで複雑さを管理し、パフォーマンスのボトルネックを特定し、リソース割り当てを最適化し、障害を迅速に特定して解決し、システム全体の信頼性を向上させるのに役立ちます。

サービスメッシュのための非侵入型分散トレース

再び非侵襲的!サービス メッシュ内のプロキシは、すべての受信および送信ネットワーク通信を自動的に処理し、要求時間、期間、ステータス コード、その他のメタデータなど、サービス間の要求と応答に関する詳細な情報を自動的にキャプチャ、記録、分析します。この実装[1]はアプリケーション自体に対して透過的であり、実行時にバイトコードを変更するJavaエージェントよりも徹底的です。

ここでの前提は、アプリケーションがリクエストでコンテキスト情報を渡すことができるため、サイドカー プロキシによって生成され、送信されたトレース情報が、切断されることなく最終的に連結されることです。

写真

メッシュの非侵入型分散トレースではリクエスト リンクが表示されますが、上図に示すように、各スパンはサイドカー プロキシの情報です。

前回の記事に続き、今日はService Mesh FSM[2]とOpenTelemetryを統合して、アプリケーションとメッシュのフルリンク分散トレースを実装する方法について説明します。

デモ

建築

写真

環境設定

Jaeger、cert-manager、Otel Operator のインストールについては、前の記事を参照してください。

計測の設定

次のステップは、プローブをインストールして構成することです。詳細な設定手順については、Instrumentation APIドキュメント[3]を参照してください。

FSM分散トレースドキュメント[4]によれば、FSMはZipkinプロトコルをサポートしています。したがって、プロパゲータでは b3multi を使用し、B3 マルチヘッダー形式を使用してリクエスト ヘッダーに次の情報を渡します。

  • x-b3-トレースID
  • x-b3-スパニッド
  • x-b3-親spanid
  • x-b3 サンプル
  • x-b3-フラグ

今回はサンプル名前空間を使用します。

 kubectl create namespace sample kubectl apply -n sample -f - <<EOF apiVersion: opentelemetry.io/v1alpha1 kind: Instrumentation metadata: name: instrumentation-sample spec: propagators: - b3multi sampler: type: parentbased_traceidratio argument: "1" env: - name: OTEL_EXPORTER_OTLP_ENDPOINT value: otel-collector.default:4318 EOF

OpenTelemetry Collector を構成する

Otelコレクターの詳細な設定については、公式ドキュメント[5]を参照してください。

  • 受信側では、アプリケーションからトレース情報を受信するように otlp を構成し、エンドポイント 0.0.0.0:9411 を使用して、サイドカーからレポートを受信するように zipkin を使用します。
  • エクスポーター、Jager の otlp エンドポイント jaeger.default:4317 を構成します。
  • 入力ソースとして otlp と zipkin を使用し、出力先として jaeger を使用するパイプライン サービス。
 kubectl apply -f - <<EOF apiVersion: opentelemetry.io/v1alpha1 kind: OpenTelemetryCollector metadata: name: otel spec: config: | receivers: otlp: protocols: grpc: http: zipkin: endpoint: "0.0.0.0:9411" exporters: otlp/jaeger: endpoint: "jaeger.default:4317" tls: insecure: true service: pipelines: traces: receivers: [otlp, zipkin] exporters: [otlp/jaeger] EOF

サービスメッシュ FSM のインストール

FSM は CLI 経由でインストールします。今すぐ FSM をダウンロードし、最新の公式バージョン 1.1.4 を使用してください。

 system=$(uname -s | tr '[:upper:]' '[:lower:]') arch=$(uname -m | sed -E 's/x86_/amd/' | sed -E 's/aarch/arm/') release=v1.1.4 curl -L https://github.com/flomesh-io/fsm/releases/download/$release/fsm-$release-$system-$arch.tar.gz | tar -vxzf - ./$system-$arch/fsm version

インストール中に、分散トレースを有効にし、アドレスを Otel Collector の zipkin シンクにポイントします。zipkin シンクのエンドポイントは /api/v2/spans です。

 fsm install \ --set=fsm.tracing.enable=true \ --set=fsm.tracing.address=otel-collector.default \ --set=fsm.tracing.port=9411 \ --set=fsm.tracing.endpoint=/api/v2/spans

サンプルアプリケーションをデプロイする

サンプル名前空間をサービス グリッドに追加し、アプリケーションをデプロイします。

 fsm namespace add sample kubectl apply -n sample -f https://raw.githubusercontent.com/addozhang/http-sample/main/manifests/service-v1.yaml

アプリケーション ポッドにサイドカーが挿入され、正常に実行されることを確認します。

 kubectl get po -n sample NAME READY STATUS RESTARTS AGE service-c-66bf9dcc7b-pdj8p 2/2 Running 0 38s service-b-586cfc5ccd-k9qrs 2/2 Running 0 37s service-a-7cf7bc5bcc-tgjzz 2/2 Running 0 37s

テスト

pod_name="$(kubectl get pod -n sample -l app=service-a -o jsnotallow='{.items[0].metadata.name}')" kubectl port-forward -n sample $pod_name 8080:8080 & curl localhost:8080

リクエストを送信した後、Jaeger UI を開きます。

 jaeger_pod="$(kubectl get pod -l app=jaeger -o jsnotallow='{.items[0].metadata.name}')" kubectl port-forward $jaeger_pod 16686:16686 &

Jaeger UI では、リンクの内容がより豊富であることがわかります。これには、アプリケーションのスパン データとサイドカー プロキシが含まれています。

写真

参考文献

[1] 実装: https://fsm-docs.flomesh.io/guides/observability/tracing/

[2] サービスメッシュFSM: http://fsm-docs.flomesh.io

[3] インストルメンテーションAPIドキュメント: https://github.com/open-telemetry/opentelemetry-operator/blob/main/docs/api.md#instrumentation

[4] FSM分散トレースのドキュメント: https://fsm-docs.flomesh.io/guides/observability/tracing/

[5] 公式ドキュメント: https://opentelemetry.io/docs/collector/configuration/

<<:  オペレーション兄弟!なぜ Kafka は再び「タイムアウト」したのでしょうか?

>>:  実稼働の実践: GlusterFS を使用して Kubernetes ストレージ ボリューム クラスターを構築する

推薦する

#BlackFriday# bacloud: 全製品 50% オフ、米国/オランダ/リトアニア、1Gbps 帯域幅、VPS の無制限トラフィック、専用サーバーの 100TB トラフィック

リトアニアの会社であるbacloudは、2007年に設立され、それ以来運営されているサーバープロバイ...

Google翻訳はまもなく絵文字翻訳をサポートする予定

Google は本日、Google 翻訳が絵文字翻訳をサポートすることを発表しましたが、この機能は現...

友好的なリンクの交換から、私たちは現実的な人間になり、正式かつ規則的にウェブサイトを運営する方法を知ることができます。

ウェブマスターの間では、「コンテンツは王、外部リンクは皇帝、内部リンクは側室、コードは将軍、キーワー...

検索エンジン最適化とウェブサイト最適化

検索エンジン最適化とウェブサイト最適化 --- ロビンとの議論最適化の目標検索エンジン最適化とは、検...

Google Cloud が金融業界向けの SWIFT リファレンス アーキテクチャをリリース

Google は本日、金融機関が Google Cloud プラットフォーム上で SWIFT SC ...

古いドメイン名のマイニングに関するチュートリアル(即時ランキングに必須のツール)と実践的な共有

月収10万元の起業の夢を実現するミニプログラム起業支援プラン10 日以上、皆さんと有益な情報をシェア...

今年のブランドマーケティングトレンド!

2019 年はあっという間に過ぎ去りましたが、マーケティングの世界では、良い意味でも悪い意味でも考え...

Dockerの始め方からプロジェクトのデプロイまでお話しましょう

Docker の概念Docker は、Go 言語をベースにしたオープンソースのアプリケーション コン...

2013年の外部リンクの4つの傾向を解釈する

諺にあるように、物事は時間とともに変化します。SEO では、検索エンジンのトレンドに常に追従する必要...

経験の時代では、ユーザーは教育を受けることができない

この記事を書く前に、著者は尋ねたいのですが、百度が現在何世代の検索エンジンサービス技術を使用している...

Sina WeiboとTencent Weiboのそれぞれの特徴について簡単に説明します

昨日、私は2人の友人と新浪微博と騰訊微博についてチャットをしていました。そのうちの1人は、最初は新浪...

百度連合:オンライン連合プロモーション事業におけるiframe呼び出しは禁止

ウェブマスターネットワークは7月5日に報道した。「本日、百度連盟は『百度連盟業務協力基準』を改訂する...

学習と交流を同時に実現する教育ソーシャルネットワーキングサイトが登場

諺にもあるように、学びは決して終わらない。私たちは人生の約20年間を学校で教育を受けて過ごします。学...

WeChatで商品を販売している皆さん、今はどうですか?

はじめに: WeChat はショッピングモールではなく、自然なコミュニケーションツールです。私のアド...