Migrate from Honeycomb to TraceKit
Honeycomb embraces OpenTelemetry, which makes migration straightforward -- swap the OTLP endpoint and API key. Or switch to TraceKit's native SDK for live code monitoring and built-in PII scrubbing.
Migration Steps
Swap OTLP Endpoint and API Key
Honeycomb uses standard OpenTelemetry OTLP endpoints. The fastest migration path is to simply point your existing OTel instrumentation to TraceKit's endpoint and replace the Honeycomb API key.
| Category | Before | After (TraceKit) | Notes |
|---|---|---|---|
| Endpoint | OTEL_EXPORTER_OTLP_ENDPOINT (api.honeycomb.io:443) | TRACEKIT_ENDPOINT | Point OTLP exporter to TraceKit endpoint |
| Authentication | HONEYCOMB_API_KEY (x-honeycomb-team header) | TRACEKIT_API_KEY | API key replaces Honeycomb team key |
| Dataset | HONEYCOMB_DATASET | TRACEKIT_SERVICE_NAME | Datasets map to service names in TraceKit |
Update OpenTelemetry Headers
Honeycomb uses custom OTLP headers for authentication and dataset routing. Replace these with TraceKit's headers or switch to the native SDK for additional features.
| Category | Before | After (TraceKit) | Notes |
|---|---|---|---|
| Headers | OTEL_EXPORTER_OTLP_HEADERS=x-honeycomb-team=KEY | OTEL_EXPORTER_OTLP_HEADERS=x-tracekit-key=KEY | Replace Honeycomb auth header |
| Headers | x-honeycomb-dataset=my-service | OTEL_SERVICE_NAME=my-service | Service name via standard OTel resource |
| Environment | HONEYCOMB_API_ENDPOINT (EU region) | TRACEKIT_ENDPOINT (region-specific) | Use region-appropriate endpoint URL |
Optional: Switch to TraceKit Native SDK
While OTLP forwarding works, TraceKit's native SDK adds live code monitoring, automatic PII scrubbing, and simplified initialization. Consider replacing the OTel SDK with TraceKit's SDK for these benefits.
| Category | Before | After (TraceKit) | Notes |
|---|---|---|---|
| Package | @opentelemetry/sdk-node + @honeycomb/opentelemetry | @tracekit/node-apm | Single package replaces OTel SDK + Honeycomb distro |
| Package | opentelemetry-sdk + honeycomb-beeline (Python) | tracekit-apm | Simpler installation, fewer dependencies |
| Features | Standard OTel features only | OTel + live debugging + PII scrubbing | Native SDK adds TraceKit-specific capabilities |
Migrate Derived Columns and SLOs
Honeycomb's derived columns and SLO definitions need to be recreated in TraceKit. TraceKit's built-in dashboards cover common latency and error rate views that replace many derived columns.
| Category | Before | After (TraceKit) | Notes |
|---|---|---|---|
| Queries | Honeycomb Query Builder | TraceKit Dashboard filters | Filter by service, duration, attributes |
| SLOs | Honeycomb SLO definitions | TraceKit Alerts (threshold-based) | Set P95 latency and error rate thresholds |
| Boards | Honeycomb Boards (dashboards) | TraceKit Dashboard views | Built-in service overview, latency, errors |
Verify Traces and Deactivate Honeycomb
Confirm traces appear in TraceKit with correct service names and attributes. Once verified, remove the Honeycomb API key from your environment to stop sending duplicate data.
| Category | Before | After (TraceKit) | Notes |
|---|---|---|---|
| Verification | Honeycomb > Home > Recent traces | TraceKit Dashboard > Traces | Verify trace data and latency distribution |
| Verification | Honeycomb > Service Map (BubbleUp) | TraceKit Service Map | Verify service dependency visualization |
| Cleanup | Remove HONEYCOMB_API_KEY from env | (keep TRACEKIT_API_KEY) | Stop sending to Honeycomb |
Code Examples
import (
"github.com/honeycombio/otel-config-go/otelconfig"
"go.opentelemetry.io/otel"
)
func main() {
cleanup, _ := otelconfig.ConfigureOpenTelemetry(
otelconfig.WithServiceName("my-service"),
otelconfig.WithHeaders(map[string]string{
"x-honeycomb-team": "YOUR_HONEYCOMB_API_KEY",
}),
)
defer cleanup()
tracer := otel.Tracer("my-service")
ctx, span := tracer.Start(ctx, "process-order")
defer span.End()
}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()
}const { HoneycombSDK } = require('@honeycombio/opentelemetry-node');
const { trace } = require('@opentelemetry/api');
const sdk = new HoneycombSDK({
apiKey: 'YOUR_HONEYCOMB_API_KEY',
serviceName: 'my-service',
dataset: 'my-service',
});
sdk.start();
const tracer = trace.getTracer('my-service');
const span = tracer.startSpan('process-order');
// ... business logic
span.end();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();# Using Honeycomb's OpenTelemetry distribution
import os
os.environ['OTEL_EXPORTER_OTLP_ENDPOINT'] = 'https://api.honeycomb.io'
os.environ['OTEL_EXPORTER_OTLP_HEADERS'] = 'x-honeycomb-team=YOUR_API_KEY'
os.environ['OTEL_SERVICE_NAME'] = 'my-service'
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
provider = TracerProvider()
trace.set_tracer_provider(provider)
tracer = trace.get_tracer('my-service')
with tracer.start_as_current_span('process-order'):
pass # business logicimport 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