OpenTelemetry Collectorでカスタムビルドする方法
OpenTelemetry Collectorではopentelemetry-collector-releases
で2つのDistributionが用意されており、このうちopentelemetry-collector-contribを使うとすぐに利用を開始することができます。
しかしopentelemetry-collector-contribは全てのコンポーネントが含まれいるため本番環境での利用は推奨されていません。本番環境で利用する場合は自分が使うコンポーネントのみを含めたイメージを独自でビルドして使うことが推奨されています。
As this distribution contains many components, it is a good starting point to try various configurations. However, when running in production, it is recommended to limit the collector to contain only the components necessary for an environment.
この辺りの話しは以下の資料で分かりやすくまとめられているので興味のある方はご覧ください。
この記事では必要なコンポーネントのみで構成したopentelemetry-collectorをDockerfileでビルドする方法を見ていきます。
ビルド
manifest.yml
dist:
name: otelcol
description: Local OpenTelemetry Collector binary
output_path: dist
exporters:
- gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlecloudexporter v0.87.0
receivers:
- gomod: go.opentelemetry.io/collector/receiver/otlpreceiver v0.87.0
processors:
- gomod: go.opentelemetry.io/collector/processor/batchprocessor v0.87.0
opentelemetry-collectorをビルドするのに使う設定ファイルです。
必要なコンポーネントをこのような形式で書いていきます。ちなみに全てのコンポーネントを設定したのが冒頭で述べたopentelemetry-collector-contribで以下のようなファイルになっています。
config.yml
receivers:
otlp:
protocols:
grpc:
endpoint: localhost:4317
processors:
batch:
exporters:
googlecloud:
service:
pipelines:
traces:
receivers:
- otlp
processors:
- batch
exporters:
- googlecloud
opentelemetry-collectorを起動する際に指定する設定ファイルです。
サービスからのテレメトリーはgRPCで受けてGoogle CloudのCloud Traceに転送するよう設定しています。本番環境で使う場合はもう少しprocessors、exporters周りを弄ったほうが良いですが今回は割愛します。
設定ファイルについて詳しく知りたい方は公式に詳しく書かれています。
Dockerfile
FROM golang:1.20.10-bullseye as builder
WORKDIR /app
RUN go install go.opentelemetry.io/collector/cmd/builder@v0.87.0
COPY manifest.yml .
RUN CGO_ENABLED=0 builder --config=manifest.yml
FROM gcr.io/distroless/static-debian12
COPY /app/dist/otelcol /otelcol
COPY config.yml /etc/otelcol/config.yml
USER nonroot
ENTRYPOINT ["/otelcol"]
CMD ["--config", "/etc/otelcol/config.yml"]
EXPOSE 4317
必要な設定ファイル(manifest.yml, config.yml)が揃ったのでDockerfileを書いていきます。この例ではgoでビルドツールをインストールしていますが、Release Pageからダウンロードすることもできます。
ちなみにビルド時にCGO_ENABLED=0を指定しているのはstaticなdistrolessイメージを使っているためです。gcr.io/distroless/static-debian12
にはglibcが含まれていないので作成されたgoバイナリがglibcに依存しないようビルド時に指定してやる必要があります。
動かしてみる
ビルドしたイメージを起動すると以下のようになります。exportにCloud Traceを設定しているため、手元で動かすにはサービスアカウントキーをダウンロードして以下のように引数で指定する必要があります。
$ docker run \
-e GOOGLE_APPLICATION_CREDENTIALS=/tmp/sa.json \
-v $HOME/Downloads/sa.json:/tmp/sa.json \
custom-opentelemetry-collector:latest
2023-10-31T15:04:29.211Z info service@v0.88.0/telemetry.go:84 Setting up own telemetry...
2023-10-31T15:04:29.211Z info service@v0.88.0/telemetry.go:201 Serving Prometheus metrics {"address": ":8888", "level": "Basic"}
2023-10-31T15:04:29.219Z info service@v0.88.0/service.go:143 Starting otelcol... {"Version": "1.0.0", "NumCPU": 4}
2023-10-31T15:04:29.219Z info extensions/extensions.go:33 Starting extensions...
2023-10-31T15:04:29.219Z info otlpreceiver@v0.87.0/otlp.go:83 Starting GRPC server {"kind": "receiver", "name": "otlp", "data_type": "traces", "endpoint": "localhost:4317"}
2023-10-31T15:04:29.221Z info service@v0.88.0/service.go:169 Everything is ready. Begin running and processing data.
^C2023-10-31T15:04:44.368Z info otelcol@v0.88.0/collector.go:250 Received signal from OS {"signal": "interrupt"}
2023-10-31T15:04:44.369Z info service@v0.88.0/service.go:178 Starting shutdown...
2023-10-31T15:04:44.369Z info extensions/extensions.go:50 Stopping extensions...
2023-10-31T15:04:44.369Z info service@v0.88.0/service.go:192 Shutdown complete.
exportをOLTP Exporterに設定するとクラウド周りの設定不要で動かすことができます(最初からそっちで説明しろ)。
なお、ここで説明したコードの完成例はこちらで載せています。
以上「OpenTelemetry Collectorでカスタムビルド」する方法でした。
Discussion