コンテンツにスキップ

分散トレーシングの概要

プログラム ログは、コード実行プロセスのパンくずリストです。これらのパンくずリストを検索すると、コードに隠されたバグが見つかるだけではありません: fontawesome-solid-bug: さらに重要なのは、継続的なプログラム ログ追跡により、監視可能なプログラム実行プロセスを構築する方法が提供されることです。

ログから始める

存在するのはログ ファイルだけです

追跡システムが登場する前は、システムの稼働状況を取得する唯一の方法はローカル ログを介することでした。実際、追跡システムが導入される前は、ログ サービスはさまざまな種類の製品について数世代の反復を経ていました。

標準出力と標準エラー出力をローカル ファイルに配置し、魔法のオペレーティング システムの力を利用することで、理想的には無限のプログラム実行ログを取得できます。システムがクラッシュせず、単一点エラーがなく、ファイル書き込みフローを中断するプロセスがない限り、いつでもプロセス実行ファイルのコピーを取得して、非常に大きなファイル内で関心のあるイベントを検索できます。

トレーシング登場以前

ログサーバー

プログラムにとってプログラム ログの重要性により、独立したログ サーバーが誕生しました。はい、SPoF について心配する必要はありません。ログ サーバーは固定ポートで待機し、プロセスによって送信されるプログラム ログを継続的に記録します。

ログ サーバーの初期段階では、操作インターフェイスが端末からブラウザに変わり、取得できるログが単一のプログラムから複数のプログラムに変わったことを除けば、ファイル サーバーに似た働きをしていました。しかし、記録されるログは、プロセスの実行順序の記録が山積みされた同じログです。以下は、ログイン サーバー上のログをシミュレートします。

classDiagram
  class LoginAPI {
    name: login server
    host: localhost
    port: 8080
    dscp: print some descriptive information
    ...
    1978-03-12 xx:xx:xx file:api.js line:232 call checkToken()
    1978-03-12 xx:xx:xx file:api.js line:178 call parseParameters()
    1978-03-12 xx:xx:xx file:api.js line:348 call validate()
    1978-03-12 xx:xx:xx file:api.js line:456 call callRedis()
    1978-03-12 xx:xx:xx file:api.js line:79 call callMysql()
    1978-03-12 xx:xx:xx file:api.js line:914 call writeBack()
  }

ログテキストには孤立したプログラムイベントのみが表示され、実行ドキュメントからプログラムの実行状況を把握することは困難です。ファイル サーバーの後段では、ログの表示と一連のプログラム実行環境ステータス パラメーターに特化した UI が登場しました。この段階のログ サービスは、ログ ファイルに基づくデータベース サービスに似ています。はい、気になるプログラムイベントをよりスムーズに検索することができます。

トレーシングシステム

オブザーバビリティの台頭

プログラム トレース システムは、より高度なログ サービスではありません。これはロギング カテゴリにも属しませんが、本物のパンくずリストです。トレース システムは、プロセスの実行中に実行ステータス データ構造 (Span) を生成します。処理フローが段階的に進むにつれて、多数のスパンが実行順序に従って接続され、現在のプロセスのトレース (Tracing) が形成されます。複数のプロセスが呼び出し順序に従って接続され、現在のシステムの観察可能な実行ステータスが形成されます。

架空のログイン サービスを例に挙げてみましょう。

graph LR
  A(UserInterface) -->|input| B{LoginAPI};
  B -->|check token| C{RedisServer};
  B -->|update database probably| D{MysqlServer};

上の図は、マルチプロセスの下で追跡システムによって生成されたトレース図のみを示しています。実際、追跡システムでは、各実行プロセスのステータスをログのように確認することもできます。必要に応じて、レポートされたステータス データ構造 (Span) の各フィールドをカスタマイズし、意味を与えることができます。トレース システムはデバッグには使用されません。もちろん、トレースシステムではバグは逃れられません。トレース システムは、システムの実行ステータスを詳細に記述することでシステムの問題を発見し、それによってバージョンの反復を促進し、システムを継続的に改善するための正のフィードバック メカニズムを提供します。

追跡システムは主に 2 つのレベルの問題を解決します

  • ステータスデータの収集方法

監視対象システムが依存するテクノロジー スタックに基づいて、市場で一般的な 追跡システムソリューション は、完全自動データ収集方法と手動データ収集方法を提供します。システム トレースは、NodeJS、JAVA、C# などのプログラムのランタイムを監視することによって完了します。このタイプのテクノロジ スタックに基づくすべてのシステム実装は、完全に自動化されたシステム トレースを実行できます。同時に、トレース システムはすべてのテクノロジ スタックにトレース ライブラリを提供し、プロジェクトに依存関係を導入し、簡単なコード編集を実行することで、完全に手動でシステム トレースを実行できるようになります。

  • 状態データを整理する方法

プログラム実行中の自然な呼び出しと呼び出しの関係により、市場のすべての追跡システムが状態データ構造定義を親子関係で接続できるようになります。 ParentID と ID を使用して、呼び出し元と呼び出し先によって生成されたスパンを関連付けます。同じプロセス内の異なる呼び出しプロセス (同時環境内のスレッドを含む) は、呼び出し元 ID を含むコンテキストを渡すことによって、親プロセスと子プロセスを接続します。異なるプロセス間では、呼び出し元は、異なるプロセス間で (プロセス間で通信できるネットワークやパイプなどを介して) 独自の ID を含むコンテキストを送信することで、親プロセスを子プロセスに関連付けます。

