@oas-tools/oas-telemetry 0.7.0-alpha.4 → 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 (112) hide show
  1. package/.env.example +6 -2
  2. package/README.md +35 -17
  3. package/dist/cjs/config/bootConfig.cjs +3 -1
  4. package/dist/cjs/config/config.cjs +7 -5
  5. package/dist/cjs/docs/openapi.yaml +1399 -0
  6. package/dist/cjs/routesManager.cjs +36 -48
  7. package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.cjs +43 -13
  8. package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.cjs +10 -2
  9. package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.cjs +21 -16
  10. package/dist/cjs/telemetry/initializeTelemetry.cjs +39 -15
  11. package/dist/cjs/telemetry/telemetryConfigurator.cjs +6 -9
  12. package/dist/cjs/telemetry/telemetryRegistry.cjs +11 -8
  13. package/dist/cjs/tlm-ai/agent.cjs +54 -84
  14. package/dist/cjs/tlm-ai/aiController.cjs +69 -47
  15. package/dist/cjs/tlm-ai/aiRoutes.cjs +10 -3
  16. package/dist/cjs/tlm-ai/aiService.cjs +109 -0
  17. package/dist/cjs/tlm-ai/tools.cjs +30 -268
  18. package/dist/cjs/tlm-auth/authController.cjs +91 -26
  19. package/dist/cjs/tlm-auth/authMiddleware.cjs +20 -7
  20. package/dist/cjs/tlm-auth/authRoutes.cjs +3 -2
  21. package/dist/cjs/tlm-log/logController.cjs +30 -36
  22. package/dist/cjs/tlm-log/logRoutes.cjs +3 -2
  23. package/dist/cjs/tlm-metric/metricsController.cjs +15 -8
  24. package/dist/cjs/tlm-metric/metricsRoutes.cjs +2 -1
  25. package/dist/cjs/tlm-plugin/pluginController.cjs +11 -1
  26. package/dist/cjs/tlm-plugin/pluginProcess.cjs +4 -2
  27. package/dist/cjs/tlm-plugin/pluginService.cjs +3 -0
  28. package/dist/cjs/tlm-trace/traceController.cjs +16 -9
  29. package/dist/cjs/tlm-trace/traceRoutes.cjs +2 -1
  30. package/dist/cjs/tlm-util/utilController.cjs +23 -2
  31. package/dist/cjs/tlm-util/utilRoutes.cjs +44 -5
  32. package/dist/cjs/utils/logger.cjs +35 -13
  33. package/dist/esm/config/bootConfig.js +2 -0
  34. package/dist/esm/config/config.js +4 -2
  35. package/dist/esm/docs/openapi.yaml +1399 -0
  36. package/dist/esm/routesManager.js +37 -49
  37. package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.js +32 -11
  38. package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.js +10 -2
  39. package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.js +20 -13
  40. package/dist/esm/telemetry/initializeTelemetry.js +22 -14
  41. package/dist/esm/telemetry/telemetryConfigurator.js +7 -10
  42. package/dist/esm/telemetry/telemetryRegistry.js +10 -7
  43. package/dist/esm/tlm-ai/agent.js +37 -78
  44. package/dist/esm/tlm-ai/aiController.js +56 -39
  45. package/dist/esm/tlm-ai/aiRoutes.js +11 -4
  46. package/dist/esm/tlm-ai/aiService.js +94 -0
  47. package/dist/esm/tlm-ai/tools.js +29 -255
  48. package/dist/esm/tlm-auth/authController.js +62 -20
  49. package/dist/esm/tlm-auth/authMiddleware.js +18 -9
  50. package/dist/esm/tlm-auth/authRoutes.js +4 -3
  51. package/dist/esm/tlm-log/logController.js +26 -28
  52. package/dist/esm/tlm-log/logRoutes.js +4 -3
  53. package/dist/esm/tlm-metric/metricsController.js +10 -6
  54. package/dist/esm/tlm-metric/metricsRoutes.js +3 -2
  55. package/dist/esm/tlm-plugin/pluginController.js +2 -1
  56. package/dist/esm/tlm-plugin/pluginProcess.js +4 -2
  57. package/dist/esm/tlm-plugin/pluginService.js +4 -0
  58. package/dist/esm/tlm-trace/traceController.js +11 -7
  59. package/dist/esm/tlm-trace/traceRoutes.js +3 -2
  60. package/dist/esm/tlm-util/utilController.js +22 -0
  61. package/dist/esm/tlm-util/utilRoutes.js +40 -5
  62. package/dist/esm/utils/logger.js +35 -12
  63. package/dist/types/config/bootConfig.d.ts +1 -0
  64. package/dist/types/config/config.d.ts +6 -3
  65. package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.d.ts +7 -1
  66. package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.d.ts +1 -0
  67. package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.d.ts +1 -0
  68. package/dist/types/telemetry/telemetryRegistry.d.ts +22 -6
  69. package/dist/types/tlm-ai/agent.d.ts +2 -2
  70. package/dist/types/tlm-ai/aiController.d.ts +5 -4
  71. package/dist/types/tlm-ai/aiRoutes.d.ts +1 -1
  72. package/dist/types/tlm-ai/aiService.d.ts +38 -0
  73. package/dist/types/tlm-ai/tools.d.ts +5 -14
  74. package/dist/types/tlm-auth/authController.d.ts +2 -1
  75. package/dist/types/tlm-log/logController.d.ts +2 -2
  76. package/dist/types/tlm-metric/metricsController.d.ts +2 -1
  77. package/dist/types/tlm-plugin/pluginService.d.ts +2 -0
  78. package/dist/types/tlm-trace/traceController.d.ts +2 -1
  79. package/dist/types/tlm-util/utilController.d.ts +1 -0
  80. package/dist/types/utils/logger.d.ts +5 -5
  81. package/dist/ui/assets/ApiDocsPage-C_VVPPHa.js +16 -0
  82. package/dist/ui/assets/CollapsibleCard-B3KR_8mL.js +1 -0
  83. package/dist/ui/assets/DevToolsPage-OyZcDcmw.js +1 -0
  84. package/dist/ui/assets/LandingPage-CppFBA6K.js +6 -0
  85. package/dist/ui/assets/LogsPage-9Fq8GArS.js +26 -0
  86. package/dist/ui/assets/NotFoundPage-B3quk3P1.js +1 -0
  87. package/dist/ui/assets/PluginCreatePage-X_aCH4t4.js +50 -0
  88. package/dist/ui/assets/PluginPage-DMDSihrZ.js +27 -0
  89. package/dist/ui/assets/alert-jQ9HCPIf.js +1133 -0
  90. package/dist/ui/assets/badge-CNq0-mH5.js +1 -0
  91. package/dist/ui/assets/card-DFAwwhN3.js +1 -0
  92. package/dist/ui/assets/chevron-down-CPsvsmqj.js +6 -0
  93. package/dist/ui/assets/chevron-up-Df9jMo1X.js +6 -0
  94. package/dist/ui/assets/circle-alert-DOPQPvU8.js +6 -0
  95. package/dist/ui/assets/index-BkD6DijD.js +15 -0
  96. package/dist/ui/assets/index-CERGVYZK.js +292 -0
  97. package/dist/ui/assets/index-CSIPf9qw.css +1 -0
  98. package/dist/ui/assets/input-Dzvg_ZEZ.js +1 -0
  99. package/dist/ui/assets/label-DuVnkZ4q.js +1 -0
  100. package/dist/ui/assets/loader-circle-CrvlRy5o.js +6 -0
  101. package/dist/ui/assets/loginPage-qa4V-B70.js +6 -0
  102. package/dist/ui/assets/select-DhS8YUtJ.js +1 -0
  103. package/dist/ui/assets/separator-isK4chBP.js +6 -0
  104. package/dist/ui/assets/severityOptions-O38dSOfk.js +11 -0
  105. package/dist/ui/assets/switch-Z3mImG9n.js +1 -0
  106. package/dist/ui/assets/tabs-_77MUUQe.js +16 -0
  107. package/dist/ui/assets/upload-C1LT4Gkb.js +16 -0
  108. package/dist/ui/assets/utilService-DNyqzwj0.js +1 -0
  109. package/dist/ui/index.html +2 -2
  110. package/package.json +18 -7
  111. package/dist/ui/assets/index-BzIdRox6.js +0 -1733
  112. package/dist/ui/assets/index-CkoHzrrt.css +0 -1
