@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,33 +1,28 @@
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.getAuthMiddleware = getAuthMiddleware;
7
- var _jsonwebtoken = _interopRequireDefault(require("jsonwebtoken"));
8
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
7
+ const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
9
8
  function getAuthMiddleware(oasTlmConfig) {
10
- return function authMiddleware(req, res, next) {
11
- if (!oasTlmConfig.auth.enabled) {
12
- return next();
13
- }
14
- const token = req.cookies["oas-tlm-access-token"];
15
- if (!token) {
16
- res.status(401).json({
17
- valid: false,
18
- message: "No access token"
19
- });
20
- return;
21
- }
22
- try {
23
- const payload = _jsonwebtoken.default.verify(token, oasTlmConfig.auth.jwtSecret);
24
- if (payload.type !== "access") throw new Error("Invalid token type");
25
- return next();
26
- } catch {
27
- res.status(401).json({
28
- valid: false,
29
- message: "Invalid access token"
30
- });
31
- }
32
- };
33
- }
9
+ return function authMiddleware(req, res, next) {
10
+ if (!oasTlmConfig.auth.enabled) {
11
+ return next();
12
+ }
13
+ const token = req.cookies["oas-tlm-access-token"];
14
+ if (!token) {
15
+ res.status(401).json({ valid: false, message: "No access token" });
16
+ return;
17
+ }
18
+ try {
19
+ const payload = jsonwebtoken_1.default.verify(token, oasTlmConfig.auth.jwtSecret);
20
+ if (payload.type !== "access")
21
+ throw new Error("Invalid token type");
22
+ return next();
23
+ }
24
+ catch {
25
+ res.status(401).json({ valid: false, message: "Invalid access token" });
26
+ }
27
+ };
28
+ }
@@ -1,17 +1,14 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
2
+ Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.getAuthRoutes = void 0;
7
- var _express = require("express");
8
- var _authController = require("./authController.cjs");
9
- const getAuthRoutes = oasTlmConfig => {
10
- const router = (0, _express.Router)();
11
- router.post('/login', (0, _authController.getLogin)(oasTlmConfig));
12
- router.post('/refresh', (0, _authController.getRefresh)(oasTlmConfig));
13
- router.post('/logout', (0, _authController.getLogout)(oasTlmConfig));
14
- router.get('/enabled', (0, _authController.getAuthEnabled)(oasTlmConfig));
15
- return router;
4
+ const express_1 = require("express");
5
+ const authController_js_1 = require("./authController.cjs");
6
+ const getAuthRoutes = (oasTlmConfig) => {
7
+ const router = (0, express_1.Router)();
8
+ router.post('/login', (0, authController_js_1.getLogin)(oasTlmConfig));
9
+ router.post('/refresh', (0, authController_js_1.getRefresh)(oasTlmConfig));
10
+ router.post('/logout', (0, authController_js_1.getLogout)(oasTlmConfig));
11
+ router.get('/enabled', (0, authController_js_1.getAuthEnabled)(oasTlmConfig));
12
+ return router;
16
13
  };
17
- exports.getAuthRoutes = getAuthRoutes;
14
+ exports.getAuthRoutes = getAuthRoutes;
@@ -1,142 +1,197 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.stopLogs = exports.statusLogs = exports.startLogs = exports.setLogRetentionTime = exports.resetLogs = exports.insertLogsToDb = exports.getLogRetentionTime = exports.findLogs = void 0;
7
- var _telemetryRegistry = require("../telemetry/telemetryRegistry.cjs");
8
- var _logger = _interopRequireDefault(require("../utils/logger.cjs"));
9
- var _regexUtils = require("../utils/regexUtils.cjs");
10
- const _excluded = ["_id"];
11
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
12
- 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; }
13
- 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; }
14
- const findLogs = async (req, res) => {
15
- const body = req.body || {};
16
- const messageSearch = body.textSearch || null;
17
- const findQuery = body.query || {};
18
- const limit = parseInt(body.limit) || 50;
19
- const sortOrder = body.sort || null;
20
- _logger.default.debug(`findLogs called with query: ${JSON.stringify(findQuery)} and search: ${messageSearch}`, {
21
- depth: 3
22
- });
23
- let processedQuery;
24
- try {
25
- processedQuery = (0, _regexUtils.convertRegexRecursively)(findQuery);
26
- } catch (error) {
27
- _logger.default.error(error.message);
28
- res.status(400).send({
29
- error: error.message
30
- });
31
- return; // Exit if invalid regex was encountered
32
- }
33
- try {
34
- // Use findConfig object
35
- const findConfig = {
36
- query: processedQuery,
37
- messageSearch,
38
- limit,
39
- sortOrder
40
- };
41
- const docs = await _telemetryRegistry.inMemoryDbLogExporter.find(findConfig);
42
- res.send({
43
- items: docs
44
- });
45
- } catch (err) {
46
- _logger.default.error(err);
47
- res.status(500).send({
48
- error: 'Failed to find logs',
49
- details: err.message
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
+ exports.exportLogs = exports.getLogRetentionTime = exports.setLogRetentionTime = exports.statusLogs = exports.stopLogs = exports.startLogs = exports.importLogs = exports.insertLogsToDb = exports.resetLogs = exports.findLogs = void 0;
7
+ const telemetryRegistry_js_1 = require("../telemetry/telemetryRegistry.cjs");
8
+ const logger_js_1 = __importDefault(require("../utils/logger.cjs"));
9
+ const regexUtils_js_1 = require("../utils/regexUtils.cjs");
10
+ /**
11
+ * Parse NDJSON import data
12
+ * Each line must be a valid JSON object
13
+ * @param body - Request body (raw string)
14
+ * @returns Array of log objects
15
+ */
16
+ function parseImportData(body) {
17
+ if (typeof body !== 'string') {
18
+ throw new Error('Import must be NDJSON format (plain text with one JSON object per line)');
19
+ }
20
+ const lines = body.split('\n').filter((line) => line.trim());
21
+ return lines.map((line, index) => {
22
+ try {
23
+ return JSON.parse(line);
24
+ }
25
+ catch (e) {
26
+ logger_js_1.default.error(`Failed to parse NDJSON line ${index + 1}: ${line}`);
27
+ throw new Error(`Invalid JSON on line ${index + 1}`);
28
+ }
50
29
  });
51
- }
30
+ }
31
+ const findLogs = async (req, res) => {
32
+ const body = req.body || {};
33
+ const messageSearch = body.textSearch || null;
34
+ const findQuery = body.query || {};
35
+ const limit = parseInt(body.limit) || 50;
36
+ const sortOrder = body.sort || null;
37
+ logger_js_1.default.debug(`findLogs called with query: ${JSON.stringify(findQuery)} and search: ${messageSearch}`, { depth: 3 });
38
+ let processedQuery;
39
+ try {
40
+ processedQuery = (0, regexUtils_js_1.convertRegexRecursively)(findQuery);
41
+ }
42
+ catch (error) {
43
+ logger_js_1.default.error(error.message);
44
+ res.status(400).send({ error: error.message });
45
+ return; // Exit if invalid regex was encountered
46
+ }
47
+ try {
48
+ // Use findConfig object
49
+ const findConfig = {
50
+ query: processedQuery,
51
+ messageSearch,
52
+ limit,
53
+ sortOrder
54
+ };
55
+ const docs = await telemetryRegistry_js_1.inMemoryDbLogExporter.find(findConfig);
56
+ res.send({
57
+ logsCount: docs.length,
58
+ logs: docs,
59
+ });
60
+ }
61
+ catch (err) {
62
+ logger_js_1.default.error(err);
63
+ res.status(500).send({ error: 'Failed to find logs', details: err.message });
64
+ }
52
65
  };
53
66
  exports.findLogs = findLogs;
54
67
  const resetLogs = (req, res) => {
55
- _telemetryRegistry.inMemoryDbLogExporter.reset();
56
- res.send('Logs reset');
68
+ telemetryRegistry_js_1.inMemoryDbLogExporter.reset();
69
+ res.send('Logs reset');
57
70
  };
58
71
  exports.resetLogs = resetLogs;
59
72
  const insertLogsToDb = async (req, res) => {
60
- const jsonContent = req.body.logs;
61
- const resetData = req.query.reset === 'true';
62
- if (!Array.isArray(jsonContent)) {
63
- res.status(400).send({
64
- error: 'Invalid data format.'
65
- });
66
- return;
67
- }
68
- const cleanedLogs = jsonContent.map(log => {
69
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
70
- const {
71
- _id
72
- } = log,
73
- rest = _objectWithoutProperties(log, _excluded); // Remove _id if it exists
74
- return rest; // Return the cleaned log object
75
- });
76
- try {
77
- let message = '';
78
- if (resetData) {
79
- _telemetryRegistry.inMemoryDbLogExporter.reset();
80
- message += 'Logs Database reset. ';
73
+ const jsonContent = (req.body || {}).logs;
74
+ const resetData = req.query.reset === 'true';
75
+ if (!Array.isArray(jsonContent)) {
76
+ res.status(400).send({ error: 'Invalid data format.' });
77
+ return;
81
78
  }
82
- await new Promise((resolve, reject) => {
83
- _telemetryRegistry.inMemoryDbLogExporter.insert(cleanedLogs, (err, newDocs) => {
84
- if (err) {
85
- _logger.default.error('Error inserting logs:', err);
86
- return reject(err);
87
- }
88
- resolve(newDocs);
89
- });
90
- });
91
- message += `Inserted ${cleanedLogs.length} logs.`;
92
- res.send({
93
- message,
94
- InsertedLogsCount: cleanedLogs.length
79
+ const cleanedLogs = jsonContent.map((log) => {
80
+ const { _id, ...rest } = log; // Remove _id if it exists
81
+ return rest; // Return the cleaned log object
95
82
  });
96
- } catch (err) {
97
- _logger.default.error(err);
98
- res.status(500).send({
99
- error: 'Failed to reset and insert data',
100
- details: err.message
101
- });
102
- }
83
+ try {
84
+ let message = '';
85
+ if (resetData) {
86
+ telemetryRegistry_js_1.inMemoryDbLogExporter.reset();
87
+ message += 'Logs Database reset. ';
88
+ }
89
+ await new Promise((resolve, reject) => {
90
+ telemetryRegistry_js_1.inMemoryDbLogExporter.insert(cleanedLogs, (err, newDocs) => {
91
+ if (err) {
92
+ logger_js_1.default.error('Error inserting logs:', err);
93
+ return reject(err);
94
+ }
95
+ resolve(newDocs);
96
+ });
97
+ });
98
+ message += `Inserted ${cleanedLogs.length} logs.`;
99
+ res.send({ message, InsertedLogsCount: cleanedLogs.length });
100
+ }
101
+ catch (err) {
102
+ logger_js_1.default.error(err);
103
+ res.status(500).send({ error: 'Failed to reset and insert data', details: err.message });
104
+ }
103
105
  };
104
106
  exports.insertLogsToDb = insertLogsToDb;
107
+ const importLogs = async (req, res) => {
108
+ const resetData = req.query.reset === 'true';
109
+ try {
110
+ // Parse NDJSON format
111
+ const logs = parseImportData(req.body);
112
+ if (logs.length === 0) {
113
+ res.status(400).send({ error: 'No valid logs found in import data' });
114
+ return;
115
+ }
116
+ const cleanedLogs = logs.map((log) => {
117
+ const { _id, ...rest } = log; // Remove _id if it exists
118
+ return rest;
119
+ });
120
+ let message = '';
121
+ if (resetData) {
122
+ telemetryRegistry_js_1.inMemoryDbLogExporter.reset();
123
+ message += 'Logs Database reset. ';
124
+ }
125
+ await new Promise((resolve, reject) => {
126
+ telemetryRegistry_js_1.inMemoryDbLogExporter.insert(cleanedLogs, (err, newDocs) => {
127
+ if (err) {
128
+ logger_js_1.default.error('Error importing logs:', err);
129
+ return reject(err);
130
+ }
131
+ resolve(newDocs);
132
+ });
133
+ });
134
+ message += `Imported ${cleanedLogs.length} logs.`;
135
+ res.send({ message, ImportedLogsCount: cleanedLogs.length });
136
+ }
137
+ catch (err) {
138
+ logger_js_1.default.error('Import failed:', err);
139
+ res.status(400).send({ error: 'Failed to import logs', details: err.message });
140
+ }
141
+ };
142
+ exports.importLogs = importLogs;
105
143
  const startLogs = (req, res) => {
106
- _telemetryRegistry.inMemoryDbLogExporter.enable();
107
- res.send('Log collection started');
144
+ telemetryRegistry_js_1.inMemoryDbLogExporter.enable();
145
+ res.send('Log collection started');
108
146
  };
109
147
  exports.startLogs = startLogs;
110
148
  const stopLogs = (req, res) => {
111
- _telemetryRegistry.inMemoryDbLogExporter.disable();
112
- res.send('Log collection stopped');
149
+ telemetryRegistry_js_1.inMemoryDbLogExporter.disable();
150
+ res.send('Log collection stopped');
113
151
  };
114
152
  exports.stopLogs = stopLogs;
115
153
  const statusLogs = (req, res) => {
116
- const isRunning = _telemetryRegistry.inMemoryDbLogExporter.isEnabled() || false;
117
- res.send({
118
- active: isRunning
119
- });
154
+ const isRunning = telemetryRegistry_js_1.inMemoryDbLogExporter.isEnabled() || false;
155
+ res.send({ active: isRunning });
120
156
  };
121
157
  exports.statusLogs = statusLogs;
122
158
  const setLogRetentionTime = (req, res) => {
123
- const retentionTimeInSeconds = req.body.retentionTimeInSeconds;
124
- if (typeof retentionTimeInSeconds !== 'number' || retentionTimeInSeconds <= 0) {
125
- res.status(400).send({
126
- error: 'Invalid retention time. Must be a positive number.'
127
- });
128
- return;
129
- }
130
- _telemetryRegistry.inMemoryDbLogExporter.retentionTimeInSeconds = retentionTimeInSeconds;
131
- res.send({
132
- message: `Retention time set to ${retentionTimeInSeconds} seconds.`
133
- });
159
+ const retentionTimeInSeconds = (req.body || {}).retentionTimeInSeconds;
160
+ if (typeof retentionTimeInSeconds !== 'number' || retentionTimeInSeconds <= 0) {
161
+ res.status(400).send({ error: 'Invalid retention time. Must be a positive number.' });
162
+ return;
163
+ }
164
+ telemetryRegistry_js_1.inMemoryDbLogExporter.retentionTimeInSeconds = retentionTimeInSeconds;
165
+ res.send({ message: `Retention time set to ${retentionTimeInSeconds} seconds.` });
134
166
  };
135
167
  exports.setLogRetentionTime = setLogRetentionTime;
136
168
  const getLogRetentionTime = (req, res) => {
137
- const retentionTimeInSeconds = _telemetryRegistry.inMemoryDbLogExporter.retentionTimeInSeconds || 0;
138
- res.send({
139
- retentionTimeInSeconds: retentionTimeInSeconds
140
- });
169
+ const retentionTimeInSeconds = telemetryRegistry_js_1.inMemoryDbLogExporter.retentionTimeInSeconds || 0;
170
+ res.send({ retentionTimeInSeconds: retentionTimeInSeconds });
171
+ };
172
+ exports.getLogRetentionTime = getLogRetentionTime;
173
+ const exportLogs = async (req, res) => {
174
+ try {
175
+ // Get ALL logs without practical limit
176
+ const findConfig = {
177
+ query: {},
178
+ messageSearch: null,
179
+ sortOrder: { timestamp: -1 }
180
+ };
181
+ const docs = await telemetryRegistry_js_1.inMemoryDbLogExporter.find(findConfig);
182
+ const timestamp = new Date().toISOString().slice(0, 19).replace(/[-T:]/g, '');
183
+ res.setHeader('Content-Type', 'application/x-ndjson');
184
+ res.setHeader('Content-Disposition', `attachment; filename="logs-${timestamp}.ndjson"`);
185
+ res.setHeader('Transfer-Encoding', 'chunked');
186
+ // Stream as NDJSON (one JSON object per line)
187
+ docs.forEach(doc => {
188
+ res.write(JSON.stringify(doc) + '\n');
189
+ });
190
+ res.end();
191
+ }
192
+ catch (err) {
193
+ logger_js_1.default.error('Failed to export logs:', err);
194
+ res.status(500).send({ error: 'Failed to export logs', details: err.message });
195
+ }
141
196
  };
142
- exports.getLogRetentionTime = getLogRetentionTime;
197
+ exports.exportLogs = exportLogs;
@@ -1,24 +1,24 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.getLogRoutes = exports.default = void 0;
7
- var _express = require("express");
8
- var _logController = require("./logController.cjs");
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getLogRoutes = void 0;
4
+ const express_1 = require("express");
5
+ const logController_js_1 = require("./logController.cjs");
9
6
  const getLogRoutes = () => {
10
- const router = (0, _express.Router)();
11
- // Logs Control
12
- router.post('/start', _logController.startLogs);
13
- router.post('/stop', _logController.stopLogs);
14
- router.get('/status', _logController.statusLogs);
15
- router.post('/reset', _logController.resetLogs);
16
- router.post('/retention-time', _logController.setLogRetentionTime);
17
- router.get('/retention-time', _logController.getLogRetentionTime);
18
- router.get('/', _logController.findLogs);
19
- router.post('/', _logController.insertLogsToDb);
20
- router.post('/find', _logController.findLogs);
21
- return router;
7
+ const router = (0, express_1.Router)();
8
+ // Logs Control
9
+ router.post('/start', logController_js_1.startLogs);
10
+ router.post('/stop', logController_js_1.stopLogs);
11
+ router.get('/status', logController_js_1.statusLogs);
12
+ router.post('/reset', logController_js_1.resetLogs);
13
+ router.post('/retention-time', logController_js_1.setLogRetentionTime);
14
+ router.get('/retention-time', logController_js_1.getLogRetentionTime);
15
+ router.get('/export', logController_js_1.exportLogs);
16
+ // Use text middleware for import to handle NDJSON format
17
+ router.post('/import', (0, express_1.text)({ type: 'application/x-ndjson', limit: '500mb' }), logController_js_1.importLogs);
18
+ router.get('/', logController_js_1.findLogs);
19
+ router.post('/', logController_js_1.insertLogsToDb);
20
+ router.post('/find', logController_js_1.findLogs);
21
+ return router;
22
22
  };
23
23
  exports.getLogRoutes = getLogRoutes;
24
- var _default = exports.default = getLogRoutes;
24
+ exports.default = exports.getLogRoutes;