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

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

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

## 1.1. OpenTelemetry Demo App
OpenTelemetryコミュニティによって公開されているWebショッピングアプリです。
- 11の言語で書かれている分散マイクロサービスアプリケーション
- OpenTelemetryインストルメンテーションは組み込み済み
- 様々なOpenTelemetry機能の使用例が含まれている

出典: OpenTelemetry - Demo Architecture ([リンク][1-1-1])
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/fe5b745c-1190-e060-eb80-1edce638a634.png)

[1-1-1]:https://opentelemetry.io/docs/demo/architecture/


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


出典: OpenTelemetry - Collector Data Flow Dashboard ([リンク][1-2-1])
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/6628247d-9026-b7f2-fd92-e09314ab4e1f.png)


[1-2-1]:https://opentelemetry.io/docs/demo/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それぞれ対応しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/4a97e072-87f8-31a5-8278-6ac76111d237.png)

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/df031dd9-ffa0-62b0-51e5-af024a28098b.png)

:::note info
メトリックデータに関しては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)

:::note warn
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からダウンロードできます。
```bash
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-1]を置いておきます。

[2-1-1]:https://github.com/yukikod/instana-samples/tree/main/opentelemetry_demo_app


## 2.1.2. リソース属性の設定
OpenTelemetry [リソース・セマンティック規則(Resource Semantic Conventions)][2-1-2]で定義されている属性を付与することで管理性を高めることができます。 Instanaではアプリケーション・パースペクティブや分析のフィルタで活用できるため設定しておきます。

[2-1-2]:https://opentelemetry.io/docs/specs/semconv/resource/

```bash
vi .env
```


```bash
# 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の設定を編集します。

```bash
vi src/otelcollector/otelcol-config.yml
```

`exporters.otlp`を以下の様に設定します。
```yaml
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  |ホスト名  |[参考][2-1-3]  |

同ファイル内`service.pipelines`を以下の様に設定します。
`traces`, `metrics`, `logs`のそれぞれの`exporters`に`otlp`に設定します。
```yaml
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-3]:https://www.ibm.com/docs/en/instana-observability/current?topic=opentelemetry-integrating-by-using-collector#instana-backend-requires-hostid-or-a-similar-attribute

## 2.1.4. 各種サービスの起動
docker composeコマンドで全体を起動します。
```bash
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/2b21a135-ef40-798f-011a-c6cb73cd0228.png)

# 2.2. Instana関連の設定

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


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/65b2e8e3-98ee-3a43-57aa-8e42a66e9b6d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/e0a58f93-feb6-3895-7c07-04ef8a552120.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/768425da-a2dc-6509-7b3c-c858c0696dae.png)

# 2.3. 取得データの確認
アプリケーション・パースペクティブ - サマリ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/2900629c-d945-2020-79b5-c07adf6c4350.png)

アプリケーション・パースペクティブ - 依存関係
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/b49337d4-c7b7-336c-f07f-a4a829a51d4e.png)

アプリケーション・パースペクティブ - サービス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/ff921a6c-5366-9a91-5b78-c9bf8a9d484c.png)

インフラストラクチャ - OpenTelemetry
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/03003eed-e4e7-7858-ff46-b1111147dea6.png)

アプリケーションパースペクティブから 分析>呼び出し へ遷移
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/f375572f-deb0-f761-4327-7ac2a84d199f.png)

アプリケーションパースペクティブから 分析>呼び出し(エラー含む) へ遷移
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/6a42e43f-689f-5c39-b189-9ec82cbe10b7.png)


# 3. 連携パターン2のセットアップ
Instanaエージェントに関すること以外はパターン1と同じ流れで進めていきます。

# 3.1. OpenTelemetry関連の設定
## 3.1.1. アプリのDLと不要な設定の削除
ファイルはgitからダウンロードできます。
```bash
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)][3-1-2]で定義されている属性を付与することで管理性を高めることができます。 Instanaではアプリケーション・パースペクティブや分析のフィルタで活用できるため設定しておきます。

