@dexto/core 1.6.25 → 1.6.27
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/dist/agent/DextoAgent.cjs +102 -104
- package/dist/agent/DextoAgent.d.ts +11 -10
- package/dist/agent/DextoAgent.d.ts.map +1 -1
- package/dist/agent/DextoAgent.js +103 -105
- package/dist/agent/error-codes.cjs +1 -0
- package/dist/agent/error-codes.d.ts +1 -0
- package/dist/agent/error-codes.d.ts.map +1 -1
- package/dist/agent/error-codes.js +1 -0
- package/dist/agent/errors.cjs +13 -0
- package/dist/agent/errors.d.ts +6 -0
- package/dist/agent/errors.d.ts.map +1 -1
- package/dist/agent/errors.js +13 -0
- package/dist/agent/index.d.ts +1 -0
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/schemas.d.ts +2 -2
- package/dist/agent/types.d.ts +11 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/approval/factory.cjs +1 -0
- package/dist/approval/factory.d.ts.map +1 -1
- package/dist/approval/factory.js +1 -0
- package/dist/approval/manager.cjs +345 -182
- package/dist/approval/manager.d.ts +45 -31
- package/dist/approval/manager.d.ts.map +1 -1
- package/dist/approval/manager.js +345 -182
- package/dist/approval/schemas.cjs +10 -0
- package/dist/approval/schemas.d.ts +305 -0
- package/dist/approval/schemas.d.ts.map +1 -1
- package/dist/approval/schemas.js +10 -0
- package/dist/approval/session-approval-store.cjs +91 -0
- package/dist/approval/session-approval-store.d.ts +55 -0
- package/dist/approval/session-approval-store.d.ts.map +1 -0
- package/dist/approval/session-approval-store.js +68 -0
- package/dist/events/index.cjs +210 -75
- package/dist/events/index.d.ts +44 -181
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +206 -74
- package/dist/hooks/manager.cjs +5 -2
- package/dist/hooks/manager.d.ts +2 -0
- package/dist/hooks/manager.d.ts.map +1 -1
- package/dist/hooks/manager.js +5 -2
- package/dist/hooks/types.d.ts +3 -0
- package/dist/hooks/types.d.ts.map +1 -1
- package/dist/index.browser.d.ts +1 -0
- package/dist/index.browser.d.ts.map +1 -1
- package/dist/index.cjs +3 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/llm/executor/turn-executor.cjs +15 -7
- package/dist/llm/executor/turn-executor.d.ts +3 -1
- package/dist/llm/executor/turn-executor.d.ts.map +1 -1
- package/dist/llm/executor/turn-executor.js +15 -7
- package/dist/llm/services/factory.cjs +10 -4
- package/dist/llm/services/factory.d.ts +2 -21
- package/dist/llm/services/factory.d.ts.map +1 -1
- package/dist/llm/services/factory.js +11 -7
- package/dist/llm/services/types.d.ts +33 -2
- package/dist/llm/services/types.d.ts.map +1 -1
- package/dist/llm/services/vercel.cjs +33 -11
- package/dist/llm/services/vercel.d.ts +6 -3
- package/dist/llm/services/vercel.d.ts.map +1 -1
- package/dist/llm/services/vercel.js +29 -8
- package/dist/logger/default-logger-factory.d.ts +12 -12
- package/dist/logger/v2/schemas.d.ts +6 -6
- package/dist/mcp/manager.cjs +7 -2
- package/dist/mcp/manager.d.ts +3 -1
- package/dist/mcp/manager.d.ts.map +1 -1
- package/dist/mcp/manager.js +7 -2
- package/dist/mcp/mcp-client.cjs +71 -62
- package/dist/mcp/mcp-client.d.ts +3 -2
- package/dist/mcp/mcp-client.d.ts.map +1 -1
- package/dist/mcp/mcp-client.js +71 -62
- package/dist/mcp/schemas.d.ts +10 -10
- package/dist/resources/handlers/filesystem-handler.cjs +22 -3
- package/dist/resources/handlers/filesystem-handler.d.ts.map +1 -1
- package/dist/resources/handlers/filesystem-handler.js +22 -3
- package/dist/runtime/host-runtime.cjs +163 -0
- package/dist/runtime/host-runtime.d.ts +23 -0
- package/dist/runtime/host-runtime.d.ts.map +1 -0
- package/dist/runtime/host-runtime.js +133 -0
- package/dist/runtime/index.cjs +42 -0
- package/dist/runtime/index.d.ts +2 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +21 -0
- package/dist/runtime/run-context.cjs +53 -0
- package/dist/runtime/run-context.d.ts +13 -0
- package/dist/runtime/run-context.d.ts.map +1 -0
- package/dist/runtime/run-context.js +34 -0
- package/dist/session/chat-session.cjs +67 -71
- package/dist/session/chat-session.d.ts +25 -25
- package/dist/session/chat-session.d.ts.map +1 -1
- package/dist/session/chat-session.js +68 -72
- package/dist/session/error-codes.cjs +1 -0
- package/dist/session/error-codes.d.ts +2 -1
- package/dist/session/error-codes.d.ts.map +1 -1
- package/dist/session/error-codes.js +1 -0
- package/dist/session/errors.cjs +13 -0
- package/dist/session/errors.d.ts +6 -0
- package/dist/session/errors.d.ts.map +1 -1
- package/dist/session/errors.js +13 -0
- package/dist/session/message-queue-store.cjs +75 -0
- package/dist/session/message-queue-store.d.ts +16 -0
- package/dist/session/message-queue-store.d.ts.map +1 -0
- package/dist/session/message-queue-store.js +52 -0
- package/dist/session/message-queue.cjs +140 -46
- package/dist/session/message-queue.d.ts +18 -6
- package/dist/session/message-queue.d.ts.map +1 -1
- package/dist/session/message-queue.js +140 -46
- package/dist/session/session-manager.cjs +130 -25
- package/dist/session/session-manager.d.ts +18 -1
- package/dist/session/session-manager.d.ts.map +1 -1
- package/dist/session/session-manager.js +130 -25
- package/dist/session/title-generator.cjs +9 -2
- package/dist/session/title-generator.d.ts +2 -0
- package/dist/session/title-generator.d.ts.map +1 -1
- package/dist/session/title-generator.js +9 -2
- package/dist/telemetry/decorators.cjs +75 -57
- package/dist/telemetry/decorators.d.ts +2 -0
- package/dist/telemetry/decorators.d.ts.map +1 -1
- package/dist/telemetry/decorators.js +75 -57
- package/dist/telemetry/errors.cjs +2 -2
- package/dist/telemetry/errors.js +2 -2
- package/dist/telemetry/index.d.ts +1 -1
- package/dist/telemetry/index.d.ts.map +1 -1
- package/dist/telemetry/index.js +3 -1
- package/dist/telemetry/telemetry.cjs +62 -21
- package/dist/telemetry/telemetry.d.ts +14 -0
- package/dist/telemetry/telemetry.d.ts.map +1 -1
- package/dist/telemetry/telemetry.js +62 -21
- package/dist/telemetry/utils.cjs +9 -6
- package/dist/telemetry/utils.d.ts +3 -0
- package/dist/telemetry/utils.d.ts.map +1 -1
- package/dist/telemetry/utils.js +9 -6
- package/dist/test-utils/session-state-stores.cjs +68 -0
- package/dist/test-utils/session-state-stores.js +42 -0
- package/dist/tools/session-tool-preferences-store.cjs +86 -0
- package/dist/tools/session-tool-preferences-store.d.ts +29 -0
- package/dist/tools/session-tool-preferences-store.d.ts.map +1 -0
- package/dist/tools/session-tool-preferences-store.js +63 -0
- package/dist/tools/tool-manager.cjs +223 -68
- package/dist/tools/tool-manager.d.ts +29 -9
- package/dist/tools/tool-manager.d.ts.map +1 -1
- package/dist/tools/tool-manager.js +223 -68
- package/dist/tools/types.d.ts +7 -1
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/utils/service-initializer.cjs +38 -5
- package/dist/utils/service-initializer.d.ts +11 -1
- package/dist/utils/service-initializer.d.ts.map +1 -1
- package/dist/utils/service-initializer.js +36 -4
- package/package.json +1 -1
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
} from "@opentelemetry/api";
|
|
9
9
|
import { hasActiveTelemetry, getBaggageValues } from "./utils.js";
|
|
10
10
|
import { safeStringify } from "../utils/safe-stringify.js";
|
|
11
|
+
import { getHostRuntimeAttributes, getHostRuntimeBaggageEntries } from "../runtime/index.js";
|
|
11
12
|
function withSpan(options) {
|
|
12
13
|
return function(_target, propertyKey, descriptor) {
|
|
13
14
|
if (!descriptor || typeof descriptor === "number") return;
|
|
@@ -36,7 +37,15 @@ function withSpan(options) {
|
|
|
36
37
|
args.forEach((arg, index) => {
|
|
37
38
|
span.setAttribute(`${spanName}.argument.${index}`, safeStringify(arg, 8192));
|
|
38
39
|
});
|
|
39
|
-
const {
|
|
40
|
+
const {
|
|
41
|
+
requestId,
|
|
42
|
+
componentName,
|
|
43
|
+
runId,
|
|
44
|
+
threadId,
|
|
45
|
+
resourceId,
|
|
46
|
+
sessionId,
|
|
47
|
+
hostRuntime
|
|
48
|
+
} = getBaggageValues(ctx);
|
|
40
49
|
if (sessionId) {
|
|
41
50
|
span.setAttribute("sessionId", sessionId);
|
|
42
51
|
span.setAttribute("baggage.sessionId", sessionId);
|
|
@@ -57,65 +66,73 @@ function withSpan(options) {
|
|
|
57
66
|
span.setAttribute("runId", String(runId));
|
|
58
67
|
span.setAttribute("baggage.runId", String(runId));
|
|
59
68
|
}
|
|
69
|
+
for (const [key, value] of Object.entries(getHostRuntimeAttributes(hostRuntime))) {
|
|
70
|
+
span.setAttribute(key, value);
|
|
71
|
+
}
|
|
72
|
+
const inferredComponentName = options?.componentName;
|
|
73
|
+
const effectiveHostRuntime = hostRuntime;
|
|
74
|
+
const effectiveRunId = effectiveHostRuntime?.ids?.runId ?? runId;
|
|
60
75
|
if (componentName) {
|
|
61
76
|
span.setAttribute("componentName", componentName);
|
|
62
77
|
span.setAttribute("baggage.componentName", componentName);
|
|
63
|
-
} else if (
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
78
|
+
} else if (inferredComponentName) {
|
|
79
|
+
span.setAttribute("componentName", inferredComponentName);
|
|
80
|
+
}
|
|
81
|
+
if (effectiveRunId !== void 0) {
|
|
82
|
+
span.setAttribute("runId", String(effectiveRunId));
|
|
83
|
+
span.setAttribute("baggage.runId", String(effectiveRunId));
|
|
84
|
+
}
|
|
85
|
+
for (const [key, value] of Object.entries(
|
|
86
|
+
getHostRuntimeAttributes(effectiveHostRuntime)
|
|
87
|
+
)) {
|
|
88
|
+
span.setAttribute(key, value);
|
|
89
|
+
}
|
|
90
|
+
const existingBaggage = propagation.getBaggage(ctx);
|
|
91
|
+
const baggageEntries = {};
|
|
92
|
+
if (existingBaggage) {
|
|
93
|
+
existingBaggage.getAllEntries().forEach(([key, entry]) => {
|
|
94
|
+
baggageEntries[key] = entry;
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
if (sessionId !== void 0) {
|
|
98
|
+
baggageEntries.sessionId = {
|
|
99
|
+
...baggageEntries.sessionId,
|
|
100
|
+
value: String(sessionId)
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
if (requestId !== void 0) {
|
|
104
|
+
baggageEntries["http.request_id"] = {
|
|
105
|
+
...baggageEntries["http.request_id"],
|
|
106
|
+
value: String(requestId)
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
if (threadId !== void 0) {
|
|
110
|
+
baggageEntries.threadId = {
|
|
111
|
+
...baggageEntries.threadId,
|
|
112
|
+
value: String(threadId)
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
if (resourceId !== void 0) {
|
|
116
|
+
baggageEntries.resourceId = {
|
|
117
|
+
...baggageEntries.resourceId,
|
|
118
|
+
value: String(resourceId)
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
if (componentName === void 0 && inferredComponentName !== void 0) {
|
|
122
|
+
baggageEntries.componentName = {
|
|
123
|
+
...baggageEntries.componentName,
|
|
124
|
+
value: String(inferredComponentName)
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
if (effectiveRunId !== void 0) {
|
|
128
|
+
baggageEntries.runId = {
|
|
129
|
+
...baggageEntries.runId,
|
|
130
|
+
value: String(effectiveRunId)
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
Object.assign(baggageEntries, getHostRuntimeBaggageEntries(effectiveHostRuntime));
|
|
134
|
+
if (Object.keys(baggageEntries).length > 0) {
|
|
135
|
+
ctx = propagation.setBaggage(ctx, propagation.createBaggage(baggageEntries));
|
|
119
136
|
}
|
|
120
137
|
let result;
|
|
121
138
|
try {
|
|
@@ -180,6 +197,7 @@ function InstrumentClass(options) {
|
|
|
180
197
|
spanName: options?.prefix ? `${options.prefix}.${method}` : method,
|
|
181
198
|
skipIfNoTelemetry: true,
|
|
182
199
|
spanKind: options?.spanKind || SpanKind.INTERNAL,
|
|
200
|
+
componentName: options?.componentName ?? target.name,
|
|
183
201
|
...options?.tracerName !== void 0 && {
|
|
184
202
|
tracerName: options.tracerName
|
|
185
203
|
}
|
|
@@ -80,9 +80,9 @@ class TelemetryError {
|
|
|
80
80
|
import_error_codes.TelemetryErrorCode.NOT_INITIALIZED,
|
|
81
81
|
import_types.ErrorScope.TELEMETRY,
|
|
82
82
|
import_types.ErrorType.USER,
|
|
83
|
-
"Telemetry not initialized. Call Telemetry.init() first.",
|
|
83
|
+
"Telemetry not initialized. Call Telemetry.init() or Telemetry.registerGlobal() first.",
|
|
84
84
|
{
|
|
85
|
-
hint: "Ensure telemetry is initialized before accessing the global instance."
|
|
85
|
+
hint: "Ensure telemetry is initialized via Telemetry.init() or Telemetry.registerGlobal() before accessing the global instance."
|
|
86
86
|
}
|
|
87
87
|
);
|
|
88
88
|
}
|
package/dist/telemetry/errors.js
CHANGED
|
@@ -58,9 +58,9 @@ class TelemetryError {
|
|
|
58
58
|
TelemetryErrorCode.NOT_INITIALIZED,
|
|
59
59
|
ErrorScope.TELEMETRY,
|
|
60
60
|
ErrorType.USER,
|
|
61
|
-
"Telemetry not initialized. Call Telemetry.init() first.",
|
|
61
|
+
"Telemetry not initialized. Call Telemetry.init() or Telemetry.registerGlobal() first.",
|
|
62
62
|
{
|
|
63
|
-
hint: "Ensure telemetry is initialized before accessing the global instance."
|
|
63
|
+
hint: "Ensure telemetry is initialized via Telemetry.init() or Telemetry.registerGlobal() before accessing the global instance."
|
|
64
64
|
}
|
|
65
65
|
);
|
|
66
66
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { Telemetry } from './telemetry.js';
|
|
1
|
+
export { Telemetry, type TelemetryRegistrationOptions, type TelemetryShutdownHandler, } from './telemetry.js';
|
|
2
2
|
export { OtelConfigurationSchema } from './schemas.js';
|
|
3
3
|
export type { OtelConfiguration } from './schemas.js';
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,SAAS,EACT,KAAK,4BAA4B,EACjC,KAAK,wBAAwB,GAChC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/telemetry/index.js
CHANGED
|
@@ -40,17 +40,17 @@ class Telemetry {
|
|
|
40
40
|
name = "dexto-service";
|
|
41
41
|
_isInitialized = false;
|
|
42
42
|
_sdk;
|
|
43
|
+
_shutdownHandler;
|
|
43
44
|
static _initPromise;
|
|
44
45
|
static _signalHandlers;
|
|
45
|
-
constructor(config,
|
|
46
|
+
constructor(config, options) {
|
|
46
47
|
const serviceName = config.serviceName ?? "dexto-service";
|
|
47
48
|
const tracerName = config.tracerName ?? serviceName;
|
|
48
49
|
this.name = serviceName;
|
|
49
50
|
this.tracer = import_api.trace.getTracer(tracerName);
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
this._isInitialized = enabled && !!sdk;
|
|
51
|
+
this._sdk = options.sdk;
|
|
52
|
+
this._shutdownHandler = options.shutdown;
|
|
53
|
+
this._isInitialized = options.initialized;
|
|
54
54
|
}
|
|
55
55
|
static async buildTraceExporter(config) {
|
|
56
56
|
const e = config?.export;
|
|
@@ -178,7 +178,10 @@ class Telemetry {
|
|
|
178
178
|
process.once("SIGINT", sigint);
|
|
179
179
|
Telemetry._signalHandlers = { sigterm, sigint };
|
|
180
180
|
}
|
|
181
|
-
globalThis.__TELEMETRY__ = new Telemetry(config,
|
|
181
|
+
globalThis.__TELEMETRY__ = new Telemetry(config, {
|
|
182
|
+
initialized: enabled && !!sdk,
|
|
183
|
+
...sdk !== void 0 && { sdk }
|
|
184
|
+
});
|
|
182
185
|
}
|
|
183
186
|
return globalThis.__TELEMETRY__;
|
|
184
187
|
})();
|
|
@@ -194,6 +197,38 @@ class Telemetry {
|
|
|
194
197
|
);
|
|
195
198
|
}
|
|
196
199
|
}
|
|
200
|
+
/**
|
|
201
|
+
* Register a global telemetry instance after a host installs its own provider/exporter lifecycle.
|
|
202
|
+
*
|
|
203
|
+
* This keeps core instrumentation active without forcing the default Node SDK bootstrap path.
|
|
204
|
+
*/
|
|
205
|
+
static async registerGlobal(options = {}) {
|
|
206
|
+
try {
|
|
207
|
+
if (globalThis.__TELEMETRY__) return globalThis.__TELEMETRY__;
|
|
208
|
+
if (Telemetry._initPromise) return Telemetry._initPromise;
|
|
209
|
+
const config = options.config ?? {};
|
|
210
|
+
const initialized = options.initialized ?? true;
|
|
211
|
+
Telemetry._initPromise = Promise.resolve().then(() => {
|
|
212
|
+
if (!globalThis.__TELEMETRY__) {
|
|
213
|
+
globalThis.__TELEMETRY__ = new Telemetry(config, {
|
|
214
|
+
initialized,
|
|
215
|
+
...options.shutdown !== void 0 && { shutdown: options.shutdown }
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
return globalThis.__TELEMETRY__;
|
|
219
|
+
});
|
|
220
|
+
return await Telemetry._initPromise;
|
|
221
|
+
} catch (error) {
|
|
222
|
+
Telemetry._initPromise = void 0;
|
|
223
|
+
if (error instanceof import_DextoRuntimeError.DextoRuntimeError) {
|
|
224
|
+
throw error;
|
|
225
|
+
}
|
|
226
|
+
throw import_errors.TelemetryError.initializationFailed(
|
|
227
|
+
error instanceof Error ? error.message : String(error),
|
|
228
|
+
error
|
|
229
|
+
);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
197
232
|
static getActiveSpan() {
|
|
198
233
|
const span = import_api.trace.getActiveSpan();
|
|
199
234
|
return span;
|
|
@@ -275,25 +310,31 @@ class Telemetry {
|
|
|
275
310
|
* This ensures agent switching works even when telemetry export fails.
|
|
276
311
|
*/
|
|
277
312
|
async shutdown() {
|
|
278
|
-
|
|
279
|
-
|
|
313
|
+
try {
|
|
314
|
+
if (this._shutdownHandler) {
|
|
315
|
+
await this._shutdownHandler();
|
|
316
|
+
} else if (this._sdk) {
|
|
280
317
|
await this._sdk.shutdown();
|
|
281
|
-
} catch (error) {
|
|
282
|
-
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
283
|
-
import_logger.logger.warn(`Telemetry shutdown failed to flush spans (non-blocking): ${errorMsg}`);
|
|
284
|
-
} finally {
|
|
285
|
-
this._isInitialized = false;
|
|
286
|
-
globalThis.__TELEMETRY__ = void 0;
|
|
287
|
-
if (Telemetry._signalHandlers) {
|
|
288
|
-
process.off("SIGTERM", Telemetry._signalHandlers.sigterm);
|
|
289
|
-
process.off("SIGINT", Telemetry._signalHandlers.sigint);
|
|
290
|
-
Telemetry._signalHandlers = void 0;
|
|
291
|
-
}
|
|
292
|
-
this._sdk = void 0;
|
|
293
|
-
Telemetry._initPromise = void 0;
|
|
294
318
|
}
|
|
319
|
+
} catch (error) {
|
|
320
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
321
|
+
import_logger.logger.warn(`Telemetry shutdown failed to flush spans (non-blocking): ${errorMsg}`);
|
|
322
|
+
} finally {
|
|
323
|
+
this.cleanupAfterShutdown();
|
|
295
324
|
}
|
|
296
325
|
}
|
|
326
|
+
cleanupAfterShutdown() {
|
|
327
|
+
this._isInitialized = false;
|
|
328
|
+
globalThis.__TELEMETRY__ = void 0;
|
|
329
|
+
if (Telemetry._signalHandlers) {
|
|
330
|
+
process.off("SIGTERM", Telemetry._signalHandlers.sigterm);
|
|
331
|
+
process.off("SIGINT", Telemetry._signalHandlers.sigint);
|
|
332
|
+
Telemetry._signalHandlers = void 0;
|
|
333
|
+
}
|
|
334
|
+
this._sdk = void 0;
|
|
335
|
+
this._shutdownHandler = void 0;
|
|
336
|
+
Telemetry._initPromise = void 0;
|
|
337
|
+
}
|
|
297
338
|
}
|
|
298
339
|
// Annotate the CommonJS export names for ESM import in node:
|
|
299
340
|
0 && (module.exports = {
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import type { Tracer, Context, BaggageEntry } from '@opentelemetry/api';
|
|
2
2
|
import type { OtelConfiguration } from './schemas.js';
|
|
3
|
+
export type TelemetryShutdownHandler = () => Promise<void>;
|
|
4
|
+
export type TelemetryRegistrationOptions = {
|
|
5
|
+
config?: OtelConfiguration | undefined;
|
|
6
|
+
initialized?: boolean | undefined;
|
|
7
|
+
shutdown?: TelemetryShutdownHandler | undefined;
|
|
8
|
+
};
|
|
3
9
|
declare global {
|
|
4
10
|
var __TELEMETRY__: Telemetry | undefined;
|
|
5
11
|
}
|
|
@@ -17,6 +23,7 @@ export declare class Telemetry {
|
|
|
17
23
|
name: string;
|
|
18
24
|
private _isInitialized;
|
|
19
25
|
private _sdk?;
|
|
26
|
+
private _shutdownHandler?;
|
|
20
27
|
private static _initPromise?;
|
|
21
28
|
private static _signalHandlers?;
|
|
22
29
|
private constructor();
|
|
@@ -28,6 +35,12 @@ export declare class Telemetry {
|
|
|
28
35
|
* @returns Telemetry instance that can be used for tracing
|
|
29
36
|
*/
|
|
30
37
|
static init(config?: OtelConfiguration, exporter?: import('@opentelemetry/sdk-trace-base').SpanExporter): Promise<Telemetry>;
|
|
38
|
+
/**
|
|
39
|
+
* Register a global telemetry instance after a host installs its own provider/exporter lifecycle.
|
|
40
|
+
*
|
|
41
|
+
* This keeps core instrumentation active without forcing the default Node SDK bootstrap path.
|
|
42
|
+
*/
|
|
43
|
+
static registerGlobal(options?: TelemetryRegistrationOptions): Promise<Telemetry>;
|
|
31
44
|
static getActiveSpan(): import("@opentelemetry/api").Span | undefined;
|
|
32
45
|
/**
|
|
33
46
|
* Get the global telemetry instance
|
|
@@ -70,5 +83,6 @@ export declare class Telemetry {
|
|
|
70
83
|
* This ensures agent switching works even when telemetry export fails.
|
|
71
84
|
*/
|
|
72
85
|
shutdown(): Promise<void>;
|
|
86
|
+
private cleanupAfterShutdown;
|
|
73
87
|
}
|
|
74
88
|
//# sourceMappingURL=telemetry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/telemetry/telemetry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/telemetry/telemetry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAUtD,MAAM,MAAM,wBAAwB,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3D,MAAM,MAAM,4BAA4B,GAAG;IACvC,MAAM,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACvC,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,EAAE,wBAAwB,GAAG,SAAS,CAAC;CACnD,CAAC;AASF,OAAO,CAAC,MAAM,CAAC;IACX,IAAI,aAAa,EAAE,SAAS,GAAG,SAAS,CAAC;CAC5C;AAED;;;;;;;;GAQG;AACH,qBAAa,SAAS;IACX,MAAM,EAAE,MAAM,CAA4B;IACjD,IAAI,EAAE,MAAM,CAAmB;IAC/B,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,IAAI,CAAC,CAA0B;IACvC,OAAO,CAAC,gBAAgB,CAAC,CAAuC;IAChE,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAiC;IAC7D,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAA0D;IAEzF,OAAO;mBAWc,kBAAkB;IA0DvC;;;;;OAKG;WACU,IAAI,CACb,MAAM,GAAE,iBAAsB,EAC9B,QAAQ,CAAC,EAAE,OAAO,+BAA+B,EAAE,YAAY,GAChE,OAAO,CAAC,SAAS,CAAC;IAiIrB;;;;OAIG;WACU,cAAc,CAAC,OAAO,GAAE,4BAAiC,GAAG,OAAO,CAAC,SAAS,CAAC;IAiC3F,MAAM,CAAC,aAAa;IAKpB;;;;OAIG;IACH,MAAM,CAAC,GAAG,IAAI,SAAS;IAOvB;;;OAGG;IACH,MAAM,CAAC,iBAAiB,IAAI,OAAO;IAInC;;;;;OAKG;WACU,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5C;;;OAGG;IACI,aAAa,IAAI,OAAO;IAI/B,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,GAAG,GAAE,OAA8B;IAc5F,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,IAAI;IAI/C;;;OAGG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAUxC;;;;;;;;;OASG;IACU,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBtC,OAAO,CAAC,oBAAoB;CAiB/B"}
|
|
@@ -8,17 +8,17 @@ class Telemetry {
|
|
|
8
8
|
name = "dexto-service";
|
|
9
9
|
_isInitialized = false;
|
|
10
10
|
_sdk;
|
|
11
|
+
_shutdownHandler;
|
|
11
12
|
static _initPromise;
|
|
12
13
|
static _signalHandlers;
|
|
13
|
-
constructor(config,
|
|
14
|
+
constructor(config, options) {
|
|
14
15
|
const serviceName = config.serviceName ?? "dexto-service";
|
|
15
16
|
const tracerName = config.tracerName ?? serviceName;
|
|
16
17
|
this.name = serviceName;
|
|
17
18
|
this.tracer = trace.getTracer(tracerName);
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
this._isInitialized = enabled && !!sdk;
|
|
19
|
+
this._sdk = options.sdk;
|
|
20
|
+
this._shutdownHandler = options.shutdown;
|
|
21
|
+
this._isInitialized = options.initialized;
|
|
22
22
|
}
|
|
23
23
|
static async buildTraceExporter(config) {
|
|
24
24
|
const e = config?.export;
|
|
@@ -146,7 +146,10 @@ class Telemetry {
|
|
|
146
146
|
process.once("SIGINT", sigint);
|
|
147
147
|
Telemetry._signalHandlers = { sigterm, sigint };
|
|
148
148
|
}
|
|
149
|
-
globalThis.__TELEMETRY__ = new Telemetry(config,
|
|
149
|
+
globalThis.__TELEMETRY__ = new Telemetry(config, {
|
|
150
|
+
initialized: enabled && !!sdk,
|
|
151
|
+
...sdk !== void 0 && { sdk }
|
|
152
|
+
});
|
|
150
153
|
}
|
|
151
154
|
return globalThis.__TELEMETRY__;
|
|
152
155
|
})();
|
|
@@ -162,6 +165,38 @@ class Telemetry {
|
|
|
162
165
|
);
|
|
163
166
|
}
|
|
164
167
|
}
|
|
168
|
+
/**
|
|
169
|
+
* Register a global telemetry instance after a host installs its own provider/exporter lifecycle.
|
|
170
|
+
*
|
|
171
|
+
* This keeps core instrumentation active without forcing the default Node SDK bootstrap path.
|
|
172
|
+
*/
|
|
173
|
+
static async registerGlobal(options = {}) {
|
|
174
|
+
try {
|
|
175
|
+
if (globalThis.__TELEMETRY__) return globalThis.__TELEMETRY__;
|
|
176
|
+
if (Telemetry._initPromise) return Telemetry._initPromise;
|
|
177
|
+
const config = options.config ?? {};
|
|
178
|
+
const initialized = options.initialized ?? true;
|
|
179
|
+
Telemetry._initPromise = Promise.resolve().then(() => {
|
|
180
|
+
if (!globalThis.__TELEMETRY__) {
|
|
181
|
+
globalThis.__TELEMETRY__ = new Telemetry(config, {
|
|
182
|
+
initialized,
|
|
183
|
+
...options.shutdown !== void 0 && { shutdown: options.shutdown }
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
return globalThis.__TELEMETRY__;
|
|
187
|
+
});
|
|
188
|
+
return await Telemetry._initPromise;
|
|
189
|
+
} catch (error) {
|
|
190
|
+
Telemetry._initPromise = void 0;
|
|
191
|
+
if (error instanceof DextoRuntimeError) {
|
|
192
|
+
throw error;
|
|
193
|
+
}
|
|
194
|
+
throw TelemetryError.initializationFailed(
|
|
195
|
+
error instanceof Error ? error.message : String(error),
|
|
196
|
+
error
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
165
200
|
static getActiveSpan() {
|
|
166
201
|
const span = trace.getActiveSpan();
|
|
167
202
|
return span;
|
|
@@ -243,25 +278,31 @@ class Telemetry {
|
|
|
243
278
|
* This ensures agent switching works even when telemetry export fails.
|
|
244
279
|
*/
|
|
245
280
|
async shutdown() {
|
|
246
|
-
|
|
247
|
-
|
|
281
|
+
try {
|
|
282
|
+
if (this._shutdownHandler) {
|
|
283
|
+
await this._shutdownHandler();
|
|
284
|
+
} else if (this._sdk) {
|
|
248
285
|
await this._sdk.shutdown();
|
|
249
|
-
} catch (error) {
|
|
250
|
-
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
251
|
-
logger.warn(`Telemetry shutdown failed to flush spans (non-blocking): ${errorMsg}`);
|
|
252
|
-
} finally {
|
|
253
|
-
this._isInitialized = false;
|
|
254
|
-
globalThis.__TELEMETRY__ = void 0;
|
|
255
|
-
if (Telemetry._signalHandlers) {
|
|
256
|
-
process.off("SIGTERM", Telemetry._signalHandlers.sigterm);
|
|
257
|
-
process.off("SIGINT", Telemetry._signalHandlers.sigint);
|
|
258
|
-
Telemetry._signalHandlers = void 0;
|
|
259
|
-
}
|
|
260
|
-
this._sdk = void 0;
|
|
261
|
-
Telemetry._initPromise = void 0;
|
|
262
286
|
}
|
|
287
|
+
} catch (error) {
|
|
288
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
289
|
+
logger.warn(`Telemetry shutdown failed to flush spans (non-blocking): ${errorMsg}`);
|
|
290
|
+
} finally {
|
|
291
|
+
this.cleanupAfterShutdown();
|
|
263
292
|
}
|
|
264
293
|
}
|
|
294
|
+
cleanupAfterShutdown() {
|
|
295
|
+
this._isInitialized = false;
|
|
296
|
+
globalThis.__TELEMETRY__ = void 0;
|
|
297
|
+
if (Telemetry._signalHandlers) {
|
|
298
|
+
process.off("SIGTERM", Telemetry._signalHandlers.sigterm);
|
|
299
|
+
process.off("SIGINT", Telemetry._signalHandlers.sigint);
|
|
300
|
+
Telemetry._signalHandlers = void 0;
|
|
301
|
+
}
|
|
302
|
+
this._sdk = void 0;
|
|
303
|
+
this._shutdownHandler = void 0;
|
|
304
|
+
Telemetry._initPromise = void 0;
|
|
305
|
+
}
|
|
265
306
|
}
|
|
266
307
|
export {
|
|
267
308
|
Telemetry
|
package/dist/telemetry/utils.cjs
CHANGED
|
@@ -25,6 +25,7 @@ __export(utils_exports, {
|
|
|
25
25
|
module.exports = __toCommonJS(utils_exports);
|
|
26
26
|
var import_api = require("@opentelemetry/api");
|
|
27
27
|
var import_telemetry = require("./telemetry.js");
|
|
28
|
+
var import_runtime = require("../runtime/index.js");
|
|
28
29
|
function hasActiveTelemetry(logger) {
|
|
29
30
|
logger?.silly("hasActiveTelemetry called.");
|
|
30
31
|
try {
|
|
@@ -48,8 +49,9 @@ function getBaggageValues(ctx, logger) {
|
|
|
48
49
|
const threadId = currentBaggage?.getEntry("threadId")?.value;
|
|
49
50
|
const resourceId = currentBaggage?.getEntry("resourceId")?.value;
|
|
50
51
|
const sessionId = currentBaggage?.getEntry("sessionId")?.value;
|
|
52
|
+
const hostRuntime = (0, import_runtime.getHostRuntimeContextFromBaggage)(ctx);
|
|
51
53
|
logger?.silly(
|
|
52
|
-
`getBaggageValues: Extracted - requestId: ${requestId}, componentName: ${componentName}, runId: ${runId}, threadId: ${threadId}, resourceId: ${resourceId}, sessionId: ${sessionId}`
|
|
54
|
+
`getBaggageValues: Extracted - requestId: ${requestId}, componentName: ${componentName}, runId: ${runId}, threadId: ${threadId}, resourceId: ${resourceId}, sessionId: ${sessionId}, hostRuntimeIds: ${JSON.stringify(hostRuntime?.ids ?? {})}`
|
|
53
55
|
);
|
|
54
56
|
return {
|
|
55
57
|
requestId,
|
|
@@ -57,15 +59,13 @@ function getBaggageValues(ctx, logger) {
|
|
|
57
59
|
runId,
|
|
58
60
|
threadId,
|
|
59
61
|
resourceId,
|
|
60
|
-
sessionId
|
|
62
|
+
sessionId,
|
|
63
|
+
hostRuntime
|
|
61
64
|
};
|
|
62
65
|
}
|
|
63
66
|
function addBaggageAttributesToSpan(span, ctx, logger) {
|
|
64
67
|
logger?.debug("addBaggageAttributesToSpan called.");
|
|
65
|
-
const { requestId, componentName, runId, threadId, resourceId, sessionId } = getBaggageValues(
|
|
66
|
-
ctx,
|
|
67
|
-
logger
|
|
68
|
-
);
|
|
68
|
+
const { requestId, componentName, runId, threadId, resourceId, sessionId, hostRuntime } = getBaggageValues(ctx, logger);
|
|
69
69
|
if (componentName) {
|
|
70
70
|
span.setAttribute("componentName", componentName);
|
|
71
71
|
}
|
|
@@ -84,6 +84,9 @@ function addBaggageAttributesToSpan(span, ctx, logger) {
|
|
|
84
84
|
if (sessionId) {
|
|
85
85
|
span.setAttribute("sessionId", sessionId);
|
|
86
86
|
}
|
|
87
|
+
for (const [key, value] of Object.entries((0, import_runtime.getHostRuntimeAttributes)(hostRuntime))) {
|
|
88
|
+
span.setAttribute(key, value);
|
|
89
|
+
}
|
|
87
90
|
logger?.debug("addBaggageAttributesToSpan: Baggage attributes added to span.");
|
|
88
91
|
}
|
|
89
92
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -14,6 +14,9 @@ export declare function getBaggageValues(ctx: Context, logger?: Logger): {
|
|
|
14
14
|
threadId: string | undefined;
|
|
15
15
|
resourceId: string | undefined;
|
|
16
16
|
sessionId: string | undefined;
|
|
17
|
+
hostRuntime: {
|
|
18
|
+
ids?: Record<string, string> | undefined;
|
|
19
|
+
} | undefined;
|
|
17
20
|
};
|
|
18
21
|
/**
|
|
19
22
|
* Attaches baggage values from the given context to the provided span as attributes.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/telemetry/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/telemetry/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAIpD,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAa3D;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM;;;;;;;;;;EAsB7D;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CA2B1F"}
|
package/dist/telemetry/utils.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import "../chunk-PTJYTZNU.js";
|
|
2
2
|
import { propagation } from "@opentelemetry/api";
|
|
3
3
|
import { Telemetry } from "./telemetry.js";
|
|
4
|
+
import { getHostRuntimeAttributes, getHostRuntimeContextFromBaggage } from "../runtime/index.js";
|
|
4
5
|
function hasActiveTelemetry(logger) {
|
|
5
6
|
logger?.silly("hasActiveTelemetry called.");
|
|
6
7
|
try {
|
|
@@ -24,8 +25,9 @@ function getBaggageValues(ctx, logger) {
|
|
|
24
25
|
const threadId = currentBaggage?.getEntry("threadId")?.value;
|
|
25
26
|
const resourceId = currentBaggage?.getEntry("resourceId")?.value;
|
|
26
27
|
const sessionId = currentBaggage?.getEntry("sessionId")?.value;
|
|
28
|
+
const hostRuntime = getHostRuntimeContextFromBaggage(ctx);
|
|
27
29
|
logger?.silly(
|
|
28
|
-
`getBaggageValues: Extracted - requestId: ${requestId}, componentName: ${componentName}, runId: ${runId}, threadId: ${threadId}, resourceId: ${resourceId}, sessionId: ${sessionId}`
|
|
30
|
+
`getBaggageValues: Extracted - requestId: ${requestId}, componentName: ${componentName}, runId: ${runId}, threadId: ${threadId}, resourceId: ${resourceId}, sessionId: ${sessionId}, hostRuntimeIds: ${JSON.stringify(hostRuntime?.ids ?? {})}`
|
|
29
31
|
);
|
|
30
32
|
return {
|
|
31
33
|
requestId,
|
|
@@ -33,15 +35,13 @@ function getBaggageValues(ctx, logger) {
|
|
|
33
35
|
runId,
|
|
34
36
|
threadId,
|
|
35
37
|
resourceId,
|
|
36
|
-
sessionId
|
|
38
|
+
sessionId,
|
|
39
|
+
hostRuntime
|
|
37
40
|
};
|
|
38
41
|
}
|
|
39
42
|
function addBaggageAttributesToSpan(span, ctx, logger) {
|
|
40
43
|
logger?.debug("addBaggageAttributesToSpan called.");
|
|
41
|
-
const { requestId, componentName, runId, threadId, resourceId, sessionId } = getBaggageValues(
|
|
42
|
-
ctx,
|
|
43
|
-
logger
|
|
44
|
-
);
|
|
44
|
+
const { requestId, componentName, runId, threadId, resourceId, sessionId, hostRuntime } = getBaggageValues(ctx, logger);
|
|
45
45
|
if (componentName) {
|
|
46
46
|
span.setAttribute("componentName", componentName);
|
|
47
47
|
}
|
|
@@ -60,6 +60,9 @@ function addBaggageAttributesToSpan(span, ctx, logger) {
|
|
|
60
60
|
if (sessionId) {
|
|
61
61
|
span.setAttribute("sessionId", sessionId);
|
|
62
62
|
}
|
|
63
|
+
for (const [key, value] of Object.entries(getHostRuntimeAttributes(hostRuntime))) {
|
|
64
|
+
span.setAttribute(key, value);
|
|
65
|
+
}
|
|
63
66
|
logger?.debug("addBaggageAttributesToSpan: Baggage attributes added to span.");
|
|
64
67
|
}
|
|
65
68
|
export {
|