@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,146 +1,236 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
function
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const metrics = _telemetryRegistry.inMemoryDbMetricExporter.getFinishedMetrics();
|
|
15
|
-
res.send({
|
|
16
|
-
metricsCount: metrics.length,
|
|
17
|
-
metrics: metrics
|
|
18
|
-
});
|
|
19
|
-
} catch (err) {
|
|
20
|
-
console.error(err);
|
|
21
|
-
res.status(500).send({
|
|
22
|
-
error: 'Failed to list metrics data'
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
exports.listMetrics = listMetrics;
|
|
27
|
-
const findMetrics = (req, res) => {
|
|
28
|
-
const body = req.body;
|
|
29
|
-
const query = body?.query ? body.query : {};
|
|
30
|
-
let processedQuery;
|
|
31
|
-
try {
|
|
32
|
-
processedQuery = (0, _regexUtils.convertRegexRecursively)(query);
|
|
33
|
-
} catch (error) {
|
|
34
|
-
console.error(error.message);
|
|
35
|
-
res.status(400).send({
|
|
36
|
-
error: error.message
|
|
37
|
-
});
|
|
38
|
-
return; // Exit if invalid regex was encountered
|
|
39
|
-
}
|
|
40
|
-
_telemetryRegistry.inMemoryDbMetricExporter.find(processedQuery, (err, docs) => {
|
|
41
|
-
if (err) {
|
|
42
|
-
console.error(err);
|
|
43
|
-
res.status(404).send({
|
|
44
|
-
metricsCount: 0,
|
|
45
|
-
metrics: [],
|
|
46
|
-
error: err
|
|
47
|
-
});
|
|
48
|
-
return;
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.importMetrics = exports.exportMetrics = exports.checkMetricsConsistency = exports.findMetrics = exports.getMetricRetentionTime = exports.setMetricRetentionTime = exports.statusMetrics = exports.stopMetrics = exports.startMetrics = exports.insertMetricsToDb = exports.resetMetrics = exports.getMetricsStats = void 0;
|
|
4
|
+
const telemetryRegistry_js_1 = require("../telemetry/telemetryRegistry.cjs");
|
|
5
|
+
/**
|
|
6
|
+
* Parse NDJSON import data
|
|
7
|
+
* Each line must be a valid JSON object
|
|
8
|
+
* @param body - Request body (raw string)
|
|
9
|
+
* @returns Array of metric objects
|
|
10
|
+
*/
|
|
11
|
+
function parseImportData(body) {
|
|
12
|
+
if (typeof body !== 'string') {
|
|
13
|
+
throw new Error('Import must be NDJSON format (plain text with one JSON object per line)');
|
|
49
14
|
}
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
15
|
+
const lines = body.split('\n').filter((line) => line.trim());
|
|
16
|
+
return lines.map((line, index) => {
|
|
17
|
+
try {
|
|
18
|
+
return JSON.parse(line);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
console.error(`Failed to parse NDJSON line ${index + 1}: ${line}`);
|
|
22
|
+
throw new Error(`Invalid JSON on line ${index + 1}`);
|
|
23
|
+
}
|
|
54
24
|
});
|
|
55
|
-
|
|
25
|
+
}
|
|
26
|
+
const getMetricsStats = async (req, res) => {
|
|
27
|
+
try {
|
|
28
|
+
const stats = telemetryRegistry_js_1.inMemoryDbMetricExporter.getStats();
|
|
29
|
+
res.send(stats);
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
console.error(err);
|
|
33
|
+
res.status(500).send({ error: 'Failed to get metrics stats' });
|
|
34
|
+
}
|
|
56
35
|
};
|
|
57
|
-
exports.
|
|
36
|
+
exports.getMetricsStats = getMetricsStats;
|
|
58
37
|
const resetMetrics = (req, res) => {
|
|
59
|
-
|
|
60
|
-
|
|
38
|
+
telemetryRegistry_js_1.inMemoryDbMetricExporter.reset();
|
|
39
|
+
res.send('Metrics reset');
|
|
61
40
|
};
|
|
62
41
|
exports.resetMetrics = resetMetrics;
|
|
63
42
|
const insertMetricsToDb = async (req, res) => {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
72
|
-
const cleanedMetrics = jsonContent.map(metric => {
|
|
73
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
74
|
-
const {
|
|
75
|
-
_id
|
|
76
|
-
} = metric,
|
|
77
|
-
rest = _objectWithoutProperties(metric, _excluded); // Remove _id if it exists
|
|
78
|
-
return rest; // Return the cleaned metric object
|
|
79
|
-
});
|
|
80
|
-
try {
|
|
81
|
-
let message = '';
|
|
82
|
-
if (resetData) {
|
|
83
|
-
_telemetryRegistry.inMemoryDbMetricExporter.reset();
|
|
84
|
-
message += 'Metrics Database reset. ';
|
|
85
|
-
}
|
|
86
|
-
await new Promise((resolve, reject) => {
|
|
87
|
-
_telemetryRegistry.inMemoryDbMetricExporter.insert(cleanedMetrics, (err, newDocs) => {
|
|
88
|
-
if (err) {
|
|
89
|
-
console.error('Error inserting metrics:', err);
|
|
90
|
-
return reject(err);
|
|
43
|
+
try {
|
|
44
|
+
const scopeMetricsData = (req.body || {}).scopeMetrics;
|
|
45
|
+
const resetData = req.query.reset === 'true';
|
|
46
|
+
const format = (req.body.format || req.query.format || 'raw');
|
|
47
|
+
if (!Array.isArray(scopeMetricsData)) {
|
|
48
|
+
res.status(400).send({ error: 'Invalid data format. Expected array in body.scopeMetrics' });
|
|
49
|
+
return;
|
|
91
50
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
51
|
+
let message = '';
|
|
52
|
+
if (resetData) {
|
|
53
|
+
telemetryRegistry_js_1.inMemoryDbMetricExporter.reset();
|
|
54
|
+
message += 'Metrics Database reset. ';
|
|
55
|
+
}
|
|
56
|
+
// Store samples
|
|
57
|
+
if (format === 'otel')
|
|
58
|
+
telemetryRegistry_js_1.inMemoryDbMetricExporter.insertOtel(scopeMetricsData);
|
|
59
|
+
else
|
|
60
|
+
telemetryRegistry_js_1.inMemoryDbMetricExporter.insertRaw(scopeMetricsData);
|
|
61
|
+
message += `Inserted ${scopeMetricsData.length} scopeMetrics (format: ${format}).`;
|
|
62
|
+
res.send({
|
|
63
|
+
message,
|
|
64
|
+
scopeMetricsCount: scopeMetricsData.length,
|
|
65
|
+
format
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
console.error(err);
|
|
70
|
+
res.status(500).send({ error: 'Failed to reset and insert data', details: err.message });
|
|
71
|
+
}
|
|
107
72
|
};
|
|
108
73
|
exports.insertMetricsToDb = insertMetricsToDb;
|
|
109
74
|
const startMetrics = (req, res) => {
|
|
110
|
-
|
|
111
|
-
|
|
75
|
+
telemetryRegistry_js_1.inMemoryDbMetricExporter.enable();
|
|
76
|
+
res.send('Metrics collection started');
|
|
112
77
|
};
|
|
113
78
|
exports.startMetrics = startMetrics;
|
|
114
79
|
const stopMetrics = (req, res) => {
|
|
115
|
-
|
|
116
|
-
|
|
80
|
+
telemetryRegistry_js_1.inMemoryDbMetricExporter.disable();
|
|
81
|
+
res.send('Metrics collection stopped');
|
|
117
82
|
};
|
|
118
83
|
exports.stopMetrics = stopMetrics;
|
|
119
84
|
const statusMetrics = (req, res) => {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
active: isRunning
|
|
123
|
-
});
|
|
85
|
+
const isRunning = telemetryRegistry_js_1.inMemoryDbMetricExporter.isEnabled() || false;
|
|
86
|
+
res.send({ active: isRunning });
|
|
124
87
|
};
|
|
125
88
|
exports.statusMetrics = statusMetrics;
|
|
126
89
|
const setMetricRetentionTime = (req, res) => {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
_telemetryRegistry.inMemoryDbMetricExporter.retentionTimeInSeconds = retentionTimeInSeconds;
|
|
135
|
-
res.send({
|
|
136
|
-
message: `Retention time set to ${retentionTimeInSeconds} seconds.`
|
|
137
|
-
});
|
|
90
|
+
const retentionTimeInSeconds = (req.body || {}).retentionTimeInSeconds;
|
|
91
|
+
if (typeof retentionTimeInSeconds !== 'number' || retentionTimeInSeconds <= 0) {
|
|
92
|
+
res.status(400).send({ error: 'Invalid retention time. Must be a positive number.' });
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
telemetryRegistry_js_1.inMemoryDbMetricExporter.retentionTimeInSeconds = retentionTimeInSeconds;
|
|
96
|
+
res.send({ message: `Retention time set to ${retentionTimeInSeconds} seconds.` });
|
|
138
97
|
};
|
|
139
98
|
exports.setMetricRetentionTime = setMetricRetentionTime;
|
|
140
99
|
const getMetricRetentionTime = (req, res) => {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
100
|
+
const retentionTimeInSeconds = telemetryRegistry_js_1.inMemoryDbMetricExporter.retentionTimeInSeconds || 0;
|
|
101
|
+
res.send({ retentionTimeInSeconds: retentionTimeInSeconds });
|
|
102
|
+
};
|
|
103
|
+
exports.getMetricRetentionTime = getMetricRetentionTime;
|
|
104
|
+
/**
|
|
105
|
+
* Find metrics by scope+metric queries with filters (POST /metrics/find or GET /metrics)
|
|
106
|
+
* All parameters are optional:
|
|
107
|
+
* - If scopeMetrics is not provided or empty, returns all metrics
|
|
108
|
+
* - If startTime/endTime not provided, returns all available data
|
|
109
|
+
* - format can be 'raw' (default) or 'otel'
|
|
110
|
+
*/
|
|
111
|
+
const findMetrics = async (req, res) => {
|
|
112
|
+
try {
|
|
113
|
+
const { scopeMetrics, from, to, format } = req.body || {};
|
|
114
|
+
// Validate scopeMetrics structure if provided
|
|
115
|
+
if (scopeMetrics && Array.isArray(scopeMetrics)) {
|
|
116
|
+
for (const query of scopeMetrics) {
|
|
117
|
+
if (!query.scope || !query.scope.name || !query.descriptor || !query.descriptor.name) {
|
|
118
|
+
res.status(400).json({
|
|
119
|
+
error: 'Each query must have scope.name and descriptor.name defined'
|
|
120
|
+
});
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Execute query
|
|
126
|
+
const response = telemetryRegistry_js_1.inMemoryDbMetricExporter.find({
|
|
127
|
+
scopeMetrics: scopeMetrics && scopeMetrics.length > 0 ? scopeMetrics : undefined,
|
|
128
|
+
from,
|
|
129
|
+
to,
|
|
130
|
+
format: format || 'raw'
|
|
131
|
+
});
|
|
132
|
+
res.json({
|
|
133
|
+
format: format || 'raw',
|
|
134
|
+
scopeMetricsCount: response.results.length,
|
|
135
|
+
scopeMetrics: response.results,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
console.error(err);
|
|
140
|
+
res.status(500).json({ error: 'Failed to find metrics' });
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
exports.findMetrics = findMetrics;
|
|
144
|
+
/**
|
|
145
|
+
* Check data consistency between rawDataDB and queried data
|
|
146
|
+
* Compares raw exports with findMetrics(format=otel) without filters
|
|
147
|
+
*/
|
|
148
|
+
const checkMetricsConsistency = async (req, res) => {
|
|
149
|
+
try {
|
|
150
|
+
// Get raw exported data
|
|
151
|
+
const rawData = telemetryRegistry_js_1.inMemoryDbMetricExporter.rawDataDB;
|
|
152
|
+
// Query all data with OTEL format
|
|
153
|
+
const response = telemetryRegistry_js_1.inMemoryDbMetricExporter.find({
|
|
154
|
+
format: 'otel'
|
|
155
|
+
});
|
|
156
|
+
const queriedData = response.results;
|
|
157
|
+
// Compare counts
|
|
158
|
+
const statusCheck = rawData.length === queriedData.length;
|
|
159
|
+
res.json({
|
|
160
|
+
statusCheck,
|
|
161
|
+
raw: rawData,
|
|
162
|
+
queried: queriedData
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
console.error(err);
|
|
167
|
+
res.status(500).json({ error: 'Failed to check metrics consistency' });
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
exports.checkMetricsConsistency = checkMetricsConsistency;
|
|
171
|
+
const exportMetrics = (req, res) => {
|
|
172
|
+
try {
|
|
173
|
+
const ndjsonData = telemetryRegistry_js_1.inMemoryDbMetricExporter.exportToNDJSON();
|
|
174
|
+
const timestamp = new Date().toISOString().slice(0, 19).replace(/[-T:]/g, '');
|
|
175
|
+
res.setHeader('Content-Type', 'application/x-ndjson');
|
|
176
|
+
res.setHeader('Content-Disposition', `attachment; filename="metrics-${timestamp}.ndjson"`);
|
|
177
|
+
res.setHeader('Transfer-Encoding', 'chunked');
|
|
178
|
+
res.write(ndjsonData);
|
|
179
|
+
res.end();
|
|
180
|
+
}
|
|
181
|
+
catch (err) {
|
|
182
|
+
console.error('Failed to export metrics:', err);
|
|
183
|
+
res.status(500).send({ error: 'Failed to export metrics', details: err.message });
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
exports.exportMetrics = exportMetrics;
|
|
187
|
+
const importMetrics = async (req, res) => {
|
|
188
|
+
const resetData = req.query.reset === 'true';
|
|
189
|
+
const format = (req.query.format || 'raw');
|
|
190
|
+
try {
|
|
191
|
+
const ndjsonContent = req.body;
|
|
192
|
+
// Check if this is an exported NDJSON with headers (from our export function)
|
|
193
|
+
const firstLine = ndjsonContent.split('\n')[0];
|
|
194
|
+
let isExportedFormat = false;
|
|
195
|
+
try {
|
|
196
|
+
const firstObj = JSON.parse(firstLine);
|
|
197
|
+
isExportedFormat = firstObj.type === 'header';
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
// Not a valid JSON line, continue with normal parsing
|
|
201
|
+
}
|
|
202
|
+
let message = '';
|
|
203
|
+
if (resetData) {
|
|
204
|
+
telemetryRegistry_js_1.inMemoryDbMetricExporter.reset();
|
|
205
|
+
message += 'Metrics Database reset. ';
|
|
206
|
+
}
|
|
207
|
+
// If it's an exported format with headers/metadata, use direct NDJSON import
|
|
208
|
+
if (isExportedFormat) {
|
|
209
|
+
telemetryRegistry_js_1.inMemoryDbMetricExporter.importFromNDJSON(ndjsonContent);
|
|
210
|
+
message += `Imported metrics from exported NDJSON format.`;
|
|
211
|
+
res.send({ message, format: 'exported-ndjson' });
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
// Otherwise parse as raw metrics (queryresults or OTEL format)
|
|
215
|
+
const metricsArray = parseImportData(ndjsonContent);
|
|
216
|
+
if (metricsArray.length === 0) {
|
|
217
|
+
res.status(400).send({ error: 'No valid metrics found in import data' });
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
// Use the same insert logic as insertMetricsToDb, respecting raw vs otel format
|
|
221
|
+
if (format === 'otel') {
|
|
222
|
+
telemetryRegistry_js_1.inMemoryDbMetricExporter.insertOtel(metricsArray);
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
telemetryRegistry_js_1.inMemoryDbMetricExporter.insertRaw(metricsArray);
|
|
226
|
+
}
|
|
227
|
+
message += `Imported ${metricsArray.length} metrics (format: ${format}).`;
|
|
228
|
+
res.send({ message, ImportedMetricsCount: metricsArray.length, format });
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
catch (err) {
|
|
232
|
+
console.error('Import failed:', err);
|
|
233
|
+
res.status(400).send({ error: 'Failed to import metrics', details: err.message });
|
|
234
|
+
}
|
|
145
235
|
};
|
|
146
|
-
exports.
|
|
236
|
+
exports.importMetrics = importMetrics;
|
|
@@ -1,24 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
exports.getMetricsRoutes = exports.default = void 0;
|
|
7
|
-
var _express = require("express");
|
|
8
|
-
var _metricsController = require("./metricsController.cjs");
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getMetricsRoutes = void 0;
|
|
4
|
+
const express_1 = require("express");
|
|
5
|
+
const metricsController_js_1 = require("./metricsController.cjs");
|
|
9
6
|
const getMetricsRoutes = () => {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
7
|
+
const router = (0, express_1.Router)();
|
|
8
|
+
// Metrics Control
|
|
9
|
+
router.post('/start', metricsController_js_1.startMetrics);
|
|
10
|
+
router.post('/stop', metricsController_js_1.stopMetrics);
|
|
11
|
+
router.get('/status', metricsController_js_1.statusMetrics);
|
|
12
|
+
router.post('/reset', metricsController_js_1.resetMetrics);
|
|
13
|
+
router.post('/retention-time', metricsController_js_1.setMetricRetentionTime);
|
|
14
|
+
router.get('/retention-time', metricsController_js_1.getMetricRetentionTime);
|
|
15
|
+
// Export/Import
|
|
16
|
+
router.get('/export', metricsController_js_1.exportMetrics);
|
|
17
|
+
// Use text middleware for import to handle NDJSON format
|
|
18
|
+
router.post('/import', (0, express_1.text)({ type: 'application/x-ndjson', limit: '500mb' }), metricsController_js_1.importMetrics);
|
|
19
|
+
// Query endpoints
|
|
20
|
+
router.post('/find', metricsController_js_1.findMetrics);
|
|
21
|
+
router.get('/stats', metricsController_js_1.getMetricsStats);
|
|
22
|
+
router.get('/', metricsController_js_1.findMetrics);
|
|
23
|
+
router.post('/', metricsController_js_1.insertMetricsToDb);
|
|
24
|
+
return router;
|
|
22
25
|
};
|
|
23
26
|
exports.getMetricsRoutes = getMetricsRoutes;
|
|
24
|
-
|
|
27
|
+
exports.default = exports.getMetricsRoutes;
|