@oas-tools/oas-telemetry 0.7.0-alpha.5 → 0.7.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 (106) hide show
  1. package/.env.example +2 -0
  2. package/README.md +35 -17
  3. package/dist/cjs/config/bootConfig.cjs +3 -1
  4. package/dist/cjs/docs/openapi.yaml +1399 -0
  5. package/dist/cjs/routesManager.cjs +1 -1
  6. package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.cjs +43 -13
  7. package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.cjs +10 -2
  8. package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.cjs +21 -16
  9. package/dist/cjs/telemetry/initializeTelemetry.cjs +39 -15
  10. package/dist/cjs/telemetry/telemetryConfigurator.cjs +6 -9
  11. package/dist/cjs/telemetry/telemetryRegistry.cjs +11 -8
  12. package/dist/cjs/tlm-ai/agent.cjs +54 -84
  13. package/dist/cjs/tlm-ai/aiController.cjs +69 -47
  14. package/dist/cjs/tlm-ai/aiRoutes.cjs +10 -3
  15. package/dist/cjs/tlm-ai/aiService.cjs +109 -0
  16. package/dist/cjs/tlm-ai/tools.cjs +30 -268
  17. package/dist/cjs/tlm-auth/authController.cjs +9 -9
  18. package/dist/cjs/tlm-auth/authMiddleware.cjs +1 -1
  19. package/dist/cjs/tlm-log/logController.cjs +30 -36
  20. package/dist/cjs/tlm-log/logRoutes.cjs +3 -2
  21. package/dist/cjs/tlm-metric/metricsController.cjs +15 -8
  22. package/dist/cjs/tlm-metric/metricsRoutes.cjs +2 -1
  23. package/dist/cjs/tlm-plugin/pluginController.cjs +11 -1
  24. package/dist/cjs/tlm-plugin/pluginProcess.cjs +4 -2
  25. package/dist/cjs/tlm-plugin/pluginService.cjs +3 -0
  26. package/dist/cjs/tlm-trace/traceController.cjs +16 -9
  27. package/dist/cjs/tlm-trace/traceRoutes.cjs +2 -1
  28. package/dist/cjs/tlm-util/utilController.cjs +23 -2
  29. package/dist/cjs/tlm-util/utilRoutes.cjs +44 -5
  30. package/dist/cjs/utils/logger.cjs +35 -13
  31. package/dist/esm/config/bootConfig.js +2 -0
  32. package/dist/esm/docs/openapi.yaml +1399 -0
  33. package/dist/esm/routesManager.js +1 -1
  34. package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.js +32 -11
  35. package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.js +10 -2
  36. package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.js +20 -13
  37. package/dist/esm/telemetry/initializeTelemetry.js +22 -14
  38. package/dist/esm/telemetry/telemetryConfigurator.js +7 -10
  39. package/dist/esm/telemetry/telemetryRegistry.js +10 -7
  40. package/dist/esm/tlm-ai/agent.js +37 -78
  41. package/dist/esm/tlm-ai/aiController.js +56 -39
  42. package/dist/esm/tlm-ai/aiRoutes.js +11 -4
  43. package/dist/esm/tlm-ai/aiService.js +94 -0
  44. package/dist/esm/tlm-ai/tools.js +29 -255
  45. package/dist/esm/tlm-auth/authController.js +8 -8
  46. package/dist/esm/tlm-auth/authMiddleware.js +1 -1
  47. package/dist/esm/tlm-log/logController.js +26 -28
  48. package/dist/esm/tlm-log/logRoutes.js +4 -3
  49. package/dist/esm/tlm-metric/metricsController.js +10 -6
  50. package/dist/esm/tlm-metric/metricsRoutes.js +3 -2
  51. package/dist/esm/tlm-plugin/pluginController.js +2 -1
  52. package/dist/esm/tlm-plugin/pluginProcess.js +4 -2
  53. package/dist/esm/tlm-plugin/pluginService.js +4 -0
  54. package/dist/esm/tlm-trace/traceController.js +11 -7
  55. package/dist/esm/tlm-trace/traceRoutes.js +3 -2
  56. package/dist/esm/tlm-util/utilController.js +22 -0
  57. package/dist/esm/tlm-util/utilRoutes.js +40 -5
  58. package/dist/esm/utils/logger.js +35 -12
  59. package/dist/types/config/bootConfig.d.ts +1 -0
  60. package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.d.ts +7 -1
  61. package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.d.ts +1 -0
  62. package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.d.ts +1 -0
  63. package/dist/types/telemetry/telemetryRegistry.d.ts +22 -6
  64. package/dist/types/tlm-ai/agent.d.ts +2 -2
  65. package/dist/types/tlm-ai/aiController.d.ts +5 -4
  66. package/dist/types/tlm-ai/aiRoutes.d.ts +1 -1
  67. package/dist/types/tlm-ai/aiService.d.ts +38 -0
  68. package/dist/types/tlm-ai/tools.d.ts +5 -14
  69. package/dist/types/tlm-log/logController.d.ts +2 -2
  70. package/dist/types/tlm-metric/metricsController.d.ts +2 -1
  71. package/dist/types/tlm-plugin/pluginService.d.ts +2 -0
  72. package/dist/types/tlm-trace/traceController.d.ts +2 -1
  73. package/dist/types/tlm-util/utilController.d.ts +1 -0
  74. package/dist/types/utils/logger.d.ts +5 -5
  75. package/dist/ui/assets/ApiDocsPage-C_VVPPHa.js +16 -0
  76. package/dist/ui/assets/CollapsibleCard-B3KR_8mL.js +1 -0
  77. package/dist/ui/assets/DevToolsPage-OyZcDcmw.js +1 -0
  78. package/dist/ui/assets/LandingPage-CppFBA6K.js +6 -0
  79. package/dist/ui/assets/LogsPage-9Fq8GArS.js +26 -0
  80. package/dist/ui/assets/NotFoundPage-B3quk3P1.js +1 -0
  81. package/dist/ui/assets/PluginCreatePage-X_aCH4t4.js +50 -0
  82. package/dist/ui/assets/PluginPage-DMDSihrZ.js +27 -0
  83. package/dist/ui/assets/alert-jQ9HCPIf.js +1133 -0
  84. package/dist/ui/assets/badge-CNq0-mH5.js +1 -0
  85. package/dist/ui/assets/card-DFAwwhN3.js +1 -0
  86. package/dist/ui/assets/chevron-down-CPsvsmqj.js +6 -0
  87. package/dist/ui/assets/chevron-up-Df9jMo1X.js +6 -0
  88. package/dist/ui/assets/circle-alert-DOPQPvU8.js +6 -0
  89. package/dist/ui/assets/index-BkD6DijD.js +15 -0
  90. package/dist/ui/assets/index-CERGVYZK.js +292 -0
  91. package/dist/ui/assets/index-CSIPf9qw.css +1 -0
  92. package/dist/ui/assets/input-Dzvg_ZEZ.js +1 -0
  93. package/dist/ui/assets/label-DuVnkZ4q.js +1 -0
  94. package/dist/ui/assets/loader-circle-CrvlRy5o.js +6 -0
  95. package/dist/ui/assets/loginPage-qa4V-B70.js +6 -0
  96. package/dist/ui/assets/select-DhS8YUtJ.js +1 -0
  97. package/dist/ui/assets/separator-isK4chBP.js +6 -0
  98. package/dist/ui/assets/severityOptions-O38dSOfk.js +11 -0
  99. package/dist/ui/assets/switch-Z3mImG9n.js +1 -0
  100. package/dist/ui/assets/tabs-_77MUUQe.js +16 -0
  101. package/dist/ui/assets/upload-C1LT4Gkb.js +16 -0
  102. package/dist/ui/assets/utilService-DNyqzwj0.js +1 -0
  103. package/dist/ui/index.html +2 -2
  104. package/package.json +17 -6
  105. package/dist/ui/assets/index-Bgd7fFFH.js +0 -1743
  106. package/dist/ui/assets/index-Cz3N1n1Q.css +0 -1
