Overview
This guide walks you through migrating distributed tracing and APM from Datadog to SigNoz. You will:
- Check your Datadog services and trace sources
- Replace Datadog APM libraries with OpenTelemetry instrumentation
- 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
| Aspect | Datadog | SigNoz |
|---|---|---|
| Instrumentation | dd-trace libraries (proprietary) | OpenTelemetry SDKs (open standard) |
| Protocol | Datadog Agent protocol | OTLP (OpenTelemetry Protocol) |
| Auto-instrumentation | Language-specific dd-trace auto-instrumenters | OTel auto-instrumenters |
| Context Propagation | Datadog headers + W3C | W3C Trace Context (standard) |
| Sampling | Datadog Agent sampling | OTel 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
- Navigate to APM → Services in Datadog.
- List all services sending traces.
- Note the language/runtime for each service.
Categorize Your Services
Group services by how they're instrumented:
| Instrumentation Type | How to Identify | Migration Path |
|---|---|---|
| dd-trace-java | Java services with dd-java-agent.jar | Replace with OTel Java Agent |
| dd-trace-js | Node.js services with dd-trace package | Replace with OTel Node.js SDK |
| dd-trace-py | Python services with ddtrace package | Replace with OTel Python SDK |
| dd-trace-dotnet | .NET services with Datadog .NET tracer | Replace with OTel .NET SDK |
| dd-trace-go | Go services with gopkg.in/DataDog/dd-trace-go.v1 | Replace with OTel Go SDK |
| dd-trace-rb | Ruby services with ddtrace gem | Replace with OTel Ruby SDK |
| dd-trace-php | PHP services with Datadog PHP tracer | Replace 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.jarJVM 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:
<region>: Your SigNoz Cloud region (us,eu, orin)<SIGNOZ_INGESTION_KEY>: Your ingestion key from Settings → Ingestion Settings
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
- In SigNoz, navigate to Services in the left sidebar.
- Verify each service from your inventory appears in the list.
- Click a service to see its metrics (latency, error rate, throughput).
Verify Traces
- Navigate to Traces in the left sidebar.
- Select a service and time range.
- Verify spans appear with expected attributes.
- Check that trace context propagates across service boundaries (parent-child relationships).
Troubleshooting
Traces not appearing in SigNoz
- Check connectivity: Verify your application can reach
ingest.<region>.signoz.cloud:443. - Verify service name: Ensure
OTEL_SERVICE_NAMEor the equivalent config is set. - Check application logs: Look for OpenTelemetry exporter errors.
- Enable debug logging: Set
OTEL_LOG_LEVEL=debugto see detailed SDK logs.
Broken or incomplete traces
If traces appear fragmented across services:
- Check context propagation: Ensure all services use W3C Trace Context propagation.
- Verify all services are instrumented: Missing instrumentation on any service breaks the trace chain.
- Check HTTP headers: Verify
traceparentheader is being passed between services.
Missing spans within a service
If some operations aren't being traced:
- Check auto-instrumentation coverage: Some libraries may not be auto-instrumented.
- Add manual instrumentation: For custom code, add manual spans using the OTel API.
- Verify sampling: Check if sampling is dropping spans unintentionally.
- 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:
- Create dashboards with trace-based panels
- Set up trace-based alerts for latency and errors
- Correlate traces with logs for debugging
- Explore the Service Map to understand dependencies
- Migrate your logs next