👌

OpenTelemetry Collectorでカスタムビルドする方法

2023/11/01に公開

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.

https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib

この辺りの話しは以下の資料で分かりやすくまとめられているので興味のある方はご覧ください。
https://speakerdeck.com/k6s4i53rx/getting-started-tracing-instrument-micro-service-with-opentelemetry?slide=22

この記事では必要なコンポーネントのみで構成した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で以下のようなファイルになっています。

https://github.com/open-telemetry/opentelemetry-collector-releases/blob/v0.87.0/distributions/otelcol-contrib/manifest.yaml

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周りを弄ったほうが良いですが今回は割愛します。

設定ファイルについて詳しく知りたい方は公式に詳しく書かれています。
https://opentelemetry.io/docs/collector/configuration/

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 --from=builder --chown=nonroot:nonroot /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に設定するとクラウド周りの設定不要で動かすことができます(最初からそっちで説明しろ)。
https://github.com/open-telemetry/opentelemetry-collector/tree/main/exporter/otlpexporter

なお、ここで説明したコードの完成例はこちらで載せています。

以上「OpenTelemetry Collectorでカスタムビルド」する方法でした。

Discussion