我們一起聊聊自定義 OpenTelemetry Collector 容器鏡像
OpenTelemetry Collector 有兩個官方發行版:Core 和 Contrib。
- Core 發行版是 Collector 的基礎發行版,供 OTel 開發人員進行開發和測試。它包含一組基本的擴展、連接器、接收器、處理器和導出器。
- Contrib 發行版供非 OTel 開發人員進行實驗和學習。它還擴展了 Core 發行版,并包含由第三方(包括供應商和個人社區成員)創建的組件,這些組件對整個 OpenTelemetry 社區非常有用。
不管 Core 還是 Contrib 都不應該成為你生產工作負載的一部分。僅僅使用 Core 本身太過簡單,無法滿足組織的需求(盡管它提供的組件都是必須的);雖然 Contrib 中提供的組件足夠全面,然而并不是說每個組件都是你所需要的,太多冗余的組件顯得過于臃腫,還增大的攻擊面。
那如何選擇你所需的發行版呢?答案就是構建自己的發行版。可以使用官方提供的名為 OpenTelemetry Collector Builder (OCB) 的工具來自定義附件。
安裝 OCB
ocb 是個簡單的 CLI,支持 Window/Linux/macOS 以及 x86 和 arm64 平臺。我們可以從 release 頁面[1] 下載 ocb 的 binary。
curl -o ocb -sL https://github.com/open-telemetry/opentelemetry-collector/releases/download/cmd%2Fbuilder%2Fv0.95.0/ocb_0.95.0_linux_amd64
chmod +x ocb可以通過 ./ocb help 查看使用方法。
還可以通過 go install 來安裝。
go install go.opentelemetry.io/collector/cmd/builder@latest要構建自己的發行版,需要使用下面的命令,通過 --config 指定配置文件,也就是下面要介紹的構建清單。
./ocb --config=builder-config.yaml如果不提供,會使用 默認的清單文件[2]。既然我們是要構建自己的發行版,那接來看看如何配置構建清單。
構建清單
構建清單是對 OpenTelemetry Collector 的描述,通常包含如下幾個部分:
- dist:發行版的基本信息
- receivers:集成的 receiver[3] 列表
- exporters:集成的 exporter[4] 列表
- extensions:集成的 extension[5] 列表
- processors:集成的 processor[6] 列表
- connectors:集成的 receiver[7] 列表
從 GitHub 倉庫中可以找到 core 發行版的構建清單[8],我們可以基于該版本進行裁剪(去掉 replace 的部分)。
dist:
module: go.opentelemetry.io/collector/cmd/otelcorecol
name: otelcorecol
description: Local OpenTelemetry Collector binary, testing only.
version: 0.95.0-dev
otelcol_version: 0.95.0
output_path: /tmp/dist
exporters:
- gomod: go.opentelemetry.io/collector/exporter/debugexporter v0.95.0
- gomod: go.opentelemetry.io/collector/exporter/loggingexporter v0.95.0
- gomod: go.opentelemetry.io/collector/exporter/otlpexporter v0.95.0
- gomod: go.opentelemetry.io/collector/exporter/otlphttpexporter v0.95.0
extensions:
- gomod: go.opentelemetry.io/collector/extension/ballastextension v0.95.0
- gomod: go.opentelemetry.io/collector/extension/memorylimiterextension v0.95.0
- gomod: go.opentelemetry.io/collector/extension/zpagesextension v0.95.0
processors:
- gomod: go.opentelemetry.io/collector/processor/batchprocessor v0.95.0
- gomod: go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.95.0
connectors:
- gomod: go.opentelemetry.io/collector/connector/forwardconnector v0.95.0現在為 開頭提到的文章[9] 中可以找到更多的組件。
dist:
module: go.opentelemetry.io/collector/cmd/otelcorecol
name: otelcorecol
description: Local OpenTelemetry Collector binary, testing only.
version: 0.95.0-dev
otelcol_version: 0.95.0
output_path: /tmp/dist
receivers:
- gomod: go.opentelemetry.io/collector/receiver/otlpreceiver v0.95.0
exporters:
- gomod: go.opentelemetry.io/collector/exporter/debugexporter v0.95.0
- gomod: go.opentelemetry.io/collector/exporter/loggingexporter v0.95.0
- gomod: go.opentelemetry.io/collector/exporter/otlpexporter v0.95.0
- gomod: go.opentelemetry.io/collector/exporter/otlphttpexporter v0.95.0
- gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/lokiexporter v0.95.0
extensions:
- gomod: go.opentelemetry.io/collector/extension/ballastextension v0.95.0
- gomod: go.opentelemetry.io/collector/extension/memorylimiterextension v0.95.0
- gomod: go.opentelemetry.io/collector/extension/zpagesextension v0.95.0
processors:
- gomod: go.opentelemetry.io/collector/processor/batchprocessor v0.95.0
- gomod: go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.95.0
- gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.95.0
connectors:
- gomod: go.opentelemetry.io/collector/connector/forwardconnector v0.95.0這樣就準備好了構建清單,執行下面的命令,然后在 dist.output_path 指定的目錄中可以到找構建好的二進制文件。
./ocb --config=builder-config.yaml構建鏡像
通過上面的方法來構建 collector 的二進制文件,進一步再構建容器鏡像。
FROM golang:1.21 as build
ARG OTEL_VERSION=0.95.0
WORKDIR /app
COPY . .
RUN go install go.opentelemetry.io/collector/cmd/builder@v${OTEL_VERSION}
RUN CGO_ENABLED=0 builder --config=builder-config.yaml
FROM gcr.io/distroless/base-debian11
COPY --from=build /tmp/dist/otelcorecol /
# 4317 - default OTLP receiver
# 55678 - opencensus (tracing) receiver
# 55679 - zpages
EXPOSE 4317/tcp 55678/tcp 55679/tcp
CMD ["--config", "/etc/otelcol-contrib/config.yaml"]
ENTRYPOINT ["/otelcorecol"]我已經構建好了鏡像 addozhang/opentelemetry-collector:0.95.0 ,在創建 CR OpenTelemetryCollector 的時候,可以將鏡像修改為我們定制的鏡像。
參考資料
[1] release 頁面: https://github.com/open-telemetry/opentelemetry-collector/releases?q=builder
[2] 默認的清單文件: https://github.com/open-telemetry/opentelemetry-collector/blob/main/cmd/builder/internal/config/default.yaml
[3] receiver: https://opentelemetry.io/docs/collector/configuration/#receivers
[4] exporter: https://opentelemetry.io/docs/collector/configuration/#exporters
[5] extension: https://opentelemetry.io/docs/collector/configuration/#extensions
[6] processor: https://opentelemetry.io/docs/collector/configuration/#processors
[7] receiver: https://opentelemetry.io/docs/collector/configuration/#connectors
[8] core 發行版的構建清單: https://raw.githubusercontent.com/open-telemetry/opentelemetry-collector/main/cmd/otelcorecol/builder-config.yaml
[9] 開頭提到的文章: https://mp.weixin.qq.com/s/DUUDYggjaVtFRbDF3rslhw/



































