---
title: Adding OpenTelemetry Module to Bitnami's Zipkin Helm Chart
tags: ["OpenTelemetry", "Tracing", "Zipkin", "Bitnami", "Kubernetes", "Helm", "Cassandra"]
categories: ["Observability", "OpenTelemetry", "Zipkin"]
date: 2025-01-12T13:28:55Z
updated: 2025-01-14T01:13:54Z
---

> ⚠️ This article was automatically translated by OpenAI (gpt-4o-mini).
> It may be edited eventually, but please be aware that it may contain incorrect information at this time.

This is a note on how to add the [OpenTelemetry Module](https://github.com/openzipkin-contrib/zipkin-otel/tree/main/module) when installing Zipkin on Kubernetes using Bitnami's [Zipkin Helm Chart](https://github.com/bitnami/charts/tree/main/bitnami/zipkin).

As of the time of writing, it only supports OTLP over http/protobuf.

> [!TIP]
> The OpenTelemetry Module performs mappings of Resource Attributes to Span Tags compared to the Zipkin Exporter of the OpenTelemetry Collector.

To keep the configuration simple, we will use a service of type LoadBalancer. Feel free to change it to Ingress or other types as needed. Also, download the latest version of [zipkin-module-otel](https://mvnrepository.com/artifact/io.zipkin.contrib.otel/zipkin-module-otel). If you want to use a specific version, change the `LATEST` part to the specific version.

```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
```

Install it with the following command.

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

You will see results like the following.

```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]
> Confirmed with the following version.
> ```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
> ```

Access using the [sample application](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
```

Start the Backend.

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

Start the Frontend.

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

Access http://localhost:8080.

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

Access the Zipkin UI (in this example, http://192.168.107.200:9411).

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

By pressing the "RUN QUERY" button, you can see traces like the following.

<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" />

The Bitnami Zipkin Helm Chart uses Cassandra Storage by default to persist trace data.

With this, you can easily build an OpenTelemetry-compatible trace backend.

If you want to send data to the Zipkin OTLP endpoint from the OpenTelemetry Collector, you can add the following configuration.

```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
      # ...
# ...
```

To uninstall, use:

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