otelcol (OpenTelemetry Collector) und das Werkzeug otel-cli gehören zum OpenTelemetry-Ökosystem. Der Collector ist das zentrale Element: Er nimmt Telemetriedaten entgegen, verarbeitet sie und leitet sie an ein oder mehrere Backends weiter. Diese Referenz zeigt Konfiguration, Prüfung und Diagnose.
Start und Prüfung
# Mit Konfigurationsdatei starten
otelcol --config /etc/otelcol/config.yaml
# Konfiguration vor dem Start prüfen
otelcol validate --config /etc/otelcol/config.yaml
# Als Dienst
systemctl status otelcol
systemctl enable --now otelcol
# Endpunkte: OTLP gRPC 4317, OTLP HTTP 4318, interne Metriken 8888
Aufbau der Konfiguration
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
prometheus:
config:
scrape_configs:
- job_name: node
static_configs:
- targets: ["web01:9100"]
processors:
batch:
timeout: 5s
send_batch_size: 1000
memory_limiter:
check_interval: 1s
limit_percentage: 75
spike_limit_percentage: 20
resourcedetection:
detectors: [env, system]
exporters:
otlphttp/tempo:
endpoint: http://tempo:4318
prometheusremotewrite:
endpoint: http://mimir:9009/api/v1/push
debug:
verbosity: basic
service:
pipelines:
traces:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [otlphttp/tempo]
metrics:
receivers: [otlp, prometheus]
processors: [memory_limiter, batch]
exporters: [prometheusremotewrite]
telemetry:
metrics:
readers:
- pull:
exporter:
prometheus:
host: 0.0.0.0
port: 8888
Drei Bausteintypen sind zu unterscheiden: Receivers nehmen Daten an, Processors verändern sie, Exporters geben sie weiter. Die service-Sektion verbindet sie zu Pipelines pro Signalart (traces, metrics, logs).
Zwei wichtige Prozessoren
- memory_limiter: gehört an den Anfang jeder Pipeline. Bei Speicherdruck verwirft der Collector Daten, statt selbst abzustürzen – ein abgestürzter Collector verliert alles, ein überlasteter nur einen Anteil.
- batch: gehört ans Ende. Es bündelt Datensätze und reduziert die Anzahl der Netzwerkaufrufe an das Backend erheblich.
Konfiguration prüfen und testen
# Gültigkeit prüfen
otelcol validate --config config.yaml
# Mit Debug-Ausgabe starten: zeigt Datensätze auf der Konsole
# exporter "debug" in die Pipeline aufnehmen
otelcol --config config.yaml | grep -i "Resource"
# Testdaten erzeugen
otel-cli exec --service demo --name "test-span" --attribute key=value true
otel-cli span --service demo --name "mein-span" --endpoint localhost:4317
# Direkt per curl testen (OTLP/HTTP, Protobuf)
# Praktischer: ein SDK-Beispielprogramm senden lassen
Betrieb und Skalierung
# Collector als DaemonSet auf jedem Knoten (Konfiguration in Kubernetes)
# kubectl get pods -n observability -l app=otelcol
# Collector als Deployment für zentrale Aggregation
# - Agent-Modus: jede Node liefert an den zentralen Collector
# - Gateway-Modus: nur Export nach außen
# Mehrere Collectoren hintereinander: loadbalancing-Exporter
exporters:
loadbalancing:
routing_key: traceID # oder service
protocol:
otlp:
ttl: 30s
timeout: 5s
resolver:
static:
hostnames:
- otelcol-0:4317
- otelcol-1:4317
Der loadbalancing-Exporter ist die Antwort auf horizontale Skalierung: Er verteilt Spans desselben Traces immer an dieselbe Instanz, weil sonst Teile eines Traces in verschiedenen Collectoren landen und dort verworfen würden.
Wichtige Filter und Transformationen
processors:
# Nicht benötigte Attribute entfernen (spart Volumen und Kosten)
attributes/scrub:
actions:
- key: http.request.header.authorization
action: delete
- key: k8s.pod.uid
action: delete
# Nur bestimmte Dienste durchlassen
filter/traces:
error_mode: ignore
traces:
span:
- 'attributes["service.name"] == "healthcheck"'
# Attribute umbenennen
transform:
trace_statements:
- context: span
statements:
- set(attributes["env"], "prod")
Praxis-Tipps
memory_limiterimmer zuerst: Ohne ihn kann der Collector bei Lastspitzen den gesamten Knoten in Speichernot bringen.- Debug-Exporter nur kurzzeitig: Er schreibt jeden Datensatz auf die Konsole – bei realer Last ist das selbst eine Lastursache.
- Sampling nicht vergessen: Vollständiges Tracing in großen Umgebungen erzeugt enormes Volumen. Sampling-Entscheidungen gehören in die Anwendung oder in den Collector, nicht ins Backend.
- Auth für OTLP: Ein offener OTLP-Empfänger im Netz nimmt Daten von jedem an. Für den internen Betrieb genügt TLS plus ein Token-Header; nach außen gehört ein Reverse-Proxy mit Authentifizierung davor.
Verwandte Grundlagen: OpenTelemetry, Observability, promtool-Befehle, Jaeger.