@oas-tools/oas-telemetry 0.6.2 → 0.7.0-alpha.1
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/README.md +442 -442
- package/dist/{config.cjs → cjs/config.cjs} +6 -7
- package/dist/{exporters → cjs/exporters}/InMemoryDBMetricsExporter.cjs +5 -40
- package/dist/cjs/exporters/InMemoryDbExporter.cjs +87 -0
- package/dist/cjs/exporters/InMemoryLogRecordExporter.cjs +110 -0
- package/dist/{exporters → cjs/exporters}/consoleExporter.cjs +2 -7
- package/dist/{exporters → cjs/exporters}/dynamicExporter.cjs +12 -19
- package/dist/cjs/index.cjs +43 -0
- package/dist/cjs/instrumentation/index.cjs +28 -0
- package/dist/cjs/instrumentation/logs.cjs +46 -0
- package/dist/cjs/instrumentation/metrics.cjs +27 -0
- package/dist/cjs/instrumentation/traces.cjs +19 -0
- package/dist/cjs/tlm-ai/agent.cjs +79 -0
- package/dist/cjs/tlm-ai/aiController.cjs +69 -0
- package/dist/cjs/tlm-ai/aiRoutes.cjs +13 -0
- package/dist/cjs/tlm-ai/knownMicroservices.cjs +13 -0
- package/dist/cjs/tlm-ai/tools.cjs +504 -0
- package/dist/{routes/authRoutes.cjs → cjs/tlm-auth/authController.cjs} +21 -28
- package/dist/{middleware → cjs/tlm-auth}/authMiddleware.cjs +1 -1
- package/dist/cjs/tlm-auth/authRoutes.cjs +14 -0
- package/dist/cjs/tlm-log/logController.cjs +55 -0
- package/dist/cjs/tlm-log/logRoutes.cjs +13 -0
- package/dist/{routes → cjs/tlm-metric}/metricsRoutes.cjs +1 -2
- package/dist/{controllers → cjs/tlm-plugin}/pluginController.cjs +31 -41
- package/dist/cjs/tlm-plugin/pluginRoutes.cjs +13 -0
- package/dist/{controllers/telemetryController.cjs → cjs/tlm-trace/traceController.cjs} +8 -19
- package/dist/cjs/tlm-trace/traceRoutes.cjs +17 -0
- package/dist/cjs/tlm-ui/uiRoutes.cjs +31 -0
- package/dist/cjs/tlm-util/utilController.cjs +63 -0
- package/dist/cjs/tlm-util/utilRoutes.cjs +12 -0
- package/dist/cjs/tlmRoutes.cjs +79 -0
- package/dist/cjs/types/index.cjs +8 -0
- package/dist/cjs/utils/circular.cjs +90 -0
- package/dist/cjs/utils/logger.cjs +28 -0
- package/{src → dist/esm}/config.js +20 -23
- package/{src → dist/esm}/exporters/InMemoryDBMetricsExporter.js +57 -111
- package/dist/esm/exporters/InMemoryDbExporter.js +87 -0
- package/dist/esm/exporters/InMemoryLogRecordExporter.js +95 -0
- package/{src → dist/esm}/exporters/consoleExporter.js +38 -47
- package/{src → dist/esm}/exporters/dynamicExporter.js +50 -62
- package/dist/esm/index.js +39 -0
- package/dist/esm/instrumentation/index.js +26 -0
- package/dist/esm/instrumentation/logs.js +34 -0
- package/dist/esm/instrumentation/metrics.js +18 -0
- package/dist/esm/instrumentation/traces.js +12 -0
- package/dist/esm/tlm-ai/agent.js +68 -0
- package/dist/esm/tlm-ai/aiController.js +45 -0
- package/dist/esm/tlm-ai/aiRoutes.js +7 -0
- package/dist/esm/tlm-ai/knownMicroservices.js +5 -0
- package/dist/esm/tlm-ai/tools.js +490 -0
- package/dist/esm/tlm-auth/authController.js +41 -0
- package/{src/middleware → dist/esm/tlm-auth}/authMiddleware.js +12 -14
- package/dist/esm/tlm-auth/authRoutes.js +7 -0
- package/dist/esm/tlm-log/logController.js +36 -0
- package/dist/esm/tlm-log/logRoutes.js +7 -0
- package/{src/controllers → dist/esm/tlm-metric}/metricsController.js +28 -30
- package/{src/routes → dist/esm/tlm-metric}/metricsRoutes.js +8 -15
- package/{src/controllers → dist/esm/tlm-plugin}/pluginController.js +103 -115
- package/dist/esm/tlm-plugin/pluginRoutes.js +7 -0
- package/dist/esm/tlm-trace/traceController.js +54 -0
- package/dist/esm/tlm-trace/traceRoutes.js +11 -0
- package/dist/esm/tlm-ui/uiRoutes.js +23 -0
- package/dist/esm/tlm-util/utilController.js +57 -0
- package/dist/esm/tlm-util/utilRoutes.js +6 -0
- package/dist/esm/tlmRoutes.js +72 -0
- package/dist/esm/types/index.js +4 -0
- package/dist/esm/utils/circular.js +84 -0
- package/dist/esm/utils/logger.js +19 -0
- package/dist/types/config.d.ts +6 -0
- package/dist/types/exporters/InMemoryDBMetricsExporter.d.ts +15 -0
- package/dist/types/exporters/InMemoryDbExporter.d.ts +24 -0
- package/dist/types/exporters/InMemoryLogRecordExporter.d.ts +27 -0
- package/dist/types/exporters/consoleExporter.d.ts +13 -0
- package/dist/types/exporters/dynamicExporter.d.ts +25 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/instrumentation/index.d.ts +1 -0
- package/dist/types/instrumentation/logs.d.ts +1 -0
- package/dist/types/instrumentation/metrics.d.ts +1 -0
- package/dist/types/instrumentation/traces.d.ts +1 -0
- package/dist/types/tlm-ai/agent.d.ts +1 -0
- package/dist/types/tlm-ai/aiController.d.ts +4 -0
- package/dist/types/tlm-ai/aiRoutes.d.ts +2 -0
- package/dist/types/tlm-ai/knownMicroservices.d.ts +6 -0
- package/dist/types/tlm-ai/tools.d.ts +45 -0
- package/dist/types/tlm-auth/authController.d.ts +4 -0
- package/dist/types/tlm-auth/authMiddleware.d.ts +2 -0
- package/dist/types/tlm-auth/authRoutes.d.ts +2 -0
- package/dist/types/tlm-log/logController.d.ts +4 -0
- package/dist/types/tlm-log/logRoutes.d.ts +2 -0
- package/dist/types/tlm-metric/metricsController.d.ts +4 -0
- package/dist/types/tlm-metric/metricsRoutes.d.ts +2 -0
- package/dist/types/tlm-plugin/pluginController.d.ts +3 -0
- package/dist/types/tlm-plugin/pluginRoutes.d.ts +2 -0
- package/dist/types/tlm-trace/traceController.d.ts +7 -0
- package/dist/types/tlm-trace/traceRoutes.d.ts +2 -0
- package/dist/types/tlm-ui/uiRoutes.d.ts +2 -0
- package/dist/types/tlm-util/utilController.d.ts +3 -0
- package/dist/types/tlm-util/utilRoutes.d.ts +2 -0
- package/dist/types/tlmRoutes.d.ts +2 -0
- package/dist/types/types/index.d.ts +56 -0
- package/dist/types/utils/circular.d.ts +31 -0
- package/dist/types/utils/logger.d.ts +9 -0
- package/dist/ui/assets/index-BNhZBPi2.css +1 -0
- package/dist/ui/assets/index-DxGAMrAl.js +401 -0
- package/dist/ui/index.html +14 -0
- package/dist/ui/vite.svg +1 -0
- package/package.json +80 -77
- package/dist/controllers/uiController.cjs +0 -78
- package/dist/exporters/InMemoryDbExporter.cjs +0 -178
- package/dist/index.cjs +0 -110
- package/dist/openTelemetry.cjs +0 -58
- package/dist/routes/telemetryRoutes.cjs +0 -31
- package/dist/services/uiService.cjs +0 -1520
- package/dist/systemMetrics.cjs +0 -97
- package/src/controllers/telemetryController.js +0 -69
- package/src/controllers/uiController.js +0 -69
- package/src/dev/ui/login.html +0 -32
- package/src/exporters/InMemoryDbExporter.js +0 -181
- package/src/index.js +0 -121
- package/src/openTelemetry.js +0 -58
- package/src/routes/authRoutes.js +0 -53
- package/src/routes/telemetryRoutes.js +0 -38
- package/src/services/uiService.js +0 -1520
- package/src/systemMetrics.js +0 -102
- /package/dist/{controllers → cjs/tlm-metric}/metricsController.cjs +0 -0
|
@@ -3,77 +3,70 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
6
|
+
exports.logout = exports.login = exports.check = void 0;
|
|
7
7
|
var _config = require("../config.cjs");
|
|
8
|
-
var _express = require("express");
|
|
9
|
-
var _cookie = require("cookie");
|
|
10
|
-
var _uiService = _interopRequireDefault(require("../services/uiService.cjs"));
|
|
11
8
|
var _jsonwebtoken = _interopRequireDefault(require("jsonwebtoken"));
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
var _logger = _interopRequireDefault(require("../utils/logger.cjs"));
|
|
10
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
+
const login = (req, res) => {
|
|
15
12
|
try {
|
|
16
13
|
const {
|
|
17
14
|
password
|
|
18
15
|
} = req.body;
|
|
19
16
|
if (password === _config.globalOasTlmConfig.password) {
|
|
20
|
-
|
|
17
|
+
const options = {
|
|
21
18
|
maxAge: _config.globalOasTlmConfig.apiKeyMaxAge,
|
|
22
19
|
httpOnly: true,
|
|
23
|
-
// The cookie only accessible by the web server
|
|
24
20
|
secure: true,
|
|
25
|
-
|
|
26
|
-
signed: false // Indicates if the cookie should be signed
|
|
21
|
+
signed: false
|
|
27
22
|
};
|
|
28
23
|
const apiKey = _jsonwebtoken.default.sign({
|
|
29
24
|
password: _config.globalOasTlmConfig.password
|
|
30
25
|
}, _config.globalOasTlmConfig.jwtSecret);
|
|
31
26
|
res.cookie('apiKey', apiKey, options);
|
|
32
|
-
|
|
27
|
+
res.status(200).json({
|
|
33
28
|
valid: true,
|
|
34
29
|
message: 'API Key is valid'
|
|
35
30
|
});
|
|
31
|
+
return;
|
|
36
32
|
}
|
|
37
33
|
res.status(400).json({
|
|
38
34
|
valid: false,
|
|
39
35
|
message: 'Invalid API Key'
|
|
40
36
|
});
|
|
41
37
|
} catch (error) {
|
|
42
|
-
|
|
38
|
+
_logger.default.log("Error: ", error);
|
|
43
39
|
res.status(500).json({
|
|
44
40
|
valid: false,
|
|
45
41
|
message: 'Internal server error'
|
|
46
42
|
});
|
|
47
43
|
}
|
|
48
|
-
}
|
|
49
|
-
|
|
44
|
+
};
|
|
45
|
+
exports.login = login;
|
|
46
|
+
const logout = (req, res) => {
|
|
50
47
|
res.clearCookie('apiKey');
|
|
51
48
|
res.redirect(_config.globalOasTlmConfig.baseURL + '/login');
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
router.get('/check', (req, res) => {
|
|
49
|
+
};
|
|
50
|
+
exports.logout = logout;
|
|
51
|
+
const check = (req, res) => {
|
|
56
52
|
if (!req.cookies.apiKey) {
|
|
57
|
-
|
|
53
|
+
res.status(200).json({
|
|
58
54
|
valid: false,
|
|
59
55
|
message: 'API Key is invalid'
|
|
60
56
|
});
|
|
57
|
+
return;
|
|
61
58
|
}
|
|
62
59
|
const decoded = _jsonwebtoken.default.verify(req.cookies.apiKey, _config.globalOasTlmConfig.jwtSecret);
|
|
63
60
|
if (decoded.password === _config.globalOasTlmConfig.password) {
|
|
64
|
-
|
|
61
|
+
res.status(200).json({
|
|
65
62
|
valid: true,
|
|
66
63
|
message: 'API Key is valid'
|
|
67
64
|
});
|
|
65
|
+
return;
|
|
68
66
|
}
|
|
69
67
|
res.status(200).json({
|
|
70
68
|
valid: false,
|
|
71
69
|
message: 'Invalid API Key'
|
|
72
70
|
});
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
const baseURL = _config.globalOasTlmConfig.baseURL;
|
|
76
|
-
res.send((0, _uiService.default)(baseURL).login);
|
|
77
|
-
});
|
|
78
|
-
var _default = exports.default = router;
|
|
79
|
-
module.exports = exports.default;
|
|
71
|
+
};
|
|
72
|
+
exports.check = check;
|
|
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.authMiddleware = authMiddleware;
|
|
7
7
|
var _config = require("../config.cjs");
|
|
8
8
|
var _jsonwebtoken = _interopRequireDefault(require("jsonwebtoken"));
|
|
9
|
-
function _interopRequireDefault(
|
|
9
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
10
|
function authMiddleware(req, res, next) {
|
|
11
11
|
const apiKey = req.cookies.apiKey;
|
|
12
12
|
if (apiKey) {
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _express = require("express");
|
|
8
|
+
var _authController = require("./authController.cjs");
|
|
9
|
+
const router = (0, _express.Router)();
|
|
10
|
+
router.post('/login', _authController.login);
|
|
11
|
+
router.get('/logout', _authController.logout);
|
|
12
|
+
router.get('/check', _authController.check);
|
|
13
|
+
var _default = exports.default = router;
|
|
14
|
+
module.exports = exports.default;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.resetLogs = exports.listLogs = exports.findLogs = void 0;
|
|
7
|
+
var _config = require("../config.cjs");
|
|
8
|
+
const listLogs = async (req, res) => {
|
|
9
|
+
try {
|
|
10
|
+
const logs = _config.globalOasTlmConfig.logExporter.getFinishedSpans();
|
|
11
|
+
res.send({
|
|
12
|
+
logsCount: logs.length,
|
|
13
|
+
logs: logs
|
|
14
|
+
});
|
|
15
|
+
} catch (err) {
|
|
16
|
+
console.error(err);
|
|
17
|
+
res.status(500).send({
|
|
18
|
+
error: 'Failed to list log data'
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
exports.listLogs = listLogs;
|
|
23
|
+
const findLogs = async (req, res) => {
|
|
24
|
+
const body = req.body;
|
|
25
|
+
const messageSearch = body?.search || null; // Search term for MiniSearch
|
|
26
|
+
const findQuery = body?.find || {}; // Query for NeDB
|
|
27
|
+
console.dir(`findLogs called with query: ${JSON.stringify(findQuery)} and search ${messageSearch}`, {
|
|
28
|
+
depth: 3
|
|
29
|
+
});
|
|
30
|
+
try {
|
|
31
|
+
const results = await new Promise((resolve, reject) => {
|
|
32
|
+
_config.globalOasTlmConfig.logExporter.find(findQuery, messageSearch, (err, docs) => {
|
|
33
|
+
if (err) return reject(err);
|
|
34
|
+
resolve(docs);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
const typedResults = results;
|
|
38
|
+
res.send({
|
|
39
|
+
logsCount: typedResults.length,
|
|
40
|
+
logs: typedResults
|
|
41
|
+
});
|
|
42
|
+
} catch (err) {
|
|
43
|
+
console.error(err);
|
|
44
|
+
res.status(500).send({
|
|
45
|
+
error: 'Failed to find logs',
|
|
46
|
+
details: err.message
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
exports.findLogs = findLogs;
|
|
51
|
+
const resetLogs = (req, res) => {
|
|
52
|
+
_config.globalOasTlmConfig.logExporter.reset();
|
|
53
|
+
res.send('Logs reset');
|
|
54
|
+
};
|
|
55
|
+
exports.resetLogs = resetLogs;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.logRoutes = exports.default = void 0;
|
|
7
|
+
var _express = require("express");
|
|
8
|
+
var _logController = require("./logController.cjs");
|
|
9
|
+
const logRoutes = exports.logRoutes = (0, _express.Router)();
|
|
10
|
+
logRoutes.get('/', _logController.listLogs);
|
|
11
|
+
logRoutes.post('/find', _logController.findLogs);
|
|
12
|
+
logRoutes.get('/reset', _logController.resetLogs);
|
|
13
|
+
var _default = exports.default = logRoutes;
|
|
@@ -5,9 +5,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.metricsRoutes = exports.default = void 0;
|
|
7
7
|
var _express = require("express");
|
|
8
|
-
var _metricsController = require("
|
|
8
|
+
var _metricsController = require("./metricsController.cjs");
|
|
9
9
|
const metricsRoutes = exports.metricsRoutes = (0, _express.Router)();
|
|
10
|
-
|
|
11
10
|
// Metrics Control
|
|
12
11
|
metricsRoutes.get('/', _metricsController.listMetrics);
|
|
13
12
|
metricsRoutes.post('/find', _metricsController.findMetrics);
|
|
@@ -3,29 +3,32 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.registerPlugin = exports.listPlugins =
|
|
6
|
+
exports.registerPlugin = exports.listPlugins = void 0;
|
|
7
7
|
var _config = require("../config.cjs");
|
|
8
8
|
var _axios = _interopRequireDefault(require("axios"));
|
|
9
9
|
var _importFromString = require("import-from-string");
|
|
10
10
|
var _dynamicInstaller = require("dynamic-installer");
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
var _logger = _interopRequireDefault(require("../utils/logger.cjs"));
|
|
12
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
+
// @ts-expect-error: import-from-string does not have proper type declarations
|
|
14
|
+
|
|
15
|
+
// @ts-expect-error: dynamic-installer does not have proper type declarations
|
|
16
|
+
|
|
14
17
|
const listPlugins = (req, res) => {
|
|
15
|
-
res.send(_config.globalOasTlmConfig.
|
|
18
|
+
res.send(_config.globalOasTlmConfig.dynamicSpanExporter.getPlugins().map(plugin => {
|
|
16
19
|
return {
|
|
17
|
-
id:
|
|
18
|
-
name:
|
|
19
|
-
url:
|
|
20
|
-
active:
|
|
20
|
+
id: plugin.id,
|
|
21
|
+
name: plugin.name,
|
|
22
|
+
url: plugin.url,
|
|
23
|
+
active: plugin.active
|
|
21
24
|
};
|
|
22
25
|
}));
|
|
23
26
|
};
|
|
24
27
|
exports.listPlugins = listPlugins;
|
|
25
28
|
const registerPlugin = async (req, res) => {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
+
const pluginResource = req.body;
|
|
30
|
+
_logger.default.info(`Plugin Registration Request: = ${JSON.stringify(req.body, null, 2)}...`);
|
|
31
|
+
_logger.default.info(`Getting plugin at ${pluginResource.url}...`);
|
|
29
32
|
let pluginCode;
|
|
30
33
|
if (!pluginResource.url && !pluginResource.code) {
|
|
31
34
|
res.status(400).send(`Plugin code or URL must be provided`);
|
|
@@ -47,72 +50,59 @@ const registerPlugin = async (req, res) => {
|
|
|
47
50
|
const dependenciesStatus = await (0, _dynamicInstaller.installDependencies)(pluginResource.install);
|
|
48
51
|
if (!dependenciesStatus.success) {
|
|
49
52
|
if (pluginResource.install.ignoreErrors === true) {
|
|
50
|
-
|
|
53
|
+
_logger.default.warn(`Warning: Error installing dependencies: ${JSON.stringify(dependenciesStatus.details)}`);
|
|
51
54
|
} else {
|
|
52
55
|
res.status(400).send(`Error installing dependencies: ${JSON.stringify(dependenciesStatus.details)}`);
|
|
53
56
|
return;
|
|
54
57
|
}
|
|
55
58
|
}
|
|
56
59
|
}
|
|
57
|
-
|
|
58
|
-
|
|
60
|
+
_logger.default.info("Plugin size: " + pluginCode?.length);
|
|
61
|
+
_logger.default.info("Plugin format: " + pluginResource?.moduleFormat);
|
|
59
62
|
if (pluginResource?.moduleFormat && pluginResource.moduleFormat.toUpperCase() == "ESM") {
|
|
60
|
-
|
|
63
|
+
_logger.default.info("ESM detected");
|
|
61
64
|
module = await (0, _importFromString.importFromString)(pluginCode);
|
|
62
65
|
} else {
|
|
63
|
-
|
|
66
|
+
_logger.default.info("CJS detected (default)");
|
|
64
67
|
module = await (0, _importFromString.requireFromString)(pluginCode);
|
|
65
|
-
|
|
68
|
+
_logger.default.info(module);
|
|
66
69
|
}
|
|
67
70
|
} catch (error) {
|
|
68
|
-
|
|
71
|
+
_logger.default.error(`Error loading plugin: ${error}`);
|
|
69
72
|
res.status(400).send(`Error loading plugin: ${error}`);
|
|
70
73
|
return;
|
|
71
74
|
}
|
|
72
75
|
const plugin = module.default?.plugin ?? module.plugin;
|
|
73
76
|
if (plugin == undefined) {
|
|
74
77
|
res.status(400).send(`Plugin code should export a "plugin" object`);
|
|
75
|
-
|
|
78
|
+
_logger.default.info("Error in plugin code: no plugin object exported");
|
|
76
79
|
return;
|
|
77
80
|
}
|
|
78
|
-
for (
|
|
81
|
+
for (const requiredFunction of ["load", "getName", "isConfigured"]) {
|
|
79
82
|
if (plugin[requiredFunction] == undefined) {
|
|
80
83
|
res.status(400).send(`The plugin code exports a "plugin" object, however it should have a "${requiredFunction}" method`);
|
|
81
|
-
|
|
84
|
+
_logger.default.info("Error in plugin code: some required functions are missing");
|
|
82
85
|
return;
|
|
83
86
|
}
|
|
84
87
|
}
|
|
85
88
|
try {
|
|
86
89
|
await plugin.load(pluginResource.config);
|
|
87
90
|
} catch (error) {
|
|
88
|
-
|
|
91
|
+
_logger.default.error(`Error loading plugin configuration: ${error}`);
|
|
89
92
|
res.status(400).send(`Error loading plugin configuration: ${error}`);
|
|
90
93
|
return;
|
|
91
94
|
}
|
|
92
95
|
if (plugin.isConfigured()) {
|
|
93
|
-
|
|
96
|
+
_logger.default.info(`Loaded plugin <${plugin.getName()}>`);
|
|
94
97
|
pluginResource.plugin = plugin;
|
|
95
98
|
pluginResource.name = plugin.getName();
|
|
96
99
|
pluginResource.active = true;
|
|
97
|
-
_config.globalOasTlmConfig.
|
|
98
|
-
_config.globalOasTlmConfig.
|
|
100
|
+
_config.globalOasTlmConfig.dynamicSpanExporter.pushPlugin(pluginResource);
|
|
101
|
+
_config.globalOasTlmConfig.dynamicSpanExporter.activatePlugin(pluginResource.plugin);
|
|
99
102
|
res.status(201).send(`Plugin registered`);
|
|
100
103
|
} else {
|
|
101
|
-
|
|
104
|
+
_logger.default.error(`Plugin <${plugin.getName()}> can not be configured`);
|
|
102
105
|
res.status(400).send(`Plugin configuration problem`);
|
|
103
106
|
}
|
|
104
107
|
};
|
|
105
|
-
exports.registerPlugin = registerPlugin;
|
|
106
|
-
const checkApiKey = (req, res) => {
|
|
107
|
-
const apiKey = req.query.apiKey || req.body.apiKey;
|
|
108
|
-
if (apiKey === process.env.APIKEY) {
|
|
109
|
-
res.status(200).send({
|
|
110
|
-
valid: true
|
|
111
|
-
});
|
|
112
|
-
} else {
|
|
113
|
-
res.status(401).send({
|
|
114
|
-
valid: false
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
};
|
|
118
|
-
exports.checkApiKey = checkApiKey;
|
|
108
|
+
exports.registerPlugin = registerPlugin;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.pluginRoutes = exports.default = void 0;
|
|
7
|
+
var _express = require("express");
|
|
8
|
+
var _pluginController = require("./pluginController.cjs");
|
|
9
|
+
const pluginRoutes = exports.pluginRoutes = (0, _express.Router)();
|
|
10
|
+
// Plugins
|
|
11
|
+
pluginRoutes.get('/plugins', _pluginController.listPlugins);
|
|
12
|
+
pluginRoutes.post('/plugins', _pluginController.registerPlugin);
|
|
13
|
+
var _default = exports.default = pluginRoutes;
|
|
@@ -3,35 +3,33 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.stopTelemetry = exports.statusTelemetry = exports.startTelemetry = exports.resetTelemetry = exports.listTelemetry = exports.
|
|
7
|
-
var _v = _interopRequireDefault(require("v8"));
|
|
6
|
+
exports.stopTelemetry = exports.statusTelemetry = exports.startTelemetry = exports.resetTelemetry = exports.listTelemetry = exports.findTelemetry = void 0;
|
|
8
7
|
var _config = require("../config.cjs");
|
|
9
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
10
8
|
const startTelemetry = (req, res) => {
|
|
11
|
-
_config.globalOasTlmConfig.
|
|
9
|
+
_config.globalOasTlmConfig.dynamicSpanExporter.exporter.start();
|
|
12
10
|
res.send('Telemetry started');
|
|
13
11
|
};
|
|
14
12
|
exports.startTelemetry = startTelemetry;
|
|
15
13
|
const stopTelemetry = (req, res) => {
|
|
16
|
-
_config.globalOasTlmConfig.
|
|
14
|
+
_config.globalOasTlmConfig.dynamicSpanExporter.exporter.stop();
|
|
17
15
|
res.send('Telemetry stopped');
|
|
18
16
|
};
|
|
19
17
|
exports.stopTelemetry = stopTelemetry;
|
|
20
18
|
const statusTelemetry = (req, res) => {
|
|
21
|
-
const isRunning = _config.globalOasTlmConfig.
|
|
19
|
+
const isRunning = _config.globalOasTlmConfig.dynamicSpanExporter.exporter.isRunning() || false;
|
|
22
20
|
res.send({
|
|
23
21
|
active: isRunning
|
|
24
22
|
});
|
|
25
23
|
};
|
|
26
24
|
exports.statusTelemetry = statusTelemetry;
|
|
27
25
|
const resetTelemetry = (req, res) => {
|
|
28
|
-
_config.globalOasTlmConfig.
|
|
26
|
+
_config.globalOasTlmConfig.dynamicSpanExporter.exporter.reset();
|
|
29
27
|
res.send('Telemetry reset');
|
|
30
28
|
};
|
|
31
29
|
exports.resetTelemetry = resetTelemetry;
|
|
32
30
|
const listTelemetry = async (req, res) => {
|
|
33
31
|
try {
|
|
34
|
-
const spans = await _config.globalOasTlmConfig.
|
|
32
|
+
const spans = await _config.globalOasTlmConfig.dynamicSpanExporter.exporter.getFinishedSpans();
|
|
35
33
|
res.send({
|
|
36
34
|
spansCount: spans.length,
|
|
37
35
|
spans: spans
|
|
@@ -44,21 +42,12 @@ const listTelemetry = async (req, res) => {
|
|
|
44
42
|
}
|
|
45
43
|
};
|
|
46
44
|
exports.listTelemetry = listTelemetry;
|
|
47
|
-
const heapStats = (req, res) => {
|
|
48
|
-
var heapStats = _v.default.getHeapStatistics();
|
|
49
|
-
var roundedHeapStats = Object.getOwnPropertyNames(heapStats).reduce(function (map, stat) {
|
|
50
|
-
map[stat] = Math.round(heapStats[stat] / 1024 / 1024 * 1000) / 1000;
|
|
51
|
-
return map;
|
|
52
|
-
}, {});
|
|
53
|
-
roundedHeapStats['units'] = 'MB';
|
|
54
|
-
res.send(roundedHeapStats);
|
|
55
|
-
};
|
|
56
|
-
exports.heapStats = heapStats;
|
|
57
45
|
const findTelemetry = (req, res) => {
|
|
58
46
|
const body = req.body;
|
|
59
47
|
const search = body?.search ? body.search : {};
|
|
60
48
|
if (body?.flags?.containsRegex) {
|
|
61
49
|
try {
|
|
50
|
+
//@ts-expect-error yes
|
|
62
51
|
body.config?.regexIds?.forEach(regexId => {
|
|
63
52
|
if (search[regexId]) search[regexId] = new RegExp(search[regexId]);
|
|
64
53
|
});
|
|
@@ -72,7 +61,7 @@ const findTelemetry = (req, res) => {
|
|
|
72
61
|
return;
|
|
73
62
|
}
|
|
74
63
|
}
|
|
75
|
-
_config.globalOasTlmConfig.
|
|
64
|
+
_config.globalOasTlmConfig.dynamicSpanExporter.exporter.find(search, (err, docs) => {
|
|
76
65
|
if (err) {
|
|
77
66
|
console.error(err);
|
|
78
67
|
res.status(404).send({
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.traceRoutes = exports.default = void 0;
|
|
7
|
+
var _express = require("express");
|
|
8
|
+
var _traceController = require("./traceController.cjs");
|
|
9
|
+
const traceRoutes = exports.traceRoutes = (0, _express.Router)();
|
|
10
|
+
traceRoutes.get('/', _traceController.listTelemetry);
|
|
11
|
+
traceRoutes.post('/find', _traceController.findTelemetry);
|
|
12
|
+
// Telemetry Control
|
|
13
|
+
traceRoutes.get('/start', _traceController.startTelemetry);
|
|
14
|
+
traceRoutes.get('/stop', _traceController.stopTelemetry);
|
|
15
|
+
traceRoutes.get('/status', _traceController.statusTelemetry);
|
|
16
|
+
traceRoutes.get('/reset', _traceController.resetTelemetry);
|
|
17
|
+
var _default = exports.default = traceRoutes;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.uiRoutes = exports.default = void 0;
|
|
7
|
+
var _express = _interopRequireWildcard(require("express"));
|
|
8
|
+
var _path = _interopRequireDefault(require("path"));
|
|
9
|
+
var _url = require("url");
|
|
10
|
+
var _logger = _interopRequireDefault(require("../utils/logger.cjs"));
|
|
11
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
13
|
+
let relativePath = '../../ui';
|
|
14
|
+
if (process.env.OASTLM_ENV === 'development') {
|
|
15
|
+
relativePath = '../../dist/ui';
|
|
16
|
+
_logger.default.warn('🚧 This process is serving the OASTLM UI from the build directory, but you are in development mode. For live updates, run the React app separately and access it at http://localhost:5173/.');
|
|
17
|
+
}
|
|
18
|
+
const customFilename = (0, _url.fileURLToPath)(require('url').pathToFileURL(__filename).toString());
|
|
19
|
+
const customDirname = _path.default.dirname(customFilename);
|
|
20
|
+
const staticFilesPath = _path.default.join(customDirname, relativePath);
|
|
21
|
+
const uiRoutes = exports.uiRoutes = (0, _express.Router)();
|
|
22
|
+
// This only works once the app is built: src/ --> dist/esm/
|
|
23
|
+
// This file: dist/esm/routes/
|
|
24
|
+
// UI bundle: dist/ui/
|
|
25
|
+
// For development, the UI is served separately.
|
|
26
|
+
uiRoutes.use(_express.default.static(staticFilesPath));
|
|
27
|
+
uiRoutes.get('*', (_req, res) => {
|
|
28
|
+
// Serve the index.html file for all routes
|
|
29
|
+
res.sendFile(_path.default.join(staticFilesPath, 'index.html'));
|
|
30
|
+
});
|
|
31
|
+
var _default = exports.default = uiRoutes;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.specLoader = exports.heapStats = void 0;
|
|
7
|
+
var _config = require("../config.cjs");
|
|
8
|
+
var _fs = require("fs");
|
|
9
|
+
var _path = _interopRequireDefault(require("path"));
|
|
10
|
+
var _jsYaml = _interopRequireDefault(require("js-yaml"));
|
|
11
|
+
var _nodeV = _interopRequireDefault(require("node:v8"));
|
|
12
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
+
const specLoader = (_req, res) => {
|
|
14
|
+
if (_config.globalOasTlmConfig.specFileName) {
|
|
15
|
+
try {
|
|
16
|
+
const data = (0, _fs.readFileSync)(_config.globalOasTlmConfig.specFileName, {
|
|
17
|
+
encoding: 'utf8',
|
|
18
|
+
flag: 'r'
|
|
19
|
+
});
|
|
20
|
+
const extension = _path.default.extname(_config.globalOasTlmConfig.specFileName);
|
|
21
|
+
let json = data;
|
|
22
|
+
if (extension == "yaml")
|
|
23
|
+
//@ts-expect-error yes
|
|
24
|
+
json = JSON.stringify(_jsYaml.default.SafeLoad(data), null, 2);
|
|
25
|
+
res.setHeader('Content-Type', 'application/json');
|
|
26
|
+
res.send(json);
|
|
27
|
+
} catch (e) {
|
|
28
|
+
console.error(`ERROR loading spec file ${_config.globalOasTlmConfig.specFileName}: ${e}`);
|
|
29
|
+
}
|
|
30
|
+
} else if (_config.globalOasTlmConfig.spec) {
|
|
31
|
+
let spec = null;
|
|
32
|
+
try {
|
|
33
|
+
spec = JSON.parse(_config.globalOasTlmConfig.spec);
|
|
34
|
+
} catch (ej) {
|
|
35
|
+
try {
|
|
36
|
+
spec = JSON.stringify(_jsYaml.default.load(_config.globalOasTlmConfig.spec), null, 2);
|
|
37
|
+
} catch (ey) {
|
|
38
|
+
console.error(`Error parsing spec: ${ej} - ${ey}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (!spec) {
|
|
42
|
+
res.status(404);
|
|
43
|
+
} else {
|
|
44
|
+
res.setHeader('Content-Type', 'application/json');
|
|
45
|
+
res.send(spec);
|
|
46
|
+
}
|
|
47
|
+
} else {
|
|
48
|
+
res.status(404);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
exports.specLoader = specLoader;
|
|
52
|
+
const heapStats = (req, res) => {
|
|
53
|
+
const heapStats = _nodeV.default.getHeapStatistics();
|
|
54
|
+
const roundedHeapStats = Object.getOwnPropertyNames(heapStats).reduce(function (map, stat) {
|
|
55
|
+
//@ts-expect-error yes
|
|
56
|
+
map[stat] = Math.round(heapStats[stat] / 1024 / 1024 * 1000) / 1000;
|
|
57
|
+
return map;
|
|
58
|
+
}, {});
|
|
59
|
+
// @ts-expect-error yes
|
|
60
|
+
roundedHeapStats['units'] = 'MB';
|
|
61
|
+
res.send(roundedHeapStats);
|
|
62
|
+
};
|
|
63
|
+
exports.heapStats = heapStats;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.utilsRoutes = exports.default = void 0;
|
|
7
|
+
var _express = require("express");
|
|
8
|
+
var _utilController = require("./utilController.cjs");
|
|
9
|
+
const utilsRoutes = exports.utilsRoutes = (0, _express.Router)();
|
|
10
|
+
utilsRoutes.get('/spec', _utilController.specLoader);
|
|
11
|
+
utilsRoutes.get('/heapStats', _utilController.heapStats);
|
|
12
|
+
var _default = exports.default = utilsRoutes;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.configureRoutes = void 0;
|
|
7
|
+
var _express = require("express");
|
|
8
|
+
var _logger = _interopRequireDefault(require("./utils/logger.cjs"));
|
|
9
|
+
var _cors = _interopRequireDefault(require("cors"));
|
|
10
|
+
var _config = require("./config.cjs");
|
|
11
|
+
var _metricsRoutes = _interopRequireDefault(require("./tlm-metric/metricsRoutes.cjs"));
|
|
12
|
+
var _cookieParser = _interopRequireDefault(require("cookie-parser"));
|
|
13
|
+
var _authRoutes = _interopRequireDefault(require("./tlm-auth/authRoutes.cjs"));
|
|
14
|
+
var _uiRoutes = _interopRequireDefault(require("./tlm-ui/uiRoutes.cjs"));
|
|
15
|
+
var _traceRoutes = _interopRequireDefault(require("./tlm-trace/traceRoutes.cjs"));
|
|
16
|
+
var _authMiddleware = require("./tlm-auth/authMiddleware.cjs");
|
|
17
|
+
var _utilRoutes = _interopRequireDefault(require("./tlm-util/utilRoutes.cjs"));
|
|
18
|
+
var _logRoutes = _interopRequireDefault(require("./tlm-log/logRoutes.cjs"));
|
|
19
|
+
var _aiRoutes = _interopRequireDefault(require("./tlm-ai/aiRoutes.cjs"));
|
|
20
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
21
|
+
const configureRoutes = router => {
|
|
22
|
+
if (process.env.OASTLM_ENV === 'development') {
|
|
23
|
+
_logger.default.info("Running in development mode, enabling CORS for all origins");
|
|
24
|
+
router.use((0, _cors.default)({
|
|
25
|
+
origin: '*',
|
|
26
|
+
// Permitir todas las solicitudes en desarrollo
|
|
27
|
+
methods: ['GET', 'POST', 'PUT', 'DELETE'],
|
|
28
|
+
allowedHeaders: ['Content-Type', 'Authorization']
|
|
29
|
+
}));
|
|
30
|
+
}
|
|
31
|
+
router.use((req, res, next) => {
|
|
32
|
+
if (req.body !== undefined) {
|
|
33
|
+
return next(); // Already parsed, no need to parse again.
|
|
34
|
+
}
|
|
35
|
+
return (0, _express.json)()(req, res, next);
|
|
36
|
+
});
|
|
37
|
+
const allAuthMiddlewares = getWrappedMiddlewares(() => _config.globalOasTlmConfig.authEnabled, [(0, _cookieParser.default)(), _authRoutes.default, _authMiddleware.authMiddleware]);
|
|
38
|
+
const baseURL = _config.globalOasTlmConfig.baseURL;
|
|
39
|
+
router.use(baseURL, allAuthMiddlewares);
|
|
40
|
+
// WARNING: This path must be the same as the one used in the UI package App.tsx "oas-telemetry-ui"
|
|
41
|
+
router.use(baseURL + "/traces", _traceRoutes.default);
|
|
42
|
+
router.use(baseURL + "/metrics", _metricsRoutes.default);
|
|
43
|
+
router.use(baseURL + "/logs", _logRoutes.default);
|
|
44
|
+
router.use(baseURL + "/ai", getWrappedMiddlewares(() => process.env.OASTLM_AI_OPENAI_API_KEY !== null && process.env.OASTLM_AI_OPENAI_API_KEY !== "", [_aiRoutes.default]));
|
|
45
|
+
router.use(baseURL + "/oas-telemetry-ui", _uiRoutes.default);
|
|
46
|
+
router.use(baseURL + "/utils", _utilRoutes.default);
|
|
47
|
+
//redirect to the UI when accessing the base URL
|
|
48
|
+
router.get(baseURL, (req, res) => {
|
|
49
|
+
res.redirect(baseURL + "/oas-telemetry-ui");
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* This function wraps the provided middleware functions with a condition callback.
|
|
54
|
+
* If the condition callback returns true, the middleware/router will be executed.
|
|
55
|
+
* If the condition callback returns false, the middleware/router will be skipped.
|
|
56
|
+
*
|
|
57
|
+
* @callback {function} conditionCallback A callback function that returns a boolean to determine if the middleware should be used.
|
|
58
|
+
* @param {Array} middlewares An array of middleware or routers to be wrapped.
|
|
59
|
+
* @returns {Array} An array of wrapped middleware functions.
|
|
60
|
+
*/
|
|
61
|
+
exports.configureRoutes = configureRoutes;
|
|
62
|
+
function getWrappedMiddlewares(conditionCallback, middlewares) {
|
|
63
|
+
return middlewares.map(middleware => {
|
|
64
|
+
return function (req, res, next) {
|
|
65
|
+
if (conditionCallback()) {
|
|
66
|
+
if (typeof middleware === 'function') {
|
|
67
|
+
// look for handle property, if it exists, it's a router. If not call middleware
|
|
68
|
+
if (middleware.handle) {
|
|
69
|
+
middleware.handle(req, res, next);
|
|
70
|
+
} else {
|
|
71
|
+
middleware(req, res, next);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
} else {
|
|
75
|
+
next();
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
});
|
|
79
|
+
}
|