Zum Inhalt springen
Deutsch

OTel-Tracing-Adapter

OtelTracerAdapter ist der produktionstaugliche Tracer. Er steckt das Tracer- Interface des Frameworks in das OpenTelemetry-SDK, sodass Spans zu dem Backend fließen, das du konfiguriert hast (Jaeger, Tempo, Honeycomb, Datadog, New Relic, Grafana Cloud).

import { trace as otelTrace } from '@opentelemetry/api';
import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
import { SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base';
import { ActorSystem, TracingExtensionId, OtelTracerAdapter } from 'actor-ts';
// 1. OTel-SDK aufsetzen
const provider = new NodeTracerProvider();
provider.addSpanProcessor(new SimpleSpanProcessor(
new OTLPTraceExporter({ url: 'https://otel-collector.example.com/v1/traces' }),
));
provider.register();
// 2. Adapter verdrahten
const system = ActorSystem.create('my-app');
system.extension(TracingExtensionId).configure({
tracer: new OtelTracerAdapter({
tracer: otelTrace.getTracer('actor-ts', '1.0.0'),
}),
});

Mit diesem Setup fließen die Auto-Spans des Frameworks (einer pro Actor-Message) zu deinem Tracing-Backend, verbunden mit W3C-traceparent-Kontext über Cluster-Nodes hinweg.

interface OtelTracerAdapterSettings {
tracer: OtelTracer; // aus @opentelemetry/api
sampler?: Sampler; // optional — meist auf SDK-Ebene konfiguriert
}

Minimal — das OTel-SDK macht die Schwerarbeit (Export, Sampling, Batching usw.). Der Adapter übersetzt nur zwischen APIs.

import { ParentBasedSampler, TraceIdRatioBasedSampler } from '@opentelemetry/sdk-trace-base';
const provider = new NodeTracerProvider({
sampler: new ParentBasedSampler({
root: new TraceIdRatioBasedSampler(0.1), // 10 % der Traces samplen
}),
});

Für Hochdurchsatz-Systeme ist Sampling essenziell:

  • TraceIdRatioBasedSampler(0.1) — 10 % der Traces.
  • AlwaysOnSampler() — jeder Trace (Dev / niedrige Volumen).
  • AlwaysOffSampler() — keiner (nur Debugging).
  • ParentBasedSampler(...) — übernimm die Sampling- Entscheidung des Parents; sampelt nachgelagert eines bereits gesampelten Traces.

Das Framework zeichnet Spans in voller Rate auf; das SDK entscheidet, welche exportiert werden. Nicht gesampelte Spans propagieren weiterhin den Kontext für Korrelation, exportieren aber nicht — Null Backend-Kosten.

OTel-SDK unterstützt viele Exporter:

ExporterBackend
@opentelemetry/exporter-trace-otlp-httpOTLP (Tempo, Jaeger, generische Collector)
@opentelemetry/exporter-trace-otlp-grpcOTLP via gRPC
@opentelemetry/exporter-jaegerJaeger nativ
@opentelemetry/exporter-zipkinZipkin
Anbieter-spezifischDatadog, New Relic, Honeycomb, …

Wähle nach dem bevorzugten Protokoll deines Backends. OTLP-über- HTTP ist am allgemeinsten — funktioniert mit dem OpenTelemetry-Collector, der dann zu jedem Backend routet.

import { Resource } from '@opentelemetry/resources';
const provider = new NodeTracerProvider({
resource: new Resource({
'service.name': 'my-app',
'service.version': '1.2.3',
'deployment.environment': 'production',
'host.name': process.env.HOSTNAME,
}),
});

Resource-Attribute werden auf jedem Span gestempelt und sind der nützlichste Ort für globalen Kontext (Servicename, Version, Region, Pod-Name).

Terminal-Fenster
npm install @opentelemetry/api @opentelemetry/sdk-trace-node
# Plus ein Exporter:
npm install @opentelemetry/exporter-trace-otlp-http

Bring dein eigenes SDK + Exporter-Kombo — das Framework bündelt keines von beiden.

// Tracer aufsetzen:
system.extension(TracingExtensionId).configure({
tracer: new OtelTracerAdapter({ tracer: otelTrace.getTracer('actor-ts') }),
});
// Metriken aufsetzen:
const adapter = new OtelMetricsAdapter({
source: metrics.registry,
meter: otelMetrics.getMeter('actor-ts'),
});
adapter.start();

Das OTel-SDK verbindet Traces, Metriken und Logs über geteilten Kontext. Siehe OTel-Metrics-Adapter.