@@ -3,69 +3,134 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.getLogout = exports.getLogin = exports.getCheck = void 0;
6
+ exports.getRefresh = exports.getLogout = exports.getLogin = exports.getAuthEnabled = void 0;
7
7
  var _jsonwebtoken = _interopRequireDefault(require("jsonwebtoken"));
8
8
  var _logger = _interopRequireDefault(require("../utils/logger.cjs"));
9
9
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
+ function generateAccessToken(secret, expiresIn) {
11
+ return _jsonwebtoken.default.sign({
12
+ type: "access"
13
+ }, secret, {
14
+ expiresIn: Math.floor(expiresIn / 1000)
15
+ });
16
+ }
17
+ function generateRefreshToken(secret, expiresIn) {
18
+ return _jsonwebtoken.default.sign({
19
+ type: "refresh"
20
+ }, secret, {
21
+ expiresIn: Math.floor(expiresIn / 1000)
22
+ });
23
+ }
10
24
  const getLogin = oasTlmConfig => (req, res) => {
25
+ if (!oasTlmConfig.auth.enabled) {
26
+ res.status(200).json({
27
+ valid: true,
28
+ message: "Auth disabled"
29
+ });
30
+ return;
31
+ }
11
32
  try {
12
33
  const {
13
34
  password
14
35
  } = req.body;
15
36
  if (password === oasTlmConfig.auth.password) {
16
- const options = {
17
- maxAge: oasTlmConfig.auth.apiKeyMaxAge,
37
+ const accessToken = generateAccessToken(oasTlmConfig.auth.jwtSecret, oasTlmConfig.auth.accessTokenMaxAge);
38
+ const refreshToken = generateRefreshToken(oasTlmConfig.auth.jwtSecret, oasTlmConfig.auth.refreshTokenMaxAge);
39
+ res.cookie("oas-tlm-access-token", accessToken, {
40
+ maxAge: oasTlmConfig.auth.accessTokenMaxAge,
18
41
  httpOnly: true,
19
- secure: true,
20
- signed: false
21
- };
22
- const apiKey = _jsonwebtoken.default.sign({
23
- password: oasTlmConfig.auth.password
24
- }, oasTlmConfig.auth.jwtSecret);
25
- res.cookie('apiKey', apiKey, options);
42
+ secure: process.env.NODE_ENV === "production",
43
+ sameSite: "lax",
44
+ path: "/"
45
+ });
46
+ res.cookie("oas-tlm-refresh-token", refreshToken, {
47
+ maxAge: oasTlmConfig.auth.refreshTokenMaxAge,
48
+ httpOnly: true,
49
+ secure: process.env.NODE_ENV === "production",
50
+ sameSite: "lax",
51
+ path: oasTlmConfig.general.baseUrl + "/auth/refresh"
52
+ });
26
53
  res.status(200).json({
27
54
  valid: true,
28
- message: 'API Key is valid'
55
+ message: "Login successful"
29
56
  });
30
57
  return;
31
58
  }
32
59
  res.status(400).json({
33
60
  valid: false,
34
- message: 'Invalid API Key'
61
+ message: "Invalid password"
35
62
  });
36
63
  } catch (error) {
37
- _logger.default.log("Error: ", error);
64
+ _logger.default.error("Login error: ", error);
38
65
  res.status(500).json({
39
66
  valid: false,
40
- message: 'Internal server error'
67
+ message: "Internal server error"
41
68
  });
42
69
  }
43
70
  };
