Skip to main content
The Datadog Agent can send a copy of its data to Bronto in addition to Datadog using its additional_endpoints settings. This lets you evaluate Bronto, for example during a proof of value, with the data you already collect and without changing your application instrumentation. This page covers configuration only. For installation instructions, see the Datadog Agent documentation.
Dual shipping is meant for evaluating Bronto and for the transition period while you move from Datadog to Bronto. The Datadog Agent is built to send data to Datadog and needs a valid Datadog API key, so it is not a long-term way to send data to Bronto. Before you stop using Datadog, replace the Agent with the OpenTelemetry Collector. See When you stop using Datadog.

How it works

Bronto accepts the Datadog Agent’s log format directly. Metrics and traces need to be converted to OpenTelemetry (OTLP) first, which an OpenTelemetry Collector with the Datadog receiver does on the way: Datadog keeps receiving everything it does today. You can set up each signal on its own. Logs are the quickest way to evaluate Bronto: they only need a change to the Agent’s configuration. Metrics and traces are optional and need an OpenTelemetry Collector in addition to the Agent. The Agent can also dual ship other Datadog data, such as profiles, live processes, Database Monitoring, Network Device Monitoring, and security events. Bronto does not ingest these.

Send logs

Requirements

Use Datadog Agent 7.37.0 or later. Earlier versions work with the following limitations:

Endpoint and authentication

Use the ingestion endpoint for your Bronto region: Set api_key to your Bronto API key.

Configuration

Each example sets force_use_http: true. The Agent requires the transport to be set explicitly when additional_endpoints is configured, and the same transport is used for Datadog and every additional endpoint.
Edit /etc/datadog-agent/datadog.yaml to add Bronto as an additional log endpoint:
datadog.yaml
To control which dataset and collection the logs are stored in, see Choose the dataset and collection.
For the full additional_endpoints configuration reference, see the Datadog Agent log forwarding documentation.

Choose the dataset and collection

By default, Bronto stores each log in:
  • the dataset named by the log’s Datadog service tag
  • the collection named by the log’s Datadog source tag
You can override either one by setting the br_dataset or br_collection tag on the log. In Kubernetes, the Agent sets source for each container from its short image name, unless you set it in the pod’s log configuration. Containers in the same pod therefore often have different sources. For example, a service’s application container, its service mesh sidecar (such as proxyv2 for Istio) and its init containers each end up in a different collection, all under the same dataset name. To group logs by cluster instead, set br_collection to a cluster identifier with the kubernetes.annotations.logs.bronto.io/collection pod annotation, as shown in the Kubernetes tabs above. To set the dataset the same way, map a second annotation to br_dataset:
datadog-values.yaml
On a host, set the tags in the log source’s configuration in the Agent’s conf.d directory:
conf.d/<APP_NAME>.d/conf.yaml

How logs appear in Bronto

The Datadog Agent sends each log with its tags and metadata, such as service, source, host and Kubernetes tags like kube_namespace and pod_name. Bronto stores these as attributes of the event, separately from the fields it parses from the log message. Some tags you see in Datadog are not in the Agent’s payload, so they don’t reach Bronto. Datadog adds host tags and cloud provider tags, such as the cluster name, region and account, when it receives the log. To identify the cluster in Bronto, set br_collection as described in Choose the dataset and collection. Bronto reads a log’s severity from standard Elastic Common Schema and OpenTelemetry severity fields. Datadog’s status attribute is not one of these. If a log has no standard severity field, its status is the one the Agent assigns: info for logs written to stdout and error for logs written to stderr. To keep the level your application logs, write it to an ECS-compliant field such as log.level.

Store the API key in a Kubernetes Secret

The Kubernetes examples above store the Bronto API key in plain text in a ConfigMap or DatadogAgent resource. For production, set the endpoint through the DD_LOGS_CONFIG_ADDITIONAL_ENDPOINTS environment variable and source it from a Kubernetes Secret instead. Environment variables take precedence over datadog.yaml, so you don’t need customAgentConfig or customConfigurations with this approach. Create the Secret in the namespace where the Datadog Agent runs:
Then reference it from the Agent configuration:
datadog-values.yaml

Verify log collection

After you apply your configuration and restart the Datadog Agent:
  1. Run the Agent status command and check the Logs Agent section:
    The Bronto endpoint is listed alongside the Datadog endpoint, for example Reliable: Sending compressed logs in HTTPS to ingestion.<REGION>.bronto.io on port 443. If it shows TCP instead of HTTPS, check that force_use_http is set.
  2. Check the Agent logs for delivery errors. Failed requests to an additional endpoint are logged as warnings that include the endpoint URL, for example failed to post http payload. On Linux, the Agent logs are in /var/log/datadog/. In Kubernetes, run kubectl logs <AGENT_POD_NAME> -c agent.
  3. Confirm your log data is being ingested to Bronto on the Search page.

Send metrics and traces

