これは、なにをしたくて書いたもの?
OpenTelemetry Collectorを使う時は、いろいろなコンポーネントが含まれているOpenTelemetry Collector Contribを使うのが手っ取り早いです。
ですが、自分でOpenTelemetry Collectorをビルドすることもできるようなので、ちょっと試してみます。
OpenTelemetry Collectorを自分でビルドする?
OpenTelemetry Collector Contribは便利なのですが、opentelemetry-collector-releasesリポジトリーのREADME.mdには以下のようなことが
書かれています。
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. Some reasons to do this:
- reduce the size of the collector, reducing deployment times for the collector
- improve the security of the collector by reducing the available attack surface area
Building a custom collector can be achieved using the OpenTelemetry Collector Builder.
OpenTelemetry Collector Contrib Distro / Recommendation
言っているのはこういうことですね。
- OpenTelemetry Collector Contribには多数のコンポーネントが含まれているので、様々な構成を試す出発点としてはお勧め
- 本番環境で実行する場合は、その環境で必要なコンポーネントのみに制限することを推奨する
- Collectorのサイズを小さくしてデプロイ時間を短縮する
- 攻撃対象領域を減らすことでCollectorのセキュリティを向上させる
この話、ドキュメントにはあまり出てこないんですよね。ただ「OpenTelemetry Collectorは自分でもビルドできるよ」とは書かれています。
カスタムCollectorをビルドするには、OpenTelemetry Collector Builder(ocb)を使います。
opentelemetry-collector/cmd/builder at v0.132.0 · open-telemetry/opentelemetry-collector · GitHub
builder command - go.opentelemetry.io/collector/cmd/builder - Go Packages
ocbは、以下の3種類の方法で利用できます。
- オフィシャルDockerイメージ(推奨)
- オフィシャルバイナリー(推奨)
- go installでの利用(非推奨)
Building a custom collector | OpenTelemetry
ocb自体はGo言語で実装されていて、Dockerイメージ以外の方法を使う場合はGo言語をインストールしておく必要があります。
Collectorをビルドするには、どのようなコンポーネントを含めるかを指定するマニフェストファイルが必要になります。
Building a custom collector / Step 2 - Create a builder manifest file
Exporter、Receiver、Processor、Extension、Connector、を選ぶことになるわけですが、このあたりから探すんでしょうね。
- Exporter
- Receiver
- Processor
- Extension
- Connector
また、こちらから探すのもよいと思います。
このマニフェストファイルというものがどういうものかは、各種OpenTelemetry Collectorディストリビューションのマニフェストファイルを
見るのがよいと思います。
- OpenTelemetry Collector Core Distro
- OpenTelemetry Collector Contrib Distro
- OpenTelemetry Collector Kubernetes Distro
- OpenTelemetry Collector OTLP Distro
- https://github.com/open-telemetry/opentelemetry-collector-releases/blob/v0.132.0/distributions/otelcol-otlp/manifest.yaml
- OpenTelemetry Collector eBPF Profiling Distribution
- https://github.com/open-telemetry/opentelemetry-collector-releases/blob/v0.132.0/distributions/otelcol-otlp/manifest.yaml
サンプル的に、OpenTelemetry Collector Core Distroのmanifest.yamlを載せておきます。こちらを見ると雰囲気がわかるでしょう。
dist: module: github.com/open-telemetry/opentelemetry-collector-releases/core name: otelcol description: OpenTelemetry Collector version: 0.132.0 output_path: ./_build build_tags: "grpcnotrace" receivers: - gomod: go.opentelemetry.io/collector/receiver/nopreceiver v0.132.0 - gomod: go.opentelemetry.io/collector/receiver/otlpreceiver v0.132.0 - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver v0.132.0 - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.132.0 - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver v0.132.0 - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.132.0 - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.132.0 exporters: - gomod: go.opentelemetry.io/collector/exporter/debugexporter v0.132.0 - gomod: go.opentelemetry.io/collector/exporter/nopexporter v0.132.0 - gomod: go.opentelemetry.io/collector/exporter/otlpexporter v0.132.0 - gomod: go.opentelemetry.io/collector/exporter/otlphttpexporter v0.132.0 - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.132.0 - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter v0.132.0 - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.132.0 - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.132.0 - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.132.0 extensions: - gomod: go.opentelemetry.io/collector/extension/zpagesextension v0.132.0 - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.132.0 - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.132.0 processors: - gomod: go.opentelemetry.io/collector/processor/batchprocessor v0.132.0 - gomod: go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.132.0 - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.132.0 - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.132.0 - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/spanprocessor v0.132.0 - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.132.0 - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.132.0 connectors: - gomod: go.opentelemetry.io/collector/connector/forwardconnector v0.132.0 providers: - gomod: go.opentelemetry.io/collector/confmap/provider/envprovider v1.38.0 - gomod: go.opentelemetry.io/collector/confmap/provider/fileprovider v1.38.0 - gomod: go.opentelemetry.io/collector/confmap/provider/httpprovider v1.38.0 - gomod: go.opentelemetry.io/collector/confmap/provider/httpsprovider v1.38.0 - gomod: go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.38.0 replaces: - go.opentelemetry.io/otel/exporters/prometheus => go.opentelemetry.io/otel/exporters/prometheus v0.58.0
こういうのを見ていると、各種OpenTelemetry Collectorのディストリビューションは必要なコンポーネントを含んだカスタムビルドなのだろう
という気がしてきますね。
ちなみにAWS Distro for OpenTelemetry(ADOT)を見ていると、ソースコード内で各種コンポーネントを参照しているようでしたが。
それでは、ドキュメントを読むのはこれくらいにして自分でOpenTelemetry Collectorをビルドしてみましょうか。ビルド方法は、Dockerおよび
ocbバイナリーを使うことにします。
環境
今回の環境はこちら。Ubuntu Linux 24.04 LTSです。
$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 24.04.3 LTS Release: 24.04 Codename: noble $ uname -svrmpio Linux 6.8.0-78-generic #78-Ubuntu SMP PREEMPT_DYNAMIC Tue Aug 12 11:34:18 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux
Go言語。
$ go version go version go1.24.6 linux/amd64
Docker。
$ docker version Client: Docker Engine - Community Version: 28.3.3 API version: 1.51 Go version: go1.24.5 Git commit: 980b856 Built: Fri Jul 25 11:34:09 2025 OS/Arch: linux/amd64 Context: default Server: Docker Engine - Community Engine: Version: 28.3.3 API version: 1.51 (minimum version 1.24) Go version: go1.24.5 Git commit: bea959c Built: Fri Jul 25 11:34:09 2025 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.7.27 GitCommit: 05044ec0a9a75232cad458027ca83437aae3f4da runc: Version: 1.2.5 GitCommit: v1.2.5-0-g59923ef docker-init: Version: 0.19.0 GitCommit: de40ad0
マニフェストファイルを作成する
自分でOpenTelemetry Collectorをビルドするということで、まずはマニフェストファイルを作成しておきましょう。
今回はOpenTelemetry Collector Core Distroから内容をさらに減らしたものにしてみました。
manifest.yaml。
dist: name: my-otelcol description: My Custom OpenTelemetry Collector version: 0.0.1 output_path: ./build receivers: - gomod: go.opentelemetry.io/collector/receiver/otlpreceiver v0.132.0 exporters: - gomod: go.opentelemetry.io/collector/exporter/debugexporter v0.132.0 - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.132.0 - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.132.0 extensions: - gomod: go.opentelemetry.io/collector/extension/zpagesextension v0.132.0 - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.132.0 - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.132.0 processors: - gomod: go.opentelemetry.io/collector/processor/batchprocessor v0.132.0 - gomod: go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.132.0 - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.132.0 - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.132.0 - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/spanprocessor v0.132.0 - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.132.0 - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.132.0 providers: - gomod: go.opentelemetry.io/collector/confmap/provider/envprovider v1.38.0 - gomod: go.opentelemetry.io/collector/confmap/provider/fileprovider v1.38.0 - gomod: go.opentelemetry.io/collector/confmap/provider/httpprovider v1.38.0 - gomod: go.opentelemetry.io/collector/confmap/provider/httpsprovider v1.38.0 - gomod: go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.38.0
receivers、exporters、extensions、processors、providersには必要なコンポーネントを並べればいいのですが、distの部分はマニフェストファイルの
説明を読みましょう。
Building a custom collector / Step 2 - Create a builder manifest file
nameはディストリビューションのバイナリー名、output_pathはビルド結果が生成されるディレクトリー名です。
他は実行結果を見るとわかるでしょう。
ocbバイナリーでビルドする
まずはocbバイナリーでビルドしてみましょう。
OpenTelemetry Collector Builder (ocb) / Installation / Official release binaries
ocbバイナリーをダウンロード。
$ curl --proto '=https' --tlsv1.2 -fL -o ocb https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.132.0/ocb_0.132.0_linux_amd64 $ chmod +x ocb
バージョン。
$ ./ocb version ocb version v0.132.1-0.20250812161651-10fd06dedd96+dirty
ヘルプ。
$ ./ocb help
OpenTelemetry Collector Builder (v0.132.1-0.20250812161651-10fd06dedd96+dirty)
ocb generates a custom OpenTelemetry Collector binary using the
build configuration given by the "--config" argument. If no build
configuration is provided, ocb will generate a default Collector.
Usage:
ocb [flags]
ocb [command]
Available Commands:
completion Generate the autocompletion script for the specified shell
help Help about any command
version Version of ocb
Flags:
--config string build configuration file
--gcflags string gcflags to include in the "go build" command
-h, --help help for ocb
--ldflags string ldflags to include in the "go build" command
--skip-compilation Whether builder should only generate go code with no compile of the collector (default false)
--skip-generate Whether builder should skip generating go code (default false)
--skip-get-modules Whether builder should skip updating go.mod and retrieve Go module list (default false)
--skip-strict-versioning Whether builder should skip strictly checking the calculated versions following dependency resolution (default true)
--verbose Whether builder should print verbose output (default false)
Use "ocb [command] --help" for more information about a command.
OpenTelemetry Collectorのビルドはocbに--configオプションを指定して実行するのですが、Go言語がインストールされていなかったり、
マニフェストファイルにgoバイナリーの位置を指定していなかったりするとエラーになります。
$ ./ocb --config manifest.yaml
2025-08-24T19:10:37.068+0900 INFO internal/command.go:98 OpenTelemetry Collector Builder {"version": "v0.132.1-0.20250812161651-10fd06dedd96+dirty"}
2025-08-24T19:10:37.069+0900 INFO internal/command.go:103 Using config file {"path": "manifest.yaml"}
Error: go not found: go binary not found
Goの環境は用意したうえで、実行。
$ ./ocb --config manifest.yaml
2025-08-24T19:15:23.660+0900 INFO internal/command.go:98 OpenTelemetry Collector Builder {"version": "v0.132.1-0.20250812161651-10fd06dedd96+dirty"}
2025-08-24T19:15:23.661+0900 INFO internal/command.go:103 Using config file {"path": "manifest.yaml"}
2025-08-24T19:15:23.664+0900 INFO builder/config.go:160 Using go {"go-executable": "/usr/bin/go"}
2025-08-24T19:15:23.665+0900 INFO builder/main.go:99 Sources created {"path": "./my-otelcol"}
2025-08-24T19:16:09.186+0900 INFO builder/main.go:200 Getting go modules
2025-08-24T19:16:17.685+0900 INFO builder/main.go:110 Compiling
2025-08-24T19:17:02.495+0900 INFO builder/main.go:139 Compiled {"binary": "./build/my-otelcol"}
1回目はモジュールのダウンロードがあるので時間がかかりますが、2回目は随分と高速になります。
$ ./ocb --config manifest.yaml
2025-08-24T19:17:34.195+0900 INFO internal/command.go:98 OpenTelemetry Collector Builder {"version": "v0.132.1-0.20250812161651-10fd06dedd96+dirty"}
2025-08-24T19:17:34.195+0900 INFO internal/command.go:103 Using config file {"path": "manifest.yaml"}
2025-08-24T19:17:34.196+0900 INFO builder/config.go:160 Using go {"go-executable": "/usr/bin/go"}
2025-08-24T19:17:34.198+0900 INFO builder/main.go:99 Sources created {"path": "./build"}
2025-08-24T19:17:34.354+0900 INFO builder/main.go:200 Getting go modules
2025-08-24T19:17:34.380+0900 INFO builder/main.go:110 Compiling
2025-08-24T19:17:35.534+0900 INFO builder/main.go:139 Compiled {"binary": "./build/my-otelcol"}
ビルドできたので、バージョンを確認してみます。
$ ./build/my-otelcol -v my-otelcol version 0.0.1
含まれているコンポーネント。
$ ./build/my-otelcol components
buildinfo:
command: my-otelcol
description: My Custom OpenTelemetry Collector
version: 0.0.1
receivers:
- name: otlp
module: go.opentelemetry.io/collector/receiver/otlpreceiver v0.132.0
stability:
logs: Stable
metrics: Stable
traces: Stable
processors:
- name: attributes
module: github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.132.0
stability:
logs: Beta
metrics: Beta
traces: Beta
- name: batch
module: go.opentelemetry.io/collector/processor/batchprocessor v0.132.0
stability:
logs: Beta
metrics: Beta
traces: Beta
- name: filter
module: github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.132.0
stability:
logs: Alpha
metrics: Alpha
traces: Alpha
- name: memory_limiter
module: go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.132.0
stability:
logs: Beta
metrics: Beta
traces: Beta
- name: probabilistic_sampler
module: github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.132.0
stability:
logs: Alpha
metrics: Undefined
traces: Beta
- name: resource
module: github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.132.0
stability:
logs: Beta
metrics: Beta
traces: Beta
- name: span
module: github.com/open-telemetry/opentelemetry-collector-contrib/processor/spanprocessor v0.132.0
stability:
logs: Undefined
metrics: Undefined
traces: Alpha
exporters:
- name: debug
module: go.opentelemetry.io/collector/exporter/debugexporter v0.132.0
stability:
logs: Alpha
metrics: Alpha
traces: Alpha
- name: prometheus
module: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.132.0
stability:
logs: Undefined
metrics: Beta
traces: Undefined
- name: prometheusremotewrite
module: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.132.0
stability:
logs: Undefined
metrics: Beta
traces: Undefined
connectors: []
extensions:
- name: health_check
module: github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.132.0
stability:
extension: Unmaintained
- name: pprof
module: github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.132.0
stability:
extension: Beta
- name: zpages
module: go.opentelemetry.io/collector/extension/zpagesextension v0.132.0
stability:
extension: Beta
providers:
- scheme: env
module: go.opentelemetry.io/collector/confmap/provider/envprovider v1.38.0
- scheme: file
module: go.opentelemetry.io/collector/confmap/provider/fileprovider v1.38.0
- scheme: http
module: go.opentelemetry.io/collector/confmap/provider/httpprovider v1.38.0
- scheme: https
module: go.opentelemetry.io/collector/confmap/provider/httpsprovider v1.38.0
- scheme: yaml
module: go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.38.0
ビルド結果。今回のバイナリーは40Mですね。
$ ll -h build total 40M drwxr-x--- 2 xxxxx xxxxx 4.0K Aug 24 19:33 ./ drwxr-x--- 7 xxxxx xxxxx 4.0K Aug 24 19:32 ../ -rw-rw-r-- 1 xxxxx xxxxx 5.6K Aug 24 19:32 components.go -rw-rw-r-- 1 xxxxx xxxxx 15K Aug 24 19:33 go.mod -rw-rw-r-- 1 xxxxx xxxxx 83K Aug 24 19:33 go.sum -rw-rw-r-- 1 xxxxx xxxxx 2.3K Aug 24 19:32 main.go -rw-rw-r-- 1 xxxxx xxxxx 247 Aug 24 19:32 main_others.go -rw-rw-r-- 1 xxxxx xxxxx 869 Aug 24 19:32 main_windows.go -rwxrwxr-x 1 xxxxx xxxxx 40M Aug 24 19:33 my-otelcol*
ちなみに、OpenTelemetry Collector Contribの場合は300Mを超えるバイナリーでした…。
$ curl -LO https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.132.0/otelcol-contrib_0.132.0_linux_amd64.tar.gz $ tar xf otelcol-contrib_0.132.0_linux_amd64.tar.gz $ ./otelcol-contrib -v otelcol-contrib version 0.132.0 $ ll -h otelcol-contrib -rwxr-xr-x 1 xxxxx xxxxx 335M Aug 13 04:34 otelcol-contrib*
簡単な設定ファイルを作成して、起動できるところまで確認しておきます。
config.yaml
extensions: health_check: pprof: endpoint: 0.0.0.0:1777 zpages: endpoint: 0.0.0.0:55679 receivers: otlp: protocols: grpc: endpoint: 0.0.0.0:4317 http: endpoint: 0.0.0.0:4318 processors: batch: exporters: debug: verbosity: detailed service: pipelines: traces: receivers: [otlp] processors: [batch] exporters: [debug] metrics: receivers: [otlp] processors: [batch] exporters: [debug] logs: receivers: [otlp] processors: [batch] exporters: [debug] extensions: [health_check, pprof, zpages]
起動。
$ ./build/my-otelcol --config config.yaml
2025-08-24T19:34:13.086+0900 info service@v0.132.0/service.go:187 Setting up own telemetry... {"resource": {"service.instance.id": "d6152066-f7fc-4264-ad89-a6a56fcfc5dd", "service.name": "my-otelcol", "service.version": "0.0.1"}}
2025-08-24T19:34:13.090+0900 info builders/extension.go:50 Unmaintained component. Actively looking for contributors. Component will become deprecated after 3 months of remaining unmaintained. {"resource": {"service.instance.id": "d6152066-f7fc-4264-ad89-a6a56fcfc5dd", "service.name": "my-otelcol", "service.version": "0.0.1"}, "otelcol.component.id": "health_check", "otelcol.component.kind": "extension"}
2025-08-24T19:34:13.091+0900 info service@v0.132.0/service.go:249 Starting my-otelcol... {"resource": {"service.instance.id": "d6152066-f7fc-4264-ad89-a6a56fcfc5dd", "service.name": "my-otelcol", "service.version": "0.0.1"}, "Version": "0.0.1", "NumCPU": 4}
2025-08-24T19:34:13.091+0900 info extensions/extensions.go:41 Starting extensions... {"resource": {"service.instance.id": "d6152066-f7fc-4264-ad89-a6a56fcfc5dd", "service.name": "my-otelcol", "service.version": "0.0.1"}}
2025-08-24T19:34:13.092+0900 info extensions/extensions.go:45 Extension is starting... {"resource": {"service.instance.id": "d6152066-f7fc-4264-ad89-a6a56fcfc5dd", "service.name": "my-otelcol", "service.version": "0.0.1"}, "otelcol.component.id": "zpages", "otelcol.component.kind": "extension"}
2025-08-24T19:34:13.092+0900 info zpagesextension@v0.132.0/zpagesextension.go:56 Registered zPages span processor on tracer provider {"resource": {"service.instance.id": "d6152066-f7fc-4264-ad89-a6a56fcfc5dd", "service.name": "my-otelcol", "service.version": "0.0.1"}, "otelcol.component.id": "zpages", "otelcol.component.kind": "extension"}
2025-08-24T19:34:13.092+0900 info zpagesextension@v0.132.0/zpagesextension.go:71 Registered Host's zPages {"resource": {"service.instance.id": "d6152066-f7fc-4264-ad89-a6a56fcfc5dd", "service.name": "my-otelcol", "service.version": "0.0.1"}, "otelcol.component.id": "zpages", "otelcol.component.kind": "extension"}
2025-08-24T19:34:13.092+0900 info zpagesextension@v0.132.0/zpagesextension.go:83 Starting zPages extension {"resource": {"service.instance.id": "d6152066-f7fc-4264-ad89-a6a56fcfc5dd", "service.name": "my-otelcol", "service.version": "0.0.1"}, "otelcol.component.id": "zpages", "otelcol.component.kind": "extension", "config": {"Endpoint":"0.0.0.0:55679","TLS":{},"CORS":{},"Auth":{},"MaxRequestBodySize":0,"IncludeMetadata":false,"ResponseHeaders":null,"CompressionAlgorithms":null,"ReadTimeout":0,"ReadHeaderTimeout":0,"WriteTimeout":0,"IdleTimeout":0,"Middlewares":null,"Expvar":{"Enabled":false}}}
2025-08-24T19:34:13.093+0900 info extensions/extensions.go:62 Extension started. {"resource": {"service.instance.id": "d6152066-f7fc-4264-ad89-a6a56fcfc5dd", "service.name": "my-otelcol", "service.version": "0.0.1"}, "otelcol.component.id": "zpages", "otelcol.component.kind": "extension"}
2025-08-24T19:34:13.093+0900 info extensions/extensions.go:45 Extension is starting... {"resource": {"service.instance.id": "d6152066-f7fc-4264-ad89-a6a56fcfc5dd", "service.name": "my-otelcol", "service.version": "0.0.1"}, "otelcol.component.id": "pprof", "otelcol.component.kind": "extension"}
2025-08-24T19:34:13.093+0900 info pprofextension@v0.132.0/pprofextension.go:61 Starting net/http/pprof server {"resource": {"service.instance.id": "d6152066-f7fc-4264-ad89-a6a56fcfc5dd", "service.name": "my-otelcol", "service.version": "0.0.1"}, "otelcol.component.id": "pprof", "otelcol.component.kind": "extension", "config": {"TCPAddr":{"Endpoint":"0.0.0.0:1777","DialerConfig":{"Timeout":0}},"BlockProfileFraction":0,"MutexProfileFraction":0,"SaveToFile":""}}
2025-08-24T19:34:13.094+0900 info extensions/extensions.go:62 Extension started. {"resource": {"service.instance.id": "d6152066-f7fc-4264-ad89-a6a56fcfc5dd", "service.name": "my-otelcol", "service.version": "0.0.1"}, "otelcol.component.id": "pprof", "otelcol.component.kind": "extension"}
2025-08-24T19:34:13.094+0900 info extensions/extensions.go:45 Extension is starting... {"resource": {"service.instance.id": "d6152066-f7fc-4264-ad89-a6a56fcfc5dd", "service.name": "my-otelcol", "service.version": "0.0.1"}, "otelcol.component.id": "health_check", "otelcol.component.kind": "extension"}
2025-08-24T19:34:13.094+0900 info healthcheckextension@v0.132.0/healthcheckextension.go:32 Starting health_check extension {"resource": {"service.instance.id": "d6152066-f7fc-4264-ad89-a6a56fcfc5dd", "service.name": "my-otelcol", "service.version": "0.0.1"}, "otelcol.component.id": "health_check", "otelcol.component.kind": "extension", "config": {"Endpoint":"localhost:13133","TLS":{},"CORS":{},"Auth":{},"MaxRequestBodySize":0,"IncludeMetadata":false,"ResponseHeaders":null,"CompressionAlgorithms":null,"ReadTimeout":0,"ReadHeaderTimeout":0,"WriteTimeout":0,"IdleTimeout":0,"Middlewares":null,"Path":"/","ResponseBody":null,"CheckCollectorPipeline":{"Enabled":false,"Interval":"5m","ExporterFailureThreshold":5}}}
2025-08-24T19:34:13.094+0900 info extensions/extensions.go:62 Extension started. {"resource": {"service.instance.id": "d6152066-f7fc-4264-ad89-a6a56fcfc5dd", "service.name": "my-otelcol", "service.version": "0.0.1"}, "otelcol.component.id": "health_check", "otelcol.component.kind": "extension"}
2025-08-24T19:34:13.095+0900 info otlpreceiver@v0.132.0/otlp.go:117 Starting GRPC server {"resource": {"service.instance.id": "d6152066-f7fc-4264-ad89-a6a56fcfc5dd", "service.name": "my-otelcol", "service.version": "0.0.1"}, "otelcol.component.id": "otlp", "otelcol.component.kind": "receiver", "endpoint": "0.0.0.0:4317"}
2025-08-24T19:34:13.095+0900 info otlpreceiver@v0.132.0/otlp.go:175 Starting HTTP server {"resource": {"service.instance.id": "d6152066-f7fc-4264-ad89-a6a56fcfc5dd", "service.name": "my-otelcol", "service.version": "0.0.1"}, "otelcol.component.id": "otlp", "otelcol.component.kind": "receiver", "endpoint": "0.0.0.0:4318"}
2025-08-24T19:34:13.095+0900 info healthcheck/handler.go:131 Health Check state change {"resource": {"service.instance.id": "d6152066-f7fc-4264-ad89-a6a56fcfc5dd", "service.name": "my-otelcol", "service.version": "0.0.1"}, "otelcol.component.id": "health_check", "otelcol.component.kind": "extension", "status": "ready"}
2025-08-24T19:34:13.095+0900 info service@v0.132.0/service.go:272 Everything is ready. Begin running and processing data. {"resource": {"service.instance.id": "d6152066-f7fc-4264-ad89-a6a56fcfc5dd", "service.name": "my-otelcol", "service.version": "0.0.1"}}
OKですね。
Dockerイメージでビルドする
最後はDockerイメージでビルドしてみます。
OpenTelemetry Collector Builder (ocb) / Installation / Official release Docker image
ドキュメントの内容をある程度マネしつつ、実行。
$ mkdir build $ chmod 777 build $ docker container run -it --rm --name ocb -v $(pwd)/manifest.yaml:/build/manifest.yaml -v $(pwd)/build:/build/build otel/opentelemetry-collector-builder:0.132.0 --config /build/manifest.yaml
マニフェストファイル、出力結果となるディレクトリーをマウントしておく必要があります。
ビルドの様子。
2025-08-24T11:04:00.708Z INFO internal/command.go:98 OpenTelemetry Collector Builder {"version": "v0.132.1-0.20250812161651-10fd06dedd96+dirty"}
2025-08-24T11:04:00.709Z INFO internal/command.go:103 Using config file {"path": "/build/manifest.yaml"}
2025-08-24T11:04:00.710Z INFO builder/config.go:160 Using go {"go-executable": "/usr/local/go/bin/go"}
2025-08-24T11:04:00.713Z INFO builder/main.go:99 Sources created {"path": "./build"}
2025-08-24T11:04:34.868Z INFO builder/main.go:200 Getting go modules
2025-08-24T11:04:36.580Z INFO builder/main.go:110 Compiling
2025-08-24T11:05:15.545Z INFO builder/main.go:139 Compiled {"binary": "./build/my-otelcol"}```
マウントしておいたディレクトリーに結果が出力されるので、こちらを利用。
$ ./build/my-otelcol --version my-otelcol version 0.0.1
権限まわりでちょっとハマるので、CollectorそのものもDockerイメージにするようにして、マルチステージビルドで構築するのがよさそうな
気がしますね。
Building a custom collector / Step 3b - Containerize your Collector’s distribution
ひとまずこんなところでしょうか。
おわりに
OpenTelemetry Collectorを自分でビルドしてみました。
Go言語の環境さえ用意してしまえばビルド自体は難しくないので、あとはどのコンポーネントを選定するかというところですね。
結局のところ、各コンポーネントがどういうものかわからないと使いこなしが難しいところかなと…。