本記事では、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です。

Image
Found a mistake? Update the entry.
Share this article: