---
title: Rocky LinuxへのOpenTelemetry Collectorをインストールするメモ
tags: ["Zipkin", "OpenTelemetry", "OpenTelemetry Collector", "Tracing", "Rocky", "Systemd", "Java"]
categories: ["Observability", "OpenTelemetry", "OpenTelemetry Collector"]
date: 2025-03-10T14:57:28Z
updated: 2025-03-10T15:01:44Z
---

本記事では、Rocky Linux 8にOpenTelemetry Collectorをインストールします。

OpenTelemetry Collector導入のモチベーションは[前記事](/entries/841)でZipkinを導入しましたが、ヘルスチェックのようなノイジーなトレースを除外したかったためです。
次のような構成を構築します。

[<img src="https://mermaid.ink/img/pako:eNp1k99vwiAQx_8Vgq91yebTarJkme7JRaPuxdYHhMMSKRCgU6P-70Npte4HScsd-X7ugDsOmGoGOMVc6i0tiPVoNM0VCuPVmCx8UlDihVZL1O2-HGegGHJirYh0RzQFCuILbARctVpbYgo0NqDmIKEEb_foTUsJ1OtadR4Nl43no8nVixlqr5XlXUgPLTr6WZzQxGoKzukaj6ttfLgz2v4RAHUfgn64o7JigJwhyqGt8EUwgQouKPqcji78RcGyxojaZYwX7iMaTZp4psaLm5pbQgEx4skRLYTZCJXFqQ4S_1QS5wbAkds7DyXiQsq0w5954rzVG0g7vV6vtrtbwXyRPpld_wdMdWm0AuVrfrVq8_yef_zNm-Y-G56vbjzv_ce3opw7J4nnq4_SznEtd9Lc0W3Ld7q6Stf99HGCS7AlESz06-EszbEvQpflOA0mA04q6XOcq1OQksrr2V5RnHpbQYKtrtZF41QmFAMGgoSGLXHKQ6OE1VDWhdY3H5gIbfsRH8jlnZy-AbpsGEM?type=png" title="Image" width="1024"/>](https://mermaid.live/edit#pako:eNp1k99vwiAQx_8Vgq91yebTarJkme7JRaPuxdYHhMMSKRCgU6P-70Npte4HScsd-X7ugDsOmGoGOMVc6i0tiPVoNM0VCuPVmCx8UlDihVZL1O2-HGegGHJirYh0RzQFCuILbARctVpbYgo0NqDmIKEEb_foTUsJ1OtadR4Nl43no8nVixlqr5XlXUgPLTr6WZzQxGoKzukaj6ttfLgz2v4RAHUfgn64o7JigJwhyqGt8EUwgQouKPqcji78RcGyxojaZYwX7iMaTZp4psaLm5pbQgEx4skRLYTZCJXFqQ4S_1QS5wbAkds7DyXiQsq0w5954rzVG0g7vV6vtrtbwXyRPpld_wdMdWm0AuVrfrVq8_yef_zNm-Y-G56vbjzv_ce3opw7J4nnq4_SznEtd9Lc0W3Ld7q6Stf99HGCS7AlESz06-EszbEvQpflOA0mA04q6XOcq1OQksrr2V5RnHpbQYKtrtZF41QmFAMGgoSGLXHKQ6OE1VDWhdY3H5gIbfsRH8jlnZy-AbpsGEM)

> [!TIP]
> [この例](https://github.com/open-telemetry/opentelemetry-java-examples/blob/6f2279a61d441e26cf6ea02f0b6f69bda1833317/javaagent/sdk-config.yaml#L90-L105)のような宣言的設定ファイルを作成することで、Java Agent側でも特定URLの除外が可能です。


本記事では、前記事と同じサーバー上にOpenTelemetry Collectorをインストールします ここでもDockerを使用せず、サーバーにrpmパッケージのインストールを行います。

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

### rpmパッケージのインストール

https://github.com/open-telemetry/opentelemetry-collector-releases/releases のAssetsから最新のrpmパッケージをダウンロードします。ここでは`otelcol-contrib`を使用しますが、contribではない`otelcol`でも可です。

```bash
# AMD64の場合
curl -L https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.121.0/otelcol-contrib_0.121.0_linux_amd64.rpm -o otelcol-contrib.rpm

# ARM64の場合
curl -L https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.121.0/otelcol-contrib_0.121.0_linux_arm64.rpm -o otelcol-contrib.rpm
```

ダウンロードしたrpmパッケージをインストールします。

```bash
sudo rpm -ivh otelcol-contrib.rpm
```

次のようなログが出力されます。

```
Verifying...                          ################################# [100%]
Preparing...                          ################################# [100%]
Updating / installing...
   1:otelcol-contrib-0.121.0-1        ################################# [100%]
Created symlink /etc/systemd/system/multi-user.target.wants/otelcol-contrib.service → /usr/lib/systemd/system/otelcol-contrib.service.
```

### configの編集

インストールしたOpenTelemetry Collectorの設定ファイルは`/etc/otelcol-contrib/config.yaml`です。

設定ファイルを次で上書きします。ここではURLのPathが`/actuator`から始まるSpanを除外します。

```yaml
extensions:
  health_check:
receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318
processors:
  filter:
    #! https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/filterprocessor
    error_mode: ignore
    traces:
      span:
      - IsMatch(attributes["url.path"], "/actuator.*")
exporters:
  debug:
    verbosity: detailed
  otlphttp/zipkin:
    compression: gzip
    endpoint: http://localhost:9411
    tls:
      insecure: true
service:
  pipelines:
    traces:
      receivers:
      - otlp
      processors:
      - filter
      exporters:
      - otlphttp/zipkin
  extensions:
  - health_check
```

> [!NOTE]
> OpenTelemetry CollectorとZipkinが別サーバーの場合は、`http://localhost:9411`の部分を変更してください。


OpenTelemetry Collectorを再起動します。

```bash
sudo systemctl restart otelcol-contrib
```

状態を確認します。

```bash
sudo systemctl status otelcol-contrib
```

次のようなログが出力されればOKです。

```
● otelcol-contrib.service - OpenTelemetry Collector Contrib
   Loaded: loaded (/usr/lib/systemd/system/otelcol-contrib.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2025-03-10 22:05:06 JST; 14s ago
 Main PID: 1289 (otelcol-contrib)
    Tasks: 15 (limit: 617204)
   Memory: 279.1M
   CGroup: /system.slice/otelcol-contrib.service
           └─1289 /usr/bin/otelcol-contrib --config=/etc/otelcol-contrib/config.yaml

Mar 10 22:05:06 zipkin otelcol-contrib[1289]: 2025-03-10T22:05:06.177+0900        info        service@v0.121.0/service.go:193        Setting up own telemetry...
Mar 10 22:05:06 zipkin otelcol-contrib[1289]: 2025-03-10T22:05:06.177+0900        info        service@v0.121.0/service.go:258        Starting otelcol-contrib...        {"Version": "0.121.0", "NumCPU": 16}
Mar 10 22:05:06 zipkin otelcol-contrib[1289]: 2025-03-10T22:05:06.177+0900        info        extensions/extensions.go:40        Starting extensions...
Mar 10 22:05:06 zipkin otelcol-contrib[1289]: 2025-03-10T22:05:06.177+0900        info        extensions/extensions.go:44        Extension is starting...        {"otelcol.component.id": "health_check", "otelcol.component.kind": "Extension"}
Mar 10 22:05:06 zipkin otelcol-contrib[1289]: 2025-03-10T22:05:06.177+0900        info        healthcheckextension@v0.121.0/healthcheckextension.go:32        Starting health_check extension        {"otelcol.component.id": "health_check", "otelcol.componen
t.kind": "Extension", "config": {"Endpoint":"localhost:13133","TLSSetting":null,"CORS":null,"Auth":null,"MaxRequestBodySize":0,"IncludeMetadata":false,"ResponseHeaders":null,"CompressionAlgorithms":null,"ReadTimeout":0,"ReadHeaderTimeout":0,"WriteTimeout"
:0,"IdleTimeout":0,"Path":"/","ResponseBody":null,"CheckCollectorPipeline":{"Enabled":false,"Interval":"5m","ExporterFailureThreshold":5}}}
Mar 10 22:05:06 zipkin otelcol-contrib[1289]: 2025-03-10T22:05:06.178+0900        info        extensions/extensions.go:61        Extension started.        {"otelcol.component.id": "health_check", "otelcol.component.kind": "Extension"}
Mar 10 22:05:06 zipkin otelcol-contrib[1289]: 2025-03-10T22:05:06.178+0900        info        otlpreceiver@v0.121.0/otlp.go:116        Starting GRPC server        {"otelcol.component.id": "otlp", "otelcol.component.kind": "Receiver", "endpoint": "0.0.0.0:
4317"}
Mar 10 22:05:06 zipkin otelcol-contrib[1289]: 2025-03-10T22:05:06.178+0900        info        otlpreceiver@v0.121.0/otlp.go:173        Starting HTTP server        {"otelcol.component.id": "otlp", "otelcol.component.kind": "Receiver", "endpoint": "0.0.0.0:
4318"}
Mar 10 22:05:06 zipkin otelcol-contrib[1289]: 2025-03-10T22:05:06.178+0900        info        healthcheck/handler.go:132        Health Check state change        {"otelcol.component.id": "health_check", "otelcol.component.kind": "Extension", "status": "rea
dy"}
Mar 10 22:05:06 zipkin otelcol-contrib[1289]: 2025-03-10T22:05:06.178+0900        info        service@v0.121.0/service.go:281        Everything is ready. Begin running and processing data.
```

ログは次のコマンドでも確認できます。

```bash
journalctl -u otelcol-contrib -f
```

### サンプルアプリの作成

インストールしたOpenTelemetry CollectorにOpenTelemetry Java Agentからトレースを送ってみます。

次のコマンドでSpring Bootアプリの雛形を作成します。

```bash
curl -s https://start.spring.io/starter.tgz \
    -d artifactId=hello-world \
    -d baseDir=hello-world \
    -d type=maven-project \
    -d dependencies=web,actuator \
    -d packageName=com.example \
    -d applicationName=HelloWorldApplication | tar -xzvf -

cd hello-world
```

> [!NOTE]
> 個人的にはSpring BootアプリでOTLP Traceを送る場合は、[Micrometer](https://docs.spring.io/spring-boot/reference/actuator/tracing.html#actuator.micrometer-tracing.tracer-implementations.otel-otlp)を使います。今回はOpenTelemetry Java Agentから送る場合の動作確認をしたかったため、手っ取り早くアプリを作成できるSpring Bootを使い、あえてOpenTelemetry Java Agent経由でOpenTelemetry Collectorにトレースを送ります。

"Hello World!"を返すControllerを作成します。

```java
cat <<EOF > ./src/main/java/com/example/HelloController.java
package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

  @GetMapping(path = "/")
  public String hello() {
    return "Hello World!";
  }

}
EOF
```

アプリをビルドします。

```bash
./mvnw clean package -DskipTests
```

OpenTelemetry Java Agentをダウンロードします。

```bash
sudo mkdir -p /opt/opentelemetry
sudo wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar -P /opt/opentelemetry
```

OpenTelemetry Java Agent用の環境変数を設定します。

```bash
export OTELCOL_HOST=198.19.249.105 # change me

cat <<EOF > otel.sh
export OTEL_SERVICE_NAME=hello-world
export OTEL_TRACES_EXPORTER=otlp
export OTEL_METRICS_EXPORTER=none
export OTEL_LOGS_EXPORTER=none
export OTEL_EXPORTER_OTLP_ENDPOINT=http://${OTELCOL_HOST}:4318
export OTEL_TRACES_SAMPLER=traceidratio
export OTEL_TRACES_SAMPLER_ARG=1.0
export OTEL_EXPORTER_OTLP_COMPRESSION=gzip
export OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
export OTEL_RESOURCE_DISABLED_KEYS=process.command_args,process.command_line,process.executable.path,process.pid,os.type,os.description,host.arch
EOF
```

環境変数を読み込んで、アプリを起動します。

```bash
source otel.sh
java -javaagent:/opt/opentelemetry/opentelemetry-javaagent.jar -jar target/hello-world-0.0.1-SNAPSHOT.jar
```

次のURLにリクエストを送ります。

```
curl http://localhost:8080
curl http://localhost:8080/actuator
curl http://localhost:8080/actuator/health
curl http://localhost:8080
```

Zipkin UIでトレースを確認します。次の図のように、URL Pathが`/actuator`から始まるトレースが表示されず、他のトレースが表示されればOKです。

<img width="1024" alt="Image" src="https://github.com/user-attachments/assets/83b118f1-2799-4c78-88b4-e672863803c7" />
