Files
sell/middlelayer/monitoring/tracing.ts

79 lines
1.6 KiB
TypeScript

/**
* Einfaches Distributed Tracing
* Erstellt Trace-IDs für Request-Tracking
*/
interface TraceContext {
traceId: string;
spanId: string;
parentSpanId?: string;
startTime: number;
}
const traces = new Map<string, TraceContext>();
/**
* 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);
}