コンテンツにスキップ

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 のようなログシステムです。

アーキテクチャ

1653382087(1).png

実行フロー

  1. OTEL 収集は Springboot アプリケーションの Trace データを出力し、対応するログにタグ(Traceid、Spanid)を付けます。
  2. Tempo は OTEL データを収集・処理し、ローカルに保存します。Tempo Query は Tempo の検索バックエンドサービスです。
  3. Loki は Springboot アプリケーションのログデータを収集します。
  4. 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

image.png

6. トレース情報とログ情報の生成

curl http://localhost:8080/gateway

観測

Grafana でアプリケーションのフィルタ条件を入力すると、対応するアプリケーションのログ情報を確認できます。ログレベルが Error の場合、Grafana は赤色で表示するため、一目でわかります。

image.png

ログレコードをクリックすると、ログに関連するタグを確認できます。ログに traceid が存在する場合、Grafana は自動的に Tempo と連携し、Tempo ボタンをクリックすると、現在のログの Trace に該当するトレース詳細にジャンプします。この方法により、問題を迅速に特定できます。

image.png

Tempo ビューに切り替えると、traceId を使用してトレースの詳細を確認できます。

image.png

補足

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 プラットフォームで使用する方法について紹介し、デモを行います。

フィードバック

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