44
71
  exports.getLogin = getLogin;
45
72
  const getLogout = oasTlmConfig => (req, res) => {
46
- res.clearCookie('apiKey');
47
- res.redirect(oasTlmConfig.general.baseUrl + oasTlmConfig.general.uiPath + '/login');
73
+ if (!oasTlmConfig.auth.enabled) {
74
+ res.status(200).json({
75
+ valid: true,
76
+ message: "Auth disabled"
77
+ });
78
+ return;
79
+ }
80
+ res.clearCookie('oas-tlm-access-token', {
81
+ path: '/'
82
+ });
83
+ res.clearCookie('oas-tlm-refresh-token', {
84
+ path: oasTlmConfig.general.baseUrl + '/auth/refresh'
85
+ });
86
+ res.status(200).json({
87
+ valid: true,
88
+ message: "Logged out"
89
+ });
48
90
  };
49
91
  exports.getLogout = getLogout;
50
- const getCheck = oasTlmConfig => (req, res) => {
51
- if (!req.cookies.apiKey) {
92
+ const getRefresh = oasTlmConfig => (req, res) => {
93
+ if (!oasTlmConfig.auth.enabled) {
52
94
  res.status(200).json({
95
+ valid: true,
96
+ message: "Auth disabled"
97
+ });
98
+ return;
99
+ }
100
+ const refreshToken = req.cookies["oas-tlm-refresh-token"];
101
+ if (!refreshToken) {
102
+ res.status(401).json({
53
103
  valid: false,
54
- message: 'API Key is invalid'
104
+ message: "No refresh token"
55
105
  });
56
106
  return;
57
107
  }
58
- const decoded = _jsonwebtoken.default.verify(req.cookies.apiKey, oasTlmConfig.auth.jwtSecret);
59
- if (decoded.password === oasTlmConfig.auth.password) {
108
+ try {
109
+ const payload = _jsonwebtoken.default.verify(refreshToken, oasTlmConfig.auth.jwtSecret);
110
+ if (payload.type !== "refresh") throw new Error("Invalid token type");
111
+ const accessToken = generateAccessToken(oasTlmConfig.auth.jwtSecret, oasTlmConfig.auth.accessTokenMaxAge);
112
+ res.cookie("oas-tlm-access-token", accessToken, {
113
+ maxAge: oasTlmConfig.auth.accessTokenMaxAge,
114
+ httpOnly: true,
115
+ secure: process.env.NODE_ENV === "production",
116
+ sameSite: "lax",
117
+ path: "/"
118
+ });
60
119
  res.status(200).json({
61
120
  valid: true,
62
- message: 'API Key is valid'
121
+ message: "Refreshed"
122
+ });
123
+ } catch {
124
+ res.status(401).json({
125
+ valid: false,
126
+ message: "Invalid refresh token"
63
127
  });
64
- return;
65
128
  }
129
+ };
130
+ exports.getRefresh = getRefresh;
131
+ const getAuthEnabled = oasTlmConfig => (req, res) => {
66
132
  res.status(200).json({
67
- valid: false,
68
- message: 'Invalid API Key'
133
+ enabled: !!oasTlmConfig.auth.enabled
69
134
  });
70
135
  };
71
- exports.getCheck = getCheck;
136
+ exports.getAuthEnabled = getAuthEnabled;
@@ -8,13 +8,26 @@ var _jsonwebtoken = _interopRequireDefault(require("jsonwebtoken"));
8
8
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
9
  function getAuthMiddleware(oasTlmConfig) {
10
10
  return function authMiddleware(req, res, next) {
11
- const apiKey = req.cookies.apiKey;
12
- if (apiKey) {
13
- const decoded = _jsonwebtoken.default.verify(apiKey, oasTlmConfig.auth.jwtSecret);
14
- if (decoded.password === oasTlmConfig.auth.password) {
15
- return next();
16
- }
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
+ });
17
31
  }
18
- res.status(401).redirect(oasTlmConfig.general.baseUrl + oasTlmConfig.general.uiPath + '/login');
19
32
  };
20
33
  }
@@ -9,8 +9,9 @@ var _authController = require("./authController.cjs");
9
9
  const getAuthRoutes = oasTlmConfig => {
10
10
  const router = (0, _express.Router)();
11
11
  router.post('/login', (0, _authController.getLogin)(oasTlmConfig));
12
- router.get('/logout', (0, _authController.getLogout)(oasTlmConfig));
13
- router.get('/check', (0, _authController.getCheck)(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));
14
15
  return router;
15
16
  };
16
17
  exports.getAuthRoutes = getAuthRoutes;
@@ -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
+ };