basant307/AI_Governance_Project
048
1/**2 * @license3 * Copyright 2025 Qwen4 * SPDX-License-Identifier: Apache-2.05 */6 7import { trace, isSpanContextValid, INVALID_TRACEID } from '@opentelemetry/api';8import type { Span } from '@opentelemetry/api';9import { getSessionContext } from './session-context.js';10 11export const ZERO_TRACE_ID = INVALID_TRACEID;12 13export interface TraceContext {14 traceId: string;15 spanId: string;16 traceFlags: number;17}18 19function extractTraceContext(span: Span | undefined): TraceContext | null {20 const ctx = span?.spanContext();21 if (ctx && isSpanContextValid(ctx)) {22 return {23 traceId: ctx.traceId,24 spanId: ctx.spanId,25 traceFlags: ctx.traceFlags,26 };27 }28 return null;29}30 31export function getActiveSpanTraceContext(): TraceContext | null {32 try {33 return extractTraceContext(trace.getActiveSpan());34 } catch {35 return null;36 }37}38 39export function getSessionRootTraceContext(): TraceContext | null {40 try {41 const sessionCtx = getSessionContext();42 return extractTraceContext(43 sessionCtx ? trace.getSpan(sessionCtx) : undefined,44 );45 } catch {46 return null;47 }48}49 50export function getTraceContext(): TraceContext | null {51 return getActiveSpanTraceContext() ?? getSessionRootTraceContext();52}53 54export function formatTraceparent(ctx: TraceContext): string {55 const flags = (ctx.traceFlags & 0xff).toString(16).padStart(2, '0');56 return `00-${ctx.traceId}-${ctx.spanId}-${flags}`;57}58 59let shellTracePropagationEnabled = false;60 61export function setShellTracePropagation(enabled: boolean): void {62 shellTracePropagationEnabled = enabled;63}64 65export function isShellTracePropagationEnabled(): boolean {66 return shellTracePropagationEnabled;67}68 