This page covers how to point an existing Istio mesh at Odigos. It is not a guide to installing or operating Istio. For mesh setup, see the Istio installation guide.
Prerequisites
Kubernetes 1.26 or newer
Kubernetes 1.26+ is required — the
odigos-data-collection-local-traffic service depends on internalTrafficPolicy: Local, which became GA in 1.26.A running Istio mesh
Istio’s control plane (
istiod) must be installed in your cluster. Follow the Istio installation guide.Workloads enrolled in the mesh
Istio only emits spans for workloads that have an Envoy sidecar. Label the namespaces you want traced and restart their workloads so the sidecar is injected:For the full set of injection options, see Istio’s sidecar injection documentation.
Configuration
Register Odigos as an OpenTelemetry provider
Add an OpenTelemetry extension provider to Istio’s Defining the provider on its own does not start any tracing — it only tells Istio where Odigos is.
MeshConfig that points at the Odigos node collector’s OTLP/HTTP endpoint. For background on this field, see Istio’s reference for enabling OpenTelemetry tracing.Apply it using whichever method you use to manage your mesh:- Helm
- istioctl
Add the
meshConfig block to the values for the istiod chart (for example, istiod-values.yaml):istiod-values.yaml
Requires Kubernetes 1.26+. Below that,
odigos-data-collection-local-traffic does not exist and Istio has no endpoint to reach.Enable tracing with the Telemetry API
Create a
Telemetry resource in the Istio root namespace (usually istio-system) that references the provider. This is what actually turns on span reporting. See the Istio Telemetry API for scoping options.Confirm a destination on the default data stream
The Odigos collector only exports data when at least one destination is configured. Because Envoy emits Istio spans on behalf of the mesh rather than any specific Odigos-instrumented workload, the collector routes them through the default data stream — so make sure the destination you want the Istio traces to reach is assigned to the default data stream.
Istio produces spans only for L7 HTTP traffic on Service ports named
http / http-* (or with appProtocol: http). Plain TCP protocols such as Redis or AMQP will not generate mesh spans.Validation
After traffic flows through a meshed workload, look for Envoy spans in your tracing backend. They appear under service names in the form<workload>.<namespace> (for example, frontend.default), distinct from the application service names Odigos reports. You can identify them by:
otel.scope.name=envoycomponent=proxyistio.*resource attributes such asistio.canonical_serviceandistio.mesh_id
Example
Real meshed traces interleave Istio and Odigos spans — every meshed hop adds a pair of Istio sidecar spans (one on each side of the wire) that wrap the callee’s application work, which itself can fan out into more application spans and another mesh hop. A two-hop call throughfrontend → checkout → payments lays out like this:
Horizontal position is wall-clock time; label indentation follows the true parent/child nesting. A child bar always starts after and ends within its parent.
Istio spans are additive — they do not replace the application spans Odigos generates. Each meshed HTTP hop yields an Istio client span, an Istio server span, and the application span(s), all sharing the same trace.