1. はじめに
OpenTelemetryについて徐々に話題にあがる事も増えてきたのではないでしょうか。
Instanaは早くからOpenTelemetryをサポートすることを言及しておりましたが、実際にどの様に可視化できるのか気になっていましたので、実際に試してみました。
OpenTelemetryのWebサイトを読み漁っていたらサンプルアプリが公開されていましたので、こちらを題材にしていきたいと思います。
1.1. OpenTelemetry Demo App
OpenTelemetryコミュニティによって公開されているWebショッピングアプリです。
- 11の言語で書かれている分散マイクロサービスアプリケーション
- OpenTelemetryインストルメンテーションは組み込み済み
- 様々なOpenTelemetry機能の使用例が含まれている
出典: OpenTelemetry - Demo Architecture (リンク)
1.2. OpenTelemetry Collector
対象からOpenTelemetryデータを収集し、指定のバックエンドに連携するための中継的な役割を担います。
サーバーレスの環境では、アプリから直接バックエンドにデータを送信する構成もありますが、今回は仮想サーバー上のアプリを対象とするため、OpenTelemetry Collectorを構成します。
出典: OpenTelemetry - Collector Data Flow Dashboard (リンク)
この図において、右側のJaeger, Prometeus, GrafanaのところをInstanaに置き換えた場合どのようになるのかを考えていきます。
1.3. Instana - OpenTelemetry 連携パターン
OpenTelemetryデータをInstanaバックエンドに送信するにあたり、Instanaエージェント有無の2パターンを試しました。
1.3.1. 連携パターン1
OpenTelemetry Collectorのotlp exporterによりInstanaバックエンドに直接送信します。
トレース・メトリック・ログすべて同じ方法で送信可能です。
InstanaバックエンドはOTLP専用のエンドポイントにてOTLPデータを受信します。
OTLP/gRPC, OTLP/HTTPそれぞれ対応しています。
otlpプロトコルで直接 Instanaバックエンドに送信できることになったことにより、従来から提供されていたOpenTelemetry Collector ContribのInstana Exporterは非推奨になりました
1.3.2. 連携パターン2
Instanaエージェント経由でInstanaバックエンドに送信します。
トレース・メトリック・ログすべて同じ方法で送信可能です。
InstanaエージェントがOTLPデータを受信し、通常のバックエンドとの通信においてOTLPデータを送信します。
メトリックデータに関してはOpenTelemetryベースの汎用データコレクターを開発中です。2023年12月時点ではベータ版としてデータベース用の汎用データコレクターが提供されています。
1.4. 環境情報
本手順は以下の環境で実施しています。
[Instana Backend]
- Instana Backend: SaaS Build 263
[Server1/Server2共通]
- Platform: IBM Cloud VSI Classic
- VM: CPU 4core, 16GB memory, 100GB SSD
- OS: RHEL 8.8
- docker: 24.0.7 (Community Edition)
- docker-compose: v2.21.0
- Application: OpenTelemetry Demo App 1.7.0 (docker)
OTel Demo Appの動作にはそこそこのメモリとDisk IO性能が必要のようです。
AWS EBSのgp2で試した際に、IO waitが発生してしまいましたので。
2. 連携パターン1のセットアップ
OpenTelemetryドキュメント記載のdocker deploymentの方法に従いながら進めていきます。
https://opentelemetry.io/docs/demo/docker-deployment/
2.1. OpenTelemetry関連の設定
2.1.1. アプリのDLと不要な設定の削除
ファイルはgitからダウンロードできます。
git clone https://github.com/open-telemetry/opentelemetry-demo.git
cd opentelemetry-demo
docker-compose.ymlと必要なファイルが揃っているので、そのまま直ぐに動作させることが可能ですが、1.2節
の図の右側にあるJaeger, Prometheus, Grafanaあたりも動作するようになっています。
これらが起動しないように、docker-compose.ymlからコメントアウトまたは削除します。
#リソースに余裕があればそのままでも良いです。
参考までに私のサンプルファイルを置いておきます。
2.1.2. リソース属性の設定
OpenTelemetry リソース・セマンティック規則(Resource Semantic Conventions)で定義されている属性を付与することで管理性を高めることができます。 Instanaではアプリケーション・パースペクティブや分析のフィルタで活用できるため設定しておきます。
vi .env
# OpenTelemetry Resource Definitions
OTEL_RESOURCE_ATTRIBUTES="service.namespace=opentelemetry-demo-kd1,service.version=1.0.1"
2.1.3. OpenTelemetry Collector Contribの設定
otelcol-config.yml
のExporterの設定を編集します。
vi src/otelcollector/otelcol-config.yml
exporters.otlp
を以下の様に設定します。
exporters:
otlp:
endpoint: "otlp-orange-saas.instana.io:4317"
headers:
x-instana-key: "XXXXXXXXXXXXXXX"
x-instana-host: "otel-test-kd1"
設定項目 | 設定値 | 備考 |
---|---|---|
endpoint | otlp-xxxx-saas.instana.io:4317 | xxxxはSaaSのデプロイ環境によって異なります |
headers.x-instana-key | Instanaエージェントキー | |
headers.x-instana-host | ホスト名 | 参考 |
同ファイル内service.pipelines
を以下の様に設定します。
traces
, metrics
, logs
のそれぞれのexporters
にotlp
に設定します。
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [otlp, debug, spanmetrics]
metrics:
receivers: [httpcheck/frontendproxy, otlp, spanmetrics]
processors: [filter/ottl, transform, batch]
exporters: [otlp, debug]
logs:
receivers: [otlp]
processors: [batch]
exporters: [otlp, debug]
2.1.4. 各種サービスの起動
docker composeコマンドで全体を起動します。
docker compose up --force-recreate --remove-orphans --detach
[+] Running 196/21
✔ shippingservice 4 layers [⣿⣿⣿⣿] 0B/0B Pulled 36.9s
✔ frontendproxy 10 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 56.7s
✔ adservice 8 layers [⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 51.1s
✔ frontend 14 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 77.3s
✔ paymentservice 7 layers [⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 46.0s
✔ featureflagservice 6 layers [⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 40.8s
✔ loadgenerator 9 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 40.0s
✔ cartservice 5 layers [⣿⣿⣿⣿⣿] 0B/0B Pulled 36.3s
✔ ffs_postgres 13 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 76.6s
✔ kafka 13 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 37.5s
✔ quoteservice 12 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 83.5s
✔ otelcol 3 layers [⣿⣿⣿] 0B/0B Pulled 29.9s
✔ opensearch 6 layers [⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 91.3s
✔ emailservice 9 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 70.3s
✔ productcatalogservice 4 layers [⣿⣿⣿⣿] 0B/0B Pulled 12.5s
✔ accountingservice 2 layers [⣿⣿] 0B/0B Pulled 32.3s
✔ frauddetectionservice 34 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 31.1s
✔ checkoutservice 2 layers [⣿⣿] 0B/0B Pulled 53.6s
✔ redis-cart 7 layers [⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 23.1s
✔ currencyservice 2 layers [⣿⣿] 0B/0B Pulled 57.3s
✔ recommendationservice 5 layers [⣿⣿⣿⣿⣿] 0B/0B Pulled 49.5s
[+] Running 22/22
✔ Network opentelemetry-demo Created 0.1s
✔ Container kafka Healthy 4.3s
✔ Container postgres Healthy 4.3s
✔ Container redis-cart Started 4.3s
✔ Container otel-col Started 4.3s
✔ Container opensearch Started 4.3s
✔ Container ad-service Started 0.1s
✔ Container email-service Started 0.1s
✔ Container product-catalog-service Started 0.1s
✔ Container payment-service Started 0.1s
✔ Container quote-service Started 0.1s
✔ Container currency-service Started 0.1s
✔ Container shipping-service Started 0.1s
✔ Container feature-flag-service Started 0.1s
✔ Container cart-service Started 0.1s
✔ Container accounting-service Started 0.1s
✔ Container frauddetection-service Started 0.1s
✔ Container recommendation-service Started 0.0s
✔ Container checkout-service Started 0.0s
✔ Container frontend Started 0.0s
✔ Container load-generator Started 0.0s
✔ Container frontend-proxy Started
正常に起動が完了したら、
http://<IPアドレス>:8080/
にアクセスして以下の画面が表示されればOKです。
ついでにデータ取得のため、画面をポチポチしておきます。
2.2. Instana関連の設定
2.2.1. アプリケーション・パースペクティブの設定
Instanaで取得したデータを確認します。
対象アプリケーションにデータを絞って確認するため、アプリケーション・パースペクティブの作成を行います。
今回は2.1.2節
で設定したリソース属性値のservice.namespace
を使用します。
2.3. 取得データの確認
アプリケーションパースペクティブから 分析>呼び出し へ遷移
アプリケーションパースペクティブから 分析>呼び出し(エラー含む) へ遷移
3. 連携パターン2のセットアップ
Instanaエージェントに関すること以外はパターン1と同じ流れで進めていきます。
3.1. OpenTelemetry関連の設定
3.1.1. アプリのDLと不要な設定の削除
ファイルはgitからダウンロードできます。
git clone https://github.com/open-telemetry/opentelemetry-demo.git
cd opentelemetry-demo
docker-compose.ymlと必要なファイルが揃っているので、そのまま直ぐに動作させることが可能ですが、1.2節
の図の右側にあるJaeger, Prometheus, Grafanaあたりも動作するようになっています。
これらが起動しないように、docker-compose.ymlからコメントアウトまたは削除します。
#リソースに余裕があればそのままでも良いです。
3.1.2. リソース属性の設定
OpenTelemetry リソース・セマンティック規則(Resource Semantic Conventions)で定義されている属性を付与することで管理性を高めることができます。 Instanaではアプリケーション・パースペクティブや分析のフィルタで活用できるため設定しておきます。
vi .env
# OpenTelemetry Resource Definitions
OTEL_RESOURCE_ATTRIBUTES="service.namespace=opentelemetry-demo-kd2,service.version=1.0.2"
3.1.3. OpenTelemetry Collector Contribの設定
otelcol-config.yml
のExporterの設定を編集します。
- EndpointはInstanaエージェントになります。
- Otel Collectorがdockerコンテナの場合は、docker0のIPを指定
- Linux OSに直接インストールされている場合は、localhostを指定
- ローカルなのでTLSを無効化
- ヘッダーはパターン1と同じ
vi src/otelcollector/otelcol-config.yml
exporters.otlp
を以下の様に設定します。
exporters:
otlp:
endpoint: "172.17.0.1:4317:4317"
tls:
insecure: true
headers:
x-instana-key: "XXXXXXXXXXXXXXX"
x-instana-host: "otel-test-kd2"
設定項目 | 設定値 | 備考 |
---|---|---|
endpoint | 172.17.0.1:4317 | Instanaエージェント |
tls.insecure | true | |
headers.x-instana-key | Instanaエージェントキー | |
headers.x-instana-host | ホスト名 | 参考 |
同ファイル内service.pipelines
を以下の様に設定します。
traces
, metrics
, logs
のそれぞれのexporters
にotlp
に設定します。
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [otlp, debug, spanmetrics]
metrics:
receivers: [httpcheck/frontendproxy, otlp, spanmetrics]
processors: [filter/ottl, transform, batch]
exporters: [otlp, debug]
logs:
receivers: [otlp]
processors: [batch]
exporters: [otlp, debug]
3.1.4. 各種サービスの起動
前提条件として、Instanaエージェントがotlp/grpcでListenしている必要があります。
3.2.1. Instanaエージェントの設定
を先に実施してから次へ進みます。
docker composeコマンドで全体を起動します。
docker compose up --force-recreate --remove-orphans --detach
[+] Running 196/21
✔ shippingservice 4 layers [⣿⣿⣿⣿] 0B/0B Pulled 36.9s
✔ frontendproxy 10 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 56.7s
✔ adservice 8 layers [⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 51.1s
✔ frontend 14 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 77.3s
✔ paymentservice 7 layers [⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 46.0s
✔ featureflagservice 6 layers [⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 40.8s
✔ loadgenerator 9 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 40.0s
✔ cartservice 5 layers [⣿⣿⣿⣿⣿] 0B/0B Pulled 36.3s
✔ ffs_postgres 13 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 76.6s
✔ kafka 13 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 37.5s
✔ quoteservice 12 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 83.5s
✔ otelcol 3 layers [⣿⣿⣿] 0B/0B Pulled 29.9s
✔ opensearch 6 layers [⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 91.3s
✔ emailservice 9 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 70.3s
✔ productcatalogservice 4 layers [⣿⣿⣿⣿] 0B/0B Pulled 12.5s
✔ accountingservice 2 layers [⣿⣿] 0B/0B Pulled 32.3s
✔ frauddetectionservice 34 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 31.1s
✔ checkoutservice 2 layers [⣿⣿] 0B/0B Pulled 53.6s
✔ redis-cart 7 layers [⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 23.1s
✔ currencyservice 2 layers [⣿⣿] 0B/0B Pulled 57.3s
✔ recommendationservice 5 layers [⣿⣿⣿⣿⣿] 0B/0B Pulled 49.5s
[+] Running 22/22
✔ Network opentelemetry-demo Created 0.1s
✔ Container kafka Healthy 4.3s
✔ Container postgres Healthy 4.3s
✔ Container redis-cart Started 4.3s
✔ Container otel-col Started 4.3s
✔ Container opensearch Started 4.3s
✔ Container ad-service Started 0.1s
✔ Container email-service Started 0.1s
✔ Container product-catalog-service Started 0.1s
✔ Container payment-service Started 0.1s
✔ Container quote-service Started 0.1s
✔ Container currency-service Started 0.1s
✔ Container shipping-service Started 0.1s
✔ Container feature-flag-service Started 0.1s
✔ Container cart-service Started 0.1s
✔ Container accounting-service Started 0.1s
✔ Container frauddetection-service Started 0.1s
✔ Container recommendation-service Started 0.0s
✔ Container checkout-service Started 0.0s
✔ Container frontend Started 0.0s
✔ Container load-generator Started 0.0s
✔ Container frontend-proxy Started
正常に起動が完了したら、
http://<IPアドレス>:8080/
にアクセスして以下の画面が表示されればOKです。
ついでにデータ取得のため、画面をポチポチしておきます。
3.2. Instana関連の設定
3.2.1. Instanaエージェントの設定
InstanaエージェントのOpenTelemetryデータの受信はデフォルトで無効になっているため、有効化します。
- grpcを有効にすると4317ポートでListenします
- httpを有効にすると4318ポートでListenします
cat <<EOF > configuration_otel.yaml
com.instana.plugin.opentelemetry:
grpc:
enabled: true
http:
enabled: true
EOF
OpenTelemetryによるトレースを主とする場合、Instanaによるトレースを止めておきます。
cat <<EOF > configuration_disable-instana-tracing.yaml
com.instana.tracing:
extra-http-headers:
- traceparent
- tracestate
com.instana.plugin.javatrace:
instrumentation:
enabled: false
trace-jvms-with-problematic-agents: true
com.instana.plugin.python:
autotrace:
enabled: false
com.instana.plugin.php:
tracing:
enabled: false
com.instana.plugin.netcore:
tracing:
enabled: false
EOF
3.2.2. アプリケーション・パースペクティブの設定
Instanaで取得したデータを確認します。
対象アプリケーションにデータを絞って確認するため、アプリケーション・パースペクティブの作成を行います。
今回は3.1.2節
で設定したリソース属性値のservice.namespace
を使用します。
3.3. 取得データの確認
アプリケーション・パースペクティブ - インフラストラクチャ
インフラストラクチャ - Dockerコンテナー ダッシュボード
4. まとめ
OpenTelemetry Demo Appを使用してOpenTelemetryデータを2つのパターンで可視化を試してみました。私の所感は以下の通りです。
- OpenTelemetryで取得したトレースはOTLPプロトコルでInstanaエージェント経由またはInstanaバックエンドに直接送信が可能
- サービスの依存関係や個々のトレースなど申し分無く可視化できているように感じた(細かい連続性については引き続き確認が必要)
- Instanaバックエンドに直接送信した場合、インフラメトリックとの相関に課題ありで、引き続き確認が必要
- アプリログやスタックトレースを個々のトレースに関連付ける機能についても、引き続き確認が必要
5. おわりに
本稿ではOpenTelemetryデータをInstanaで可視化する実装について設定例を含めてまとめました。
今回はInstana向けのカスタマイズは最小限となっているので、よりInstana向けのカスタマイズを検討したり、EUM設定を入れてみたりと、機会があれば別の記事としてまとめたいと思います。
少しでも参考になれば幸いです。