@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.
- package/.env.example +2 -0
- package/README.md +35 -17
- package/dist/cjs/config/bootConfig.cjs +3 -1
- package/dist/cjs/docs/openapi.yaml +1399 -0
- package/dist/cjs/routesManager.cjs +1 -1
- package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.cjs +43 -13
- package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.cjs +10 -2
- package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.cjs +21 -16
- package/dist/cjs/telemetry/initializeTelemetry.cjs +39 -15
- package/dist/cjs/telemetry/telemetryConfigurator.cjs +6 -9
- package/dist/cjs/telemetry/telemetryRegistry.cjs +11 -8
- package/dist/cjs/tlm-ai/agent.cjs +54 -84
- package/dist/cjs/tlm-ai/aiController.cjs +69 -47
- package/dist/cjs/tlm-ai/aiRoutes.cjs +10 -3
- package/dist/cjs/tlm-ai/aiService.cjs +109 -0
- package/dist/cjs/tlm-ai/tools.cjs +30 -268
- package/dist/cjs/tlm-auth/authController.cjs +9 -9
- package/dist/cjs/tlm-auth/authMiddleware.cjs +1 -1
- package/dist/cjs/tlm-log/logController.cjs +30 -36
- package/dist/cjs/tlm-log/logRoutes.cjs +3 -2
- package/dist/cjs/tlm-metric/metricsController.cjs +15 -8
- package/dist/cjs/tlm-metric/metricsRoutes.cjs +2 -1
- package/dist/cjs/tlm-plugin/pluginController.cjs +11 -1
- package/dist/cjs/tlm-plugin/pluginProcess.cjs +4 -2
- package/dist/cjs/tlm-plugin/pluginService.cjs +3 -0
- package/dist/cjs/tlm-trace/traceController.cjs +16 -9
- package/dist/cjs/tlm-trace/traceRoutes.cjs +2 -1
- package/dist/cjs/tlm-util/utilController.cjs +23 -2
- package/dist/cjs/tlm-util/utilRoutes.cjs +44 -5
- package/dist/cjs/utils/logger.cjs +35 -13
- package/dist/esm/config/bootConfig.js +2 -0
- package/dist/esm/docs/openapi.yaml +1399 -0
- package/dist/esm/routesManager.js +1 -1
- package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.js +32 -11
- package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.js +10 -2
- package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.js +20 -13
- package/dist/esm/telemetry/initializeTelemetry.js +22 -14
- package/dist/esm/telemetry/telemetryConfigurator.js +7 -10
- package/dist/esm/telemetry/telemetryRegistry.js +10 -7
- package/dist/esm/tlm-ai/agent.js +37 -78
- package/dist/esm/tlm-ai/aiController.js +56 -39
- package/dist/esm/tlm-ai/aiRoutes.js +11 -4
- package/dist/esm/tlm-ai/aiService.js +94 -0
- package/dist/esm/tlm-ai/tools.js +29 -255
- package/dist/esm/tlm-auth/authController.js +8 -8
- package/dist/esm/tlm-auth/authMiddleware.js +1 -1
- package/dist/esm/tlm-log/logController.js +26 -28
- package/dist/esm/tlm-log/logRoutes.js +4 -3
- package/dist/esm/tlm-metric/metricsController.js +10 -6
- package/dist/esm/tlm-metric/metricsRoutes.js +3 -2
- package/dist/esm/tlm-plugin/pluginController.js +2 -1
- package/dist/esm/tlm-plugin/pluginProcess.js +4 -2
- package/dist/esm/tlm-plugin/pluginService.js +4 -0
- package/dist/esm/tlm-trace/traceController.js +11 -7
- package/dist/esm/tlm-trace/traceRoutes.js +3 -2
- package/dist/esm/tlm-util/utilController.js +22 -0
- package/dist/esm/tlm-util/utilRoutes.js +40 -5
- package/dist/esm/utils/logger.js +35 -12
- package/dist/types/config/bootConfig.d.ts +1 -0
- package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.d.ts +7 -1
- package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.d.ts +1 -0
- package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.d.ts +1 -0
- package/dist/types/telemetry/telemetryRegistry.d.ts +22 -6
- package/dist/types/tlm-ai/agent.d.ts +2 -2
- package/dist/types/tlm-ai/aiController.d.ts +5 -4
- package/dist/types/tlm-ai/aiRoutes.d.ts +1 -1
- package/dist/types/tlm-ai/aiService.d.ts +38 -0
- package/dist/types/tlm-ai/tools.d.ts +5 -14
- package/dist/types/tlm-log/logController.d.ts +2 -2
- package/dist/types/tlm-metric/metricsController.d.ts +2 -1
- package/dist/types/tlm-plugin/pluginService.d.ts +2 -0
- package/dist/types/tlm-trace/traceController.d.ts +2 -1
- package/dist/types/tlm-util/utilController.d.ts +1 -0
- package/dist/types/utils/logger.d.ts +5 -5
- package/dist/ui/assets/ApiDocsPage-C_VVPPHa.js +16 -0
- package/dist/ui/assets/CollapsibleCard-B3KR_8mL.js +1 -0
- package/dist/ui/assets/DevToolsPage-OyZcDcmw.js +1 -0
- package/dist/ui/assets/LandingPage-CppFBA6K.js +6 -0
- package/dist/ui/assets/LogsPage-9Fq8GArS.js +26 -0
- package/dist/ui/assets/NotFoundPage-B3quk3P1.js +1 -0
- package/dist/ui/assets/PluginCreatePage-X_aCH4t4.js +50 -0
- package/dist/ui/assets/PluginPage-DMDSihrZ.js +27 -0
- package/dist/ui/assets/alert-jQ9HCPIf.js +1133 -0
- package/dist/ui/assets/badge-CNq0-mH5.js +1 -0
- package/dist/ui/assets/card-DFAwwhN3.js +1 -0
- package/dist/ui/assets/chevron-down-CPsvsmqj.js +6 -0
- package/dist/ui/assets/chevron-up-Df9jMo1X.js +6 -0
- package/dist/ui/assets/circle-alert-DOPQPvU8.js +6 -0
- package/dist/ui/assets/index-BkD6DijD.js +15 -0
- package/dist/ui/assets/index-CERGVYZK.js +292 -0
- package/dist/ui/assets/index-CSIPf9qw.css +1 -0
- package/dist/ui/assets/input-Dzvg_ZEZ.js +1 -0
- package/dist/ui/assets/label-DuVnkZ4q.js +1 -0
- package/dist/ui/assets/loader-circle-CrvlRy5o.js +6 -0
- package/dist/ui/assets/loginPage-qa4V-B70.js +6 -0
- package/dist/ui/assets/select-DhS8YUtJ.js +1 -0
- package/dist/ui/assets/separator-isK4chBP.js +6 -0
- package/dist/ui/assets/severityOptions-O38dSOfk.js +11 -0
- package/dist/ui/assets/switch-Z3mImG9n.js +1 -0
- package/dist/ui/assets/tabs-_77MUUQe.js +16 -0
- package/dist/ui/assets/upload-C1LT4Gkb.js +16 -0
- package/dist/ui/assets/utilService-DNyqzwj0.js +1 -0
- package/dist/ui/index.html +2 -2
- package/package.json +17 -6
- package/dist/ui/assets/index-Bgd7fFFH.js +0 -1743
- 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("
|
|
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("
|
|
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"
|
|
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('
|
|
80
|
+
res.clearCookie('oas-tlm-access-token', {
|
|
81
81
|
path: '/'
|
|
82
82
|
});
|
|
83
|
-
res.clearCookie('
|
|
83
|
+
res.clearCookie('oas-tlm-refresh-token', {
|
|
84
84
|
path: oasTlmConfig.general.baseUrl + '/auth/refresh'
|
|
85
|
-
});
|
|
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
|
|
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("
|
|
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
|
|
123
|
+
} catch {
|
|
124
124
|
res.status(401).json({
|
|
125
125
|
valid: false,
|
|
126
126
|
message: "Invalid refresh token"
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.stopLogs = exports.statusLogs = exports.startLogs = exports.
|
|
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
|
|
32
|
-
const findQuery = body
|
|
33
|
-
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
|
136
|
-
const
|
|
137
|
-
if (typeof
|
|
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 =
|
|
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
|
-
|
|
139
|
+
retentionTimeInSeconds: retentionTimeInSeconds
|
|
146
140
|
});
|
|
147
141
|
};
|
|
148
|
-
exports.
|
|
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.
|
|
17
|
-
router.get('/', _logController.
|
|
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.
|
|
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.
|
|
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
|
|
127
|
-
const
|
|
128
|
-
if (typeof
|
|
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 =
|
|
134
|
+
_telemetryRegistry.inMemoryDbMetricExporter.retentionTimeInSeconds = retentionTimeInSeconds;
|
|
135
135
|
res.send({
|
|
136
|
-
message: `Retention time set to ${
|
|
136
|
+
message: `Retention time set to ${retentionTimeInSeconds} seconds.`
|
|
137
137
|
});
|
|
138
138
|
};
|
|
139
|
-
exports.
|
|
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.
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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.
|
|
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(
|
|
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.
|
|
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
|
|
127
|
-
const
|
|
128
|
-
if (typeof
|
|
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 =
|
|
134
|
+
_telemetryRegistry.inMemoryDbSpanExporter.retentionTimeInSeconds = retentionTimeInSeconds;
|
|
135
135
|
res.send({
|
|
136
|
-
message: `Retention time set to ${
|
|
136
|
+
message: `Retention time set to ${retentionTimeInSeconds} seconds.`
|
|
137
137
|
});
|
|
138
138
|
};
|
|
139
|
-
exports.
|
|
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.
|
|
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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
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 =
|
|
10
|
-
const serviceName = 'OAS-
|
|
11
|
-
function
|
|
12
|
-
|
|
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) =>
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
};
|