@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.
Files changed (167) hide show
  1. package/.env.example +21 -2
  2. package/README.md +1 -2
  3. package/dist/cjs/config/bootConfig.cjs +19 -14
  4. package/dist/cjs/config/config.cjs +112 -125
  5. package/dist/cjs/config/config.types.cjs +1 -4
  6. package/dist/cjs/docs/openapi.yaml +158 -4
  7. package/dist/cjs/index.cjs +27 -30
  8. package/dist/cjs/routesManager.cjs +62 -70
  9. package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.cjs +202 -190
  10. package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.cjs +204 -99
  11. package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.cjs +152 -116
  12. package/dist/cjs/telemetry/custom-implementations/instrumentations/logsInstrumentation.cjs +92 -0
  13. package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/Chunk.cjs +159 -0
  14. package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/Series.cjs +168 -0
  15. package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/SeriesRegistry.cjs +389 -0
  16. package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/types.cjs +2 -0
  17. package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/utils.cjs +77 -0
  18. package/dist/cjs/telemetry/custom-implementations/processors/dynamicMultiLogProcessor.cjs +65 -63
  19. package/dist/cjs/telemetry/custom-implementations/processors/dynamicMultiSpanProcessor.cjs +63 -62
  20. package/dist/cjs/telemetry/custom-implementations/utils/circular.cjs +47 -47
  21. package/dist/cjs/telemetry/custom-implementations/utils/storagePath.cjs +39 -0
  22. package/dist/cjs/telemetry/custom-implementations/wrappers.cjs +141 -138
  23. package/dist/cjs/telemetry/initializeTelemetry.cjs +35 -91
  24. package/dist/cjs/telemetry/telemetryConfigurator.cjs +70 -72
  25. package/dist/cjs/telemetry/telemetryRegistry.cjs +45 -31
  26. package/dist/cjs/tlm-ai/agent.cjs +49 -64
  27. package/dist/cjs/tlm-ai/aiController.cjs +54 -76
  28. package/dist/cjs/tlm-ai/aiRoutes.cjs +17 -20
  29. package/dist/cjs/tlm-ai/aiService.cjs +91 -95
  30. package/dist/cjs/tlm-ai/tools.cjs +177 -174
  31. package/dist/cjs/tlm-auth/authController.cjs +80 -123
  32. package/dist/cjs/tlm-auth/authMiddleware.cjs +25 -30
  33. package/dist/cjs/tlm-auth/authRoutes.cjs +11 -14
  34. package/dist/cjs/tlm-log/logController.cjs +171 -116
  35. package/dist/cjs/tlm-log/logRoutes.cjs +20 -20
  36. package/dist/cjs/tlm-metric/metricsController.cjs +211 -121
  37. package/dist/cjs/tlm-metric/metricsRoutes.cjs +23 -20
  38. package/dist/cjs/tlm-plugin/pluginController.cjs +128 -140
  39. package/dist/cjs/tlm-plugin/pluginProcess.cjs +89 -94
  40. package/dist/cjs/tlm-plugin/pluginRoutes.cjs +11 -14
  41. package/dist/cjs/tlm-plugin/pluginService.cjs +73 -74
  42. package/dist/cjs/tlm-trace/traceController.cjs +169 -117
  43. package/dist/cjs/tlm-trace/traceRoutes.cjs +20 -20
  44. package/dist/cjs/tlm-ui/uiRoutes.cjs +63 -32
  45. package/dist/cjs/tlm-util/utilController.cjs +68 -70
  46. package/dist/cjs/tlm-util/utilRoutes.cjs +51 -63
  47. package/dist/cjs/types/index.cjs +2 -5
  48. package/dist/cjs/utils/logger.cjs +38 -43
  49. package/dist/cjs/utils/regexUtils.cjs +22 -22
  50. package/dist/esm/config/bootConfig.js +6 -0
  51. package/dist/esm/config/config.js +1 -2
  52. package/dist/esm/docs/openapi.yaml +158 -4
  53. package/dist/esm/index.js +9 -8
  54. package/dist/esm/routesManager.js +6 -10
  55. package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.js +47 -8
  56. package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.js +164 -48
  57. package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.js +69 -29
  58. package/dist/esm/telemetry/custom-implementations/instrumentations/logsInstrumentation.js +85 -0
  59. package/dist/esm/telemetry/custom-implementations/metrics/tsdb/Chunk.js +155 -0
  60. package/dist/esm/telemetry/custom-implementations/metrics/tsdb/Series.js +164 -0
  61. package/dist/esm/telemetry/custom-implementations/metrics/tsdb/SeriesRegistry.js +382 -0
  62. package/dist/esm/telemetry/custom-implementations/metrics/tsdb/types.js +1 -0
  63. package/dist/esm/telemetry/custom-implementations/metrics/tsdb/utils.js +74 -0
  64. package/dist/esm/telemetry/custom-implementations/processors/dynamicMultiLogProcessor.js +2 -1
  65. package/dist/esm/telemetry/custom-implementations/processors/dynamicMultiSpanProcessor.js +1 -1
  66. package/dist/esm/telemetry/custom-implementations/utils/storagePath.js +33 -0
  67. package/dist/esm/telemetry/custom-implementations/wrappers.js +5 -2
  68. package/dist/esm/telemetry/initializeTelemetry.js +27 -69
  69. package/dist/esm/telemetry/telemetryConfigurator.js +42 -40
  70. package/dist/esm/telemetry/telemetryRegistry.js +12 -1
  71. package/dist/esm/tlm-ai/agent.js +5 -3
  72. package/dist/esm/tlm-ai/aiController.js +3 -3
  73. package/dist/esm/tlm-ai/aiService.js +6 -2
  74. package/dist/esm/tlm-ai/tools.js +5 -9
  75. package/dist/esm/tlm-auth/authController.js +3 -2
  76. package/dist/esm/tlm-log/logController.js +84 -4
  77. package/dist/esm/tlm-log/logRoutes.js +5 -2
  78. package/dist/esm/tlm-metric/metricsController.js +172 -49
  79. package/dist/esm/tlm-metric/metricsRoutes.js +10 -4
  80. package/dist/esm/tlm-plugin/pluginController.js +6 -11
  81. package/dist/esm/tlm-plugin/pluginService.js +2 -4
  82. package/dist/esm/tlm-trace/traceController.js +102 -16
  83. package/dist/esm/tlm-trace/traceRoutes.js +5 -2
  84. package/dist/esm/tlm-ui/uiRoutes.js +5 -5
  85. package/dist/esm/tlm-util/utilController.js +3 -9
  86. package/dist/esm/tlm-util/utilRoutes.js +2 -2
  87. package/dist/types/config/bootConfig.d.ts +4 -0
  88. package/dist/types/config/config.d.ts +36 -7
  89. package/dist/types/config/config.types.d.ts +6 -0
  90. package/dist/types/index.d.ts +2 -3
  91. package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.d.ts +4 -1
  92. package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.d.ts +60 -15
  93. package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.d.ts +9 -4
  94. package/dist/types/telemetry/custom-implementations/instrumentations/logsInstrumentation.d.ts +23 -0
  95. package/dist/types/telemetry/custom-implementations/metrics/tsdb/Chunk.d.ts +49 -0
  96. package/dist/types/telemetry/custom-implementations/metrics/tsdb/Series.d.ts +67 -0
  97. package/dist/types/telemetry/custom-implementations/metrics/tsdb/SeriesRegistry.d.ts +69 -0
  98. package/dist/types/telemetry/custom-implementations/metrics/tsdb/types.d.ts +68 -0
  99. package/dist/types/telemetry/custom-implementations/metrics/tsdb/utils.d.ts +21 -0
  100. package/dist/types/telemetry/custom-implementations/processors/dynamicMultiLogProcessor.d.ts +2 -2
  101. package/dist/types/telemetry/custom-implementations/utils/storagePath.d.ts +12 -0
  102. package/dist/types/telemetry/custom-implementations/wrappers.d.ts +1 -1
  103. package/dist/types/telemetry/telemetryConfigurator.d.ts +1 -1
  104. package/dist/types/telemetry/telemetryRegistry.d.ts +8 -0
  105. package/dist/types/tlm-ai/agent.d.ts +1 -1
  106. package/dist/types/tlm-ai/aiService.d.ts +1 -1
  107. package/dist/types/tlm-log/logController.d.ts +2 -0
  108. package/dist/types/tlm-metric/metricsController.d.ts +16 -2
  109. package/dist/types/tlm-trace/traceController.d.ts +3 -1
  110. package/dist/types/types/index.d.ts +2 -2
  111. package/dist/ui/assets/{ApiDocsPage-C_VVPPHa.js → ApiDocsPage-BFUrXE5F.js} +2 -2
  112. package/dist/ui/assets/CollapsibleCard-STA1GVQO.js +1 -0
  113. package/dist/ui/assets/DevToolsPage-BRSfZqO_.js +1 -0
  114. package/dist/ui/assets/LandingPage-DzeDy7q7.js +6 -0
  115. package/dist/ui/assets/LogsPage-BeiFrV2X.js +1 -0
  116. package/dist/ui/assets/{NotFoundPage-B3quk3P1.js → NotFoundPage-fRNOatbM.js} +1 -1
  117. package/dist/ui/assets/PluginCreatePage-Ch_RXsdf.js +50 -0
  118. package/dist/ui/assets/PluginPage-Cl65ZZ_n.js +27 -0
  119. package/dist/ui/assets/TraceSpansPage-BoK4M5Hh.js +6 -0
  120. package/dist/ui/assets/VirtualizedListPanel-zcj0v7DL.js +16 -0
  121. package/dist/ui/assets/alert-BkNVKxJN.js +1133 -0
  122. package/dist/ui/assets/badge-CN7FeufU.js +1 -0
  123. package/dist/ui/assets/{chevron-down-CPsvsmqj.js → chevron-down-CG--ounh.js} +1 -1
  124. package/dist/ui/assets/{chevron-up-Df9jMo1X.js → chevron-up-B6tzMAOm.js} +1 -1
  125. package/dist/ui/assets/{circle-alert-DOPQPvU8.js → circle-alert-BDF8Tq9y.js} +1 -1
  126. package/dist/ui/assets/dialog-BrpWNk36.js +15 -0
  127. package/dist/ui/assets/index-6xOVKwKn.js +305 -0
  128. package/dist/ui/assets/index-D6f1KjWV.css +1 -0
  129. package/dist/ui/assets/index-D96rVSkR.js +1 -0
  130. package/dist/ui/assets/info-99kuqpbx.js +6 -0
  131. package/dist/ui/assets/{input-Dzvg_ZEZ.js → input-B-01QDg_.js} +1 -1
  132. package/dist/ui/assets/label-CQLeZjM1.js +1 -0
  133. package/dist/ui/assets/{loader-circle-CrvlRy5o.js → loader-circle-BoDGk-BO.js} +1 -1
  134. package/dist/ui/assets/{loginPage-qa4V-B70.js → loginPage-8F4EEd1B.js} +1 -1
  135. package/dist/ui/assets/metrics-page-D1GxaB_c.css +1 -0
  136. package/dist/ui/assets/metrics-page-DPtteXqY.js +31 -0
  137. package/dist/ui/assets/popover-DS_8DYYt.js +11 -0
  138. package/dist/ui/assets/select-DYjegiXi.js +6 -0
  139. package/dist/ui/assets/separator-DGsRxIrl.js +6 -0
  140. package/dist/ui/assets/severityOptions-DEOvJqC9.js +11 -0
  141. package/dist/ui/assets/square-pen-DPhgYz6O.js +6 -0
  142. package/dist/ui/assets/switch-Di9NJH2A.js +1 -0
  143. package/dist/ui/assets/trace-DJq1miYa.js +1 -0
  144. package/dist/ui/assets/upload-BiLTpCnX.js +11 -0
  145. package/dist/ui/assets/{utilService-DNyqzwj0.js → utilService-CNZOmadC.js} +1 -1
  146. package/dist/ui/assets/wand-sparkles-CPoBNFFg.js +6 -0
  147. package/dist/ui/index.html +2 -2
  148. package/package.json +44 -48
  149. package/dist/ui/assets/CollapsibleCard-B3KR_8mL.js +0 -1
  150. package/dist/ui/assets/DevToolsPage-OyZcDcmw.js +0 -1
  151. package/dist/ui/assets/LandingPage-CppFBA6K.js +0 -6
  152. package/dist/ui/assets/LogsPage-9Fq8GArS.js +0 -26
  153. package/dist/ui/assets/PluginCreatePage-X_aCH4t4.js +0 -50
  154. package/dist/ui/assets/PluginPage-DMDSihrZ.js +0 -27
  155. package/dist/ui/assets/alert-jQ9HCPIf.js +0 -1133
  156. package/dist/ui/assets/badge-CNq0-mH5.js +0 -1
  157. package/dist/ui/assets/card-DFAwwhN3.js +0 -1
  158. package/dist/ui/assets/index-BkD6DijD.js +0 -15
  159. package/dist/ui/assets/index-CERGVYZK.js +0 -292
  160. package/dist/ui/assets/index-CSIPf9qw.css +0 -1
  161. package/dist/ui/assets/label-DuVnkZ4q.js +0 -1
  162. package/dist/ui/assets/select-DhS8YUtJ.js +0 -1
  163. package/dist/ui/assets/separator-isK4chBP.js +0 -6
  164. package/dist/ui/assets/severityOptions-O38dSOfk.js +0 -11
  165. package/dist/ui/assets/switch-Z3mImG9n.js +0 -1
  166. package/dist/ui/assets/tabs-_77MUUQe.js +0 -16
  167. package/dist/ui/assets/upload-C1LT4Gkb.js +0 -16
