OpenShift Service Mesh 3.x + Tempo Operator + Red Hat build of OpenTelemetryで分散トレーシングの設定をしてみた

この投稿は[OpenShift Advent Calendar 2024](https://qiita.com/advent-calendar/2024/openshift)の12/22の記事です。

# 概要

2024年9月末ごろに、OpenShift Service Mesh 3.x (Sail Operator) が Technology Previewで公開されました。
OpenShift Service Mesh 3.xでは、分散トレーシングは、Tempo Operator + Red Hat build of OpenTelemetryで実施することができます。

今回は、実際にOpenShift Service Mesh 3.x + Tempo Operator + Red Hat build of OpenTelemetryで、分散トレーシングの設定をやってみたので、その際の手順をメモとして残しておきます。

:::note warn
OpenShift ServiceMesh v3は 執筆時点(2024/12/19)では Technology Preview (TP) です。
GAになるまでは実稼働環境ではサポートの観点でまだ適用できない点に注意です。
:::

> (補足)Service Mesh 2.xの分散トレーシング
> 2024/12/19時点でGAされているOpenShift Service Meshの最新のバージョンはv2.6.xです。
> Service Mesh 2.xは、分散トレーシングプラットフォーム(Jaeger)とOpenShift Elasticsearch Operatorで分散トレーシングを実施していましたが、Service Mesh 2.6が、Jaeger + Elasticsearchをサポートする最後のバージョンとなります。そのため、2.xでも今後はTempo Operator +  Red Hat build of OpenTelemetryに切り替える必要があるとの記載があります。
> 
> - [OCP 4.17 Docs / Service Mesh 2.x / Service Mesh リリースノート / 2.2.14.4. Red Hat OpenShift 分散トレーシングプラットフォーム (Tempo) と Red Hat build of OpenTelemetry との統合](https://docs.redhat.com/ja/documentation/openshift_container_platform/4.17/html/service_mesh/service-mesh-release-notes#integration-otel-tempo-ossm-2-6-0_ossm-release-notes)
> - [OCP 4.17 Docs / Service Mesh 2.x / Service Mesh リリースノート / 2.2.14.5. Red Hat OpenShift 分散トレーシングプラットフォーム (Jaeger) のデフォルト設定の変更](https://docs.redhat.com/ja/documentation/openshift_container_platform/4.17/html/service_mesh/service-mesh-release-notes#jaeger-default-setting-change-ossm-2-6-0_ossm-release-notes)
> - [OCP 4.17 Docs / Service Mesh 2.x / Service MEsh リリースノート / 2.2.22.1. Red Hat OpenShift Service Mesh 2.5 で非推奨化および削除された機能](https://docs.redhat.com/ja/documentation/openshift_container_platform/4.17/html/service_mesh/service-mesh-release-notes#deprecated-removed-features-ossm-2-5)


今回は、Tempo Operator + Red Hat build of OpenTelemetryによる分散トレーシングの設定を実施するにあたり、せっかくなので、Service Mesh 2.xではなく、Service Mesh 3.xで、実施しています。

# 参考リンク

**Qiita**
- [Qiita / もうそろそろ Openshift ServiceMesh v3 が出てきそうだし、導入してみる](https://qiita.com/Ra1nmaker/items/ea84cfedbcd51f14da73)
- [Qiita / OpenShiftでTempo Operatorを使った分散トレーシングを実現する](https://qiita.com/sato_001/items/b0292cb49ea629194cec)

**OpenShift Service Mesh 3.x Document**

- [Red Hat OpenShift Service Mesh 3.0.0tp1](https://docs.redhat.com/ja/documentation/red_hat_openshift_service_mesh/3.0.0tp1)
- [Red Hat OpenShift Service Mesh 3.0.0tp1 / 分散トレースと Service Mesh](https://docs.redhat.com/ja/documentation/red_hat_openshift_service_mesh/3.0.0tp1/html-single/observability/index#ossm-distr-tracing-assembly)

**OpenShift 4.17 Document**
- [OCP 4.17 Docs / Service Mesh](https://docs.redhat.com/ja/documentation/openshift_container_platform/4.17/html-single/service_mesh/index) 
- [OCP 4.17 Docs / 分散トレーシング / 3. distributed tracing platform (Tempo)](https://docs.redhat.com/ja/documentation/openshift_container_platform/4.17/html-single/distributed_tracing/index#dist-tracing-tempo-installing)
- [OCP 4.17 Docs / Red Hat build of OpenTelemetry](https://docs.redhat.com/ja/documentation/openshift_container_platform/4.17/html-single/red_hat_build_of_opentelemetry/index)

**Red Hat Blog**
- [Red Hat Blog / Red Hat OpenShift Service Mesh 3: Now technology preview](https://www.redhat.com/en/blog/red-hat-openshift-service-mesh-3-now-technology-preview)
- [Red Hat Blog / Red Hat OpenShift Service Mesh 3: Frequently asked questions](https://www.redhat.com/ja/blog/red-hat-openshift-service-mesh-3-frequently-asked-questions)

**Others**
- [How to deploy the new Grafana Tempo operator on OpenShift](https://developers.redhat.com/articles/2023/08/01/how-deploy-new-grafana-tempo-operator-openshift)
- [Grafana Lab / Tempo architecture](https://grafana.com/docs/tempo/latest/operations/architecture/)



# 検証環境

今回は、IBM CloudのManaged OpenShift (ROKS)で実施しています。
バージョンは4.17.5です。
また、作業用のPCにはOpenShift CLI(oc)とIstio CLI(istioctl)がすでに導入されていることを前提とします。


> (補足)Istio CLI(istioctl)のサポート
> Istio CLI(istioctl)は、Service Mesh 2.xではサポートされていませんでしたが、3.xではサポートされています。
> - [Red Hat OpenShift Service Mesh 3.0.0tp1 / OpenShift Service Mesh 2.6 から移行しているかどうかを判断する重要な情報 / 1.12. Istioctl のサポート](https://docs.redhat.com/ja/documentation/red_hat_openshift_service_mesh/3.0.0tp1/html-single/migrating_from_openshift_service_mesh_2.6/index#ossm-migrating-read-me-support-for-istioctl_ossm-migrating-read-me-assembly)

```zsh
Mac: ~ % oc version
Client Version: 4.17.5
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: 4.17.5
Kubernetes Version: v1.30.5
Mac: ~ %
Mac: ~ % istioctl version
client version: 1.24.2
control plane version: 1.24.1_ossm_tp.2
data plane version: 1.24.1 (13 proxies)
Mac: ~ %
```


# 最終的な構成

今回の手順で使用したOperatorは以下のバージョンになります。

| Operator                         | Channel      | 更新承認ストラテジー | CSV                                | 備考        |
|:---------------------------------|:-------------|:---------------|:-----------------------------------|:------------|
| Red Hat OpenShift Service Mesh 3 | `candidates` | Automatic      | `servicemeshoperator3.v3.0.0-tp.2` | テクノロジープレビュー |
| Tempo Operator                   | `stable`     | Manual         | `tempo-operator.v0.14.1-1`         |             |
| Red Hat build of OpenTelemetry   | `stable`     | Manual         | `0.113.0-1`                        |             |



# 手順の流れ

OpenShift Service Mesh 3.x + Tempo Operator + Red Hat build of OpenTelemetryで、分散トレーシングの設定をする手順の流れは以下のようになります。


**1. Istio(OpenShift Service Mesh 3)のインストール**

- [(1) OpenShift Service Mesh 3.xの導入](#1-openshift-service-mesh-3xの導入)

**2. 分散トレースプラットフォーム(Tempo)のインストール**

- [(1) Tempo Operatorの導入](#1-tempo-operatorの導入)
- [(2) TempoMoniliticインスタンスの作成](#2-tempomoniliticインスタンスの作成)

**3. 分散トレースデータ収集(OpenTelemetry)のインストール**

- [(1) Red Hat build of OpenTelemetry Operatorの導入](#1-red-hat-build-of-opentelemetry-operatorの導入)

**4. サービスメッシュを使用したRed Hat OpenShift分散トレースデータ収集の設定**

- [(1) OpenTelemetry Collectorの作成(kind: OpenTelemetryCollector)](#1-opentelemetry-collectorの作成kind-opentelemetrycollector)
- [(2) Istio Controllerの設定(kind: Istio)](#2-istio-controllerの設定kind-istio)
- [(3) Telemetry APIの設定(kind: Telemetry)](#3-telemetry-apiの設定kind-telemetry)

**5. 分散トレーシングの確認**

- [(1) サンプルアプリのデプロイ(Bookinfo)](#1-サンプルアプリのデプロイbookinfo)
- [(2) 分散トレーシングの確認(Jaeger UI)](#2-分散トレーシングの確認jaeger-ui)


# 実施の手順

## 1. Istio(OpenShift Service Mesh 3)のインストール

### (1) OpenShift Service Mesh 3.xの導入

まず、OCP 4.17.5に、Red Hat OpenShift Service Mesh 3 Operatorを導入します。

Red Hat OpenShift Service Mesh 3 Operatorの導入と、Service Mesh(Istio)のControl Plane(istiod)の初期設定、アプリケーションを公開するためのIngress Gatewayの作成は、以下の手順を参考に事前に作成しておきます。

- [Qiita / もうそろそろ Openshift ServiceMesh v3 が出てきそうだし、導入してみる](https://qiita.com/Ra1nmaker/items/ea84cfedbcd51f14da73)
  - [Step 1. Operatorを導入する](https://qiita.com/Ra1nmaker/items/ea84cfedbcd51f14da73#step-1-operator%E3%82%92%E5%B0%8E%E5%85%A5%E3%81%99%E3%82%8B)
  - [Step 2. Control Planeのセットアップ](https://qiita.com/Ra1nmaker/items/ea84cfedbcd51f14da73#step-2-control-plane%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97)
  - [Step 3. Ingress Gatewayの作成](https://qiita.com/Ra1nmaker/items/ea84cfedbcd51f14da73#step-3-ingress-gateway%E3%81%AE%E4%BD%9C%E6%88%90)



## 2. 分散トレースプラットフォーム(Tempo)のインストール

### (1) Tempo Operatorの導入
### (2) TempoMoniliticインスタンスの作成

分散トレーシングの機能を提供する分散トレースプラットフォームとしてTempo Operatorを導入します。

Tempo Operator導入後に、Tempoのインスタンスを作成します。

Tempoのインスタンスは以下の2つの導入方法があります。

- `TempoStack`: Tempoを構成する複数のコンポーネントをマイクロサービスモードで導入するカスタムリソース
  - (Gateway、Distributor、Ingester、Query Frontend、Querier、Compactorなど、Tempoデプロイメントの各コンポーネントが、マイクロサービスとして導入される)
- `TempoMonolitic`: Tempoを構成する複数のコンポーネントをモノリシックモードで導入するカスタムリソース
  - (Gateway、Distributor、Ingester、Query Frontend、Querier、Compactorなど、Tempoデプロイメントの各コンポーネントが、単一のコンテナーに含まれる)


`TempoMonolitic`の方がインストールが簡単ですが、現在Technology Previewのステータスです。
今回は検証目的なので、`TempoMonolitic`で導入しています。


また、`TempoStack`、`TempoMonolitic`のいずれの場合も、分散トレースデータの保存先としてオブジェクトストレージが必要です。

サポートされるオブジェクトストレージは、現在は、Red Hat OpenShift Data Foundation、MinIO、Amazon S3、Azure Blob Storage、Google Cloud Storage となります。
(`TempoMonolitic`の場合は、オブジェクトストレージ以外にも、インメモリーストレージ、永続ボリュームも利用可能。)

- [OCP 4.17 Docs / 分散トレーシング / 3. distributed tracing platform (Tempo) / 3.1.2. TempoStack インスタンスのインストール ](https://docs.redhat.com/ja/documentation/openshift_container_platform/4.17/html-single/distributed_tracing/index#installing-a-tempostack-instance)
- [OCP 4.17 Docs / 分散トレーシング / 3. distributed tracing platform (Tempo) / 3.1.3. TempoMonolithic インスタンスのインストール](https://docs.redhat.com/ja/documentation/openshift_container_platform/4.17/html-single/distributed_tracing/index#installing-a-tempomonolithic-instance)


今回はIBM CloudのROKS環境を使っているため、(サポートはないですが)IBM Cloud Object Storage(ICOS)をTempoのバックエンドのストレージとして構成して検証しました。
具体的な手順は以下の記事をご参照ください。
- [Qiita / OpenShiftでTempo Operatorを使った分散トレーシングを実現する](https://qiita.com/sato_001/items/b0292cb49ea629194cec)

今回は以下のマニフェストで`TempoMonolithic`インスタンスを作成しています。
```Yaml:TempoMonolithic-sample.yaml
apiVersion: tempo.grafana.com/v1alpha1
kind: TempoMonolithic
metadata:
  name: sample
  namespace: sample-tempo-monolithic
spec:
  jaegerui:
    enabled: true
    route:
      enabled: true
  storage:
    traces:
      backend: s3
      s3:
        secret: sample-tempo-monolithic-cos-secret
      size: 10Gi
```


## 3. 分散トレースデータ収集(OpenTelemetry)のインストール

### (1) Red Hat build of OpenTelemetry Operatorの導入

分散トレースデータを収集するため、Red Hat build of OpenTelemetry Operatorを導入します。

- [OCP 4.17 Docs / Red Hat build of OpenTelemetry](https://docs.redhat.com/ja/documentation/openshift_container_platform/4.17/html-single/red_hat_build_of_opentelemetry/index)


OCP コンソールにcluster-admin roleのある管理者ユーザーでログインし、左側のメニューからOperator -> OperatorHubを選択します。

検索ボックスで「OpenTelemetry」という文字列を入力して、「Red Hat build of OpenTelemetry Operator」をクリックします。

![2024-12-21-21-45-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/f4949265-d2cf-fffb-260d-478e8ebff692.png)


「Red Hat build of OpenTelemetry Operator」画面で、「インストール」をクリックします。

![2024-12-21-21-46-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/23fce767-1b71-7fbc-fcc3-7deb354d29d2.png)


「Operatorのインストール」ページで、「更新チャネル」や「バージョン」などのフィールドは以下のように設定しました。
設定をしたら「インストール」をクリックします。

| 設定項目                                             | デフォルト値                                                     | 設定値   | 備考                                                                                                                                                        |
|:-----------------------------------------------------|:------------------------------------------------------------|:---------|:------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 更新チャネル                                             | `stable`                                                    | デフォルトのまま |                                                                                                                                                             |
| バージョン                                                | `0.113.0-1`                                                   | デフォルトのまま | 2024/12/21の最新                                                                                                                                             |
| インストールモード                                            | クラスターのすべてのnamespace (デフォルト)                                 | デフォルトのまま |                                                                                                                                                             |
| インストール済みのnamespace                                  | Operator推奨のnamespace (`openshift-opentelemetry-operator`) | デフォルトのまま |                                                                                                                                                             |
| この namespace で Operator で推奨されるクラスターモニタリングを有効化する | チェックされていない                                                  | チェック     | Option                                                                                                                                                      |
| 更新の承認                                            | 自動                                                        | 手動     | (※)実案件ではコンポーネントのバージョンは明確に管理する必要があったり、アップデートするタイミングを業務外にする必要があることがあります。<br>そのような場合には、自動でチャネル内の最新のパッチバージョンに更新されないようにするため「手動」にしたりします。 |

![2024-12-21-21-48-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/e2e3db21-1242-2b8b-94b7-a7aa19d62ea9.png)


「承認」をクリックします。

![2024-12-21-21-48-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/a568fd51-17f2-e348-6d97-12016a0c0043.png)

`openshift-opentelemetry-operator` namespaceに `Red Hat build of OpenTelemetry Operator`がインストールされたことを確認します。

![2024-12-21-21-49-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/a183955a-6696-3a4f-b55a-e4d532b5f630.png)
![2024-12-21-21-49-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/c548487d-48e6-3170-c1e6-4c1bf70ba875.png)




```zsh
Mac: ~ % oc get pod -n openshift-opentelemetry-operator
NAME                                                         READY   STATUS    RESTARTS   AGE
opentelemetry-operator-controller-manager-6d7c77b6bc-nzmtg   2/2     Running   0          5m27s
Mac: ~ %
```


## 4. サービスメッシュを使用した分散トレースデータ収集の設定

以下のリンクに従って、サービスメッシュを使用した分散トレースデータ収集の設定を実施します。

- [Red Hat OpenShift Service Mesh 3.0.0tp1 / 3. 分散トレースと Service Mesh / 3.1. Service Mesh を使用した Red Hat OpenShift 分散トレースプラットフォームの設定](https://docs.redhat.com/ja/documentation/red_hat_openshift_service_mesh/3.0.0tp1/html-single/observability/index#ossm-distr-tracing-assembly)
- [Red Hat OpenShift Service Mesh 3.0.0tp1 / 3. 分散トレースと Service Mesh / 3.1. Service Mesh を使用した Red Hat OpenShift 分散トレースプラットフォームの設定 / 3.1.1. サービスメッシュを使用した Red Hat OpenShift 分散トレースデータ収集の設定](https://docs.redhat.com/ja/documentation/red_hat_openshift_service_mesh/3.0.0tp1/html-single/observability/index#ossm-config-otel_ossm-traces-assembly)


### (1) OpenTelemetry Collectorの作成(kind: OpenTelemetryCollector)

OpenTelemetry Collectorの導入と設定をします。

Service MeshのControll Planeを導入した`istio-system` namespaceに「OpenTelemetry Collector」を導入します。

- `OpenTelemetryCollector`リソースを`istio-sytem` namespaceに作成します。
- `.spec.config.service.pipelines.traces`の`exporters`と`receivers`を`otlp`に設定しています。
- `.spec.config.exporters`では、`otlp`を指定し、`endpoint`として、「[2-(2) TempoMoniliticインスタンスの作成](#2-tempomoniliticインスタンスの作成)」で導入したTempoMonoliticインスタンス(`tempo-sample`)のServiceのホスト名を指定します。

  ```zsh
  Mac: ~ % oc get svc -n sample-tempo-monolithic
  NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                                  AGE
  tempo-sample            ClusterIP   172.21.20.215   <none>        3200/TCP,4317/TCP,4318/TCP               44h
  tempo-sample-jaegerui   ClusterIP   172.21.225.7    <none>        16685/TCP,16686/TCP,16687/TCP,8443/TCP   44h
  Mac: ~ %
  ```

OpenTelemetry Collectorのマニフェストファイルのサンプルは以下になります。

```yaml:OpenTelemetryCollector-otel.yaml
kind: OpenTelemetryCollector
apiVersion: opentelemetry.io/v1beta1
metadata:
  name: otel
  namespace: istio-system
spec:
  observability:
    metrics: {}
  deploymentUpdateStrategy: {}
  config:
    exporters:
      otlp:
        endpoint: 'tempo-sample.sample-tempo-monolithic.svc.cluster.local:4317'
        tls:
          insecure: true
    receivers:
      otlp:
        protocols:
          grpc:
            endpoint: '0.0.0.0:4317'
          http: {}
    service:
      pipelines:
        traces:
          exporters:
            - otlp
          receivers:
            - otlp
```

作成したマニフェストファイルを適用します。
```zsh
Mac: Qiita-OTLM-Tempo % oc get OpenTelemetryCollector -n istio-system
No resources found in istio-system namespace.
Mac: Qiita-OTLM-Tempo %
Mac: Qiita-OTLM-Tempo % oc apply -f OpenTelemetryCollector-otel.yaml
opentelemetrycollector.opentelemetry.io/otel created
Mac: Qiita-OTLM-Tempo %
Mac: Qiita-OTLM-Tempo % oc get OpenTelemetryCollector -n istio-system
NAME   MODE         VERSION   READY   AGE   IMAGE                                                                                                                             MANAGEMENT
otel   deployment   0.113.0   1/1     28s   registry.redhat.io/rhosdt/opentelemetry-collector-rhel8@sha256:2656a6c8c4d499f64b331f4043b05147ad43a9cf1ba8d6ff97fdf0ac83680b6a   managed
Mac: Qiita-OTLM-Tempo %
```

OpenTelemetry Collectorが導入されました。
```zsh
Mac: Qiita-OTLM-Tempo % oc get deploy -n istio-system
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
istiod           1/1     1            1           3d3h
kiali            1/1     1            1           3d1h
otel-collector   1/1     1            1           91s
Mac: Qiita-OTLM-Tempo %
Mac: Qiita-OTLM-Tempo % oc get pod -n istio-system
NAME                              READY   STATUS    RESTARTS   AGE
istiod-54746b5db6-cqqzr           1/1     Running   0          3d3h
kiali-d4798656d-v7wsq             1/1     Running   0          3d1h
otel-collector-5d69c78c66-dc9v7   1/1     Running   0          101s
Mac: Qiita-OTLM-Tempo %
```


### (2) Istio Controllerの設定(kind: Istio)

Istio Controllerで、トレーシングを有効にします。

「[1-(1) OpenShift Service Mesh 3.xの導入](#1-openshift-service-mesh-3xの導入)」欄の[Step 2. Control Planeのセットアップ](https://qiita.com/Ra1nmaker/items/ea84cfedbcd51f14da73#step-2-control-plane%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97)のリンク先で作成した`Istio`リソースを編集します。


  ```zsh
  oc get Istio -n istio-system
  ```

編集内容は以下になります。
- `spec.values.meshConfig`の`extentionsProviders`で`opentelemetry`を指定することによってOpenTelemetry形式でのトレーシングを利用することができます。
- OpenTelemetryの`service`として、前の[4-(1) OpenTelemetry Collectorの作成(kind: OpenTelemetryCollector)](#1-opentelemetry-collectorの作成kind-opentelemetrycollector)の手順で、`istio-system` namespaceに作成した、OpenTelemtry CollectorのService (`otel-collector`)を指定します。


実際に修正をします。修正箇所はコメントの部分になります。
```zsh
Mac: ~ % oc edit Istio default -n istio-system
istio.sailoperator.io/default edited
```
```yaml
apiVersion: sailoperator.io/v1alpha1
kind: Istio
metadata:
#(略)
  name: default
spec:
  namespace: istio-system
#(略)
  values:
    meshConfig:
      ### 以下のトレーシングに関する定義を追加する
      enableTracing: true
      extensionProviders:
      - name: otel-tracing
        opentelemetry:
          port: 4317
          service: otel-collector.istio-system.svc.cluster.local
      ### 追加はここまで
```


### (3) Telemetry APIの設定(kind: Telemetry) 

`Istio`の`spec.values.meshConfig.extentionsProviders`で設定した内容を、Telemetry APIを利用して有効化させます。

- `Istio`と同じ`istio-systme` namespaceに`Telemetry`リソースを作成します。
- `.spec.tracing.providers`には、前の手順で指定した`Istio`の`extensionProvider`の`name`を指定します。

マニフェストファイルのサンプルは以下になります。

```yaml:Telemetry-otel-demo.yaml
apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
  name: otel-demo
  namespace: istio-system
spec:
  tracing:
    - providers:
        - name: otel-tracing
      randomSamplingPercentage: 100
```

:::note info
トレースが表示されることを確認したら、`randomSamplingPercentage`の値を減らすか、`default`に設定してリクエストの数を減らすことができます。
:::

作成したマニフェストファイルを適用します。

```zsh
Mac: Qiita-OTLM-Tempo % oc get Telemetry -n istio-system
No resources found in istio-system namespace.
Mac: Qiita-OTLM-Tempo %
Mac: Qiita-OTLM-Tempo % oc apply -f Telemetry-otel-demo.yaml
telemetry.telemetry.istio.io/otel-demo created
Mac: Qiita-OTLM-Tempo %
Mac: Qiita-OTLM-Tempo % oc get Telemetry -n istio-system
NAME        AGE
otel-demo   5s
Mac: Qiita-OTLM-Tempo %
```



## 5. 分散トレーシングの確認

OpenShift Service Mesh 3.x (Sail Operator) + Tempo Operator + Red Hat build of OpenTelemetryで、サービスメッシュを使用した分散トレースデータ収集の設定ができたので、実際にトレースが取得できているかを確認します。

### (1) サンプルアプリのデプロイ(Bookinfo)

「[Istio Docs / Bookinfo Application](https://istio.io/latest/docs/examples/bookinfo/)」に記載のBookinfoのサンプルアプリをデプロイします。


**1. アプリケーションのProject(Namespace)の作成**

今回はIstioは`InPlace`ストラテジーで導入しているため、アプリケーションをデプロイするnamespaceに`istio-injection=enabled`のラベルを付与します。
(`RevisionBased`ストラテジーの場合は、[3.1.1. サービスメッシュを使用した Red Hat OpenShift 分散トレースデータ収集の設定](https://docs.redhat.com/ja/documentation/red_hat_openshift_service_mesh/3.0.0tp1/html-single/observability/index#ossm-config-otel_ossm-traces-assembly)の手順5を参照。)


```zsh
# Projectの作成
Mac: Qiita-bookinfo-test % oc new-project app-test
Now using project "app-test" on server "https://c100-e.jp-tok.containers.cloud.ibm.com:30595".
(略)

# istio-injectionラベルを付与
Mac: Qiita-bookinfo-test % oc label ns app-test istio-injection=enabled
namespace/app-test labeled
```

**2. Deployment & Servcieの作成**

以下のマニフェストファイルをダウンロードして適用します。
- [samples/bookinfo/platform/kube/bookinfo.yaml](https://raw.githubusercontent.com/istio/istio/release-1.24/samples/bookinfo/platform/kube/bookinfo.yaml)


```zsh
Mac: Qiita-bookinfo-test % oc apply -f bookinfo.yaml -n app-test
service/details created
serviceaccount/bookinfo-details created
deployment.apps/details-v1 created
service/ratings created
serviceaccount/bookinfo-ratings created
deployment.apps/ratings-v1 created
service/reviews created
serviceaccount/bookinfo-reviews created
deployment.apps/reviews-v1 created
deployment.apps/reviews-v2 created
deployment.apps/reviews-v3 created
service/productpage created
serviceaccount/bookinfo-productpage created
deployment.apps/productpage-v1 created
```

**3. Gateway & VirtualServiceリソースの作成**

以下のマニフェストファイルをダウンロードして適用します。
(今回はKubernetes Gateway APIではなく、IstioのGateway APIを使用しています。)

<アプリアクセスのためのFSQNを指定>の部分は環境に合わせて設定します。
(例: bookinfo-test.<ドメイン名>)

```yaml:istio-gateway-http.yaml
apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
  name: bookinfo-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - hosts:
    - <アプリアクセスのためのFSQNを指定>
    port:
      name: http2
      number: 80
      protocol: HTTP
---
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: bookinfo-test
spec:
  hosts:
  - <アプリアクセスのためのFSQNを指定>
  gateways:
  - bookinfo-gateway
  http:
  - match:
    - uri:
        exact: /productpage
    - uri:
        prefix: /static
    - uri:
        exact: /login
    - uri:
        exact: /logout
    - uri:
        prefix: /api/v1/products
    route:
    - destination:
        host: productpage
        port:
          number: 9080
```

作成したマニフェストファイルを適用します。
```zsh
Mac: Qiita-bookinfo-test % oc apply -f istio-gateway-http.yaml -n app-test
gateway.networking.istio.io/bookinfo-gateway created
virtualservice.networking.istio.io/bookinfo-test created
```

```zsh
Mac: Qiita-bookinfo-test % oc get gateway -n app-test
NAME               AGE
bookinfo-gateway   34s
Mac: Qiita-bookinfo-test %
Mac: Qiita-bookinfo-test % oc get virtualservice -n app-test
NAME            GATEWAYS               HOSTS                             AGE
bookinfo-test   ["bookinfo-gateway"]   ["bookinfo-test.<domane name>"]   47s
Mac: Qiita-bookinfo-test %
```

**4. Routeリソースの作成**

本当はRouter経由で公開しなくても別途LBを立てて直接Ingress Gatewayにアクセスでも良いのですが、本記事ではRouter経由でアプリケーションにアクセスすることにします。

以下のようなyamlファイルを用意します。

```yaml:route-bookinfo-test.yaml
kind: Route
apiVersion: route.openshift.io/v1
metadata:
  name: bookinfo-gateway-test
  namespace: istio-ingress
spec:
  host: <アプリアクセスのためのFSQNを指定>
  to:
    kind: Service
    name: istio-ingressgateway
    weight: 100
  port:
    targetPort: http2
  wildcardPolicy: None
```

作成したマニフェストファイルを適用します。
```zsh
Mac: Qiita-bookinfo-test % oc apply -f route-bookinfo-http.yaml
route.route.openshift.io/bookinfo-gateway-test created
Mac: Qiita-bookinfo-test %
Mac: Qiita-bookinfo-test % oc get route -n istio-ingress bookinfo-gateway-test
NAME                    HOST/PORT                     PATH   SERVICES               PORT    TERMINATION   WILDCARD
bookinfo-gateway-test   bookinfo-test.<domain name>          istio-ingressgateway   http2                 None
Mac: Qiita-bookinfo-test %
```

**5. アプリケーションへのアクセス**

トレースを生成するために、Route経由で何回かアプリに何回かアクセスしてみます。

- URL: `http://bookinfo-test.<domain name>/productpage`

![2024-12-21-21-51-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/ac9fae2e-f26c-55b4-c0a9-f2e7645d2aeb.png)



### (2) 分散トレーシングの確認(Jaeger UI)

トレースが取得できているかを確認します。

Tempo Operatorでは、TempoStackまたはTempoMonoliticリソースを導入する際にJaeger UIも一緒に導入できます。
今回は[2-(2) TempoMoniliticインスタンスの作成](#2-tempomoniliticインスタンスの作成)の手順で作成したTempoMonoliticリソースで、すでにJaeger UIが有効化されRouteも作成されています。

```yaml
apiVersion: tempo.grafana.com/v1alpha1
kind: TempoMonolithic
# (略)
spec:
  jaegerui:
    enabled: true
    route:
      enabled: true
# (略)
```

このJaeger UIを利用して、トレース情報が取得できているかを確認します。
Jaeger UIのRouteは、TempoMonoliticを導入したnamespaceにあります。

```zsh
Mac: Qiita-bookinfo-test % oc get route -n sample-tempo-monolithic
NAME                    HOST/PORT                                                     PATH   SERVICES                PORT          TERMINATION   WILDCARD
tempo-sample-jaegerui   tempo-sample-jaegerui-sample-tempo-monolithic.<domain name>          tempo-sample-jaegerui   oauth-proxy   reencrypt     None
```

または、OCP コンソールの左側のメニューからネットワーク -> Routeを選択し、左上でプロジェクトをTempMonoliticリソースを作成したnamespaceに変更して、tempo-sample-jaegeruiのrouteのリンクをクリックします。

![2024-12-21-21-51-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/85e31e5e-8b73-7988-c176-6016aa046af3.png)


Jaeger UIが表示されます。

![2024-12-21-21-52-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/2b5f9ea2-192a-efc1-fa81-b7c7a6b54329.png)


トレース情報が取得できている場合は、「Service」のプルダウンで、いくつかエントリーが表示されます。

![2024-12-21-21-52-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/f2a17349-b911-f5cf-185f-11350e925e43.png)


例として「productpage.app-test」や「details.app-test」などを選択して、「Find Trages」をクリックします。
それぞれトレース情報が表示されます。

「productpage.app-test」
![2024-12-21-21-54-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/a835612a-8e1f-f3e0-cfb5-dee54b08c492.png)
![2024-12-21-21-55-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/da49ee90-99c0-cf44-dac7-1238e1572c8b.png)


「details.app-test」
![2024-12-21-21-55-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/6edef154-6c4b-de51-0b98-47a742b0cb64.png)
![2024-12-21-21-55-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/e50755f7-ab92-da29-88ea-55177c7d0d4d.png)


# まとめ

OpenShift Service Mesh 3.x + Tempo Operator + Red Hat build of OpenTelemetryで、分散トレーシングの設定をやってトレース情報が取得できることを確認しました。

Service Mesh 2.6からは、Tempo Operator + Red Hat build of OpenTelemetryが推奨になっていますが、今まですでにService Mesh 2.xを使われている方はJaeger + Elasticsearchで分散トレーシングを実装しているのではないかなと思います。

Tempo Operator + Red Hat build of OpenTelemetry導入や設定方法はドキュメントの場所がいくつかに分かれているので少し大変ですが、3.xのドキュメントは(まだTPですが)、設定方法が前よりもわかりやすく記載されていたので、実際にやってみて一連の流れが整理できたかなと思います。