SigNoz Cloud - This page is relevant for SigNoz Cloud editions.
Self-Host - This page is relevant for self-hosted SigNoz editions.

Migrate Traces/APM from Datadog

Overview

This guide walks you through migrating distributed tracing and APM from Datadog to SigNoz. You will:

  1. Check your Datadog services and trace sources
  2. Replace Datadog APM libraries with OpenTelemetry instrumentation
  3. Validate traces are flowing correctly to SigNoz

SigNoz is built natively on OpenTelemetry, so migration involves replacing Datadog tracing libraries with OTel instrumentation.

Key Differences: Datadog vs SigNoz

AspectDatadogSigNoz
Instrumentationdd-trace libraries (proprietary)OpenTelemetry SDKs (open standard)
ProtocolDatadog Agent protocolOTLP (OpenTelemetry Protocol)
Auto-instrumentationLanguage-specific dd-trace auto-instrumentersOTel auto-instrumenters
Context PropagationDatadog headers + W3CW3C Trace Context (standard)
SamplingDatadog Agent samplingOTel SDK or Collector sampling

Prerequisites

Before starting, ensure you have:

  • A SigNoz account (Cloud) or a running SigNoz instance (Self-Hosted)
  • Access to your Datadog account to review current APM services
  • Access to your application source code and deployment configuration

Step 1: Assess Your Current Tracing Setup

Before migrating, inventory what you're collecting in Datadog.

List Your Instrumented Services

  1. Navigate to APM → Services in Datadog.
  2. List all services sending traces.
  3. Note the language/runtime for each service.

Categorize Your Services

Group services by how they're instrumented:

Instrumentation TypeHow to IdentifyMigration Path
dd-trace-javaJava services with dd-java-agent.jarReplace with OTel Java Agent
dd-trace-jsNode.js services with dd-trace packageReplace with OTel Node.js SDK
dd-trace-pyPython services with ddtrace packageReplace with OTel Python SDK
dd-trace-dotnet.NET services with Datadog .NET tracerReplace with OTel .NET SDK
dd-trace-goGo services with gopkg.in/DataDog/dd-trace-go.v1Replace with OTel Go SDK
dd-trace-rbRuby services with ddtrace gemReplace with OTel Ruby SDK
dd-trace-phpPHP services with Datadog PHP tracerReplace with OTel PHP SDK

Step 2: Migrate Each Service

Work through each service from your inventory.

From dd-trace-java

Step 1: Remove the Datadog agent

  • Remove the -javaagent:/path/to/dd-java-agent.jar JVM argument
  • Remove Datadog-specific environment variables (DD_*)

Step 2: Add the OpenTelemetry Java agent

Download the agent:

curl -L -o opentelemetry-javaagent.jar \
  https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar

Step 3: Configure and run

java -javaagent:/path/to/opentelemetry-javaagent.jar \
     -Dotel.service.name=your-service-name \
     -Dotel.exporter.otlp.endpoint=https://ingest.<region>.signoz.cloud:443 \
     -Dotel.exporter.otlp.headers=signoz-ingestion-key=<SIGNOZ_INGESTION_KEY> \
     -jar your-application.jar

Replace:

For detailed configuration options, see Java Instrumentation.

From dd-trace-js (Node.js)

Step 1: Remove the Datadog tracer

npm uninstall dd-trace

Remove require('dd-trace').init() from your application entry point and delete any DD_* environment variables.

Step 2: Add OpenTelemetry

npm install @opentelemetry/auto-instrumentations-node

Step 3: Configure and run

export OTEL_SERVICE_NAME=your-service-name
export OTEL_EXPORTER_OTLP_ENDPOINT=https://ingest.<region>.signoz.cloud:443
export OTEL_EXPORTER_OTLP_HEADERS=signoz-ingestion-key=<SIGNOZ_INGESTION_KEY>
export NODE_OPTIONS="--require @opentelemetry/auto-instrumentations-node/register"

node app.js

For detailed configuration, see Node.js Instrumentation.

From dd-trace-py (Python)

Step 1: Remove the Datadog tracer

pip uninstall ddtrace

Remove ddtrace-run from your startup command and delete any DD_* environment variables.

Step 2: Add OpenTelemetry

pip install opentelemetry-distro opentelemetry-exporter-otlp
opentelemetry-bootstrap -a install

Step 3: Configure and run

export OTEL_SERVICE_NAME=your-service-name
export OTEL_EXPORTER_OTLP_ENDPOINT=https://ingest.<region>.signoz.cloud:443
export OTEL_EXPORTER_OTLP_HEADERS=signoz-ingestion-key=<SIGNOZ_INGESTION_KEY>

opentelemetry-instrument python app.py

For detailed configuration, see Python Instrumentation.

From dd-trace-dotnet

Step 1: Remove the Datadog tracer

  • Uninstall the Datadog .NET tracer from your system
  • Remove DD_* environment variables

Step 2: Add OpenTelemetry

For automatic instrumentation, download the OpenTelemetry .NET automatic instrumentation:

# Linux
curl -L -o otel-dotnet-install.sh https://github.com/open-telemetry/opentelemetry-dotnet-instrumentation/releases/latest/download/otel-dotnet-auto-install.sh
chmod +x otel-dotnet-install.sh
./otel-dotnet-install.sh

