@oas-tools/oas-telemetry 0.7.0-alpha.2 → 0.7.0-alpha.4
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 +50 -17
- package/README.md +244 -239
- package/dist/cjs/config/bootConfig.cjs +18 -0
- package/dist/cjs/config/config.cjs +145 -0
- package/dist/cjs/config/config.types.cjs +5 -0
- package/dist/cjs/index.cjs +19 -25
- package/dist/cjs/{tlmRoutes.cjs → routesManager.cjs} +28 -21
- package/dist/cjs/{exporters/InMemoryLogRecordExporter.cjs → telemetry/custom-implementations/exporters/InMemoryDbLogExporter.cjs} +42 -19
- package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.cjs +97 -0
- package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.cjs +118 -0
- package/dist/cjs/telemetry/custom-implementations/exporters/PluginLogExporter.cjs +45 -0
- package/dist/cjs/telemetry/custom-implementations/exporters/PluginMetricExporter.cjs +46 -0
- package/dist/cjs/telemetry/custom-implementations/exporters/PluginSpanExporter.cjs +61 -0
- package/dist/cjs/telemetry/custom-implementations/processors/dynamicMultiLogProcessor.cjs +70 -0
- package/dist/cjs/telemetry/custom-implementations/processors/dynamicMultiSpanProcessor.cjs +70 -0
- package/dist/cjs/{utils → telemetry/custom-implementations/utils}/circular.cjs +39 -49
- package/dist/cjs/telemetry/custom-implementations/wrappers.cjs +175 -0
- package/dist/cjs/telemetry/initializeTelemetry.cjs +74 -0
- package/dist/cjs/telemetry/telemetryConfigurator.cjs +84 -0
- package/dist/cjs/telemetry/telemetryRegistry.cjs +40 -0
- package/dist/cjs/tlm-ai/agent.cjs +82 -63
- package/dist/cjs/tlm-ai/aiController.cjs +5 -4
- package/dist/cjs/tlm-ai/aiRoutes.cjs +9 -6
- package/dist/cjs/tlm-ai/tools.cjs +16 -9
- package/dist/cjs/tlm-auth/authController.cjs +14 -15
- package/dist/cjs/tlm-auth/authMiddleware.cjs +11 -10
- package/dist/cjs/tlm-auth/authRoutes.cjs +9 -7
- package/dist/cjs/tlm-log/logController.cjs +45 -18
- package/dist/cjs/tlm-log/logRoutes.cjs +16 -11
- package/dist/cjs/tlm-metric/metricsController.cjs +37 -12
- package/dist/cjs/tlm-metric/metricsRoutes.cjs +16 -11
- package/dist/cjs/tlm-plugin/pluginController.cjs +114 -75
- package/dist/cjs/tlm-plugin/pluginProcess.cjs +108 -0
- package/dist/cjs/tlm-plugin/pluginRoutes.cjs +11 -6
- package/dist/cjs/tlm-plugin/pluginService.cjs +79 -0
- package/dist/cjs/tlm-trace/traceController.cjs +54 -45
- package/dist/cjs/tlm-trace/traceRoutes.cjs +16 -11
- package/dist/cjs/tlm-ui/uiRoutes.cjs +26 -20
- package/dist/cjs/tlm-util/utilController.cjs +8 -9
- package/dist/cjs/tlm-util/utilRoutes.cjs +22 -19
- package/dist/cjs/types/index.cjs +0 -1
- package/dist/cjs/utils/logger.cjs +3 -5
- package/dist/cjs/utils/regexUtils.cjs +27 -0
- package/dist/esm/config/bootConfig.js +11 -0
- package/dist/esm/config/config.js +126 -0
- package/dist/esm/index.js +18 -29
- package/dist/esm/{tlmRoutes.js → routesManager.js} +27 -22
- package/dist/esm/{exporters/InMemoryLogRecordExporter.js → telemetry/custom-implementations/exporters/InMemoryDbLogExporter.js} +31 -17
- package/dist/esm/{exporters/InMemoryDBMetricsExporter.js → telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.js} +31 -17
- package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.js +105 -0
- package/dist/esm/telemetry/custom-implementations/exporters/PluginLogExporter.js +36 -0
- package/dist/esm/telemetry/custom-implementations/exporters/PluginMetricExporter.js +35 -0
- package/dist/esm/telemetry/custom-implementations/exporters/PluginSpanExporter.js +52 -0
- package/dist/esm/telemetry/custom-implementations/processors/dynamicMultiLogProcessor.js +64 -0
- package/dist/esm/telemetry/custom-implementations/processors/dynamicMultiSpanProcessor.js +64 -0
- package/dist/esm/telemetry/custom-implementations/utils/circular.js +76 -0
- package/dist/esm/telemetry/custom-implementations/wrappers.js +163 -0
- package/dist/esm/telemetry/initializeTelemetry.js +71 -0
- package/dist/esm/telemetry/telemetryConfigurator.js +74 -0
- package/dist/esm/telemetry/telemetryRegistry.js +34 -0
- package/dist/esm/tlm-ai/agent.js +77 -59
- package/dist/esm/tlm-ai/aiController.js +5 -4
- package/dist/esm/tlm-ai/aiRoutes.js +7 -5
- package/dist/esm/tlm-ai/tools.js +18 -9
- package/dist/esm/tlm-auth/authController.js +9 -10
- package/dist/esm/tlm-auth/authMiddleware.js +10 -9
- package/dist/esm/tlm-auth/authRoutes.js +8 -6
- package/dist/esm/tlm-log/logController.js +36 -16
- package/dist/esm/tlm-log/logRoutes.js +15 -11
- package/dist/esm/tlm-metric/metricsController.js +29 -10
- package/dist/esm/tlm-metric/metricsRoutes.js +15 -11
- package/dist/esm/tlm-plugin/pluginController.js +112 -77
- package/dist/esm/tlm-plugin/pluginProcess.js +101 -0
- package/dist/esm/tlm-plugin/pluginRoutes.js +10 -6
- package/dist/esm/tlm-plugin/pluginService.js +73 -0
- package/dist/esm/tlm-trace/traceController.js +40 -35
- package/dist/esm/tlm-trace/traceRoutes.js +15 -11
- package/dist/esm/tlm-ui/uiRoutes.js +24 -19
- package/dist/esm/tlm-util/utilController.js +8 -9
- package/dist/esm/tlm-util/utilRoutes.js +17 -15
- package/dist/esm/types/index.js +0 -1
- package/dist/esm/utils/logger.js +3 -4
- package/dist/esm/utils/regexUtils.js +23 -0
- package/dist/types/config/bootConfig.d.ts +5 -0
- package/dist/types/config/config.d.ts +858 -0
- package/dist/types/config/config.types.d.ts +34 -0
- package/dist/types/index.d.ts +5 -4
- package/dist/types/routesManager.d.ts +3 -0
- package/dist/types/{exporters/InMemoryLogRecordExporter.d.ts → telemetry/custom-implementations/exporters/InMemoryDbLogExporter.d.ts} +6 -6
- package/dist/types/{exporters/InMemoryDBMetricsExporter.d.ts → telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.d.ts} +7 -7
- package/dist/types/{exporters/InMemoryDbExporter.d.ts → telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.d.ts} +9 -9
- package/dist/types/telemetry/custom-implementations/exporters/PluginLogExporter.d.ts +8 -0
- package/dist/types/telemetry/custom-implementations/exporters/PluginMetricExporter.d.ts +12 -0
- package/dist/types/telemetry/custom-implementations/exporters/PluginSpanExporter.d.ts +14 -0
- package/dist/types/telemetry/custom-implementations/processors/dynamicMultiLogProcessor.d.ts +32 -0
- package/dist/types/telemetry/custom-implementations/processors/dynamicMultiSpanProcessor.d.ts +34 -0
- package/dist/types/telemetry/custom-implementations/utils/circular.d.ts +27 -0
- package/dist/types/telemetry/custom-implementations/wrappers.d.ts +52 -0
- package/dist/types/telemetry/initializeTelemetry.d.ts +1 -0
- package/dist/types/telemetry/telemetryConfigurator.d.ts +2 -0
- package/dist/types/telemetry/telemetryRegistry.d.ts +20 -0
- package/dist/types/tlm-ai/agent.d.ts +2 -1
- package/dist/types/tlm-ai/aiController.d.ts +4 -3
- package/dist/types/tlm-ai/aiRoutes.d.ts +2 -2
- package/dist/types/tlm-ai/tools.d.ts +3 -1
- package/dist/types/tlm-auth/authController.d.ts +4 -3
- package/dist/types/tlm-auth/authMiddleware.d.ts +2 -1
- package/dist/types/tlm-auth/authRoutes.d.ts +2 -2
- package/dist/types/tlm-log/logController.d.ts +1 -0
- package/dist/types/tlm-log/logRoutes.d.ts +2 -2
- package/dist/types/tlm-metric/metricsController.d.ts +1 -0
- package/dist/types/tlm-metric/metricsRoutes.d.ts +2 -2
- package/dist/types/tlm-plugin/pluginController.d.ts +4 -1
- package/dist/types/tlm-plugin/pluginProcess.d.ts +1 -0
- package/dist/types/tlm-plugin/pluginRoutes.d.ts +1 -2
- package/dist/types/tlm-plugin/pluginService.d.ts +24 -0
- package/dist/types/tlm-trace/traceController.d.ts +7 -6
- package/dist/types/tlm-trace/traceRoutes.d.ts +2 -2
- package/dist/types/tlm-ui/uiRoutes.d.ts +1 -2
- package/dist/types/tlm-util/utilController.d.ts +2 -1
- package/dist/types/tlm-util/utilRoutes.d.ts +2 -2
- package/dist/types/types/index.d.ts +17 -47
- package/dist/types/utils/regexUtils.d.ts +1 -0
- package/dist/ui/assets/index-BzIdRox6.js +1733 -0
- package/dist/ui/assets/index-CkoHzrrt.css +1 -0
- package/dist/ui/index.html +3 -3
- package/dist/ui/oas-tlm.svg +185 -0
- package/package.json +12 -7
- package/dist/cjs/config.cjs +0 -31
- package/dist/cjs/exporters/InMemoryDBMetricsExporter.cjs +0 -74
- package/dist/cjs/exporters/InMemoryDbExporter.cjs +0 -102
- package/dist/cjs/exporters/consoleExporter.cjs +0 -47
- package/dist/cjs/exporters/dynamicExporter.cjs +0 -57
- package/dist/cjs/instrumentation/index.cjs +0 -28
- package/dist/cjs/instrumentation/logs.cjs +0 -46
- package/dist/cjs/instrumentation/metrics.cjs +0 -27
- package/dist/cjs/instrumentation/traces.cjs +0 -19
- package/dist/esm/config.js +0 -20
- package/dist/esm/exporters/InMemoryDbExporter.js +0 -102
- package/dist/esm/exporters/consoleExporter.js +0 -38
- package/dist/esm/exporters/dynamicExporter.js +0 -50
- package/dist/esm/instrumentation/index.js +0 -26
- package/dist/esm/instrumentation/logs.js +0 -34
- package/dist/esm/instrumentation/metrics.js +0 -18
- package/dist/esm/instrumentation/traces.js +0 -12
- package/dist/esm/utils/circular.js +0 -84
- package/dist/types/config.d.ts +0 -6
- package/dist/types/exporters/consoleExporter.d.ts +0 -13
- package/dist/types/exporters/dynamicExporter.d.ts +0 -25
- package/dist/types/instrumentation/logs.d.ts +0 -1
- package/dist/types/instrumentation/metrics.d.ts +0 -1
- package/dist/types/instrumentation/traces.d.ts +0 -1
- package/dist/types/tlmRoutes.d.ts +0 -2
- package/dist/types/utils/circular.d.ts +0 -31
- package/dist/ui/assets/index-BNhZBPi2.css +0 -1
- package/dist/ui/assets/index-DxGAMrAl.js +0 -401
- package/dist/ui/vite.svg +0 -1
- /package/dist/{types/instrumentation/index.d.ts → esm/config/config.types.js} +0 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.bootEnvVariables = void 0;
|
|
7
|
+
var _dotenv = _interopRequireDefault(require("dotenv"));
|
|
8
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
if (process.env.NODE_ENV !== 'test') {
|
|
10
|
+
_dotenv.default.config();
|
|
11
|
+
}
|
|
12
|
+
// This variables can NOT be configured via oasTelemetry(config)
|
|
13
|
+
// They are used at the import of the library
|
|
14
|
+
const bootEnvVariables = exports.bootEnvVariables = {
|
|
15
|
+
OASTLM_BOOT_ENV: process.env.OASTLM_BOOT_ENV || process.env.NODE_ENV || 'production',
|
|
16
|
+
OASTLM_BOOT_MODULE_DISABLED: process.env.OASTLM_BOOT_MODULE_DISABLED === 'true',
|
|
17
|
+
OASTLM_BOOT_LOG_LEVEL: process.env.OASTLM_BOOT_LOG_LEVEL || 'INFO'
|
|
18
|
+
};
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getConfig = exports.defaultConfig = void 0;
|
|
7
|
+
var _lodash = _interopRequireDefault(require("lodash.merge"));
|
|
8
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
// Environment-level config (highest priority)
|
|
10
|
+
// If NOT defined, it should return UNDEFINED so it dose not override the userConfig or defaultConfig.
|
|
11
|
+
// Thats why we use getParsedEnvVar with no default value.
|
|
12
|
+
const loadEnv = () => {
|
|
13
|
+
return {
|
|
14
|
+
general: {
|
|
15
|
+
baseUrl: getParsedEnvVar("OASTLM_CONFIG_GENERAL_BASE_URL"),
|
|
16
|
+
specFileName: getParsedEnvVar("OASTLM_CONFIG_GENERAL_SPEC_FILE_NAME")
|
|
17
|
+
// spec Not settable via env
|
|
18
|
+
},
|
|
19
|
+
auth: {
|
|
20
|
+
enabled: getParsedEnvVar("OASTLM_CONFIG_AUTH_ENABLED", v => v === "true"),
|
|
21
|
+
apiKeyMaxAge: getParsedEnvVar("OASTLM_CONFIG_AUTH_API_KEY_MAX_AGE", v => parseInt(v, 10)),
|
|
22
|
+
password: getParsedEnvVar("OASTLM_CONFIG_AUTH_PASSWORD"),
|
|
23
|
+
jwtSecret: getParsedEnvVar("OASTLM_CONFIG_AUTH_JWT_SECRET")
|
|
24
|
+
},
|
|
25
|
+
traces: {
|
|
26
|
+
memoryExporter: {
|
|
27
|
+
enabled: getParsedEnvVar("OASTLM_CONFIG_TRACES_MEMORY_EXPORTER_ENABLED", v => v === "true"),
|
|
28
|
+
retentionTimeSeconds: getParsedEnvVar("OASTLM_CONFIG_TRACES_MEMORY_EXPORTER_RETENTION_TIME_SECONDS", v => parseInt(v, 10))
|
|
29
|
+
// filters NOT settable via env
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
metrics: {
|
|
33
|
+
mainMetricReaderOptions: {
|
|
34
|
+
exportIntervalMillis: getParsedEnvVar("OASTLM_CONFIG_METRICS_MAIN_READER_EXPORT_INTERVAL", v => parseInt(v, 10))
|
|
35
|
+
// metricProducers NOT settable via env
|
|
36
|
+
},
|
|
37
|
+
memoryExporter: {
|
|
38
|
+
enabled: getParsedEnvVar("OASTLM_CONFIG_METRICS_MEMORY_EXPORTER_ENABLED", v => v === "true"),
|
|
39
|
+
retentionTimeSeconds: getParsedEnvVar("OASTLM_CONFIG_METRICS_MEMORY_EXPORTER_RETENTION_TIME_SECONDS", v => parseInt(v, 10))
|
|
40
|
+
// filters NOT settable via env
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
logs: {
|
|
44
|
+
memoryExporter: {
|
|
45
|
+
enabled: getParsedEnvVar("OASTLM_CONFIG_LOGS_MEMORY_EXPORTER_ENABLED", v => v === "true"),
|
|
46
|
+
retentionTimeSeconds: getParsedEnvVar("OASTLM_CONFIG_LOGS_MEMORY_EXPORTER_RETENTION_TIME_SECONDS", v => parseInt(v, 10))
|
|
47
|
+
// filters NOT settable via env
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
ai: {
|
|
51
|
+
openAIKey: getParsedEnvVar("OASTLM_CONFIG_AI_OPENAI_KEY"),
|
|
52
|
+
openAIModel: getParsedEnvVar("OASTLM_CONFIG_AI_OPENAI_MODEL", v => v || "gpt-3.5-turbo"),
|
|
53
|
+
extraContextPrompts: getParsedEnvVar("OASTLM_CONFIG_AI_EXTRA_CONTEXT_PROMPTS", v => v ? v.split(',') : [])
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
// This defines de OasTlmConfig type, which is used throughout the library.
|
|
58
|
+
// Please ensure that all possible types are included here, not only the defaults.
|
|
59
|
+
// e.g. .ai.openAIKey: null as string | null, default is null, but can be set to a string.
|
|
60
|
+
// NOTE: Some BOOT environment variables (e.g., OASTLM_BOOT_MODULE_DISABLED) are accessed before this config is loaded.
|
|
61
|
+
// This means certain settings may affect application startup behavior outside of this configuration system.
|
|
62
|
+
const defaultConfig = exports.defaultConfig = {
|
|
63
|
+
general: {
|
|
64
|
+
baseUrl: "/telemetry",
|
|
65
|
+
specFileName: null,
|
|
66
|
+
// e.g. "oas.json" or null if not provided
|
|
67
|
+
spec: null,
|
|
68
|
+
// e.g. JSON.stringify(oasSpec) or null if not provided,
|
|
69
|
+
uiPath: "/oas-telemetry-ui" // path to the UI, e.g. "/oas-telemetry-ui" WARN: This must match the UI package's App.tsx "oas-telemetry-ui" path
|
|
70
|
+
},
|
|
71
|
+
auth: {
|
|
72
|
+
enabled: false,
|
|
73
|
+
apiKeyMaxAge: 1000 * 60 * 60,
|
|
74
|
+
// 1 hour
|
|
75
|
+
password: "oas-telemetry-password",
|
|
76
|
+
jwtSecret: "oas-telemetry-secret"
|
|
77
|
+
},
|
|
78
|
+
ai: {
|
|
79
|
+
openAIKey: null,
|
|
80
|
+
openAIModel: "gpt-3.5-turbo",
|
|
81
|
+
extraContextPrompts: [] // e.g. ["Provide detailed explanations", "Use simple language"]
|
|
82
|
+
},
|
|
83
|
+
traces: {
|
|
84
|
+
extraExporters: [],
|
|
85
|
+
// e.g. [new ConsoleSpanExporter()]
|
|
86
|
+
extraProcessors: [],
|
|
87
|
+
// e.g. [new SimpleSpanProcessor(new ConsoleSpanExporter())]
|
|
88
|
+
mainProcessorOptions: {
|
|
89
|
+
config: undefined
|
|
90
|
+
},
|
|
91
|
+
memoryExporter: {
|
|
92
|
+
enabled: true,
|
|
93
|
+
// auto start exporting.
|
|
94
|
+
retentionTimeSeconds: 60 * 60 // 1 hour
|
|
95
|
+
},
|
|
96
|
+
filters: [] // future feature, currently not used
|
|
97
|
+
},
|
|
98
|
+
metrics: {
|
|
99
|
+
mainMetricReaderOptions: {
|
|
100
|
+
exportIntervalMillis: 1000 * 60,
|
|
101
|
+
// 60 seconds
|
|
102
|
+
metricProducers: [] // experimental by OpenTelemetry, not used by OAS-TLM yet
|
|
103
|
+
},
|
|
104
|
+
extraReaders: [],
|
|
105
|
+
// e.g. [new PrometheusExporter()]
|
|
106
|
+
extraViews: [],
|
|
107
|
+
// e.g. [new MetricView({ name: 'my_metric', labels: ['env'] })]
|
|
108
|
+
memoryExporter: {
|
|
109
|
+
enabled: true,
|
|
110
|
+
retentionTimeSeconds: 60 * 60 // 1 hour
|
|
111
|
+
},
|
|
112
|
+
filters: [] // future feature, currently not used
|
|
113
|
+
},
|
|
114
|
+
logs: {
|
|
115
|
+
extraExporters: [],
|
|
116
|
+
// e.g. [new ConsoleLogRecordExporter()]
|
|
117
|
+
extraProcessors: [],
|
|
118
|
+
// e.g. [new SimpleLogRecordProcessor(new ConsoleLogRecordExporter())]
|
|
119
|
+
memoryExporter: {
|
|
120
|
+
enabled: true,
|
|
121
|
+
retentionTimeSeconds: 60 * 60 // 1 hour
|
|
122
|
+
},
|
|
123
|
+
filters: [] // future feature, currently not used
|
|
124
|
+
},
|
|
125
|
+
plugins: {
|
|
126
|
+
enabled: true,
|
|
127
|
+
// future feature
|
|
128
|
+
extraPlugins: [] // future feature
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
// Helper to get an environment variable with optional transform
|
|
132
|
+
const getParsedEnvVar = (envKey, transform) => {
|
|
133
|
+
const rawValue = process.env[envKey];
|
|
134
|
+
// Treat undefined and "" in env as undefined (skip)
|
|
135
|
+
if (rawValue === undefined || rawValue === "") return undefined;
|
|
136
|
+
if (typeof transform === 'function') {
|
|
137
|
+
return transform(rawValue);
|
|
138
|
+
}
|
|
139
|
+
return rawValue;
|
|
140
|
+
};
|
|
141
|
+
const getConfig = (userConfig, fallbackConfig = defaultConfig, envConfig = loadEnv()) => {
|
|
142
|
+
// environment variables OVERRIDE userConfig OVERRIDE fallbackConfig
|
|
143
|
+
return (0, _lodash.default)({}, fallbackConfig, userConfig, envConfig);
|
|
144
|
+
};
|
|
145
|
+
exports.getConfig = getConfig;
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -4,40 +4,34 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = oasTelemetry;
|
|
7
|
-
require("./
|
|
8
|
-
|
|
9
|
-
var _express = require("express");
|
|
10
|
-
var _InMemoryDbExporter = require("./exporters/InMemoryDbExporter.cjs");
|
|
7
|
+
var _bootConfig = require("./config/bootConfig.cjs");
|
|
8
|
+
require("./telemetry/initializeTelemetry.cjs");
|
|
11
9
|
var _logger = _interopRequireDefault(require("./utils/logger.cjs"));
|
|
12
|
-
var
|
|
10
|
+
var _config = require("./config/config.cjs");
|
|
11
|
+
var _express = require("express");
|
|
12
|
+
var _routesManager = require("./routesManager.cjs");
|
|
13
|
+
var _telemetryConfigurator = require("./telemetry/telemetryConfigurator.cjs");
|
|
13
14
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
15
|
+
// Load environment variables before any other imports
|
|
16
|
+
// Initialize OpenTelemetry instrumentation
|
|
17
|
+
|
|
14
18
|
/**
|
|
15
|
-
* Returns the
|
|
19
|
+
* Returns the OAS-Telemetry middleware.
|
|
16
20
|
* All parameters are optional. However, either `spec` or `specFileName` must be provided to enable endpoint filtering.
|
|
17
21
|
*/
|
|
18
22
|
function oasTelemetry(oasTlmInputConfig) {
|
|
19
23
|
const router = (0, _express.Router)();
|
|
20
|
-
|
|
24
|
+
// This environment variable cannot be set via the config object,
|
|
25
|
+
// as it is required to disable OpenTelemetry SDK initialization,
|
|
26
|
+
// which occurs during the first import at the top of this file.
|
|
27
|
+
if (_bootConfig.bootEnvVariables.OASTLM_BOOT_MODULE_DISABLED) {
|
|
21
28
|
return router;
|
|
22
29
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
_logger.default.info("BaseURL: ", _config.globalOasTlmConfig.baseURL);
|
|
31
|
-
_config.globalOasTlmConfig.dynamicSpanExporter.changeExporter(_config.globalOasTlmConfig.exporter ?? new _InMemoryDbExporter.InMemoryExporter());
|
|
32
|
-
if (_config.globalOasTlmConfig.spec) _logger.default.info(`Spec content provided`);else {
|
|
33
|
-
if (_config.globalOasTlmConfig.specFileName != "") _logger.default.info(`Spec file used for telemetry: ${_config.globalOasTlmConfig.specFileName}`);else {
|
|
34
|
-
console.error("No spec available !");
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
if (_config.globalOasTlmConfig.autoActivate) {
|
|
38
|
-
_config.globalOasTlmConfig.dynamicSpanExporter.exporter?.start();
|
|
39
|
-
}
|
|
40
|
-
(0, _tlmRoutes.configureRoutes)(router);
|
|
30
|
+
const oasTlmConfig = (0, _config.getConfig)(oasTlmInputConfig);
|
|
31
|
+
_logger.default.info("BaseUrl: ", oasTlmConfig.general.baseUrl);
|
|
32
|
+
if (!oasTlmConfig.general.spec && !oasTlmConfig.general.specFileName) _logger.default.warn("No spec provided, endpoint filtering will not be available. Please provide either `spec` or `specFileName` in the configuration.");
|
|
33
|
+
(0, _telemetryConfigurator.configureTelemetry)(oasTlmConfig);
|
|
34
|
+
(0, _routesManager.configureRoutes)(router, oasTlmConfig);
|
|
41
35
|
return router;
|
|
42
36
|
}
|
|
43
37
|
module.exports = exports.default;
|
|
@@ -7,19 +7,20 @@ exports.configureRoutes = void 0;
|
|
|
7
7
|
var _express = require("express");
|
|
8
8
|
var _logger = _interopRequireDefault(require("./utils/logger.cjs"));
|
|
9
9
|
var _cors = _interopRequireDefault(require("cors"));
|
|
10
|
-
var
|
|
11
|
-
var _metricsRoutes =
|
|
10
|
+
var _traceRoutes = require("./tlm-trace/traceRoutes.cjs");
|
|
11
|
+
var _metricsRoutes = require("./tlm-metric/metricsRoutes.cjs");
|
|
12
|
+
var _logRoutes = require("./tlm-log/logRoutes.cjs");
|
|
12
13
|
var _cookieParser = _interopRequireDefault(require("cookie-parser"));
|
|
13
|
-
var _authRoutes =
|
|
14
|
-
var _uiRoutes =
|
|
15
|
-
var _traceRoutes = _interopRequireDefault(require("./tlm-trace/traceRoutes.cjs"));
|
|
14
|
+
var _authRoutes = require("./tlm-auth/authRoutes.cjs");
|
|
15
|
+
var _uiRoutes = require("./tlm-ui/uiRoutes.cjs");
|
|
16
16
|
var _authMiddleware = require("./tlm-auth/authMiddleware.cjs");
|
|
17
|
-
var _utilRoutes =
|
|
18
|
-
var
|
|
19
|
-
var
|
|
17
|
+
var _utilRoutes = require("./tlm-util/utilRoutes.cjs");
|
|
18
|
+
var _aiRoutes = require("./tlm-ai/aiRoutes.cjs");
|
|
19
|
+
var _bootConfig = require("./config/bootConfig.cjs");
|
|
20
|
+
var _pluginRoutes = require("./tlm-plugin/pluginRoutes.cjs");
|
|
20
21
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
21
|
-
const configureRoutes = router => {
|
|
22
|
-
if (
|
|
22
|
+
const configureRoutes = (router, oasTlmConfig) => {
|
|
23
|
+
if (_bootConfig.bootEnvVariables.OASTLM_BOOT_ENV === 'development') {
|
|
23
24
|
_logger.default.info("Running in development mode, enabling CORS for all origins");
|
|
24
25
|
router.use((0, _cors.default)({
|
|
25
26
|
origin: '*',
|
|
@@ -36,19 +37,25 @@ const configureRoutes = router => {
|
|
|
36
37
|
limit: '10mb'
|
|
37
38
|
})(req, res, next);
|
|
38
39
|
});
|
|
39
|
-
const allAuthMiddlewares = getWrappedMiddlewares(() =>
|
|
40
|
-
const
|
|
41
|
-
router.use(
|
|
40
|
+
const allAuthMiddlewares = getWrappedMiddlewares(() => oasTlmConfig.auth.enabled, [(0, _cookieParser.default)(), (0, _authRoutes.getAuthRoutes)(oasTlmConfig), (0, _authMiddleware.getAuthMiddleware)(oasTlmConfig)]);
|
|
41
|
+
const baseUrl = oasTlmConfig.general.baseUrl;
|
|
42
|
+
router.use(baseUrl, allAuthMiddlewares);
|
|
43
|
+
router.use(baseUrl + "/traces", (0, _traceRoutes.getTraceRoutes)());
|
|
44
|
+
router.use(baseUrl + "/metrics", (0, _metricsRoutes.getMetricsRoutes)());
|
|
45
|
+
router.use(baseUrl + "/logs", (0, _logRoutes.getLogRoutes)());
|
|
46
|
+
router.use(baseUrl + "/ai", getWrappedMiddlewares(() => oasTlmConfig.ai.openAIKey !== null, [(0, _aiRoutes.getAIRoutes)(oasTlmConfig)]));
|
|
42
47
|
// WARNING: This path must be the same as the one used in the UI package App.tsx "oas-telemetry-ui"
|
|
43
|
-
router.use(
|
|
44
|
-
router.use(
|
|
45
|
-
router.use(
|
|
46
|
-
router.
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
router.use(baseUrl + "/oas-telemetry-ui", (0, _uiRoutes.getUIRoutes)());
|
|
49
|
+
router.use(baseUrl + "/utils", (0, _utilRoutes.getUtilsRoutes)(oasTlmConfig));
|
|
50
|
+
router.use(baseUrl + "/plugins", (0, _pluginRoutes.getPluginRoutes)());
|
|
51
|
+
router.get(baseUrl + '/health', (_req, res) => {
|
|
52
|
+
res.status(200).send({
|
|
53
|
+
status: 'OK'
|
|
54
|
+
});
|
|
55
|
+
});
|
|
49
56
|
//redirect to the UI when accessing the base URL
|
|
50
|
-
router.get(
|
|
51
|
-
res.redirect(
|
|
57
|
+
router.get(baseUrl, (req, res) => {
|
|
58
|
+
res.redirect(baseUrl + "/oas-telemetry-ui");
|
|
52
59
|
});
|
|
53
60
|
};
|
|
54
61
|
/**
|
|
@@ -3,21 +3,30 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
6
|
+
exports.InMemoryDbLogExporter = void 0;
|
|
7
7
|
var _core = require("@opentelemetry/core");
|
|
8
|
-
var _circular = require("../utils/circular.cjs");
|
|
9
8
|
var _nedb = _interopRequireDefault(require("@seald-io/nedb"));
|
|
10
9
|
var _minisearch = _interopRequireDefault(require("minisearch"));
|
|
10
|
+
var _circular = require("../utils/circular.cjs");
|
|
11
|
+
var _wrappers = require("../wrappers.cjs");
|
|
12
|
+
var _logger = _interopRequireDefault(require("../../../utils/logger.cjs"));
|
|
11
13
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
-
class
|
|
13
|
-
constructor() {
|
|
14
|
-
|
|
14
|
+
class InMemoryDbLogExporter extends _wrappers.Enabler {
|
|
15
|
+
constructor(retentionTimeInSeconds = 3600) {
|
|
16
|
+
super();
|
|
17
|
+
this._retentionTimeInSeconds = retentionTimeInSeconds;
|
|
18
|
+
this._db = new _nedb.default({
|
|
19
|
+
timestampData: true
|
|
20
|
+
});
|
|
21
|
+
this._db.ensureIndex({
|
|
22
|
+
fieldName: 'createdAt'
|
|
23
|
+
});
|
|
15
24
|
this._miniSearch = new _minisearch.default({
|
|
16
25
|
fields: ['body'],
|
|
17
26
|
storeFields: ['_id'],
|
|
18
27
|
idField: '_id'
|
|
19
28
|
});
|
|
20
|
-
this.
|
|
29
|
+
this._startCleanupJob();
|
|
21
30
|
}
|
|
22
31
|
/*
|
|
23
32
|
* SUPER WARNING:
|
|
@@ -31,7 +40,7 @@ class InMemoryLogRecordExporter {
|
|
|
31
40
|
* @param resultCallback
|
|
32
41
|
*/
|
|
33
42
|
export(logs, resultCallback) {
|
|
34
|
-
if (this.
|
|
43
|
+
if (!this.isEnabled()) {
|
|
35
44
|
resultCallback({
|
|
36
45
|
code: _core.ExportResultCode.SUCCESS
|
|
37
46
|
});
|
|
@@ -65,7 +74,7 @@ class InMemoryLogRecordExporter {
|
|
|
65
74
|
if (messageSearch) {
|
|
66
75
|
const searchResults = this._miniSearch.search(messageSearch);
|
|
67
76
|
const ids = searchResults.map(result => result._id);
|
|
68
|
-
|
|
77
|
+
_logger.default.debug(`MiniSearch found ${ids.length} results for search term "${messageSearch}"`, {
|
|
69
78
|
depth: 3
|
|
70
79
|
});
|
|
71
80
|
// Add MiniSearch results to the query
|
|
@@ -80,7 +89,7 @@ class InMemoryLogRecordExporter {
|
|
|
80
89
|
if (result.code === _core.ExportResultCode.SUCCESS) {
|
|
81
90
|
this._db.find({}, (err, docs) => {
|
|
82
91
|
if (err) {
|
|
83
|
-
|
|
92
|
+
_logger.default.debug(err);
|
|
84
93
|
callback(err, []);
|
|
85
94
|
return;
|
|
86
95
|
}
|
|
@@ -91,15 +100,6 @@ class InMemoryLogRecordExporter {
|
|
|
91
100
|
}
|
|
92
101
|
});
|
|
93
102
|
}
|
|
94
|
-
start() {
|
|
95
|
-
this._stopped = false;
|
|
96
|
-
}
|
|
97
|
-
stop() {
|
|
98
|
-
this._stopped = true;
|
|
99
|
-
}
|
|
100
|
-
isRunning() {
|
|
101
|
-
return !this._stopped;
|
|
102
|
-
}
|
|
103
103
|
getFinishedLogs() {
|
|
104
104
|
return this._db.getAllData();
|
|
105
105
|
}
|
|
@@ -125,6 +125,10 @@ class InMemoryLogRecordExporter {
|
|
|
125
125
|
attributes: logRecord.attributes
|
|
126
126
|
};
|
|
127
127
|
}
|
|
128
|
+
set retentionTimeInSeconds(retentionTimeInSeconds) {
|
|
129
|
+
this._retentionTimeInSeconds = retentionTimeInSeconds;
|
|
130
|
+
_logger.default.info(`InMemoryDbLogExporter retention time set to ${this._retentionTimeInSeconds} seconds`);
|
|
131
|
+
}
|
|
128
132
|
_insertLogs(logsToInsert, resultCallback) {
|
|
129
133
|
this._db.insert(logsToInsert, (err, newDocs) => {
|
|
130
134
|
if (err) {
|
|
@@ -142,5 +146,24 @@ class InMemoryLogRecordExporter {
|
|
|
142
146
|
});
|
|
143
147
|
return;
|
|
144
148
|
}
|
|
149
|
+
_startCleanupJob() {
|
|
150
|
+
const interval = 1000;
|
|
151
|
+
setInterval(() => {
|
|
152
|
+
const expirationDate = new Date(Date.now() - this._retentionTimeInSeconds * 1000);
|
|
153
|
+
this._db.remove({
|
|
154
|
+
createdAt: {
|
|
155
|
+
$lt: expirationDate
|
|
156
|
+
}
|
|
157
|
+
}, {
|
|
158
|
+
multi: true
|
|
159
|
+
}, (err, numRemoved) => {
|
|
160
|
+
if (err) {
|
|
161
|
+
_logger.default.error('Error in TTL cleanup:', err);
|
|
162
|
+
} else if (numRemoved > 0) {
|
|
163
|
+
_logger.default.debug(`TTL cleanup: removed ${numRemoved} expired logs`);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
}, interval);
|
|
167
|
+
}
|
|
145
168
|
}
|
|
146
|
-
exports.
|
|
169
|
+
exports.InMemoryDbLogExporter = InMemoryDbLogExporter;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.InMemoryDbMetricExporter = void 0;
|
|
7
|
+
var _core = require("@opentelemetry/core");
|
|
8
|
+
var _nedb = _interopRequireDefault(require("@seald-io/nedb"));
|
|
9
|
+
var _circular = require("../utils/circular.cjs");
|
|
10
|
+
var _wrappers = require("../wrappers.cjs");
|
|
11
|
+
var _logger = _interopRequireDefault(require("../../../utils/logger.cjs"));
|
|
12
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
+
class InMemoryDbMetricExporter extends _wrappers.Enabler {
|
|
14
|
+
constructor(retentionTimeInSeconds = 3600) {
|
|
15
|
+
super();
|
|
16
|
+
this._retentionTimeInSeconds = retentionTimeInSeconds;
|
|
17
|
+
this._metrics = new _nedb.default({
|
|
18
|
+
timestampData: true
|
|
19
|
+
});
|
|
20
|
+
this._metrics.ensureIndex({
|
|
21
|
+
fieldName: 'createdAt'
|
|
22
|
+
});
|
|
23
|
+
this._startCleanupJob();
|
|
24
|
+
}
|
|
25
|
+
export(metrics, resultCallback) {
|
|
26
|
+
try {
|
|
27
|
+
if (this.isEnabled()) {
|
|
28
|
+
const scopeMetrics = metrics?.scopeMetrics;
|
|
29
|
+
const cleanMetrics = (0, _circular.applyNesting)(scopeMetrics);
|
|
30
|
+
this._metrics.insert(cleanMetrics, (err, _newDoc) => {
|
|
31
|
+
if (err) {
|
|
32
|
+
_logger.default.error('Insertion Error:', err);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
setTimeout(() => resultCallback({
|
|
38
|
+
code: _core.ExportResultCode.SUCCESS
|
|
39
|
+
}), 0);
|
|
40
|
+
} catch (error) {
|
|
41
|
+
_logger.default.error('Error exporting metrics\n' + error.message + '\n' + error.stack);
|
|
42
|
+
return resultCallback({
|
|
43
|
+
code: _core.ExportResultCode.FAILED,
|
|
44
|
+
error: new Error('Error exporting metrics\n' + error.message + '\n' + error.stack)
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
shutdown() {
|
|
49
|
+
this._enabled = false;
|
|
50
|
+
this._metrics = new _nedb.default();
|
|
51
|
+
return this.forceFlush();
|
|
52
|
+
}
|
|
53
|
+
forceFlush() {
|
|
54
|
+
return Promise.resolve();
|
|
55
|
+
}
|
|
56
|
+
find(search, callback) {
|
|
57
|
+
this._metrics.find(search, callback);
|
|
58
|
+
}
|
|
59
|
+
reset() {
|
|
60
|
+
this._metrics = new _nedb.default();
|
|
61
|
+
}
|
|
62
|
+
getFinishedMetrics() {
|
|
63
|
+
return this._metrics.getAllData();
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Inserts metrics into the in-memory database.
|
|
67
|
+
* @param metrics - The metrics to insert.
|
|
68
|
+
* @param callback - The callback to execute after insertion.
|
|
69
|
+
*/
|
|
70
|
+
insert(metrics, callback) {
|
|
71
|
+
this._metrics.insert(metrics, callback);
|
|
72
|
+
}
|
|
73
|
+
set retentionTimeInSeconds(retentionTimeInSeconds) {
|
|
74
|
+
this._retentionTimeInSeconds = retentionTimeInSeconds;
|
|
75
|
+
_logger.default.info(`InMemoryDbMetricExporter retention time set to ${this._retentionTimeInSeconds} seconds`);
|
|
76
|
+
}
|
|
77
|
+
_startCleanupJob() {
|
|
78
|
+
const interval = 1000;
|
|
79
|
+
setInterval(() => {
|
|
80
|
+
const expirationDate = new Date(Date.now() - this._retentionTimeInSeconds * 1000);
|
|
81
|
+
this._metrics.remove({
|
|
82
|
+
createdAt: {
|
|
83
|
+
$lt: expirationDate
|
|
84
|
+
}
|
|
85
|
+
}, {
|
|
86
|
+
multi: true
|
|
87
|
+
}, (err, numRemoved) => {
|
|
88
|
+
if (err) {
|
|
89
|
+
_logger.default.error('Error in TTL cleanup:', err);
|
|
90
|
+
} else if (numRemoved > 0) {
|
|
91
|
+
_logger.default.debug(`TTL cleanup: removed ${numRemoved} expired metrics`);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
}, interval);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
exports.InMemoryDbMetricExporter = InMemoryDbMetricExporter;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.InMemoryDbSpanExporter = void 0;
|
|
7
|
+
var _core = require("@opentelemetry/core");
|
|
8
|
+
var _nedb = _interopRequireDefault(require("@seald-io/nedb"));
|
|
9
|
+
var _logger = _interopRequireDefault(require("../../../utils/logger.cjs"));
|
|
10
|
+
var _circular = require("../utils/circular.cjs");
|
|
11
|
+
var _wrappers = require("../wrappers.cjs");
|
|
12
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
+
class InMemoryDbSpanExporter extends _wrappers.Enabler {
|
|
14
|
+
constructor(retentionTimeInSeconds = 3600) {
|
|
15
|
+
super();
|
|
16
|
+
this._baseUrl = '/telemetry'; // Default base URL, can be overridden by the config
|
|
17
|
+
this._retentionTimeInSeconds = retentionTimeInSeconds;
|
|
18
|
+
this._spans = new _nedb.default({
|
|
19
|
+
timestampData: true
|
|
20
|
+
});
|
|
21
|
+
this._spans.ensureIndex({
|
|
22
|
+
fieldName: 'createdAt'
|
|
23
|
+
});
|
|
24
|
+
this._startCleanupJob();
|
|
25
|
+
}
|
|
26
|
+
set baseUrl(baseUrl) {
|
|
27
|
+
this._baseUrl = baseUrl;
|
|
28
|
+
}
|
|
29
|
+
set retentionTimeInSeconds(retentionTimeInSeconds) {
|
|
30
|
+
this._retentionTimeInSeconds = retentionTimeInSeconds;
|
|
31
|
+
_logger.default.info(`InMemoryDbSpanExporter retention time set to ${this._retentionTimeInSeconds} seconds`);
|
|
32
|
+
}
|
|
33
|
+
export(readableSpans, resultCallback) {
|
|
34
|
+
_logger.default.debug('InMemoryDbSpanExporter.export called with spans: ', readableSpans.length);
|
|
35
|
+
try {
|
|
36
|
+
if (!this.isEnabled()) {
|
|
37
|
+
_logger.default.debug('InMemoryDbSpanExporter is not enabled. Skipping export.');
|
|
38
|
+
return resultCallback({
|
|
39
|
+
code: _core.ExportResultCode.SUCCESS
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
// Prepare spans to be inserted into the in-memory database (remove circular references and convert to nested objects)
|
|
43
|
+
const cleanSpans = readableSpans.map(nestedSpan => (0, _circular.removeCircularRefs)(nestedSpan)) // to avoid JSON parsing error
|
|
44
|
+
.map(span => (0, _circular.applyNesting)(span)) // to avoid dot notation in keys (neDB does not support dot notation in keys)
|
|
45
|
+
.filter(span => {
|
|
46
|
+
const target = span?.attributes?.http?.target; // Exclude spans where target includes 'telemetry' but NOT 'telemetry/utils'
|
|
47
|
+
if (target && target.includes(this._baseUrl)) {
|
|
48
|
+
return target.includes(this._baseUrl + '/utils');
|
|
49
|
+
}
|
|
50
|
+
return true;
|
|
51
|
+
});
|
|
52
|
+
// Insert spans into the in-memory database
|
|
53
|
+
this._spans.insert(cleanSpans, (err, _newDoc) => {
|
|
54
|
+
if (err) {
|
|
55
|
+
_logger.default.error(err);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
setTimeout(() => resultCallback({
|
|
60
|
+
code: _core.ExportResultCode.SUCCESS
|
|
61
|
+
}), 0);
|
|
62
|
+
} catch (error) {
|
|
63
|
+
_logger.default.error('Error exporting spans\n' + error.message + '\n' + error.stack);
|
|
64
|
+
return resultCallback({
|
|
65
|
+
code: _core.ExportResultCode.FAILED,
|
|
66
|
+
error: new Error('Error exporting spans\n' + error.message + '\n' + error.stack)
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
shutdown() {
|
|
71
|
+
this._spans = new _nedb.default();
|
|
72
|
+
return this.forceFlush();
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Exports any pending spans in the exporter
|
|
76
|
+
*/
|
|
77
|
+
forceFlush() {
|
|
78
|
+
return Promise.resolve();
|
|
79
|
+
}
|
|
80
|
+
//err,docs
|
|
81
|
+
find(search, callback) {
|
|
82
|
+
this._spans.find(search, callback);
|
|
83
|
+
}
|
|
84
|
+
reset() {
|
|
85
|
+
this._spans = new _nedb.default();
|
|
86
|
+
}
|
|
87
|
+
getFinishedSpans() {
|
|
88
|
+
return this._spans.getAllData();
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Inserts spans into the in-memory database.
|
|
92
|
+
* @param spans - The spans to insert.
|
|
93
|
+
* @param callback - The callback to execute after insertion.
|
|
94
|
+
*/
|
|
95
|
+
insert(spans, callback) {
|
|
96
|
+
this._spans.insert(spans, callback);
|
|
97
|
+
}
|
|
98
|
+
_startCleanupJob() {
|
|
99
|
+
const interval = 1000;
|
|
100
|
+
setInterval(() => {
|
|
101
|
+
const expirationDate = new Date(Date.now() - this._retentionTimeInSeconds * 1000);
|
|
102
|
+
this._spans.remove({
|
|
103
|
+
createdAt: {
|
|
104
|
+
$lt: expirationDate
|
|
105
|
+
}
|
|
106
|
+
}, {
|
|
107
|
+
multi: true
|
|
108
|
+
}, (err, numRemoved) => {
|
|
109
|
+
if (err) {
|
|
110
|
+
_logger.default.error('Error in TTL cleanup:', err);
|
|
111
|
+
} else if (numRemoved > 0) {
|
|
112
|
+
_logger.default.debug(`TTL cleanup: removed ${numRemoved} expired spans`);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
}, interval);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
exports.InMemoryDbSpanExporter = InMemoryDbSpanExporter;
|