# OpenTelemetry Collector with Target Allocator # Managed by OpenTelemetry Operator # # Architecture: # - DaemonSet mode: one collector per node for log collection # - Target Allocator: distributes scrape targets across collectors # - Filelog receiver for container logs # - Prometheus receiver with Target Allocator for metrics # - Exports to: Tempo (traces), Prometheus (metrics), Loki (logs) apiVersion: opentelemetry.io/v1beta1 kind: OpenTelemetryCollector metadata: name: otel-collector namespace: opentelemetry spec: mode: daemonset image: otel/opentelemetry-collector-contrib:0.113.0 serviceAccount: otel-collector # Target Allocator disabled - metrics collected by Prometheus directly # OTel handles logs (filelog) and traces (otlp) only resources: requests: cpu: 50m memory: 512Mi limits: memory: 512Mi volumeMounts: - name: varlogpods mountPath: /var/log/pods readOnly: true - name: varlibdockercontainers mountPath: /var/lib/docker/containers readOnly: true volumes: - name: varlogpods hostPath: path: /var/log/pods - name: varlibdockercontainers hostPath: path: /var/lib/docker/containers ports: - name: otlp-grpc port: 4317 protocol: TCP targetPort: 4317 - name: otlp-http port: 4318 protocol: TCP targetPort: 4318 - name: metrics port: 8888 protocol: TCP targetPort: 8888 env: - name: K8S_NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName - name: K8S_POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: K8S_POD_IP valueFrom: fieldRef: fieldPath: status.podIP config: receivers: otlp: protocols: grpc: endpoint: 0.0.0.0:4317 http: endpoint: 0.0.0.0:4318 # Filelog receiver for container logs filelog: include: - /var/log/pods/*/*/*.log exclude: - /var/log/pods/opentelemetry_otel-collector*/*/*.log start_at: end include_file_path: true include_file_name: false operators: - type: router id: get-format routes: - output: parser-docker expr: 'body matches "^\\{"' - output: parser-containerd expr: 'body matches "^[^ Z]+Z"' default: parser-containerd - type: json_parser id: parser-docker output: extract-metadata-from-filepath timestamp: parse_from: attributes.time layout: '%Y-%m-%dT%H:%M:%S.%LZ' - type: regex_parser id: parser-containerd regex: '^(?P