The Datadog Agent sends metrics and traces in Datadog’s own format, which Bronto does not ingest directly. Run an OpenTelemetry Collector with the Datadog receiver between the Agent and Bronto. The receiver accepts the Agent’s payloads and the Collector forwards them to Bronto over OTLP. This part is optional. Set it up if you want to evaluate metrics and traces in Bronto as well as logs.

Requirements

  • An OpenTelemetry Collector distribution that includes the datadog receiver, such as otelcol-contrib. This setup was tested with otelcol-contrib 0.158.0.
  • For traces, check your Datadog Agent version:
The Datadog receiver is an alpha component for traces and is in development for metrics. Its behavior can change between Collector releases.

Step 1: Run the Collector

Configure the Datadog receiver and one OTLP exporter per signal:
otel-config.yaml
The receiver listens on port 8127 because the Datadog Agent already uses 8126 for APM. Any free port works, as long as the Agent configuration in the next step uses the same one. Run the Collector where every Datadog Agent can reach it. In Kubernetes, install it with the OpenTelemetry Helm chart as a Deployment. The chart configures Service ports separately from receivers, so add a datadog port for 8127. Without it, the Agents can’t reach the receiver through the Service:
values.yaml
With fullnameOverride: otel-collector, use otel-collector.<NAMESPACE>.svc.cluster.local as <COLLECTOR_HOST> below. For more on running the Collector in Kubernetes, see Connect OpenTelemetry Collector to Bronto. The Bronto API key only needs to be set in the Collector. The Agent does not need it for metrics and traces.

Step 2: Point the Agent at the Collector

Add the Collector as an additional endpoint for metrics (additional_endpoints) and traces (apm_config.additional_endpoints). The Agent requires an API key for every endpoint, but the Datadog receiver ignores it, so any placeholder value works.
Edit /etc/datadog-agent/datadog.yaml:
datadog.yaml
Restart the Agent to apply the change.
If you already set apm_config.features or DD_APM_FEATURES, add disable-convert-traces to your existing list instead of replacing it.

Traces with newer Agents

Starting with version 7.84.0, the Datadog Agent converts traces into a new internal format before sending them. The Datadog receiver cannot read this format yet. It accepts the payloads without an error and produces no spans, so traces never reach Bronto and neither the Agent nor the Collector reports a problem. The disable-convert-traces APM feature keeps the Agent on the previous trace format. Metrics and logs are not affected. The feature is not part of Datadog’s public documentation, so test it in a non-production environment first, and check Verify metrics and traces after every Agent upgrade.

What to expect in Bronto

Metrics Datadog tags become metric attributes. The receiver translates common tags to OpenTelemetry resource attributes, so filter on the translated names: The receiver also translates other Kubernetes, ECS, and HTTP tags. See the receiver’s tag mapping for the full list. host.name comes from the hostname the Agent reports, not from a tag. Other key:value tags keep their key, and tags without a value get an unnamed_ prefix. Besides your custom metrics, the Agent sends the metrics from its checks (for example system.*, container.*, and integration metrics) and its own telemetry under datadog.*. The Agent’s own telemetry can be a large share of the metric names. To leave it out, add a filter processor to the metrics pipeline:
otel-config.yaml
Traces Traces keep their service and parent-child structure, and the receiver restores full 128-bit trace IDs. Bronto receives the same traces as Datadog: the ones the Agent keeps after sampling. Span names usually stay as they are in Datadog, but the receiver renames spans from common integrations to follow OpenTelemetry naming: The original Datadog name of a renamed span is not kept, so search for these spans by their new name. The Datadog resource name is always stored in the dd.span.Resource span attribute. Agent warnings The Agent also sends host metadata to the /intake path of every metrics endpoint. The Datadog receiver rejects it, so the Agent logs recurring warnings like error "405 Method Not Allowed" while sending transaction to "http://<COLLECTOR_HOST>:8127/intake/". You can ignore these warnings. Metrics are not affected.

Verify metrics and traces

After you apply the configuration and restart the Agent:
  1. Run the Agent status command. The Collector is listed under Forwarder → Endpoints for metrics and under APM Agent → Endpoints for traces.
  2. Check the Agent logs for errors that include the Collector’s URL. Apart from the /intake/ warnings described above, there should be none.
  3. Check the data in Bronto:
    • Metrics: search for one of your metrics, or a check metric such as system.load.1, in the Metric Explorer.
    • Traces: confirm your services appear in Explore Traces.
Always check traces in Bronto, not only in the Agent’s status. If the Agent sends a trace format the receiver can’t read, the Agent and the Collector both report success.

When you stop using Datadog

Dual shipping only works while the Datadog Agent still sends data to Datadog. Before your Datadog contract ends, move your collection to OpenTelemetry:
  1. Deploy the OpenTelemetry Collector to collect logs, metrics, and traces and send them to Bronto. See Connect OpenTelemetry Collector to Bronto.
  2. Point your applications at the Collector instead of the Datadog Agent. See Send Metrics to Bronto and Send Traces to Bronto.
  3. Check that your data arrives in Bronto, then remove the Datadog Agent.