@@ -36,19 +36,19 @@ const getLogin = oasTlmConfig => (req, res) => {
36
36
  if (password === oasTlmConfig.auth.password) {
37
37
  const accessToken = generateAccessToken(oasTlmConfig.auth.jwtSecret, oasTlmConfig.auth.accessTokenMaxAge);
38
38
  const refreshToken = generateRefreshToken(oasTlmConfig.auth.jwtSecret, oasTlmConfig.auth.refreshTokenMaxAge);
39
- res.cookie("accessToken", accessToken, {
39
+ res.cookie("oas-tlm-access-token", accessToken, {
40
40
  maxAge: oasTlmConfig.auth.accessTokenMaxAge,
41
41
  httpOnly: true,
42
42
  secure: process.env.NODE_ENV === "production",
43
43
  sameSite: "lax",
44
44
  path: "/"
45
45
  });
46
- res.cookie("refreshToken", refreshToken, {
46
+ res.cookie("oas-tlm-refresh-token", refreshToken, {
47
47
  maxAge: oasTlmConfig.auth.refreshTokenMaxAge,
48
48
  httpOnly: true,
49
49
  secure: process.env.NODE_ENV === "production",
50
50
  sameSite: "lax",
51
- path: oasTlmConfig.general.baseUrl + "/auth/refresh" // <-- cambiado de "/auth/refresh" a oasTlmConfig.general.baseUrl + "/auth/refresh"
51
+ path: oasTlmConfig.general.baseUrl + "/auth/refresh"
52
52
  });
53
53
  res.status(200).json({
54
54
  valid: true,
@@ -77,12 +77,12 @@ const getLogout = oasTlmConfig => (req, res) => {
77
77
  });
78
78
  return;
79
79
  }
80
- res.clearCookie('accessToken', {
80
+ res.clearCookie('oas-tlm-access-token', {
81
81
  path: '/'
82
82
  });
83
- res.clearCookie('refreshToken', {
83
+ res.clearCookie('oas-tlm-refresh-token', {
84
84
  path: oasTlmConfig.general.baseUrl + '/auth/refresh'
85
- }); // <-- cambiado de "/auth/refresh" a oasTlmConfig.general.baseUrl + "/auth/refresh"
85
+ });
86
86
  res.status(200).json({
87
87
  valid: true,
88
88
  message: "Logged out"
@@ -97,7 +97,7 @@ const getRefresh = oasTlmConfig => (req, res) => {
97
97
  });
98
98
  return;
99
99
  }
100
- const refreshToken = req.cookies.refreshToken;
100
+ const refreshToken = req.cookies["oas-tlm-refresh-token"];
101
101
  if (!refreshToken) {
102
102
  res.status(401).json({
103
103
  valid: false,
@@ -109,7 +109,7 @@ const getRefresh = oasTlmConfig => (req, res) => {
109
109
  const payload = _jsonwebtoken.default.verify(refreshToken, oasTlmConfig.auth.jwtSecret);
110
110
  if (payload.type !== "refresh") throw new Error("Invalid token type");
111
111
  const accessToken = generateAccessToken(oasTlmConfig.auth.jwtSecret, oasTlmConfig.auth.accessTokenMaxAge);
112
- res.cookie("accessToken", accessToken, {
112
+ res.cookie("oas-tlm-access-token", accessToken, {
113
113
  maxAge: oasTlmConfig.auth.accessTokenMaxAge,
114
114
  httpOnly: true,
115
115
  secure: process.env.NODE_ENV === "production",
@@ -120,7 +120,7 @@ const getRefresh = oasTlmConfig => (req, res) => {
120
120
  valid: true,
121
121
  message: "Refreshed"
122
122
  });
123
- } catch (err) {
123
+ } catch {
124
124
  res.status(401).json({
125
125
  valid: false,
126
126
  message: "Invalid refresh token"
@@ -11,7 +11,7 @@ function getAuthMiddleware(oasTlmConfig) {
11
11
  if (!oasTlmConfig.auth.enabled) {
12
12
  return next();
13
13
  }
14
- const token = req.cookies.accessToken;
14
+ const token = req.cookies["oas-tlm-access-token"];
15
15
  if (!token) {
16
16
  res.status(401).json({
17
17
  valid: false,
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.stopLogs = exports.statusLogs = exports.startLogs = exports.setRetentionTimeLogs = exports.resetLogs = exports.listLogs = exports.insertLogsToDb = exports.findLogs = void 0;
6
+ exports.stopLogs = exports.statusLogs = exports.startLogs = exports.setLogRetentionTime = exports.resetLogs = exports.insertLogsToDb = exports.getLogRetentionTime = exports.findLogs = void 0;
7
7
  var _telemetryRegistry = require("../telemetry/telemetryRegistry.cjs");
8
8
  var _logger = _interopRequireDefault(require("../utils/logger.cjs"));
9
9
  var _regexUtils = require("../utils/regexUtils.cjs");
@@ -11,26 +11,13 @@ const _excluded = ["_id"];
11
11
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
12
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
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 listLogs = async (req, res) => {
15
- try {
16
- const logs = _telemetryRegistry.inMemoryDbLogExporter.getFinishedLogs();
17
- res.send({
18
- logsCount: logs.length,
19
- logs: logs
20
- });
21
- } catch (err) {
22
- _logger.default.error(err);
23
- res.status(500).send({
24
- error: 'Failed to list log data'
25
- });
26
- }
27
- };
28
- exports.listLogs = listLogs;
29
14
  const findLogs = async (req, res) => {
30
- const body = req.body;
31
- const messageSearch = body?.textSearch || null; // Search term for MiniSearch
32
- const findQuery = body?.query || {}; // Query for NeDB
33
- _logger.default.debug(`findLogs called with query: ${JSON.stringify(findQuery)} and search ${messageSearch}`, {
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}`, {
34
21
  depth: 3
35
22
  });
36
23
  let processedQuery;
@@ -44,16 +31,16 @@ const findLogs = async (req, res) => {
44
31
  return; // Exit if invalid regex was encountered
45
32
  }
46
33
  try {
47
- const results = await new Promise((resolve, reject) => {
48
- _telemetryRegistry.inMemoryDbLogExporter.find(processedQuery, messageSearch, (err, docs) => {
49
- if (err) return reject(err);
50
- resolve(docs);
51
- });
52
- });
53
- const typedResults = results;
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);
54
42
  res.send({
55
- logsCount: typedResults.length,
56
- logs: typedResults
43
+ items: docs
57
44
  });
58
45
  } catch (err) {
59
46
  _logger.default.error(err);
@@ -74,7 +61,7 @@ const insertLogsToDb = async (req, res) => {
74
61
  const resetData = req.query.reset === 'true';
75
62
  if (!Array.isArray(jsonContent)) {
76
63
  res.status(400).send({
77
- error: 'Invalid data format. Expected an array of JSON objects.'
64
+ error: 'Invalid data format.'
78
65
  });
79
66
  return;
80
67
  }
@@ -132,17 +119,24 @@ const statusLogs = (req, res) => {
132
119
  });
133
120
  };
134
121
  exports.statusLogs = statusLogs;
135
- const setRetentionTimeLogs = (req, res) => {
136
- const retentionTime = req.body.retentionTime;
137
- if (typeof retentionTime !== 'number' || retentionTime <= 0) {
122
+ const setLogRetentionTime = (req, res) => {
123
+ const retentionTimeInSeconds = req.body.retentionTimeInSeconds;
124
+ if (typeof retentionTimeInSeconds !== 'number' || retentionTimeInSeconds <= 0) {
138
125
  res.status(400).send({
139
126
  error: 'Invalid retention time. Must be a positive number.'
140
127
  });
141
128
  return;
142
129
  }
143
- _telemetryRegistry.inMemoryDbLogExporter.retentionTimeInSeconds = retentionTime;
130
+ _telemetryRegistry.inMemoryDbLogExporter.retentionTimeInSeconds = retentionTimeInSeconds;
131
+ res.send({
132
+ message: `Retention time set to ${retentionTimeInSeconds} seconds.`
133
+ });
134
+ };
135
+ exports.setLogRetentionTime = setLogRetentionTime;
136
+ const getLogRetentionTime = (req, res) => {
137
+ const retentionTimeInSeconds = _telemetryRegistry.inMemoryDbLogExporter.retentionTimeInSeconds || 0;
144
138
  res.send({
145
- message: `Retention time set to ${retentionTime} seconds.`
139
+ retentionTimeInSeconds: retentionTimeInSeconds
146
140
  });
147
141
  };
148
- exports.setRetentionTimeLogs = setRetentionTimeLogs;
142
+ exports.getLogRetentionTime = getLogRetentionTime;
@@ -13,8 +13,9 @@ const getLogRoutes = () => {
13
13
  router.post('/stop', _logController.stopLogs);
14
14
  router.get('/status', _logController.statusLogs);
15
15
  router.post('/reset', _logController.resetLogs);
16
- router.post('/retention-time', _logController.setRetentionTimeLogs);
17
- router.get('/', _logController.listLogs);
16
+ router.post('/retention-time', _logController.setLogRetentionTime);
17
+ router.get('/retention-time', _logController.getLogRetentionTime);
18
+ router.get('/', _logController.findLogs);
18
19
  router.post('/', _logController.insertLogsToDb);
19
20
  router.post('/find', _logController.findLogs);
20
21
  return router;
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.stopMetrics = exports.statusMetrics = exports.startMetrics = exports.setRetentionTimeMetrics = exports.resetMetrics = exports.listMetrics = exports.insertMetricsToDb = exports.findMetrics = void 0;
6
+ exports.stopMetrics = exports.statusMetrics = exports.startMetrics = exports.setMetricRetentionTime = exports.resetMetrics = exports.listMetrics = exports.insertMetricsToDb = exports.getMetricRetentionTime = exports.findMetrics = void 0;
7
7
  var _telemetryRegistry = require("../telemetry/telemetryRegistry.cjs");
8
8
  var _regexUtils = require("../utils/regexUtils.cjs");
9
9
  const _excluded = ["_id"];
@@ -65,7 +65,7 @@ const insertMetricsToDb = async (req, res) => {
65
65
  const resetData = req.query.reset === 'true';
66
66
  if (!Array.isArray(jsonContent)) {
67
67
  res.status(400).send({
68
- error: 'Invalid data format. Expected an array of JSON objects.'
68
+ error: 'Invalid data format.'
69
69
  });
70
70
  return;
71
71
  }
@@ -123,17 +123,24 @@ const statusMetrics = (req, res) => {
123
123
  });
124
124
  };
125
125
  exports.statusMetrics = statusMetrics;
126
- const setRetentionTimeMetrics = (req, res) => {
127
- const retentionTime = req.body.retentionTime;
128
- if (typeof retentionTime !== 'number' || retentionTime <= 0) {
126
+ const setMetricRetentionTime = (req, res) => {
127
+ const retentionTimeInSeconds = req.body.retentionTimeInSeconds;
128
+ if (typeof retentionTimeInSeconds !== 'number' || retentionTimeInSeconds <= 0) {
129
129
  res.status(400).send({
130
130
  error: 'Invalid retention time. Must be a positive number.'
131
131
  });
132
132
  return;
133
133
  }
134
- _telemetryRegistry.inMemoryDbMetricExporter.retentionTimeInSeconds = retentionTime;
134
+ _telemetryRegistry.inMemoryDbMetricExporter.retentionTimeInSeconds = retentionTimeInSeconds;
135
135
  res.send({
136
- message: `Retention time set to ${retentionTime} seconds.`
136
+ message: `Retention time set to ${retentionTimeInSeconds} seconds.`
137
137
  });
138
138
  };
139
- exports.setRetentionTimeMetrics = setRetentionTimeMetrics;
139
+ exports.setMetricRetentionTime = setMetricRetentionTime;
140
+ const getMetricRetentionTime = (req, res) => {
141
+ const retentionTimeInSeconds = _telemetryRegistry.inMemoryDbMetricExporter.retentionTimeInSeconds || 0;
142
+ res.send({
143
+ retentionTimeInSeconds: retentionTimeInSeconds
144
+ });
145
+ };
146
+ exports.getMetricRetentionTime = getMetricRetentionTime;
@@ -13,7 +13,8 @@ const getMetricsRoutes = () => {
13
13
  router.post('/stop', _metricsController.stopMetrics);
14
14
  router.get('/status', _metricsController.statusMetrics);
15
15
  router.post('/reset', _metricsController.resetMetrics);
16
- router.post('/retention-time', _metricsController.setRetentionTimeMetrics);
16
+ router.post('/retention-time', _metricsController.setMetricRetentionTime);
17
+ router.get('/retention-time', _metricsController.getMetricRetentionTime);
17
18
  router.get('/', _metricsController.listMetrics);
18
19
  router.post('/', _metricsController.insertMetricsToDb);
19
20
  router.post('/find', _metricsController.findMetrics);
@@ -10,9 +10,19 @@ var _path = _interopRequireDefault(require("path"));
10
10
  var _logger = _interopRequireDefault(require("../utils/logger.cjs"));
11
11
  var _pluginService = require("./pluginService.cjs");
12
12
  var _url = require("url");
13
+ const _excluded = ["process"];
13
14
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
+ 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; }
16
+ 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
17
  const listPlugins = (req, res) => {
15
- const plugins = _pluginService.pluginService.getPlugins();
18
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
19
+ const plugins = _pluginService.pluginService.getPlugins().map(_ref => {
20
+ let {
21
+ process
22
+ } = _ref,
23
+ rest = _objectWithoutProperties(_ref, _excluded);
24
+ return rest;
25
+ });
16
26
  res.send({
17
27
  pluginsCount: plugins.length,
18
28
  plugins
@@ -17,13 +17,15 @@ process.on("message", async msg => {
17
17
  if (pluginResource.install && Array.isArray(pluginResource.install.dependencies) && pluginResource.install.dependencies.length > 0) {
18
18
  log("Installing dependencies for plugin: " + pluginResource.name);
19
19
  const dependenciesStatus = await (0, _dynamicInstaller.installDependencies)(pluginResource.install);
20
+ console.dir(dependenciesStatus);
20
21
  if (!dependenciesStatus.success) {
22
+ const detailsFailed = dependenciesStatus.details.filter(detail => detail.success === false);
21
23
  if (pluginResource.install.ignoreErrors === true) {
22
- log(`Warning: Error installing dependencies: ${JSON.stringify(dependenciesStatus.details)}`);
24
+ log(`Warning: Error installing dependencies: ${JSON.stringify(detailsFailed)}. Continuing as ignoreErrors is true.`);
23
25
  } else {
24
26
  process.send?.({
25
27
  event: "error",
26
- error: `Error installing dependencies: ${JSON.stringify(dependenciesStatus.details)}`
28
+ error: `Error installing dependencies: ${JSON.stringify(detailsFailed)}`
27
29
  });
28
30
  return;
29
31
  }
@@ -9,6 +9,7 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
9
9
  class PluginService {
10
10
  constructor() {
11
11
  this.plugins = [];
12
+ this.enabled = false;
12
13
  }
13
14
  getPlugins() {
14
15
  return this.plugins;
@@ -36,6 +37,7 @@ class PluginService {
36
37
  this.plugins = this.plugins.filter(p => p.id !== pluginId);
37
38
  }
38
39
  broadcastToPlugins(type, payload) {
40
+ if (!this.enabled) return;
39
41
  this.plugins.forEach((plugin, i) => {
40
42
  if (!plugin.active) return;
41
43
  if (plugin.process) {
@@ -71,6 +73,7 @@ class PluginService {
71
73
  }
72
74
  /**
73
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)
74
77
  */
75
78
  broadcastTrace(trace) {
76
79
  this.broadcastToPlugins("newTrace", trace);
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.stopTraces = exports.statusTraces = exports.startTraces = exports.setRetentionTimeTraces = exports.resetTraces = exports.listTraces = exports.insertTracesToDb = exports.findTraces = void 0;
6
+ exports.stopTraces = exports.statusTraces = exports.startTraces = exports.setTraceRetentionTime = exports.resetTraces = exports.listTraces = exports.insertTracesToDb = exports.getTraceRetentionTime = exports.findTraces = void 0;
7
7
  var _telemetryRegistry = require("../telemetry/telemetryRegistry.cjs");
8
8
  var _regexUtils = require("../utils/regexUtils.cjs");
9
9
  const _excluded = ["_id"];
@@ -62,7 +62,7 @@ const findTraces = (req, res) => {
62
62
  _telemetryRegistry.inMemoryDbSpanExporter.find(processedQuery, (err, docs) => {
63
63
  if (err) {
64
64
  console.error(err);
65
- res.status(404).send({
65
+ res.status(400).send({
66
66
  spansCount: 0,
67
67
  spans: [],
68
68
  error: err.message
@@ -82,7 +82,7 @@ const insertTracesToDb = async (req, res) => {
82
82
  const resetData = req.query.reset === 'true';
83
83
  if (!Array.isArray(jsonContent)) {
84
84
  res.status(400).send({
85
- error: 'Invalid data format. Expected an array of JSON objects.'
85
+ error: 'Invalid data format.'
86
86
  });
87
87
  return;
88
88
  }
@@ -123,17 +123,24 @@ const insertTracesToDb = async (req, res) => {
123
123
  }
124
124
  };
125
125
  exports.insertTracesToDb = insertTracesToDb;
126
- const setRetentionTimeTraces = (req, res) => {
127
- const retentionTime = req.body.retentionTime;
128
- if (typeof retentionTime !== 'number' || retentionTime <= 0) {
126
+ const setTraceRetentionTime = (req, res) => {
127
+ const retentionTimeInSeconds = req.body.retentionTimeInSeconds;
128
+ if (typeof retentionTimeInSeconds !== 'number' || retentionTimeInSeconds <= 0) {
129
129
  res.status(400).send({
130
130
  error: 'Invalid retention time. Must be a positive number.'
131
131
  });
132
132
  return;
133
133
  }
134
- _telemetryRegistry.inMemoryDbSpanExporter.retentionTimeInSeconds = retentionTime;
134
+ _telemetryRegistry.inMemoryDbSpanExporter.retentionTimeInSeconds = retentionTimeInSeconds;
135
135
  res.send({
136
- message: `Retention time set to ${retentionTime} seconds.`
136
+ message: `Retention time set to ${retentionTimeInSeconds} seconds.`
137
137
  });
138
138
  };
139
- exports.setRetentionTimeTraces = setRetentionTimeTraces;
139
+ exports.setTraceRetentionTime = setTraceRetentionTime;
140
+ const getTraceRetentionTime = (req, res) => {
141
+ const retentionTimeInSeconds = _telemetryRegistry.inMemoryDbSpanExporter.retentionTimeInSeconds || 0;
142
+ res.send({
143
+ retentionTimeInSeconds: retentionTimeInSeconds
144
+ });
145
+ };
146
+ exports.getTraceRetentionTime = getTraceRetentionTime;
@@ -16,7 +16,8 @@ const getTraceRoutes = () => {
16
16
  router.get('/', _traceController.listTraces);
17
17
  router.post('/', _traceController.insertTracesToDb);
18
18
  router.post('/find', _traceController.findTraces);
19
- router.post('/retention-time', _traceController.setRetentionTimeTraces);
19
+ router.post('/retention-time', _traceController.setTraceRetentionTime);
20
+ router.get('/retention-time', _traceController.getTraceRetentionTime);
20
21
  return router;
21
22
  };
22
23
  exports.getTraceRoutes = getTraceRoutes;
@@ -3,11 +3,12 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.specLoader = exports.heapStats = void 0;
6
+ exports.specLoader = exports.heapStats = exports.getOasTelemetrySpec = void 0;
7
7
  var _fs = require("fs");
8
8
  var _path = _interopRequireDefault(require("path"));
9
9
  var _jsYaml = _interopRequireDefault(require("js-yaml"));
10
10
  var _nodeV = _interopRequireDefault(require("node:v8"));
11
+ var _nodeUrl = require("node:url");
11
12
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
12
13
  const specLoader = (_req, res, oasTlmConfig) => {
13
14
  if (oasTlmConfig.general.specFileName) {
@@ -59,4 +60,24 @@ const heapStats = (req, res) => {
59
60
  roundedHeapStats['units'] = 'MB';
60
61
  res.send(roundedHeapStats);
61
62
  };
62
- exports.heapStats = heapStats;
63
+ exports.heapStats = heapStats;
64
+ const isCjs = typeof __filename !== "undefined" && typeof __dirname !== "undefined";
65
+ const __filenameUniversal = isCjs ? __filename : (0, _nodeUrl.fileURLToPath)(require('url').pathToFileURL(__filename).toString());
66
+ const __dirnameUniversal = isCjs ? __dirname : _path.default.dirname(__filenameUniversal);
67
+ const getOasTelemetrySpec = (_req, res) => {
68
+ try {
69
+ const specPath = _path.default.join(__dirnameUniversal, '../docs/openapi.yaml');
70
+ const data = (0, _fs.readFileSync)(specPath, {
71
+ encoding: 'utf8',
72
+ flag: 'r'
73
+ });
74
+ let json = data;
75
+ json = JSON.stringify(_jsYaml.default.load(data), null, 2);
76
+ res.setHeader('Content-Type', 'application/json');
77
+ res.send(json);
78
+ } catch (e) {
79
+ console.error(`ERROR loading OAS Telemetry OpenAPI spec file: ${e}`);
80
+ res.status(500).send(`ERROR loading OAS Telemetry OpenAPI spec file: ${e}`);
81
+ }
82
+ };
83
+ exports.getOasTelemetrySpec = getOasTelemetrySpec;
@@ -9,16 +9,38 @@ var _utilController = require("./utilController.cjs");
9
9
  const getUtilsRoutes = oasTlmConfig => {
10
10
  const router = (0, _express.Router)();
11
11
  router.get('/spec', (req, res) => (0, _utilController.specLoader)(req, res, oasTlmConfig));
12
+ router.get('/oas-telemetry-spec', (req, res) => (0, _utilController.getOasTelemetrySpec)(req, res));
12
13
  router.get('/heapStats', _utilController.heapStats);
13
- router.get('/generateLog', (req, res) => {
14
- const log = req.query.log || 'Default log message';
15
- console.log(log);
14
+ //This route is NOT ignored by the spanExporter (includes "generate")
15
+ router.post('/generate-log', async (req, res) => {
16
+ const log = req.body.log || 'Default log message';
17
+ const repeat = parseInt(req.body.repeat) || 1;
18
+ const method = req.body.method?.toLowerCase() || 'log';
19
+ if (!['log', 'warn', 'error', 'info', 'debug'].includes(method)) {
20
+ res.status(400).send({
21
+ error: 'Invalid method. Use log, warn, error, info, or debug.'
22
+ });
23
+ return;
24
+ }
16
25
  res.send({
17
26
  message: 'Log generated',
18
27
  log: log
19
28
  });
29
+ for (let i = 0; i < repeat; i++) {
30
+ console[method](log);
31
+ await new Promise(resolve => setTimeout(resolve, 50)); // Slight delay between logs
32
+ }
20
33
  });
21
- router.get('/wait/:seconds?', async (req, res) => {
34
+ // This route is NOT ignored by the spanExporter (includes "generate")
35
+ router.post('/generate-mock-logs', async (req, res) => {
36
+ const count = parseInt(req.body.count) || 50;
37
+ generateMockLogs(count);
38
+ res.send({
39
+ message: 'Started generating mock logs'
40
+ });
41
+ });
42
+ // This route is NOT ignored by the spanExporter
43
+ router.get('/generate-wait/:seconds?', async (req, res) => {
22
44
  const seconds = parseInt(req.params.seconds ?? "1", 10);
23
45
  const waitTime = isNaN(seconds) ? 1 : seconds;
24
46
  await new Promise(resolve => setTimeout(resolve, waitTime * 1000));
@@ -28,4 +50,21 @@ const getUtilsRoutes = oasTlmConfig => {
28
50
  });
29
51
  return router;
30
52
  };
31
- exports.getUtilsRoutes = getUtilsRoutes;
53
+ exports.getUtilsRoutes = getUtilsRoutes;
54
+ const generateMockLogs = async count => {
55
+ const methodMessages = {
56
+ log: ['User logged in', 'Data fetched successfully'],
57
+ warn: ['Warning: Disk space low', 'Warning: High memory usage'],
58
+ error: ['Error connecting to database', 'Error: Invalid credentials'],
59
+ info: ['Info: Scheduled job started', 'Info: Configuration loaded'],
60
+ debug: ['Debugging mode enabled', 'Debug: Variable x = 42']
61
+ };
62
+ const methods = Object.keys(methodMessages);
63
+ for (let i = 0; i < count; i++) {
64
+ await new Promise(resolve => setTimeout(resolve, 50)); // Slight delay between logs
65
+ const method = methods[Math.floor(Math.random() * methods.length)];
66
+ const messages = methodMessages[method];
67
+ const message = messages[Math.floor(Math.random() * messages.length)];
68
+ console[method](`[${new Date().toISOString()}][MOCK LOG][${method.toUpperCase()}] -${i + 1}- ${message}`);
69
+ }
70
+ };
@@ -5,22 +5,44 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
  var _bootConfig = require("../config/bootConfig.cjs");
8
+ var _telemetryRegistry = require("../telemetry/telemetryRegistry.cjs");
8
9
  const LOG_LEVELS = ['DEBUG', 'INFO', 'WARN', 'ERROR', 'NONE'];
9
- const currentLogLevel = (_bootConfig.bootEnvVariables.OASTLM_BOOT_LOG_LEVEL || 'INFO').toUpperCase();
10
- const serviceName = 'OAS-Telemetry';
11
- function log(level, ...messages) {
12
- if (LOG_LEVELS.indexOf(level) >= LOG_LEVELS.indexOf(currentLogLevel)) {
13
- const timestamp = new Date().toISOString();
14
- console.log(`${timestamp} [${serviceName}] [${level}]:`, ...messages);
15
- }
10
+ const currentLogLevel = _bootConfig.bootEnvVariables.OASTLM_BOOT_LOG_LEVEL.toUpperCase();
11
+ const serviceName = 'OAS-TLM-@-' + _bootConfig.bootEnvVariables.OASTLM_BOOT_SERVICE_NAME;
12
+ function shouldLog(level) {
13
+ return LOG_LEVELS.indexOf(level) >= LOG_LEVELS.indexOf(currentLogLevel);
16
14
  }
17
15
  var _default = exports.default = {
18
- debug: (...messages) => log('DEBUG', ...messages),
19
- info: (...messages) => log('INFO', ...messages),
20
- log: (...messages) => log('INFO', ...messages),
21
- // Alias for info
22
- warn: (...messages) => log('WARN', ...messages),
23
- error: (...messages) => log('ERROR', ...messages),
16
+ debug: (...messages) => {
17
+ if (shouldLog('DEBUG')) {
18
+ const timestamp = new Date().toISOString();
19
+ _telemetryRegistry.originalConsoleMethods.debug(`${timestamp} [${serviceName}] [DEBUG]:`, ...messages);
20
+ }
21
+ },
22
+ info: (...messages) => {
23
+ if (shouldLog('INFO')) {
24
+ const timestamp = new Date().toISOString();
25
+ _telemetryRegistry.originalConsoleMethods.info(`${timestamp} [${serviceName}] [INFO]:`, ...messages);
26
+ }
27
+ },
28
+ log: (...messages) => {
29
+ if (shouldLog('INFO')) {
30
+ const timestamp = new Date().toISOString();
31
+ _telemetryRegistry.originalConsoleMethods.log(`${timestamp} [${serviceName}] [INFO]:`, ...messages);
32
+ }
33
+ },
34
+ warn: (...messages) => {
35
+ if (shouldLog('WARN')) {
36
+ const timestamp = new Date().toISOString();
37
+ _telemetryRegistry.originalConsoleMethods.warn(`${timestamp} [${serviceName}] [WARN]:`, ...messages);
38
+ }
39
+ },
40
+ error: (...messages) => {
41
+ if (shouldLog('ERROR')) {
42
+ const timestamp = new Date().toISOString();
43
+ _telemetryRegistry.originalConsoleMethods.error(`${timestamp} [${serviceName}] [ERROR]:`, ...messages);
44
+ }
45
+ },
24
46
  currentLogLevel
25
47
  };
26
48
  module.exports = exports.default;
@@ -1,4 +1,5 @@
1
1
  import dotenv from 'dotenv';
2
+ import { randomUUID } from 'crypto';
2
3
  if (process.env.NODE_ENV !== 'test') {
3
4
  dotenv.config();
4
5
  }
@@ -8,4 +9,5 @@ export const bootEnvVariables = {
8
9
  OASTLM_BOOT_ENV: process.env.OASTLM_BOOT_ENV || process.env.NODE_ENV || 'production',
9
10
  OASTLM_BOOT_MODULE_DISABLED: process.env.OASTLM_BOOT_MODULE_DISABLED === 'true',
10
11
  OASTLM_BOOT_LOG_LEVEL: process.env.OASTLM_BOOT_LOG_LEVEL || 'INFO',
12
+ OASTLM_BOOT_SERVICE_NAME: process.env.OASTLM_BOOT_SERVICE_NAME || `SERVICE-${randomUUID().slice(0, 8).toUpperCase()}`,
11
13
  };