Step 3: Configure and run

export OTEL_SERVICE_NAME=your-service-name
export OTEL_EXPORTER_OTLP_ENDPOINT=https://ingest.<region>.signoz.cloud:443
export OTEL_EXPORTER_OTLP_HEADERS=signoz-ingestion-key=<SIGNOZ_INGESTION_KEY>

# Source the instrumentation script
. $HOME/.otel-dotnet-auto/instrument.sh

dotnet run

For detailed configuration, see .NET Instrumentation.

From dd-trace-go

Step 1: Remove the Datadog tracer

Remove gopkg.in/DataDog/dd-trace-go.v1 imports and delete tracer initialization code:

// Remove this
import "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
tracer.Start()
defer tracer.Stop()

Step 2: Install OpenTelemetry packages

go get go.opentelemetry.io/otel \
  go.opentelemetry.io/otel/sdk \
  go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc \
  go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp

Step 3: Set environment variables

export OTEL_EXPORTER_OTLP_ENDPOINT="https://ingest.<region>.signoz.cloud:443"
export OTEL_EXPORTER_OTLP_HEADERS="signoz-ingestion-key=<SIGNOZ_INGESTION_KEY>"
export OTEL_SERVICE_NAME="your-service-name"

Step 4: Initialize and instrument

See Go Instrumentation for complete setup including:

  • Tracer initialization code
  • Framework-specific instrumentation (Gin, Echo, Chi, Fiber, Gorilla)
  • Database instrumentation (GORM, MongoDB, Redis)
  • gRPC instrumentation

From dd-trace-rb (Ruby)

Step 1: Remove the Datadog tracer

Remove from your Gemfile:

# Remove this line
gem 'ddtrace'

Run bundle install and remove Datadog configuration.

Step 2: Add OpenTelemetry

Add to your Gemfile:

gem 'opentelemetry-sdk'
gem 'opentelemetry-exporter-otlp'
gem 'opentelemetry-instrumentation-all'

Run bundle install.

Step 3: Configure

Create an initializer config/initializers/opentelemetry.rb:

require 'opentelemetry/sdk'
require 'opentelemetry/exporter/otlp'
require 'opentelemetry/instrumentation/all'

OpenTelemetry::SDK.configure do |c|
  c.service_name = 'your-service-name'
  c.use_all
end

Set environment variables:

export OTEL_EXPORTER_OTLP_ENDPOINT=https://ingest.<region>.signoz.cloud:443
export OTEL_EXPORTER_OTLP_HEADERS=signoz-ingestion-key=<SIGNOZ_INGESTION_KEY>

For detailed configuration, see Ruby Instrumentation.

From dd-trace-php

Step 1: Remove the Datadog tracer

Disable or uninstall the Datadog PHP extension from your PHP configuration.

Step 2: Add OpenTelemetry

Install the OpenTelemetry PHP extension and SDK following the PHP Instrumentation guide.

Step 3: Configure

export OTEL_SERVICE_NAME=your-service-name
export OTEL_EXPORTER_OTLP_ENDPOINT=https://ingest.<region>.signoz.cloud:443
export OTEL_EXPORTER_OTLP_HEADERS=signoz-ingestion-key=<SIGNOZ_INGESTION_KEY>

Other Languages and Frameworks

For languages not covered above or specific frameworks, see the complete Instrumentation Guide which covers:

  • All supported languages and frameworks
  • Framework-specific auto-instrumentation
  • Manual instrumentation options

Validate

Verify traces are flowing correctly by comparing against your service inventory.

Check Services Are Reporting

  1. In SigNoz, navigate to Services in the left sidebar.
  2. Verify each service from your inventory appears in the list.
  3. Click a service to see its metrics (latency, error rate, throughput).

Verify Traces

  1. Navigate to Traces in the left sidebar.
  2. Select a service and time range.
  3. Verify spans appear with expected attributes.
  4. Check that trace context propagates across service boundaries (parent-child relationships).

Troubleshooting

Traces not appearing in SigNoz

  1. Check connectivity: Verify your application can reach ingest.<region>.signoz.cloud:443.
  2. Verify service name: Ensure OTEL_SERVICE_NAME or the equivalent config is set.
  3. Check application logs: Look for OpenTelemetry exporter errors.
  4. Enable debug logging: Set OTEL_LOG_LEVEL=debug to see detailed SDK logs.

Broken or incomplete traces

If traces appear fragmented across services:

  1. Check context propagation: Ensure all services use W3C Trace Context propagation.
  2. Verify all services are instrumented: Missing instrumentation on any service breaks the trace chain.
  3. Check HTTP headers: Verify traceparent header is being passed between services.

Missing spans within a service

If some operations aren't being traced:

  1. Check auto-instrumentation coverage: Some libraries may not be auto-instrumented.
  2. Add manual instrumentation: For custom code, add manual spans using the OTel API.
  3. Verify sampling: Check if sampling is dropping spans unintentionally.
  4. Mixed Datadog/OTel: If some services are still on Datadog, the spans will not be visible in SigNoz.

Next Steps

Once your traces are flowing to SigNoz:

Last updated: December 2, 2025

Edit on GitHub

Was this page helpful?