/** * Einfaches Distributed Tracing * Erstellt Trace-IDs für Request-Tracking */ interface TraceContext { traceId: string; spanId: string; parentSpanId?: string; startTime: number; } const traces = new Map(); /** * Erstellt einen neuen Trace */ export function createTrace(traceId?: string): TraceContext { const id = traceId || generateTraceId(); const trace: TraceContext = { traceId: id, spanId: generateSpanId(), startTime: Date.now(), }; traces.set(id, trace); return trace; } /** * Erstellt einen Child-Span */ export function createSpan(traceId: string, parentSpanId?: string): string { const trace = traces.get(traceId); if (!trace) { throw new Error(`Trace ${traceId} not found`); } const spanId = generateSpanId(); trace.parentSpanId = parentSpanId || trace.spanId; return spanId; } /** * Beendet einen Trace und gibt die Dauer zurück */ export function endTrace(traceId: string): number { const trace = traces.get(traceId); if (!trace) { return 0; } const duration = Date.now() - trace.startTime; traces.delete(traceId); return duration; } /** * Generiert eine Trace-ID */ function generateTraceId(): string { return `trace-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; } /** * Generiert eine Span-ID */ function generateSpanId(): string { return `span-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; } /** * Holt Trace-Informationen */ export function getTrace(traceId: string): TraceContext | undefined { return traces.get(traceId); }