Einen eigenen Collector mit dem OpenTelemetry Collector Builder bauen
Beschreibe die benötigten Komponenten in einem Manifest, baue ein kleines Binary oder Image und wisse, wann sich der Aufwand lohnt.
Die vorgefertigten Collector-Images sind bequem, aber breit. Die Contrib-Distribution enthält Hunderte von Komponenten, von denen du die meisten nie nutzen wirst, und die Core-Distribution hat zu wenige. Wenn du ein kleineres Binary, eine reduzierte Angriffsfläche oder eine eigene, private Komponente willst, kannst du genau den Collector bauen, den du brauchst, mit dem OpenTelemetry Collector Builder (ocb). Die Eingabe ist ein einzelnes YAML-Manifest, sodass der gesamte Prozess konfigurationsgesteuert bleibt.
Wann du einen eigenen baust
- Du willst nur die Komponenten, die du nutzt, für ein kleineres Image und weniger zu patchende Abhängigkeiten.
- Die Sicherheitsrichtlinie verlangt, dass du aus dem Quellcode baust und die Lieferkette kontrollierst.
- Du brauchst eine Komponente, die in keiner offiziellen Distribution enthalten ist, etwa eine selbst geschriebene.
Trifft nichts davon zu, nutze die offiziellen Distributionen. Einen eigenen zu bauen bedeutet, dass du für das erneute Bauen verantwortlich bist, wenn Komponenten Sicherheitskorrekturen erhalten.
Den Builder installieren
ocb ist ein Go-Programm, das mit jeder Collector-Version veröffentlicht wird. Lade das Binary für deine Plattform von der GitHub-Releases-Seite des Collectors herunter oder installiere es mit Go:
go install go.opentelemetry.io/collector/cmd/builder@v0.163.0
Nutze dieselbe Version für den Builder und die Komponenten. (Die gezeigte Version ist ein Beispiel; nutze ein aktuelles Release.) Die Go-Toolchain muss installiert sein, um einen Build auszuführen. Prüfe die Installationsanleitung in der OpenTelemetry-Dokumentation auf den genauen Binary-Namen und die Download-Links, da sie sich je nach Release unterscheiden.
Das Manifest schreiben
# builder-config.yaml
dist:
name: otelcol-custom
description: Custom OpenTelemetry Collector
output_path: ./otelcol-custom
# Optional: die Version des Core-Collectors, gegen die gebaut wird
# otelcol_version: 0.163.0
receivers:
- gomod: go.opentelemetry.io/collector/receiver/otlpreceiver v0.163.0
- gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver v0.163.0
processors:
- gomod: go.opentelemetry.io/collector/processor/batchprocessor v0.163.0
- gomod: go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.163.0
- gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor v0.163.0
exporters:
- gomod: go.opentelemetry.io/collector/exporter/otlpexporter v0.163.0
- gomod: go.opentelemetry.io/collector/exporter/otlphttpexporter v0.163.0
- gomod: go.opentelemetry.io/collector/exporter/debugexporter v0.163.0
extensions:
- gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.163.0
providers:
- gomod: go.opentelemetry.io/collector/confmap/provider/envprovider v1.0.0
- gomod: go.opentelemetry.io/collector/confmap/provider/fileprovider v1.0.0
Kernpunkte:
- Jeder Eintrag benennt ein Go-Modul und eine Version (
gomod). Contrib-Komponenten liegen untergithub.com/open-telemetry/opentelemetry-collector-contrib/...und Core-Komponenten untergo.opentelemetry.io/collector/.... - Komponenten-Versionen müssen kompatibel sein. Core-Komponenten, Contrib-Komponenten und der Builder werden gemeinsam veröffentlicht; halte alle auf demselben Release. Gemischte Versionen verursachen Compile-Fehler.
- Provider bestimmen, welche Konfigurationsquellen verfügbar sind. Willst du, dass
${env:VAR}und${file:/path}funktionieren, nimmenvproviderundfileproviderauf. Ein Binary ohne sie kann diese Referenzen nicht auflösen. Provider-Module haben eigene Versionsnummern (oftv1.x), schlage sie also für das Release nach, gegen das du baust. - Modulpfade und -namen von Komponenten können sich ändern, kopiere sie also aus der README der jeweiligen Komponente oder dem eigenen Manifest der Contrib-Distribution statt aus dem Gedächtnis.
Du kannst replaces: nutzen, um ein Modul durch einen lokalen Fork zu ersetzen, und gomod-Einträge können auf deine privaten Repositories zeigen.
Bauen
ocb --config builder-config.yaml
# oder, wenn mit go install installiert:
builder --config builder-config.yaml
Das Ausgabeverzeichnis enthält generierten Go-Quellcode und ein kompiliertes Binary, ./otelcol-custom/otelcol-custom. Führe es mit einer gewöhnlichen Konfigurationsdatei aus und prüfe, was enthalten ist:
./otelcol-custom/otelcol-custom components # auflisten, was einkompiliert wurde
./otelcol-custom/otelcol-custom validate --config=config.yaml
./otelcol-custom/otelcol-custom --config=config.yaml
Referenziert deine Konfiguration eine Komponente, die nicht eingebaut wurde, schlägt der Collector beim Start fehl und nennt sie. Füge sie dem Manifest hinzu und baue neu.
Als Container-Image paketieren
Ein mehrstufiges Dockerfile baut in einem Go-Image und kopiert das Ergebnis in eine minimale Basis:
FROM golang:1.24 AS build
WORKDIR /src
RUN go install go.opentelemetry.io/collector/cmd/builder@v0.163.0
COPY builder-config.yaml .
RUN CGO_ENABLED=0 builder --config builder-config.yaml
FROM gcr.io/distroless/static-debian12:nonroot
COPY --from=build /src/otelcol-custom/otelcol-custom /otelcol-custom
USER nonroot
ENTRYPOINT ["/otelcol-custom"]
CMD ["--config=/etc/otelcol/config.yaml"]
Nutze eine Go-Version, die der Anforderung des Collector-Releases entspricht (prüfe die Release Notes), und erwäge, Images per Digest zu pinnen. Baue und veröffentliche das Image in CI und deploye es genauso wie jedes offizielle Image: über das Helm-Chart (image.repository und image.tag) oder den Operator (spec.image).
Beachte, dass die Presets des Helm-Charts voraussetzen, dass bestimmte Komponenten existieren. Konfiguriere bei einem eigenen Image die Receiver und Prozessoren selbst oder bestätige, dass jeder, den ein Preset braucht, enthalten war.
Wartbar halten
- Halte
builder-config.yamlin Git und baue in CI, nicht auf Laptops. - Baue neu, wenn ein neues Collector-Release erscheint oder ein Sicherheitshinweis eine von dir genutzte Komponente betrifft. Renovate oder Dependabot können die Versionsstrings beobachten.
- Führe in CI
componentsund einen Smoke-Test mit einer repräsentativen Konfiguration aus, damit eine fehlende Komponente vor dem Deployment auffällt. - Beginne mit dem Contrib-Manifest und entferne, was du nicht nutzt, statt von null aufzubauen.
Beliebte Anleitungen
-
OpenTelemetry erklärt: SDKs, OTLP und der Collector Verstehe die beweglichen Teile und die drei Orte, an denen Konfiguration lebt, bevor du irgendein YAML schreibst. -
Das Konfigurationsmodell des Collectors: Komponenten, Pipelines und Provider Lerne die Regeln des Collector-YAML: Benennung, Pipelines, Connectors, Zusammenführen von Dateien und Umgebungsvariablen. -
SDKs mit OTEL_*-Umgebungsvariablen konfigurieren Setze Service-Namen, Exporter, Sampling und Limits für jede Sprache mit Standardvariablen. -
Apps ohne Code-Änderungen instrumentieren: Java, Python und Node.js Hänge OpenTelemetry-Agents allein mit Umgebungsvariablen und Kommandozeilen-Flags an. -
Den Collector produktionsreif machen: Speicherlimits, Batching und Retries Konfiguriere Prozessoren, Queues und persistenten Speicher, damit Telemetrie Überlast und Ausfälle übersteht. -
Den Collector auf Kubernetes mit Helm deployen Installiere das offizielle Chart, nutze Presets für Logs und Metriken und überschreibe die Konfiguration über Values-Dateien. -
Fehler bei Collector und SDKs beheben Eine systematische Checkliste für den Fall, dass Telemetrie nicht ankommt: Debug-Exporter, Health Checks, interne Metriken und häufige Fehler.