CLOVER🍀

That was when it all began.

OpenTelemetry Collectorを自分でビルドする

これは、なにをしたくて書いたもの?

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、を選ぶことになるわけですが、このあたりから探すんでしょうね。

また、こちらから探すのもよいと思います。

Registry / Collector

このマニフェストファイルというものがどういうものかは、各種OpenTelemetry Collectorディストリビューションマニフェストファイルを
見るのがよいと思います。

サンプル的に、OpenTelemetry Collector Core Distromanifest.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のディストリビューションは必要なコンポーネントを含んだカスタムビルドなのだろう
という気がしてきますね。

Distributions | OpenTelemetry

ちなみにAWS Distro for OpenTelemetry(ADOT)を見ていると、ソースコード内で各種コンポーネントを参照しているようでしたが。

https://github.com/aws-observability/aws-otel-collector/blob/v0.44.0/pkg/defaultcomponents/defaults.go

それでは、ドキュメントを読むのはこれくらいにして自分で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言語の環境さえ用意してしまえばビルド自体は難しくないので、あとはどのコンポーネントを選定するかというところですね。
結局のところ、各コンポーネントがどういうものかわからないと使いこなしが難しいところかなと…。