@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,146 +1,236 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.stopMetrics = exports.statusMetrics = exports.startMetrics = exports.setMetricRetentionTime = exports.resetMetrics = exports.listMetrics = exports.insertMetricsToDb = exports.getMetricRetentionTime = exports.findMetrics = 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; }
12
- const listMetrics = async (req, res) => {
13
- try {
14
- const metrics = _telemetryRegistry.inMemoryDbMetricExporter.getFinishedMetrics();
15
- res.send({
16
- metricsCount: metrics.length,
17
- metrics: metrics
18
- });
19
- } catch (err) {
20
- console.error(err);
21
- res.status(500).send({
22
- error: 'Failed to list metrics data'
23
- });
24
- }
25
- };
26
- exports.listMetrics = listMetrics;
27
- const findMetrics = (req, res) => {
28
- const body = req.body;
29
- const query = body?.query ? body.query : {};
30
- let processedQuery;
31
- try {
32
- processedQuery = (0, _regexUtils.convertRegexRecursively)(query);
33
- } catch (error) {
34
- console.error(error.message);
35
- res.status(400).send({
36
- error: error.message
37
- });
38
- return; // Exit if invalid regex was encountered
39
- }
40
- _telemetryRegistry.inMemoryDbMetricExporter.find(processedQuery, (err, docs) => {
41
- if (err) {
42
- console.error(err);
43
- res.status(404).send({
44
- metricsCount: 0,
45
- metrics: [],
46
- error: err
47
- });
48
- return;
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.importMetrics = exports.exportMetrics = exports.checkMetricsConsistency = exports.findMetrics = exports.getMetricRetentionTime = exports.setMetricRetentionTime = exports.statusMetrics = exports.stopMetrics = exports.startMetrics = exports.insertMetricsToDb = exports.resetMetrics = exports.getMetricsStats = void 0;
4
+ const telemetryRegistry_js_1 = require("../telemetry/telemetryRegistry.cjs");
5
+ /**
6
+ * Parse NDJSON import data
7
+ * Each line must be a valid JSON object
8
+ * @param body - Request body (raw string)
9
+ * @returns Array of metric objects
10
+ */
11
+ function parseImportData(body) {
12
+ if (typeof body !== 'string') {
13
+ throw new Error('Import must be NDJSON format (plain text with one JSON object per line)');
49
14
  }
50
- const metrics = docs;
51
- res.send({
52
- metricsCount: metrics.length,
53
- metrics: metrics
15
+ const lines = body.split('\n').filter((line) => line.trim());
16
+ return lines.map((line, index) => {
17
+ try {
18
+ return JSON.parse(line);
19
+ }
20
+ catch {
21
+ console.error(`Failed to parse NDJSON line ${index + 1}: ${line}`);
22
+ throw new Error(`Invalid JSON on line ${index + 1}`);
23
+ }
54
24
  });
55
- });
25
+ }
26
+ const getMetricsStats = async (req, res) => {
27
+ try {
28
+ const stats = telemetryRegistry_js_1.inMemoryDbMetricExporter.getStats();
29
+ res.send(stats);
30
+ }
31
+ catch (err) {
32
+ console.error(err);
33
+ res.status(500).send({ error: 'Failed to get metrics stats' });
34
+ }
56
35
  };
57
- exports.findMetrics = findMetrics;
36
+ exports.getMetricsStats = getMetricsStats;
58
37
  const resetMetrics = (req, res) => {
59
- _telemetryRegistry.inMemoryDbMetricExporter.reset();
60
- res.send('Metrics reset');
38
+ telemetryRegistry_js_1.inMemoryDbMetricExporter.reset();
39
+ res.send('Metrics reset');
61
40
  };
62
41
  exports.resetMetrics = resetMetrics;
63
42
  const insertMetricsToDb = async (req, res) => {
64
- const jsonContent = req.body.metrics;
65
- const resetData = req.query.reset === 'true';
66
- if (!Array.isArray(jsonContent)) {
67
- res.status(400).send({
68
- error: 'Invalid data format.'
69
- });
70
- return;
71
- }
72
- const cleanedMetrics = jsonContent.map(metric => {
73
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
74
- const {
75
- _id
76
- } = metric,
77
- rest = _objectWithoutProperties(metric, _excluded); // Remove _id if it exists
78
- return rest; // Return the cleaned metric object
79
- });
80
- try {
81
- let message = '';
82
- if (resetData) {
83
- _telemetryRegistry.inMemoryDbMetricExporter.reset();
84
- message += 'Metrics Database reset. ';
85
- }
86
- await new Promise((resolve, reject) => {
87
- _telemetryRegistry.inMemoryDbMetricExporter.insert(cleanedMetrics, (err, newDocs) => {
88
- if (err) {
89
- console.error('Error inserting metrics:', err);
90
- return reject(err);
43
+ try {
44
+ const scopeMetricsData = (req.body || {}).scopeMetrics;
45
+ const resetData = req.query.reset === 'true';
46
+ const format = (req.body.format || req.query.format || 'raw');
47
+ if (!Array.isArray(scopeMetricsData)) {
48
+ res.status(400).send({ error: 'Invalid data format. Expected array in body.scopeMetrics' });
49
+ return;
91
50
  }
92
- resolve(newDocs);
93
- });
94
- });
95
- message += `Inserted ${cleanedMetrics.length} metrics.`;
96
- res.send({
97
- message,
98
- InsertedMetricsCount: cleanedMetrics.length
99
- });
100
- } catch (err) {
101
- console.error(err);
102
- res.status(500).send({
103
- error: 'Failed to reset and insert data',
104
- details: err.message
105
- });
106
- }
51
+ let message = '';
52
+ if (resetData) {
53
+ telemetryRegistry_js_1.inMemoryDbMetricExporter.reset();
54
+ message += 'Metrics Database reset. ';
55
+ }
56
+ // Store samples
57
+ if (format === 'otel')
58
+ telemetryRegistry_js_1.inMemoryDbMetricExporter.insertOtel(scopeMetricsData);
59
+ else
60
+ telemetryRegistry_js_1.inMemoryDbMetricExporter.insertRaw(scopeMetricsData);
61
+ message += `Inserted ${scopeMetricsData.length} scopeMetrics (format: ${format}).`;
62
+ res.send({
63
+ message,
64
+ scopeMetricsCount: scopeMetricsData.length,
65
+ format
66
+ });
67
+ }
68
+ catch (err) {
69
+ console.error(err);
70
+ res.status(500).send({ error: 'Failed to reset and insert data', details: err.message });
71
+ }
107
72
  };
108
73
  exports.insertMetricsToDb = insertMetricsToDb;
109
74
  const startMetrics = (req, res) => {
110
- _telemetryRegistry.inMemoryDbMetricExporter.enable();
111
- res.send('Metrics collection started');
75
+ telemetryRegistry_js_1.inMemoryDbMetricExporter.enable();
76
+ res.send('Metrics collection started');
112
77
  };
113
78
  exports.startMetrics = startMetrics;
114
79
  const stopMetrics = (req, res) => {
115
- _telemetryRegistry.inMemoryDbMetricExporter.disable();
116
- res.send('Metrics collection stopped');
80
+ telemetryRegistry_js_1.inMemoryDbMetricExporter.disable();
81
+ res.send('Metrics collection stopped');
117
82
  };
118
83
  exports.stopMetrics = stopMetrics;
119
84
  const statusMetrics = (req, res) => {
120
- const isRunning = _telemetryRegistry.inMemoryDbMetricExporter.isEnabled() || false;
121
- res.send({
122
- active: isRunning
123
- });
85
+ const isRunning = telemetryRegistry_js_1.inMemoryDbMetricExporter.isEnabled() || false;
86
+ res.send({ active: isRunning });
124
87
  };
125
88
  exports.statusMetrics = statusMetrics;
126
89
  const setMetricRetentionTime = (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.inMemoryDbMetricExporter.retentionTimeInSeconds = retentionTimeInSeconds;
135
- res.send({
136
- message: `Retention time set to ${retentionTimeInSeconds} seconds.`
137
- });
90
+ const retentionTimeInSeconds = (req.body || {}).retentionTimeInSeconds;
91
+ if (typeof retentionTimeInSeconds !== 'number' || retentionTimeInSeconds <= 0) {
92
+ res.status(400).send({ error: 'Invalid retention time. Must be a positive number.' });
93
+ return;
94
+ }
95
+ telemetryRegistry_js_1.inMemoryDbMetricExporter.retentionTimeInSeconds = retentionTimeInSeconds;
96
+ res.send({ message: `Retention time set to ${retentionTimeInSeconds} seconds.` });
138
97
  };
139
98
  exports.setMetricRetentionTime = setMetricRetentionTime;
140
99
  const getMetricRetentionTime = (req, res) => {
141
- const retentionTimeInSeconds = _telemetryRegistry.inMemoryDbMetricExporter.retentionTimeInSeconds || 0;
142
- res.send({
143
- retentionTimeInSeconds: retentionTimeInSeconds
144
- });
100
+ const retentionTimeInSeconds = telemetryRegistry_js_1.inMemoryDbMetricExporter.retentionTimeInSeconds || 0;
101
+ res.send({ retentionTimeInSeconds: retentionTimeInSeconds });
102
+ };
103
+ exports.getMetricRetentionTime = getMetricRetentionTime;
104
+ /**
105
+ * Find metrics by scope+metric queries with filters (POST /metrics/find or GET /metrics)
106
+ * All parameters are optional:
107
+ * - If scopeMetrics is not provided or empty, returns all metrics
108
+ * - If startTime/endTime not provided, returns all available data
109
+ * - format can be 'raw' (default) or 'otel'
110
+ */
111
+ const findMetrics = async (req, res) => {
112
+ try {
113
+ const { scopeMetrics, from, to, format } = req.body || {};
114
+ // Validate scopeMetrics structure if provided
115
+ if (scopeMetrics && Array.isArray(scopeMetrics)) {
116
+ for (const query of scopeMetrics) {
117
+ if (!query.scope || !query.scope.name || !query.descriptor || !query.descriptor.name) {
118
+ res.status(400).json({
119
+ error: 'Each query must have scope.name and descriptor.name defined'
120
+ });
121
+ return;
122
+ }
123
+ }
124
+ }
125
+ // Execute query
126
+ const response = telemetryRegistry_js_1.inMemoryDbMetricExporter.find({
127
+ scopeMetrics: scopeMetrics && scopeMetrics.length > 0 ? scopeMetrics : undefined,
128
+ from,
129
+ to,
130
+ format: format || 'raw'
131
+ });
132
+ res.json({
133
+ format: format || 'raw',
134
+ scopeMetricsCount: response.results.length,
135
+ scopeMetrics: response.results,
136
+ });
137
+ }
138
+ catch (err) {
139
+ console.error(err);
140
+ res.status(500).json({ error: 'Failed to find metrics' });
141
+ }
142
+ };
143
+ exports.findMetrics = findMetrics;
144
+ /**
145
+ * Check data consistency between rawDataDB and queried data
146
+ * Compares raw exports with findMetrics(format=otel) without filters
147
+ */
148
+ const checkMetricsConsistency = async (req, res) => {
149
+ try {
150
+ // Get raw exported data
151
+ const rawData = telemetryRegistry_js_1.inMemoryDbMetricExporter.rawDataDB;
152
+ // Query all data with OTEL format
153
+ const response = telemetryRegistry_js_1.inMemoryDbMetricExporter.find({
154
+ format: 'otel'
155
+ });
156
+ const queriedData = response.results;
157
+ // Compare counts
158
+ const statusCheck = rawData.length === queriedData.length;
159
+ res.json({
160
+ statusCheck,
161
+ raw: rawData,
162
+ queried: queriedData
163
+ });
164
+ }
165
+ catch (err) {
166
+ console.error(err);
167
+ res.status(500).json({ error: 'Failed to check metrics consistency' });
168
+ }
169
+ };
170
+ exports.checkMetricsConsistency = checkMetricsConsistency;
171
+ const exportMetrics = (req, res) => {
172
+ try {
173
+ const ndjsonData = telemetryRegistry_js_1.inMemoryDbMetricExporter.exportToNDJSON();
174
+ const timestamp = new Date().toISOString().slice(0, 19).replace(/[-T:]/g, '');
175
+ res.setHeader('Content-Type', 'application/x-ndjson');
176
+ res.setHeader('Content-Disposition', `attachment; filename="metrics-${timestamp}.ndjson"`);
177
+ res.setHeader('Transfer-Encoding', 'chunked');
178
+ res.write(ndjsonData);
179
+ res.end();
180
+ }
181
+ catch (err) {
182
+ console.error('Failed to export metrics:', err);
183
+ res.status(500).send({ error: 'Failed to export metrics', details: err.message });
184
+ }
185
+ };
186
+ exports.exportMetrics = exportMetrics;
187
+ const importMetrics = async (req, res) => {
188
+ const resetData = req.query.reset === 'true';
189
+ const format = (req.query.format || 'raw');
190
+ try {
191
+ const ndjsonContent = req.body;
192
+ // Check if this is an exported NDJSON with headers (from our export function)
193
+ const firstLine = ndjsonContent.split('\n')[0];
194
+ let isExportedFormat = false;
195
+ try {
196
+ const firstObj = JSON.parse(firstLine);
197
+ isExportedFormat = firstObj.type === 'header';
198
+ }
199
+ catch {
200
+ // Not a valid JSON line, continue with normal parsing
201
+ }
202
+ let message = '';
203
+ if (resetData) {
204
+ telemetryRegistry_js_1.inMemoryDbMetricExporter.reset();
205
+ message += 'Metrics Database reset. ';
206
+ }
207
+ // If it's an exported format with headers/metadata, use direct NDJSON import
208
+ if (isExportedFormat) {
209
+ telemetryRegistry_js_1.inMemoryDbMetricExporter.importFromNDJSON(ndjsonContent);
210
+ message += `Imported metrics from exported NDJSON format.`;
211
+ res.send({ message, format: 'exported-ndjson' });
212
+ }
213
+ else {
214
+ // Otherwise parse as raw metrics (queryresults or OTEL format)
215
+ const metricsArray = parseImportData(ndjsonContent);
216
+ if (metricsArray.length === 0) {
217
+ res.status(400).send({ error: 'No valid metrics found in import data' });
218
+ return;
219
+ }
220
+ // Use the same insert logic as insertMetricsToDb, respecting raw vs otel format
221
+ if (format === 'otel') {
222
+ telemetryRegistry_js_1.inMemoryDbMetricExporter.insertOtel(metricsArray);
223
+ }
224
+ else {
225
+ telemetryRegistry_js_1.inMemoryDbMetricExporter.insertRaw(metricsArray);
226
+ }
227
+ message += `Imported ${metricsArray.length} metrics (format: ${format}).`;
228
+ res.send({ message, ImportedMetricsCount: metricsArray.length, format });
229
+ }
230
+ }
231
+ catch (err) {
232
+ console.error('Import failed:', err);
233
+ res.status(400).send({ error: 'Failed to import metrics', details: err.message });
234
+ }
145
235
  };
146
- exports.getMetricRetentionTime = getMetricRetentionTime;
236
+ exports.importMetrics = importMetrics;
@@ -1,24 +1,27 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.getMetricsRoutes = exports.default = void 0;
7
- var _express = require("express");
8
- var _metricsController = require("./metricsController.cjs");
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getMetricsRoutes = void 0;
4
+ const express_1 = require("express");
5
+ const metricsController_js_1 = require("./metricsController.cjs");
9
6
  const getMetricsRoutes = () => {
10
- const router = (0, _express.Router)();
11
- // Metrics Control
12
- router.post('/start', _metricsController.startMetrics);
13
- router.post('/stop', _metricsController.stopMetrics);
14
- router.get('/status', _metricsController.statusMetrics);
15
- router.post('/reset', _metricsController.resetMetrics);
16
- router.post('/retention-time', _metricsController.setMetricRetentionTime);
17
- router.get('/retention-time', _metricsController.getMetricRetentionTime);
18
- router.get('/', _metricsController.listMetrics);
19
- router.post('/', _metricsController.insertMetricsToDb);
20
- router.post('/find', _metricsController.findMetrics);
21
- return router;
7
+ const router = (0, express_1.Router)();
8
+ // Metrics Control
9
+ router.post('/start', metricsController_js_1.startMetrics);
10
+ router.post('/stop', metricsController_js_1.stopMetrics);
11
+ router.get('/status', metricsController_js_1.statusMetrics);
12
+ router.post('/reset', metricsController_js_1.resetMetrics);
13
+ router.post('/retention-time', metricsController_js_1.setMetricRetentionTime);
14
+ router.get('/retention-time', metricsController_js_1.getMetricRetentionTime);
15
+ // Export/Import
16
+ router.get('/export', metricsController_js_1.exportMetrics);
17
+ // Use text middleware for import to handle NDJSON format
18
+ router.post('/import', (0, express_1.text)({ type: 'application/x-ndjson', limit: '500mb' }), metricsController_js_1.importMetrics);
19
+ // Query endpoints
20
+ router.post('/find', metricsController_js_1.findMetrics);
21
+ router.get('/stats', metricsController_js_1.getMetricsStats);
22
+ router.get('/', metricsController_js_1.findMetrics);
23
+ router.post('/', metricsController_js_1.insertMetricsToDb);
24
+ return router;
22
25
  };
23
26
  exports.getMetricsRoutes = getMetricsRoutes;
24
- var _default = exports.default = getMetricsRoutes;
27
+ exports.default = exports.getMetricsRoutes;