10
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Instana] OpenTelemetryデータの可視化を試してみた

Last updated at Posted at 2023-12-28

1. はじめに

OpenTelemetryについて徐々に話題にあがる事も増えてきたのではないでしょうか。
Instanaは早くからOpenTelemetryをサポートすることを言及しておりましたが、実際にどの様に可視化できるのか気になっていましたので、実際に試してみました。

OpenTelemetryのWebサイトを読み漁っていたらサンプルアプリが公開されていましたので、こちらを題材にしていきたいと思います。

1.1. OpenTelemetry Demo App

OpenTelemetryコミュニティによって公開されているWebショッピングアプリです。

  • 11の言語で書かれている分散マイクロサービスアプリケーション
  • OpenTelemetryインストルメンテーションは組み込み済み
  • 様々なOpenTelemetry機能の使用例が含まれている

出典: OpenTelemetry - Demo Architecture (リンク)
image.png

1.2. OpenTelemetry Collector

対象からOpenTelemetryデータを収集し、指定のバックエンドに連携するための中継的な役割を担います。
サーバーレスの環境では、アプリから直接バックエンドにデータを送信する構成もありますが、今回は仮想サーバー上のアプリを対象とするため、OpenTelemetry Collectorを構成します。

出典: OpenTelemetry - Collector Data Flow Dashboard (リンク)
image.png

この図において、右側の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それぞれ対応しています。

image.png

otlpプロトコルで直接 Instanaバックエンドに送信できることになったことにより、従来から提供されていたOpenTelemetry Collector ContribのInstana Exporterは非推奨になりました

1.3.2. 連携パターン2

Instanaエージェント経由でInstanaバックエンドに送信します。
トレース・メトリック・ログすべて同じ方法で送信可能です。
InstanaエージェントがOTLPデータを受信し、通常のバックエンドとの通信においてOTLPデータを送信します。

image.png

メトリックデータに関しては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のそれぞれのexportersotlpに設定します。

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です。
ついでにデータ取得のため、画面をポチポチしておきます。

image.png

2.2. Instana関連の設定

2.2.1. アプリケーション・パースペクティブの設定

Instanaで取得したデータを確認します。
対象アプリケーションにデータを絞って確認するため、アプリケーション・パースペクティブの作成を行います。
今回は2.1.2節で設定したリソース属性値のservice.namespaceを使用します。

image.png
image.png
image.png

2.3. 取得データの確認

アプリケーション・パースペクティブ - サマリ
image.png

アプリケーション・パースペクティブ - 依存関係
image.png

アプリケーション・パースペクティブ - サービス
image.png

インフラストラクチャ - OpenTelemetry
image.png

アプリケーションパースペクティブから 分析>呼び出し へ遷移
image.png

アプリケーションパースペクティブから 分析>呼び出し(エラー含む) へ遷移
image.png

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のそれぞれのexportersotlpに設定します。

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です。
ついでにデータ取得のため、画面をポチポチしておきます。

image.png

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を使用します。

image.png
image.png
image.png

3.3. 取得データの確認

アプリケーション・パースペクティブ - サマリ
image.png

アプリケーション・パースペクティブ - 依存関係
image.png

アプリケーション・パースペクティブ - サービス
image.png

アプリケーション・パースペクティブ - インフラストラクチャ
image.png

インフラストラクチャ - マップ
image.png

インフラストラクチャ - ホスト ダッシュボード
image.png

インフラストラクチャ - ホスト ダッシュボード スタック
image.png
image.png

インフラストラクチャ - Dockerコンテナー ダッシュボード
image.png

インフラストラクチャ - JVM ダッシュボード
image.png

インフラストラクチャ - Redis ダッシュボード
image.png

4. まとめ

OpenTelemetry Demo Appを使用してOpenTelemetryデータを2つのパターンで可視化を試してみました。私の所感は以下の通りです。

  • OpenTelemetryで取得したトレースはOTLPプロトコルでInstanaエージェント経由またはInstanaバックエンドに直接送信が可能
  • サービスの依存関係や個々のトレースなど申し分無く可視化できているように感じた(細かい連続性については引き続き確認が必要)
  • Instanaバックエンドに直接送信した場合、インフラメトリックとの相関に課題ありで、引き続き確認が必要
  • アプリログやスタックトレースを個々のトレースに関連付ける機能についても、引き続き確認が必要

5. おわりに

本稿ではOpenTelemetryデータをInstanaで可視化する実装について設定例を含めてまとめました。
今回はInstana向けのカスタマイズは最小限となっているので、よりInstana向けのカスタマイズを検討したり、EUM設定を入れてみたりと、機会があれば別の記事としてまとめたいと思います。

少しでも参考になれば幸いです。

10
4
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
10
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?