EDOT data streams
Serverless Observability Stack
Elastic Distribution of OpenTelemetry writes telemetry data to two types of data stream schemas in Elasticsearch:
- OTel-native data streams (default)
- ECS-compatible data streams (for backwards compatibility with APM)
This page provides a practical reference for which data streams EDOT uses, exporter behavior, and storage engines. For a detailed comparison of OTel data streams with classic APM and ECS-based integrations, see OTel data streams compared to classic APM.
To learn how to route OpenTelemetry (OTel) signals to custom data streams, see Data stream routing.
EDOT may use two Elasticsearch exporters:
otel: sends data to OTel-native data streamsecs: sends data to ECS-compatible data streams
The ecs exporter ensures compatibility with legacy APM data formats.
When EDOT runs as a local gateway or Collector, it writes telemetry data to different data streams depending on the storage mode and exporter configuration:
This is the default mode. When ingesting standard OTel signals, EDOT writes to:
| Signal | Data stream |
|---|---|
| Traces | traces-otel-* |
| Metrics | metrics-otel-* (TSDB-backed using mode: time_series) |
| Logs | logs-otel-* |
| Aggregated service destination metrics | metrics-service_destination.[1m\|10m\|60m].otel-* |
These streams follow OTel naming conventions and field structures.
When the ecs exporter is enabled, or when ingesting data from APM agents using elasticapmintake, EDOT writes to:
traces-apm-*traces-apm.sampled-*metrics-apm.internal-*metrics-apm.*-*metrics-apm.service_destination.[interval]-*logs-apm.error-*logs-apm.app.*-*
These match legacy APM Server behavior.
The Elastic Cloud Managed OTLP Endpoint follows the same stream selection logic as local EDOT deployments:
- OTel-native streams for standard OTel telemetry
- ECS-compatible streams for APM-formatted events
The main difference is that Elastic Cloud Managed OTLP Endpoint is a managed cloud service that handles ingestion and storage, whereas local EDOT deployments require you to manage the Collector infrastructure yourself. Ingest and storage behavior remain consistent between both approaches.
You may notice fields like:
resource.attributes.service.nameservice.name
These are not true duplicates. Here's why:
- OTel defines attributes at multiple levels (for example: resource, span).
- EDOT stores resource attributes under
resource.attributes.*, according to OTel specifications. - Kibana dashboards and APM UI rely on ECS-style top-level fields like
service.name.
To bridge these models, EDOT aliases or copies key fields so that:
- Dashboards continue to function
- Filters and searches behave consistently
- OTel structure remains intact for downstream compatibility
This duplication is intentional.
| Data type | Storage engine |
|---|---|
| Metrics | TSDB (mode: time_series) |
| Logs | LogsDB |
| Traces | Standard time-series model |
EDOT uses the same index templates and mappings as the rest of the Observability solution.