veryfront 0.1.246 → 0.1.248
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm/cli/mcp/tools/project-tools.d.ts +1 -1
- package/esm/cli/mcp/tools/scaffold-tools.d.ts +2 -2
- package/esm/cli/shared/server-startup.d.ts.map +1 -1
- package/esm/cli/shared/server-startup.js +8 -0
- package/esm/deno.d.ts +0 -9
- package/esm/deno.js +5 -12
- package/esm/src/agent/durable.d.ts +67 -0
- package/esm/src/agent/durable.d.ts.map +1 -1
- package/esm/src/agent/durable.js +134 -0
- package/esm/src/agent/index.d.ts +1 -1
- package/esm/src/agent/index.d.ts.map +1 -1
- package/esm/src/agent/index.js +1 -1
- package/esm/src/embedding/upload-loader.d.ts +2 -2
- package/esm/src/embedding/upload-loader.d.ts.map +1 -1
- package/esm/src/embedding/upload-loader.js +11 -48
- package/esm/src/errors/middleware/cli-error-boundary.js +1 -1
- package/esm/src/errors/middleware/http-error-boundary.js +1 -1
- package/esm/src/errors/tracing.d.ts +3 -3
- package/esm/src/errors/tracing.d.ts.map +1 -1
- package/esm/src/errors/tracing.js +3 -3
- package/esm/src/extensions/interfaces/index.d.ts +2 -2
- package/esm/src/extensions/interfaces/index.d.ts.map +1 -1
- package/esm/src/extensions/interfaces/node-compat.d.ts +68 -10
- package/esm/src/extensions/interfaces/node-compat.d.ts.map +1 -1
- package/esm/src/extensions/interfaces/tracing-exporter.d.ts +35 -1
- package/esm/src/extensions/interfaces/tracing-exporter.d.ts.map +1 -1
- package/esm/src/integrations/schema.d.ts +10 -10
- package/esm/src/mcp/index.d.ts +7 -2
- package/esm/src/mcp/index.d.ts.map +1 -1
- package/esm/src/mcp/index.js +7 -2
- package/esm/src/mcp/schemas/index.d.ts +1 -1
- package/esm/src/mcp/schemas/index.d.ts.map +1 -1
- package/esm/src/mcp/schemas/index.js +1 -1
- package/esm/src/mcp/schemas/mcp.schema.d.ts +13 -7
- package/esm/src/mcp/schemas/mcp.schema.d.ts.map +1 -1
- package/esm/src/mcp/schemas/mcp.schema.js +17 -7
- package/esm/src/mcp/server.d.ts +13 -0
- package/esm/src/mcp/server.d.ts.map +1 -1
- package/esm/src/mcp/server.js +43 -6
- package/esm/src/observability/auto-instrument/http-instrumentation.js +1 -1
- package/esm/src/observability/auto-instrument/react-instrumentation.js +1 -1
- package/esm/src/observability/instruments/build-instruments.d.ts +1 -1
- package/esm/src/observability/instruments/build-instruments.d.ts.map +1 -1
- package/esm/src/observability/instruments/cache-instruments.d.ts +1 -1
- package/esm/src/observability/instruments/cache-instruments.d.ts.map +1 -1
- package/esm/src/observability/instruments/data-instruments.d.ts +1 -1
- package/esm/src/observability/instruments/data-instruments.d.ts.map +1 -1
- package/esm/src/observability/instruments/error-instruments.d.ts +1 -1
- package/esm/src/observability/instruments/error-instruments.d.ts.map +1 -1
- package/esm/src/observability/instruments/http-instruments.d.ts +1 -1
- package/esm/src/observability/instruments/http-instruments.d.ts.map +1 -1
- package/esm/src/observability/instruments/instruments-factory.d.ts +1 -1
- package/esm/src/observability/instruments/instruments-factory.d.ts.map +1 -1
- package/esm/src/observability/instruments/memory-instruments.d.ts +1 -1
- package/esm/src/observability/instruments/memory-instruments.d.ts.map +1 -1
- package/esm/src/observability/instruments/render-instruments.d.ts +1 -1
- package/esm/src/observability/instruments/render-instruments.d.ts.map +1 -1
- package/esm/src/observability/instruments/rsc-instruments.d.ts +1 -1
- package/esm/src/observability/instruments/rsc-instruments.d.ts.map +1 -1
- package/esm/src/observability/metrics/manager.d.ts.map +1 -1
- package/esm/src/observability/metrics/manager.js +10 -2
- package/esm/src/observability/metrics/types.d.ts +1 -1
- package/esm/src/observability/metrics/types.d.ts.map +1 -1
- package/esm/src/observability/simple-metrics/otel-instruments.d.ts.map +1 -1
- package/esm/src/observability/simple-metrics/otel-instruments.js +7 -2
- package/esm/src/observability/simple-metrics/types.d.ts +1 -1
- package/esm/src/observability/simple-metrics/types.d.ts.map +1 -1
- package/esm/src/observability/tracing/api-shim.d.ts +177 -0
- package/esm/src/observability/tracing/api-shim.d.ts.map +1 -0
- package/esm/src/observability/tracing/api-shim.js +234 -0
- package/esm/src/observability/tracing/manager.d.ts.map +1 -1
- package/esm/src/observability/tracing/manager.js +29 -4
- package/esm/src/observability/tracing/otlp-setup.d.ts +12 -8
- package/esm/src/observability/tracing/otlp-setup.d.ts.map +1 -1
- package/esm/src/observability/tracing/otlp-setup.js +59 -136
- package/esm/src/observability/tracing/types.d.ts +1 -1
- package/esm/src/observability/tracing/types.d.ts.map +1 -1
- package/esm/src/platform/compat/kv/factory.d.ts.map +1 -1
- package/esm/src/platform/compat/kv/factory.js +15 -6
- package/esm/src/platform/compat/opaque-deps.d.ts +6 -5
- package/esm/src/platform/compat/opaque-deps.d.ts.map +1 -1
- package/esm/src/platform/compat/opaque-deps.js +13 -37
- package/esm/src/proxy/tracing.d.ts +7 -2
- package/esm/src/proxy/tracing.d.ts.map +1 -1
- package/esm/src/proxy/tracing.js +31 -96
- package/esm/src/rendering/rsc/client-module-strategy.d.ts.map +1 -1
- package/esm/src/rendering/rsc/client-module-strategy.js +9 -1
- package/esm/src/server/bootstrap.d.ts.map +1 -1
- package/esm/src/server/bootstrap.js +27 -1
- package/esm/src/server/context/request-context.d.ts.map +1 -1
- package/esm/src/server/context/request-context.js +7 -4
- package/esm/src/server/dev-server/middleware.js +1 -1
- package/esm/src/server/handlers/dev/files/dev-file.handler.d.ts.map +1 -1
- package/esm/src/server/handlers/dev/files/dev-file.handler.js +4 -14
- package/esm/src/server/services/rendering/ssr.service.d.ts.map +1 -1
- package/esm/src/server/services/rendering/ssr.service.js +4 -1
- package/esm/src/server/services/rsc/endpoints/rsc-bundles.generated.js +1 -1
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/esm/src/workflow/claude-code/workspace-sync.d.ts +17 -2
- package/esm/src/workflow/claude-code/workspace-sync.d.ts.map +1 -1
- package/esm/src/workflow/claude-code/workspace-sync.js +106 -19
- package/esm/src/workflow/schemas/workflow.schema.d.ts +3 -3
- package/package.json +1 -9
- package/src/cli/shared/server-startup.ts +8 -0
- package/src/deno.js +5 -12
- package/src/src/agent/durable.ts +237 -0
- package/src/src/agent/index.ts +4 -0
- package/src/src/cache/backends/factory.ts +1 -1
- package/src/src/cache/backends/redis.ts +1 -1
- package/src/src/cache/keys/utils.ts +1 -1
- package/src/src/cache/registry.ts +1 -1
- package/src/src/data/static-paths-fetcher.ts +1 -1
- package/src/src/embedding/upload-loader.ts +14 -63
- package/src/src/errors/middleware/cli-error-boundary.ts +1 -1
- package/src/src/errors/middleware/http-error-boundary.ts +1 -1
- package/src/src/errors/tracing.ts +4 -4
- package/src/src/extensions/interfaces/index.ts +7 -2
- package/src/src/extensions/interfaces/node-compat.ts +74 -10
- package/src/src/extensions/interfaces/tracing-exporter.ts +36 -1
- package/src/src/mcp/index.ts +7 -2
- package/src/src/mcp/schemas/index.ts +1 -0
- package/src/src/mcp/schemas/mcp.schema.ts +20 -7
- package/src/src/mcp/server.ts +60 -6
- package/src/src/observability/auto-instrument/http-instrumentation.ts +1 -1
- package/src/src/observability/auto-instrument/react-instrumentation.ts +1 -1
- package/src/src/observability/auto-instrument/wrappers.ts +1 -1
- package/src/src/observability/instruments/build-instruments.ts +1 -1
- package/src/src/observability/instruments/cache-instruments.ts +6 -1
- package/src/src/observability/instruments/data-instruments.ts +1 -1
- package/src/src/observability/instruments/error-instruments.ts +1 -1
- package/src/src/observability/instruments/http-instruments.ts +6 -1
- package/src/src/observability/instruments/instruments-factory.ts +1 -1
- package/src/src/observability/instruments/memory-instruments.ts +5 -1
- package/src/src/observability/instruments/render-instruments.ts +1 -1
- package/src/src/observability/instruments/rsc-instruments.ts +1 -1
- package/src/src/observability/metrics/manager.ts +11 -3
- package/src/src/observability/metrics/types.ts +7 -1
- package/src/src/observability/simple-metrics/otel-instruments.ts +7 -2
- package/src/src/observability/simple-metrics/types.ts +1 -1
- package/src/src/observability/tracing/api-shim.ts +409 -0
- package/src/src/observability/tracing/manager.ts +29 -4
- package/src/src/observability/tracing/otlp-setup.ts +76 -168
- package/src/src/observability/tracing/types.ts +1 -1
- package/src/src/platform/compat/kv/factory.ts +18 -7
- package/src/src/platform/compat/opaque-deps.ts +16 -44
- package/src/src/proxy/tracing.ts +43 -117
- package/src/src/rendering/rsc/client-module-strategy.ts +9 -1
- package/src/src/server/bootstrap.ts +38 -1
- package/src/src/server/context/request-context.ts +10 -7
- package/src/src/server/dev-server/middleware.ts +1 -1
- package/src/src/server/handlers/dev/files/dev-file.handler.ts +4 -22
- package/src/src/server/services/rendering/ssr.service.ts +4 -1
- package/src/src/server/services/rsc/endpoints/rsc-bundles.generated.ts +1 -1
- package/src/src/utils/version-constant.ts +1 -1
- package/src/src/workflow/claude-code/workspace-sync.ts +109 -20
- package/esm/src/utils/logger/trace-bridge.d.ts +0 -11
- package/esm/src/utils/logger/trace-bridge.d.ts.map +0 -1
- package/esm/src/utils/logger/trace-bridge.js +0 -12
- package/src/src/utils/logger/trace-bridge.ts +0 -14
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import { isDeno } from "../../platform/compat/runtime.js";
|
|
7
7
|
import { serverLogger as logger } from "../../utils/index.js";
|
|
8
8
|
import { VERSION } from "../../utils/version.js";
|
|
9
|
+
import { getGlobalMetricsAPI } from "../tracing/api-shim.js";
|
|
9
10
|
import type { OtelInstruments } from "./types.js";
|
|
10
11
|
|
|
11
12
|
let otelInitialized = false;
|
|
@@ -26,8 +27,12 @@ export async function ensureOtelInstruments(): Promise<void> {
|
|
|
26
27
|
if (!isDeno) return;
|
|
27
28
|
|
|
28
29
|
try {
|
|
29
|
-
|
|
30
|
-
|
|
30
|
+
// The metrics API is injected by ext-opentelemetry via setGlobalMetricsAPI().
|
|
31
|
+
// When the extension is not active, the meter is unavailable and we return.
|
|
32
|
+
const metricsApi = getGlobalMetricsAPI();
|
|
33
|
+
if (!metricsApi) return;
|
|
34
|
+
|
|
35
|
+
const meter = metricsApi.getMeter("veryfront", VERSION);
|
|
31
36
|
|
|
32
37
|
otel.meter = meter;
|
|
33
38
|
otel.ssrHistogram = meter.createHistogram("veryfront.ssr.duration", {
|
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thin in-process shim for `@opentelemetry/api`.
|
|
3
|
+
*
|
|
4
|
+
* Core files that previously imported directly from `@opentelemetry/api` now
|
|
5
|
+
* import from this module. When the `ext-opentelemetry` extension is present
|
|
6
|
+
* the real SDK provider is wired in via `setGlobalTracerProvider`; otherwise
|
|
7
|
+
* every call falls back to a no-op implementation so the core boots without the
|
|
8
|
+
* extension installed.
|
|
9
|
+
*
|
|
10
|
+
* **Tracing types and constants** (exported for call-site use):
|
|
11
|
+
* `Span`, `Tracer`, `TracerProvider`, `Context`, `TextMapPropagator`
|
|
12
|
+
* `SpanKind`, `SpanStatusCode`
|
|
13
|
+
*
|
|
14
|
+
* **Metrics types** (re-exported structural shapes for the metrics subsystem;
|
|
15
|
+
* not backed by a live SDK — the metrics subsystem is wired separately):
|
|
16
|
+
* `Meter`, `Counter`, `Histogram`, `ObservableGauge`, `UpDownCounter`,
|
|
17
|
+
* `ObservableResult`
|
|
18
|
+
*
|
|
19
|
+
* @module observability/tracing/api-shim
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// Tracing types
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
|
|
26
|
+
// OTel SDK types `AttributeValue | undefined` on setAttribute/setAttributes so
|
|
27
|
+
// indexed lookups into partial attribute records don't require null-filtering
|
|
28
|
+
// at every call site. Mirror that loose typing here so callers match the SDK.
|
|
29
|
+
export type AttributeValue = string | number | boolean | undefined;
|
|
30
|
+
|
|
31
|
+
export interface Span {
|
|
32
|
+
setAttribute(key: string, value: AttributeValue): Span;
|
|
33
|
+
setAttributes(attrs: Record<string, AttributeValue>): Span;
|
|
34
|
+
setStatus(status: { code: number; message?: string }): Span;
|
|
35
|
+
recordException(err: unknown): void;
|
|
36
|
+
addEvent(name: string, attrs?: Record<string, AttributeValue>): Span;
|
|
37
|
+
end(endTime?: number): void;
|
|
38
|
+
spanContext(): SpanContext;
|
|
39
|
+
updateName(name: string): void;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface SpanContext {
|
|
43
|
+
traceId: string;
|
|
44
|
+
spanId: string;
|
|
45
|
+
traceFlags: number;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export interface Tracer {
|
|
49
|
+
startSpan(
|
|
50
|
+
name: string,
|
|
51
|
+
options?: {
|
|
52
|
+
kind?: number;
|
|
53
|
+
attributes?: Record<string, AttributeValue>;
|
|
54
|
+
},
|
|
55
|
+
context?: Context,
|
|
56
|
+
): Span;
|
|
57
|
+
startActiveSpan<T>(
|
|
58
|
+
name: string,
|
|
59
|
+
fn: (span: Span) => T,
|
|
60
|
+
): T;
|
|
61
|
+
startActiveSpan<T>(
|
|
62
|
+
name: string,
|
|
63
|
+
options: { kind?: number; attributes?: Record<string, AttributeValue> },
|
|
64
|
+
fn: (span: Span) => T,
|
|
65
|
+
): T;
|
|
66
|
+
startActiveSpan<T>(
|
|
67
|
+
name: string,
|
|
68
|
+
options: { kind?: number; attributes?: Record<string, AttributeValue> },
|
|
69
|
+
context: Context,
|
|
70
|
+
fn: (span: Span) => T,
|
|
71
|
+
): T;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export interface TracerProvider {
|
|
75
|
+
getTracer(name: string, version?: string): Tracer;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
// Context types
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
|
|
82
|
+
export interface Context {
|
|
83
|
+
getValue(key: symbol): unknown;
|
|
84
|
+
setValue(key: symbol, value: unknown): Context;
|
|
85
|
+
deleteValue(key: symbol): Context;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export interface TextMapGetter<C = Record<string, string>> {
|
|
89
|
+
keys(carrier: C): string[];
|
|
90
|
+
get(carrier: C, key: string): string | string[] | undefined;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export interface TextMapSetter<C = Record<string, string>> {
|
|
94
|
+
set(carrier: C, key: string, value: string): void;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export interface TextMapPropagator {
|
|
98
|
+
inject(context: Context, carrier: unknown, setter?: TextMapSetter<unknown>): void;
|
|
99
|
+
extract(context: Context, carrier: unknown, getter?: TextMapGetter<unknown>): Context;
|
|
100
|
+
fields(): string[];
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
// Span kind + status constants
|
|
105
|
+
// ---------------------------------------------------------------------------
|
|
106
|
+
|
|
107
|
+
export const SpanKind = {
|
|
108
|
+
INTERNAL: 0,
|
|
109
|
+
SERVER: 1,
|
|
110
|
+
CLIENT: 2,
|
|
111
|
+
PRODUCER: 3,
|
|
112
|
+
CONSUMER: 4,
|
|
113
|
+
} as const;
|
|
114
|
+
|
|
115
|
+
export type SpanKind = typeof SpanKind[keyof typeof SpanKind];
|
|
116
|
+
|
|
117
|
+
export const SpanStatusCode = {
|
|
118
|
+
UNSET: 0,
|
|
119
|
+
OK: 1,
|
|
120
|
+
ERROR: 2,
|
|
121
|
+
} as const;
|
|
122
|
+
|
|
123
|
+
export type SpanStatusCode = typeof SpanStatusCode[keyof typeof SpanStatusCode];
|
|
124
|
+
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
// Metrics types (structural; not backed by a live SDK here)
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
|
|
129
|
+
export interface ObservableResult {
|
|
130
|
+
observe(value: number, attributes?: Record<string, AttributeValue>): void;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export interface Counter {
|
|
134
|
+
add(value: number, attributes?: Record<string, AttributeValue>): void;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export interface UpDownCounter {
|
|
138
|
+
add(value: number, attributes?: Record<string, AttributeValue>): void;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export interface Histogram {
|
|
142
|
+
record(value: number, attributes?: Record<string, AttributeValue>): void;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export interface ObservableGauge {
|
|
146
|
+
addCallback(callback: (result: ObservableResult) => void): void;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export interface Meter {
|
|
150
|
+
createCounter(name: string, options?: { description?: string; unit?: string }): Counter;
|
|
151
|
+
createUpDownCounter(
|
|
152
|
+
name: string,
|
|
153
|
+
options?: { description?: string; unit?: string },
|
|
154
|
+
): UpDownCounter;
|
|
155
|
+
createHistogram(
|
|
156
|
+
name: string,
|
|
157
|
+
options?: {
|
|
158
|
+
description?: string;
|
|
159
|
+
unit?: string;
|
|
160
|
+
advice?: { explicitBucketBoundaries?: number[] };
|
|
161
|
+
},
|
|
162
|
+
): Histogram;
|
|
163
|
+
createObservableGauge(
|
|
164
|
+
name: string,
|
|
165
|
+
options?: { description?: string; unit?: string },
|
|
166
|
+
): ObservableGauge;
|
|
167
|
+
getMeter?: never; // Prevents accidental use of Meter as MetricsAPI
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export interface MetricsAPI {
|
|
171
|
+
getMeter(name: string | undefined, version?: string): Meter;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// ---------------------------------------------------------------------------
|
|
175
|
+
// No-op provider (default when ext-opentelemetry is not installed)
|
|
176
|
+
// ---------------------------------------------------------------------------
|
|
177
|
+
|
|
178
|
+
function createNoopContext(): Context {
|
|
179
|
+
return {
|
|
180
|
+
getValue: () => undefined,
|
|
181
|
+
setValue(_key, _value) {
|
|
182
|
+
return this;
|
|
183
|
+
},
|
|
184
|
+
deleteValue(_key) {
|
|
185
|
+
return this;
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
const NOOP_CONTEXT: Context = createNoopContext();
|
|
191
|
+
|
|
192
|
+
const NOOP_SPAN_CONTEXT: SpanContext = {
|
|
193
|
+
traceId: "00000000000000000000000000000000",
|
|
194
|
+
spanId: "0000000000000000",
|
|
195
|
+
traceFlags: 0,
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
const NOOP_SPAN: Span = {
|
|
199
|
+
setAttribute() {
|
|
200
|
+
return NOOP_SPAN;
|
|
201
|
+
},
|
|
202
|
+
setAttributes() {
|
|
203
|
+
return NOOP_SPAN;
|
|
204
|
+
},
|
|
205
|
+
setStatus() {
|
|
206
|
+
return NOOP_SPAN;
|
|
207
|
+
},
|
|
208
|
+
recordException() {},
|
|
209
|
+
addEvent() {
|
|
210
|
+
return NOOP_SPAN;
|
|
211
|
+
},
|
|
212
|
+
end() {},
|
|
213
|
+
spanContext() {
|
|
214
|
+
return NOOP_SPAN_CONTEXT;
|
|
215
|
+
},
|
|
216
|
+
updateName() {},
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
function createNoopTracer(): Tracer {
|
|
220
|
+
return {
|
|
221
|
+
startSpan(): Span {
|
|
222
|
+
return NOOP_SPAN;
|
|
223
|
+
},
|
|
224
|
+
startActiveSpan<T>(
|
|
225
|
+
_name: string,
|
|
226
|
+
optionsOrFn:
|
|
227
|
+
| { kind?: number; attributes?: Record<string, AttributeValue> }
|
|
228
|
+
| ((span: Span) => T),
|
|
229
|
+
contextOrFn?: Context | ((span: Span) => T),
|
|
230
|
+
fn?: (span: Span) => T,
|
|
231
|
+
): T {
|
|
232
|
+
const callback = typeof optionsOrFn === "function"
|
|
233
|
+
? optionsOrFn
|
|
234
|
+
: typeof contextOrFn === "function"
|
|
235
|
+
? contextOrFn
|
|
236
|
+
: fn!;
|
|
237
|
+
return callback(NOOP_SPAN);
|
|
238
|
+
},
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
function createNoopProvider(): TracerProvider {
|
|
243
|
+
const noopTracer = createNoopTracer();
|
|
244
|
+
return { getTracer: () => noopTracer };
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// ---------------------------------------------------------------------------
|
|
248
|
+
// Global provider state
|
|
249
|
+
// ---------------------------------------------------------------------------
|
|
250
|
+
|
|
251
|
+
let _provider: TracerProvider = createNoopProvider();
|
|
252
|
+
let _activeContext: Context = NOOP_CONTEXT;
|
|
253
|
+
let _propagator: TextMapPropagator | null = null;
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Optional accessor for the currently active span. Wired by
|
|
257
|
+
* ext-opentelemetry (via `setGlobalActiveSpanAccessor`) so `trace.getActiveSpan()`
|
|
258
|
+
* and `trace.getSpan()` return the real SDK span once the extension is active.
|
|
259
|
+
*/
|
|
260
|
+
let _activeSpanAccessor: {
|
|
261
|
+
getActiveSpan(): Span | undefined;
|
|
262
|
+
getSpan(ctx: Context): Span | undefined;
|
|
263
|
+
} | null = null;
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Register the real OTel trace API's span accessors. Called by the
|
|
267
|
+
* ext-opentelemetry extension after it wires the SDK so that the shim's
|
|
268
|
+
* `trace.getActiveSpan()` / `trace.getSpan()` can return real spans.
|
|
269
|
+
*/
|
|
270
|
+
export function setGlobalActiveSpanAccessor(
|
|
271
|
+
accessor: { getActiveSpan(): Span | undefined; getSpan(ctx: Context): Span | undefined },
|
|
272
|
+
): void {
|
|
273
|
+
_activeSpanAccessor = accessor;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Wire in the real SDK TracerProvider.
|
|
278
|
+
* Called from `src/server/bootstrap.ts` after `orchestrateExtensions()` runs.
|
|
279
|
+
*/
|
|
280
|
+
export function setGlobalTracerProvider(p: TracerProvider): void {
|
|
281
|
+
_provider = p;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
export function getGlobalTracerProvider(): TracerProvider {
|
|
285
|
+
return _provider;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Get a tracer from the active provider.
|
|
290
|
+
* Returns the no-op tracer when ext-opentelemetry is not installed.
|
|
291
|
+
*/
|
|
292
|
+
export function getTracer(name: string, version?: string): Tracer {
|
|
293
|
+
return _provider.getTracer(name, version);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// ---------------------------------------------------------------------------
|
|
297
|
+
// Context API
|
|
298
|
+
// ---------------------------------------------------------------------------
|
|
299
|
+
|
|
300
|
+
export const context = {
|
|
301
|
+
active(): Context {
|
|
302
|
+
return _activeContext;
|
|
303
|
+
},
|
|
304
|
+
with<T>(ctx: Context, fn: () => T): T {
|
|
305
|
+
const prev = _activeContext;
|
|
306
|
+
_activeContext = ctx;
|
|
307
|
+
try {
|
|
308
|
+
return fn();
|
|
309
|
+
} finally {
|
|
310
|
+
_activeContext = prev;
|
|
311
|
+
}
|
|
312
|
+
},
|
|
313
|
+
setGlobalContextManager(_mgr: unknown): void {
|
|
314
|
+
// no-op in shim; real SDK sets this via the real OTel API
|
|
315
|
+
},
|
|
316
|
+
};
|
|
317
|
+
|
|
318
|
+
// ---------------------------------------------------------------------------
|
|
319
|
+
// Trace API (simplified subset used by core)
|
|
320
|
+
// ---------------------------------------------------------------------------
|
|
321
|
+
|
|
322
|
+
export const trace = {
|
|
323
|
+
getTracer(name: string, version?: string): Tracer {
|
|
324
|
+
return _provider.getTracer(name, version);
|
|
325
|
+
},
|
|
326
|
+
setGlobalTracerProvider(p: TracerProvider): void {
|
|
327
|
+
_provider = p;
|
|
328
|
+
},
|
|
329
|
+
getGlobalTracerProvider(): TracerProvider {
|
|
330
|
+
return _provider;
|
|
331
|
+
},
|
|
332
|
+
setSpan(ctx: Context, _span: Span): Context {
|
|
333
|
+
return ctx;
|
|
334
|
+
},
|
|
335
|
+
getSpan(ctx: Context): Span | undefined {
|
|
336
|
+
return _activeSpanAccessor?.getSpan(ctx);
|
|
337
|
+
},
|
|
338
|
+
getActiveSpan(): Span | undefined {
|
|
339
|
+
return _activeSpanAccessor?.getActiveSpan();
|
|
340
|
+
},
|
|
341
|
+
};
|
|
342
|
+
|
|
343
|
+
// ---------------------------------------------------------------------------
|
|
344
|
+
// Propagation API
|
|
345
|
+
// ---------------------------------------------------------------------------
|
|
346
|
+
|
|
347
|
+
export const propagation = {
|
|
348
|
+
setGlobalPropagator(p: TextMapPropagator): void {
|
|
349
|
+
_propagator = p;
|
|
350
|
+
},
|
|
351
|
+
extract<C>(ctx: Context, carrier: C, getter?: TextMapGetter<C>): Context {
|
|
352
|
+
if (!_propagator) return ctx;
|
|
353
|
+
return _propagator.extract(ctx, carrier, getter as TextMapGetter<unknown> | undefined);
|
|
354
|
+
},
|
|
355
|
+
inject<C>(ctx: Context, carrier: C, setter?: TextMapSetter<C>): void {
|
|
356
|
+
if (!_propagator) return;
|
|
357
|
+
_propagator.inject(ctx, carrier, setter as TextMapSetter<unknown> | undefined);
|
|
358
|
+
},
|
|
359
|
+
};
|
|
360
|
+
|
|
361
|
+
// ---------------------------------------------------------------------------
|
|
362
|
+
// defaultTextMapGetter / defaultTextMapSetter (used by proxy/tracing.ts)
|
|
363
|
+
// ---------------------------------------------------------------------------
|
|
364
|
+
|
|
365
|
+
export const defaultTextMapGetter: TextMapGetter<Record<string, string>> = {
|
|
366
|
+
keys(carrier) {
|
|
367
|
+
return Object.keys(carrier);
|
|
368
|
+
},
|
|
369
|
+
get(carrier, key) {
|
|
370
|
+
return carrier[key];
|
|
371
|
+
},
|
|
372
|
+
};
|
|
373
|
+
|
|
374
|
+
export const defaultTextMapSetter: TextMapSetter<Record<string, string>> = {
|
|
375
|
+
set(carrier, key, value) {
|
|
376
|
+
carrier[key] = value;
|
|
377
|
+
},
|
|
378
|
+
};
|
|
379
|
+
|
|
380
|
+
// ---------------------------------------------------------------------------
|
|
381
|
+
// Metrics API registry (injected by ext-opentelemetry when active)
|
|
382
|
+
// ---------------------------------------------------------------------------
|
|
383
|
+
|
|
384
|
+
let _metricsApi: MetricsAPI | null = null;
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* Register the OTel Metrics API (from the SDK).
|
|
388
|
+
* Called by ext-opentelemetry in its setup hook so the metrics subsystem
|
|
389
|
+
* can use `getMeter()` when available.
|
|
390
|
+
*/
|
|
391
|
+
export function setGlobalMetricsAPI(api: MetricsAPI): void {
|
|
392
|
+
_metricsApi = api;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
export function getGlobalMetricsAPI(): MetricsAPI | null {
|
|
396
|
+
return _metricsApi;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
// ---------------------------------------------------------------------------
|
|
400
|
+
// Reset for tests
|
|
401
|
+
// ---------------------------------------------------------------------------
|
|
402
|
+
|
|
403
|
+
export function _resetShimForTests(): void {
|
|
404
|
+
_provider = createNoopProvider();
|
|
405
|
+
_activeContext = NOOP_CONTEXT;
|
|
406
|
+
_propagator = null;
|
|
407
|
+
_metricsApi = null;
|
|
408
|
+
_activeSpanAccessor = null;
|
|
409
|
+
}
|
|
@@ -56,15 +56,40 @@ export class TracingManager {
|
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
private async initializeTracer(config: TracingConfig): Promise<void> {
|
|
59
|
-
|
|
59
|
+
// Use the shim API — delegates to the real SDK when ext-opentelemetry is wired.
|
|
60
|
+
const shimApi = await import("./api-shim.js");
|
|
61
|
+
const api: OpenTelemetryAPI = {
|
|
62
|
+
trace: {
|
|
63
|
+
getTracer: (name, version) => shimApi.getTracer(name ?? "veryfront", version),
|
|
64
|
+
setSpan: (ctx, _span) => ctx,
|
|
65
|
+
},
|
|
66
|
+
propagation: {
|
|
67
|
+
setGlobalPropagator: (p) => shimApi.propagation.setGlobalPropagator(p),
|
|
68
|
+
extract: (ctx, carrier) => shimApi.propagation.extract(ctx, carrier),
|
|
69
|
+
inject: (ctx, carrier) => shimApi.propagation.inject(ctx, carrier),
|
|
70
|
+
},
|
|
71
|
+
context: {
|
|
72
|
+
active: () => shimApi.context.active(),
|
|
73
|
+
with: (ctx, fn) => shimApi.context.with(ctx, fn),
|
|
74
|
+
},
|
|
75
|
+
SpanKind: shimApi.SpanKind,
|
|
76
|
+
SpanStatusCode: { OK: shimApi.SpanStatusCode.OK, ERROR: shimApi.SpanStatusCode.ERROR },
|
|
77
|
+
};
|
|
60
78
|
this.state.api = api;
|
|
61
79
|
|
|
62
80
|
this.state.tracer = api.trace.getTracer(config.serviceName ?? "veryfront", VERSION);
|
|
63
81
|
|
|
64
|
-
|
|
65
|
-
|
|
82
|
+
// No-op propagator used only when ext-opentelemetry is NOT installed.
|
|
83
|
+
// When the extension is active, it registers W3CTraceContextPropagator
|
|
84
|
+
// on the shim directly; we intentionally do NOT wrap shimApi.propagation
|
|
85
|
+
// here (doing so would cause infinite recursion when the global
|
|
86
|
+
// propagator is the wrapper itself).
|
|
87
|
+
const propagator = {
|
|
88
|
+
inject: (_ctx: import("./api-shim.js").Context, _carrier: unknown) => {},
|
|
89
|
+
extract: (ctx: import("./api-shim.js").Context, _carrier: unknown) => ctx,
|
|
90
|
+
fields: () => [] as string[],
|
|
91
|
+
};
|
|
66
92
|
this.state.propagator = propagator;
|
|
67
|
-
api.propagation.setGlobalPropagator(propagator);
|
|
68
93
|
|
|
69
94
|
this.spanOps = this.state.tracer ? new SpanOperations(api, this.state.tracer) : null;
|
|
70
95
|
this.contextProp = new ContextPropagation(api, propagator);
|