@@ -1,82 +1,81 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
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
- var _logger = _interopRequireDefault(require("../utils/logger.cjs"));
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
- constructor() {
11
- this.plugins = [];
12
- this.enabled = false;
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
- deactivatePlugin(pluginId) {
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
- deletePlugin(pluginId) {
33
- const plugin = this.plugins.find(p => p.id === pluginId);
34
- if (plugin?.process && !plugin.process.killed) {
35
- plugin.process.kill(1);
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
- this.plugins = this.plugins.filter(p => p.id !== pluginId);
38
- }
39
- broadcastToPlugins(type, payload) {
40
- if (!this.enabled) return;
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
- } else {
58
- _logger.default.debug(`Plugin <${plugin.name}> does not implement ${type}. Skipping.`);
59
- }
60
- });
61
- }
62
- /**
63
- * Broadcast a new metric to all active plugins
64
- */
65
- broadcastMetric(metric) {
66
- this.broadcastToPlugins("newMetric", metric);
67
- }
68
- /**
69
- * Broadcast a new log to all active plugins
70
- */
71
- broadcastLog(log) {
72
- this.broadcastToPlugins("newLog", log);
73
- }
74
- /**
75
- * Broadcast a new trace to all active plugins
76
- * TODO: rename to span (trace is the whole trace, span is a single unit of work within a trace)
77
- */
78
- broadcastTrace(trace) {
79
- this.broadcastToPlugins("newTrace", trace);
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
- const pluginService = exports.pluginService = new PluginService();
81
+ exports.pluginService = new PluginService();
@@ -1,146 +1,198 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.stopTraces = exports.statusTraces = exports.startTraces = exports.setTraceRetentionTime = exports.resetTraces = exports.listTraces = exports.insertTracesToDb = exports.getTraceRetentionTime = exports.findTraces = void 0;
7
- var _telemetryRegistry = require("../telemetry/telemetryRegistry.cjs");
8
- var _regexUtils = require("../utils/regexUtils.cjs");
9
- const _excluded = ["_id"];
10
- function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
11
- function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
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
- _telemetryRegistry.inMemoryDbSpanExporter.enable();
14
- res.send('Traces started');
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
- _telemetryRegistry.inMemoryDbSpanExporter.disable();
19
- res.send('Traces stopped');
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
- const isRunning = _telemetryRegistry.inMemoryDbSpanExporter.isEnabled() || false;
24
- res.send({
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
- _telemetryRegistry.inMemoryDbSpanExporter.reset();
31
- res.send('Traces reset');
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
- try {
36
- const spans = _telemetryRegistry.inMemoryDbSpanExporter.getFinishedSpans();
37
- res.send({
38
- spansCount: spans.length,
39
- spans: spans
40
- });
41
- } catch (err) {
42
- console.error(err);
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
- const body = req.body;
51
- const query = body?.query ? body.query : {};
52
- let processedQuery;
53
- try {
54
- processedQuery = (0, _regexUtils.convertRegexRecursively)(query);
55
- } catch (error) {
56
- console.error(error.message);
57
- res.status(400).send({
58
- error: error.message
59
- });
60
- return; // Exit if invalid regex was encountered
61
- }
62
- _telemetryRegistry.inMemoryDbSpanExporter.find(processedQuery, (err, docs) => {
63
- if (err) {
64
- console.error(err);
65
- res.status(400).send({
66
- spansCount: 0,
67
- spans: [],
68
- error: err.message
69
- });
70
- return; // Exit the function to prevent further execution
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
- const jsonContent = req.body.spans;
82
- const resetData = req.query.reset === 'true';
83
- if (!Array.isArray(jsonContent)) {
84
- res.status(400).send({
85
- error: 'Invalid data format.'
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
- await new Promise((resolve, reject) => {
104
- _telemetryRegistry.inMemoryDbSpanExporter.insert(cleanedTraces, (err, newDocs) => {
105
- if (err) {
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
- message += `Inserted ${cleanedTraces.length} traces.`;
113
- res.send({
114
- message,
115
- InsertedTracesCount: cleanedTraces.length
116
- });
117
- } catch (err) {
118
- console.error(err);
119
- res.status(500).send({
120
- error: 'Failed to reset and insert data',
121
- details: err.message
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
- const retentionTimeInSeconds = req.body.retentionTimeInSeconds;
128
- if (typeof retentionTimeInSeconds !== 'number' || retentionTimeInSeconds <= 0) {
129
- res.status(400).send({
130
- error: 'Invalid retention time. Must be a positive number.'
131
- });
132
- return;
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
- const retentionTimeInSeconds = _telemetryRegistry.inMemoryDbSpanExporter.retentionTimeInSeconds || 0;
142
- res.send({
143
- retentionTimeInSeconds: retentionTimeInSeconds
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.getTraceRetentionTime = getTraceRetentionTime;
198
+ exports.exportTraces = exportTraces;
@@ -1,24 +1,24 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
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
- const router = (0, _express.Router)();
11
- // Telemetry Control
12
- router.post('/start', _traceController.startTraces);
13
- router.post('/stop', _traceController.stopTraces);
14
- router.get('/status', _traceController.statusTraces);
15
- router.post('/reset', _traceController.resetTraces);
16
- router.get('/', _traceController.listTraces);
17
- router.post('/', _traceController.insertTracesToDb);
18
- router.post('/find', _traceController.findTraces);
19
- router.post('/retention-time', _traceController.setTraceRetentionTime);
20
- router.get('/retention-time', _traceController.getTraceRetentionTime);
21
- return router;
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
- var _default = exports.default = getTraceRoutes;
24
+ exports.default = exports.getTraceRoutes;
@@ -1,37 +1,68 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
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
- var _express = _interopRequireWildcard(require("express"));
8
- var _path = _interopRequireDefault(require("path"));
9
- var _url = require("url");
10
- var _logger = _interopRequireDefault(require("../utils/logger.cjs"));
11
- var _bootConfig = require("../config/bootConfig.cjs");
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
- // This is when this file is in /dist
16
- let relativePath = '../../ui';
17
- // This is when this file in in /src
18
- if (_bootConfig.bootEnvVariables.OASTLM_BOOT_ENV === 'development') {
19
- relativePath = '../../dist/ui';
20
- _logger.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/.');
21
- }
22
- const customFilename = (0, _url.fileURLToPath)(require('url').pathToFileURL(__filename).toString());
23
- const customDirname = _path.default.dirname(customFilename);
24
- const staticFilesPath = _path.default.join(customDirname, relativePath);
25
- const router = (0, _express.Router)();
26
- // This only works once the app is built: src/ --> dist/esm/
27
- // This file: dist/esm/routes/
28
- // UI bundle: dist/ui/
29
- // For development, the UI is served separately.
30
- router.use(_express.default.static(staticFilesPath));
31
- router.get('*', (_req, res) => {
32
- // Serve the index.html file for all routes
33
- res.sendFile(_path.default.join(staticFilesPath, 'index.html'));
34
- });
35
- return router;
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;