Overview
This guide walks you through migrating distributed tracing and APM from New Relic to SigNoz. You will:
- Check your New Relic services and trace sources
- Replace New Relic agents with OpenTelemetry instrumentation
- Validate traces are flowing correctly to SigNoz
- Map New Relic attributes to OpenTelemetry conventions
SigNoz is built natively on OpenTelemetry, so migration involves replacing New Relic agents with OTel instrumentation.
Prerequisites
Before starting, ensure you have:
- A SigNoz account (Cloud) or a running SigNoz instance (Self-Hosted)
- Access to your New Relic 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 New Relic.
List Your Instrumented Services
Run this NRQL query in New Relic's Query Builder to list all services sending traces:
SELECT uniques(entity.name) FROM Span SINCE 7 days ago LIMIT MAX
For a breakdown by language/agent type:
SELECT count(*)
FROM Span
SINCE 7 days ago
FACET entity.name, instrumentation.provider, language
LIMIT MAX
Categorize Your Services
Group services by how they're instrumented:
| Instrumentation Type | How to Identify | Migration Path |
|---|---|---|
| OpenTelemetry SDK | instrumentation.provider = 'opentelemetry' | Redirect OTLP exporter |
| New Relic Java Agent | language = 'java', instrumentation.provider = 'newRelic' | Replace with OTel Java Agent |
| New Relic Node.js Agent | language = 'nodejs' | Replace with OTel Node.js SDK |
| New Relic Python Agent | language = 'python' | Replace with OTel Python SDK |
| New Relic .NET Agent | language = 'dotnet' | Replace with OTel .NET SDK |
| New Relic Go Agent | language = 'go' | Replace with OTel Go SDK |
| New Relic Ruby Agent | language = 'ruby' | Replace with OTel Ruby SDK |
| New Relic PHP Agent | language = 'php' | Replace with OTel PHP SDK |
| New Relic Browser Agent | entity.type = 'BROWSER' or Browser app in New Relic | Replace with OTel Browser SDK |
Step 2: Migrate Each Service
Work through each service from your inventory.
From OpenTelemetry SDK
If you're already using OpenTelemetry with New Relic's OTLP endpoint, redirect to SigNoz:
Before (New Relic):
OTEL_EXPORTER_OTLP_ENDPOINT=https://otlp.nr-data.net
OTEL_EXPORTER_OTLP_HEADERS=api-key=<NEW_RELIC_LICENSE_KEY>
After (SigNoz Cloud):
OTEL_EXPORTER_OTLP_ENDPOINT=https://ingest.<region>.signoz.cloud:443
OTEL_EXPORTER_OTLP_HEADERS=signoz-ingestion-key=<SIGNOZ_INGESTION_KEY>
Replace:
<region>: Your SigNoz Cloud region (us,eu, orin)<SIGNOZ_INGESTION_KEY>: Your ingestion key from Settings → Ingestion Settings
For collector-based setups, update the exporter in your otel-collector-config.yaml:
exporters:
otlp:
endpoint: ingest.<region>.signoz.cloud:443
headers:
signoz-ingestion-key: <SIGNOZ_INGESTION_KEY>
tls:
insecure: false
service:
pipelines:
traces:
exporters: [otlp]
From New Relic Java Agent
Step 1: Remove the New Relic agent
- Remove the
-javaagent:/path/to/newrelic.jarJVM argument - Remove
newrelic.ymland thenewrelic/directory
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
For detailed configuration options, see Java Instrumentation.
From New Relic Node.js Agent
Step 1: Remove the New Relic agent
npm uninstall newrelic
Remove require('newrelic') from your application entry point and delete newrelic.js config file.
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 New Relic Python Agent
Step 1: Remove the New Relic agent
pip uninstall newrelic
Remove import newrelic.agent and newrelic.agent.initialize() from your code. Delete newrelic.ini.
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 New Relic .NET Agent
Step 1: Remove the New Relic agent
- Uninstall the New Relic .NET agent from your system
- Remove
newrelic.configand any New Relic 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 New Relic Go Agent
Step 1: Remove the New Relic agent
Remove github.com/newrelic/go-agent/v3/newrelic from your imports and delete New Relic initialization code.
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="<service-name>"
Replace:
<region>: Your SigNoz Cloud region (us,eu, orin)<SIGNOZ_INGESTION_KEY>: Your ingestion key from Settings → Ingestion Settings<service-name>: A descriptive name for your service
Step 4: Initialize and instrument
The Go SDK reads configuration from environment variables. 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 New Relic Ruby Agent
Step 1: Remove the New Relic agent
Remove from your Gemfile:
# Remove this line
gem 'newrelic_rpm'
Run bundle install and delete newrelic.yml.
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 New Relic PHP Agent
Step 1: Remove the New Relic agent
Disable or uninstall the New Relic 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>
From New Relic Browser Agent
If you were using New Relic Browser for frontend monitoring, migrate to OpenTelemetry browser instrumentation.
For frontend applications:
See Frontend Monitoring for setup instructions.
Other Languages and Frameworks
For languages not covered above (Elixir, Rust, C++, Swift) or specific frameworks (Django, FastAPI, Spring Boot, Laravel, etc.), see the complete Instrumentation Guide which covers:
- All supported languages and frameworks
- Framework-specific auto-instrumentation
- Manual instrumentation options
Step 3: Attribute Mapping Reference
When migrating, be aware that New Relic and OpenTelemetry use different attribute names. If you have dashboards or alerts that reference specific attributes, you'll need to update them.
For a complete list, see New Relic attribute dictionary and OpenTelemetry semantic conventions.
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 compatible propagation (W3C Trace Context is recommended).
- 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.
High cardinality warnings
If you see warnings about high cardinality:
- Review custom attributes: Avoid adding unique IDs (user IDs, request IDs) as span attributes.
- Use span events: For high-cardinality data, consider span events instead of attributes.
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