プロフィールアイコン

[OpenTelemetry 検証1] local検証環境を立てるまで

Tech

はじめに

OpenTelemetry についてさっと検証できる環境が欲しかったため、ローカルで実装してみました。

どのような構成にしたかなど整理しておきたいと思います。

なお勝手な印象ですが、OpenTelemetry を採用しているケースでは k8s でインフラを構成している場合が多い印象なのですが、ローカルの検証目的で利用する場合は少し過剰なので docker-compose で構成させています。


構成や利用したコンテナサービスについて

以下のような構成にしています。

article-server (Go)
  ↓ OTLP (4317)
Grafana Alloy
  ├→ Tempo (Traces)
  ├→ Prometheus (Metrics)
  └→ Loki (Logs)
      ↓
  Grafana (可視化)

02_architecture.png

詳細は明記しませんが、それぞれ以下のような役割を持ちます。

コンポーネント役割振る舞い
article-serverブログ記事管理 APIHTTP リクエスト処理、トレース/メトリクスを OTLP で Alloy へ送信 (4317)
Grafana Alloyテレメトリ収集/転送OTLP 受信 (4317/4318) → Tempo/Prometheus、Docker ログ収集 → Loki
Tempo分散トレースストレージスパン受信/保存、TraceQL クエリ、trace_id で Loki 相関
Prometheusメトリクス時系列 DBRemote Write 受信/保存、PromQL クエリ/集計
Lokiログ集約エンジンPush API 受信/保存、LogQL クエリ、trace_id で Tempo 相関
Grafana統合可視化Traces/Metrics/Logs 可視化、trace_id でログ⇔トレース相関

ディレクトリ構成について

.
├── article_server
│   ├── cmd
│   ├── Dockerfile
│   ├── go.mod
│   ├── go.sum
│   └── internal # 実際のロジックを定義しているところ。spanなどで可視化した時にわかりやすくなるようにある程度レイヤーを区別
├── pkg
│   ├── errors
│   ├── go.mod
│   ├── go.sum
│   └── otel # otel関連の設定を管理するパッケージ (NewProvider などで各種 Provider, Exporterなどを設定してるところ)
├── _data // ホストマシンにマウントしているデータ群 (基本触らない)
│   ├── grafana
│   ├── loki
│   ├── prometheus
│   └── tempo
├── _docker # 各サービスの初期設定などを管理しているディレクトリ (詳細は後述)
│   ├── alloy
│   ├── grafana
│   ├── loki
│   ├── prometheus
│   └── tempo
└── docker-compose.yaml

※補足: docker-compose.yaml の設定

各種コンテナサービスの詳細

_docker 配下は以下のように設定しています。※このあたりも長くなるので詳細は省きます

./_docker
├── alloy
│   └── config.alloy                          # OTLP 受信 (4317/4318)、バッチ処理、Tempo/Prometheus/Loki への転送設定
├── grafana
│   ├── grafana.ini                           # Grafana 基本設定 (ポート、認証、管理者アカウント)
│   ├── provisioning
│   │   ├── dashboards
│   │   │   ├── article-server.json           # Article Server 監視ダッシュボード定義 (Latency/Request Rate)
│   │   │   └── dashboards.yaml               # ダッシュボード JSON ファイルの自動読み込み設定
│   │   └── datasources
│   │       └── datasources.yaml              # データソース (Tempo/Prometheus/Loki) 自動登録、trace_id 相関設定
│   └── setup.sh                              # 組織名などの初期設定スクリプト (起動時に 1 回実行)
├── loki
│   └── loki.yaml                             # ログストレージ設定 (chunk/index スキーマ、保持期間 7 日)
├── prometheus
│   └── prometheus.yml                        # メトリクススクレイプ設定、Remote Write 受信設定
└── tempo
    └── tempo.yaml                            # トレースストレージ設定 (WAL/ブロック、保持期間 7 日)

参考までに今回設定した内容を掲載します


動作確認

コンテナを起動して、各サービスが起動しているかどうか、及びGUIを提供しているサービスについてはブラウザ上でアクセスできるか確認してみます。

❯ docker compose up -d
[+] Running 8/8
 ✔ Network infrastructure_default             Created                                                               0.0s
 ✔ Container infrastructure-prometheus-1      Started                                                               0.4s
 ✔ Container infrastructure-loki-1            Started                                                               0.3s
 ✔ Container infrastructure-tempo-1           Started                                                               0.4s
 ✔ Container infrastructure-alloy-1           Started                                                               0.5s
 ✔ Container infrastructure-grafana-1         Started                                                               0.5s
 ✔ Container infrastructure-grafana-init-1    Started                                                               0.6s
 ✔ Container infrastructure-article-server-1  Started

各サービス起動していることを確認

スクリーンショット 2026-02-16 2.10.56.png

まずは http://localhost:3000/ で、Grafana の統合ダッシュボードにアクセスしてみます。

Grafana

スクリーンショット 2026-02-16 2.13.38.png

初期設定でユーザ名、パスワードは共に admin としていたので、左記内容でログインするとパスワード更新の画面になります。

※こちらも任意の内容で設定

スクリーンショット 2026-02-16 2.14.01.png

無事アクセスできると以下のホーム画面が表示されます。

※初期設定で言語設定を日本語にしていますが、デフォルトだと英語になってます

スクリーンショット 2026-02-16 2.14.28.png

Prometheus/Alloy

http://localhost:9090/query で Prometheus の Web UI (Query ページ) に、 http://localhost:12345/ で Grafana Alloy の管理UI にアクセスできるかを確認。

スクリーンショット 2026-02-16 2.23.24.png

スクリーンショット 2026-02-16 2.25.59.png

Alloy の Graph ページ上ではパイプライン構成も確認できます。※ config.alloy の設定が正しければ表示されるはずです

上段が Traces/Metrics のパイプライン、下段は Logs のパイプラインになります。

スクリーンショット 2026-02-16 2.26.36.png

各コンテナサービスが正常に起動していることが確認できました。


おわりに

これで OpenTelemetry の検証ができる環境が揃いました。

次回はこの環境で実際に API Request を送信し、 trace や span などのデータが Alloy/Tempo/Loki に正しく連携されているかどうかに焦点を当てて検証してみたいと思います。