0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OpenTelemetryデモ 3.0でテレメトリーを可視化する

0
Last updated at Posted at 2026-09-08

著者: 伊藤 雅博, 株式会社日立製作所

はじめに

OpenTelemetryはテレメトリーの収集を標準化しますが、収集したテレメトリーの蓄積・可視化については規定していません。オブザーバビリティの実現には、テレメトリーを蓄積するバックエンドと、可視化するフロントエンドが別途必要になります。

OpenTelemetryプロジェクトが提供するデモ環境には、OSSのオブザーバビリティ・バックエンド/フロントエンドが含まれています。本稿では、このデモ環境をDockerにデプロイし、ECアプリケーションが生成するTrace/Metric/Logの可視化方法を解説します。

記事一覧:

  1. オブザーバビリティの標準化を実現するOpenTelemetryの概要
  2. OpenTelemetry SDK/Collector/Operatorのアーキテクチャ
  3. OpenTelemetryデモ 3.0.0でテレメトリーを可視化する(本稿)

本稿はOpenTelemetry Demo 3.0.0 (2026年7月24日リリース) の構成を基にしており、過去のデモから構成が大きく変更されています。主な変更点はリリースノートおよび公式ブログ: We broke the OTel demoをご確認ください。

OpenTelemetryデモの概要

OpenTelemetryのデモには、テレメトリーを生成する分散型ECアプリケーションと、テレメトリーを蓄積・可視化するオブザーバビリティ・バックエンド/フロントエンドが含まれています。デモ環境の構成を以下に示します。

otel_demo.png

  • デモ制御機能
    • フィーチャーフラグでデモの動作を制御し、負荷の増減や障害の注入などを実行
    • 負荷生成ツールで模擬的なユーザトラフィック(様々なリクエスト)を生成
  • 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++ 通貨サービス。異なる通貨間で金額を換算
email 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)のバックグラウンドでは複数のサービスが動作しています。

サイトのトップページでは通貨を選択できます。

ec_currency.png

下にスクロールすると、商品の一覧が表示されます。

ec_items.png

個別の商品をクリックすると、商品の説明が表示されます。ここで商品をカートに追加できます。商品の下には、他のおすすめ商品とテキスト広告が表示されます。

ec_item.png

カート画面に移動すると、カートに追加した商品が表示されます。

ec_cart.png

チェックアウトすると、注文完了画面が表示されます。

ec_order.png

フィーチャーフラグ

フィーチャーフラグでデモの動作を制御できます。フィーチャーフラグを切り替えることで、各サービスで意図的に障害を発生させること(Fault Injection、障害注入)や、負荷生成ツールが生成するトラフィックを増減させることができます。

featureflags.png

今回デプロイした構成では以下のフラグを利用可能です。

フラグ名 説明
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)していることが分かります。

opamp_01.png

以下の画面では、各OpenTelemetry Collectorの稼働状況の詳細、リソース属性、実際に適用されている設定を確認できます。Collectorがメモリ使用率高騰によりデータ受信を拒否していることが分かります。

opamp_02.png

Jaeger UI

JaegerではTraceを確認できます。サービスを指定してTraceを検索し、エラーが発生したTraceや、実行時間が長いTraceを発見できます。

今回は以下のフラグを設定して、発生させたエラーを確認してみます。

フラグ名 説明 設定値
paymentFailure 支払いサービスの決済リクエストを指定した割合で失敗させる 10%

まずはアクセスの起点となる負荷生成ツール(load-generator)を含むTraceを検索し、エラーが発生したTraceを探します。

jaeger_01.png

Trace内でエラーが発生したSpanを辿ります。

jaeger_02.png

Spanで発生したエラーの内容を確認します。チェックアウトサービスでエラーが発生しており、ステータスのエラーメッセージとしてfailed to charge card: ...が表示されています。

jaeger_03.png

なお、詳細なエラーログについてはOpenSearch側に格納されているため、JaegerのUIからは直接確認できません。GrafanaでOpenSearchに格納されたログをTrace IDとSpan IDで検索する必要があります。

Grafana

Grafanaには多数のダッシュボードが用意されています。

grafana_dashboards.png

例えば以下のAPM Dashboard (Jaeger, Prometheus, OpenSearch)ダッシュボードでは、選択したサービスのリクエスト時間やエラー率などのMetricと、関連するLogやTraceを確認できます。

grafana.png

今回は以下のフラグを設定してみます。

フラグ名 説明 設定値
adManualGc 広告サービスでフルGCを手動実行する on

Traceの実行時間でソートすると、広告サービスを含むTraceに時間がかかっていることが確認できます。個別のTrace IDをクリックすると、Traceの詳細画面(JaegerからTrace IDで検索した結果)に遷移します。

grafana_trace_01.png

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までを横断して辿ることが可能です。

grafana_trace_03.png

また、OpenSearchに格納されたLog側からエラーを検索して、それに紐づくTrace ID、Span IDを確認することもできます。

grafana_logs.png

Prometheus

PrometheusのWeb UIではPromQLを直接実行し、収集されているMetricやラベルを確認できます。継続的なダッシュボード表示にはGrafanaを利用できます。

prometheus.png

OpenTelemetry Demo Telemetry Schema

OpenTelemetryデモのテレメトリスキーマのドキュメントを確認できます。デモの各サービス固有のAttributes(属性)とMetricsの説明が記載されています。

Homeページには使い方が記載されています。

telemetry_01.png

Servicesページでは、各サービスが使用するAttributesとMetricsの一覧を確認できます。カートサービスが使用するAttributesとMetricsの一覧を以下に示します。

telemetry_cart.png

Attributesページでは、各サービス固有のAttributesの詳細を確認できます。カートサービス固有のAttributesの詳細を以下に示します。

telemetry_cart_attributes.png

おわりに

本稿では、OpenTelemetryプロジェクトが提供するデモ環境をAmazon Linux上のDockerにデプロイし、分散型ECアプリケーション「Astronomy Shop」が生成するテレメトリーを可視化する方法を紹介しました。

このデモ環境では、フィーチャーフラグ(flagd)による障害注入や負荷調整によって意図的に問題を発生させ、JaegerやGrafanaといったオブザーバビリティ・フロントエンドからその原因を追跡する流れを体験できます。

次回は、本稿で構築したOpenTelemetryデモにAIエージェント機能を追加でデプロイして、生成AI向けの標準仕様として策定中の OpenTelemetry GenAI Semantic Conventions に準拠したテレメトリーを確認してみます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?