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 New Relic

Overview

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

  1. Check your New Relic services and trace sources
  2. Replace New Relic agents with OpenTelemetry instrumentation
  3. Validate traces are flowing correctly to SigNoz
  4. 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 TypeHow to IdentifyMigration Path
OpenTelemetry SDKinstrumentation.provider = 'opentelemetry'Redirect OTLP exporter
New Relic Java Agentlanguage = 'java', instrumentation.provider = 'newRelic'Replace with OTel Java Agent
New Relic Node.js Agentlanguage = 'nodejs'Replace with OTel Node.js SDK
New Relic Python Agentlanguage = 'python'Replace with OTel Python SDK
New Relic .NET Agentlanguage = 'dotnet'Replace with OTel .NET SDK
New Relic Go Agentlanguage = 'go'Replace with OTel Go SDK
New Relic Ruby Agentlanguage = 'ruby'Replace with OTel Ruby SDK
New Relic PHP Agentlanguage = 'php'Replace with OTel PHP SDK
New Relic Browser Agententity.type = 'BROWSER' or Browser app in New RelicReplace 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:

For collector-based setups, update the exporter in your otel-collector-config.yaml:

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.jar JVM argument
  • Remove newrelic.yml and the newrelic/ 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.config and 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, or in)
  • <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

  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 compatible propagation (W3C Trace Context is recommended).
  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.

High cardinality warnings

If you see warnings about high cardinality:

  1. Review custom attributes: Avoid adding unique IDs (user IDs, request IDs) as span attributes.
  2. Use span events: For high-cardinality data, consider span events instead of attributes.

Next Steps

Once your traces are flowing to SigNoz:

Last updated: November 30, 2025

Edit on GitHub

Was this page helpful?