@oas-tools/oas-telemetry 0.7.1 → 0.8.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/.env.example +17 -3
- package/README.md +1 -2
- package/dist/cjs/config/bootConfig.cjs +16 -14
- package/dist/cjs/config/config.cjs +120 -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/DiskLogExporter.cjs +121 -0
- package/dist/cjs/telemetry/custom-implementations/exporters/DiskMetricExporter.cjs +101 -0
- package/dist/cjs/telemetry/custom-implementations/exporters/DiskTraceExporter.cjs +103 -0
- package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.cjs +194 -190
- package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.cjs +147 -99
- package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.cjs +143 -116
- package/dist/cjs/telemetry/custom-implementations/exporters/MultiMetricExporter.cjs +57 -0
- 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 +392 -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/wrappers.cjs +209 -138
- package/dist/cjs/telemetry/initializeTelemetry.cjs +35 -91
- package/dist/cjs/telemetry/persistence/DiskImporter.cjs +85 -0
- package/dist/cjs/telemetry/persistence/DiskUtils.cjs +61 -0
- package/dist/cjs/telemetry/persistence/DiskWriter.cjs +66 -0
- package/dist/cjs/telemetry/telemetryConfigurator.cjs +139 -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 +135 -116
- package/dist/cjs/tlm-log/logRoutes.cjs +19 -20
- package/dist/cjs/tlm-log/logService.cjs +29 -0
- package/dist/cjs/tlm-metric/metricsController.cjs +154 -122
- package/dist/cjs/tlm-metric/metricsRoutes.cjs +22 -20
- package/dist/cjs/tlm-metric/metricsService.cjs +26 -0
- 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 +140 -123
- package/dist/cjs/tlm-trace/traceRoutes.cjs +19 -20
- package/dist/cjs/tlm-trace/traceService.cjs +29 -0
- 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 +5 -2
- package/dist/esm/config/config.js +9 -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/DiskLogExporter.js +114 -0
- package/dist/esm/telemetry/custom-implementations/exporters/DiskMetricExporter.js +94 -0
- package/dist/esm/telemetry/custom-implementations/exporters/DiskTraceExporter.js +96 -0
- package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.js +38 -7
- package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.js +107 -48
- package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.js +60 -29
- package/dist/esm/telemetry/custom-implementations/exporters/MultiMetricExporter.js +53 -0
- 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 +385 -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/wrappers.js +77 -6
- package/dist/esm/telemetry/initializeTelemetry.js +27 -69
- package/dist/esm/telemetry/persistence/DiskImporter.js +78 -0
- package/dist/esm/telemetry/persistence/DiskUtils.js +51 -0
- package/dist/esm/telemetry/persistence/DiskWriter.js +59 -0
- package/dist/esm/telemetry/telemetryConfigurator.js +110 -39
- 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 +62 -18
- package/dist/esm/tlm-log/logRoutes.js +3 -1
- package/dist/esm/tlm-log/logService.js +25 -0
- package/dist/esm/tlm-metric/metricsController.js +116 -50
- package/dist/esm/tlm-metric/metricsRoutes.js +8 -3
- package/dist/esm/tlm-metric/metricsService.js +22 -0
- 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 +87 -36
- package/dist/esm/tlm-trace/traceRoutes.js +3 -1
- package/dist/esm/tlm-trace/traceService.js +25 -0
- 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 +3 -0
- package/dist/types/config/config.d.ts +48 -7
- package/dist/types/config/config.types.d.ts +7 -0
- package/dist/types/index.d.ts +2 -3
- package/dist/types/telemetry/custom-implementations/exporters/DiskLogExporter.d.ts +24 -0
- package/dist/types/telemetry/custom-implementations/exporters/DiskMetricExporter.d.ts +23 -0
- package/dist/types/telemetry/custom-implementations/exporters/DiskTraceExporter.d.ts +23 -0
- package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.d.ts +3 -1
- package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.d.ts +56 -15
- package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.d.ts +8 -4
- package/dist/types/telemetry/custom-implementations/exporters/MultiMetricExporter.d.ts +9 -0
- 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/wrappers.d.ts +2 -1
- package/dist/types/telemetry/persistence/DiskImporter.d.ts +17 -0
- package/dist/types/telemetry/persistence/DiskUtils.d.ts +11 -0
- package/dist/types/telemetry/persistence/DiskWriter.d.ts +21 -0
- 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-log/logService.d.ts +4 -0
- package/dist/types/tlm-metric/metricsController.d.ts +11 -2
- package/dist/types/tlm-metric/metricsService.d.ts +6 -0
- package/dist/types/tlm-trace/traceController.d.ts +9 -7
- package/dist/types/tlm-trace/traceService.d.ts +4 -0
- package/dist/types/types/index.d.ts +2 -2
- package/dist/ui/assets/{ApiDocsPage-C_VVPPHa.js → ApiDocsPage-DTCgVbW2.js} +2 -2
- package/dist/ui/assets/CollapsibleCard-lWgfsaAn.js +1 -0
- package/dist/ui/assets/DevToolsPage-DEhf8CBy.js +1 -0
- package/dist/ui/assets/LandingPage-CfEHCDxY.js +6 -0
- package/dist/ui/assets/LogsPage-DFDKRuGH.js +1 -0
- package/dist/ui/assets/{NotFoundPage-B3quk3P1.js → NotFoundPage-DCy0DcV7.js} +1 -1
- package/dist/ui/assets/PluginCreatePage-BawZ5_-h.js +50 -0
- package/dist/ui/assets/PluginPage-D3FmgU7d.js +27 -0
- package/dist/ui/assets/TraceSpansPage-D0_L45Rb.js +6 -0
- package/dist/ui/assets/VirtualizedListPanel-q605n9He.js +16 -0
- package/dist/ui/assets/alert-DBAFshSi.js +1133 -0
- package/dist/ui/assets/badge-DGNBtnxU.js +1 -0
- package/dist/ui/assets/{chevron-down-CPsvsmqj.js → chevron-down-CFEqYzGC.js} +1 -1
- package/dist/ui/assets/{chevron-up-Df9jMo1X.js → chevron-up-lDnFwAJq.js} +1 -1
- package/dist/ui/assets/{circle-alert-DOPQPvU8.js → circle-alert-BpYUuRs7.js} +1 -1
- package/dist/ui/assets/dialog-1dRyI6SC.js +15 -0
- package/dist/ui/assets/index-C7RfU6hR.js +1 -0
- package/dist/ui/assets/index-C9dDYIpd.js +305 -0
- package/dist/ui/assets/index-D6f1KjWV.css +1 -0
- package/dist/ui/assets/info-CuJQWoBU.js +6 -0
- package/dist/ui/assets/{input-Dzvg_ZEZ.js → input-BLXaar0X.js} +1 -1
- package/dist/ui/assets/label-DfAcltsl.js +1 -0
- package/dist/ui/assets/{loader-circle-CrvlRy5o.js → loader-circle-B7oLyPsi.js} +1 -1
- package/dist/ui/assets/{loginPage-qa4V-B70.js → loginPage-DswZvOJ-.js} +1 -1
- package/dist/ui/assets/metrics-page-BhtXrfUW.js +31 -0
- package/dist/ui/assets/metrics-page-D1GxaB_c.css +1 -0
- package/dist/ui/assets/popover-IDker85U.js +11 -0
- package/dist/ui/assets/select-B8y5IidE.js +6 -0
- package/dist/ui/assets/separator-B6EzrxYY.js +6 -0
- package/dist/ui/assets/severityOptions-DtCsaAZK.js +11 -0
- package/dist/ui/assets/square-pen-D_oecB1x.js +6 -0
- package/dist/ui/assets/switch-Dqo0XkRD.js +1 -0
- package/dist/ui/assets/trace-DJq1miYa.js +1 -0
- package/dist/ui/assets/upload-prIohEdY.js +11 -0
- package/dist/ui/assets/{utilService-DNyqzwj0.js → utilService-C8TJKLqs.js} +1 -1
- package/dist/ui/assets/wand-sparkles-OgXuzsSx.js +6 -0
- package/dist/ui/index.html +2 -2
- package/package.json +44 -49
- 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,123 +1,150 @@
|
|
|
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.InMemoryDbSpanExporter = void 0;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
this._startCleanupJob();
|
|
26
|
-
}
|
|
27
|
-
set baseUrl(baseUrl) {
|
|
28
|
-
this._baseUrl = baseUrl;
|
|
29
|
-
}
|
|
30
|
-
set retentionTimeInSeconds(retentionTimeInSeconds) {
|
|
31
|
-
this._retentionTimeInSeconds = retentionTimeInSeconds;
|
|
32
|
-
_logger.default.info(`InMemoryDbSpanExporter retention time set to ${this._retentionTimeInSeconds} seconds`);
|
|
33
|
-
}
|
|
34
|
-
get retentionTimeInSeconds() {
|
|
35
|
-
return this._retentionTimeInSeconds;
|
|
36
|
-
}
|
|
37
|
-
export(readableSpans, resultCallback) {
|
|
38
|
-
_logger.default.debug('InMemoryDbSpanExporter.export called with spans: ', readableSpans.length);
|
|
39
|
-
try {
|
|
40
|
-
// Prepare spans to be inserted into the in-memory database (remove circular references and convert to nested objects)
|
|
41
|
-
const cleanSpans = readableSpans.map(nestedSpan => (0, _circular.removeCircularRefs)(nestedSpan)) // to avoid JSON parsing error
|
|
42
|
-
.map(span => (0, _circular.applyNesting)(span)) // to avoid dot notation in keys (neDB does not support dot notation in keys)
|
|
43
|
-
.filter(span => {
|
|
44
|
-
const target = span?.attributes?.http?.target;
|
|
45
|
-
// Exclude spans where target includes 'telemetry' but NOT 'telemetry/utils/generate-log' or 'telemetry/utils/generate-wait'
|
|
46
|
-
if (target && target.includes(this._baseUrl)) {
|
|
47
|
-
return target.includes("generate");
|
|
48
|
-
}
|
|
49
|
-
return true;
|
|
50
|
-
});
|
|
51
|
-
cleanSpans.forEach(span => {
|
|
52
|
-
_pluginService.pluginService.broadcastTrace(span);
|
|
53
|
-
});
|
|
54
|
-
//
|
|
55
|
-
if (this.isEnabled()) {
|
|
56
|
-
// Insert spans into the in-memory database
|
|
57
|
-
this._spans.insert(cleanSpans, (err, _newDoc) => {
|
|
58
|
-
if (err) {
|
|
59
|
-
_logger.default.error(err);
|
|
7
|
+
const core_1 = require("@opentelemetry/core");
|
|
8
|
+
const nedb_1 = __importDefault(require("@seald-io/nedb"));
|
|
9
|
+
const logger_js_1 = __importDefault(require("../../../utils/logger.cjs"));
|
|
10
|
+
const circular_js_1 = require("../utils/circular.cjs");
|
|
11
|
+
const wrappers_js_1 = require("../wrappers.cjs");
|
|
12
|
+
const pluginService_js_1 = require("../../../tlm-plugin/pluginService.cjs");
|
|
13
|
+
class InMemoryDbSpanExporter extends wrappers_js_1.Enabler {
|
|
14
|
+
_spans = null;
|
|
15
|
+
_retentionTimeInSeconds;
|
|
16
|
+
_initialized = false;
|
|
17
|
+
constructor(retentionTimeInSeconds = 3600) {
|
|
18
|
+
super();
|
|
19
|
+
this._retentionTimeInSeconds = retentionTimeInSeconds;
|
|
20
|
+
this._startCleanupJob();
|
|
21
|
+
}
|
|
22
|
+
;
|
|
23
|
+
_ensureInitialized() {
|
|
24
|
+
if (this._initialized)
|
|
60
25
|
return;
|
|
61
|
-
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
return resultCallback({
|
|
70
|
-
code: _core.ExportResultCode.FAILED,
|
|
71
|
-
error: new Error('Error exporting spans\n' + error.message + '\n' + error.stack)
|
|
72
|
-
});
|
|
26
|
+
this._initialized = true;
|
|
27
|
+
this._spans = new nedb_1.default({ timestampData: true });
|
|
28
|
+
this._spans.ensureIndex({ fieldName: 'createdAt' });
|
|
29
|
+
logger_js_1.default.info(`[SpanExporter] In-memory storage created`);
|
|
30
|
+
}
|
|
31
|
+
set retentionTimeInSeconds(retentionTimeInSeconds) {
|
|
32
|
+
this._retentionTimeInSeconds = retentionTimeInSeconds;
|
|
33
|
+
logger_js_1.default.info(`InMemoryDbSpanExporter retention time set to ${this._retentionTimeInSeconds} seconds`);
|
|
73
34
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
this._spans.remove({
|
|
108
|
-
createdAt: {
|
|
109
|
-
$lt: expirationDate
|
|
35
|
+
get retentionTimeInSeconds() {
|
|
36
|
+
return this._retentionTimeInSeconds;
|
|
37
|
+
}
|
|
38
|
+
export(readableSpans, resultCallback) {
|
|
39
|
+
this._ensureInitialized();
|
|
40
|
+
logger_js_1.default.debug('InMemoryDbSpanExporter.export called with spans: ', readableSpans.length);
|
|
41
|
+
try {
|
|
42
|
+
// Prepare spans to be inserted into the in-memory database (remove circular references and convert to nested objects)
|
|
43
|
+
const cleanSpans = readableSpans
|
|
44
|
+
.map(nestedSpan => (0, circular_js_1.removeCircularRefs)(nestedSpan)) // to avoid JSON parsing error
|
|
45
|
+
.map(span => (0, circular_js_1.applyNesting)(span)); // to avoid dot notation in keys (neDB does not support dot notation in keys)
|
|
46
|
+
cleanSpans.forEach(span => {
|
|
47
|
+
pluginService_js_1.pluginService.broadcastTrace(span);
|
|
48
|
+
});
|
|
49
|
+
if (this.isEnabled()) {
|
|
50
|
+
// Insert spans into the in-memory database
|
|
51
|
+
if (this._spans) {
|
|
52
|
+
this._spans.insert(cleanSpans, (err, _newDoc) => {
|
|
53
|
+
if (err) {
|
|
54
|
+
logger_js_1.default.error(err);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return resultCallback({ code: core_1.ExportResultCode.SUCCESS });
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
logger_js_1.default.error('Error exporting spans\n' + error.message + '\n' + error.stack);
|
|
64
|
+
return resultCallback({
|
|
65
|
+
code: core_1.ExportResultCode.FAILED,
|
|
66
|
+
error: new Error('Error exporting spans\n' + error.message + '\n' + error.stack),
|
|
67
|
+
});
|
|
110
68
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
69
|
+
}
|
|
70
|
+
;
|
|
71
|
+
shutdown() {
|
|
72
|
+
this._spans = null;
|
|
73
|
+
return this.forceFlush();
|
|
74
|
+
}
|
|
75
|
+
;
|
|
76
|
+
reset() {
|
|
77
|
+
this._ensureInitialized();
|
|
78
|
+
this._spans.remove({}, { multi: true }, (err) => {
|
|
79
|
+
if (err) {
|
|
80
|
+
logger_js_1.default.error(`[SpanExporter] Error during reset: ${err.message}`);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
logger_js_1.default.info(`[SpanExporter] Reset - all spans cleared`);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Exports any pending spans in the exporter
|
|
89
|
+
*/
|
|
90
|
+
forceFlush() {
|
|
91
|
+
return Promise.resolve();
|
|
92
|
+
}
|
|
93
|
+
;
|
|
94
|
+
async find(findConfig) {
|
|
95
|
+
this._ensureInitialized();
|
|
96
|
+
const { query, limit, sortOrder } = findConfig;
|
|
97
|
+
const effectiveSortOrder = sortOrder || { timestamp: -1 };
|
|
98
|
+
const docs = await new Promise((resolve, reject) => {
|
|
99
|
+
let query_exec = this._spans.find(query)
|
|
100
|
+
.sort(effectiveSortOrder);
|
|
101
|
+
// Only apply limit if provided
|
|
102
|
+
if (limit !== undefined) {
|
|
103
|
+
query_exec = query_exec.limit(limit);
|
|
104
|
+
}
|
|
105
|
+
query_exec.exec((err, docs) => {
|
|
106
|
+
if (err)
|
|
107
|
+
reject(err);
|
|
108
|
+
else
|
|
109
|
+
resolve(docs);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
return docs;
|
|
113
|
+
}
|
|
114
|
+
getFinishedSpans() {
|
|
115
|
+
this._ensureInitialized();
|
|
116
|
+
if (!this._spans)
|
|
117
|
+
return [];
|
|
118
|
+
return this._spans.getAllData();
|
|
119
|
+
}
|
|
120
|
+
;
|
|
121
|
+
/**
|
|
122
|
+
* Inserts spans into the in-memory database.
|
|
123
|
+
* @param spans - The spans to insert.
|
|
124
|
+
* @param callback - The callback to execute after insertion.
|
|
125
|
+
*/
|
|
126
|
+
insert(spans, callback) {
|
|
127
|
+
this._ensureInitialized();
|
|
128
|
+
if (!this._spans) {
|
|
129
|
+
return callback(new Error('Spans database not initialized'), []);
|
|
118
130
|
}
|
|
119
|
-
|
|
120
|
-
}
|
|
121
|
-
|
|
131
|
+
this._spans.insert(spans, callback);
|
|
132
|
+
}
|
|
133
|
+
_startCleanupJob() {
|
|
134
|
+
const interval = 1000;
|
|
135
|
+
setInterval(() => {
|
|
136
|
+
if (!this._spans)
|
|
137
|
+
return; // Safety check - not initialized yet
|
|
138
|
+
const expirationDate = new Date(Date.now() - this._retentionTimeInSeconds * 1000);
|
|
139
|
+
this._spans.remove({ createdAt: { $lt: expirationDate } }, { multi: true }, (err, numRemoved) => {
|
|
140
|
+
if (err) {
|
|
141
|
+
logger_js_1.default.error('Error in TTL cleanup:', err);
|
|
142
|
+
}
|
|
143
|
+
else if (numRemoved > 0) {
|
|
144
|
+
logger_js_1.default.debug(`TTL cleanup: removed ${numRemoved} expired spans`);
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
}, interval);
|
|
148
|
+
}
|
|
122
149
|
}
|
|
123
|
-
exports.InMemoryDbSpanExporter = InMemoryDbSpanExporter;
|
|
150
|
+
exports.InMemoryDbSpanExporter = InMemoryDbSpanExporter;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MultiMetricExporter = void 0;
|
|
4
|
+
const core_1 = require("@opentelemetry/core");
|
|
5
|
+
class MultiMetricExporter {
|
|
6
|
+
exporters;
|
|
7
|
+
constructor(exporters) {
|
|
8
|
+
this.exporters = exporters;
|
|
9
|
+
}
|
|
10
|
+
export(resourceMetrics, resultCallback) {
|
|
11
|
+
if (!this.exporters.length) {
|
|
12
|
+
resultCallback({ code: core_1.ExportResultCode.SUCCESS });
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
let pending = this.exporters.length;
|
|
16
|
+
let failed = false;
|
|
17
|
+
let firstError;
|
|
18
|
+
this.exporters.forEach((exporter) => {
|
|
19
|
+
try {
|
|
20
|
+
exporter.export(resourceMetrics, (result) => {
|
|
21
|
+
if (result.code === core_1.ExportResultCode.FAILED) {
|
|
22
|
+
failed = true;
|
|
23
|
+
if (result.error && !firstError) {
|
|
24
|
+
firstError = result.error;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
pending -= 1;
|
|
28
|
+
if (pending === 0) {
|
|
29
|
+
resultCallback(failed
|
|
30
|
+
? { code: core_1.ExportResultCode.FAILED, error: firstError }
|
|
31
|
+
: { code: core_1.ExportResultCode.SUCCESS });
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
failed = true;
|
|
37
|
+
if (!firstError) {
|
|
38
|
+
firstError = error instanceof Error ? error : new Error(String(error));
|
|
39
|
+
}
|
|
40
|
+
pending -= 1;
|
|
41
|
+
if (pending === 0) {
|
|
42
|
+
resultCallback({ code: core_1.ExportResultCode.FAILED, error: firstError });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
async shutdown() {
|
|
48
|
+
await Promise.all(this.exporters.map((exporter) => exporter.shutdown()));
|
|
49
|
+
}
|
|
50
|
+
async forceFlush() {
|
|
51
|
+
await Promise.all(this.exporters
|
|
52
|
+
.map((exporter) => exporter.forceFlush)
|
|
53
|
+
.filter((forceFlush) => typeof forceFlush === 'function')
|
|
54
|
+
.map((forceFlush) => forceFlush()));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
exports.MultiMetricExporter = MultiMetricExporter;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
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.LogsInstrumentation = void 0;
|
|
7
|
+
const instrumentation_1 = require("@opentelemetry/instrumentation");
|
|
8
|
+
const api_logs_1 = require("@opentelemetry/api-logs");
|
|
9
|
+
const util_1 = __importDefault(require("util"));
|
|
10
|
+
const telemetryRegistry_js_1 = require("../../telemetryRegistry.cjs");
|
|
11
|
+
class LogsInstrumentation extends instrumentation_1.InstrumentationBase {
|
|
12
|
+
_loggerProvider;
|
|
13
|
+
_otelLogger;
|
|
14
|
+
constructor(config = {}) {
|
|
15
|
+
super('@oas-telemetry/logs-instrumentation', '1.0.0', config);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* No-op: this instrumentation does not patch modules loaded via require().
|
|
19
|
+
*/
|
|
20
|
+
init() {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Called by the SDK when the LoggerProvider is available.
|
|
25
|
+
* This is the correct way for an instrumentation to receive a logger provider.
|
|
26
|
+
*/
|
|
27
|
+
setLoggerProvider(provider) {
|
|
28
|
+
this._loggerProvider = provider;
|
|
29
|
+
this._otelLogger = provider.getLogger(this.instrumentationName);
|
|
30
|
+
// If already enabled, re-apply patches with the new logger provider.
|
|
31
|
+
if (this.isEnabled()) {
|
|
32
|
+
this._unpatchConsole();
|
|
33
|
+
this._patchConsole();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Called by the SDK after all providers have been registered.
|
|
38
|
+
*/
|
|
39
|
+
enable() {
|
|
40
|
+
super.enable();
|
|
41
|
+
// Fallback: if no logger provider has been set yet, we do nothing.
|
|
42
|
+
if (!this._loggerProvider) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
this._patchConsole();
|
|
46
|
+
}
|
|
47
|
+
disable() {
|
|
48
|
+
super.disable();
|
|
49
|
+
this._unpatchConsole();
|
|
50
|
+
}
|
|
51
|
+
_patchConsole() {
|
|
52
|
+
if (!this._otelLogger)
|
|
53
|
+
return;
|
|
54
|
+
Object.keys(telemetryRegistry_js_1.originalConsoleMethods).forEach((method) => {
|
|
55
|
+
const original = telemetryRegistry_js_1.originalConsoleMethods[method];
|
|
56
|
+
console[method] = (...args) => {
|
|
57
|
+
const { number, text } = getSeverityForMethod(method);
|
|
58
|
+
this._otelLogger.emit({
|
|
59
|
+
severityNumber: number,
|
|
60
|
+
severityText: text,
|
|
61
|
+
body: util_1.default.format(...args),
|
|
62
|
+
attributes: {
|
|
63
|
+
source: `console.${method}`,
|
|
64
|
+
library: this.instrumentationName,
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
original(...args);
|
|
68
|
+
};
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
_unpatchConsole() {
|
|
72
|
+
Object.keys(telemetryRegistry_js_1.originalConsoleMethods).forEach((method) => {
|
|
73
|
+
console[method] = telemetryRegistry_js_1.originalConsoleMethods[method];
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
exports.LogsInstrumentation = LogsInstrumentation;
|
|
78
|
+
function getSeverityForMethod(method) {
|
|
79
|
+
switch (method) {
|
|
80
|
+
case "log":
|
|
81
|
+
case "info":
|
|
82
|
+
return { number: api_logs_1.SeverityNumber.INFO, text: "INFO" };
|
|
83
|
+
case "debug":
|
|
84
|
+
return { number: api_logs_1.SeverityNumber.DEBUG, text: "DEBUG" };
|
|
85
|
+
case "warn":
|
|
86
|
+
return { number: api_logs_1.SeverityNumber.WARN, text: "WARN" };
|
|
87
|
+
case "error":
|
|
88
|
+
return { number: api_logs_1.SeverityNumber.ERROR, text: "ERROR" };
|
|
89
|
+
default:
|
|
90
|
+
return { number: api_logs_1.SeverityNumber.INFO, text: "INFO" };
|
|
91
|
+
}
|
|
92
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Chunk = void 0;
|
|
4
|
+
class Chunk {
|
|
5
|
+
maxSamples;
|
|
6
|
+
startTimes;
|
|
7
|
+
endTimes;
|
|
8
|
+
values;
|
|
9
|
+
histograms;
|
|
10
|
+
cursor = 0;
|
|
11
|
+
minEndTime = 0;
|
|
12
|
+
maxEndTime = 0;
|
|
13
|
+
isHistogram;
|
|
14
|
+
constructor(maxSamples = 120, isHistogram = false) {
|
|
15
|
+
this.maxSamples = maxSamples;
|
|
16
|
+
this.startTimes = new Float64Array(maxSamples);
|
|
17
|
+
this.endTimes = new Float64Array(maxSamples);
|
|
18
|
+
this.values = new Float64Array(maxSamples);
|
|
19
|
+
this.histograms = new Array(maxSamples).fill(null);
|
|
20
|
+
this.isHistogram = isHistogram;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Append a sample to the chunk.
|
|
24
|
+
* Returns true if successful or false if the chunk is full.
|
|
25
|
+
*/
|
|
26
|
+
append(startTime, endTime, value) {
|
|
27
|
+
if (this.cursor >= this.maxSamples) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
if (this.cursor === 0) {
|
|
31
|
+
this.minEndTime = endTime;
|
|
32
|
+
}
|
|
33
|
+
this.startTimes[this.cursor] = startTime;
|
|
34
|
+
this.endTimes[this.cursor] = endTime;
|
|
35
|
+
if (this.isHistogram && typeof value === 'object') {
|
|
36
|
+
this.values[this.cursor] = value.count;
|
|
37
|
+
this.histograms[this.cursor] = value;
|
|
38
|
+
}
|
|
39
|
+
else if (typeof value === 'number') {
|
|
40
|
+
this.values[this.cursor] = value;
|
|
41
|
+
this.histograms[this.cursor] = null;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
const hv = value;
|
|
45
|
+
this.values[this.cursor] = hv.count;
|
|
46
|
+
this.histograms[this.cursor] = hv;
|
|
47
|
+
}
|
|
48
|
+
this.maxEndTime = endTime;
|
|
49
|
+
this.cursor++;
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Binary search for first index with endTime >= targetTime
|
|
54
|
+
*/
|
|
55
|
+
_binarySearchStart(targetTime) {
|
|
56
|
+
let left = 0;
|
|
57
|
+
let right = this.cursor - 1;
|
|
58
|
+
let result = this.cursor;
|
|
59
|
+
while (left <= right) {
|
|
60
|
+
const mid = (left + right) >> 1;
|
|
61
|
+
if (this.endTimes[mid] >= targetTime) {
|
|
62
|
+
result = mid;
|
|
63
|
+
right = mid - 1;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
left = mid + 1;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Binary search for last index with endTime <= targetTime
|
|
73
|
+
*/
|
|
74
|
+
_binarySearchEnd(targetTime, startIdx = 0) {
|
|
75
|
+
let left = startIdx;
|
|
76
|
+
let right = this.cursor - 1;
|
|
77
|
+
let result = startIdx - 1;
|
|
78
|
+
while (left <= right) {
|
|
79
|
+
const mid = (left + right) >> 1;
|
|
80
|
+
if (this.endTimes[mid] <= targetTime) {
|
|
81
|
+
result = mid;
|
|
82
|
+
left = mid + 1;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
right = mid - 1;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Efficient slicing method for bulk operations.
|
|
92
|
+
* Always returns slices. Values can be either a Float64Array (numeric)
|
|
93
|
+
* or a JS array of HistogramValue objects (histogram series).
|
|
94
|
+
*/
|
|
95
|
+
getSlices(startTime, endTime) {
|
|
96
|
+
const emptyResult = {
|
|
97
|
+
startTimes: new Float64Array(0),
|
|
98
|
+
endTimes: new Float64Array(0),
|
|
99
|
+
values: this.isHistogram ? [] : new Float64Array(0),
|
|
100
|
+
};
|
|
101
|
+
const start = startTime ?? 0;
|
|
102
|
+
const end = endTime ?? Number.MAX_SAFE_INTEGER;
|
|
103
|
+
if (this.cursor === 0 || this.maxEndTime < start || this.minEndTime > end) {
|
|
104
|
+
return emptyResult;
|
|
105
|
+
}
|
|
106
|
+
const startIdx = this._binarySearchStart(start);
|
|
107
|
+
const endIdx = this._binarySearchEnd(end, startIdx);
|
|
108
|
+
if (startIdx > endIdx) {
|
|
109
|
+
return emptyResult;
|
|
110
|
+
}
|
|
111
|
+
const startTimesNew = this.startTimes.subarray(startIdx, endIdx + 1);
|
|
112
|
+
const endTimesNew = this.endTimes.subarray(startIdx, endIdx + 1);
|
|
113
|
+
if (this.isHistogram) {
|
|
114
|
+
// Return histogram objects as a simple JS array slice
|
|
115
|
+
return {
|
|
116
|
+
startTimes: startTimesNew,
|
|
117
|
+
endTimes: endTimesNew,
|
|
118
|
+
values: this.histograms.slice(startIdx, endIdx + 1),
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
return {
|
|
122
|
+
startTimes: startTimesNew,
|
|
123
|
+
endTimes: endTimesNew,
|
|
124
|
+
values: this.values.subarray(startIdx, endIdx + 1),
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
isFull() {
|
|
128
|
+
return this.cursor >= this.maxSamples;
|
|
129
|
+
}
|
|
130
|
+
overlaps(startTime, endTime) {
|
|
131
|
+
if (this.cursor === 0)
|
|
132
|
+
return false;
|
|
133
|
+
return !(this.maxEndTime < startTime || this.minEndTime > endTime);
|
|
134
|
+
}
|
|
135
|
+
getStats() {
|
|
136
|
+
return {
|
|
137
|
+
samples: this.cursor,
|
|
138
|
+
maxSamples: this.maxSamples,
|
|
139
|
+
minEndTime: this.minEndTime,
|
|
140
|
+
maxEndTime: this.maxEndTime,
|
|
141
|
+
memoryBytes: this.getMemoryUsage(),
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
getMemoryUsage() {
|
|
145
|
+
const arrayMemory = this.maxSamples * 8 * 3;
|
|
146
|
+
const histogramMemory = this.histograms.filter(h => h !== null).length * 200;
|
|
147
|
+
return arrayMemory + histogramMemory;
|
|
148
|
+
}
|
|
149
|
+
getMinTime() {
|
|
150
|
+
return this.minEndTime;
|
|
151
|
+
}
|
|
152
|
+
getMaxTime() {
|
|
153
|
+
return this.maxEndTime;
|
|
154
|
+
}
|
|
155
|
+
size() {
|
|
156
|
+
return this.cursor;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
exports.Chunk = Chunk;
|