Grafana Tempo を始める


分散トレース バックエンドである Grafana Tempo の基礎を学びましょう。

分散トレースは、システムのパフォーマンスに関する詳細な情報を取得する方法です。これは、アプリケーションを通過するリクエストのライフサイクルを視覚化する方法です。アプリケーションは、単一ノード上に存在するか、複数のノードに分散された複数のサービスで構成されます。

したがって、分散トレーシングを使用すると、すべてのサービスの統合ビューを取得できます。 Grafana Tempo はまさにそれです。

グラファナテンポとは何ですか?

今年の ObservabilityCon カンファレンスでは Grafana Labs からいくつかの大きなアップデートがあり、Grafana Tempo もその 1 つでした。 Grafana Labs は、オープンソース ポートフォリオにもう 1 つのプロジェクト「Grafana Tempo」を追加しました。

Grafana Tempo は、拡張性が高く使いやすいオープンソースの分散トレーシング バックエンドです。 Tempo は、Zipkin、Jaeger、OpenTelemetry、OpenCensus などの他のトレース プロトコルと完全に互換性があります。現在、Loki の Tempo データ検出エンジン、Prometheus や Grafana などのモニタリング プラットフォームをサポートしています。 Grafana 7.3 以降は、Grafana と Tempo 間のシームレスなエクスペリエンスを提供します。

テンポを使用する理由

テンポは、メトリック、トレース、ログを相関させるために使用されます。ユーザーが同じ種類のエラーを複数回受け取る状況があります。何が起こっているのかを理解したい場合は、正確な痕跡を調べる必要があります。しかし、ダウンサンプリングのせいで、探しているかもしれない貴重な情報の一部が失われてしまったでしょう。 Tempo を使用すると、分散トレース データをダウンサンプリングする必要がなくなりました。完全なトレースを S3 や GCS などのオブジェクト ストレージに保存できるため、Tempo は非常にコスト効率が高くなります。

また、Tempo を使用すると、メトリクスからいくつかの問題を記録した特定のログの関連トレースにすばやく移動できるため、デバッグやトラブルシューティングを迅速に行うことができます。

以下は、Tempo で使用される設定オプションです。

  • ディストリビューター: これらは、スパンを受信して​​インジェスターに送信するための受信オプションを構成するために使用されます。
  • Ingester : これらはトレースのバッチを作成し、保存するために TempoDB に送信するために使用されます。
  • コンパクター: S3 や GCS などのストレージからブロックをストリーミングし、結合してストレージに書き戻します。
  • ストレージ: TempoDB を構成するために使用されます。この構成では、他のパラメーターとともにストレージ バックエンド名 (S3 または GCS) を指定する必要があります。
  • Memberlist : Tempo コンポーネント間の調整に使用されます。
  • 認証/サーバー: Tempo は Weaveworks/共通サーバーを使用します。サーバー構成を設定するために使用されます。

テンポ・アーキテクチャー

テンポアーキテクチャ
テンポアーキテクチャ
テンポアーキテクチャ

上の図は、Grafana Tempo の動作アーキテクチャを示しています。

まず、ディストリビュータは、Zipkin、Jaeger、OpenTelemetry、OpenCensus からさまざまな形式でスパンを受信し、トレース ID をハッシュしてこれらのスパンをインジェスタに送信します。次に、Ingester はブロックと呼ばれるトレースのバッチを作成します。

次に、それらのブロックをバックエンド ストレージ (S3/GCS) に送信します。トラブルシューティングするトレース ID がある場合は、Grafana UI を使用して検索バーにトレース ID を入力します。現在、クエリーは、入力したトレース ID に関する詳細をインジェスターまたはオブジェクト ストレージから取得する責任を負います。

まず、そのトレース ID がインジェスターに存在するかどうかを確認します。見つからない場合は、ストレージ バックエンドをチェックします。シンプルな HTTP エンドポイントを使用してトレースを公開します。一方、コンパクターはストレージからブロックを取得して結合し、ストレージに送り返して、ストレージ内のブロックの数を減らします。

Docker を使用してテンポを設定する

このセクションでは、Docker を使用して Grafana Tempo を段階的に設定します。まず、Tempo バックエンドが必要なので、Docker ネットワークをセットアップします。

 [@ ~]$ docker network create docker-tempo

テンポ設定ファイルをダウンロードします。

 [@ ~]$ curl -o tempo.yaml https://raw.githubusercontent.com/grafana/tempo/master/example/docker-compose/etc/tempo-local.yaml

以下は、取得するプロトコル オプションのリストです。

プロトコルポート
オープンテレメトリ55680
イェーガー – スリフトコンパクト6831
イェーガー – スリフトバイナリ6832
イェーガー – スリフトHTTP 14268
イェーガー – GRPC 14250
ジップキン9411

テンポ設定ファイルを使用して、Docker コンテナを実行します。ここでは、トレースを送信するために、 Jaeger – Thrift Compact 形式 (ポート 6831) を選択しています。

 [@ ~]$ docker run -d --rm -p 6831:6831/udp --name tempo -v $(pwd)/tempo-local.yaml:/etc/tempo-local.yaml --network docker-tempo grafana/tempo:latest -config.file=/etc/tempo-local.yaml

次に、Tempo クエリ コンテナを実行する必要があります。したがって、まず、テンポクエリ設定ファイルをダウンロードします。

 [@ ~]$ curl -o tempo-query.yaml https://raw.githubusercontent.com/grafana/tempo/master/example/docker-compose/etc/tempo-query.yaml

