构建自定义 Collector
如果您计划构建和调试自定义 collector 接收器、处理器、扩展或导出器,您将需要自己的 Collector 实例。这将允许您直接在您喜欢的 Golang IDE 中启动和调试您的 OpenTelemetry Collector 组件。
以这种方式处理组件开发的另一个有趣方面是,您可以使用 IDE 的所有调试功能(堆栈跟踪是很好的老师!)来了解 Collector 本身如何与您的组件代码进行交互。
OpenTelemetry 社区开发了一个名为 OpenTelemetry Collector builder(或简称 ocb)的工具,以协助人们组装自己的分发版,轻松构建包含其自定义组件以及公开可用组件的分发版。
作为该过程的一部分,ocb 将生成 Collector 的源代码,您可以使用这些源代码来帮助构建和调试您自己的自定义组件,让我们开始吧。
步骤 1 - 安装构建器
ocb 工具需要 Go 来构建 Collector 分发版。如果您还没有安装 Go,请在您的机器上 安装 Go。
ocb 二进制文件可作为 OpenTelemetry Collector releases with cmd/builder tags 的可下载资产。您会找到基于操作系统和芯片组命名的资产列表,请下载适合您配置的资产。
curl --proto '=https' --tlsv1.2 -fL -o ocb \
https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/cmd%2Fbuilder%2Fv0.142.0/ocb_0.142.0_linux_amd64
chmod +x ocb
curl --proto '=https' --tlsv1.2 -fL -o ocb \
https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/cmd%2Fbuilder%2Fv0.142.0/ocb_0.142.0_linux_arm64
chmod +x ocb
curl --proto '=https' --tlsv1.2 -fL -o ocb \
https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/cmd%2Fbuilder%2Fv0.142.0/ocb_0.142.0_linux_ppc64le
chmod +x ocb
curl --proto '=https' --tlsv1.2 -fL -o ocb \
https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/cmd%2Fbuilder%2Fv0.142.0/ocb_0.142.0_darwin_amd64
chmod +x ocb
curl --proto '=https' --tlsv1.2 -fL -o ocb \
https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/cmd%2Fbuilder%2Fv0.142.0/ocb_0.142.0_darwin_arm64
chmod +x ocb
Invoke-WebRequest -Uri "https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/cmd%2Fbuilder%2Fv0.142.0/ocb_0.142.0_windows_amd64.exe" -OutFile "ocb.exe"
Unblock-File -Path "ocb.exe"
为确保 ocb 已准备好使用,请打开终端并输入 ./ocb help,回车后您应该会在控制台中看到 help 命令的输出。
步骤 2 - 创建构建器清单文件
构建器的 manifest 文件是一个 yaml 文件,您可以在其中传递有关代码生成和编译过程的信息,以及您希望添加到 Collector 分发版中的组件。
manifest 以一个名为 dist 的映射开始,该映射包含用于帮助您配置代码生成和编译过程的标签。事实上,dist 的所有标签都等同于 ocb 命令行 flags。
以下是 dist 映射的标签
| Tag | 描述 | Optional | 默认值 |
|---|---|---|---|
| module | 新分发版的模块名称,遵循 Go mod 约定。可选,但推荐。 | 是 | go.opentelemetry.io/collector/cmd/builder |
| name | 您的分发版的二进制文件名称 | 是 | otelcol-custom |
| description | 应用程序的长名称。 | 是 | 自定义 OpenTelemetry Collector 分发版 |
| output_path | 用于写入输出(源代码和二进制文件)的路径。 | 是 | /var/folders/86/s7l1czb16g124tng0d7wyrtw0000gn/T/otelcol-distribution3618633831 |
| version | 您的自定义 OpenTelemetry Collector 的版本。 | 是 | 1.0.0 |
| go | 用于编译生成的源代码的 Go 二进制文件。 | 是 | 从 PATH 导入 Go |
正如您在上面的表中看到的,所有 dist 标签都是可选的,因此您将根据您的意图来添加自定义值,以决定是否使您的自定义 Collector 分发版可供其他用户使用,或者您只是利用 ocb 来引导您的组件开发和测试环境。
在本教程中,您将创建一个 Collector 分发版来支持组件的开发和测试。
请继续创建一个名为 builder-config.yaml 的清单文件,其中包含以下内容
dist:
name: otelcol-dev
description: Basic OTel Collector distribution for Developers
output_path: ./otelcol-dev
现在,您需要添加代表您想要包含在此自定义 Collector 分发版中的组件的模块。请查看 ocb 配置文档,以了解不同的模块以及如何添加组件。
我们将把以下组件添加到我们的开发和测试 collector 分发版中
- 导出器:OTLP 和 Debug
- 接收器:OTLP
- 处理器:Batch
添加组件后,builder-config.yaml 清单文件将如下所示
dist:
name: otelcol-dev
description: Basic OTel Collector distribution for Developers
output_path: ./otelcol-dev
exporters:
- gomod:
go.opentelemetry.io/collector/exporter/debugexporter v0.142.0
- gomod:
go.opentelemetry.io/collector/exporter/otlpexporter v0.142.0
processors:
- gomod:
go.opentelemetry.io/collector/processor/batchprocessor v0.142.0
receivers:
- gomod:
go.opentelemetry.io/collector/receiver/otlpreceiver v0.142.0
providers:
- gomod: go.opentelemetry.io/collector/confmap/provider/envprovider v1.18.0
- gomod: go.opentelemetry.io/collector/confmap/provider/fileprovider v1.18.0
- gomod: go.opentelemetry.io/collector/confmap/provider/httpprovider v1.18.0
- gomod: go.opentelemetry.io/collector/confmap/provider/httpsprovider v1.18.0
- gomod: go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.18.0
有关您可以添加到自定义 collector 的组件列表,请参阅 OpenTelemetry Registry。请注意,注册表条目提供了您需要在 builder-config.yaml 中添加的完整名称和版本。
步骤 3a - 生成代码并构建您的 Collector 分发版
此步骤用于使用 ocb 二进制文件构建您的自定义 collector 分发版。如果您想构建自定义 Collector 分发版并将其部署到容器编排器(例如 Kubernetes),请跳过此步骤并转到 步骤 3b。
现在您只需要让 ocb 完成它的工作,所以请打开终端并输入以下命令
./ocb --config builder-config.yaml
如果一切顺利,命令的输出应该如下所示
2022-06-13T14:25:03.037-0500 INFO internal/command.go:85 OpenTelemetry Collector distribution builder {"version": "0.142.0", "date": "2023-01-03T15:05:37Z"}
2022-06-13T14:25:03.039-0500 INFO internal/command.go:108 Using config file {"path": "builder-config.yaml"}
2022-06-13T14:25:03.040-0500 INFO builder/config.go:99 Using go {"go-executable": "/usr/local/go/bin/go"}
2022-06-13T14:25:03.041-0500 INFO builder/main.go:76 Sources created {"path": "./otelcol-dev"}
2022-06-13T14:25:03.445-0500 INFO builder/main.go:108 Getting go modules
2022-06-13T14:25:04.675-0500 INFO builder/main.go:87 Compiling
2022-06-13T14:25:17.259-0500 INFO builder/main.go:94 Compiled {"binary": "./otelcol-dev/otelcol-dev"}
如您的配置文件 dist 部分所述,您现在有了一个名为 otelcol-dev 的文件夹,其中包含您的 Collector 分发版的所有源代码和二进制文件。
文件夹结构应如下所示
.
├── builder-config.yaml
├── ocb
└── otelcol-dev
├── components.go
├── components_test.go
├── go.mod
├── go.sum
├── main.go
├── main_others.go
├── main_windows.go
└── otelcol-dev
您现在可以使用生成的代码来引导您的组件开发项目,并轻松构建和分发包含您组件的 collector 分发版。
步骤 3b - 容器化您的 Collector 分发版
此步骤将在 Dockerfile 中构建您的 collector 分发版。如果您需要将 Collector 分发版部署到容器编排器(例如 Kubernetes),请遵循此步骤。如果您只想在没有容器化的情况下构建 collector 分发版,请转到 步骤 3a。
您需要向您的项目添加两个新文件
Dockerfile- 您的 Collector 分发版的容器镜像定义collector-config.yaml- 用于测试您的分发版的最小 Collector 配置 YAML
添加这些文件后,您的文件结构看起来如下
.
├── builder-config.yaml
├── collector-config.yaml
└── Dockerfile
以下 Dockerfile 会就地构建您的 Collector 分发版,确保生成的 Collector 分发版二进制文件与目标容器架构匹配(例如 linux/arm64、linux/amd64)。
FROM alpine:3.19 AS certs
RUN apk --update add ca-certificates
FROM golang:1.25.0 AS build-stage
WORKDIR /build
COPY ./builder-config.yaml builder-config.yaml
RUN --mount=type=cache,target=/root/.cache/go-build GO111MODULE=on go install go.opentelemetry.io/collector/cmd/builder@v0.142.0
RUN --mount=type=cache,target=/root/.cache/go-build builder --config builder-config.yaml
FROM gcr.io/distroless/base:latest
ARG USER_UID=10001
USER ${USER_UID}
COPY ./collector-config.yaml /otelcol/collector-config.yaml
COPY --from=certs /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
COPY --chmod=755 --from=build-stage /build/otelcol-dev /otelcol
ENTRYPOINT ["/otelcol/otelcol-dev"]
CMD ["--config", "/otelcol/collector-config.yaml"]
EXPOSE 4317 4318 12001
以下是最小化的 collector-config.yaml 定义
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
exporters:
debug:
verbosity: detailed
service:
pipelines:
traces:
receivers: [otlp]
exporters: [debug]
metrics:
receivers: [otlp]
exporters: [debug]
logs:
receivers: [otlp]
exporters: [debug]
使用以下命令构建 OCB 的多架构 Docker 镜像,将 linux/amd64 和 linux/arm64 作为目标构建架构。要了解更多信息,请参阅这篇关于多架构构建的 博客文章。
# Enable Docker multi-arch builds
docker run --rm --privileged tonistiigi/binfmt --install all
docker buildx create --name mybuilder --use
# Build the Docker image as Linux AMD and ARM,
# and loads the build result to "docker images"
docker buildx build --load \
-t <collector_distribution_image_name>:<version> \
--platform=linux/amd64,linux/arm64 .
# Test the newly-built image
docker run -it --rm -p 4317:4317 -p 4318:4318 \
--name otelcol <collector_distribution_image_name>:<version>