本記事では、Rocky Linux 8にOpenTelemetry Collectorをインストールします。
OpenTelemetry Collector導入のモチベーションは前記事でZipkinを導入しましたが、ヘルスチェックのようなノイジーなトレースを除外したかったためです。
次のような構成を構築します。
Tip
この例のような宣言的設定ファイルを作成することで、Java Agent側でも特定URLの除外が可能です。
本記事では、前記事と同じサーバー上にOpenTelemetry Collectorをインストールします ここでもDockerを使用せず、サーバーにrpmパッケージのインストールを行います。
目次
rpmパッケージのインストール
https://github.com/open-telemetry/opentelemetry-collector-releases/releases のAssetsから最新のrpmパッケージをダウンロードします。ここではotelcol-contribを使用しますが、contribではないotelcolでも可です。
# 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パッケージをインストールします。
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を除外します。
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を再起動します。
sudo systemctl restart otelcol-contrib
状態を確認します。
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.
ログは次のコマンドでも確認できます。
journalctl -u otelcol-contrib -f
サンプルアプリの作成
インストールしたOpenTelemetry CollectorにOpenTelemetry Java Agentからトレースを送ってみます。
次のコマンドでSpring Bootアプリの雛形を作成します。
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を使います。今回はOpenTelemetry Java Agentから送る場合の動作確認をしたかったため、手っ取り早くアプリを作成できるSpring Bootを使い、あえてOpenTelemetry Java Agent経由でOpenTelemetry Collectorにトレースを送ります。
"Hello World!"を返すControllerを作成します。
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
アプリをビルドします。
./mvnw clean package -DskipTests
OpenTelemetry Java Agentをダウンロードします。
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用の環境変数を設定します。
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
環境変数を読み込んで、アプリを起動します。
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です。