テンポ クエリ構成ファイルを使用して、Docker コンテナを実行します。

 [@ ~]$ docker run -d --rm -p 16686:16686 -v $(pwd)/tempo-query.yaml:/etc/tempo-query.yaml --network docker-tempo grafana/tempo-query:latest --grpc-storage-plugin.configuration-file=/etc/tempo-query.yaml

これで、以下に示すように、Jaeger UI にhttp://localhost:16686でアクセスできるようになります。

イェーガー UI – オタクフレア
イェーガー UI - オタクフレア
イェーガー UI – オタクフレア

検索バーに、トラブルシューティングするログのトレース ID を追加すると、トレースが生成されます。

トレースID – 新しい
トレースID - 新しい
トレースID – 新しい

Tempo でのデモ アプリケーションの実行

Grafana Tempo が提供するデモの例を実行してみます。 docker-compose のサンプルを実行するので、同じことを試みる場合は、マシンに docker-compose がインストールされている必要があります。

Grafana Tempo zip ファイルをダウンロードします: https://github.com/grafana/tempo

これをホーム フォルダーに解凍し、docker-compose ディレクトリに移動します。 docker-compose の例が複数見つかります。アプリケーションのデータがローカルに保存される例を使用しています。

 [@ ~]$ cd tempo-master/example/docker-compose/
[@ docker-compose]$ ls
docker-compose.loki.yaml docker-compose.s3.minio.yaml docker-compose.yaml etc
example-data readme.md tempo-link.png

以下のコマンドを実行してスタックを開始します。

 [@ docker-compose]$ docker-compose up -d
Starting docker-compose_prometheus_1 ... done
Starting docker-compose_tempo_1 ... done
Starting docker-compose_grafana_1 ... done
Starting docker-compose_tempo-query_1 ... done
Starting docker-compose_synthetic-load-generator_1 ... done

ご覧のとおり、Grafana、Loki、Tempo、Tempo-query、および Prometheus のコンテナーが開始されました。

 [@ docker-compose]$ docker ps
CONTAINER ID   IMAGE                                      COMMAND                  CREATED          STATUS         PORTS                                                                                                      NAMES
84cd557ce07b   grafana/tempo-query:latest                 "/go/bin/query-linux…"   10 minutes ago   Up 4 seconds   0.0.0.0:16686->16686/tcp                                                                                   docker-compose_tempo-query_1
f7cd9cf460d9   omnition/synthetic-load-generator:1.0.25   "./start.sh"             10 minutes ago   Up 4 seconds                                                                                                              docker-compose_synthetic-load-generator_1
6d9d9fbdb8f1   grafana/grafana:7.3.0-beta1                "/run.sh"                10 minutes ago   Up 6 seconds   0.0.0.0:3000->3000/tcp                                                                                     docker-compose_grafana_1
d8574ea25028   grafana/tempo:latest                       "/tempo -config.file…"   10 minutes ago   Up 6 seconds   0.0.0.0:49173->3100/tcp, 0.0.0.0:49172->14268/tcp                                                          docker-compose_tempo_1
5f9e53b5a09c   prom/prometheus:latest                     "/bin/prometheus --c…"   10 minutes ago   Up 6 seconds   0.0.0.0:9090->9090/tcp                                                                                     docker-compose_prometheus_1

ブラウザに移動して、Grafana、Jaeger UI、Prometheus が実行されているかどうかを確認することもできます。

グラファナ
グラファナ
グラファナ

プロメテウス
プロメテウス
プロメテウス

現在、コンテナ内で実行されている合成ロードジェネレータは、テンポ内に配置されているトレース ID を生成しています。以下のコマンドを実行すると、ログを表示できます。

 [@ docker-compose]$ docker-compose logs -f synthetic-load-generator
Attaching to docker-compose_synthetic-load-generator_1
synthetic-load-generator_1 
| using params: 
--jaegerCollectorUrl http://tempo:14268
synthetic-load-generator_1 
| 21/04/17 14:24:34 INFO ScheduledTraceGenerator: Starting trace generation for service frontend, route /product, 2880 traces/hr
synthetic-load-generator_1 
| 21/04/17 14:24:34 INFO ScheduledTraceGenerator: Starting trace generation for service frontend, route /cart, 14400 traces/hr
synthetic-load-generator_1 
| 21/04/17 14:24:34 INFO ScheduledTraceGenerator: Starting trace generation for service frontend, route /checkout, 480 traces/hr
synthetic-load-generator_1 
| 21/04/17 14:24:37 INFO ScheduledTraceGenerator: Emitted traceId 17867942c5e161f2 for service frontend route /currency
synthetic-load-generator_1 
| 21/04/17 14:24:37 INFO ScheduledTraceGenerator: Emitted traceId 3d9cc23c8129439f for service frontend route /shipping
synthetic-load-generator_1 

これらは、トレースを生成するために渡す必要があるトレース ID です。

新しい痕跡
新しい痕跡
新しい痕跡

トレース ID の 1 つをコピーし、Jaeger UI の検索バーに入れています。

トレーシッド
トレーシッド
トレーシッド

指定したトレース ID に関連するトレースが正常に生成されたことがわかります。

結論

以上、Grafana Tempo についてでした。先に進み、Tempo を使用してトレースを生成し、ログ内のメトリクスと問題を詳細に理解してください。

すべてがテンポでキャプチャされ、以前はダウンサンプリングが行われていたため、細部を見逃すことはありません。 Tempo を使用すると、開発者や運用チームはログで発生する可能性のあるエラーや警告の根本原因を簡単に理解できます。

「 Grafana Tempo を始める」についてわかりやすく解説!絶対に観るべきベスト2動画

Sending generated traces to Grafana Tempo
Beyond tracing with Grafana Tempo What do we do with all this data