---
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を導入しましたが、ヘルスチェックのようなノイジーなトレースを除外したかったためです。
次のような構成を構築します。
[
](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パッケージのインストールを行います。
**目次**
### 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 < ./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 < 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です。