The datadog receiver speaks the Datadog Agent's own protocol, so no host has to be reinstrumented before data reaches ClickStack: re-point each agent's dd_url, apm_config.apm_dd_url, and logs_config.logs_dd_url at this collector. The otlp receiver takes the services already moved to OTel SDKs, so hosts on either side of the migration run through one pipeline.
ClickStack Managed has no ingestion endpoint of its own, so the ClickStack leg is the clickhouse exporter writing straight to your Cloud service over its HTTPS endpoint, into the otel_* tables HyperDX reads out of the box. Metrics stay in a single pipeline because neither backend needs a conversion processor: the datadog exporter turns cumulative sums into Datadog counts itself, and ClickHouse stores whichever temporality arrives. Each exporter has its own file_storage-backed queue, so an outage on one backend does not block delivery to the other.
Set DD_API_KEY and DD_SITE for the current backend, and CLICKHOUSE_ENDPOINT, CLICKHOUSE_DATABASE, CLICKHOUSE_USER, and CLICKHOUSE_PASSWORD for the Cloud service, the same variables the Ship OTel data to ClickHouse flow uses. Both backends receive identical data for as long as the bridge runs; removing the datadog exporter from the pipelines completes the cutover.
Use this flow
Open the config in Telflo and it becomes a working pipeline on the canvas: adapt what's specific to you, test it against recorded traffic, and push it to your fleet over OpAMP. Free account, no card.
Components
What's in it, and why
Liveness endpoint on :13133 so an orchestrator can tell whether the collector is up.
Backs each exporter queue with disk, so a restart does not drop buffered telemetry. Creates its own directory on first start.
Accepts traces, metrics, and logs from the Datadog Agents already installed on your hosts, so no host has to be reinstrumented before data reaches ClickStack.
Entry point for the services you have already moved to OTel SDKs, over gRPC and HTTP.
First in every pipeline so overload becomes backpressure at the receiver rather than an OOM kill of the bridge.
Maps the Datadog env tag onto the semconv deployment.environment.name for OTLP traffic, matching what the datadog receiver already emits, so one HyperDX filter covers everything.
Builds the large inserts ClickHouse wants, at least 1000 rows per request; the datadog exporter re-batches for its own intake caps internally.
Continues delivery to Datadog for the length of the migration, with its own disk-backed queue.
Writes the standard otel_logs, otel_traces, and otel_metrics_* tables that ClickStack/HyperDX reads, straight into your ClickHouse Cloud service.
Notes
Gotchas
- 1
The
datadogreceiver is an alpha component with no real/api/v1/validateroute: the catch-all handler answers validation calls with an empty 200 while telemetry flows normally. Replay recorded agent traffic through the bridge before rolling it out to a fleet. - 2
Only traces, metrics, and logs have an intake here. Live Process, Network Performance Monitoring, and orchestrator traffic have nowhere to land, so leave those agents pointed at Datadog until you stop paying for them.
- 3
Datadog Agent logs only reach this receiver over HTTP; set
logs_config.force_use_http: trueon the agent or the log stream silently stays on the old path. Agents must also disable the v3 metrics API (use_v3_api.series.enabled: false): the receiver has no v3 series intake and answers those payloads with a 200 while dropping them, so agents on 7.81+ defaults lose metrics silently. ClickHouse's migration guide pins Agent 7.59 or newer. - 4
At this collector version the
datadogexporter'sretry_on_failureapplies to logs only. Traces are attempted once and metrics rely on the Datadog client's internal retry, so a long Datadog outage can drop queued traces even though the queue is disk-backed. ClickStack delivery is unaffected because each exporter owns its own queue. - 5
Agent-computed APM trace stats pass through the metrics pipeline to Datadog (the receiver hands them to the exporter as a
dd.internal.stats.payloadmetric), so keep thedatadogreceiver and exporter in the same metrics pipeline. Services already on OTel SDKs produce no Datadog APM stats through the bridge, because the exporter's own stats computation is off by default at this version; add thedatadogconnector if you still need their APM numbers during the migration. - 6
Datadog Agents send delta metrics and OTel SDKs send cumulative; ClickStack stores each point's temporality as data, and the
datadogexporter converts cumulative sums itself, which is why no pipeline runs a temporality processor. Datadog's metrics intake is the least-tested signal on the receiver, and ClickHouse's migration guide says to migrate metrics last. - 7
The
clickhouseexporter's metrics support is alpha at this version (traces and logs are beta).create_schema: truemakes the first run create theotel_*tables ClickStack reads; in production set it to false and manage the schema yourself so TTL changes are deliberate rather than applied by whichever collector starts first. - 8
HyperDX keys everything off
service.name: records that arrive without one land under a blank service and cannot be filtered by service. The receiver promotes the agent'sservicetag automatically, but check the OTLP side before trusting the comparison. - 9
Both backends receive a full copy of everything, so egress and Datadog ingest cost roughly double for as long as the bridge runs.
Sources and references (10)ShowHide
Everything consulted while researching and fact-checking this flow, including the README of every component it uses.
- clickhouse.com/docs/clickstack/migration/datadog
- clickhouse.com/docs/use-cases/observability/clickstack/deployment/clickstack-clickhouse-cloud
- clickhouse.com/docs/use-cases/observability/clickstack/ingesting-data/otel-collector
- clickhouse.com/docs/use-cases/observability/clickstack/ingesting-data/schemas
- clickhouse.com/docs/use-cases/observability/clickstack/config
- github.com/open-telemetry/opentelemetry-collector-contrib/blob/v0.155.0/receiver/datadogreceiver/README.md
- github.com/open-telemetry/opentelemetry-collector-contrib/blob/v0.155.0/exporter/datadogexporter/README.md
- github.com/open-telemetry/opentelemetry-collector-contrib/blob/v0.155.0/exporter/clickhouseexporter/README.md
- github.com/open-telemetry/opentelemetry-collector-contrib/blob/v0.155.0/extension/storage/filestorage/README.md
- docs.datadoghq.com/agent/logs/log_transport/
More flows
Related flows
Ship OTel data to ClickHouse
Parses JSON log bodies into queryable attributes, coalesces msg/log and lvl/level field variants, maps severity text onto the OTel severity fields, and masks PII in attributes and bodies.
Dual-ship to two backends during a migration
Fans every trace, metric, and log out to both the legacy agent and the new OTLP/HTTP backend so the two can be compared side by side during a migration.
Move from Datadog to Elastic without a monitoring gap
Accepts traffic from the Datadog Agents you already run and dual-ships every trace, metric, and log to both Datadog and Elastic, so the two can be compared on identical data before you cut over.
Test it before your fleet runs it
Free account, no card. Open this flow in the editor, adapt it, and see what it does to real data before anything ships.