この投稿は、OpenTelemetry の基本的な理解を深めることを目的としています。取り上げるトピックは次のとおりです。
この記事を最後まで読めば、OpenTelemetry Operator を使用して、コードを変更せずにアプリケーションにトレースを実装する方法がわかります。 分散トレースまず、分散トレースとは何か、そしてなぜそれが必要なのかを理解しましょう。 なぜ追跡が必要なのでしょうか?分散トレースはなぜ必要なのでしょうか?なぜメトリックとログを使用できないのでしょうか?以下に示すようなマイクロサービス アーキテクチャがあると仮定します。 ここで、クライアントからのリクエストを想像してください。 上記のアーキテクチャ図から、リクエストが数十または数百のネットワーク呼び出しを経由する可能性があることがわかります。これにより、リクエストがたどるパス全体を把握することが難しくなり、ログとメトリックしかない場合はトラブルシューティングが非常に複雑になります。 アプリケーションに問題が発生した場合、多くの問題を解決する必要があります。
トレースはユーザーがアプリケーションと対話した瞬間から開始され、最後のレイヤーまでのリクエスト全体を確認できるはずです。 トレース データ (スパンの形式) は、リクエストの遅延やエラーがどのように発生したか、また、それらがリクエスト全体にどのような影響を与えたかを理解するのに役立つ情報 (メタデータ) を生成します。 分散トレースについて詳しく知りたい場合は、「分散トレースの初心者向けガイド」を読んで、マイクロサービス アーキテクチャを監視する方法を学んでください。 追跡を実現するにはどうすればいいですか?追跡を実現するには、次のことを行う必要があります。
この目的のために、OpenTelemetry と Jaeger という 2 つのオープン ソース プロジェクトを使用できます。 OpenTelemetry とは何ですか?OpenTelemetry を使用して、アプリケーションからデータを収集できます。これは、アプリケーションのパフォーマンスと動作を分析するために、テレメトリ データ (メトリック、ログ、トレース) をインストルメント化、生成、収集、エクスポートするために使用できるツール、API、SDK のセットです。 OpenTelemetry とは:
OpenTelemetry には、トレース、メトリック、ログという可観測性の 3 つの柱が含まれます。 (この記事では追跡に焦点を当てます)
OpenTelemetryはベンダー中立ですOpenTelemetry は、トレースの生成を標準化することを目的として、ベンダー中立の観測可能性標準を提供します。 OpenTelemetry を使用すると、検出ポイントをバックエンドから分離できます。つまり、私たちはいかなるツール(またはベンダー)にも依存しません。 任意のプログラミング言語を使用できるだけでなく、互換性のあるストレージ バックエンドも選択できるため、特定の商用ベンダーに縛られることがなくなります。 開発者は、データがどこに保存されるかを知らなくても、アプリケーションをインストルメント化できます。 OpenTelemetry は、トレース データを作成するためのツールを提供します。このデータを取得するには、まずデータを収集するようにアプリケーションをインストルメント化する必要があります。これを行うには、OpenTelemetry SDK を使用する必要があります。 検出(埋設点)アプリケーションの計測データは、自動または手動 (あるいはハイブリッド) のいずれかの方法で生成できます。 OpenTelemetry を使用してアプリケーションをインストルメント化するには、OpenTelemetry リポジトリに移動し、アプリケーションの言語を選択して、指示に従います。 自動検出自動検出の使用はシンプルで簡単で、多くのコード変更を必要としないため、良いアプローチです。 このアプローチは、アプリケーションに合わせてトラッキング コードを作成するための必要な知識 (または時間) がない場合に適しています。 自動検出を使用すると、事前定義されたスパンのセットが作成され、関連するプロパティが入力されます。 手動検出手動インストルメンテーションでは、アプリケーションに固有のインストルメンテーション コードを記述する必要があります。これは、アプリケーションに監視コードを追加するプロセスです。プロパティとイベントを自分で追加できるため、ニーズに応じてこの方法の方が効率的である可能性があります。この方法の欠点は、ライブラリをインポートして、すべての作業を自分で行う必要があることです。 スプレッダーW3C tracecontext、baggage、b3 などのプロパゲータを構成に追加できます。
サンプリングサンプリングは、収集されてバックエンドに送信されるトレース サンプルの数を減らすことで、OpenTelemetry によって導入されるノイズとオーバーヘッドを制御するメカニズムです。 OpenTelemetry は、送信されるトレース/トラフィックの数に基づいてサンプリングを実行するように指示できます。 (たとえば、追跡データの 10% のみをサンプリングする)。 一般的なサンプリング手法には、ヘッド サンプリングとテール サンプリングの 2 つがあります。 オープンテレメトリプロトコル (OTLP)OpenTelemetry Protocol (OTLP) 仕様は、テレメトリ ソース、コレクター、およびテレメトリ バックエンド間のテレメトリ データのエンコード、転送、および配信メカニズムを記述します。 各言語 SDK には、OTLP を介してデータをエクスポートするように構成できる OTLP エクスポーターが用意されています。 OpenTelemetry SDK はイベントを OTLP データに変換します。 OTLP は、エージェント (エクスポーターとして構成) とコレクター (レシーバーとして構成) 間の通信です。 OpenTelemetry コレクターアプリケーション テレメトリ データは OpenTelemetry Collectors に送信できます。 コレクターは、テレメトリ データ (スパン、メトリック、ログなど) を受信し、処理 (データの前処理) し、データをエクスポート (目的の通信バックエンドに送信) する OpenTelemetry のコンポーネントです。 受信機レシーバーは、プッシュまたはプルによってデータがコレクターに入る方法です。 OpenTelemetry コレクターは、さまざまな形式でテレメトリ データを受信できます。 以下は、ポート 4317 (gRPC) および 4318 (http) で OTLP データを受け入れる受信機の構成例です。 次の例でも、テレメトリ データを Jaeger Thrift HTTP プロトコルの形式で受信します。 プロセッサデータが受信されると、コレクターはデータを処理できます。プロセッサは、取り込みとエクスポートの間でデータを処理します。プロセッサはオプションですが、いくつかは推奨されます。 たとえば、バッチ プロセッサが強く推奨されます。バッチ プロセッサは、スパン、メトリック、またはログを取得してバッチに格納します。バッチ処理により、データの圧縮率が向上し、データの転送に必要な送信接続の数を減らすことができます。このプロセッサは、サイズベースと時間ベースの両方のバッチ処理をサポートします。 プロセッサを構成しても有効にならないことに注意してください。サービス セクションのパイプラインを介して有効にする必要があります。 輸出業者テレメトリ データを視覚化して分析するには、エクスポーターも使用する必要があります。エクスポータは OpenTelemetry のコンポーネントであり、データをさまざまなシステム/バックエンドに送信する方法です。 たとえば、コンソール エクスポーターは、開発やデバッグのタスクに非常に役立つ一般的なエクスポーターです。データをコンソールに出力します。 エクスポーターセクションでは、さらに送信先を追加できます。たとえば、トレース データを Grafana Tempo に送信する場合は、次の構成を追加するだけです。 もちろん、有効にするには、サービス部分のパイプラインでも有効にする必要があります。 OpenTelemetry にはさまざまなエクスポーターが付属しており、OpenTelemetry Collectors Contrib リポジトリで見つけることができます。 拡張機能この拡張機能は、テレメトリ データの処理を伴わないタスクに主に適しています。拡張機能の例には、ヘルスモニタリング、サービス検出、データ転送などがあります。拡張機能はオプションです。 拡張機能は主に、テレメトリ データの処理を伴わないタスクを対象としています。たとえば、ヘルスモニタリング、サービス検出、データ転送などです。拡張機能はオプションです。 OpenTelemetry Collector の展開モード/戦略OpenTelemetry コレクターはさまざまな方法で展開できるため、展開方法を検討する必要があります。どの戦略を選択するかは、チームと組織によって異なります。 エージェントモードこの場合、OpenTelemetry によって計測されたアプリケーションは、アプリケーションに常駐する (コレクター) エージェントにデータを送信します。その後、エージェントがアプリケーションからのすべてのトレース データを引き継いで処理します。 コレクターはサイドカーを介してプロキシとしてデプロイでき、データをストレージ バックエンドに直接送信するように構成できます。 ゲートウェイモードまた、データを別の OpenTelemetry コレクターに送信し、そこからさらにデータをストレージ バックエンドに送信することもできます。この構成では、自動スケーリングなどの多くの利点があるデプロイメント モードを使用してデプロイされる中央の OpenTelemetry コレクターがあります。 中央コレクターを使用する利点は次のとおりです。
展開モードの概要以下に、一般的な展開戦略をいくつかまとめます。 基本 - クライアントは計測に OTLP を使用し、データを一連のコレクターに送信します。 データは複数のエクスポーターに送信できます。 Kubernetes に OpenTelemetry Collector をデプロイするときに使用できるモード。 サイドカーモード: エージェントはサイドカーとして機能し、OpenTelemetry Collector を使用してコンテナーがワークロード ポッドに追加されます。次に、インスタンスは、別の名前空間またはクラスターにある可能性のある外部コレクターにデータを送信するように構成されます。 デーモンセットモード: エージェントは DaemonSet として使用されるため、Kubernetes ノードごとにエージェント ポッドが存在します。 負荷分散 - トレース ID に基づく負荷分散: マルチクラスタ - エージェント、ワークロード、コントロール プレーン コレクター: マルチテナントモード2 人のテナント、それぞれ独自のイェーガーを所有。 信号モード2 つのコレクター (テレメトリ データの種類ごとに 1 つ)。 OpenTelemetry バックエンドOpenTelemetry コレクターは独自のバックエンドを提供しないため、任意のベンダーまたはオープンソース製品を使用できます。
テレメトリ データを視覚化して分析するには、OpenTelemetry コレクターでエクスポーターを構成するだけです。 たとえば、Jaeger はデータの分析とクエリを行うための非常に人気のあるオープンソース製品です。 OpenTelemetry コレクターで Jaeger エクスポーターを設定して、データを Jaeger に送信できます。 Kubernetes 上の OpenTelemetryKubernetes で OpenTelemetry を使用するには、主に OpenTelemetry コレクターをデプロイする必要があります。 OpenTelemetry コレクターを簡単にデプロイおよび管理し、アプリケーションを自動的にインストルメント化できるため、デプロイには OpenTelemetry Operator を使用することをお勧めします。 展開するここでは、Helm Chart を使用して OpenTelemetry Operator をデプロイします。まず、Helm Chart リポジトリを追加します。 デフォルトでは、OpenTelemetry Operator が正しく構成されていることを確認するために、アドミッション コントローラーがデプロイされます。 APIServer が Webhook コンポーネントと通信するには、Webhook に APIServer によって信頼されるように設定された TLS 証明書が必要です。 簡単にするために、ここでは署名証明書を自動的に生成する方法を使用します。次のコマンドを使用して、OpenTelemetry Operator をワンクリックでインストールします。 通常のデプロイが完了すると、対応する Pod が正常に実行されていることがわかります。 さらに、OpenTelemetry 関連の CRD が 2 つ自動的に追加されます。 この時点で、OpenTelemetry Operator がデプロイされます。 次に、ここで中央の OpenTelemetry コレクターを使用し、他の OpenTelemetry エージェントがそのコレクターにデータを送信できるようにします。エージェントから受信したデータは、このコレクターで処理され、エクスポーターを介してストレージ バックエンドに送信されます。ワークフロー全体を次の図に示します。 以下に示すように、OpenTelemetryCollector インスタンス オブジェクトを作成します。 ここで、OpenTelemetry Collector は grpc プロトコルと http プロトコルの両方を通じてテレメトリ データを受信し、ログ エクスポートと Grafana Tempo を通じてこれらのスパンを記録します。Grafana Tempo は、スパンを受信する OpenTelemetry Collector インスタンスのコンソールと Grafana Tempo バックエンドにスパンを書き込みます。 次に、Sidecar パターンを使用して OpenTelemetry エージェントをデプロイします。エージェントは、アプリケーションからのトレースを中央 (ゲートウェイ) OpenTelemetry コレクターに送信します。 自動検出OpenTelemetry Operator は、OpenTelemetry 自動インストルメンテーション ライブラリを挿入して構成できます。現在、DotNet、Java、NodeJS、Python、Golang をサポートしています (手動で有効にする必要があります)。 自動インストルメンテーションを使用するには、SDK にインストルメンテーション リソースとインストルメンテーション構成を追加する必要があります。たとえば、Java アプリケーションの場合、構成は次のようになります。 Python アプリケーションの場合、構成は次のようになります。 検出を有効にするには、デプロイメント ファイルを更新し、それに注釈を追加する必要があります。このようにして、OpenTelemetry Operator にサイドカーと Java インストルメンテーションをアプリケーションに挿入するように指示します。 サンプルアプリケーションここでは、Maven または Gradle を使用して構築された Spring Boot アプリケーションである Petclinic という Java アプリケーションを使用します。アプリケーションは OpenTelemetry を使用してデータを生成します。 Java アプリケーションの場合、OpenTelemetry が提供する opentelemetry-javaagent jar パッケージをダウンロードすることで、OpenTelemetry を使用してアプリケーションを自動的に検出できます。 この jar パッケージをアプリケーションの起動コマンドに追加するだけです。次に例を示します。 Java 自動検出では、任意の Java 8+ アプリケーションに接続できる Java エージェント JAR が使用されます。多くの一般的なライブラリやフレームワークからテレメトリ データをキャプチャするためにバイトコードを動的に挿入します。これを使用すると、受信リクエスト、送信 HTTP 呼び出し、データベース呼び出しなど、アプリケーションまたはサービスの「エッジ」でテレメトリ データをキャプチャできます。上記のコマンドを実行すると、アプリケーションを変更することなく、アプリケーションをインストルメント化し、リンク データを生成できます。 特に Kubernetes 環境では、OpenTelemetry Operator を使用して OpenTelemetry 自動検出ライブラリを挿入および構成できるため、javaagent を手動で挿入する必要さえありません。 まず、Petclinic アプリケーションをデプロイします。 次に、Java アプリケーションに Instrumentation リソースを追加します。 自動検出を有効にするには、デプロイメント ファイルを更新し、それに注釈を追加する必要があります。この方法では、OpenTelemetry Operator にサイドカーと Java インストルメンテーションをアプリケーションに挿入するように指示できます。改訂 次に、アプリケーションを公開するために NodePort タイプのサービスを作成します。 上記のリソース リストを適用するだけです。 通常のデプロイが完了すると、対応する Pod が正常に実行されていることがわかります。 次に、http://<node_ip>:30941 を通じて Petclinic アプリケーションにアクセスできるようになります。 アプリケーションにアクセスすると、アプリケーションは追跡データを生成し、それを中央コレクターに送信します。 Grafana Tempo にアクセスしてトレース データを表示できます。また、中央コレクターのコンソールにアクセスしてトレース データを表示することもできます。中央コレクターでは、ログ エクスポーターと Grafana Tempo エクスポーターの 2 つのエクスポーターを設定しているため、もちろん他のエクスポーターも設定できます。 したがって、Grafana Tempo でも対応する追跡データを確認できます。 同様に、Jaeger エクスポーターを追加すると、Jaeger で対応する追跡データも表示できます。 デプロイ中に問題が発生した場合は、アプリケーションとコンテナのログを表示してトラブルシューティングを行うことができます。 要約するこの投稿では、OpenTelemetry Operator を使用して、コードを変更せずにアプリケーションでトレースを有効にする方法を説明しました。 もちろん、OpenTelemetry で Prometheus を使用してインジケーター データを収集する方法、OpenTelemetry で Loki を使用してログ データを収集する方法など、ここで取り上げていない内容も多数あります。また、いくつかのサンプリング戦略、プロパゲーター、バッチ プロセッサ、手動検出なども含まれています。 参照ドキュメント
|
<<: Kubernetes VPA (Pod Vertical Autoscaling) を 1 つの記事でマスターする
>>: クラウドネイティブアプリケーションの監視とアラートの6つのステップ
コアヒント: これは中国のウェブマスターのブログからの最適化記事です。多くの検索最適化の達人が語る最...
世界のヘルスケア市場を網羅した新しいレポートが「Research and Markets」に追加され...
私のウェブサイトは半年前からオンラインになっており、ウェブサイトの組み込みも非常に正常です。ウェブサ...
Hostdare は現在、ロサンゼルスの NVMe ハード ドライブ VPS を 30% 割引で提供...
IDC の「Worldwide Enterprise Infrastructure Quarterl...
クラウド アーキテクチャについて話すとき、通常はクラウド プラットフォーム自体のアーキテクチャではな...
vmbox は、SingleHop のフェニックスとアムステルダムのデータ センターでホストされる ...
過去1年間、誰もが無料ブログを利用して外部リンクを作成しているのを見てきました。時には、ブログ記事に...
Hosteonsは現在、米国のデータセンターにあるすべてのVPSに対して特別プロモーションを提供して...
[[267906]]概要オンライン システムでは CPU 100% 問題が発生するため、トラフィッ...
外部リンクスペシャリストを含むオンラインプロモーターの日々の使命は、プロモーション目標(特定のプロモ...
nofollow タグについて話すとき、ウェブマスターの最初の反応は、フレンドリー リンクの nof...
最近、Hostcat グループの多くの人が、vultr.com の日本データセンターの VPS が中...
AlphaRacks は数日前に RIJX の買収を発表しましたが、これは良いことだと言えます。少な...
1. Renren.comは変化を計画、陳一州はグループ購入サイトの買収を希望中国版Facebook...