[3-1-2]:https://opentelemetry.io/docs/specs/semconv/resource/

```bash
vi .env
```


```bash
# 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を無効化
- ヘッダーはパターン１と同じ


```bash
vi src/otelcollector/otelcol-config.yml
```

`exporters.otlp`を以下の様に設定します。

```yaml
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  |ホスト名  |[参考][3-1-3]  |

同ファイル内`service.pipelines`を以下の様に設定します。
`traces`, `metrics`, `logs`のそれぞれの`exporters`に`otlp`に設定します。
```yaml
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-3]:https://www.ibm.com/docs/en/instana-observability/current?topic=opentelemetry-integrating-by-using-collector#instana-backend-requires-hostid-or-a-similar-attribute

## 3.1.4. 各種サービスの起動
前提条件として、Instanaエージェントがotlp/grpcでListenしている必要があります。
`3.2.1. Instanaエージェントの設定`を先に実施してから次へ進みます。

docker composeコマンドで全体を起動します。
```bash
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/2b21a135-ef40-798f-011a-c6cb73cd0228.png)

# 3.2. Instana関連の設定

## 3.2.1. Instanaエージェントの設定
InstanaエージェントのOpenTelemetryデータの受信はデフォルトで無効になっているため、有効化します。
- grpcを有効にすると4317ポートでListenします
- httpを有効にすると4318ポートでListenします

```bash
cat <<EOF > configuration_otel.yaml
com.instana.plugin.opentelemetry:
  grpc:
    enabled: true
  http:
    enabled: true
EOF
```

OpenTelemetryによるトレースを主とする場合、Instanaによるトレースを止めておきます。
```bash
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/65b2e8e3-98ee-3a43-57aa-8e42a66e9b6d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/e0a58f93-feb6-3895-7c07-04ef8a552120.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/8618d1a7-3dd7-8510-e41e-ea49fcb896d6.png)


# 3.3. 取得データの確認
アプリケーション・パースペクティブ - サマリ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/22301ece-3831-4aa9-2f7a-68a3771048ba.png)

アプリケーション・パースペクティブ - 依存関係
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/6fabb0c3-11e6-5af1-ec5b-e6f21a62e36c.png)

アプリケーション・パースペクティブ - サービス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/429217cc-9a30-2bae-6121-8cc5ad782cee.png)

アプリケーション・パースペクティブ - インフラストラクチャ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/a66f3e3f-d671-843a-7176-02c2f66860d4.png)

インフラストラクチャ - マップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/4e30c8f1-198b-646f-41b6-2f66d69b89a6.png)

インフラストラクチャ - ホスト ダッシュボード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/b7e4c910-dde7-fbbf-ac41-4868e5eebde0.png)

インフラストラクチャ - ホスト ダッシュボード スタック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/2647413c-d54c-6179-c7b1-d2859800fd91.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/ea7a7d9d-77ad-684c-c057-796494f5cda6.png)

インフラストラクチャ - Dockerコンテナー ダッシュボード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/86708765-c071-0275-0e0c-6652153ae064.png)

インフラストラクチャ - JVM ダッシュボード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/2a2a46c1-0173-445d-cff2-8ac0c096322d.png)

インフラストラクチャ - Redis ダッシュボード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/f346a297-8431-c28f-be26-6f971d49c953.png)

# 4. まとめ
OpenTelemetry Demo Appを使用してOpenTelemetryデータを2つのパターンで可視化を試してみました。私の所感は以下の通りです。
- OpenTelemetryで取得したトレースはOTLPプロトコルでInstanaエージェント経由またはInstanaバックエンドに直接送信が可能
- サービスの依存関係や個々のトレースなど申し分無く可視化できているように感じた（細かい連続性については引き続き確認が必要）
- Instanaバックエンドに直接送信した場合、インフラメトリックとの相関に課題ありで、引き続き確認が必要
- アプリログやスタックトレースを個々のトレースに関連付ける機能についても、引き続き確認が必要

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

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