@oas-tools/oas-telemetry 0.7.1 → 0.8.0-alpha.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/.env.example +21 -2
- package/README.md +1 -2
- package/dist/cjs/config/bootConfig.cjs +19 -14
- package/dist/cjs/config/config.cjs +112 -125
- package/dist/cjs/config/config.types.cjs +1 -4
- package/dist/cjs/docs/openapi.yaml +158 -4
- package/dist/cjs/index.cjs +27 -30
- package/dist/cjs/routesManager.cjs +62 -70
- package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.cjs +202 -190
- package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.cjs +204 -99
- package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.cjs +152 -116
- package/dist/cjs/telemetry/custom-implementations/instrumentations/logsInstrumentation.cjs +92 -0
- package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/Chunk.cjs +159 -0
- package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/Series.cjs +168 -0
- package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/SeriesRegistry.cjs +389 -0
- package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/types.cjs +2 -0
- package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/utils.cjs +77 -0
- package/dist/cjs/telemetry/custom-implementations/processors/dynamicMultiLogProcessor.cjs +65 -63
- package/dist/cjs/telemetry/custom-implementations/processors/dynamicMultiSpanProcessor.cjs +63 -62
- package/dist/cjs/telemetry/custom-implementations/utils/circular.cjs +47 -47
- package/dist/cjs/telemetry/custom-implementations/utils/storagePath.cjs +39 -0
- package/dist/cjs/telemetry/custom-implementations/wrappers.cjs +141 -138
- package/dist/cjs/telemetry/initializeTelemetry.cjs +35 -91
- package/dist/cjs/telemetry/telemetryConfigurator.cjs +70 -72
- package/dist/cjs/telemetry/telemetryRegistry.cjs +45 -31
- package/dist/cjs/tlm-ai/agent.cjs +49 -64
- package/dist/cjs/tlm-ai/aiController.cjs +54 -76
- package/dist/cjs/tlm-ai/aiRoutes.cjs +17 -20
- package/dist/cjs/tlm-ai/aiService.cjs +91 -95
- package/dist/cjs/tlm-ai/tools.cjs +177 -174
- package/dist/cjs/tlm-auth/authController.cjs +80 -123
- package/dist/cjs/tlm-auth/authMiddleware.cjs +25 -30
- package/dist/cjs/tlm-auth/authRoutes.cjs +11 -14
- package/dist/cjs/tlm-log/logController.cjs +171 -116
- package/dist/cjs/tlm-log/logRoutes.cjs +20 -20
- package/dist/cjs/tlm-metric/metricsController.cjs +211 -121
- package/dist/cjs/tlm-metric/metricsRoutes.cjs +23 -20
- package/dist/cjs/tlm-plugin/pluginController.cjs +128 -140
- package/dist/cjs/tlm-plugin/pluginProcess.cjs +89 -94
- package/dist/cjs/tlm-plugin/pluginRoutes.cjs +11 -14
- package/dist/cjs/tlm-plugin/pluginService.cjs +73 -74
- package/dist/cjs/tlm-trace/traceController.cjs +169 -117
- package/dist/cjs/tlm-trace/traceRoutes.cjs +20 -20
- package/dist/cjs/tlm-ui/uiRoutes.cjs +63 -32
- package/dist/cjs/tlm-util/utilController.cjs +68 -70
- package/dist/cjs/tlm-util/utilRoutes.cjs +51 -63
- package/dist/cjs/types/index.cjs +2 -5
- package/dist/cjs/utils/logger.cjs +38 -43
- package/dist/cjs/utils/regexUtils.cjs +22 -22
- package/dist/esm/config/bootConfig.js +6 -0
- package/dist/esm/config/config.js +1 -2
- package/dist/esm/docs/openapi.yaml +158 -4
- package/dist/esm/index.js +9 -8
- package/dist/esm/routesManager.js +6 -10
- package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.js +47 -8
- package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.js +164 -48
- package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.js +69 -29
- package/dist/esm/telemetry/custom-implementations/instrumentations/logsInstrumentation.js +85 -0
- package/dist/esm/telemetry/custom-implementations/metrics/tsdb/Chunk.js +155 -0
- package/dist/esm/telemetry/custom-implementations/metrics/tsdb/Series.js +164 -0
- package/dist/esm/telemetry/custom-implementations/metrics/tsdb/SeriesRegistry.js +382 -0
- package/dist/esm/telemetry/custom-implementations/metrics/tsdb/types.js +1 -0
- package/dist/esm/telemetry/custom-implementations/metrics/tsdb/utils.js +74 -0
- package/dist/esm/telemetry/custom-implementations/processors/dynamicMultiLogProcessor.js +2 -1
- package/dist/esm/telemetry/custom-implementations/processors/dynamicMultiSpanProcessor.js +1 -1
- package/dist/esm/telemetry/custom-implementations/utils/storagePath.js +33 -0
- package/dist/esm/telemetry/custom-implementations/wrappers.js +5 -2
- package/dist/esm/telemetry/initializeTelemetry.js +27 -69
- package/dist/esm/telemetry/telemetryConfigurator.js +42 -40
- package/dist/esm/telemetry/telemetryRegistry.js +12 -1
- package/dist/esm/tlm-ai/agent.js +5 -3
- package/dist/esm/tlm-ai/aiController.js +3 -3
- package/dist/esm/tlm-ai/aiService.js +6 -2
- package/dist/esm/tlm-ai/tools.js +5 -9
- package/dist/esm/tlm-auth/authController.js +3 -2
- package/dist/esm/tlm-log/logController.js +84 -4
- package/dist/esm/tlm-log/logRoutes.js +5 -2
- package/dist/esm/tlm-metric/metricsController.js +172 -49
- package/dist/esm/tlm-metric/metricsRoutes.js +10 -4
- package/dist/esm/tlm-plugin/pluginController.js +6 -11
- package/dist/esm/tlm-plugin/pluginService.js +2 -4
- package/dist/esm/tlm-trace/traceController.js +102 -16
- package/dist/esm/tlm-trace/traceRoutes.js +5 -2
- package/dist/esm/tlm-ui/uiRoutes.js +5 -5
- package/dist/esm/tlm-util/utilController.js +3 -9
- package/dist/esm/tlm-util/utilRoutes.js +2 -2
- package/dist/types/config/bootConfig.d.ts +4 -0
- package/dist/types/config/config.d.ts +36 -7
- package/dist/types/config/config.types.d.ts +6 -0
- package/dist/types/index.d.ts +2 -3
- package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.d.ts +4 -1
- package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.d.ts +60 -15
- package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.d.ts +9 -4
- package/dist/types/telemetry/custom-implementations/instrumentations/logsInstrumentation.d.ts +23 -0
- package/dist/types/telemetry/custom-implementations/metrics/tsdb/Chunk.d.ts +49 -0
- package/dist/types/telemetry/custom-implementations/metrics/tsdb/Series.d.ts +67 -0
- package/dist/types/telemetry/custom-implementations/metrics/tsdb/SeriesRegistry.d.ts +69 -0
- package/dist/types/telemetry/custom-implementations/metrics/tsdb/types.d.ts +68 -0
- package/dist/types/telemetry/custom-implementations/metrics/tsdb/utils.d.ts +21 -0
- package/dist/types/telemetry/custom-implementations/processors/dynamicMultiLogProcessor.d.ts +2 -2
- package/dist/types/telemetry/custom-implementations/utils/storagePath.d.ts +12 -0
- package/dist/types/telemetry/custom-implementations/wrappers.d.ts +1 -1
- package/dist/types/telemetry/telemetryConfigurator.d.ts +1 -1
- package/dist/types/telemetry/telemetryRegistry.d.ts +8 -0
- package/dist/types/tlm-ai/agent.d.ts +1 -1
- package/dist/types/tlm-ai/aiService.d.ts +1 -1
- package/dist/types/tlm-log/logController.d.ts +2 -0
- package/dist/types/tlm-metric/metricsController.d.ts +16 -2
- package/dist/types/tlm-trace/traceController.d.ts +3 -1
- package/dist/types/types/index.d.ts +2 -2
- package/dist/ui/assets/{ApiDocsPage-C_VVPPHa.js → ApiDocsPage-BFUrXE5F.js} +2 -2
- package/dist/ui/assets/CollapsibleCard-STA1GVQO.js +1 -0
- package/dist/ui/assets/DevToolsPage-BRSfZqO_.js +1 -0
- package/dist/ui/assets/LandingPage-DzeDy7q7.js +6 -0
- package/dist/ui/assets/LogsPage-BeiFrV2X.js +1 -0
- package/dist/ui/assets/{NotFoundPage-B3quk3P1.js → NotFoundPage-fRNOatbM.js} +1 -1
- package/dist/ui/assets/PluginCreatePage-Ch_RXsdf.js +50 -0
- package/dist/ui/assets/PluginPage-Cl65ZZ_n.js +27 -0
- package/dist/ui/assets/TraceSpansPage-BoK4M5Hh.js +6 -0
- package/dist/ui/assets/VirtualizedListPanel-zcj0v7DL.js +16 -0
- package/dist/ui/assets/alert-BkNVKxJN.js +1133 -0
- package/dist/ui/assets/badge-CN7FeufU.js +1 -0
- package/dist/ui/assets/{chevron-down-CPsvsmqj.js → chevron-down-CG--ounh.js} +1 -1
- package/dist/ui/assets/{chevron-up-Df9jMo1X.js → chevron-up-B6tzMAOm.js} +1 -1
- package/dist/ui/assets/{circle-alert-DOPQPvU8.js → circle-alert-BDF8Tq9y.js} +1 -1
- package/dist/ui/assets/dialog-BrpWNk36.js +15 -0
- package/dist/ui/assets/index-6xOVKwKn.js +305 -0
- package/dist/ui/assets/index-D6f1KjWV.css +1 -0
- package/dist/ui/assets/index-D96rVSkR.js +1 -0
- package/dist/ui/assets/info-99kuqpbx.js +6 -0
- package/dist/ui/assets/{input-Dzvg_ZEZ.js → input-B-01QDg_.js} +1 -1
- package/dist/ui/assets/label-CQLeZjM1.js +1 -0
- package/dist/ui/assets/{loader-circle-CrvlRy5o.js → loader-circle-BoDGk-BO.js} +1 -1
- package/dist/ui/assets/{loginPage-qa4V-B70.js → loginPage-8F4EEd1B.js} +1 -1
- package/dist/ui/assets/metrics-page-D1GxaB_c.css +1 -0
- package/dist/ui/assets/metrics-page-DPtteXqY.js +31 -0
- package/dist/ui/assets/popover-DS_8DYYt.js +11 -0
- package/dist/ui/assets/select-DYjegiXi.js +6 -0
- package/dist/ui/assets/separator-DGsRxIrl.js +6 -0
- package/dist/ui/assets/severityOptions-DEOvJqC9.js +11 -0
- package/dist/ui/assets/square-pen-DPhgYz6O.js +6 -0
- package/dist/ui/assets/switch-Di9NJH2A.js +1 -0
- package/dist/ui/assets/trace-DJq1miYa.js +1 -0
- package/dist/ui/assets/upload-BiLTpCnX.js +11 -0
- package/dist/ui/assets/{utilService-DNyqzwj0.js → utilService-CNZOmadC.js} +1 -1
- package/dist/ui/assets/wand-sparkles-CPoBNFFg.js +6 -0
- package/dist/ui/index.html +2 -2
- package/package.json +44 -48
- package/dist/ui/assets/CollapsibleCard-B3KR_8mL.js +0 -1
- package/dist/ui/assets/DevToolsPage-OyZcDcmw.js +0 -1
- package/dist/ui/assets/LandingPage-CppFBA6K.js +0 -6
- package/dist/ui/assets/LogsPage-9Fq8GArS.js +0 -26
- package/dist/ui/assets/PluginCreatePage-X_aCH4t4.js +0 -50
- package/dist/ui/assets/PluginPage-DMDSihrZ.js +0 -27
- package/dist/ui/assets/alert-jQ9HCPIf.js +0 -1133
- package/dist/ui/assets/badge-CNq0-mH5.js +0 -1
- package/dist/ui/assets/card-DFAwwhN3.js +0 -1
- package/dist/ui/assets/index-BkD6DijD.js +0 -15
- package/dist/ui/assets/index-CERGVYZK.js +0 -292
- package/dist/ui/assets/index-CSIPf9qw.css +0 -1
- package/dist/ui/assets/label-DuVnkZ4q.js +0 -1
- package/dist/ui/assets/select-DhS8YUtJ.js +0 -1
- package/dist/ui/assets/separator-isK4chBP.js +0 -6
- package/dist/ui/assets/severityOptions-O38dSOfk.js +0 -11
- package/dist/ui/assets/switch-Z3mImG9n.js +0 -1
- package/dist/ui/assets/tabs-_77MUUQe.js +0 -16
- package/dist/ui/assets/upload-C1LT4Gkb.js +0 -16
|
@@ -1,82 +1,81 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
});
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.pluginService = void 0;
|
|
7
|
-
|
|
8
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
|
+
const logger_js_1 = __importDefault(require("../utils/logger.cjs"));
|
|
9
8
|
class PluginService {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
getPlugins() {
|
|
15
|
-
return this.plugins;
|
|
16
|
-
}
|
|
17
|
-
pushPlugin(plugin) {
|
|
18
|
-
this.plugins.push(plugin);
|
|
19
|
-
}
|
|
20
|
-
activatePlugin(pluginId) {
|
|
21
|
-
const plugin = this.plugins.find(p => p.id === pluginId);
|
|
22
|
-
if (plugin) {
|
|
23
|
-
plugin.active = true;
|
|
9
|
+
plugins = [];
|
|
10
|
+
enabled = false;
|
|
11
|
+
getPlugins() {
|
|
12
|
+
return this.plugins;
|
|
24
13
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const plugin = this.plugins.find(p => p.id === pluginId);
|
|
28
|
-
if (plugin) {
|
|
29
|
-
plugin.active = false;
|
|
14
|
+
pushPlugin(plugin) {
|
|
15
|
+
this.plugins.push(plugin);
|
|
30
16
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
17
|
+
activatePlugin(pluginId) {
|
|
18
|
+
const plugin = this.plugins.find((p) => p.id === pluginId);
|
|
19
|
+
if (plugin) {
|
|
20
|
+
plugin.active = true;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
deactivatePlugin(pluginId) {
|
|
24
|
+
const plugin = this.plugins.find((p) => p.id === pluginId);
|
|
25
|
+
if (plugin) {
|
|
26
|
+
plugin.active = false;
|
|
27
|
+
}
|
|
36
28
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
this.plugins.forEach((plugin, i) => {
|
|
42
|
-
if (!plugin.active) return;
|
|
43
|
-
if (plugin.process) {
|
|
44
|
-
if (plugin.process.connected) {
|
|
45
|
-
try {
|
|
46
|
-
plugin.process.send({
|
|
47
|
-
type,
|
|
48
|
-
payload
|
|
49
|
-
});
|
|
50
|
-
_logger.default.debug(`Sent ${type} to child-process plugin <${plugin.name}> (#${i})`);
|
|
51
|
-
} catch (err) {
|
|
52
|
-
_logger.default.error(`Failed to send ${type} to plugin <${plugin.name}> (#${i}):`, err);
|
|
53
|
-
}
|
|
54
|
-
} else {
|
|
55
|
-
_logger.default.warn(`Plugin <${plugin.name}> (#${i}) is not connected. Skipping ${type}.`);
|
|
29
|
+
deletePlugin(pluginId) {
|
|
30
|
+
const plugin = this.plugins.find((p) => p.id === pluginId);
|
|
31
|
+
if (plugin?.process && !plugin.process.killed) {
|
|
32
|
+
plugin.process.kill(1);
|
|
56
33
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
34
|
+
this.plugins = this.plugins.filter((p) => p.id !== pluginId);
|
|
35
|
+
}
|
|
36
|
+
broadcastToPlugins(type, payload) {
|
|
37
|
+
if (!this.enabled)
|
|
38
|
+
return;
|
|
39
|
+
this.plugins.forEach((plugin, i) => {
|
|
40
|
+
if (!plugin.active)
|
|
41
|
+
return;
|
|
42
|
+
if (plugin.process) {
|
|
43
|
+
if (plugin.process.connected) {
|
|
44
|
+
try {
|
|
45
|
+
plugin.process.send({ type, payload });
|
|
46
|
+
logger_js_1.default.debug(`Sent ${type} to child-process plugin <${plugin.name}> (#${i})`);
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
logger_js_1.default.error(`Failed to send ${type} to plugin <${plugin.name}> (#${i}):`, err);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
logger_js_1.default.warn(`Plugin <${plugin.name}> (#${i}) is not connected. Skipping ${type}.`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
logger_js_1.default.debug(`Plugin <${plugin.name}> does not implement ${type}. Skipping.`);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Broadcast a new metric to all active plugins
|
|
63
|
+
*/
|
|
64
|
+
broadcastMetric(metric) {
|
|
65
|
+
this.broadcastToPlugins("newMetric", metric);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Broadcast a new log to all active plugins
|
|
69
|
+
*/
|
|
70
|
+
broadcastLog(log) {
|
|
71
|
+
this.broadcastToPlugins("newLog", log);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Broadcast a new trace to all active plugins
|
|
75
|
+
* TODO: rename to span (trace is the whole trace, span is a single unit of work within a trace)
|
|
76
|
+
*/
|
|
77
|
+
broadcastTrace(trace) {
|
|
78
|
+
this.broadcastToPlugins("newTrace", trace);
|
|
79
|
+
}
|
|
81
80
|
}
|
|
82
|
-
|
|
81
|
+
exports.pluginService = new PluginService();
|
|
@@ -1,146 +1,198 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.exportTraces = exports.getTraceRetentionTime = exports.setTraceRetentionTime = exports.importTraces = exports.insertTracesToDb = exports.findTraces = exports.listTraces = exports.resetTraces = exports.statusTraces = exports.stopTraces = exports.startTraces = void 0;
|
|
4
|
+
const telemetryRegistry_js_1 = require("../telemetry/telemetryRegistry.cjs");
|
|
5
|
+
const regexUtils_js_1 = require("../utils/regexUtils.cjs");
|
|
6
|
+
/**
|
|
7
|
+
* Parse import data from NDJSON or JSON format
|
|
8
|
+
* @param contentType - Content-Type header
|
|
9
|
+
* @param body - Request body (string for NDJSON, object for JSON)
|
|
10
|
+
* @returns Array of span objects
|
|
11
|
+
*/
|
|
12
|
+
function parseImportData(body) {
|
|
13
|
+
if (typeof body !== 'string') {
|
|
14
|
+
throw new Error('Import must be NDJSON format (plain text with one JSON object per line)');
|
|
15
|
+
}
|
|
16
|
+
const lines = body.split('\n').filter((line) => line.trim());
|
|
17
|
+
return lines.map((line, index) => {
|
|
18
|
+
try {
|
|
19
|
+
return JSON.parse(line);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
console.error(`Failed to parse NDJSON line ${index + 1}: ${line}`);
|
|
23
|
+
throw new Error(`Invalid JSON on line ${index + 1}`);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
12
27
|
const startTraces = (req, res) => {
|
|
13
|
-
|
|
14
|
-
|
|
28
|
+
telemetryRegistry_js_1.inMemoryDbSpanExporter.enable();
|
|
29
|
+
res.send('Traces started');
|
|
15
30
|
};
|
|
16
31
|
exports.startTraces = startTraces;
|
|
17
32
|
const stopTraces = (req, res) => {
|
|
18
|
-
|
|
19
|
-
|
|
33
|
+
telemetryRegistry_js_1.inMemoryDbSpanExporter.disable();
|
|
34
|
+
res.send('Traces stopped');
|
|
20
35
|
};
|
|
21
36
|
exports.stopTraces = stopTraces;
|
|
22
37
|
const statusTraces = (req, res) => {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
active: isRunning
|
|
26
|
-
});
|
|
38
|
+
const isRunning = telemetryRegistry_js_1.inMemoryDbSpanExporter.isEnabled() || false;
|
|
39
|
+
res.send({ active: isRunning });
|
|
27
40
|
};
|
|
28
41
|
exports.statusTraces = statusTraces;
|
|
29
42
|
const resetTraces = (req, res) => {
|
|
30
|
-
|
|
31
|
-
|
|
43
|
+
telemetryRegistry_js_1.inMemoryDbSpanExporter.reset();
|
|
44
|
+
res.send('Traces reset');
|
|
32
45
|
};
|
|
33
46
|
exports.resetTraces = resetTraces;
|
|
34
47
|
const listTraces = async (req, res) => {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
res.status(500).send({
|
|
44
|
-
error: 'Failed to list traces data'
|
|
45
|
-
});
|
|
46
|
-
}
|
|
48
|
+
try {
|
|
49
|
+
const spans = telemetryRegistry_js_1.inMemoryDbSpanExporter.getFinishedSpans();
|
|
50
|
+
res.send({ spansCount: spans.length, spans: spans });
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
console.error(err);
|
|
54
|
+
res.status(500).send({ error: 'Failed to list traces data' });
|
|
55
|
+
}
|
|
47
56
|
};
|
|
48
57
|
exports.listTraces = listTraces;
|
|
49
|
-
const findTraces = (req, res) => {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
processedQuery
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
58
|
+
const findTraces = async (req, res) => {
|
|
59
|
+
const body = req.body || {};
|
|
60
|
+
const findQuery = body.query || {};
|
|
61
|
+
const limit = parseInt(body.limit) || 50;
|
|
62
|
+
const sortOrder = body.sort || null;
|
|
63
|
+
let processedQuery;
|
|
64
|
+
try {
|
|
65
|
+
processedQuery = (0, regexUtils_js_1.convertRegexRecursively)(findQuery);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
console.error(error.message);
|
|
69
|
+
res.status(400).send({ error: error.message });
|
|
70
|
+
return; // Exit if invalid regex was encountered
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
const findConfig = {
|
|
74
|
+
query: processedQuery,
|
|
75
|
+
limit,
|
|
76
|
+
sortOrder
|
|
77
|
+
};
|
|
78
|
+
const docs = await telemetryRegistry_js_1.inMemoryDbSpanExporter.find(findConfig);
|
|
79
|
+
res.send({
|
|
80
|
+
spansCount: docs.length,
|
|
81
|
+
spans: docs,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
console.error(err);
|
|
86
|
+
res.status(500).send({ spansCount: 0, spans: [], error: err.message });
|
|
71
87
|
}
|
|
72
|
-
const spans = docs;
|
|
73
|
-
res.send({
|
|
74
|
-
spansCount: spans.length,
|
|
75
|
-
spans: spans
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
88
|
};
|
|
79
89
|
exports.findTraces = findTraces;
|
|
80
90
|
const insertTracesToDb = async (req, res) => {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
});
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
const cleanedTraces = jsonContent.map(trace => {
|
|
90
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
91
|
-
const {
|
|
92
|
-
_id
|
|
93
|
-
} = trace,
|
|
94
|
-
rest = _objectWithoutProperties(trace, _excluded); // Remove _id if it exists
|
|
95
|
-
return rest; // Return the cleaned trace object
|
|
96
|
-
});
|
|
97
|
-
try {
|
|
98
|
-
let message = '';
|
|
99
|
-
if (resetData) {
|
|
100
|
-
_telemetryRegistry.inMemoryDbSpanExporter.reset();
|
|
101
|
-
message += 'Traces Database reset. ';
|
|
91
|
+
const jsonContent = (req.body || {}).spans;
|
|
92
|
+
const resetData = req.query.reset === 'true';
|
|
93
|
+
if (!Array.isArray(jsonContent)) {
|
|
94
|
+
res.status(400).send({ error: 'Invalid data format.' });
|
|
95
|
+
return;
|
|
102
96
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
console.error('Error inserting traces:', err);
|
|
107
|
-
return reject(err);
|
|
108
|
-
}
|
|
109
|
-
resolve(newDocs);
|
|
110
|
-
});
|
|
97
|
+
const cleanedTraces = jsonContent.map((trace) => {
|
|
98
|
+
const { _id, ...rest } = trace; // Remove _id if it exists
|
|
99
|
+
return rest; // Return the cleaned trace object
|
|
111
100
|
});
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
101
|
+
try {
|
|
102
|
+
let message = '';
|
|
103
|
+
if (resetData) {
|
|
104
|
+
telemetryRegistry_js_1.inMemoryDbSpanExporter.reset();
|
|
105
|
+
message += 'Traces Database reset. ';
|
|
106
|
+
}
|
|
107
|
+
await new Promise((resolve, reject) => {
|
|
108
|
+
telemetryRegistry_js_1.inMemoryDbSpanExporter.insert(cleanedTraces, (err, newDocs) => {
|
|
109
|
+
if (err) {
|
|
110
|
+
console.error('Error inserting traces:', err);
|
|
111
|
+
return reject(err);
|
|
112
|
+
}
|
|
113
|
+
resolve(newDocs);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
message += `Inserted ${cleanedTraces.length} traces.`;
|
|
117
|
+
res.send({ message, InsertedTracesCount: cleanedTraces.length });
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
console.error(err);
|
|
121
|
+
res.status(500).send({ error: 'Failed to reset and insert data', details: err.message });
|
|
122
|
+
}
|
|
124
123
|
};
|
|
125
124
|
exports.insertTracesToDb = insertTracesToDb;
|
|
125
|
+
const importTraces = async (req, res) => {
|
|
126
|
+
const resetData = req.query.reset === 'true';
|
|
127
|
+
try {
|
|
128
|
+
// Parse NDJSON format
|
|
129
|
+
const spans = parseImportData(req.body);
|
|
130
|
+
if (spans.length === 0) {
|
|
131
|
+
res.status(400).send({ error: 'No valid traces found in import data' });
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const cleanedTraces = spans.map((trace) => {
|
|
135
|
+
const { _id, ...rest } = trace; // Remove _id if it exists
|
|
136
|
+
return rest;
|
|
137
|
+
});
|
|
138
|
+
let message = '';
|
|
139
|
+
if (resetData) {
|
|
140
|
+
telemetryRegistry_js_1.inMemoryDbSpanExporter.reset();
|
|
141
|
+
message += 'Traces Database reset. ';
|
|
142
|
+
}
|
|
143
|
+
await new Promise((resolve, reject) => {
|
|
144
|
+
telemetryRegistry_js_1.inMemoryDbSpanExporter.insert(cleanedTraces, (err, newDocs) => {
|
|
145
|
+
if (err) {
|
|
146
|
+
console.error('Error importing traces:', err);
|
|
147
|
+
return reject(err);
|
|
148
|
+
}
|
|
149
|
+
resolve(newDocs);
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
message += `Imported ${cleanedTraces.length} traces.`;
|
|
153
|
+
res.send({ message, ImportedTracesCount: cleanedTraces.length });
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
console.error('Import failed:', err);
|
|
157
|
+
res.status(400).send({ error: 'Failed to import traces', details: err.message });
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
exports.importTraces = importTraces;
|
|
126
161
|
const setTraceRetentionTime = (req, res) => {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
_telemetryRegistry.inMemoryDbSpanExporter.retentionTimeInSeconds = retentionTimeInSeconds;
|
|
135
|
-
res.send({
|
|
136
|
-
message: `Retention time set to ${retentionTimeInSeconds} seconds.`
|
|
137
|
-
});
|
|
162
|
+
const retentionTimeInSeconds = (req.body || {}).retentionTimeInSeconds;
|
|
163
|
+
if (typeof retentionTimeInSeconds !== 'number' || retentionTimeInSeconds <= 0) {
|
|
164
|
+
res.status(400).send({ error: 'Invalid retention time. Must be a positive number.' });
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
telemetryRegistry_js_1.inMemoryDbSpanExporter.retentionTimeInSeconds = retentionTimeInSeconds;
|
|
168
|
+
res.send({ message: `Retention time set to ${retentionTimeInSeconds} seconds.` });
|
|
138
169
|
};
|
|
139
170
|
exports.setTraceRetentionTime = setTraceRetentionTime;
|
|
140
171
|
const getTraceRetentionTime = (req, res) => {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
172
|
+
const retentionTimeInSeconds = telemetryRegistry_js_1.inMemoryDbSpanExporter.retentionTimeInSeconds || 0;
|
|
173
|
+
res.send({ retentionTimeInSeconds: retentionTimeInSeconds });
|
|
174
|
+
};
|
|
175
|
+
exports.getTraceRetentionTime = getTraceRetentionTime;
|
|
176
|
+
const exportTraces = async (req, res) => {
|
|
177
|
+
try {
|
|
178
|
+
const findConfig = {
|
|
179
|
+
query: {},
|
|
180
|
+
sortOrder: { startTime: -1 }
|
|
181
|
+
};
|
|
182
|
+
const docs = await telemetryRegistry_js_1.inMemoryDbSpanExporter.find(findConfig);
|
|
183
|
+
const timestamp = new Date().toISOString().slice(0, 19).replace(/[-T:]/g, '');
|
|
184
|
+
res.setHeader('Content-Type', 'application/x-ndjson');
|
|
185
|
+
res.setHeader('Content-Disposition', `attachment; filename="traces-${timestamp}.ndjson"`);
|
|
186
|
+
res.setHeader('Transfer-Encoding', 'chunked');
|
|
187
|
+
// Stream as NDJSON (one JSON object per line)
|
|
188
|
+
docs.forEach(doc => {
|
|
189
|
+
res.write(JSON.stringify(doc) + '\n');
|
|
190
|
+
});
|
|
191
|
+
res.end();
|
|
192
|
+
}
|
|
193
|
+
catch (err) {
|
|
194
|
+
console.error('Failed to export traces:', err);
|
|
195
|
+
res.status(500).send({ error: 'Failed to export traces', details: err.message });
|
|
196
|
+
}
|
|
145
197
|
};
|
|
146
|
-
exports.
|
|
198
|
+
exports.exportTraces = exportTraces;
|
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
exports.getTraceRoutes = exports.default = void 0;
|
|
7
|
-
var _express = require("express");
|
|
8
|
-
var _traceController = require("./traceController.cjs");
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getTraceRoutes = void 0;
|
|
4
|
+
const express_1 = require("express");
|
|
5
|
+
const traceController_js_1 = require("./traceController.cjs");
|
|
9
6
|
const getTraceRoutes = () => {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
7
|
+
const router = (0, express_1.Router)();
|
|
8
|
+
// Telemetry Control
|
|
9
|
+
router.post('/start', traceController_js_1.startTraces);
|
|
10
|
+
router.post('/stop', traceController_js_1.stopTraces);
|
|
11
|
+
router.get('/status', traceController_js_1.statusTraces);
|
|
12
|
+
router.post('/reset', traceController_js_1.resetTraces);
|
|
13
|
+
router.get('/export', traceController_js_1.exportTraces);
|
|
14
|
+
// Use text middleware for import to handle NDJSON format
|
|
15
|
+
router.post('/import', (0, express_1.text)({ type: 'application/x-ndjson', limit: '500mb' }), traceController_js_1.importTraces);
|
|
16
|
+
router.get('/', traceController_js_1.listTraces);
|
|
17
|
+
router.post('/', traceController_js_1.insertTracesToDb);
|
|
18
|
+
router.post('/find', traceController_js_1.findTraces);
|
|
19
|
+
router.post('/retention-time', traceController_js_1.setTraceRetentionTime);
|
|
20
|
+
router.get('/retention-time', traceController_js_1.getTraceRetentionTime);
|
|
21
|
+
return router;
|
|
22
22
|
};
|
|
23
23
|
exports.getTraceRoutes = getTraceRoutes;
|
|
24
|
-
|
|
24
|
+
exports.default = exports.getTraceRoutes;
|
|
@@ -1,37 +1,68 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
5
17
|
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
39
|
exports.getUIRoutes = void 0;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
-
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
40
|
+
const express_1 = __importStar(require("express"));
|
|
41
|
+
const path_1 = __importDefault(require("path"));
|
|
42
|
+
const url_1 = require("url");
|
|
43
|
+
const logger_js_1 = __importDefault(require("../utils/logger.cjs"));
|
|
44
|
+
const bootConfig_js_1 = require("../config/bootConfig.cjs");
|
|
14
45
|
const getUIRoutes = () => {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
46
|
+
// This is when this file is in /dist
|
|
47
|
+
let relativePath = '../../ui';
|
|
48
|
+
// This is when this file in in /src
|
|
49
|
+
if (bootConfig_js_1.bootEnvVariables.OASTLM_BOOT_ENV === 'development') {
|
|
50
|
+
relativePath = '../../dist/ui';
|
|
51
|
+
logger_js_1.default.warn('🚧 This process is serving the OASTLM UI from the build directory, but you are in development mode. For live updates, run the React app separately and access it at http://localhost:5173/.');
|
|
52
|
+
}
|
|
53
|
+
const isCjs = typeof __filename !== "undefined" && typeof __dirname !== "undefined";
|
|
54
|
+
// @ts-ignore -- import.meta no existe en el build CJS
|
|
55
|
+
const currentDirectory = isCjs ? __dirname : path_1.default.dirname((0, url_1.fileURLToPath)(__filename));
|
|
56
|
+
const staticFilesPath = path_1.default.join(currentDirectory, relativePath);
|
|
57
|
+
const router = (0, express_1.Router)();
|
|
58
|
+
// This only works once the app is built: src/ --> dist/esm/
|
|
59
|
+
// This file: dist/esm/routes/
|
|
60
|
+
// UI bundle: dist/ui/
|
|
61
|
+
// For development, the UI is served separately.
|
|
62
|
+
router.use(express_1.default.static(staticFilesPath));
|
|
63
|
+
router.use((_req, res) => {
|
|
64
|
+
res.sendFile(path_1.default.join(staticFilesPath, 'index.html'));
|
|
65
|
+
});
|
|
66
|
+
return router;
|
|
36
67
|
};
|
|
37
|
-
exports.getUIRoutes = getUIRoutes;
|
|
68
|
+
exports.getUIRoutes = getUIRoutes;
|