TracekitTracekit
Intermediate1-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.

Migration Steps

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

CategoryBeforeAfter (TraceKit)Notes
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.

CategoryBeforeAfter (TraceKit)Notes
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.

CategoryBeforeAfter (TraceKit)Notes
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.

CategoryBeforeAfter (TraceKit)Notes
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.

CategoryBeforeAfter (TraceKit)Notes
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

Go
Before
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()
}
Node.js
Before
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();
Python
Before
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 free and move your traces to TraceKit in 1-2 hours.

Start Free