---
title: Rocky LinuxへのOTLPに対応したZipkinのインストールとサービス化するメモ
tags: ["Zipkin", "OpenTelemetry", "Tracing", "Rocky", "Systemd", "Java"]
categories: ["Observability", "OpenTelemetry", "Zipkin"]
date: 2025-02-26T01:21:27Z
updated: 2025-02-26T01:35:43Z
---

本記事では、Rocky Linux 8にOTLPに対応した[Zipkin](https://zipkin.io/)をインストールし、systemdサービスとして実行する方法を説明します。

OTLPに対応したTracing BackendはDockerを使えば簡単に立ち上げられますが、Air-gappedなどでDockerのインストールやコンテナの起動に手間がかかる環境で、手軽にOTLPを試したい時に使えると思います。

**目次**
<!-- toc -->

### 前提条件

* Rocky Linux 8+
* Java 17+

### Javaのインストール

Rocky Linux 8にJavaをインストールしていない場合は、以下のコマンドでインストールできます。

```bash
sudo dnf install -y java-17-openjdk
```

インストールされたJavaのバージョンを確認します。

```bash
java -version
```

次のような出力が表示されます。

```
openjdk version "17.0.14" 2025-01-21 LTS
OpenJDK Runtime Environment (Red_Hat-17.0.14.0.7-1) (build 17.0.14+7-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-17.0.14.0.7-1) (build 17.0.14+7-LTS, mixed mode, sharing)
```

### Zipkinのインストール

> [!TIP]
> この記事ではメモリ内ストレージを使用します。JVMのヒープサイズは必要に応じて調整することができます。
> 保存するトレース量に応じてヒープサイズを適切なサイズに設定してください。

#### Zipkinのダウンロード

Zipkinの最新バージョンをダウンロードします。

```bash
curl -sSL https://zipkin.io/quickstart.sh | bash -s
```

このコマンドは`zipkin.jar`をカレントディレクトリにダウンロードします。

次にZipkinのOTel Moduleをダウンロードします。

```bash
curl -sSL https://zipkin.io/quickstart.sh | bash -s io.zipkin.contrib.otel:zipkin-module-otel:LATEST:module otel.jar
```

このコマンドは`otel.jar`をカレントディレクトリにダウンロードします。

#### サービスユーザーの作成

Zipkinを実行するための専用ユーザーを作成します。

```bash
sudo useradd -r -s /sbin/nologin zipkin
```

#### Zipkinファイルの配置

Zipkinの実行ファイルを適切な場所に配置します。

```bash
sudo mkdir -p /opt/zipkin
sudo mv zipkin.jar /opt/zipkin/
sudo mv otel.jar /opt/zipkin/
sudo chown -R zipkin:zipkin /opt/zipkin
```

### systemdサービスの設定

Zipkinをsystemdサービスとして登録します。必要に応じて、メモリ設定やポート番号を環境に合わせて調整してください。

```bash
sudo tee /etc/systemd/system/zipkin.service << 'EOF'
[Unit]
Description=Zipkin Server
After=network.target

[Service]
Type=simple
User=zipkin
Group=zipkin
Environment="JAVA_OPTS=-Xms512m -Xmx1g -XX:+ExitOnOutOfMemoryError -Dloader.path='otel.jar,otel.jar!/lib' -Dspring.profiles.active=otel"
Environment="MEM_MAX_SPANS=10000"

NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
PrivateDevices=true

WorkingDirectory=/opt/zipkin
ExecStart=/usr/bin/java $JAVA_OPTS -cp /opt/zipkin/zipkin.jar org.springframework.boot.loader.launch.PropertiesLauncher
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
EOF
```

#### サービスの有効化と起動

作成したサービスを有効化し、起動します。

```bash
sudo systemctl daemon-reload
sudo systemctl enable zipkin
sudo systemctl start zipkin
```

#### サービスの状態確認

Zipkinサービスが正常に動作していることを確認します。

```bash
sudo systemctl status zipkin
```

次のような出力が表示されます。

```
● zipkin.service - Zipkin Server
   Loaded: loaded (/etc/systemd/system/zipkin.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2025-02-26 10:11:09 JST; 7s ago
 Main PID: 1678 (java)
    Tasks: 43 (limit: 617204)
   Memory: 466.1M
   CGroup: /system.slice/zipkin.service
           └─1678 /usr/bin/java -Xms512m -Xmx1g -XX:+ExitOnOutOfMemoryError -Dloader.path=otel.jar,otel.jar!/lib -Dspring.profiles.active=otel -cp /opt/zipkin/zipkin.jar org.springframework.boot.loader.launch.PropertiesLauncher

Feb 26 10:11:10 zipkin java[1678]:           oooooooo  oooooooo
Feb 26 10:11:10 zipkin java[1678]:               oooo  oooo
Feb 26 10:11:10 zipkin java[1678]:      ________ ____  _  _____ _   _
Feb 26 10:11:10 zipkin java[1678]:     |__  /_ _|  _ \| |/ /_ _| \ | |
Feb 26 10:11:10 zipkin java[1678]:       / / | || |_) | ' / | ||  \| |
Feb 26 10:11:10 zipkin java[1678]:      / /_ | ||  __/| . \ | || |\  |
Feb 26 10:11:10 zipkin java[1678]:     |____|___|_|   |_|\_\___|_| \_|
Feb 26 10:11:10 zipkin java[1678]: :: version 3.5.0 :: commit 0f8fc88 ::
Feb 26 10:11:10 zipkin java[1678]: 2025-02-26T10:11:10.944+09:00  WARN [/] 1678 --- [           main] i.m.p.PrometheusMeterRegistry            : A MeterFilter is being configured after a Meter has been registered to this registry. All MeterFilters should 
be configured before any Meters are registered. If that is not possible or you have a use case where it should be allowed, let the Micrometer maintainers know at https://github.com/micrometer-metrics/micrometer/issues/4920. Enable DEBUG level logging on t
his logger to see a stack trace of the call configuring this MeterFilter.
Feb 26 10:11:11 zipkin java[1678]: 2025-02-26T10:11:11.045+09:00  INFO [/] 1678 --- [oss-http-*:9411] c.l.a.s.Server                           : Serving HTTP at /[0:0:0:0:0:0:0:0]:9411 - http://127.0.0.1:9411/
```

### 動作確認

Zipkin UIにアクセスして、サービスが正常に動作していることを確認します。

```bash
curl -s http://localhost:9411/health
```

正常に動作している場合、次のような応答が返ります。

```json
{
  "status" : "UP",
  "zipkin" : {
    "status" : "UP",
    "details" : {
      "OpenTelemetryHttpCollector{}" : {
        "status" : "UP"
      },
      "InMemoryStorage{}" : {
        "status" : "UP"
      }
    }
  }
}
```

Webブラウザで `http://<server_address>:9411` にアクセスすると、Zipkin UIが表示されます。

<img width="1024" alt="image" src="https://github.com/user-attachments/assets/0a0c2417-9933-4134-ac0b-4c9bfe069f62" />

サービスのログは次のコマンドで確認できます。
```bash
sudo journalctl -u zipkin -f
```

`/etc/systemd/system/zipkin.service`を変更した場合は、サービスを再読み込みして再起動してください。

```bash
sudo systemctl daemon-reload
sudo systemctl restart zipkin
```

OTLPのTracing Endpointは `http://<server_address>:9411/v1/traces` です。

OpenTelemetry Java Agentを使ってトレースを送る方法は[こちらの記事](/entries/827)を参照してください。
