Intermediate 1-2 hours

Migrate from Grafana Stack to TraceKit

Running Grafana + Tempo + Loki means managing three separate tools, three data stores, and three query languages. TraceKit consolidates tracing, dashboards, and log correlation into one platform.

Start Free
1

Audit Your Grafana Stack Components

Identify which Grafana ecosystem tools you are running (Grafana, Tempo, Loki, Mimir, Alloy/Agent) and which data sources each dashboard uses. TraceKit replaces the tracing pipeline (Tempo) and provides built-in dashboards (replacing Grafana for APM use cases).

CategoryGrafana StackTraceKitNotes
ComponentGrafana (visualization)TraceKit DashboardBuilt-in dashboards for APM; Grafana can remain for infrastructure
ComponentTempo (trace storage)TraceKit (managed trace storage)No self-hosted trace backend needed
ComponentLoki (log aggregation)TraceKit (trace-linked events)Span events replace log-to-trace correlation
ComponentGrafana Alloy / Agent (collector)TraceKit SDK (direct send)SDK sends directly; no collector pipeline
2

Replace Tempo Trace Ingestion

Point your OpenTelemetry instrumentation from the Tempo OTLP endpoint to TraceKit's ingestion endpoint. If you were using Grafana Alloy or the Grafana Agent as a collector, you can remove it -- TraceKit SDKs send directly.

CategoryGrafana StackTraceKitNotes
IngestionTEMPO_STORAGE_TRACE_BACKEND (s3/gcs/azure)(managed by TraceKit)No storage backend to configure
IngestionOTEL_EXPORTER_OTLP_ENDPOINT (Tempo endpoint)TRACEKIT_ENDPOINTPoint OTLP exporter to TraceKit or use native SDK
IngestionTempo distributor port (default 4317)TRACEKIT_ENDPOINT (HTTPS)Single HTTPS endpoint, no gRPC port management
3

Install TraceKit SDK (Optional OTLP Alternative)

While you can keep sending via OTLP, TraceKit's native SDKs offer additional features like live code monitoring and PII scrubbing. Install the SDK alongside your existing OTel instrumentation.

CategoryGrafana StackTraceKitNotes
SDKOpenTelemetry SDK + Tempo exporterTraceKit SDK (native)Native SDK adds live debugging, PII scrubbing
AuthenticationTempo API key / no auth (self-hosted)TRACEKIT_API_KEYAPI key required for managed ingestion
Service IdentityOTEL_SERVICE_NAMETRACEKIT_SERVICE_NAMEService name for trace grouping
4

Migrate Key Dashboards

Identify your critical Grafana dashboards that use Tempo data and recreate them in TraceKit. TraceKit provides built-in service map, trace waterfall, and latency distribution views that replace common Tempo panels.

CategoryGrafana StackTraceKitNotes
DashboardGrafana Tempo data source panelsTraceKit built-in trace viewsService map, waterfall, and latency views are built in
DashboardTraceQL queries in GrafanaTraceKit search and filtersFilter by service, status, duration, attributes
DashboardGF_SERVER_HTTP_PORT (default 3000)TraceKit Dashboard URLCloud-hosted dashboard, no port management
5

Verify Traces and Decommission Tempo

Confirm traces appear in TraceKit, then gradually decommission Tempo and its storage backend. Keep Grafana running for infrastructure dashboards (Prometheus/Mimir data sources) if needed.

CategoryGrafana StackTraceKitNotes
VerificationGrafana > Explore > Tempo data sourceTraceKit Dashboard > TracesVerify trace search and waterfall
VerificationGrafana > Service Graph panelTraceKit Service MapVerify service dependency visualization
DecommissionTempo compactor, distributor, querier pods(not needed)Remove Tempo infrastructure components

Code Examples

Before (Grafana Stack)

import (
    "go.opentelemetry.io/otel"
    "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
    sdktrace "go.opentelemetry.io/otel/sdk/trace"
)

func main() {
    exporter, _ := otlptracegrpc.New(ctx,
        otlptracegrpc.WithEndpoint("tempo:4317"),
        otlptracegrpc.WithInsecure(),
    )
    tp := sdktrace.NewTracerProvider(
        sdktrace.WithBatcher(exporter),
    )
    otel.SetTracerProvider(tp)

    tracer := otel.Tracer("my-service")
    ctx, span := tracer.Start(ctx, "process-order")
    defer span.End()
}

After (TraceKit)

import "github.com/tracekit/go-sdk/tracekit"

func main() {
    tracekit.Init("tk_your_api_key",
        tracekit.WithService("my-service"),
        tracekit.WithEnvironment("production"),
    )
    defer tracekit.Shutdown(context.Background())

    ctx, span := tracekit.StartSpan(context.Background(), "process-order")
    defer span.End()
}

Before (Grafana Stack)

const { NodeTracerProvider } = require('@opentelemetry/sdk-trace-node');
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-grpc');

const exporter = new OTLPTraceExporter({
  url: 'http://tempo:4317',
});
const provider = new NodeTracerProvider();
provider.addSpanProcessor(new BatchSpanProcessor(exporter));
provider.register();

const tracer = provider.getTracer('my-service');
const span = tracer.startSpan('process-order');
// ... business logic
span.end();

After (TraceKit)

const tracekit = require('@tracekit/node-apm');

tracekit.init({
  apiKey: 'tk_your_api_key',
  service: 'my-service',
  environment: 'production',
});

const span = tracekit.startSpan('process-order');
// ... business logic
span.end();

Before (Grafana Stack)

from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter

exporter = OTLPSpanExporter(endpoint="tempo:4317", insecure=True)
provider = TracerProvider()
provider.add_span_processor(BatchSpanProcessor(exporter))
trace.set_tracer_provider(provider)

tracer = trace.get_tracer("my-service")
with tracer.start_as_current_span("process-order"):
    pass  # business logic

After (TraceKit)

import tracekit

tracekit.init(
    api_key='tk_your_api_key',
    service='my-service',
    environment='production',
)

with tracekit.start_span('process-order') as span:
    pass  # business logic

Ready to migrate?

Start your free TraceKit account and follow this guide to migrate from Grafana Stack in 1-2 hours.

Start Free Migration