@oas-tools/oas-telemetry 0.7.1 → 0.8.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +21 -2
- package/README.md +1 -2
- package/dist/cjs/config/bootConfig.cjs +19 -14
- package/dist/cjs/config/config.cjs +112 -125
- package/dist/cjs/config/config.types.cjs +1 -4
- package/dist/cjs/docs/openapi.yaml +158 -4
- package/dist/cjs/index.cjs +27 -30
- package/dist/cjs/routesManager.cjs +62 -70
- package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.cjs +202 -190
- package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.cjs +204 -99
- package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.cjs +152 -116
- package/dist/cjs/telemetry/custom-implementations/instrumentations/logsInstrumentation.cjs +92 -0
- package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/Chunk.cjs +159 -0
- package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/Series.cjs +168 -0
- package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/SeriesRegistry.cjs +389 -0
- package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/types.cjs +2 -0
- package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/utils.cjs +77 -0
- package/dist/cjs/telemetry/custom-implementations/processors/dynamicMultiLogProcessor.cjs +65 -63
- package/dist/cjs/telemetry/custom-implementations/processors/dynamicMultiSpanProcessor.cjs +63 -62
- package/dist/cjs/telemetry/custom-implementations/utils/circular.cjs +47 -47
- package/dist/cjs/telemetry/custom-implementations/utils/storagePath.cjs +39 -0
- package/dist/cjs/telemetry/custom-implementations/wrappers.cjs +141 -138
- package/dist/cjs/telemetry/initializeTelemetry.cjs +35 -91
- package/dist/cjs/telemetry/telemetryConfigurator.cjs +70 -72
- package/dist/cjs/telemetry/telemetryRegistry.cjs +45 -31
- package/dist/cjs/tlm-ai/agent.cjs +49 -64
- package/dist/cjs/tlm-ai/aiController.cjs +54 -76
- package/dist/cjs/tlm-ai/aiRoutes.cjs +17 -20
- package/dist/cjs/tlm-ai/aiService.cjs +91 -95
- package/dist/cjs/tlm-ai/tools.cjs +177 -174
- package/dist/cjs/tlm-auth/authController.cjs +80 -123
- package/dist/cjs/tlm-auth/authMiddleware.cjs +25 -30
- package/dist/cjs/tlm-auth/authRoutes.cjs +11 -14
- package/dist/cjs/tlm-log/logController.cjs +171 -116
- package/dist/cjs/tlm-log/logRoutes.cjs +20 -20
- package/dist/cjs/tlm-metric/metricsController.cjs +211 -121
- package/dist/cjs/tlm-metric/metricsRoutes.cjs +23 -20
- package/dist/cjs/tlm-plugin/pluginController.cjs +128 -140
- package/dist/cjs/tlm-plugin/pluginProcess.cjs +89 -94
- package/dist/cjs/tlm-plugin/pluginRoutes.cjs +11 -14
- package/dist/cjs/tlm-plugin/pluginService.cjs +73 -74
- package/dist/cjs/tlm-trace/traceController.cjs +169 -117
- package/dist/cjs/tlm-trace/traceRoutes.cjs +20 -20
- package/dist/cjs/tlm-ui/uiRoutes.cjs +63 -32
- package/dist/cjs/tlm-util/utilController.cjs +68 -70
- package/dist/cjs/tlm-util/utilRoutes.cjs +51 -63
- package/dist/cjs/types/index.cjs +2 -5
- package/dist/cjs/utils/logger.cjs +38 -43
- package/dist/cjs/utils/regexUtils.cjs +22 -22
- package/dist/esm/config/bootConfig.js +6 -0
- package/dist/esm/config/config.js +1 -2
- package/dist/esm/docs/openapi.yaml +158 -4
- package/dist/esm/index.js +9 -8
- package/dist/esm/routesManager.js +6 -10
- package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.js +47 -8
- package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.js +164 -48
- package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.js +69 -29
- package/dist/esm/telemetry/custom-implementations/instrumentations/logsInstrumentation.js +85 -0
- package/dist/esm/telemetry/custom-implementations/metrics/tsdb/Chunk.js +155 -0
- package/dist/esm/telemetry/custom-implementations/metrics/tsdb/Series.js +164 -0
- package/dist/esm/telemetry/custom-implementations/metrics/tsdb/SeriesRegistry.js +382 -0
- package/dist/esm/telemetry/custom-implementations/metrics/tsdb/types.js +1 -0
- package/dist/esm/telemetry/custom-implementations/metrics/tsdb/utils.js +74 -0
- package/dist/esm/telemetry/custom-implementations/processors/dynamicMultiLogProcessor.js +2 -1
- package/dist/esm/telemetry/custom-implementations/processors/dynamicMultiSpanProcessor.js +1 -1
- package/dist/esm/telemetry/custom-implementations/utils/storagePath.js +33 -0
- package/dist/esm/telemetry/custom-implementations/wrappers.js +5 -2
- package/dist/esm/telemetry/initializeTelemetry.js +27 -69
- package/dist/esm/telemetry/telemetryConfigurator.js +42 -40
- package/dist/esm/telemetry/telemetryRegistry.js +12 -1
- package/dist/esm/tlm-ai/agent.js +5 -3
- package/dist/esm/tlm-ai/aiController.js +3 -3
- package/dist/esm/tlm-ai/aiService.js +6 -2
- package/dist/esm/tlm-ai/tools.js +5 -9
- package/dist/esm/tlm-auth/authController.js +3 -2
- package/dist/esm/tlm-log/logController.js +84 -4
- package/dist/esm/tlm-log/logRoutes.js +5 -2
- package/dist/esm/tlm-metric/metricsController.js +172 -49
- package/dist/esm/tlm-metric/metricsRoutes.js +10 -4
- package/dist/esm/tlm-plugin/pluginController.js +6 -11
- package/dist/esm/tlm-plugin/pluginService.js +2 -4
- package/dist/esm/tlm-trace/traceController.js +102 -16
- package/dist/esm/tlm-trace/traceRoutes.js +5 -2
- package/dist/esm/tlm-ui/uiRoutes.js +5 -5
- package/dist/esm/tlm-util/utilController.js +3 -9
- package/dist/esm/tlm-util/utilRoutes.js +2 -2
- package/dist/types/config/bootConfig.d.ts +4 -0
- package/dist/types/config/config.d.ts +36 -7
- package/dist/types/config/config.types.d.ts +6 -0
- package/dist/types/index.d.ts +2 -3
- package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.d.ts +4 -1
- package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.d.ts +60 -15
- package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.d.ts +9 -4
- package/dist/types/telemetry/custom-implementations/instrumentations/logsInstrumentation.d.ts +23 -0
- package/dist/types/telemetry/custom-implementations/metrics/tsdb/Chunk.d.ts +49 -0
- package/dist/types/telemetry/custom-implementations/metrics/tsdb/Series.d.ts +67 -0
- package/dist/types/telemetry/custom-implementations/metrics/tsdb/SeriesRegistry.d.ts +69 -0
- package/dist/types/telemetry/custom-implementations/metrics/tsdb/types.d.ts +68 -0
- package/dist/types/telemetry/custom-implementations/metrics/tsdb/utils.d.ts +21 -0
- package/dist/types/telemetry/custom-implementations/processors/dynamicMultiLogProcessor.d.ts +2 -2
- package/dist/types/telemetry/custom-implementations/utils/storagePath.d.ts +12 -0
- package/dist/types/telemetry/custom-implementations/wrappers.d.ts +1 -1
- package/dist/types/telemetry/telemetryConfigurator.d.ts +1 -1
- package/dist/types/telemetry/telemetryRegistry.d.ts +8 -0
- package/dist/types/tlm-ai/agent.d.ts +1 -1
- package/dist/types/tlm-ai/aiService.d.ts +1 -1
- package/dist/types/tlm-log/logController.d.ts +2 -0
- package/dist/types/tlm-metric/metricsController.d.ts +16 -2
- package/dist/types/tlm-trace/traceController.d.ts +3 -1
- package/dist/types/types/index.d.ts +2 -2
- package/dist/ui/assets/{ApiDocsPage-C_VVPPHa.js → ApiDocsPage-BFUrXE5F.js} +2 -2
- package/dist/ui/assets/CollapsibleCard-STA1GVQO.js +1 -0
- package/dist/ui/assets/DevToolsPage-BRSfZqO_.js +1 -0
- package/dist/ui/assets/LandingPage-DzeDy7q7.js +6 -0
- package/dist/ui/assets/LogsPage-BeiFrV2X.js +1 -0
- package/dist/ui/assets/{NotFoundPage-B3quk3P1.js → NotFoundPage-fRNOatbM.js} +1 -1
- package/dist/ui/assets/PluginCreatePage-Ch_RXsdf.js +50 -0
- package/dist/ui/assets/PluginPage-Cl65ZZ_n.js +27 -0
- package/dist/ui/assets/TraceSpansPage-BoK4M5Hh.js +6 -0
- package/dist/ui/assets/VirtualizedListPanel-zcj0v7DL.js +16 -0
- package/dist/ui/assets/alert-BkNVKxJN.js +1133 -0
- package/dist/ui/assets/badge-CN7FeufU.js +1 -0
- package/dist/ui/assets/{chevron-down-CPsvsmqj.js → chevron-down-CG--ounh.js} +1 -1
- package/dist/ui/assets/{chevron-up-Df9jMo1X.js → chevron-up-B6tzMAOm.js} +1 -1
- package/dist/ui/assets/{circle-alert-DOPQPvU8.js → circle-alert-BDF8Tq9y.js} +1 -1
- package/dist/ui/assets/dialog-BrpWNk36.js +15 -0
- package/dist/ui/assets/index-6xOVKwKn.js +305 -0
- package/dist/ui/assets/index-D6f1KjWV.css +1 -0
- package/dist/ui/assets/index-D96rVSkR.js +1 -0
- package/dist/ui/assets/info-99kuqpbx.js +6 -0
- package/dist/ui/assets/{input-Dzvg_ZEZ.js → input-B-01QDg_.js} +1 -1
- package/dist/ui/assets/label-CQLeZjM1.js +1 -0
- package/dist/ui/assets/{loader-circle-CrvlRy5o.js → loader-circle-BoDGk-BO.js} +1 -1
- package/dist/ui/assets/{loginPage-qa4V-B70.js → loginPage-8F4EEd1B.js} +1 -1
- package/dist/ui/assets/metrics-page-D1GxaB_c.css +1 -0
- package/dist/ui/assets/metrics-page-DPtteXqY.js +31 -0
- package/dist/ui/assets/popover-DS_8DYYt.js +11 -0
- package/dist/ui/assets/select-DYjegiXi.js +6 -0
- package/dist/ui/assets/separator-DGsRxIrl.js +6 -0
- package/dist/ui/assets/severityOptions-DEOvJqC9.js +11 -0
- package/dist/ui/assets/square-pen-DPhgYz6O.js +6 -0
- package/dist/ui/assets/switch-Di9NJH2A.js +1 -0
- package/dist/ui/assets/trace-DJq1miYa.js +1 -0
- package/dist/ui/assets/upload-BiLTpCnX.js +11 -0
- package/dist/ui/assets/{utilService-DNyqzwj0.js → utilService-CNZOmadC.js} +1 -1
- package/dist/ui/assets/wand-sparkles-CPoBNFFg.js +6 -0
- package/dist/ui/index.html +2 -2
- package/package.json +44 -48
- package/dist/ui/assets/CollapsibleCard-B3KR_8mL.js +0 -1
- package/dist/ui/assets/DevToolsPage-OyZcDcmw.js +0 -1
- package/dist/ui/assets/LandingPage-CppFBA6K.js +0 -6
- package/dist/ui/assets/LogsPage-9Fq8GArS.js +0 -26
- package/dist/ui/assets/PluginCreatePage-X_aCH4t4.js +0 -50
- package/dist/ui/assets/PluginPage-DMDSihrZ.js +0 -27
- package/dist/ui/assets/alert-jQ9HCPIf.js +0 -1133
- package/dist/ui/assets/badge-CNq0-mH5.js +0 -1
- package/dist/ui/assets/card-DFAwwhN3.js +0 -1
- package/dist/ui/assets/index-BkD6DijD.js +0 -15
- package/dist/ui/assets/index-CERGVYZK.js +0 -292
- package/dist/ui/assets/index-CSIPf9qw.css +0 -1
- package/dist/ui/assets/label-DuVnkZ4q.js +0 -1
- package/dist/ui/assets/select-DhS8YUtJ.js +0 -1
- package/dist/ui/assets/separator-isK4chBP.js +0 -6
- package/dist/ui/assets/severityOptions-O38dSOfk.js +0 -11
- package/dist/ui/assets/switch-Z3mImG9n.js +0 -1
- package/dist/ui/assets/tabs-_77MUUQe.js +0 -16
- package/dist/ui/assets/upload-C1LT4Gkb.js +0 -16
|
@@ -1,33 +1,28 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
});
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.getAuthMiddleware = getAuthMiddleware;
|
|
7
|
-
|
|
8
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
|
+
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
9
8
|
function getAuthMiddleware(oasTlmConfig) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
};
|
|
33
|
-
}
|
|
9
|
+
return function authMiddleware(req, res, next) {
|
|
10
|
+
if (!oasTlmConfig.auth.enabled) {
|
|
11
|
+
return next();
|
|
12
|
+
}
|
|
13
|
+
const token = req.cookies["oas-tlm-access-token"];
|
|
14
|
+
if (!token) {
|
|
15
|
+
res.status(401).json({ valid: false, message: "No access token" });
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
const payload = jsonwebtoken_1.default.verify(token, oasTlmConfig.auth.jwtSecret);
|
|
20
|
+
if (payload.type !== "access")
|
|
21
|
+
throw new Error("Invalid token type");
|
|
22
|
+
return next();
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
res.status(401).json({ valid: false, message: "Invalid access token" });
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
}
|
|
@@ -1,17 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.getAuthRoutes = void 0;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const getAuthRoutes = oasTlmConfig => {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
4
|
+
const express_1 = require("express");
|
|
5
|
+
const authController_js_1 = require("./authController.cjs");
|
|
6
|
+
const getAuthRoutes = (oasTlmConfig) => {
|
|
7
|
+
const router = (0, express_1.Router)();
|
|
8
|
+
router.post('/login', (0, authController_js_1.getLogin)(oasTlmConfig));
|
|
9
|
+
router.post('/refresh', (0, authController_js_1.getRefresh)(oasTlmConfig));
|
|
10
|
+
router.post('/logout', (0, authController_js_1.getLogout)(oasTlmConfig));
|
|
11
|
+
router.get('/enabled', (0, authController_js_1.getAuthEnabled)(oasTlmConfig));
|
|
12
|
+
return router;
|
|
16
13
|
};
|
|
17
|
-
exports.getAuthRoutes = getAuthRoutes;
|
|
14
|
+
exports.getAuthRoutes = getAuthRoutes;
|
|
@@ -1,142 +1,197 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
});
|
|
6
|
-
exports.
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
error: error.message
|
|
30
|
-
});
|
|
31
|
-
return; // Exit if invalid regex was encountered
|
|
32
|
-
}
|
|
33
|
-
try {
|
|
34
|
-
// Use findConfig object
|
|
35
|
-
const findConfig = {
|
|
36
|
-
query: processedQuery,
|
|
37
|
-
messageSearch,
|
|
38
|
-
limit,
|
|
39
|
-
sortOrder
|
|
40
|
-
};
|
|
41
|
-
const docs = await _telemetryRegistry.inMemoryDbLogExporter.find(findConfig);
|
|
42
|
-
res.send({
|
|
43
|
-
items: docs
|
|
44
|
-
});
|
|
45
|
-
} catch (err) {
|
|
46
|
-
_logger.default.error(err);
|
|
47
|
-
res.status(500).send({
|
|
48
|
-
error: 'Failed to find logs',
|
|
49
|
-
details: err.message
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.exportLogs = exports.getLogRetentionTime = exports.setLogRetentionTime = exports.statusLogs = exports.stopLogs = exports.startLogs = exports.importLogs = exports.insertLogsToDb = exports.resetLogs = exports.findLogs = void 0;
|
|
7
|
+
const telemetryRegistry_js_1 = require("../telemetry/telemetryRegistry.cjs");
|
|
8
|
+
const logger_js_1 = __importDefault(require("../utils/logger.cjs"));
|
|
9
|
+
const regexUtils_js_1 = require("../utils/regexUtils.cjs");
|
|
10
|
+
/**
|
|
11
|
+
* Parse NDJSON import data
|
|
12
|
+
* Each line must be a valid JSON object
|
|
13
|
+
* @param body - Request body (raw string)
|
|
14
|
+
* @returns Array of log objects
|
|
15
|
+
*/
|
|
16
|
+
function parseImportData(body) {
|
|
17
|
+
if (typeof body !== 'string') {
|
|
18
|
+
throw new Error('Import must be NDJSON format (plain text with one JSON object per line)');
|
|
19
|
+
}
|
|
20
|
+
const lines = body.split('\n').filter((line) => line.trim());
|
|
21
|
+
return lines.map((line, index) => {
|
|
22
|
+
try {
|
|
23
|
+
return JSON.parse(line);
|
|
24
|
+
}
|
|
25
|
+
catch (e) {
|
|
26
|
+
logger_js_1.default.error(`Failed to parse NDJSON line ${index + 1}: ${line}`);
|
|
27
|
+
throw new Error(`Invalid JSON on line ${index + 1}`);
|
|
28
|
+
}
|
|
50
29
|
});
|
|
51
|
-
|
|
30
|
+
}
|
|
31
|
+
const findLogs = async (req, res) => {
|
|
32
|
+
const body = req.body || {};
|
|
33
|
+
const messageSearch = body.textSearch || null;
|
|
34
|
+
const findQuery = body.query || {};
|
|
35
|
+
const limit = parseInt(body.limit) || 50;
|
|
36
|
+
const sortOrder = body.sort || null;
|
|
37
|
+
logger_js_1.default.debug(`findLogs called with query: ${JSON.stringify(findQuery)} and search: ${messageSearch}`, { depth: 3 });
|
|
38
|
+
let processedQuery;
|
|
39
|
+
try {
|
|
40
|
+
processedQuery = (0, regexUtils_js_1.convertRegexRecursively)(findQuery);
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
logger_js_1.default.error(error.message);
|
|
44
|
+
res.status(400).send({ error: error.message });
|
|
45
|
+
return; // Exit if invalid regex was encountered
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
// Use findConfig object
|
|
49
|
+
const findConfig = {
|
|
50
|
+
query: processedQuery,
|
|
51
|
+
messageSearch,
|
|
52
|
+
limit,
|
|
53
|
+
sortOrder
|
|
54
|
+
};
|
|
55
|
+
const docs = await telemetryRegistry_js_1.inMemoryDbLogExporter.find(findConfig);
|
|
56
|
+
res.send({
|
|
57
|
+
logsCount: docs.length,
|
|
58
|
+
logs: docs,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
logger_js_1.default.error(err);
|
|
63
|
+
res.status(500).send({ error: 'Failed to find logs', details: err.message });
|
|
64
|
+
}
|
|
52
65
|
};
|
|
53
66
|
exports.findLogs = findLogs;
|
|
54
67
|
const resetLogs = (req, res) => {
|
|
55
|
-
|
|
56
|
-
|
|
68
|
+
telemetryRegistry_js_1.inMemoryDbLogExporter.reset();
|
|
69
|
+
res.send('Logs reset');
|
|
57
70
|
};
|
|
58
71
|
exports.resetLogs = resetLogs;
|
|
59
72
|
const insertLogsToDb = async (req, res) => {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
});
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
const cleanedLogs = jsonContent.map(log => {
|
|
69
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
70
|
-
const {
|
|
71
|
-
_id
|
|
72
|
-
} = log,
|
|
73
|
-
rest = _objectWithoutProperties(log, _excluded); // Remove _id if it exists
|
|
74
|
-
return rest; // Return the cleaned log object
|
|
75
|
-
});
|
|
76
|
-
try {
|
|
77
|
-
let message = '';
|
|
78
|
-
if (resetData) {
|
|
79
|
-
_telemetryRegistry.inMemoryDbLogExporter.reset();
|
|
80
|
-
message += 'Logs Database reset. ';
|
|
73
|
+
const jsonContent = (req.body || {}).logs;
|
|
74
|
+
const resetData = req.query.reset === 'true';
|
|
75
|
+
if (!Array.isArray(jsonContent)) {
|
|
76
|
+
res.status(400).send({ error: 'Invalid data format.' });
|
|
77
|
+
return;
|
|
81
78
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
_logger.default.error('Error inserting logs:', err);
|
|
86
|
-
return reject(err);
|
|
87
|
-
}
|
|
88
|
-
resolve(newDocs);
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
message += `Inserted ${cleanedLogs.length} logs.`;
|
|
92
|
-
res.send({
|
|
93
|
-
message,
|
|
94
|
-
InsertedLogsCount: cleanedLogs.length
|
|
79
|
+
const cleanedLogs = jsonContent.map((log) => {
|
|
80
|
+
const { _id, ...rest } = log; // Remove _id if it exists
|
|
81
|
+
return rest; // Return the cleaned log object
|
|
95
82
|
});
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
83
|
+
try {
|
|
84
|
+
let message = '';
|
|
85
|
+
if (resetData) {
|
|
86
|
+
telemetryRegistry_js_1.inMemoryDbLogExporter.reset();
|
|
87
|
+
message += 'Logs Database reset. ';
|
|
88
|
+
}
|
|
89
|
+
await new Promise((resolve, reject) => {
|
|
90
|
+
telemetryRegistry_js_1.inMemoryDbLogExporter.insert(cleanedLogs, (err, newDocs) => {
|
|
91
|
+
if (err) {
|
|
92
|
+
logger_js_1.default.error('Error inserting logs:', err);
|
|
93
|
+
return reject(err);
|
|
94
|
+
}
|
|
95
|
+
resolve(newDocs);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
message += `Inserted ${cleanedLogs.length} logs.`;
|
|
99
|
+
res.send({ message, InsertedLogsCount: cleanedLogs.length });
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
logger_js_1.default.error(err);
|
|
103
|
+
res.status(500).send({ error: 'Failed to reset and insert data', details: err.message });
|
|
104
|
+
}
|
|
103
105
|
};
|
|
104
106
|
exports.insertLogsToDb = insertLogsToDb;
|
|
107
|
+
const importLogs = async (req, res) => {
|
|
108
|
+
const resetData = req.query.reset === 'true';
|
|
109
|
+
try {
|
|
110
|
+
// Parse NDJSON format
|
|
111
|
+
const logs = parseImportData(req.body);
|
|
112
|
+
if (logs.length === 0) {
|
|
113
|
+
res.status(400).send({ error: 'No valid logs found in import data' });
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const cleanedLogs = logs.map((log) => {
|
|
117
|
+
const { _id, ...rest } = log; // Remove _id if it exists
|
|
118
|
+
return rest;
|
|
119
|
+
});
|
|
120
|
+
let message = '';
|
|
121
|
+
if (resetData) {
|
|
122
|
+
telemetryRegistry_js_1.inMemoryDbLogExporter.reset();
|
|
123
|
+
message += 'Logs Database reset. ';
|
|
124
|
+
}
|
|
125
|
+
await new Promise((resolve, reject) => {
|
|
126
|
+
telemetryRegistry_js_1.inMemoryDbLogExporter.insert(cleanedLogs, (err, newDocs) => {
|
|
127
|
+
if (err) {
|
|
128
|
+
logger_js_1.default.error('Error importing logs:', err);
|
|
129
|
+
return reject(err);
|
|
130
|
+
}
|
|
131
|
+
resolve(newDocs);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
message += `Imported ${cleanedLogs.length} logs.`;
|
|
135
|
+
res.send({ message, ImportedLogsCount: cleanedLogs.length });
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
logger_js_1.default.error('Import failed:', err);
|
|
139
|
+
res.status(400).send({ error: 'Failed to import logs', details: err.message });
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
exports.importLogs = importLogs;
|
|
105
143
|
const startLogs = (req, res) => {
|
|
106
|
-
|
|
107
|
-
|
|
144
|
+
telemetryRegistry_js_1.inMemoryDbLogExporter.enable();
|
|
145
|
+
res.send('Log collection started');
|
|
108
146
|
};
|
|
109
147
|
exports.startLogs = startLogs;
|
|
110
148
|
const stopLogs = (req, res) => {
|
|
111
|
-
|
|
112
|
-
|
|
149
|
+
telemetryRegistry_js_1.inMemoryDbLogExporter.disable();
|
|
150
|
+
res.send('Log collection stopped');
|
|
113
151
|
};
|
|
114
152
|
exports.stopLogs = stopLogs;
|
|
115
153
|
const statusLogs = (req, res) => {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
active: isRunning
|
|
119
|
-
});
|
|
154
|
+
const isRunning = telemetryRegistry_js_1.inMemoryDbLogExporter.isEnabled() || false;
|
|
155
|
+
res.send({ active: isRunning });
|
|
120
156
|
};
|
|
121
157
|
exports.statusLogs = statusLogs;
|
|
122
158
|
const setLogRetentionTime = (req, res) => {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
_telemetryRegistry.inMemoryDbLogExporter.retentionTimeInSeconds = retentionTimeInSeconds;
|
|
131
|
-
res.send({
|
|
132
|
-
message: `Retention time set to ${retentionTimeInSeconds} seconds.`
|
|
133
|
-
});
|
|
159
|
+
const retentionTimeInSeconds = (req.body || {}).retentionTimeInSeconds;
|
|
160
|
+
if (typeof retentionTimeInSeconds !== 'number' || retentionTimeInSeconds <= 0) {
|
|
161
|
+
res.status(400).send({ error: 'Invalid retention time. Must be a positive number.' });
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
telemetryRegistry_js_1.inMemoryDbLogExporter.retentionTimeInSeconds = retentionTimeInSeconds;
|
|
165
|
+
res.send({ message: `Retention time set to ${retentionTimeInSeconds} seconds.` });
|
|
134
166
|
};
|
|
135
167
|
exports.setLogRetentionTime = setLogRetentionTime;
|
|
136
168
|
const getLogRetentionTime = (req, res) => {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
169
|
+
const retentionTimeInSeconds = telemetryRegistry_js_1.inMemoryDbLogExporter.retentionTimeInSeconds || 0;
|
|
170
|
+
res.send({ retentionTimeInSeconds: retentionTimeInSeconds });
|
|
171
|
+
};
|
|
172
|
+
exports.getLogRetentionTime = getLogRetentionTime;
|
|
173
|
+
const exportLogs = async (req, res) => {
|
|
174
|
+
try {
|
|
175
|
+
// Get ALL logs without practical limit
|
|
176
|
+
const findConfig = {
|
|
177
|
+
query: {},
|
|
178
|
+
messageSearch: null,
|
|
179
|
+
sortOrder: { timestamp: -1 }
|
|
180
|
+
};
|
|
181
|
+
const docs = await telemetryRegistry_js_1.inMemoryDbLogExporter.find(findConfig);
|
|
182
|
+
const timestamp = new Date().toISOString().slice(0, 19).replace(/[-T:]/g, '');
|
|
183
|
+
res.setHeader('Content-Type', 'application/x-ndjson');
|
|
184
|
+
res.setHeader('Content-Disposition', `attachment; filename="logs-${timestamp}.ndjson"`);
|
|
185
|
+
res.setHeader('Transfer-Encoding', 'chunked');
|
|
186
|
+
// Stream as NDJSON (one JSON object per line)
|
|
187
|
+
docs.forEach(doc => {
|
|
188
|
+
res.write(JSON.stringify(doc) + '\n');
|
|
189
|
+
});
|
|
190
|
+
res.end();
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
logger_js_1.default.error('Failed to export logs:', err);
|
|
194
|
+
res.status(500).send({ error: 'Failed to export logs', details: err.message });
|
|
195
|
+
}
|
|
141
196
|
};
|
|
142
|
-
exports.
|
|
197
|
+
exports.exportLogs = exportLogs;
|
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
exports.getLogRoutes = exports.default = void 0;
|
|
7
|
-
var _express = require("express");
|
|
8
|
-
var _logController = require("./logController.cjs");
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getLogRoutes = void 0;
|
|
4
|
+
const express_1 = require("express");
|
|
5
|
+
const logController_js_1 = require("./logController.cjs");
|
|
9
6
|
const getLogRoutes = () => {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
7
|
+
const router = (0, express_1.Router)();
|
|
8
|
+
// Logs Control
|
|
9
|
+
router.post('/start', logController_js_1.startLogs);
|
|
10
|
+
router.post('/stop', logController_js_1.stopLogs);
|
|
11
|
+
router.get('/status', logController_js_1.statusLogs);
|
|
12
|
+
router.post('/reset', logController_js_1.resetLogs);
|
|
13
|
+
router.post('/retention-time', logController_js_1.setLogRetentionTime);
|
|
14
|
+
router.get('/retention-time', logController_js_1.getLogRetentionTime);
|
|
15
|
+
router.get('/export', logController_js_1.exportLogs);
|
|
16
|
+
// Use text middleware for import to handle NDJSON format
|
|
17
|
+
router.post('/import', (0, express_1.text)({ type: 'application/x-ndjson', limit: '500mb' }), logController_js_1.importLogs);
|
|
18
|
+
router.get('/', logController_js_1.findLogs);
|
|
19
|
+
router.post('/', logController_js_1.insertLogsToDb);
|
|
20
|
+
router.post('/find', logController_js_1.findLogs);
|
|
21
|
+
return router;
|
|
22
22
|
};
|
|
23
23
|
exports.getLogRoutes = getLogRoutes;
|
|
24
|
-
|
|
24
|
+
exports.default = exports.getLogRoutes;
|