OpenTelemetry Collector を使用する際には OpenTelemetry Collector distributions で提供されているディストロをよく使います。 中でも OpenTelemetry Collector Contribには開発中のものも含め様々な種類のコンポーネントが含まれているので、テスト目的には便利です。
一方で不要なコンポーネントも含まれておりサイズやセキュリティリスクの問題があるため、本番環境で使用する際には必要なコンポーネントのみを含んだCollectorをビルドすることが推奨されています。
Users of the OpenTelemetry Collector are also encouraged to build their own custom distributions with the OpenTelemetry Collector Builder, using the components they need from the core repository, the contrib repository, and possibly third-party or internal repositories.
Contrib外の AWS Distro for OpenTelemetry と他のコンポーネントを組み合わせたい、といった場合にも便利です。
ビルドにはOpenTelemetry Collector Builder(ocb)を使用します。 ここからはocbを使ったOTel Collector のビルド方法について紹介します。
ocbのインストール
$ go install go.opentelemetry.io/collector/cmd/builder@latest
$ builder version
ocb version v0.99.0
設定ファイルを作成する
Collectorにどのコンポーネント(exporter, receiver, processorなど)を含めるかをYAMLファイルに記述します。
dist:
name: otelcol-custom # the binary name. Optional.
description: "Custom OpenTelemetry Collector distribution" # a long name for the application. Optional.
output_path: ./bin # the path to write the output (sources and binary). Optional.
exporters:
- gomod: go.opentelemetry.io/collector/exporter/debugexporter v0.99.0
- gomod: go.opentelemetry.io/collector/exporter/otlpexporter v0.99.0
- gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.99.0
receivers:
- gomod: go.opentelemetry.io/collector/receiver/otlpreceiver v0.99.0
- gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsecscontainermetricsreceiver v0.99.0
- gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.99.0
processors:
- gomod: go.opentelemetry.io/collector/processor/batchprocessor v0.99.0
- gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.99.0
- gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.99.0
extensions:
- gomod: go.opentelemetry.io/collector/extension/zpagesextension v0.99.0
- gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension v0.99.0
- gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.99.0
コンポーネントはopentelemetry-collector や opentelemetry-collector-contrib などから探してください。
ビルドする
yamlをもとに指定したコンポーネントを含んだCollectorを作成します。
$ builder --config=ocb-config.yaml
$ ls bin
components.go go.mod go.sum main.go main_others.go main_windows.go otelcol-custom*
--skip-compilation
をつけるとsource codeとgo.modの生成のみが行われます。この生成されたファイルをコミットしておけば、CI上ではocbをインストールせずビルドすることもできそうです。
$ builder --config=ocb-config.yaml --skip-compilation
$ ls bin
components.go go.mod go.sum main.go main_others.go main_windows.go
Dockerコンテナを作成する
Docker で実行するためにコンテナイメージを作成します。 GoogleCloudPlatform/opentelemetry-collector-builder-sample にサンプル集もあります。
FROM gcr.io/distroless/base-debian12
COPY ./bin/otelcol-custom /app/otelcol-custom
EXPOSE 8888 8889 4317 4318 55679
ENTRYPOINT ["/app/otelcol-custom"]
マルチステージビルドの場合は以下のようになります。
FROM public.ecr.aws/docker/library/golang:1.22 as builder
WORKDIR /app
RUN go install go.opentelemetry.io/collector/cmd/builder@latest
COPY otel-col-builder.yaml otel-col-builder.yaml
RUN CGO_ENABLED=0 builder --config=otel-col-builder.yaml
FROM gcr.io/distroless/base-debian12
COPY --from=builder /app/bin/otelcol-custom /app/otelcol-custom
EXPOSE 8888 8889 4317 4318 55679
ENTRYPOINT ["/app/otelcol-custom"]
実行してみる
OTel Collector用の設定ファイルを用意して、Docker Composeで起動します。 Jeagerを使ってみます
receivers:
otlp:
protocols:
grpc:
http:
processors:
batch:
exporters:
otlp:
endpoint: jeager:4317
debug:
verbosity: detailed
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [otlp, debug]
services:
jaeger:
image: "jaegertracing/all-in-one:1.52"
ports:
- "16686:16686"
expose:
- 4317
- 4318
environment:
- COLLECTOR_ZIPKIN_HOST_PORT=:9411
- COLLECTOR_OTLP_ENABLED=true
# Collector
otel-collector:
build:
context: ./
dockerfile: Dockerfile
command: ["--config=/etc/otelcol-config.yaml"]
volumes:
- ./otel-collector-config.yaml:/etc/otel-collector-config.yaml
ports:
- 4317:4317 # OTLP gRPC receiver
depends_on:
- jaeger
docker compose up --build
で起動すると、ログが確認できます。
2024-05-01T11:04:53.979Z info service@v0.99.0/service.go:99 Setting up own telemetry...
2024-05-01T11:04:53.979Z info service@v0.99.0/telemetry.go:103 Serving metrics {"address": ":8888", "level": "Normal"}
2024-05-01T11:04:53.979Z info exporter@v0.99.0/exporter.go:275 Development component. May change in the future. {"kind": "exporter", "data_type": "traces", "name": "debug"}
2024-05-01T11:04:53.984Z info service@v0.99.0/service.go:166 Starting otelcol-custom... {"Version": "1.0.0", "NumCPU": 2}
2024-05-01T11:04:53.984Z info extensions/extensions.go:34 Starting extensions...
おわり
- 公式に提供されているOpenTelemetry Collectorは自分が使わないコンポーネントも含むので、必要なコンポーネントのみを含んだCollectorをビルドすることが推奨される
- ocbを使うとyamlファイルで設定して簡単にビルドできる