You can run an OpenTelemetry collector to receive metrics, traces, and access logs from Kong Mesh sidecars and forward them to one or more backends. For step-by-step setup, see Deploy an OpenTelemetry collector.
Sidecars push telemetry to the collector over OTLP gRPC on port 4317. The collector receives the telemetry, batches it, and exports it to whatever backends you configure.
Kong Mesh uses a push model: each sidecar opens an outbound connection to one collector Pod and writes its own telemetry. In a pull model, by contrast, a collector scrapes Prometheus endpoints from every workload it can reach.
The distinction matters when you pick a topology. A CNCF post warns about 20-40x metric explosion when DaemonSet collectors all scrape the same Prometheus targets which is a problem specific to the pull model. Because Kong Mesh pushes, each metric reaches one collector instance regardless of how many collector Pods exist.
Two patterns work for the OTLP receiver.
Run two or three collector replicas behind a ClusterIP service. Sidecars resolve otel-collector.observability:4317 to the Service IP, and kube-proxy load-balances each connection to a collector Pod.
We recommend this topology because it’s simple, the failure domain is the whole replica set, and a rolling update of the collector doesn’t drop telemetry from any specific node. Use a Deployment for small and medium clusters, or any cluster where collector throughput isn’t a bottleneck.
Run one collector Pod per node and route traffic node-locally. With internalTrafficPolicy: Local on the service, kube-proxy on each node only forwards to the collector Pod on that same node. Sidecars still resolve the same DNS name (otel-collector.observability:4317), but the hop never leaves the node.
Pick a DaemonSet for large clusters or workloads where the extra network hop matters. A DaemonSet improves locality, distributes load across nodes, and isolates collector failure to a single node’s telemetry.
The trade-off is silent loss. If the collector Pod on a node crashes or is restarting, sidecars on that node have no fallback and drop their telemetry until the Pod is ready. The Local traffic policy does not fail over to other nodes.