---
title: BitnamiのZipkin Helm ChartにOpenTelemetry Moduleを追加するメモ
tags: ["OpenTelemetry", "Tracing", "Zipkin", "Bitnami", "Kubernetes", "Helm", "Cassandra"]
categories: ["Observability", "OpenTelemetry", "Zipkin"]
date: 2025-01-12T13:28:55Z
updated: 2025-01-22T15:06:25Z
---

Bitnamiの[Zipkin Helm Chart](https://github.com/bitnami/charts/tree/main/bitnami/zipkin)を使ってZipkinをKubernetesにインストールする際に、
[OpenTelemetry Module](https://github.com/openzipkin-contrib/zipkin-otel/tree/main/module)を追加する設定のメモです。

執筆時点では、OTLPのhttp/protobufにのみ対応しています。

> [!TIP]
> OpenTelemetry ModuleはOpenTelemetry CollectorのZipkin Exporterに比べて、Resource AttributesのSpan Tagへのマッピングなどが行われます。

ここでは設定をシンプルにするために、type=LoadBalancerのサービスを使います。必要に応じてIngressなどに変えてください。
また、[zipkin-module-otel](https://mvnrepository.com/artifact/io.zipkin.contrib.otel/zipkin-module-otel)は最新版をダウンロードします。特定のバージョンを使用したい場合は、`LATEST`の部分を特定バージョンに変更してください。

```yaml
cat <<EOF > helm-values.yaml
---
service:
  type: LoadBalancer
extraEnvVars:
- name: MODULE_OPTS
  value: "-Dloader.path=/modules/otel -Dspring.profiles.active=otel"
initContainers:
- name: download-modules
  image: nicolaka/netshoot
  command: [ "sh" ]
  args:
  - -cex
  - |
    curl -sSL https://zipkin.io/quickstart.sh | bash -s io.zipkin.contrib.otel:zipkin-module-otel:LATEST:module otel.jar
    mkdir -p /modules/otel
    mv otel.jar /modules/otel/
  volumeMounts:
  - name: modules
    mountPath: /modules
- name: unjar-modules
  image: bitnami/java
  command: [ "sh" ]
  args:
  - -cex
  - |
    cd /modules/otel
    jar -xf otel.jar
    rm -f otel.jar
  volumeMounts:
  - name: modules
    mountPath: /modules
extraVolumes:
- name: modules
  emptyDir: { }
extraVolumeMounts:
- name: modules
  mountPath: /modules
---
EOF
```

次のコマンドでインストールします。

```bash
helm upgrade --install -n zipkin zipkin oci://registry-1.docker.io/bitnamicharts/zipkin -f helm-values.yaml --create-namespace --wait
```

次のような結果になります。

```bash
$ kubectl get pod,svc,pvc -n zipkin 
NAME                          READY   STATUS    RESTARTS   AGE
pod/zipkin-7d94745468-dsg47   1/1     Running   0          15m
pod/zipkin-cassandra-0        1/1     Running   0          165m

NAME                                TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)                               AGE
service/zipkin                      LoadBalancer   10.96.104.206   192.168.107.200   9411:31180/TCP                        165m
service/zipkin-cassandra            ClusterIP      10.96.142.204   <none>            9042/TCP                              165m
service/zipkin-cassandra-headless   ClusterIP      None            <none>            7000/TCP,7001/TCP,7199/TCP,9042/TCP   165m

NAME                                            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
persistentvolumeclaim/data-zipkin-cassandra-0   Bound    pvc-21954a68-55ef-4cba-ad4d-58b751747ac5   8Gi        RWO            standard       <unset>                 165m
```

> [!NOTE]
> 次のバージョンで確認しました。
> ```bash
> $ helm list -n zipkin
> NAME  	NAMESPACE	REVISION	UPDATED                             	STATUS  	CHART       	APP VERSION
> zipkin	zipkin   	1       	2025-01-12 22:05:17.002935 +0900 JST	deployed	zipkin-1.1.1	3.4.4
> ```

[サンプルアプリ](https://github.com/making/demo-zipkin-otel)を使ってアクセスします。

```bash
git clone https://github.com/making/demo-zipkin-otel
cd demo-zipkin-otel
./mvnw clean install -DskipTests
```

Backendを起動します。

```bash
java -jar backend/target/backend-0.0.1-SNAPSHOT.jar --management.zipkin.tracing.endpoint=http://192.168.107.200:9411/v1/traces
```

Frontendを起動します。

```bash
java -jar frontend/target/frontend-0.0.1-SNAPSHOT.jar --management.zipkin.tracing.endpoint=http://192.168.107.200:9411/v1/traces
```

http://localhost:8080 にアクセスします。

<img width="1024" alt="image" src="https://github.com/user-attachments/assets/a572b5c8-a90c-444c-af51-40358c8ae510" />

Zipkin UI (この例では http://192.168.107.200:9411) にアクセスします。

<img width="1024" alt="image" src="https://github.com/user-attachments/assets/ac47645b-4304-4eb8-87d0-79fdc80dd066" />

"RUN QUERY"ボタンを押すと、次のようなTraceを確認できます。

<img width="1024" alt="image" src="https://github.com/user-attachments/assets/bd6167f6-754c-4736-8cac-2c542f6e897a" />

<img width="1024" alt="image" src="https://github.com/user-attachments/assets/1134c200-2262-4877-a672-2dbf7b5639f2" />

BitnamiのZipkin Helm ChartはデフォルトでCassandra Storageを使用してTraceデータを永続化します。

これで簡単にOpenTelemetry対応のTraceバックエンドを構築できました。

OpenTelemetry CollectorからZipkinのOTLPエンドポイントに送りたい場合は、次のような設定を追加すれば良いです。

```yaml
# ...
exporters:
  otlphttp/zipkin:
    endpoint: http://zipkin.zipkin.svc.cluster.local:9411
    compression: gzip
    tls:
      insecure: true
    # ...
# ...
service:
  pipelines:
    traces:
      receivers:
      - otlp
      # ...
      processors:
      # ...
      exporters:
      - otlphttp/zipkin
      # ...
# ...
```


アンインストールしたい場合は

```bash
helm uninstall -n zipkin zipkin
```
