DUICUO

Grafana Tempo を使用した分散トレース

[[389241]]

Grafana Tempo は、新しいオープンソースの大容量分散トレース バックエンドです。

Grafanaの最新製品であるTempoは、Grafana Labsが開発したシンプルで使いやすく、大規模な分散トレースバックエンドです。TempoはGrafana、Prometheus、Lokiと統合されており、操作にはオブジェクトストレージのみを必要とするため、コスト効率が高く、使いやすいです。

私は当初からこのオープンソース プロジェクトに関わってきたので、Tempo の基本について説明し、クラウド ネイティブ コミュニティが Tempo に注目している理由を説明します。

分散トレース

アプリケーションリクエストに関するテレメトリデータの収集は一般的です。しかし、現代のサーバーでは、単一のアプリケーションが複数のマイクロサービスに分割され、複数の異なるノードで実行されることがよくあります。

分散トレーシングは、個別のサービスで構成される可能性のあるアプリケーションについて、きめ細かなパフォーマンス情報を取得する方法です。アプリケーションに到達したリクエストのライフサイクルを統合的に把握できます。Tempoの分散トレーシングは、モノリシックアプリケーションにもマイクロサービスアプリケーションにも使用でき、リクエストスコープの情報を提供するため、可観測性の3つ目の柱となります(他の2つはメトリクスとログです)。

次は、分散トレースシステムを使ってアプリケーションのガントチャートを生成する例です。Jaeger HotRODのデモアプリケーションを使用してトレースを生成し、GrafanaクラウドでホストされているTempoに保存します。このチャートは、リクエスト処理時間をサービスと機能ごとに分類して表示しています。

Grafana Tempo のガント チャート

インデックスサイズを縮小する

豊富で明確に定義されたデータモデルでは、トレースには豊富な情報が含まれています。通常、トレースバックエンドとのやり取りには、メタデータセレクタ(サービス名や期間など)を使用してトレースをフィルタリングすることと、フィルタリングされたトレースを視覚化することの2種類があります。

検索機能を強化するため、ほとんどのオープンソース分散トレーシングフレームワークは、サービス名、アクション名、タグ、期間など、トレーシングデータ内の多数のフィールドをインデックス化します。その結果、インデックスが大きくなり、ElasticsearchやCassandraなどのデータベースの使用を余儀なくされます。しかし、これらのデータベースは管理が難しく、大規模な運用にはコストがかかるため、Grafana Labsの私のチームは、より優れたソリューションを提案し始めました。

Grafana では、スタンバイ デバッグ ワークフローは、メトリクス レポートの使用(アプリケーションのメトリクスの保存には Cortex を使用しています。これは Cloud Native Foundation が Prometheus を拡張するために立ち上げたプロジェクトです)から始まり、問題を詳細に調査し、問題のあるサービスからのログをフィルタリング(ログは Loki に保存します。これは Prometheus に似ていますが、Loki はログ記録用です)した後、特定のリクエストのトレースを調べます。フィルタリングに必要なインデックス情報はすべて Cortex と Loki の両方に存在することがわかりました。しかし、これらのツールを介したトレースの検出を可能にするための堅牢な統合と、トレース ID に基づくキーと値の参照のための優れたストアが必要でした。

ここからGrafana Tempoプロジェクトが始まりました。特定の取得トレーシングIDのトレーシングに重点を置くことで、Tempoは依存関係が最小限で、大容量かつ低コストの分散トレーシングバックエンドとして設計されました。

操作が簡単でコスト効率が高い

Tempo はオブジェクトストレージバックエンドを使用しており、これが唯一の依存関係です。シングルビンモードとマイクロサービスモードの両方で使用できます(簡単なセットアップ手順については、リポジトリ内のサンプルをご覧ください)。オブジェクトストレージを使用すると、サンプリングなしで大量のアプリケーショントレースを保存できます。これにより、100万回に1回発生するようなエラーやレイテンシの大きいリクエストのトレースを見逃すことはありません。

オープンソースツールとの強力な統合

Grafana 7.3にはTempoデータソースが含まれており、TempoからのトレースをGrafana UIで直接可視化できます。さらに、Loki 2.0の新しいクエリ機能により、Tempoからのトレースがさらにシンプルになります。Prometheusとの統合に向けて、チームは以下の機能を追加しています…模範この機能のサポートには、時系列データに高カーディナリティメタデータを追加する機能が含まれます。メトリックストレージバックエンドはこれらのメタデータ項目をインデックス化しませんが、Grafana UIでメトリック値を取得して表示できます。この例では様々なメタデータを保存できますが、このユースケースでは、Tempoとの緊密な統合のためにトラッキングIDを保存しています。

この例では、リクエスト遅延を含むヒストグラムの使用方法を示します。各サンプル データ ポイントは Tempo のトレースにリンクされています。

Tempoでの例の使用

メタデータの一貫性

コンテナ化されたアプリケーションとして実行されるアプリケーションから出力されるテレメトリデータには、通常、関連するメタデータが含まれています。これには、クラスタID、名前空間、ポッドIPなどが含まれます。これはオンデマンド情報を提供するのに適していますが、メタデータに含まれる情報を本番環境で使用できるとさらに便利です。例えば、Grafanaクラウドエージェントを使用して、トレース情報をTempoにインポートできます。エージェントはPrometheusサービス検出メカニズムを活用してKubernetes APIからメタデータ情報をポーリングし、アプリケーションから出力されるクロスドメインデータにこれらのタグを追加します。このメタデータはLokiでもインデックス化されているため、メタデータをLokiタグセレクターに変換することで、トレースから特定のサービスのログ表示に簡単に切り替えることができます。

以下は、Tempo トレースの特定の範囲内のログを表示するために使用できる一貫性のあるメタデータの例です。

クラウドネイティブ

Grafana Tempoはコンテナ化されており、KubernetesやMesosなどのオーケストレーションエンジン上で実行できます。サービスは、フェッチ/クエリパスに沿ったワークロードに基づいて水平方向にスケーリングできます。また、Google Cloud Storage、Amazon S3、Tempo Azure Blog Storageなどのクラウドネイティブなオブジェクトストレージも利用できます。詳細については、Tempoドキュメントのアーキテクチャセクションをご覧ください。

テンポを試す

これが私たちと同じようにあなたにとってもうまくいくなら、Tempo リポジトリのクローンを作成してみてください。