著者: 伊藤 雅博, 株式会社日立製作所
はじめに
OpenTelemetryはテレメトリーの収集を標準化しますが、収集したテレメトリーの蓄積・可視化については規定していません。オブザーバビリティの実現には、テレメトリーを蓄積するバックエンドと、可視化するフロントエンドが別途必要になります。
OpenTelemetryプロジェクトが提供するデモ環境には、OSSのオブザーバビリティ・バックエンド/フロントエンドが含まれています。本稿では、このデモ環境をDockerにデプロイし、ECアプリケーションが生成するTrace/Metric/Logの可視化方法を解説します。
記事一覧:
- オブザーバビリティの標準化を実現するOpenTelemetryの概要
- OpenTelemetry SDK/Collector/Operatorのアーキテクチャ
- OpenTelemetryデモ 3.0.0でテレメトリーを可視化する(本稿)
本稿はOpenTelemetry Demo 3.0.0 (2026年7月24日リリース) の構成を基にしており、過去のデモから構成が大きく変更されています。主な変更点はリリースノートおよび公式ブログ: We broke the OTel demoをご確認ください。
OpenTelemetryデモの概要
OpenTelemetryのデモには、テレメトリーを生成する分散型ECアプリケーションと、テレメトリーを蓄積・可視化するオブザーバビリティ・バックエンド/フロントエンドが含まれています。デモ環境の構成を以下に示します。
-
デモ制御機能
- フィーチャーフラグでデモの動作を制御し、負荷の増減や障害の注入などを実行
- 負荷生成ツールで模擬的なユーザトラフィック(様々なリクエスト)を生成
-
ECアプリケーション
- 天文グッズを扱うECサイト(通称:Astronomy Shop)
- 複数のマイクロサービスで構成され、各サービスがテレメトリーを生成
-
オブザーバビリティ
- テレメトリーを収集・蓄積・可視化する各種OSS
このデモ環境では、フィーチャーフラグによる障害注入や負荷調整によって意図的に問題を発生させ、テレメトリーからその原因を追跡する流れを体験できます。
OpenTelemetryデモの構成
OpenTelemetryデモは複数のコンテナで構成され、Docker Composeファイルを重ねることでデプロイするサービスや機能を選択できます。今回はECアプリケーション、Kafka連携、デモ標準のオブザーバビリティ環境をデプロイします。
OpenTelemetry Demo 3.0.0では他にも以下の機能が追加されましたが、今回はデプロイしません。これらの機能については次回以降の記事で紹介します。
-
AIエージェント機能
- LangGraph ReActエージェント/MCPサーバ/Chatbot UIで構成
- 生成AI向けの標準仕様として策定中の OpenTelemetry GenAI Semantic Conventions に準拠したテレメトリーを確認できる
-
プロファイリング機能
- 新しいテレメトリー「Profile」をeBPFプロファイラで収集してFirepit UIで可視化
ECアプリケーション
天文グッズを扱うECサイト(通称:Astronomy Shop)です。異なるプログラミング言語で書かれた複数のマイクロサービスで構成され、各サービスがテレメトリーを生成してOpenTelemetry Collectorに送信します。また、CollectorはDocker、ホスト、Nginx、Valkey、PostgreSQL、 KafkaなどからもMetricを収集します。
今回デプロイしたサービスを以下に示します。
アプリケーションサービス
| コンテナ | 実装言語 | サービス概要 |
|---|---|---|
| accounting | .NET | 会計サービス。注文の合計金額を集計 |
| ad | Java | 広告サービス。コンテキストに応じたテキスト広告を提供 |
| cart | .NET | カートサービス。カートに入れた商品を保持 |
| checkout | Go | チェックアウトサービス。カートに入れた商品の支払い・配送・メール通知を統括 |
| currency | C++ | 通貨サービス。異なる通貨間で金額を換算 |
| Ruby | メールサービス。注文確認メールを送信 | |
| fraud-detection | Kotlin | 不正検知サービス。不正な注文を検知 |
| frontend | TypeScript (Next.js) | フロントエンドサービス。Webストアの画面を提供 |
| frontend-proxy | C++ (Envoy) | リバースプロキシ。全ブラウザトラフィックの入口 |
| payment | JavaScript (Node.js) | 支払いサービス。注文のクレジットカード決済 |
| product-catalog | Go | 商品カタログサービス。商品一覧の提供や個別商品の検索 |
| quote | PHP | 見積りサービス。出荷点数から配送料を計算 |
| recommendation | Python | 推薦サービス。閲覧中の商品に基づき関連商品を推奨 |
| shipping | Rust | 配送サービス。配送料の見積もりと配送 |
インフラサービス
アプリケーションサービスが利用するミドルウェアと、静的コンテンツを配信する補助サービスです。
| コンテナ | OSS | 説明 |
|---|---|---|
| telemetry-docs | Nginx | デモ固有テレメトリーに関するドキュメントを配信 |
| image-provider | Nginx | 商品画像の配信 |
| astronomy-db | PostgreSQL | 会計サービスが注文を保存するデータベース |
| kafka | Kafka | 注文イベントを仲介するメッセージキュー |
| valkey-cart | Valkey | カートサービスの商品を保持するキャッシュ |
デモ制御機能
デモの動作を制御します。
| コンテナ | OSS/実装 | 説明 |
|---|---|---|
| flagd | flagd | フィーチャーフラグでデモの動作を制御。負荷の増減や障害の注入などが可能 |
| flagd-ui | Elixirアプリ | フィーチャーフラグを操作する Web UI を提供 |
| load-generator | k6 | 負荷生成ツール(k6)でユーザートラフィック(各種リクエスト)を模擬的に生成 |
オブザーバビリティ
マイクロサービスが生成したテレメトリーを収集・蓄積・可視化します。
テレメトリー収集/OTel Collector管理
各サービスのテレメトリーを収集し、オブザーバビリティ・バックエンドへ転送する OpenTelemetry Collector です。OpAMP(Open Agent Management Protocol)を利用してCollectorの状態を参照できます。
| コンテナ | OSS | 説明 |
|---|---|---|
| otel-collector | OpenTelemetry Collector | 各サービスから受信および収集したテレメトリーを加工・転送 |
| opamp-server | OpAMP サーバ | Collector の状態を参照する Web UI を提供 |
オブザーバビリティ・バックエンド/フロントエンド
OpenTelemetry Collectorが転送したテレメトリーを蓄積・可視化する、オブザーバビリティ・バックエンド/フロントエンドです。CollectorはTraceをJaegerへ、MetricをPrometheus(OTLPの書き込み受信)へ、LogをOpenSearchへエクスポートします。Grafanaはこの3つをデータソースとして参照するため、Trace/Metric/Logを1つの画面から横断的に確認できます。
| コンテナ | OSS | 説明 |
|---|---|---|
| prometheus | Prometheus | Metricを蓄積 |
| jaeger | Jaeger | Traceを蓄積・可視化 |
| opensearch | OpenSearch | Logを蓄積 |
| grafana | Grafana | Trace/Metric/Logを可視化 |
OpenTelemetryデモのデプロイ
OpenTelemetryデモはKubernetesまたはDockerで動作します。今回はデモ環境をAmazon Linux 2023上のDockerにデプロイします。
前提環境
今回はAWSのEC2インスタンスにデプロイしました。
| 項目 | 内容 |
|---|---|
| プラットフォーム | Amazon EC2 |
| EC2インスタンスタイプ |
t3.xlarge (4 vCPU, 16 GiB memory) |
| OS (AMI) | Amazon Linux 2023 (al2023-ami-2023.12.20260720.0-kernel-6.18-x86_64) |
全サービスを起動する場合の前提として、最低でも6GBのメモリ、14GBのディスク容量が必要です。また、負荷を増加させて試す場合はメモリをさらに増やすことを推奨します。
DockerとGitのインストール
# パッケージ更新
sudo dnf update -y
# Docker と Git をインストール
sudo dnf install -y docker git
# Docker サービスの起動と、自動起動の有効化
sudo systemctl enable --now docker
# 現在のユーザーを docker グループに追加(sudo なしで実行するため)
sudo usermod -aG docker $USER
# 反映
newgrp docker
# Docker Compose v2 プラグインをインストール
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
mkdir -p $DOCKER_CONFIG/cli-plugins
curl -SL https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64 \
-o $DOCKER_CONFIG/cli-plugins/docker-compose
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
# Dockerのバージョン確認
docker --version
## Docker version 25.0.14, build 0bab007
# Docker Composeのバージョン確認
docker compose version
## Docker Compose version v5.3.1
# Gitのバージョン確認
git --version
## git version 2.50.1
OpenTelemetryデモのダウンロード
# OpenTelemetry Demo 3.0.0を取得
git clone --branch 3.0.0 --depth 1 https://github.com/open-telemetry/opentelemetry-demo.git
# リポジトリのディレクトリへ移動
cd opentelemetry-demo
# バージョンを確認
git describe --tags
## 3.0.0
OpenTelemetryデモの起動
デモは複数のComposeファイルに分かれており、-fオプションで重ねることでデプロイするコンポーネントを制御できます。今回は以下のComposeファイルを使用します。
| ファイル | 内容 |
|---|---|
compose.yaml |
コア構成(ECアプリケーション、OTel Collectorなど) |
compose.full.yaml |
Kafka連携(Kafka、accounting、fraud-detectionなど) |
compose.observability.yaml |
オブザーバビリティ環境(Jaeger、Prometheus、OpenSearch、Grafana、OpAMP) |
compose.extras.yaml |
追加設定を記載 |
AIエージェント機能とプロファイリング機能は、今回はデプロイしません。
# OpenTelemetryデモを起動
docker compose \
--env-file .env \
--env-file .env.override \
-f compose.yaml \
-f compose.full.yaml \
-f compose.observability.yaml \
-f compose.extras.yaml \
up --force-recreate --remove-orphans --detach
# (参考)OpenTelemetryデモを停止
docker compose \
--env-file .env \
--env-file .env.override \
-f compose.yaml \
-f compose.full.yaml \
-f compose.observability.yaml \
-f compose.extras.yaml \
down
OpenTelemetryデモの起動確認
# コンテナの起動状態を確認
# STATUSがUpで、ヘルスチェック対象はhealthyになっていることを確認
docker compose ps --all
## NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
## accounting ghcr.io/open-telemetry/demo:latest-accounting "./instrument.sh dot…" accounting 8 minutes ago Up 7 minutes
## ad ghcr.io/open-telemetry/demo:latest-ad "./build/install/ope…" ad 8 minutes ago Up 7 minutes (healthy) 0.0.0.0:32815->9465/tcp, [::]:32815->9465/tcp, 0.0.0.0:32814->9555/tcp, [::]:32814->9555/tcp
## astronomy-db postgres:18.4 "docker-entrypoint.s…" astronomy-db 8 minutes ago Up 8 minutes (healthy) 0.0.0.0:32796->5432/tcp, [::]:32796->5432/tcp
## cart ghcr.io/open-telemetry/demo:latest-cart "./cart" cart 8 minutes ago Up 7 minutes 0.0.0.0:32816->7070/tcp, [::]:32816->7070/tcp
## checkout ghcr.io/open-telemetry/demo:latest-checkout "./checkout" checkout 8 minutes ago Up 7 minutes (healthy) 0.0.0.0:32819->5050/tcp, [::]:32819->5050/tcp
## currency ghcr.io/open-telemetry/demo:latest-currency "sh -c './usr/local/…" currency 8 minutes ago Up 7 minutes (healthy) 0.0.0.0:32809->7001/tcp, [::]:32809->7001/tcp
## email ghcr.io/open-telemetry/demo:latest-email "bundle exec ruby em…" email 8 minutes ago Up 7 minutes (healthy) 0.0.0.0:32807->6060/tcp, [::]:32807->6060/tcp
## flagd ghcr.io/open-feature/flagd:v0.16.0 "/flagd-build start …" flagd 8 minutes ago Up 8 minutes 0.0.0.0:32804->8013/tcp, [::]:32804->8013/tcp, 0.0.0.0:32803->8016/tcp, [::]:32803->8016/tcp
## flagd-ui ghcr.io/open-telemetry/demo:latest-flagd-ui "sh -c 'ulimit -n 65…" flagd-ui 8 minutes ago Up 7 minutes (healthy) 0.0.0.0:32810->4000/tcp, [::]:32810->4000/tcp
## fraud-detection ghcr.io/open-telemetry/demo:latest-fraud-detection "java -jar fraud-det…" fraud-detection 8 minutes ago Up 7 minutes
## frontend ghcr.io/open-telemetry/demo:latest-frontend "/nodejs/bin/node --…" frontend 8 minutes ago Up 7 minutes (healthy) 0.0.0.0:32820->8080/tcp, [::]:32820->8080/tcp
## frontend-proxy ghcr.io/open-telemetry/demo:latest-frontend-proxy "/bin/sh -c 'envsubs…" frontend-proxy 8 minutes ago Up 7 minutes (healthy) 0.0.0.0:8080->8080/tcp, [::]:8080->8080/tcp, 0.0.0.0:10000->10000/tcp, [::]:10000->10000/tcp
## grafana grafana/grafana:13.1.0 "/run.sh" grafana 8 minutes ago Up 8 minutes 0.0.0.0:32798->3000/tcp, [::]:32798->3000/tcp
## image-provider ghcr.io/open-telemetry/demo:latest-image-provider "/docker-entrypoint.…" image-provider 8 minutes ago Up 7 minutes (healthy) 8080/tcp, 0.0.0.0:32812->8081/tcp, [::]:32812->8081/tcp
## jaeger quay.io/jaegertracing/jaeger:2.19.0 "/cmd/jaeger/jaeger-…" jaeger 8 minutes ago Up 8 minutes 4318/tcp, 5778-5779/tcp, 9411/tcp, 13132-13133/tcp, 14250/tcp, 14268/tcp, 0.0.0.0:32802->4317/tcp, [::]:32802->4317/tcp, 0.0.0.0:32801->16686/tcp, [::]:32801->16686/tcp
## kafka ghcr.io/open-telemetry/demo:latest-kafka "/__cacert_entrypoin…" kafka 8 minutes ago Up 8 minutes (healthy) 9092/tcp
## load-generator ghcr.io/open-telemetry/demo:latest-load-generator "./entrypoint.sh" load-generator 8 minutes ago Up 7 minutes (healthy)
## opamp-server ghcr.io/open-telemetry/demo:latest-opamp-server "/opamp-server" opamp-server 8 minutes ago Up 8 minutes (healthy) 4320-4321/tcp
## opensearch ghcr.io/open-telemetry/demo:latest-opensearch "./opensearch-docker…" opensearch 8 minutes ago Up 8 minutes (healthy) 9300/tcp, 9600/tcp, 9650/tcp, 0.0.0.0:32799->9200/tcp, [::]:32799->9200/tcp
## otel-collector ghcr.io/open-telemetry/opentelemetry-collector-releases/opentelemetry-collector-contrib:0.157.0 "/otelcol-contrib --…" otel-collector 8 minutes ago Up 7 minutes 55679/tcp, 0.0.0.0:32806->4317/tcp, [::]:32806->4317/tcp, 0.0.0.0:32805->4318/tcp, [::]:32805->4318/tcp
## payment ghcr.io/open-telemetry/demo:latest-payment "/nodejs/bin/node in…" payment 8 minutes ago Up 7 minutes (healthy) 0.0.0.0:32811->50051/tcp, [::]:32811->50051/tcp
## product-catalog ghcr.io/open-telemetry/demo:latest-product-catalog "./product-catalog" product-catalog 8 minutes ago Up 7 minutes (healthy) 0.0.0.0:32817->3550/tcp, [::]:32817->3550/tcp
## prometheus quay.io/prometheus/prometheus:v3.13.1 "/bin/prometheus --w…" prometheus 8 minutes ago Up 8 minutes 0.0.0.0:9090->9090/tcp, [::]:9090->9090/tcp
## quote ghcr.io/open-telemetry/demo:latest-quote "docker-php-entrypoi…" quote 8 minutes ago Up 7 minutes (healthy) 0.0.0.0:32808->8090/tcp, [::]:32808->8090/tcp
## recommendation ghcr.io/open-telemetry/demo:latest-recommendation "/venv/bin/opentelem…" recommendation 8 minutes ago Up 7 minutes (healthy) 0.0.0.0:32818->9001/tcp, [::]:32818->9001/tcp
## shipping ghcr.io/open-telemetry/demo:latest-shipping "./shipping" shipping 8 minutes ago Up 7 minutes (healthy) 0.0.0.0:32813->50050/tcp, [::]:32813->50050/tcp
## telemetry-docs ghcr.io/open-telemetry/demo:latest-telemetry-docs "/docker-entrypoint.…" telemetry-docs 8 minutes ago Up 8 minutes (healthy) 8080/tcp, 0.0.0.0:32800->8000/tcp, [::]:32800->8000/tcp
## valkey-cart ghcr.io/valkey-io/valkey:9.0.4-alpine3.23 "docker-entrypoint.s…" valkey-cart 8 minutes ago Up 8 minutes (healthy) 0.0.0.0:32797->6379/tcp, [::]:32797->6379/tcp
# テレメトリー健全性テスト用のイメージをビルド
docker build -t opentelemetry-demo-telemetry-tests ./test/telemetry
# テレメトリーの健全性テストを実行
# 各サービスがTrace、Metric、Logを生成し、バックエンドに到達していることを検証
docker run --rm --network opentelemetry-demo \
--env-file .env --env-file .env.override \
-e TEST_SCOPE=full \
opentelemetry-demo-telemetry-tests
## ============================= test session starts ==============================
## ・・・
## ======================== 64 passed, 1 skipped in 11.88s ========================
(参考)OpenTelemetryデモのデバッグ
デモが正常に起動しない場合は、コンテナのログを確認してください。
# 全コンテナのログを表示
docker compose \
--env-file .env \
--env-file .env.override \
-f compose.yaml \
-f compose.full.yaml \
-f compose.observability.yaml \
-f compose.extras.yaml \
logs -f
# 全コンテナのログからエラーと思われる行を簡易抽出
docker compose \
--env-file .env \
--env-file .env.override \
-f compose.yaml \
-f compose.full.yaml \
-f compose.observability.yaml \
-f compose.extras.yaml \
logs --no-color |
grep -i -E "error|fatal|panic|out of memory|oom"
# 特定のコンテナ(Grafana)のログを表示
docker compose \
--env-file .env \
--env-file .env.override \
-f compose.yaml \
-f compose.full.yaml \
-f compose.observability.yaml \
-f compose.extras.yaml \
logs -f grafana
# 全コンテナのメモリ使用量を確認
docker stats --no-stream --format "table {{.Name}}\t{{.MemUsage}}\t{{.MemPerc}}"
## NAME MEM USAGE / LIMIT MEM %
## load-generator 278.1MiB / 512MiB 54.31%
## frontend-proxy 22MiB / 90MiB 24.44%
## frontend 96.52MiB / 250MiB 38.61%
## checkout 11.91MiB / 20MiB 59.57%
## recommendation 43.94MiB / 500MiB 8.79%
## image-provider 5.082MiB / 120MiB 4.24%
## shipping 4.449MiB / 20MiB 22.25%
## currency 3.406MiB / 20MiB 17.03%
## product-catalog 11.55MiB / 20MiB 57.73%
## fraud-detection 203.5MiB / 300MiB 67.83%
## payment 97.22MiB / 140MiB 69.44%
## quote 16.46MiB / 40MiB 41.14%
## email 54.32MiB / 100MiB 54.32%
## accounting 117.8MiB / 160MiB 73.64%
## cart 42.07MiB / 160MiB 26.30%
## flagd-ui 163.9MiB / 200MiB 81.94%
## ad 225MiB / 300MiB 74.99%
## otel-collector 95.87MiB / 400MiB 23.97%
## kafka 525.1MiB / 620MiB 84.69%
## grafana 164.2MiB / 175MiB 93.83%
## prometheus 94.26MiB / 200MiB 47.13%
## telemetry-docs 5.07MiB / 100MiB 5.07%
## astronomy-db 63.79MiB / 80MiB 79.74%
## opamp-server 7.703MiB / 65MiB 11.85%
## opensearch 824.3MiB / 1GiB 80.50%
## flagd 48.02MiB / 75MiB 64.03%
## jaeger 82.65MiB / 1.172GiB 6.89%
## valkey-cart 3.281MiB / 20MiB 16.41%
# OOM Killの状態と再起動回数を確認
docker inspect \
--format '{{.Name}} OOMKilled={{.State.OOMKilled}} ExitCode={{.State.ExitCode}} RestartCount={{.RestartCount}}' \
$(docker compose ps -q)
## /accounting OOMKilled=false ExitCode=0 RestartCount=0
## /ad OOMKilled=false ExitCode=0 RestartCount=0
## /astronomy-db OOMKilled=false ExitCode=0 RestartCount=0
## /cart OOMKilled=false ExitCode=0 RestartCount=0
## /checkout OOMKilled=false ExitCode=0 RestartCount=0
## /currency OOMKilled=false ExitCode=0 RestartCount=0
## /email OOMKilled=false ExitCode=0 RestartCount=0
## /flagd OOMKilled=false ExitCode=0 RestartCount=0
## /flagd-ui OOMKilled=false ExitCode=0 RestartCount=0
## /fraud-detection OOMKilled=false ExitCode=0 RestartCount=0
## /frontend OOMKilled=false ExitCode=0 RestartCount=0
## /frontend-proxy OOMKilled=false ExitCode=0 RestartCount=0
## /grafana OOMKilled=false ExitCode=0 RestartCount=0
## /image-provider OOMKilled=false ExitCode=0 RestartCount=0
## /jaeger OOMKilled=false ExitCode=0 RestartCount=0
## /kafka OOMKilled=false ExitCode=0 RestartCount=0
## /load-generator OOMKilled=false ExitCode=0 RestartCount=0
## /opamp-server OOMKilled=false ExitCode=0 RestartCount=0
## /opensearch OOMKilled=false ExitCode=0 RestartCount=0
## /otel-collector OOMKilled=false ExitCode=0 RestartCount=0
## /payment OOMKilled=false ExitCode=0 RestartCount=0
## /product-catalog OOMKilled=false ExitCode=0 RestartCount=0
## /prometheus OOMKilled=false ExitCode=0 RestartCount=0
## /quote OOMKilled=false ExitCode=0 RestartCount=0
## /recommendation OOMKilled=false ExitCode=0 RestartCount=0
## /shipping OOMKilled=false ExitCode=0 RestartCount=0
## /telemetry-docs OOMKilled=false ExitCode=0 RestartCount=0
## /valkey-cart OOMKilled=false ExitCode=0 RestartCount=0
OpenTelemetryデモは各コンテナのメモリ割当量が小さめに設定されているため、環境によっては動作が重い場合や、OOM Killが発生してコンテナが再起動を繰り返すことがあります。その場合は該当サービスのメモリ割当量を増やしてください。
下記ファイルに設定を記載することで、Composeファイルの既存設定を上書きできます。
./opentelemetry-demo/compose.extras.yaml:
# Grafanaコンテナのメモリ割当量を変更する例
services:
grafana:
deploy:
resources:
limits:
memory: 512M # 175M -> 512M
OpenTelemetryデモの利用
OpenTelemetryデモのWeb UI一覧
Webブラウザから以下のUIにアクセスできます。Prometheus以外はリバースプロキシ(frontend-proxy)が待ち受けるポート8080配下で公開されています。
| コンポーネント | 説明 | URL |
|---|---|---|
| ECサイト | 天文グッズを扱うAstronomy Shop | http://localhost:8080/ |
| フィーチャーフラグ | デモの動作を制御 | http://localhost:8080/feature/ |
| OpAMPサーバ | OTel Collectorの状態を表示 | http://localhost:8080/opamp/ |
| Jaeger UI | Traceを表示 | http://localhost:8080/jaeger/ui/ |
| Grafana | Trace、Metric、Logを表示 | http://localhost:8080/grafana/ |
| Prometheus | Metricを表示 | http://localhost:9090/ |
| OpenTelemetry Demo Telemetry Schema | デモ固有のテレメトリーの説明を記載 | http://localhost:8080/telemetry/ |
ECサイト
天文グッズを扱うECサイト(Astronomy Shop)のバックグラウンドでは複数のサービスが動作しています。
サイトのトップページでは通貨を選択できます。
下にスクロールすると、商品の一覧が表示されます。
個別の商品をクリックすると、商品の説明が表示されます。ここで商品をカートに追加できます。商品の下には、他のおすすめ商品とテキスト広告が表示されます。
カート画面に移動すると、カートに追加した商品が表示されます。
チェックアウトすると、注文完了画面が表示されます。
フィーチャーフラグ
フィーチャーフラグでデモの動作を制御できます。フィーチャーフラグを切り替えることで、各サービスで意図的に障害を発生させること(Fault Injection、障害注入)や、負荷生成ツールが生成するトラフィックを増減させることができます。
今回デプロイした構成では以下のフラグを利用可能です。
| フラグ名 | 説明 |
|---|---|
adFailure |
広告サービスでエラーを発生させる |
adHighCpu |
広告サービスに高いCPU負荷を発生させる |
adManualGc |
広告サービスでフルGCを手動実行する |
cartFailure |
カートサービスを指定した割合で失敗させる |
failedReadinessProbe |
カートサービスのReadiness Probeを失敗させる(Kubernetes環境のみ有効) |
emailMemoryLeak |
メールサービスでメモリリークを発生させる |
imageSlowLoad |
フロントエンドの商品画像の読み込みを遅延させる |
intlShippingSlowdown |
海外配送の遅延を模擬するため、国際配送リクエストへの応答を遅延させる |
kafkaQueueProblems |
Kafkaキューへ過剰な負荷をかけると同時に、コンシューマー側に遅延を発生させ、コンシューマーラグを急増させる |
loadGeneratorTraffic |
負荷生成ツールによる模擬トラフィックを有効化する。offにすると、すべての負荷生成シナリオを一時停止する |
loadGeneratorVUs |
負荷生成ツールのHTTPシナリオを実行する同時仮想ユーザー数。変更はラッパーの次回ポーリング時に反映され、k6が再起動される |
paymentFailure |
支払いサービスの決済リクエストを指定した割合で失敗させる |
paymentUnreachable |
支払いサービスを到達不能にする |
productCatalogFailure |
特定の商品に対する商品カタログサービスの処理を失敗させる |
recommendationCacheFailure |
推薦サービスのキャッシュ処理を失敗させる |
フィーチャーフラグの詳細は以下のドキュメントをご参照ください。
OpAMPサーバ
OpAMPサーバでは、各OpenTelemetry Collectorの状態や設定を確認できます。
以下の画面では、OpenTelemetry Collectorの一覧、稼働状態(ヘルス)、バージョンを確認できます。Collectorが1個存在して停止(Health: Down)していることが分かります。
以下の画面では、各OpenTelemetry Collectorの稼働状況の詳細、リソース属性、実際に適用されている設定を確認できます。Collectorがメモリ使用率高騰によりデータ受信を拒否していることが分かります。
Jaeger UI
JaegerではTraceを確認できます。サービスを指定してTraceを検索し、エラーが発生したTraceや、実行時間が長いTraceを発見できます。
今回は以下のフラグを設定して、発生させたエラーを確認してみます。
| フラグ名 | 説明 | 設定値 |
|---|---|---|
paymentFailure |
支払いサービスの決済リクエストを指定した割合で失敗させる | 10% |
まずはアクセスの起点となる負荷生成ツール(load-generator)を含むTraceを検索し、エラーが発生したTraceを探します。
Trace内でエラーが発生したSpanを辿ります。
Spanで発生したエラーの内容を確認します。チェックアウトサービスでエラーが発生しており、ステータスのエラーメッセージとしてfailed to charge card: ...が表示されています。
なお、詳細なエラーログについてはOpenSearch側に格納されているため、JaegerのUIからは直接確認できません。GrafanaでOpenSearchに格納されたログをTrace IDとSpan IDで検索する必要があります。
Grafana
Grafanaには多数のダッシュボードが用意されています。
例えば以下のAPM Dashboard (Jaeger, Prometheus, OpenSearch)ダッシュボードでは、選択したサービスのリクエスト時間やエラー率などのMetricと、関連するLogやTraceを確認できます。
今回は以下のフラグを設定してみます。
| フラグ名 | 説明 | 設定値 |
|---|---|---|
adManualGc |
広告サービスでフルGCを手動実行する | on |
Traceの実行時間でソートすると、広告サービスを含むTraceに時間がかかっていることが確認できます。個別のTrace IDをクリックすると、Traceの詳細画面(JaegerからTrace IDで検索した結果)に遷移します。
Traceの詳細画面からエラーが発生したSpanを確認できます。Logs forthis spanをクリックすると、このSpanに関連付けられたLogの詳細画面(OpenSearchからTrace IDとSpan IDで検索した結果)が表示されます。
このログメッセージThe artificially triggerd GCs took: 71835 msから、Java GCの発生で処理に時間がかかったことがわかります。
このようにGrafanaからは、JaegerのTraceからOpenSearchのLogまでを横断して辿ることが可能です。
また、OpenSearchに格納されたLog側からエラーを検索して、それに紐づくTrace ID、Span IDを確認することもできます。
Prometheus
PrometheusのWeb UIではPromQLを直接実行し、収集されているMetricやラベルを確認できます。継続的なダッシュボード表示にはGrafanaを利用できます。
OpenTelemetry Demo Telemetry Schema
OpenTelemetryデモのテレメトリスキーマのドキュメントを確認できます。デモの各サービス固有のAttributes(属性)とMetricsの説明が記載されています。
Homeページには使い方が記載されています。
Servicesページでは、各サービスが使用するAttributesとMetricsの一覧を確認できます。カートサービスが使用するAttributesとMetricsの一覧を以下に示します。
Attributesページでは、各サービス固有のAttributesの詳細を確認できます。カートサービス固有のAttributesの詳細を以下に示します。
おわりに
本稿では、OpenTelemetryプロジェクトが提供するデモ環境をAmazon Linux上のDockerにデプロイし、分散型ECアプリケーション「Astronomy Shop」が生成するテレメトリーを可視化する方法を紹介しました。
このデモ環境では、フィーチャーフラグ(flagd)による障害注入や負荷調整によって意図的に問題を発生させ、JaegerやGrafanaといったオブザーバビリティ・フロントエンドからその原因を追跡する流れを体験できます。
次回は、本稿で構築したOpenTelemetryデモにAIエージェント機能を追加でデプロイして、生成AI向けの標準仕様として策定中の OpenTelemetry GenAI Semantic Conventions に準拠したテレメトリーを確認してみます。




















