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 ELK Stack

Overview

This guide walks you through migrating distributed tracing and APM from the ELK Stack (Elastic APM) to SigNoz. You will:

  1. Assess your current Elastic APM services
  2. Replace Elastic APM agents with OpenTelemetry instrumentation
  3. Validate traces are flowing correctly to SigNoz

SigNoz is built natively on OpenTelemetry, so migration involves replacing proprietary Elastic APM agents with standard OpenTelemetry SDKs.

Prerequisites

Before starting, ensure you have:

  • A SigNoz account (Cloud) or a running SigNoz instance (Self-Hosted)
  • Access to your application source code
  • List of services currently instrumented with Elastic APM

Step 1: Assess Your Current Tracing Setup

Inventory which services are using Elastic APM agents.

Identify Instrumented Services

Check your applications for Elastic APM dependencies:

  • Java: elastic-apm-agent.jar
  • Node.js: elastic-apm-node package
  • Python: elastic-apm package
  • Go: go.elastic.co/apm module
  • .NET: Elastic APM .NET Agent

Categorize Your Services

Group services by language to plan the migration path:

LanguageElastic AgentMigration Path
JavaJava AgentReplace with OTel Java Agent
Node.jsNode.js AgentReplace with OTel Node.js SDK
PythonPython AgentReplace with OTel Python SDK
GoGo AgentReplace with OTel Go SDK
.NET.NET AgentReplace with OTel .NET SDK

Step 2: Migrate Each Service

Work through each service from your inventory.

From Elastic APM Java Agent

Step 1: Remove Elastic APM

  • Remove the -javaagent:/path/to/elastic-apm-agent.jar flag.
  • Remove elasticapm.properties if present.

Step 2: Add 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

See Java Instrumentation for details.

From Elastic APM Node.js Agent

Step 1: Remove Elastic APM

npm uninstall elastic-apm-node

Remove require('elastic-apm-node').start(...) from your code.

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

See Node.js Instrumentation for details.

From Elastic APM Python Agent

Step 1: Remove Elastic APM

pip uninstall elastic-apm

Remove elasticapm imports and initialization from your code.

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

See Python Instrumentation for details.

From Elastic APM Go Agent

Step 1: Remove Elastic APM Remove go.elastic.co/apm imports and initialization code.

Step 2: Install OpenTelemetry

go get go.opentelemetry.io/otel \
  go.opentelemetry.io/otel/sdk \
  go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc

Step 3: Instrument Code Initialize the OTel tracer and replace Elastic transactions with OTel spans.

See Go Instrumentation for complete setup.

From Elastic APM .NET Agent

Step 1: Remove Elastic APM Uninstall the Elastic APM .NET agent and remove Elastic.Apm packages.

Step 2: Add OpenTelemetry Use the OpenTelemetry .NET Automatic Instrumentation.

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>
. $HOME/.otel-dotnet-auto/instrument.sh
dotnet run

Other Languages

For languages not listed above (Ruby, PHP, Rust, Elixir, etc.), please refer to the SigNoz Instrumentation Documentation to find the specific guide for your application.

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.

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

  1. Check context propagation: Ensure all services use compatible propagation (W3C Trace Context).
  2. Verify all services are instrumented: Missing instrumentation on any service breaks the trace chain.

Next Steps

Once your traces are flowing to SigNoz:

Last updated: December 1, 2025

Edit on GitHub

Was this page helpful?