79 lines
1.6 KiB
TypeScript
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);
|
|
}
|
|
|