トレーシングシステムのソリューション

プログラムパフォーマンスモニタリング(APM)市場において、プログラムを追跡する機能は不可欠であると言えます。ここでは、市場にあるいくつかの一般的なソリューションを簡単に紹介します。

DataDog

: 現在最も完全な APM ソリューション プロバイダーであり、運用環境のプログラムの監視と詳細な視覚化機能を提供します。ネットワーク サービス、メッセージ キュー、データベースのすべてのプログラム イベントを監視するための、すぐに使用できるパフォーマンス監視ダッシュボードを提供します。トレース トレース データは、サービスおよびコンテナ全体で、セッション、ログ、システム プロファイル、包括的な検出、ネットワーク、プロセス、および基本的なシステム メトリクス セットとシームレスに関連付けることができます。 DataDog では、システムのボトルネックによって引き起こされる低速トレースを調査するときに、問題の原因となっているコードを直接見つけることができます。

Jaeger

:Jaeger は、Dapper と OpenZipkin からインスピレーションを受け、Uber Technologies によってリリースされたオープンソースの分散プログラム トレース システムです。特にマイクロサービス アーキテクチャに基づいたシステムの監視に適しており、次の機能を提供します。 : - 分散コンテキストの伝播 : - 分散トランザクション監視 : - 根本原因を追跡する分析能力 : - サービスの依存関係の分析 : - パフォーマンスの最適化 : Jaeger に興味がある場合は、Uber 技術チームの 社内慣行 を参照してください。

OpenTelemetry

: OpenTelemetry (OTel) は、トレース、メトリクス、ログなどのテレメトリ データを生成、収集、エクスポートするための API、SDK、仕様、およびツールを提供するベンダー中立の可観測性フレームワークです。 OpenTelemetry 自体は可観測性バックエンドではないため、収集されたデータは処理と保存のために DataKit などの受信側に送信される必要があります。

SkyWalking

: SkyWalking は、分散クラウド システムの監視、トレース、診断、その他の機能を提供するオープンソース APM システムです。コア機能は次のとおりです。 : - サーバー側メトリクスセット分析 : - 根本原因を追跡する分析能力 : - サービストポロジ分析 : - サービスの依存関係の分析 : - サービス検出が遅い : - パフォーマンスの最適化 :- キャッシュの監視、読み取りおよび書き込みのパフォーマンス、低速アクセスの検出 : - データベース監視、クエリ検出が遅い : - メッセージキューのパフォーマンス監視 : - ブラウザのパフォーマンステスト、ルート追跡機能 : - インフラストラクチャ監視は、主流のクラウドプロバイダーをサポートします。 : - システムアラーム

Zipkin

: Zipkin は、システム監視を完了し、サービス レベルのシステム問題を発見するために連続データを収集するために使用される分散トレース システムです。 Zipkin は、データ収集とデータ クエリを含む統合ソリューションを提供します。 TraceID に基づいて Zipkin の UI でログからトレースに直接ジャンプでき、さまざまなデータに基づいた検索機能を提供します。

DataKit

: DataKit が提供するソリューションは、上記の追跡システムとは異なり、プログラムの実行状況データ (Span) を生成したり、データの構成形式を変更したりすることはありません。 DataKit はネットワーク ポートをリッスンして、主要な追跡システムから送信されたトレース データを受信します。 DataKit の追跡モジュールは、すぐに使える機能を提供するだけでなく、構成をほとんど必要としません。ユーザーは他の追跡システムから DataKit にスムーズに移行できます。

: DataKit は連携データ処理・分析ネットワークサービスです。 DataKitはネットワークアプリケーションとして以下のような特徴を持っています。

: - DataKit は高負荷のトラフィック データを継続的に処理できます。 DataKit 内で使用されるマルチチャネル ローカル キャッシュ テクノロジは、実際にフラッディング レベルのトレース データに直面しても、低い CPU 負荷で良好な動作を維持できます。 : - DataKit は、同時性の高いネットワーク リクエスト環境でも動作し続けることができます。 DataKit は内部でアクセス ポリシーとスレッド プールを使用して、高度な同時ネットワーク要求に対処し、CPU 負荷を低い範囲に制御します。 : - DataKit は、市場のさまざまな主流の追跡システムに摩擦なく接続でき、現在も拡張されています。

:DataKitは分析・計算ツールとして以下のような特徴を持っています。

: - 柔軟性と構成可能性が高く、DataKit のトレース データ機能を構成なしで使用できます。また、サンプリング、まれなトレースの選択、リソースのクローズなど、DataKit が提供するさまざまなトレース コンピューティング機能を簡単な構成でカスタマイズすることもできます。 : - 効率的で分散された一貫したサンプリング アルゴリズム。 : - データ処理のフロントエンドにあるさまざまなデータ処理フィルターは、日々のデータ処理ニーズを満たします。 : - データ処理バックエンド Pipeline サポート。Guance が提供する強力なPipeline スクリプト を使用して、センターに送信される前にデータをカスタマイズできます。

まとめ

トレースシステムは、システムの実行状況を多次元かつ詳細に可視化する機能を提供し、システムの保守開発の形を変えるだけでなく、開発コストと運用コストを大幅に削減します。また、システムのボトルネックを発見し、その後のシステム バージョンの反復のための貴重な手がかりを提供するためのさまざまな分析ツールも提供します。

フィードバック

このページは役に立ちましたか?