--- 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です。 Image