iii-sdk 0.8.3 → 0.10.0
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/README.md +15 -11
- package/dist/index.cjs +278 -142
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +177 -3
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +177 -3
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +259 -125
- package/dist/index.mjs.map +1 -1
- package/dist/state.cjs +7 -5
- package/dist/state.cjs.map +1 -1
- package/dist/state.d.cts +38 -13
- package/dist/state.d.cts.map +1 -1
- package/dist/state.d.mts +38 -13
- package/dist/state.d.mts.map +1 -1
- package/dist/state.mjs +6 -5
- package/dist/state.mjs.map +1 -1
- package/dist/stream-C1zUjhzk.d.mts +145 -0
- package/dist/stream-C1zUjhzk.d.mts.map +1 -0
- package/dist/stream-lxenNA3s.d.cts +145 -0
- package/dist/stream-lxenNA3s.d.cts.map +1 -0
- package/dist/stream.d.cts +1 -1
- package/dist/stream.d.mts +1 -1
- package/dist/telemetry.cjs +6 -5
- package/dist/telemetry.d.cts +10 -11
- package/dist/telemetry.d.cts.map +1 -1
- package/dist/telemetry.d.mts +10 -11
- package/dist/telemetry.d.mts.map +1 -1
- package/dist/telemetry.mjs +1 -1
- package/dist/utils-BvWlFlLq.d.cts +839 -0
- package/dist/utils-BvWlFlLq.d.cts.map +1 -0
- package/dist/{utils-BJTjoUdq.cjs → utils-C6yTT4Js.cjs} +311 -282
- package/dist/utils-C6yTT4Js.cjs.map +1 -0
- package/dist/utils-_zSeatp1.d.mts +839 -0
- package/dist/utils-_zSeatp1.d.mts.map +1 -0
- package/dist/{utils-coGqiBHT.mjs → utils-xBUm8n1P.mjs} +246 -217
- package/dist/utils-xBUm8n1P.mjs.map +1 -0
- package/package.json +5 -3
- package/typedoc.json +8 -0
- package/vitest.config.ts +4 -4
- package/dist/stream-BEp3rjfm.d.cts +0 -97
- package/dist/stream-BEp3rjfm.d.cts.map +0 -1
- package/dist/stream-Bzpo5JNV.d.mts +0 -97
- package/dist/stream-Bzpo5JNV.d.mts.map +0 -1
- package/dist/utils-BJTjoUdq.cjs.map +0 -1
- package/dist/utils-BaGgUfjl.d.cts +0 -524
- package/dist/utils-BaGgUfjl.d.cts.map +0 -1
- package/dist/utils-CMrMD5Ij.d.mts +0 -524
- package/dist/utils-CMrMD5Ij.d.mts.map +0 -1
- package/dist/utils-coGqiBHT.mjs.map +0 -1
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
const require_index = require('./index.cjs');
|
|
2
|
-
let __opentelemetry_api = require("@opentelemetry/api");
|
|
3
2
|
let ws = require("ws");
|
|
4
|
-
let
|
|
5
|
-
let __opentelemetry_semantic_conventions = require("@opentelemetry/semantic-conventions");
|
|
6
|
-
let node_crypto = require("node:crypto");
|
|
7
|
-
let __opentelemetry_sdk_trace_base = require("@opentelemetry/sdk-trace-base");
|
|
8
|
-
let __opentelemetry_sdk_metrics = require("@opentelemetry/sdk-metrics");
|
|
9
|
-
let __opentelemetry_core = require("@opentelemetry/core");
|
|
10
|
-
let __opentelemetry_sdk_trace_node = require("@opentelemetry/sdk-trace-node");
|
|
11
|
-
let __opentelemetry_instrumentation = require("@opentelemetry/instrumentation");
|
|
12
|
-
let __opentelemetry_sdk_logs = require("@opentelemetry/sdk-logs");
|
|
13
|
-
let __opentelemetry_api_logs = require("@opentelemetry/api-logs");
|
|
14
|
-
let __opentelemetry_otlp_transformer = require("@opentelemetry/otlp-transformer");
|
|
3
|
+
let _opentelemetry_api = require("@opentelemetry/api");
|
|
15
4
|
let node_perf_hooks = require("node:perf_hooks");
|
|
5
|
+
let _opentelemetry_resources = require("@opentelemetry/resources");
|
|
6
|
+
let _opentelemetry_semantic_conventions = require("@opentelemetry/semantic-conventions");
|
|
7
|
+
let node_crypto = require("node:crypto");
|
|
8
|
+
let _opentelemetry_sdk_trace_base = require("@opentelemetry/sdk-trace-base");
|
|
9
|
+
let _opentelemetry_sdk_metrics = require("@opentelemetry/sdk-metrics");
|
|
10
|
+
let _opentelemetry_core = require("@opentelemetry/core");
|
|
11
|
+
let _opentelemetry_sdk_trace_node = require("@opentelemetry/sdk-trace-node");
|
|
12
|
+
let _opentelemetry_instrumentation = require("@opentelemetry/instrumentation");
|
|
13
|
+
let _opentelemetry_sdk_logs = require("@opentelemetry/sdk-logs");
|
|
14
|
+
let _opentelemetry_api_logs = require("@opentelemetry/api-logs");
|
|
15
|
+
let _opentelemetry_otlp_transformer = require("@opentelemetry/otlp-transformer");
|
|
16
16
|
|
|
17
17
|
//#region src/iii-constants.ts
|
|
18
18
|
/**
|
|
@@ -22,6 +22,7 @@ let node_perf_hooks = require("node:perf_hooks");
|
|
|
22
22
|
const EngineFunctions = {
|
|
23
23
|
LIST_FUNCTIONS: "engine::functions::list",
|
|
24
24
|
LIST_WORKERS: "engine::workers::list",
|
|
25
|
+
LIST_TRIGGERS: "engine::triggers::list",
|
|
25
26
|
REGISTER_WORKER: "engine::workers::register"
|
|
26
27
|
};
|
|
27
28
|
/** Engine trigger types */
|
|
@@ -47,6 +48,213 @@ const DEFAULT_BRIDGE_RECONNECTION_CONFIG = {
|
|
|
47
48
|
/** Default invocation timeout in milliseconds */
|
|
48
49
|
const DEFAULT_INVOCATION_TIMEOUT_MS = 3e4;
|
|
49
50
|
|
|
51
|
+
//#endregion
|
|
52
|
+
//#region src/worker-metrics.ts
|
|
53
|
+
/**
|
|
54
|
+
* Worker metrics collection for the III Node SDK.
|
|
55
|
+
*
|
|
56
|
+
* Collects CPU, memory, and event loop metrics for worker health monitoring.
|
|
57
|
+
* Uses the Node.js built-in `monitorEventLoopDelay` API for accurate
|
|
58
|
+
* event loop lag measurements.
|
|
59
|
+
*/
|
|
60
|
+
/**
|
|
61
|
+
* Collects worker resource metrics including CPU, memory, and event loop lag.
|
|
62
|
+
*
|
|
63
|
+
* Uses the Node.js `monitorEventLoopDelay` API for high-precision event loop
|
|
64
|
+
* delay measurements instead of manual `setImmediate` timing.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```typescript
|
|
68
|
+
* const collector = new WorkerMetricsCollector()
|
|
69
|
+
*
|
|
70
|
+
* // Collect metrics periodically
|
|
71
|
+
* setInterval(() => {
|
|
72
|
+
* const metrics = collector.collect()
|
|
73
|
+
* console.log('CPU:', metrics.cpu_percent, '%')
|
|
74
|
+
* console.log('Event Loop Lag:', metrics.event_loop_lag_ms, 'ms')
|
|
75
|
+
* }, 5000)
|
|
76
|
+
*
|
|
77
|
+
* // Clean up when done
|
|
78
|
+
* collector.stopMonitoring()
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
var WorkerMetricsCollector = class {
|
|
82
|
+
/**
|
|
83
|
+
* Creates a new WorkerMetricsCollector instance.
|
|
84
|
+
*
|
|
85
|
+
* @param options - Configuration options
|
|
86
|
+
*/
|
|
87
|
+
constructor(options = {}) {
|
|
88
|
+
this.eventLoopHistogram = null;
|
|
89
|
+
this.startTime = Date.now();
|
|
90
|
+
this.lastCpuUsage = process.cpuUsage();
|
|
91
|
+
this.lastCpuTime = node_perf_hooks.performance.now();
|
|
92
|
+
this.startEventLoopMonitoring(options.eventLoopResolutionMs ?? 20);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Starts the event loop delay histogram monitoring.
|
|
96
|
+
*
|
|
97
|
+
* @param resolutionMs - Histogram resolution in milliseconds
|
|
98
|
+
*/
|
|
99
|
+
startEventLoopMonitoring(resolutionMs) {
|
|
100
|
+
this.eventLoopHistogram = (0, node_perf_hooks.monitorEventLoopDelay)({ resolution: Number.isFinite(resolutionMs) && resolutionMs > 0 ? Math.max(1, Math.floor(resolutionMs)) : 20 });
|
|
101
|
+
this.eventLoopHistogram.enable();
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Stops the event loop monitoring and releases resources.
|
|
105
|
+
* Should be called when the collector is no longer needed.
|
|
106
|
+
*/
|
|
107
|
+
stopMonitoring() {
|
|
108
|
+
if (this.eventLoopHistogram) {
|
|
109
|
+
this.eventLoopHistogram.disable();
|
|
110
|
+
this.eventLoopHistogram = null;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Collects current worker metrics.
|
|
115
|
+
*
|
|
116
|
+
* This method calculates CPU usage since the last collection,
|
|
117
|
+
* reads memory usage, and gets event loop delay statistics.
|
|
118
|
+
* The event loop histogram is reset after each collection for
|
|
119
|
+
* accurate per-interval measurements.
|
|
120
|
+
*
|
|
121
|
+
* @returns Current worker metrics snapshot
|
|
122
|
+
*/
|
|
123
|
+
collect() {
|
|
124
|
+
const memoryUsage = process.memoryUsage();
|
|
125
|
+
const cpuUsage = process.cpuUsage();
|
|
126
|
+
const now = node_perf_hooks.performance.now();
|
|
127
|
+
const cpuDelta = {
|
|
128
|
+
user: cpuUsage.user - this.lastCpuUsage.user,
|
|
129
|
+
system: cpuUsage.system - this.lastCpuUsage.system
|
|
130
|
+
};
|
|
131
|
+
const timeDelta = (now - this.lastCpuTime) * 1e3;
|
|
132
|
+
const cpuPercent = timeDelta > 0 ? (cpuDelta.user + cpuDelta.system) / timeDelta * 100 : 0;
|
|
133
|
+
this.lastCpuUsage = cpuUsage;
|
|
134
|
+
this.lastCpuTime = now;
|
|
135
|
+
let eventLoopLagMs = 0;
|
|
136
|
+
if (this.eventLoopHistogram) {
|
|
137
|
+
eventLoopLagMs = this.eventLoopHistogram.mean / 1e6;
|
|
138
|
+
this.eventLoopHistogram.reset();
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
memory_heap_used: memoryUsage.heapUsed,
|
|
142
|
+
memory_heap_total: memoryUsage.heapTotal,
|
|
143
|
+
memory_rss: memoryUsage.rss,
|
|
144
|
+
memory_external: memoryUsage.external,
|
|
145
|
+
cpu_user_micros: cpuUsage.user,
|
|
146
|
+
cpu_system_micros: cpuUsage.system,
|
|
147
|
+
cpu_percent: Math.min(cpuPercent, 100),
|
|
148
|
+
event_loop_lag_ms: eventLoopLagMs,
|
|
149
|
+
uptime_seconds: Math.floor((Date.now() - this.startTime) / 1e3),
|
|
150
|
+
timestamp_ms: Date.now(),
|
|
151
|
+
runtime: "node"
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
//#endregion
|
|
157
|
+
//#region src/otel-worker-gauges.ts
|
|
158
|
+
let registeredGauges = false;
|
|
159
|
+
let metricsCollector = null;
|
|
160
|
+
let registeredMeter = null;
|
|
161
|
+
let registeredBatchCallback = null;
|
|
162
|
+
let registeredObservables = [];
|
|
163
|
+
function registerWorkerGauges(meter, options) {
|
|
164
|
+
if (registeredGauges) return;
|
|
165
|
+
const { workerId, workerName } = options;
|
|
166
|
+
const baseAttributes = {
|
|
167
|
+
"worker.id": workerId,
|
|
168
|
+
...workerName && { "worker.name": workerName }
|
|
169
|
+
};
|
|
170
|
+
metricsCollector = new WorkerMetricsCollector();
|
|
171
|
+
const memoryHeapUsed = meter.createObservableGauge("iii.worker.memory.heap_used", {
|
|
172
|
+
description: "Worker heap memory used in bytes",
|
|
173
|
+
unit: "bytes"
|
|
174
|
+
});
|
|
175
|
+
const memoryHeapTotal = meter.createObservableGauge("iii.worker.memory.heap_total", {
|
|
176
|
+
description: "Worker total heap memory in bytes",
|
|
177
|
+
unit: "bytes"
|
|
178
|
+
});
|
|
179
|
+
const memoryRss = meter.createObservableGauge("iii.worker.memory.rss", {
|
|
180
|
+
description: "Worker resident set size in bytes",
|
|
181
|
+
unit: "bytes"
|
|
182
|
+
});
|
|
183
|
+
const memoryExternal = meter.createObservableGauge("iii.worker.memory.external", {
|
|
184
|
+
description: "Worker external memory in bytes",
|
|
185
|
+
unit: "bytes"
|
|
186
|
+
});
|
|
187
|
+
const cpuPercent = meter.createObservableGauge("iii.worker.cpu.percent", {
|
|
188
|
+
description: "Worker CPU usage percentage",
|
|
189
|
+
unit: "%"
|
|
190
|
+
});
|
|
191
|
+
const cpuUserMicros = meter.createObservableGauge("iii.worker.cpu.user_micros", {
|
|
192
|
+
description: "Worker CPU user time in microseconds",
|
|
193
|
+
unit: "us"
|
|
194
|
+
});
|
|
195
|
+
const cpuSystemMicros = meter.createObservableGauge("iii.worker.cpu.system_micros", {
|
|
196
|
+
description: "Worker CPU system time in microseconds",
|
|
197
|
+
unit: "us"
|
|
198
|
+
});
|
|
199
|
+
const eventLoopLag = meter.createObservableGauge("iii.worker.event_loop.lag_ms", {
|
|
200
|
+
description: "Worker event loop lag in milliseconds",
|
|
201
|
+
unit: "ms"
|
|
202
|
+
});
|
|
203
|
+
const uptimeSeconds = meter.createObservableGauge("iii.worker.uptime_seconds", {
|
|
204
|
+
description: "Worker uptime in seconds",
|
|
205
|
+
unit: "s"
|
|
206
|
+
});
|
|
207
|
+
const batchCallback = (observableResult) => {
|
|
208
|
+
if (!metricsCollector) return;
|
|
209
|
+
const metrics = metricsCollector.collect();
|
|
210
|
+
if (metrics.memory_heap_used !== void 0) observableResult.observe(memoryHeapUsed, metrics.memory_heap_used, baseAttributes);
|
|
211
|
+
if (metrics.memory_heap_total !== void 0) observableResult.observe(memoryHeapTotal, metrics.memory_heap_total, baseAttributes);
|
|
212
|
+
if (metrics.memory_rss !== void 0) observableResult.observe(memoryRss, metrics.memory_rss, baseAttributes);
|
|
213
|
+
if (metrics.memory_external !== void 0) observableResult.observe(memoryExternal, metrics.memory_external, baseAttributes);
|
|
214
|
+
if (metrics.cpu_percent !== void 0) observableResult.observe(cpuPercent, metrics.cpu_percent, baseAttributes);
|
|
215
|
+
if (metrics.cpu_user_micros !== void 0) observableResult.observe(cpuUserMicros, metrics.cpu_user_micros, baseAttributes);
|
|
216
|
+
if (metrics.cpu_system_micros !== void 0) observableResult.observe(cpuSystemMicros, metrics.cpu_system_micros, baseAttributes);
|
|
217
|
+
if (metrics.event_loop_lag_ms !== void 0) observableResult.observe(eventLoopLag, metrics.event_loop_lag_ms, baseAttributes);
|
|
218
|
+
if (metrics.uptime_seconds !== void 0) observableResult.observe(uptimeSeconds, metrics.uptime_seconds, baseAttributes);
|
|
219
|
+
};
|
|
220
|
+
meter.addBatchObservableCallback(batchCallback, [
|
|
221
|
+
memoryHeapUsed,
|
|
222
|
+
memoryHeapTotal,
|
|
223
|
+
memoryRss,
|
|
224
|
+
memoryExternal,
|
|
225
|
+
cpuPercent,
|
|
226
|
+
cpuUserMicros,
|
|
227
|
+
cpuSystemMicros,
|
|
228
|
+
eventLoopLag,
|
|
229
|
+
uptimeSeconds
|
|
230
|
+
]);
|
|
231
|
+
registeredMeter = meter;
|
|
232
|
+
registeredBatchCallback = batchCallback;
|
|
233
|
+
registeredObservables = [
|
|
234
|
+
memoryHeapUsed,
|
|
235
|
+
memoryHeapTotal,
|
|
236
|
+
memoryRss,
|
|
237
|
+
memoryExternal,
|
|
238
|
+
cpuPercent,
|
|
239
|
+
cpuUserMicros,
|
|
240
|
+
cpuSystemMicros,
|
|
241
|
+
eventLoopLag,
|
|
242
|
+
uptimeSeconds
|
|
243
|
+
];
|
|
244
|
+
registeredGauges = true;
|
|
245
|
+
}
|
|
246
|
+
function stopWorkerGauges() {
|
|
247
|
+
if (registeredMeter && registeredBatchCallback) registeredMeter.removeBatchObservableCallback(registeredBatchCallback, registeredObservables);
|
|
248
|
+
if (metricsCollector) {
|
|
249
|
+
metricsCollector.stopMonitoring();
|
|
250
|
+
metricsCollector = null;
|
|
251
|
+
}
|
|
252
|
+
registeredMeter = null;
|
|
253
|
+
registeredBatchCallback = null;
|
|
254
|
+
registeredObservables = [];
|
|
255
|
+
registeredGauges = false;
|
|
256
|
+
}
|
|
257
|
+
|
|
50
258
|
//#endregion
|
|
51
259
|
//#region src/telemetry-system/types.ts
|
|
52
260
|
const ATTR_SERVICE_VERSION = "service.version";
|
|
@@ -253,24 +461,24 @@ var EngineSpanExporter = class EngineSpanExporter {
|
|
|
253
461
|
}
|
|
254
462
|
sendExport(spans, resultCallback) {
|
|
255
463
|
try {
|
|
256
|
-
const serialized =
|
|
464
|
+
const serialized = _opentelemetry_otlp_transformer.JsonTraceSerializer.serializeRequest(spans);
|
|
257
465
|
if (!serialized) {
|
|
258
|
-
resultCallback?.({ code:
|
|
466
|
+
resultCallback?.({ code: _opentelemetry_core.ExportResultCode.SUCCESS });
|
|
259
467
|
return;
|
|
260
468
|
}
|
|
261
469
|
this.connection.send(PREFIX_TRACES, serialized, (err) => {
|
|
262
470
|
if (err) {
|
|
263
471
|
console.error("[OTel] Failed to send spans:", err.message);
|
|
264
472
|
resultCallback?.({
|
|
265
|
-
code:
|
|
473
|
+
code: _opentelemetry_core.ExportResultCode.FAILED,
|
|
266
474
|
error: err
|
|
267
475
|
});
|
|
268
|
-
} else resultCallback?.({ code:
|
|
476
|
+
} else resultCallback?.({ code: _opentelemetry_core.ExportResultCode.SUCCESS });
|
|
269
477
|
});
|
|
270
478
|
} catch (err) {
|
|
271
479
|
console.error("[OTel] Error exporting spans:", err);
|
|
272
480
|
resultCallback?.({
|
|
273
|
-
code:
|
|
481
|
+
code: _opentelemetry_core.ExportResultCode.FAILED,
|
|
274
482
|
error: err
|
|
275
483
|
});
|
|
276
484
|
}
|
|
@@ -279,7 +487,7 @@ var EngineSpanExporter = class EngineSpanExporter {
|
|
|
279
487
|
if (this.connection.getState() !== "connected") {
|
|
280
488
|
if (this.pendingExports.length >= EngineSpanExporter.MAX_PENDING_EXPORTS) {
|
|
281
489
|
this.pendingExports.shift()?.resultCallback?.({
|
|
282
|
-
code:
|
|
490
|
+
code: _opentelemetry_core.ExportResultCode.FAILED,
|
|
283
491
|
error: /* @__PURE__ */ new Error("Queue overflow")
|
|
284
492
|
});
|
|
285
493
|
console.warn("[OTel] Spans export queue full, dropped oldest entry");
|
|
@@ -299,7 +507,7 @@ var EngineSpanExporter = class EngineSpanExporter {
|
|
|
299
507
|
const pending = this.pendingExports.splice(0, this.pendingExports.length);
|
|
300
508
|
const shutdownError = /* @__PURE__ */ new Error("Exporter shutdown before export completed");
|
|
301
509
|
for (const { resultCallback } of pending) resultCallback?.({
|
|
302
|
-
code:
|
|
510
|
+
code: _opentelemetry_core.ExportResultCode.FAILED,
|
|
303
511
|
error: shutdownError
|
|
304
512
|
});
|
|
305
513
|
}
|
|
@@ -325,28 +533,28 @@ var EngineMetricsExporter = class EngineMetricsExporter {
|
|
|
325
533
|
}
|
|
326
534
|
flushPending() {
|
|
327
535
|
const pending = this.pendingExports.splice(0, this.pendingExports.length);
|
|
328
|
-
for (const { metrics
|
|
536
|
+
for (const { metrics, resultCallback } of pending) this.sendExport(metrics, resultCallback);
|
|
329
537
|
}
|
|
330
538
|
sendExport(metricsData, resultCallback) {
|
|
331
539
|
try {
|
|
332
|
-
const serialized =
|
|
540
|
+
const serialized = _opentelemetry_otlp_transformer.JsonMetricsSerializer.serializeRequest(metricsData);
|
|
333
541
|
if (!serialized) {
|
|
334
|
-
resultCallback?.({ code:
|
|
542
|
+
resultCallback?.({ code: _opentelemetry_core.ExportResultCode.SUCCESS });
|
|
335
543
|
return;
|
|
336
544
|
}
|
|
337
545
|
this.connection.send(PREFIX_METRICS, serialized, (err) => {
|
|
338
546
|
if (err) {
|
|
339
547
|
console.error("[OTel] Failed to send metrics:", err.message);
|
|
340
548
|
resultCallback?.({
|
|
341
|
-
code:
|
|
549
|
+
code: _opentelemetry_core.ExportResultCode.FAILED,
|
|
342
550
|
error: err
|
|
343
551
|
});
|
|
344
|
-
} else resultCallback?.({ code:
|
|
552
|
+
} else resultCallback?.({ code: _opentelemetry_core.ExportResultCode.SUCCESS });
|
|
345
553
|
});
|
|
346
554
|
} catch (err) {
|
|
347
555
|
console.error("[OTel] Error exporting metrics:", err);
|
|
348
556
|
resultCallback?.({
|
|
349
|
-
code:
|
|
557
|
+
code: _opentelemetry_core.ExportResultCode.FAILED,
|
|
350
558
|
error: err
|
|
351
559
|
});
|
|
352
560
|
}
|
|
@@ -355,7 +563,7 @@ var EngineMetricsExporter = class EngineMetricsExporter {
|
|
|
355
563
|
if (this.connection.getState() !== "connected") {
|
|
356
564
|
if (this.pendingExports.length >= EngineMetricsExporter.MAX_PENDING_EXPORTS) {
|
|
357
565
|
this.pendingExports.shift()?.resultCallback?.({
|
|
358
|
-
code:
|
|
566
|
+
code: _opentelemetry_core.ExportResultCode.FAILED,
|
|
359
567
|
error: /* @__PURE__ */ new Error("Queue overflow")
|
|
360
568
|
});
|
|
361
569
|
console.warn("[OTel] Metrics export queue full, dropped oldest entry");
|
|
@@ -368,14 +576,14 @@ var EngineMetricsExporter = class EngineMetricsExporter {
|
|
|
368
576
|
}
|
|
369
577
|
this.sendExport(metricsData, resultCallback);
|
|
370
578
|
}
|
|
371
|
-
export(metrics
|
|
372
|
-
this.doExport(metrics
|
|
579
|
+
export(metrics, resultCallback) {
|
|
580
|
+
this.doExport(metrics, resultCallback);
|
|
373
581
|
}
|
|
374
582
|
async shutdown() {
|
|
375
583
|
const pending = this.pendingExports.splice(0, this.pendingExports.length);
|
|
376
584
|
const shutdownError = /* @__PURE__ */ new Error("Exporter shutdown before export completed");
|
|
377
585
|
for (const { resultCallback } of pending) resultCallback?.({
|
|
378
|
-
code:
|
|
586
|
+
code: _opentelemetry_core.ExportResultCode.FAILED,
|
|
379
587
|
error: shutdownError
|
|
380
588
|
});
|
|
381
589
|
}
|
|
@@ -409,24 +617,24 @@ var EngineLogExporter = class {
|
|
|
409
617
|
return;
|
|
410
618
|
}
|
|
411
619
|
try {
|
|
412
|
-
const serialized =
|
|
620
|
+
const serialized = _opentelemetry_otlp_transformer.JsonLogsSerializer.serializeRequest(logs);
|
|
413
621
|
if (!serialized) {
|
|
414
|
-
resultCallback({ code:
|
|
622
|
+
resultCallback({ code: _opentelemetry_core.ExportResultCode.SUCCESS });
|
|
415
623
|
return;
|
|
416
624
|
}
|
|
417
625
|
this.connection.send(PREFIX_LOGS, serialized, (err) => {
|
|
418
626
|
if (err) {
|
|
419
627
|
console.error("[OTel] Failed to send logs:", err.message);
|
|
420
628
|
resultCallback({
|
|
421
|
-
code:
|
|
629
|
+
code: _opentelemetry_core.ExportResultCode.FAILED,
|
|
422
630
|
error: err
|
|
423
631
|
});
|
|
424
|
-
} else resultCallback({ code:
|
|
632
|
+
} else resultCallback({ code: _opentelemetry_core.ExportResultCode.SUCCESS });
|
|
425
633
|
});
|
|
426
634
|
} catch (err) {
|
|
427
635
|
console.error("[OTel] Error exporting logs:", err);
|
|
428
636
|
resultCallback({
|
|
429
|
-
code:
|
|
637
|
+
code: _opentelemetry_core.ExportResultCode.FAILED,
|
|
430
638
|
error: err
|
|
431
639
|
});
|
|
432
640
|
}
|
|
@@ -436,7 +644,7 @@ var EngineLogExporter = class {
|
|
|
436
644
|
}
|
|
437
645
|
async shutdown() {
|
|
438
646
|
for (const { callback } of this.pendingExports) callback({
|
|
439
|
-
code:
|
|
647
|
+
code: _opentelemetry_core.ExportResultCode.FAILED,
|
|
440
648
|
error: /* @__PURE__ */ new Error("Exporter shutdown")
|
|
441
649
|
});
|
|
442
650
|
this.pendingExports = [];
|
|
@@ -452,7 +660,7 @@ var EngineLogExporter = class {
|
|
|
452
660
|
* Extract the current trace ID from the active span context.
|
|
453
661
|
*/
|
|
454
662
|
function currentTraceId() {
|
|
455
|
-
const span =
|
|
663
|
+
const span = _opentelemetry_api.trace.getActiveSpan();
|
|
456
664
|
if (span) {
|
|
457
665
|
const spanContext = span.spanContext();
|
|
458
666
|
if (spanContext.traceId && spanContext.traceId !== "00000000000000000000000000000000") return spanContext.traceId;
|
|
@@ -462,7 +670,7 @@ function currentTraceId() {
|
|
|
462
670
|
* Extract the current span ID from the active span context.
|
|
463
671
|
*/
|
|
464
672
|
function currentSpanId() {
|
|
465
|
-
const span =
|
|
673
|
+
const span = _opentelemetry_api.trace.getActiveSpan();
|
|
466
674
|
if (span) {
|
|
467
675
|
const spanContext = span.spanContext();
|
|
468
676
|
if (spanContext.spanId && spanContext.spanId !== "0000000000000000") return spanContext.spanId;
|
|
@@ -473,7 +681,7 @@ function currentSpanId() {
|
|
|
473
681
|
*/
|
|
474
682
|
function injectTraceparent() {
|
|
475
683
|
const carrier = {};
|
|
476
|
-
|
|
684
|
+
_opentelemetry_api.propagation.inject(_opentelemetry_api.context.active(), carrier);
|
|
477
685
|
return carrier.traceparent;
|
|
478
686
|
}
|
|
479
687
|
/**
|
|
@@ -481,14 +689,14 @@ function injectTraceparent() {
|
|
|
481
689
|
*/
|
|
482
690
|
function extractTraceparent(traceparent) {
|
|
483
691
|
const carrier = { traceparent };
|
|
484
|
-
return
|
|
692
|
+
return _opentelemetry_api.propagation.extract(_opentelemetry_api.context.active(), carrier);
|
|
485
693
|
}
|
|
486
694
|
/**
|
|
487
695
|
* Inject the current baggage into a W3C baggage header string.
|
|
488
696
|
*/
|
|
489
697
|
function injectBaggage() {
|
|
490
698
|
const carrier = {};
|
|
491
|
-
|
|
699
|
+
_opentelemetry_api.propagation.inject(_opentelemetry_api.context.active(), carrier);
|
|
492
700
|
return carrier.baggage;
|
|
493
701
|
}
|
|
494
702
|
/**
|
|
@@ -496,7 +704,7 @@ function injectBaggage() {
|
|
|
496
704
|
*/
|
|
497
705
|
function extractBaggage(baggage) {
|
|
498
706
|
const carrier = { baggage };
|
|
499
|
-
return
|
|
707
|
+
return _opentelemetry_api.propagation.extract(_opentelemetry_api.context.active(), carrier);
|
|
500
708
|
}
|
|
501
709
|
/**
|
|
502
710
|
* Extract both trace context and baggage from their respective headers.
|
|
@@ -505,36 +713,36 @@ function extractContext(traceparent, baggage) {
|
|
|
505
713
|
const carrier = {};
|
|
506
714
|
if (traceparent) carrier.traceparent = traceparent;
|
|
507
715
|
if (baggage) carrier.baggage = baggage;
|
|
508
|
-
return
|
|
716
|
+
return _opentelemetry_api.propagation.extract(_opentelemetry_api.context.active(), carrier);
|
|
509
717
|
}
|
|
510
718
|
/**
|
|
511
719
|
* Get a baggage entry from the current context.
|
|
512
720
|
*/
|
|
513
721
|
function getBaggageEntry(key) {
|
|
514
|
-
return
|
|
722
|
+
return _opentelemetry_api.propagation.getBaggage(_opentelemetry_api.context.active())?.getEntry(key)?.value;
|
|
515
723
|
}
|
|
516
724
|
/**
|
|
517
725
|
* Set a baggage entry in the current context.
|
|
518
726
|
*/
|
|
519
727
|
function setBaggageEntry(key, value) {
|
|
520
|
-
let bag =
|
|
728
|
+
let bag = _opentelemetry_api.propagation.getBaggage(_opentelemetry_api.context.active()) ?? _opentelemetry_api.propagation.createBaggage();
|
|
521
729
|
bag = bag.setEntry(key, { value });
|
|
522
|
-
return
|
|
730
|
+
return _opentelemetry_api.propagation.setBaggage(_opentelemetry_api.context.active(), bag);
|
|
523
731
|
}
|
|
524
732
|
/**
|
|
525
733
|
* Remove a baggage entry from the current context.
|
|
526
734
|
*/
|
|
527
735
|
function removeBaggageEntry(key) {
|
|
528
|
-
const bag =
|
|
529
|
-
if (!bag) return
|
|
736
|
+
const bag = _opentelemetry_api.propagation.getBaggage(_opentelemetry_api.context.active());
|
|
737
|
+
if (!bag) return _opentelemetry_api.context.active();
|
|
530
738
|
const newBag = bag.removeEntry(key);
|
|
531
|
-
return
|
|
739
|
+
return _opentelemetry_api.propagation.setBaggage(_opentelemetry_api.context.active(), newBag);
|
|
532
740
|
}
|
|
533
741
|
/**
|
|
534
742
|
* Get all baggage entries from the current context.
|
|
535
743
|
*/
|
|
536
744
|
function getAllBaggage() {
|
|
537
|
-
const bag =
|
|
745
|
+
const bag = _opentelemetry_api.propagation.getBaggage(_opentelemetry_api.context.active());
|
|
538
746
|
if (!bag) return {};
|
|
539
747
|
const entries = {};
|
|
540
748
|
for (const [key, entry] of bag.getAllEntries()) entries[key] = entry.value;
|
|
@@ -565,7 +773,7 @@ let originalFetch = null;
|
|
|
565
773
|
/**
|
|
566
774
|
* Patch globalThis.fetch to create OTel CLIENT spans for every HTTP request.
|
|
567
775
|
*/
|
|
568
|
-
function patchGlobalFetch(tracer
|
|
776
|
+
function patchGlobalFetch(tracer) {
|
|
569
777
|
if (originalFetch) return;
|
|
570
778
|
originalFetch = globalThis.fetch;
|
|
571
779
|
const capturedFetch = originalFetch;
|
|
@@ -598,13 +806,13 @@ function patchGlobalFetch(tracer$1) {
|
|
|
598
806
|
if (port) spanAttributes["server.port"] = port;
|
|
599
807
|
if (query) spanAttributes["url.query"] = query;
|
|
600
808
|
const spanName = path ? `${method} ${path}` : method;
|
|
601
|
-
return tracer
|
|
602
|
-
kind:
|
|
809
|
+
return tracer.startActiveSpan(spanName, {
|
|
810
|
+
kind: _opentelemetry_api.SpanKind.CLIENT,
|
|
603
811
|
attributes: spanAttributes
|
|
604
|
-
},
|
|
812
|
+
}, _opentelemetry_api.context.active(), async (span) => {
|
|
605
813
|
try {
|
|
606
814
|
const carrier = {};
|
|
607
|
-
|
|
815
|
+
_opentelemetry_api.propagation.inject(_opentelemetry_api.context.active(), carrier);
|
|
608
816
|
const headers = new Headers(init?.headers ?? (input instanceof Request ? input.headers : void 0));
|
|
609
817
|
for (const [key, value] of Object.entries(carrier)) headers.set(key, value);
|
|
610
818
|
for (const name of SAFE_REQUEST_HEADERS) {
|
|
@@ -629,13 +837,13 @@ function patchGlobalFetch(tracer$1) {
|
|
|
629
837
|
}
|
|
630
838
|
if (response.status >= 400) {
|
|
631
839
|
span.setAttribute("error.type", String(response.status));
|
|
632
|
-
span.setStatus({ code:
|
|
633
|
-
} else span.setStatus({ code:
|
|
840
|
+
span.setStatus({ code: _opentelemetry_api.SpanStatusCode.ERROR });
|
|
841
|
+
} else span.setStatus({ code: _opentelemetry_api.SpanStatusCode.OK });
|
|
634
842
|
return response;
|
|
635
843
|
} catch (error) {
|
|
636
844
|
span.setAttribute("error.type", error.name ?? "Error");
|
|
637
845
|
span.setStatus({
|
|
638
|
-
code:
|
|
846
|
+
code: _opentelemetry_api.SpanStatusCode.ERROR,
|
|
639
847
|
message: error.message
|
|
640
848
|
});
|
|
641
849
|
span.recordException(error);
|
|
@@ -705,40 +913,40 @@ function initOtel(config = {}) {
|
|
|
705
913
|
const serviceVersion = config.serviceVersion ?? process.env.SERVICE_VERSION ?? DEFAULT_OTEL_CONFIG.serviceVersion;
|
|
706
914
|
const serviceNamespace = config.serviceNamespace ?? process.env.SERVICE_NAMESPACE;
|
|
707
915
|
const serviceInstanceId = config.serviceInstanceId ?? process.env.SERVICE_INSTANCE_ID ?? (0, node_crypto.randomUUID)();
|
|
708
|
-
const engineWsUrl = config.engineWsUrl ?? process.env.
|
|
916
|
+
const engineWsUrl = config.engineWsUrl ?? process.env.III_URL ?? DEFAULT_OTEL_CONFIG.engineWsUrl;
|
|
709
917
|
const resourceAttributes = {
|
|
710
|
-
[
|
|
918
|
+
[_opentelemetry_semantic_conventions.ATTR_SERVICE_NAME]: serviceName,
|
|
711
919
|
[ATTR_SERVICE_VERSION]: serviceVersion,
|
|
712
920
|
[ATTR_SERVICE_INSTANCE_ID]: serviceInstanceId
|
|
713
921
|
};
|
|
714
922
|
if (serviceNamespace) resourceAttributes[ATTR_SERVICE_NAMESPACE] = serviceNamespace;
|
|
715
|
-
const resource = new
|
|
923
|
+
const resource = new _opentelemetry_resources.Resource(resourceAttributes);
|
|
716
924
|
sharedConnection = new SharedEngineConnection(engineWsUrl, config.reconnectionConfig);
|
|
717
|
-
tracerProvider = new
|
|
925
|
+
tracerProvider = new _opentelemetry_sdk_trace_node.NodeTracerProvider({
|
|
718
926
|
resource,
|
|
719
|
-
spanProcessors: [new
|
|
927
|
+
spanProcessors: [new _opentelemetry_sdk_trace_base.BatchSpanProcessor(new EngineSpanExporter(sharedConnection))]
|
|
720
928
|
});
|
|
721
|
-
|
|
929
|
+
_opentelemetry_api.propagation.setGlobalPropagator(new _opentelemetry_core.CompositePropagator({ propagators: [new _opentelemetry_core.W3CTraceContextPropagator(), new _opentelemetry_core.W3CBaggagePropagator()] }));
|
|
722
930
|
tracerProvider.register();
|
|
723
|
-
tracer =
|
|
931
|
+
tracer = _opentelemetry_api.trace.getTracer(serviceName);
|
|
724
932
|
console.debug(`[OTel] Traces initialized: engine=${engineWsUrl}, service=${serviceName}`);
|
|
725
933
|
if (config.metricsEnabled ?? parseBoolEnv(process.env.OTEL_METRICS_ENABLED, DEFAULT_OTEL_CONFIG.metricsEnabled)) {
|
|
726
934
|
const metricsExporter = new EngineMetricsExporter(sharedConnection);
|
|
727
935
|
const exportIntervalMs = config.metricsExportIntervalMs ?? DEFAULT_OTEL_CONFIG.metricsExportIntervalMs;
|
|
728
|
-
meterProvider = new
|
|
936
|
+
meterProvider = new _opentelemetry_sdk_metrics.MeterProvider({
|
|
729
937
|
resource,
|
|
730
|
-
readers: [new
|
|
938
|
+
readers: [new _opentelemetry_sdk_metrics.PeriodicExportingMetricReader({
|
|
731
939
|
exporter: metricsExporter,
|
|
732
940
|
exportIntervalMillis: exportIntervalMs
|
|
733
941
|
})]
|
|
734
942
|
});
|
|
735
|
-
|
|
943
|
+
_opentelemetry_api.metrics.setGlobalMeterProvider(meterProvider);
|
|
736
944
|
meter = meterProvider.getMeter(serviceName);
|
|
737
945
|
console.debug(`[OTel] Metrics initialized: interval=${exportIntervalMs}ms`);
|
|
738
946
|
}
|
|
739
947
|
const instrumentations = [...config.instrumentations ?? []];
|
|
740
948
|
if (instrumentations.length > 0) {
|
|
741
|
-
(0,
|
|
949
|
+
(0, _opentelemetry_instrumentation.registerInstrumentations)({
|
|
742
950
|
instrumentations,
|
|
743
951
|
tracerProvider,
|
|
744
952
|
meterProvider: meterProvider ?? void 0
|
|
@@ -752,8 +960,8 @@ function initOtel(config = {}) {
|
|
|
752
960
|
const logExporter = new EngineLogExporter(sharedConnection);
|
|
753
961
|
const logsScheduledDelayMillis = config.logsFlushIntervalMs ?? parseNumberEnv(process.env.OTEL_LOGS_FLUSH_INTERVAL_MS, 0) ?? DEFAULT_OTEL_CONFIG.logsFlushIntervalMs;
|
|
754
962
|
const logsMaxExportBatchSize = config.logsBatchSize ?? parseIntegerEnv(process.env.OTEL_LOGS_BATCH_SIZE, 1) ?? DEFAULT_OTEL_CONFIG.logsBatchSize;
|
|
755
|
-
loggerProvider = new
|
|
756
|
-
loggerProvider.addLogRecordProcessor(new
|
|
963
|
+
loggerProvider = new _opentelemetry_sdk_logs.LoggerProvider({ resource });
|
|
964
|
+
loggerProvider.addLogRecordProcessor(new _opentelemetry_sdk_logs.BatchLogRecordProcessor(logExporter, {
|
|
757
965
|
scheduledDelayMillis: logsScheduledDelayMillis,
|
|
758
966
|
maxExportBatchSize: logsMaxExportBatchSize
|
|
759
967
|
}));
|
|
@@ -830,15 +1038,15 @@ async function withSpan(name, options, fn) {
|
|
|
830
1038
|
};
|
|
831
1039
|
return fn(noopSpan);
|
|
832
1040
|
}
|
|
833
|
-
const parentContext = options.traceparent ? extractTraceparent(options.traceparent) :
|
|
834
|
-
return tracer.startActiveSpan(name, { kind: options.kind ??
|
|
1041
|
+
const parentContext = options.traceparent ? extractTraceparent(options.traceparent) : _opentelemetry_api.context.active();
|
|
1042
|
+
return tracer.startActiveSpan(name, { kind: options.kind ?? _opentelemetry_api.SpanKind.INTERNAL }, parentContext, async (span) => {
|
|
835
1043
|
try {
|
|
836
1044
|
const result = await fn(span);
|
|
837
|
-
span.setStatus({ code:
|
|
1045
|
+
span.setStatus({ code: _opentelemetry_api.SpanStatusCode.OK });
|
|
838
1046
|
return result;
|
|
839
1047
|
} catch (error) {
|
|
840
1048
|
span.setStatus({
|
|
841
|
-
code:
|
|
1049
|
+
code: _opentelemetry_api.SpanStatusCode.ERROR,
|
|
842
1050
|
message: error.message
|
|
843
1051
|
});
|
|
844
1052
|
span.recordException(error);
|
|
@@ -849,213 +1057,6 @@ async function withSpan(name, options, fn) {
|
|
|
849
1057
|
});
|
|
850
1058
|
}
|
|
851
1059
|
|
|
852
|
-
//#endregion
|
|
853
|
-
//#region src/worker-metrics.ts
|
|
854
|
-
/**
|
|
855
|
-
* Worker metrics collection for the III Node SDK.
|
|
856
|
-
*
|
|
857
|
-
* Collects CPU, memory, and event loop metrics for worker health monitoring.
|
|
858
|
-
* Uses the Node.js built-in `monitorEventLoopDelay` API for accurate
|
|
859
|
-
* event loop lag measurements.
|
|
860
|
-
*/
|
|
861
|
-
/**
|
|
862
|
-
* Collects worker resource metrics including CPU, memory, and event loop lag.
|
|
863
|
-
*
|
|
864
|
-
* Uses the Node.js `monitorEventLoopDelay` API for high-precision event loop
|
|
865
|
-
* delay measurements instead of manual `setImmediate` timing.
|
|
866
|
-
*
|
|
867
|
-
* @example
|
|
868
|
-
* ```typescript
|
|
869
|
-
* const collector = new WorkerMetricsCollector()
|
|
870
|
-
*
|
|
871
|
-
* // Collect metrics periodically
|
|
872
|
-
* setInterval(() => {
|
|
873
|
-
* const metrics = collector.collect()
|
|
874
|
-
* console.log('CPU:', metrics.cpu_percent, '%')
|
|
875
|
-
* console.log('Event Loop Lag:', metrics.event_loop_lag_ms, 'ms')
|
|
876
|
-
* }, 5000)
|
|
877
|
-
*
|
|
878
|
-
* // Clean up when done
|
|
879
|
-
* collector.stopMonitoring()
|
|
880
|
-
* ```
|
|
881
|
-
*/
|
|
882
|
-
var WorkerMetricsCollector = class {
|
|
883
|
-
/**
|
|
884
|
-
* Creates a new WorkerMetricsCollector instance.
|
|
885
|
-
*
|
|
886
|
-
* @param options - Configuration options
|
|
887
|
-
*/
|
|
888
|
-
constructor(options = {}) {
|
|
889
|
-
this.eventLoopHistogram = null;
|
|
890
|
-
this.startTime = Date.now();
|
|
891
|
-
this.lastCpuUsage = process.cpuUsage();
|
|
892
|
-
this.lastCpuTime = node_perf_hooks.performance.now();
|
|
893
|
-
this.startEventLoopMonitoring(options.eventLoopResolutionMs ?? 20);
|
|
894
|
-
}
|
|
895
|
-
/**
|
|
896
|
-
* Starts the event loop delay histogram monitoring.
|
|
897
|
-
*
|
|
898
|
-
* @param resolutionMs - Histogram resolution in milliseconds
|
|
899
|
-
*/
|
|
900
|
-
startEventLoopMonitoring(resolutionMs) {
|
|
901
|
-
this.eventLoopHistogram = (0, node_perf_hooks.monitorEventLoopDelay)({ resolution: Number.isFinite(resolutionMs) && resolutionMs > 0 ? Math.max(1, Math.floor(resolutionMs)) : 20 });
|
|
902
|
-
this.eventLoopHistogram.enable();
|
|
903
|
-
}
|
|
904
|
-
/**
|
|
905
|
-
* Stops the event loop monitoring and releases resources.
|
|
906
|
-
* Should be called when the collector is no longer needed.
|
|
907
|
-
*/
|
|
908
|
-
stopMonitoring() {
|
|
909
|
-
if (this.eventLoopHistogram) {
|
|
910
|
-
this.eventLoopHistogram.disable();
|
|
911
|
-
this.eventLoopHistogram = null;
|
|
912
|
-
}
|
|
913
|
-
}
|
|
914
|
-
/**
|
|
915
|
-
* Collects current worker metrics.
|
|
916
|
-
*
|
|
917
|
-
* This method calculates CPU usage since the last collection,
|
|
918
|
-
* reads memory usage, and gets event loop delay statistics.
|
|
919
|
-
* The event loop histogram is reset after each collection for
|
|
920
|
-
* accurate per-interval measurements.
|
|
921
|
-
*
|
|
922
|
-
* @returns Current worker metrics snapshot
|
|
923
|
-
*/
|
|
924
|
-
collect() {
|
|
925
|
-
const memoryUsage = process.memoryUsage();
|
|
926
|
-
const cpuUsage = process.cpuUsage();
|
|
927
|
-
const now = node_perf_hooks.performance.now();
|
|
928
|
-
const cpuDelta = {
|
|
929
|
-
user: cpuUsage.user - this.lastCpuUsage.user,
|
|
930
|
-
system: cpuUsage.system - this.lastCpuUsage.system
|
|
931
|
-
};
|
|
932
|
-
const timeDelta = (now - this.lastCpuTime) * 1e3;
|
|
933
|
-
const cpuPercent = timeDelta > 0 ? (cpuDelta.user + cpuDelta.system) / timeDelta * 100 : 0;
|
|
934
|
-
this.lastCpuUsage = cpuUsage;
|
|
935
|
-
this.lastCpuTime = now;
|
|
936
|
-
let eventLoopLagMs = 0;
|
|
937
|
-
if (this.eventLoopHistogram) {
|
|
938
|
-
eventLoopLagMs = this.eventLoopHistogram.mean / 1e6;
|
|
939
|
-
this.eventLoopHistogram.reset();
|
|
940
|
-
}
|
|
941
|
-
return {
|
|
942
|
-
memory_heap_used: memoryUsage.heapUsed,
|
|
943
|
-
memory_heap_total: memoryUsage.heapTotal,
|
|
944
|
-
memory_rss: memoryUsage.rss,
|
|
945
|
-
memory_external: memoryUsage.external,
|
|
946
|
-
cpu_user_micros: cpuUsage.user,
|
|
947
|
-
cpu_system_micros: cpuUsage.system,
|
|
948
|
-
cpu_percent: Math.min(cpuPercent, 100),
|
|
949
|
-
event_loop_lag_ms: eventLoopLagMs,
|
|
950
|
-
uptime_seconds: Math.floor((Date.now() - this.startTime) / 1e3),
|
|
951
|
-
timestamp_ms: Date.now(),
|
|
952
|
-
runtime: "node"
|
|
953
|
-
};
|
|
954
|
-
}
|
|
955
|
-
};
|
|
956
|
-
|
|
957
|
-
//#endregion
|
|
958
|
-
//#region src/otel-worker-gauges.ts
|
|
959
|
-
let registeredGauges = false;
|
|
960
|
-
let metricsCollector = null;
|
|
961
|
-
let registeredMeter = null;
|
|
962
|
-
let registeredBatchCallback = null;
|
|
963
|
-
let registeredObservables = [];
|
|
964
|
-
function registerWorkerGauges(meter$1, options) {
|
|
965
|
-
if (registeredGauges) return;
|
|
966
|
-
const { workerId, workerName } = options;
|
|
967
|
-
const baseAttributes = {
|
|
968
|
-
"worker.id": workerId,
|
|
969
|
-
...workerName && { "worker.name": workerName }
|
|
970
|
-
};
|
|
971
|
-
metricsCollector = new WorkerMetricsCollector();
|
|
972
|
-
const memoryHeapUsed = meter$1.createObservableGauge("iii.worker.memory.heap_used", {
|
|
973
|
-
description: "Worker heap memory used in bytes",
|
|
974
|
-
unit: "bytes"
|
|
975
|
-
});
|
|
976
|
-
const memoryHeapTotal = meter$1.createObservableGauge("iii.worker.memory.heap_total", {
|
|
977
|
-
description: "Worker total heap memory in bytes",
|
|
978
|
-
unit: "bytes"
|
|
979
|
-
});
|
|
980
|
-
const memoryRss = meter$1.createObservableGauge("iii.worker.memory.rss", {
|
|
981
|
-
description: "Worker resident set size in bytes",
|
|
982
|
-
unit: "bytes"
|
|
983
|
-
});
|
|
984
|
-
const memoryExternal = meter$1.createObservableGauge("iii.worker.memory.external", {
|
|
985
|
-
description: "Worker external memory in bytes",
|
|
986
|
-
unit: "bytes"
|
|
987
|
-
});
|
|
988
|
-
const cpuPercent = meter$1.createObservableGauge("iii.worker.cpu.percent", {
|
|
989
|
-
description: "Worker CPU usage percentage",
|
|
990
|
-
unit: "%"
|
|
991
|
-
});
|
|
992
|
-
const cpuUserMicros = meter$1.createObservableGauge("iii.worker.cpu.user_micros", {
|
|
993
|
-
description: "Worker CPU user time in microseconds",
|
|
994
|
-
unit: "us"
|
|
995
|
-
});
|
|
996
|
-
const cpuSystemMicros = meter$1.createObservableGauge("iii.worker.cpu.system_micros", {
|
|
997
|
-
description: "Worker CPU system time in microseconds",
|
|
998
|
-
unit: "us"
|
|
999
|
-
});
|
|
1000
|
-
const eventLoopLag = meter$1.createObservableGauge("iii.worker.event_loop.lag_ms", {
|
|
1001
|
-
description: "Worker event loop lag in milliseconds",
|
|
1002
|
-
unit: "ms"
|
|
1003
|
-
});
|
|
1004
|
-
const uptimeSeconds = meter$1.createObservableGauge("iii.worker.uptime_seconds", {
|
|
1005
|
-
description: "Worker uptime in seconds",
|
|
1006
|
-
unit: "s"
|
|
1007
|
-
});
|
|
1008
|
-
const batchCallback = (observableResult) => {
|
|
1009
|
-
if (!metricsCollector) return;
|
|
1010
|
-
const metrics$1 = metricsCollector.collect();
|
|
1011
|
-
if (metrics$1.memory_heap_used !== void 0) observableResult.observe(memoryHeapUsed, metrics$1.memory_heap_used, baseAttributes);
|
|
1012
|
-
if (metrics$1.memory_heap_total !== void 0) observableResult.observe(memoryHeapTotal, metrics$1.memory_heap_total, baseAttributes);
|
|
1013
|
-
if (metrics$1.memory_rss !== void 0) observableResult.observe(memoryRss, metrics$1.memory_rss, baseAttributes);
|
|
1014
|
-
if (metrics$1.memory_external !== void 0) observableResult.observe(memoryExternal, metrics$1.memory_external, baseAttributes);
|
|
1015
|
-
if (metrics$1.cpu_percent !== void 0) observableResult.observe(cpuPercent, metrics$1.cpu_percent, baseAttributes);
|
|
1016
|
-
if (metrics$1.cpu_user_micros !== void 0) observableResult.observe(cpuUserMicros, metrics$1.cpu_user_micros, baseAttributes);
|
|
1017
|
-
if (metrics$1.cpu_system_micros !== void 0) observableResult.observe(cpuSystemMicros, metrics$1.cpu_system_micros, baseAttributes);
|
|
1018
|
-
if (metrics$1.event_loop_lag_ms !== void 0) observableResult.observe(eventLoopLag, metrics$1.event_loop_lag_ms, baseAttributes);
|
|
1019
|
-
if (metrics$1.uptime_seconds !== void 0) observableResult.observe(uptimeSeconds, metrics$1.uptime_seconds, baseAttributes);
|
|
1020
|
-
};
|
|
1021
|
-
meter$1.addBatchObservableCallback(batchCallback, [
|
|
1022
|
-
memoryHeapUsed,
|
|
1023
|
-
memoryHeapTotal,
|
|
1024
|
-
memoryRss,
|
|
1025
|
-
memoryExternal,
|
|
1026
|
-
cpuPercent,
|
|
1027
|
-
cpuUserMicros,
|
|
1028
|
-
cpuSystemMicros,
|
|
1029
|
-
eventLoopLag,
|
|
1030
|
-
uptimeSeconds
|
|
1031
|
-
]);
|
|
1032
|
-
registeredMeter = meter$1;
|
|
1033
|
-
registeredBatchCallback = batchCallback;
|
|
1034
|
-
registeredObservables = [
|
|
1035
|
-
memoryHeapUsed,
|
|
1036
|
-
memoryHeapTotal,
|
|
1037
|
-
memoryRss,
|
|
1038
|
-
memoryExternal,
|
|
1039
|
-
cpuPercent,
|
|
1040
|
-
cpuUserMicros,
|
|
1041
|
-
cpuSystemMicros,
|
|
1042
|
-
eventLoopLag,
|
|
1043
|
-
uptimeSeconds
|
|
1044
|
-
];
|
|
1045
|
-
registeredGauges = true;
|
|
1046
|
-
}
|
|
1047
|
-
function stopWorkerGauges() {
|
|
1048
|
-
if (registeredMeter && registeredBatchCallback) registeredMeter.removeBatchObservableCallback(registeredBatchCallback, registeredObservables);
|
|
1049
|
-
if (metricsCollector) {
|
|
1050
|
-
metricsCollector.stopMonitoring();
|
|
1051
|
-
metricsCollector = null;
|
|
1052
|
-
}
|
|
1053
|
-
registeredMeter = null;
|
|
1054
|
-
registeredBatchCallback = null;
|
|
1055
|
-
registeredObservables = [];
|
|
1056
|
-
registeredGauges = false;
|
|
1057
|
-
}
|
|
1058
|
-
|
|
1059
1060
|
//#endregion
|
|
1060
1061
|
//#region src/utils.ts
|
|
1061
1062
|
/**
|
|
@@ -1077,6 +1078,28 @@ function safeStringify(value) {
|
|
|
1077
1078
|
return "[unserializable]";
|
|
1078
1079
|
}
|
|
1079
1080
|
}
|
|
1081
|
+
/**
|
|
1082
|
+
* Helper that wraps an HTTP-style handler (with separate `req`/`res` arguments)
|
|
1083
|
+
* into the function handler format expected by the SDK.
|
|
1084
|
+
*
|
|
1085
|
+
* @param callback - Async handler receiving an {@link HttpRequest} and {@link HttpResponse}.
|
|
1086
|
+
* @returns A function handler compatible with {@link ISdk.registerFunction}.
|
|
1087
|
+
*
|
|
1088
|
+
* @example
|
|
1089
|
+
* ```typescript
|
|
1090
|
+
* import { http } from 'iii-sdk'
|
|
1091
|
+
*
|
|
1092
|
+
* iii.registerFunction(
|
|
1093
|
+
* { id: 'my-api' },
|
|
1094
|
+
* http(async (req, res) => {
|
|
1095
|
+
* res.status(200)
|
|
1096
|
+
* res.headers({ 'content-type': 'application/json' })
|
|
1097
|
+
* res.stream.end(JSON.stringify({ hello: 'world' }))
|
|
1098
|
+
* res.close()
|
|
1099
|
+
* }),
|
|
1100
|
+
* )
|
|
1101
|
+
* ```
|
|
1102
|
+
*/
|
|
1080
1103
|
const http = (callback) => {
|
|
1081
1104
|
return async (req) => {
|
|
1082
1105
|
const { response, ...request } = req;
|
|
@@ -1094,6 +1117,12 @@ const http = (callback) => {
|
|
|
1094
1117
|
});
|
|
1095
1118
|
};
|
|
1096
1119
|
};
|
|
1120
|
+
/**
|
|
1121
|
+
* Type guard that checks if a value is a {@link StreamChannelRef}.
|
|
1122
|
+
*
|
|
1123
|
+
* @param value - Value to check.
|
|
1124
|
+
* @returns `true` if the value is a valid `StreamChannelRef`.
|
|
1125
|
+
*/
|
|
1097
1126
|
const isChannelRef = (value) => {
|
|
1098
1127
|
if (typeof value !== "object" || value === null) return false;
|
|
1099
1128
|
const maybe = value;
|
|
@@ -1269,4 +1298,4 @@ Object.defineProperty(exports, 'withSpan', {
|
|
|
1269
1298
|
return withSpan;
|
|
1270
1299
|
}
|
|
1271
1300
|
});
|
|
1272
|
-
//# sourceMappingURL=utils-
|
|
1301
|
+
//# sourceMappingURL=utils-C6yTT4Js.cjs.map
|