OpenTelemetry to Grafana¶
前の記事 では、OpenTelemetry をベースとした従来のオープンソースコンポーネントによるオブザーバビリティについて紹介し、デモを行いました。近年のオブザーバビリティの普及に伴い、Grafana もオブザーバビリティ分野に参入しています。
概念¶
OTEL
OTEL は OpenTelemetry の略称であり、CNCF のオブザーバビリティプロジェクトです。オブザーバビリティ分野における標準化ソリューションを提供し、観測データのデータモデル、収集、処理、エクスポートなどの標準化を実現します。また、ベンダーに依存しないサービスを提供することを目的としています。
OpenTelemetry は、Trace、Metrics、Logs などの観測データ(将来的に新しい種類の観測データが登場する可能性があります)を管理するための標準とツールのセットです。現在では業界標準となっています。
Tempo
Grafana Tempo は、オープンソースで使いやすく、大規模な分散型トレーシングバックエンドです。Tempo はコスト効率が高く、オブジェクトストレージのみで動作し、Grafana、Prometheus、Loki と深く統合されています。Tempo は、Jaeger、Zipkin、OpenTelemetry を含むあらゆるオープンソースのトレーシングプロトコルと連携できます。
Tempo プロジェクトは 2020 年に Grafana Labs で開始され、10 月の Grafana ObservabilityCON で発表されました。Tempo は AGPLv3 ライセンスの下でリリースされています。
Loki
Loki は Grafana Labs チームの最新のオープンソースプロジェクトであり、水平スケーラブルで高可用性、マルチテナントのログ集約システムです。ログの内容にインデックスを作成するのではなく、各ログストリームに一連のラベルを設定するため、設計は非常に経済的で効率的であり、運用も容易です。このプロジェクトは Prometheus に着想を得ており、公式の説明は「Like Prometheus, but for logs.」です。つまり、Prometheus のようなログシステムです。
アーキテクチャ¶
実行フロー
- OTEL 収集は Springboot アプリケーションの Trace データを出力し、対応するログにタグ(Traceid、Spanid)を付けます。
- Tempo は OTEL データを収集・処理し、ローカルに保存します。Tempo Query は Tempo の検索バックエンドサービスです。
- Loki は Springboot アプリケーションのログデータを収集します。
- Grafana Dashboard は、Tempo の Trace データとログデータの表示と確認に使用されます。
インストールと設定¶
1. docker-compose.yaml の設定¶
version: '3.3'
services:
server:
image: registry.cn-shenzhen.aliyuncs.com/lr_715377484/springboot-server:latest
container_name: springboot_server
ports:
- 8080:8080
environment:
- OTEL_EXPORTER=otlp_span,prometheus
- OTEL_EXPORTER_OTLP_ENDPOINT=http://tempo:55680
- OTEL_EXPORTER_OTLP_INSECURE=true
- OTEL_RESOURCE_ATTRIBUTES=service.name=springboot-server
- JAVA_OPTS=-javaagent:/opentelemetry-javaagent.jar
logging:
driver: loki
options:
loki-url: 'http://localhost:3100/api/prom/push'
loki:
image: grafana/loki:2.2.0
container_name: loki
command: -config.file=/etc/loki/local-config.yaml
ports:
- "3100:3100"
logging:
driver: loki
options:
loki-url: 'http://localhost:3100/api/prom/push'
tempo:
image: grafana/tempo:0.6.0
container_name: tempo
command: ["--target=all", "--storage.trace.backend=local", "--storage.trace.local.path=/var/tempo", "--auth.enabled=false"]
ports:
- 8081:80
- 55680:55680
tempo-query:
image: grafana/tempo-query:0.6.0
container_name: tempo-query
#command: ["--grpc-storage-plugin.configuration-file=/etc/tempo-query.yaml"]
environment:
- BACKEND=tempo:80
volumes:
- ./etc/tempo-query.yaml:/etc/tempo-query.yaml
ports:
- "16686:16686" # jaeger-ui
depends_on:
- tempo
logging:
driver: loki
options:
loki-url: 'http://localhost:3100/api/prom/push'
grafana:
image: grafana/grafana:7.3.7
container_name: grafana
volumes:
- ./config/grafana:/etc/grafana/provisioning/datasources
environment:
- GF_AUTH_ANONYMOUS_ENABLED=true
- GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
- GF_AUTH_DISABLE_LOGIN_FORM=true
ports:
- "3000:3000"
logging:
driver: loki
options:
loki-url: 'http://localhost:3100/api/prom/push'
2. Grafana の設定¶
プログラムをデプロイした後、Grafana でデータソースを設定できます。新しいバージョンの Grafana では、YAML 形式でデータソースを事前に設定できるようになっています。
apiVersion: 1
deleteDatasources:
- name: Prometheus
- name: Tempo
datasources:
- name: Tempo
type: tempo
access: proxy
orgId: 1
url: http://tempo-query:16686
basicAuth: false
isDefault: false
version: 1
editable: false
apiVersion: 1
uid: tempo
- name: Loki
type: loki
access: proxy
orgId: 1
url: http://loki:3100
basicAuth: false
isDefault: false
version: 1
editable: false
apiVersion: 1
jsonData:
derivedFields:
- datasourceUid: tempo
matcherRegex: (?:traceID|trace_id)=(\w+)
name: TraceID
url: $${__value.raw}
Loki はログのパースによって、マッチした traceid に URL を設定します。これにより、ログから直接関連するトレース情報を参照できるようになり、ログとトレースの連携が実現します。
3. Docker による Loki プラグインのインストール¶
docker plugin install grafana/loki-docker-driver:latest --alias loki --grant-all-permissions
4. 起動¶
docker-compose up -d
5. 起動状況の確認¶
docker-compose ps
6. トレース情報とログ情報の生成¶
curl http://localhost:8080/gateway
観測¶
Grafana でアプリケーションのフィルタ条件を入力すると、対応するアプリケーションのログ情報を確認できます。ログレベルが Error の場合、Grafana は赤色で表示するため、一目でわかります。
ログレコードをクリックすると、ログに関連するタグを確認できます。ログに traceid が存在する場合、Grafana は自動的に Tempo と連携し、Tempo ボタンをクリックすると、現在のログの Trace に該当するトレース詳細にジャンプします。この方法により、問題を迅速に特定できます。
Tempo ビューに切り替えると、traceId を使用してトレースの詳細を確認できます。
補足¶
Tempo はトレースの保存と検索を行うバックエンドサービスです。Tempo は同時に他のトレーシングプロトコル(Jaeger、Zipkin、OTLP)とも連携できます。Tempo はトレースコレクターではなく、中継局として機能します。トレースは Jaeger、Zipkin などの他のプロトコルを使用して Tempo にデータを集約します。
Tempo は Grafana Labs の新しいインキュベーションプロダクトであり、まだ成熟していません。Tempo を使用する際に発生する問題については、Grafana チームのコミュニティサポートに大きく依存する必要があり、コミュニケーションコストが増加します。
Loki は新しいタイプのログストレージツールとして、独自の長所と短所があります。
長所
- Loki のアーキテクチャは非常にシンプルで、Prometheus と同じラベルをインデックスとして使用します。これらのラベルを使用してログの内容をクエリできるだけでなく、モニタリングデータもクエリできます。これにより、2 つのクエリの切り替えコストを削減できるだけでなく、ログインデックスのストレージも大幅に削減されます。
- ELK と比較して、消費コストが低く、コスト効率に優れています。
- ログの収集と可視化において、Grafana と連携することで、ログのフィルタリングや前後の行の表示が可能になります。
短所:
- 技術が比較的新しく、関連フォーラムの活動はあまり活発ではありません。
- 機能が限定的で、ログの表示やフィルタリングには優れていますが、データの処理やクリーニングは ELK ほど強力ではありません。また、ELK と比較して、後工程で ELK はさまざまな技術と連携してログのビッグデータ処理が可能ですが、Loki は不可能です。
本記事のデモソースコード https://github.com/lrwh/observable-demo/blob/main/opentelemetry-to-grafana
次の記事 では、OpenTelemetry を Guance プラットフォームで使用する方法について紹介し、デモを行います。




