elasticdash-test 0.1.20-alpha-4 → 0.1.20-alpha-6
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/ci/trace-writer.js +1 -1
- package/dist/ci/trace-writer.js.map +1 -1
- package/dist/index.cjs +23 -1
- package/dist/observability.d.ts.map +1 -1
- package/dist/observability.js +28 -2
- package/dist/observability.js.map +1 -1
- package/package.json +1 -1
- package/src/ci/trace-writer.ts +1 -1
- package/src/observability.ts +35 -2
package/dist/ci/trace-writer.js
CHANGED
|
@@ -5,7 +5,7 @@ import { workflowEventsToDiskTrace } from './trace-schema.js';
|
|
|
5
5
|
const TRACE_DIR = '.ed_traces';
|
|
6
6
|
const SENSITIVE_KEYS = /^(authorization|api_key|apikey|password|secret|token)$/i;
|
|
7
7
|
export function isTraceCaptureEnabled() {
|
|
8
|
-
return process.env.
|
|
8
|
+
return process.env.ELASTICDASH_CAPTURE_TRACE === '1';
|
|
9
9
|
}
|
|
10
10
|
export function generateTraceFilename() {
|
|
11
11
|
const now = new Date();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-writer.js","sourceRoot":"","sources":["../../src/ci/trace-writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAA;AAG7D,MAAM,SAAS,GAAG,YAAY,CAAA;AAE9B,MAAM,cAAc,GAAG,yDAAyD,CAAA;AAEhF,MAAM,UAAU,qBAAqB;IACnC,OAAO,OAAO,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"trace-writer.js","sourceRoot":"","sources":["../../src/ci/trace-writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAA;AAG7D,MAAM,SAAS,GAAG,YAAY,CAAA;AAE9B,MAAM,cAAc,GAAG,yDAAyD,CAAA;AAEhF,MAAM,UAAU,qBAAqB;IACnC,OAAO,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,GAAG,CAAA;AACtD,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;IACtB,MAAM,EAAE,GAAG,GAAG,CAAC,WAAW,EAAE;SACzB,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAG,sBAAsB;SACjD,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA,CAAU,kBAAkB;IACjD,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA,CAAC,cAAc;IAC5D,OAAO,GAAG,EAAE,IAAI,MAAM,OAAO,CAAA;AAC/B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,GAAG,CAAA;IACjD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAA;IAClE,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,MAAM,GAA4B,EAAE,CAAA;QAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAA8B,CAAC,EAAE,CAAC;YAC1E,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAA;YAC5B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;YACnC,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAgB,EAAE,GAAY;IACnE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAA;IACjD,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACrC,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAc,CAAA;QACjD,MAAM,QAAQ,GAAG,GAAG,QAAQ,CAAC,QAAQ,OAAO,CAAA;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;QACpC,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;IACvE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,6CAA6C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAC/G,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAuB,EAAE,OAAgB,EAAE,GAAY;IAC7F,IAAI,CAAC,qBAAqB,EAAE;QAAE,OAAM;IAEpC,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAA;IACxC,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;IAC1C,MAAM,KAAK,GAAG,yBAAyB,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC,CAAA;IAC9D,kEAAkE;IAClE,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAA;IACnB,MAAM,gBAAgB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;AACpC,CAAC"}
|
package/dist/index.cjs
CHANGED
|
@@ -3374,7 +3374,7 @@ var init_trace_schema = __esm({
|
|
|
3374
3374
|
|
|
3375
3375
|
// src/ci/trace-writer.ts
|
|
3376
3376
|
function isTraceCaptureEnabled() {
|
|
3377
|
-
return process.env.
|
|
3377
|
+
return process.env.ELASTICDASH_CAPTURE_TRACE === "1";
|
|
3378
3378
|
}
|
|
3379
3379
|
function generateTraceFilename() {
|
|
3380
3380
|
const now = /* @__PURE__ */ new Date();
|
|
@@ -3539,6 +3539,11 @@ async function pushCatalog(serverUrl, apiKey, workflows = []) {
|
|
|
3539
3539
|
async function shutdownObservability() {
|
|
3540
3540
|
const ctx = getObservabilityContext();
|
|
3541
3541
|
if (!ctx) return;
|
|
3542
|
+
if (ctx.eventCollector && ctx.eventCollector.length > 0) {
|
|
3543
|
+
const events = ctx.eventCollector;
|
|
3544
|
+
ctx.eventCollector = void 0;
|
|
3545
|
+
await maybeCaptureTrace(events, ctx.traceId);
|
|
3546
|
+
}
|
|
3542
3547
|
if (heartbeatTimer) {
|
|
3543
3548
|
clearInterval(heartbeatTimer);
|
|
3544
3549
|
heartbeatTimer = null;
|
|
@@ -3561,10 +3566,20 @@ async function shutdownObservability() {
|
|
|
3561
3566
|
function startTrace(workflowName) {
|
|
3562
3567
|
const ctx = getObservabilityContext();
|
|
3563
3568
|
if (!ctx) throw new Error("[elasticdash] startTrace: observability not initialised");
|
|
3569
|
+
if (ctx.eventCollector && ctx.eventCollector.length > 0) {
|
|
3570
|
+
const events = ctx.eventCollector;
|
|
3571
|
+
ctx.eventCollector = void 0;
|
|
3572
|
+
maybeCaptureTrace(events, ctx.traceId).catch((err) => {
|
|
3573
|
+
debugLog(`[elasticdash] Failed to capture trace: ${err instanceof Error ? err.message : String(err)}`);
|
|
3574
|
+
});
|
|
3575
|
+
}
|
|
3564
3576
|
const resolvedName = workflowName || ctx.defaultWorkflowName;
|
|
3565
3577
|
const timestamp = Date.now();
|
|
3566
3578
|
const shortId = (0, import_node_crypto5.randomUUID)().slice(0, 8);
|
|
3567
3579
|
ctx.traceId = `${resolvedName}::${timestamp}::${shortId}`;
|
|
3580
|
+
if (isTraceCaptureEnabled()) {
|
|
3581
|
+
ctx.eventCollector = [];
|
|
3582
|
+
}
|
|
3568
3583
|
pushTelemetryEvent({
|
|
3569
3584
|
id: ctx.nextId(),
|
|
3570
3585
|
type: "workflow",
|
|
@@ -3580,6 +3595,13 @@ function startTrace(workflowName) {
|
|
|
3580
3595
|
function endTrace() {
|
|
3581
3596
|
const ctx = getObservabilityContext();
|
|
3582
3597
|
if (!ctx) return;
|
|
3598
|
+
if (ctx.eventCollector && ctx.eventCollector.length > 0) {
|
|
3599
|
+
const events = ctx.eventCollector;
|
|
3600
|
+
ctx.eventCollector = void 0;
|
|
3601
|
+
maybeCaptureTrace(events, ctx.traceId).catch((err) => {
|
|
3602
|
+
debugLog(`[elasticdash] Failed to capture trace: ${err instanceof Error ? err.message : String(err)}`);
|
|
3603
|
+
});
|
|
3604
|
+
}
|
|
3583
3605
|
const timestamp = Date.now();
|
|
3584
3606
|
const shortId = (0, import_node_crypto5.randomUUID)().slice(0, 8);
|
|
3585
3607
|
ctx.traceId = `${ctx.defaultWorkflowName}::${timestamp}::${shortId}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observability.d.ts","sourceRoot":"","sources":["../src/observability.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"observability.d.ts","sourceRoot":"","sources":["../src/observability.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC9B;AAKD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,mBAAmB,CAoFrF;AA+BD;;;GAGG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAqC3D;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,UAAU,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAqCxD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,IAAI,IAAI,CAgB/B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAAC,IAAI,SAAS,OAAO,EAAE,EAAE,CAAC,EACpD,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAChC,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAuC/B"}
|
package/dist/observability.js
CHANGED
|
@@ -8,7 +8,7 @@ import { connectToBackend, disconnectFromBackend } from './socket-connector.js';
|
|
|
8
8
|
import { executeTrigger } from './trigger-executor.js';
|
|
9
9
|
import { scanTools, scanWorkflows } from './execution/tool-runner.js';
|
|
10
10
|
import { debugLog } from './utils/debug.js';
|
|
11
|
-
import { maybeCaptureTrace } from './ci/trace-writer.js';
|
|
11
|
+
import { isTraceCaptureEnabled, maybeCaptureTrace } from './ci/trace-writer.js';
|
|
12
12
|
let heartbeatTimer = null;
|
|
13
13
|
let shutdownRegistered = false;
|
|
14
14
|
/**
|
|
@@ -132,6 +132,12 @@ export async function shutdownObservability() {
|
|
|
132
132
|
const ctx = getObservabilityContext();
|
|
133
133
|
if (!ctx)
|
|
134
134
|
return;
|
|
135
|
+
// Flush any pending trace capture before shutdown
|
|
136
|
+
if (ctx.eventCollector && ctx.eventCollector.length > 0) {
|
|
137
|
+
const events = ctx.eventCollector;
|
|
138
|
+
ctx.eventCollector = undefined;
|
|
139
|
+
await maybeCaptureTrace(events, ctx.traceId);
|
|
140
|
+
}
|
|
135
141
|
// Stop heartbeat
|
|
136
142
|
if (heartbeatTimer) {
|
|
137
143
|
clearInterval(heartbeatTimer);
|
|
@@ -178,10 +184,22 @@ export function startTrace(workflowName) {
|
|
|
178
184
|
const ctx = getObservabilityContext();
|
|
179
185
|
if (!ctx)
|
|
180
186
|
throw new Error('[elasticdash] startTrace: observability not initialised');
|
|
187
|
+
// Flush any pending trace capture from a previous startTrace() that had no endTrace()
|
|
188
|
+
if (ctx.eventCollector && ctx.eventCollector.length > 0) {
|
|
189
|
+
const events = ctx.eventCollector;
|
|
190
|
+
ctx.eventCollector = undefined;
|
|
191
|
+
maybeCaptureTrace(events, ctx.traceId).catch((err) => {
|
|
192
|
+
debugLog(`[elasticdash] Failed to capture trace: ${err instanceof Error ? err.message : String(err)}`);
|
|
193
|
+
});
|
|
194
|
+
}
|
|
181
195
|
const resolvedName = workflowName || ctx.defaultWorkflowName;
|
|
182
196
|
const timestamp = Date.now();
|
|
183
197
|
const shortId = randomUUID().slice(0, 8);
|
|
184
198
|
ctx.traceId = `${resolvedName}::${timestamp}::${shortId}`;
|
|
199
|
+
// When ELASTICDASH_CAPTURE_TRACE=1, start collecting events for disk trace
|
|
200
|
+
if (isTraceCaptureEnabled()) {
|
|
201
|
+
ctx.eventCollector = [];
|
|
202
|
+
}
|
|
185
203
|
// Emit a workflow event so the backend can discover the workflow name
|
|
186
204
|
// (same as wrapWorkflow, but without wrapping — for streaming handlers)
|
|
187
205
|
pushTelemetryEvent({
|
|
@@ -214,6 +232,14 @@ export function endTrace() {
|
|
|
214
232
|
const ctx = getObservabilityContext();
|
|
215
233
|
if (!ctx)
|
|
216
234
|
return;
|
|
235
|
+
// Flush collected events to disk if trace capture is enabled
|
|
236
|
+
if (ctx.eventCollector && ctx.eventCollector.length > 0) {
|
|
237
|
+
const events = ctx.eventCollector;
|
|
238
|
+
ctx.eventCollector = undefined;
|
|
239
|
+
maybeCaptureTrace(events, ctx.traceId).catch((err) => {
|
|
240
|
+
debugLog(`[elasticdash] Failed to capture trace: ${err instanceof Error ? err.message : String(err)}`);
|
|
241
|
+
});
|
|
242
|
+
}
|
|
217
243
|
const timestamp = Date.now();
|
|
218
244
|
const shortId = randomUUID().slice(0, 8);
|
|
219
245
|
ctx.traceId = `${ctx.defaultWorkflowName}::${timestamp}::${shortId}`;
|
|
@@ -266,7 +292,7 @@ export function wrapWorkflow(name, fn) {
|
|
|
266
292
|
schemaVersion: 1,
|
|
267
293
|
});
|
|
268
294
|
ctx.eventCollector = undefined;
|
|
269
|
-
// Persist trace to disk if
|
|
295
|
+
// Persist trace to disk if ELASTICDASH_CAPTURE_TRACE=1
|
|
270
296
|
await maybeCaptureTrace(collectedEvents, ctx.traceId);
|
|
271
297
|
endTrace();
|
|
272
298
|
if (error !== undefined)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observability.js","sourceRoot":"","sources":["../src/observability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,kCAAkC,CAAA;AAEzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AACvE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAA;AACpE,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AACrE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"observability.js","sourceRoot":"","sources":["../src/observability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,kCAAkC,CAAA;AAEzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AACvE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAA;AACpE,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AACrE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAmB/E,IAAI,cAAc,GAA0C,IAAI,CAAA;AAChE,IAAI,kBAAkB,GAAG,KAAK,CAAA;AAE9B;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAA8B;IAC9D,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,EAAE,CAAA;IAC7E,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,2GAA2G,CAAC,CAAA;IAC9H,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAA;IACjE,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,UAAU,EAAE,CAAA;IAC1F,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,GAAG,CAAA;IAC7C,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,EAAE,CAAA;IAC5C,MAAM,mBAAmB,GAAG,OAAO,EAAE,mBAAmB,IAAI,MAAM,CAAA;IAElE,iEAAiE;IACjE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IACzB,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;IACpC,MAAM,mBAAmB,GAAG,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAA;IAE3F,MAAM,OAAO,GAAG,IAAI,gBAAgB,CAAC;QACnC,SAAS;QACT,MAAM;QACN,SAAS;QACT,eAAe,EAAE,OAAO,EAAE,eAAe;QACzC,YAAY,EAAE,OAAO,EAAE,YAAY;QACnC,UAAU;QACV,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YAC3B,MAAM,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;QAClD,CAAC;KACF,CAAC,CAAA;IAEF,IAAI,OAAO,GAAG,CAAC,CAAA;IACf,MAAM,OAAO,GAAG,GAAG,mBAAmB,KAAK,IAAI,CAAC,GAAG,EAAE,KAAK,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAA;IACpF,MAAM,GAAG,GAAyB;QAChC,SAAS;QACT,SAAS;QACT,MAAM;QACN,OAAO;QACP,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO;QACvB,UAAU;QACV,UAAU;QACV,OAAO;QACP,mBAAmB;KACpB,CAAA;IAED,uBAAuB,CAAC,GAAG,CAAC,CAAA;IAC5B,oBAAoB,EAAE,CAAA;IACtB,cAAc,EAAE,CAAA;IAChB,wBAAwB,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IAC1C,gBAAgB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAA;IAElD,YAAY;IACZ,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QAChC,OAAO,CAAC,OAAO,CAAC;YACd,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE;YAChB,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,eAAe;YACrB,KAAK,EAAE,EAAE,SAAS,EAAE;YACpB,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE;YACpC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,UAAU,EAAE,CAAC;YACb,aAAa,EAAE,CAAC;SACjB,CAAC,CAAA;IACJ,CAAC,EAAE,mBAAmB,CAAC,CAAA;IACvB,IAAI,cAAc,IAAI,OAAO,cAAc,KAAK,QAAQ,IAAI,OAAO,IAAI,cAAc,EAAE,CAAC;QACtF,cAAc,CAAC,KAAK,EAAE,CAAA;IACxB,CAAC;IAED,qCAAqC;IACrC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,kBAAkB,GAAG,IAAI,CAAA;QACzB,MAAM,MAAM,GAAG,GAAG,EAAE,GAAG,qBAAqB,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA,CAAC,CAAC,CAAA;QAChE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAA;QAClC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;QAC/B,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IAChC,CAAC;IAED,QAAQ,CAAC,uDAAuD,SAAS,aAAa,mBAAmB,WAAW,SAAS,EAAE,CAAC,CAAA;IAEhI,0DAA0D;IAC1D,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IAEzD,OAAO;QACL,SAAS;QACT,QAAQ,EAAE,GAAG,EAAE,CAAC,qBAAqB,EAAE;KACxC,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,WAAW,CAAC,SAAiB,EAAE,MAAe,EAAE,YAA8C,EAAE;IAC7G,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IACzB,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAA;IAE5B,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAM;IAExD,MAAM,IAAI,GAA4B,EAAE,CAAA;IACxC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;QAAE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IACjF,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IAErE,MAAM,OAAO,GAA2B,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAA;IAC9E,IAAI,MAAM;QAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,EAAE,CAAA;IAEzD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,gBAAgB,EAAE,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,4BAA4B,EAAE;YAChG,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAA;QACF,QAAQ,CAAC,iCAAiC,SAAS,CAAC,MAAM,eAAe,KAAK,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAM,GAAG,CAAC,CAAA;IACvH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,QAAQ,CAAC,sCAAsC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACpG,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,MAAM,GAAG,GAAG,uBAAuB,EAAE,CAAA;IACrC,IAAI,CAAC,GAAG;QAAE,OAAM;IAEhB,kDAAkD;IAClD,IAAI,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxD,MAAM,MAAM,GAAG,GAAG,CAAC,cAAc,CAAA;QACjC,GAAG,CAAC,cAAc,GAAG,SAAS,CAAA;QAC9B,MAAM,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IAC9C,CAAC;IAED,iBAAiB;IACjB,IAAI,cAAc,EAAE,CAAC;QACnB,aAAa,CAAC,cAAc,CAAC,CAAA;QAC7B,cAAc,GAAG,IAAI,CAAA;IACvB,CAAC;IAED,yBAAyB;IACzB,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC;QAClB,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE;QAChB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,iBAAiB;QACvB,KAAK,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE;QACnC,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE;QACpC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,UAAU,EAAE,CAAC;QACb,aAAa,EAAE,CAAC;KACjB,CAAC,CAAA;IAEF,oBAAoB;IACpB,MAAM,qBAAqB,EAAE,CAAA;IAE7B,kCAAkC;IAClC,MAAM,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAA;IAE5B,yBAAyB,EAAE,CAAA;IAC3B,QAAQ,CAAC,qDAAqD,GAAG,CAAC,SAAS,EAAE,CAAC,CAAA;AAChF,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,UAAU,CAAC,YAAqB;IAC9C,MAAM,GAAG,GAAG,uBAAuB,EAAE,CAAA;IACrC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAA;IAEpF,sFAAsF;IACtF,IAAI,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxD,MAAM,MAAM,GAAG,GAAG,CAAC,cAAc,CAAA;QACjC,GAAG,CAAC,cAAc,GAAG,SAAS,CAAA;QAC9B,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACnD,QAAQ,CAAC,0CAA0C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACxG,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,YAAY,IAAI,GAAG,CAAC,mBAAmB,CAAA;IAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAC5B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACxC,GAAG,CAAC,OAAO,GAAG,GAAG,YAAY,KAAK,SAAS,KAAK,OAAO,EAAE,CAAA;IAEzD,2EAA2E;IAC3E,IAAI,qBAAqB,EAAE,EAAE,CAAC;QAC5B,GAAG,CAAC,cAAc,GAAG,EAAE,CAAA;IACzB,CAAC;IAED,sEAAsE;IACtE,wEAAwE;IACxE,kBAAkB,CAAC;QACjB,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE;QAChB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,SAAS;QACT,UAAU,EAAE,CAAC;QACb,aAAa,EAAE,CAAC;KACjB,CAAC,CAAA;IAEF,OAAO,GAAG,CAAC,OAAO,CAAA;AACpB,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,QAAQ;IACtB,MAAM,GAAG,GAAG,uBAAuB,EAAE,CAAA;IACrC,IAAI,CAAC,GAAG;QAAE,OAAM;IAEhB,6DAA6D;IAC7D,IAAI,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxD,MAAM,MAAM,GAAG,GAAG,CAAC,cAAc,CAAA;QACjC,GAAG,CAAC,cAAc,GAAG,SAAS,CAAA;QAC9B,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACnD,QAAQ,CAAC,0CAA0C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACxG,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAC5B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACxC,GAAG,CAAC,OAAO,GAAG,GAAG,GAAG,CAAC,mBAAmB,KAAK,SAAS,KAAK,OAAO,EAAE,CAAA;AACtE,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAY,EACZ,EAAiC;IAEjC,OAAO,KAAK,EAAE,GAAG,IAAU,EAAc,EAAE;QACzC,MAAM,GAAG,GAAG,uBAAuB,EAAE,CAAA;QACrC,IAAI,GAAG,EAAE,CAAC;YACR,UAAU,CAAC,IAAI,CAAC,CAAA;YAChB,MAAM,eAAe,GAAiD,EAAE,CAAA;YACxE,GAAG,CAAC,cAAc,GAAG,eAAe,CAAA;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YACxB,IAAI,MAAS,CAAA;YACb,IAAI,KAAK,GAAY,SAAS,CAAA;YAC9B,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAA;YAC5B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,KAAK,GAAG,GAAG,CAAA;gBACX,MAAM,GAAG,SAAc,CAAA;YACzB,CAAC;YACD,iEAAiE;YACjE,sEAAsE;YACtE,mEAAmE;YACnE,sDAAsD;YACtD,kBAAkB,CAAC;gBACjB,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE;gBAChB,IAAI,EAAE,UAAU;gBAChB,IAAI;gBACJ,KAAK,EAAE,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;gBACzC,MAAM,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;gBAC3C,SAAS,EAAE,KAAK;gBAChB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;gBAC9B,aAAa,EAAE,CAAC;aACjB,CAAC,CAAA;YACF,GAAG,CAAC,cAAc,GAAG,SAAS,CAAA;YAC9B,uDAAuD;YACvD,MAAM,iBAAiB,CAAC,eAAe,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;YACrD,QAAQ,EAAE,CAAA;YACV,IAAI,KAAK,KAAK,SAAS;gBAAE,MAAM,KAAK,CAAA;YACpC,OAAO,MAAM,CAAA;QACf,CAAC;QACD,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,CAAA;IACpB,CAAC,CAAA;AACH,CAAC"}
|
package/package.json
CHANGED
package/src/ci/trace-writer.ts
CHANGED
|
@@ -10,7 +10,7 @@ const TRACE_DIR = '.ed_traces'
|
|
|
10
10
|
const SENSITIVE_KEYS = /^(authorization|api_key|apikey|password|secret|token)$/i
|
|
11
11
|
|
|
12
12
|
export function isTraceCaptureEnabled(): boolean {
|
|
13
|
-
return process.env.
|
|
13
|
+
return process.env.ELASTICDASH_CAPTURE_TRACE === '1'
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
export function generateTraceFilename(): string {
|
package/src/observability.ts
CHANGED
|
@@ -14,7 +14,8 @@ import { connectToBackend, disconnectFromBackend } from './socket-connector.js'
|
|
|
14
14
|
import { executeTrigger } from './trigger-executor.js'
|
|
15
15
|
import { scanTools, scanWorkflows } from './execution/tool-runner.js'
|
|
16
16
|
import { debugLog } from './utils/debug.js'
|
|
17
|
-
import { maybeCaptureTrace } from './ci/trace-writer.js'
|
|
17
|
+
import { isTraceCaptureEnabled, maybeCaptureTrace } from './ci/trace-writer.js'
|
|
18
|
+
import type { WorkflowEvent } from './capture/event.js'
|
|
18
19
|
|
|
19
20
|
export interface ObservabilityOptions {
|
|
20
21
|
serverUrl?: string
|
|
@@ -167,6 +168,13 @@ export async function shutdownObservability(): Promise<void> {
|
|
|
167
168
|
const ctx = getObservabilityContext()
|
|
168
169
|
if (!ctx) return
|
|
169
170
|
|
|
171
|
+
// Flush any pending trace capture before shutdown
|
|
172
|
+
if (ctx.eventCollector && ctx.eventCollector.length > 0) {
|
|
173
|
+
const events = ctx.eventCollector
|
|
174
|
+
ctx.eventCollector = undefined
|
|
175
|
+
await maybeCaptureTrace(events, ctx.traceId)
|
|
176
|
+
}
|
|
177
|
+
|
|
170
178
|
// Stop heartbeat
|
|
171
179
|
if (heartbeatTimer) {
|
|
172
180
|
clearInterval(heartbeatTimer)
|
|
@@ -217,11 +225,26 @@ export async function shutdownObservability(): Promise<void> {
|
|
|
217
225
|
export function startTrace(workflowName?: string): string {
|
|
218
226
|
const ctx = getObservabilityContext()
|
|
219
227
|
if (!ctx) throw new Error('[elasticdash] startTrace: observability not initialised')
|
|
228
|
+
|
|
229
|
+
// Flush any pending trace capture from a previous startTrace() that had no endTrace()
|
|
230
|
+
if (ctx.eventCollector && ctx.eventCollector.length > 0) {
|
|
231
|
+
const events = ctx.eventCollector
|
|
232
|
+
ctx.eventCollector = undefined
|
|
233
|
+
maybeCaptureTrace(events, ctx.traceId).catch((err) => {
|
|
234
|
+
debugLog(`[elasticdash] Failed to capture trace: ${err instanceof Error ? err.message : String(err)}`)
|
|
235
|
+
})
|
|
236
|
+
}
|
|
237
|
+
|
|
220
238
|
const resolvedName = workflowName || ctx.defaultWorkflowName
|
|
221
239
|
const timestamp = Date.now()
|
|
222
240
|
const shortId = randomUUID().slice(0, 8)
|
|
223
241
|
ctx.traceId = `${resolvedName}::${timestamp}::${shortId}`
|
|
224
242
|
|
|
243
|
+
// When ELASTICDASH_CAPTURE_TRACE=1, start collecting events for disk trace
|
|
244
|
+
if (isTraceCaptureEnabled()) {
|
|
245
|
+
ctx.eventCollector = []
|
|
246
|
+
}
|
|
247
|
+
|
|
225
248
|
// Emit a workflow event so the backend can discover the workflow name
|
|
226
249
|
// (same as wrapWorkflow, but without wrapping — for streaming handlers)
|
|
227
250
|
pushTelemetryEvent({
|
|
@@ -255,6 +278,16 @@ export function startTrace(workflowName?: string): string {
|
|
|
255
278
|
export function endTrace(): void {
|
|
256
279
|
const ctx = getObservabilityContext()
|
|
257
280
|
if (!ctx) return
|
|
281
|
+
|
|
282
|
+
// Flush collected events to disk if trace capture is enabled
|
|
283
|
+
if (ctx.eventCollector && ctx.eventCollector.length > 0) {
|
|
284
|
+
const events = ctx.eventCollector
|
|
285
|
+
ctx.eventCollector = undefined
|
|
286
|
+
maybeCaptureTrace(events, ctx.traceId).catch((err) => {
|
|
287
|
+
debugLog(`[elasticdash] Failed to capture trace: ${err instanceof Error ? err.message : String(err)}`)
|
|
288
|
+
})
|
|
289
|
+
}
|
|
290
|
+
|
|
258
291
|
const timestamp = Date.now()
|
|
259
292
|
const shortId = randomUUID().slice(0, 8)
|
|
260
293
|
ctx.traceId = `${ctx.defaultWorkflowName}::${timestamp}::${shortId}`
|
|
@@ -310,7 +343,7 @@ export function wrapWorkflow<Args extends unknown[], R>(
|
|
|
310
343
|
schemaVersion: 1,
|
|
311
344
|
})
|
|
312
345
|
ctx.eventCollector = undefined
|
|
313
|
-
// Persist trace to disk if
|
|
346
|
+
// Persist trace to disk if ELASTICDASH_CAPTURE_TRACE=1
|
|
314
347
|
await maybeCaptureTrace(collectedEvents, ctx.traceId)
|
|
315
348
|
endTrace()
|
|
316
349
|
if (error !== undefined) throw error
|