@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.
Files changed (158) hide show
  1. package/.env.example +50 -17
  2. package/README.md +244 -239
  3. package/dist/cjs/config/bootConfig.cjs +18 -0
  4. package/dist/cjs/config/config.cjs +145 -0
  5. package/dist/cjs/config/config.types.cjs +5 -0
  6. package/dist/cjs/index.cjs +19 -25
  7. package/dist/cjs/{tlmRoutes.cjs → routesManager.cjs} +28 -21
  8. package/dist/cjs/{exporters/InMemoryLogRecordExporter.cjs → telemetry/custom-implementations/exporters/InMemoryDbLogExporter.cjs} +42 -19
  9. package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.cjs +97 -0
  10. package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.cjs +118 -0
  11. package/dist/cjs/telemetry/custom-implementations/exporters/PluginLogExporter.cjs +45 -0
  12. package/dist/cjs/telemetry/custom-implementations/exporters/PluginMetricExporter.cjs +46 -0
  13. package/dist/cjs/telemetry/custom-implementations/exporters/PluginSpanExporter.cjs +61 -0
  14. package/dist/cjs/telemetry/custom-implementations/processors/dynamicMultiLogProcessor.cjs +70 -0
  15. package/dist/cjs/telemetry/custom-implementations/processors/dynamicMultiSpanProcessor.cjs +70 -0
  16. package/dist/cjs/{utils → telemetry/custom-implementations/utils}/circular.cjs +39 -49
  17. package/dist/cjs/telemetry/custom-implementations/wrappers.cjs +175 -0
  18. package/dist/cjs/telemetry/initializeTelemetry.cjs +74 -0
  19. package/dist/cjs/telemetry/telemetryConfigurator.cjs +84 -0
  20. package/dist/cjs/telemetry/telemetryRegistry.cjs +40 -0
  21. package/dist/cjs/tlm-ai/agent.cjs +82 -63
  22. package/dist/cjs/tlm-ai/aiController.cjs +5 -4
  23. package/dist/cjs/tlm-ai/aiRoutes.cjs +9 -6
  24. package/dist/cjs/tlm-ai/tools.cjs +16 -9
  25. package/dist/cjs/tlm-auth/authController.cjs +14 -15
  26. package/dist/cjs/tlm-auth/authMiddleware.cjs +11 -10
  27. package/dist/cjs/tlm-auth/authRoutes.cjs +9 -7
  28. package/dist/cjs/tlm-log/logController.cjs +45 -18
  29. package/dist/cjs/tlm-log/logRoutes.cjs +16 -11
  30. package/dist/cjs/tlm-metric/metricsController.cjs +37 -12
  31. package/dist/cjs/tlm-metric/metricsRoutes.cjs +16 -11
  32. package/dist/cjs/tlm-plugin/pluginController.cjs +114 -75
  33. package/dist/cjs/tlm-plugin/pluginProcess.cjs +108 -0
  34. package/dist/cjs/tlm-plugin/pluginRoutes.cjs +11 -6
  35. package/dist/cjs/tlm-plugin/pluginService.cjs +79 -0
  36. package/dist/cjs/tlm-trace/traceController.cjs +54 -45
  37. package/dist/cjs/tlm-trace/traceRoutes.cjs +16 -11
  38. package/dist/cjs/tlm-ui/uiRoutes.cjs +26 -20
  39. package/dist/cjs/tlm-util/utilController.cjs +8 -9
  40. package/dist/cjs/tlm-util/utilRoutes.cjs +22 -19
  41. package/dist/cjs/types/index.cjs +0 -1
  42. package/dist/cjs/utils/logger.cjs +3 -5
  43. package/dist/cjs/utils/regexUtils.cjs +27 -0
  44. package/dist/esm/config/bootConfig.js +11 -0
  45. package/dist/esm/config/config.js +126 -0
  46. package/dist/esm/index.js +18 -29
  47. package/dist/esm/{tlmRoutes.js → routesManager.js} +27 -22
  48. package/dist/esm/{exporters/InMemoryLogRecordExporter.js → telemetry/custom-implementations/exporters/InMemoryDbLogExporter.js} +31 -17
  49. package/dist/esm/{exporters/InMemoryDBMetricsExporter.js → telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.js} +31 -17
  50. package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.js +105 -0
  51. package/dist/esm/telemetry/custom-implementations/exporters/PluginLogExporter.js +36 -0
  52. package/dist/esm/telemetry/custom-implementations/exporters/PluginMetricExporter.js +35 -0
  53. package/dist/esm/telemetry/custom-implementations/exporters/PluginSpanExporter.js +52 -0
  54. package/dist/esm/telemetry/custom-implementations/processors/dynamicMultiLogProcessor.js +64 -0
  55. package/dist/esm/telemetry/custom-implementations/processors/dynamicMultiSpanProcessor.js +64 -0
  56. package/dist/esm/telemetry/custom-implementations/utils/circular.js +76 -0
  57. package/dist/esm/telemetry/custom-implementations/wrappers.js +163 -0
  58. package/dist/esm/telemetry/initializeTelemetry.js +71 -0
  59. package/dist/esm/telemetry/telemetryConfigurator.js +74 -0
  60. package/dist/esm/telemetry/telemetryRegistry.js +34 -0
  61. package/dist/esm/tlm-ai/agent.js +77 -59
  62. package/dist/esm/tlm-ai/aiController.js +5 -4
  63. package/dist/esm/tlm-ai/aiRoutes.js +7 -5
  64. package/dist/esm/tlm-ai/tools.js +18 -9
  65. package/dist/esm/tlm-auth/authController.js +9 -10
  66. package/dist/esm/tlm-auth/authMiddleware.js +10 -9
  67. package/dist/esm/tlm-auth/authRoutes.js +8 -6
  68. package/dist/esm/tlm-log/logController.js +36 -16
  69. package/dist/esm/tlm-log/logRoutes.js +15 -11
  70. package/dist/esm/tlm-metric/metricsController.js +29 -10
  71. package/dist/esm/tlm-metric/metricsRoutes.js +15 -11
  72. package/dist/esm/tlm-plugin/pluginController.js +112 -77
  73. package/dist/esm/tlm-plugin/pluginProcess.js +101 -0
  74. package/dist/esm/tlm-plugin/pluginRoutes.js +10 -6
  75. package/dist/esm/tlm-plugin/pluginService.js +73 -0
  76. package/dist/esm/tlm-trace/traceController.js +40 -35
  77. package/dist/esm/tlm-trace/traceRoutes.js +15 -11
  78. package/dist/esm/tlm-ui/uiRoutes.js +24 -19
  79. package/dist/esm/tlm-util/utilController.js +8 -9
  80. package/dist/esm/tlm-util/utilRoutes.js +17 -15
  81. package/dist/esm/types/index.js +0 -1
  82. package/dist/esm/utils/logger.js +3 -4
  83. package/dist/esm/utils/regexUtils.js +23 -0
  84. package/dist/types/config/bootConfig.d.ts +5 -0
  85. package/dist/types/config/config.d.ts +858 -0
  86. package/dist/types/config/config.types.d.ts +34 -0
  87. package/dist/types/index.d.ts +5 -4
  88. package/dist/types/routesManager.d.ts +3 -0
  89. package/dist/types/{exporters/InMemoryLogRecordExporter.d.ts → telemetry/custom-implementations/exporters/InMemoryDbLogExporter.d.ts} +6 -6
  90. package/dist/types/{exporters/InMemoryDBMetricsExporter.d.ts → telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.d.ts} +7 -7
  91. package/dist/types/{exporters/InMemoryDbExporter.d.ts → telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.d.ts} +9 -9
  92. package/dist/types/telemetry/custom-implementations/exporters/PluginLogExporter.d.ts +8 -0
  93. package/dist/types/telemetry/custom-implementations/exporters/PluginMetricExporter.d.ts +12 -0
  94. package/dist/types/telemetry/custom-implementations/exporters/PluginSpanExporter.d.ts +14 -0
  95. package/dist/types/telemetry/custom-implementations/processors/dynamicMultiLogProcessor.d.ts +32 -0
  96. package/dist/types/telemetry/custom-implementations/processors/dynamicMultiSpanProcessor.d.ts +34 -0
  97. package/dist/types/telemetry/custom-implementations/utils/circular.d.ts +27 -0
  98. package/dist/types/telemetry/custom-implementations/wrappers.d.ts +52 -0
  99. package/dist/types/telemetry/initializeTelemetry.d.ts +1 -0
  100. package/dist/types/telemetry/telemetryConfigurator.d.ts +2 -0
  101. package/dist/types/telemetry/telemetryRegistry.d.ts +20 -0
  102. package/dist/types/tlm-ai/agent.d.ts +2 -1
  103. package/dist/types/tlm-ai/aiController.d.ts +4 -3
  104. package/dist/types/tlm-ai/aiRoutes.d.ts +2 -2
  105. package/dist/types/tlm-ai/tools.d.ts +3 -1
  106. package/dist/types/tlm-auth/authController.d.ts +4 -3
  107. package/dist/types/tlm-auth/authMiddleware.d.ts +2 -1
  108. package/dist/types/tlm-auth/authRoutes.d.ts +2 -2
  109. package/dist/types/tlm-log/logController.d.ts +1 -0
  110. package/dist/types/tlm-log/logRoutes.d.ts +2 -2
  111. package/dist/types/tlm-metric/metricsController.d.ts +1 -0
  112. package/dist/types/tlm-metric/metricsRoutes.d.ts +2 -2
  113. package/dist/types/tlm-plugin/pluginController.d.ts +4 -1
  114. package/dist/types/tlm-plugin/pluginProcess.d.ts +1 -0
  115. package/dist/types/tlm-plugin/pluginRoutes.d.ts +1 -2
  116. package/dist/types/tlm-plugin/pluginService.d.ts +24 -0
  117. package/dist/types/tlm-trace/traceController.d.ts +7 -6
  118. package/dist/types/tlm-trace/traceRoutes.d.ts +2 -2
  119. package/dist/types/tlm-ui/uiRoutes.d.ts +1 -2
  120. package/dist/types/tlm-util/utilController.d.ts +2 -1
  121. package/dist/types/tlm-util/utilRoutes.d.ts +2 -2
  122. package/dist/types/types/index.d.ts +17 -47
  123. package/dist/types/utils/regexUtils.d.ts +1 -0
  124. package/dist/ui/assets/index-BzIdRox6.js +1733 -0
  125. package/dist/ui/assets/index-CkoHzrrt.css +1 -0
  126. package/dist/ui/index.html +3 -3
  127. package/dist/ui/oas-tlm.svg +185 -0
  128. package/package.json +12 -7
  129. package/dist/cjs/config.cjs +0 -31
  130. package/dist/cjs/exporters/InMemoryDBMetricsExporter.cjs +0 -74
  131. package/dist/cjs/exporters/InMemoryDbExporter.cjs +0 -102
  132. package/dist/cjs/exporters/consoleExporter.cjs +0 -47
  133. package/dist/cjs/exporters/dynamicExporter.cjs +0 -57
  134. package/dist/cjs/instrumentation/index.cjs +0 -28
  135. package/dist/cjs/instrumentation/logs.cjs +0 -46
  136. package/dist/cjs/instrumentation/metrics.cjs +0 -27
  137. package/dist/cjs/instrumentation/traces.cjs +0 -19
  138. package/dist/esm/config.js +0 -20
  139. package/dist/esm/exporters/InMemoryDbExporter.js +0 -102
  140. package/dist/esm/exporters/consoleExporter.js +0 -38
  141. package/dist/esm/exporters/dynamicExporter.js +0 -50
  142. package/dist/esm/instrumentation/index.js +0 -26
  143. package/dist/esm/instrumentation/logs.js +0 -34
  144. package/dist/esm/instrumentation/metrics.js +0 -18
  145. package/dist/esm/instrumentation/traces.js +0 -12
  146. package/dist/esm/utils/circular.js +0 -84
  147. package/dist/types/config.d.ts +0 -6
  148. package/dist/types/exporters/consoleExporter.d.ts +0 -13
  149. package/dist/types/exporters/dynamicExporter.d.ts +0 -25
  150. package/dist/types/instrumentation/logs.d.ts +0 -1
  151. package/dist/types/instrumentation/metrics.d.ts +0 -1
  152. package/dist/types/instrumentation/traces.d.ts +0 -1
  153. package/dist/types/tlmRoutes.d.ts +0 -2
  154. package/dist/types/utils/circular.d.ts +0 -31
  155. package/dist/ui/assets/index-BNhZBPi2.css +0 -1
  156. package/dist/ui/assets/index-DxGAMrAl.js +0 -401
  157. package/dist/ui/vite.svg +0 -1
  158. /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;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -4,40 +4,34 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = oasTelemetry;
7
- require("./instrumentation/index.cjs");
8
- var _config = require("./config.cjs");
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 _tlmRoutes = require("./tlmRoutes.cjs");
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 Oas Telemetry middleware. The parameters are the same as `globalOasTlmConfig`.
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
- if (process.env.OASTLM_MODULE_DISABLED === 'true') {
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
- if (oasTlmInputConfig) {
24
- _logger.default.info("User provided config");
25
- // Override global config with user provided config
26
- for (const key in _config.globalOasTlmConfig) {
27
- _config.globalOasTlmConfig[key] = oasTlmInputConfig[key] ?? _config.globalOasTlmConfig[key];
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 _config = require("./config.cjs");
11
- var _metricsRoutes = _interopRequireDefault(require("./tlm-metric/metricsRoutes.cjs"));
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 = _interopRequireDefault(require("./tlm-auth/authRoutes.cjs"));
14
- var _uiRoutes = _interopRequireDefault(require("./tlm-ui/uiRoutes.cjs"));
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 = _interopRequireDefault(require("./tlm-util/utilRoutes.cjs"));
18
- var _logRoutes = _interopRequireDefault(require("./tlm-log/logRoutes.cjs"));
19
- var _aiRoutes = _interopRequireDefault(require("./tlm-ai/aiRoutes.cjs"));
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 (process.env.OASTLM_ENV === 'development') {
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(() => _config.globalOasTlmConfig.authEnabled, [(0, _cookieParser.default)(), _authRoutes.default, _authMiddleware.authMiddleware]);
40
- const baseURL = _config.globalOasTlmConfig.baseURL;
41
- router.use(baseURL, allAuthMiddlewares);
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(baseURL + "/traces", _traceRoutes.default);
44
- router.use(baseURL + "/metrics", _metricsRoutes.default);
45
- router.use(baseURL + "/logs", _logRoutes.default);
46
- router.use(baseURL + "/ai", getWrappedMiddlewares(() => process.env.OASTLM_AI_OPENAI_API_KEY !== null && process.env.OASTLM_AI_OPENAI_API_KEY !== "", [_aiRoutes.default]));
47
- router.use(baseURL + "/oas-telemetry-ui", _uiRoutes.default);
48
- router.use(baseURL + "/utils", _utilRoutes.default);
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(baseURL, (req, res) => {
51
- res.redirect(baseURL + "/oas-telemetry-ui");
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.InMemoryLogRecordExporter = void 0;
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 InMemoryLogRecordExporter {
13
- constructor() {
14
- this._db = new _nedb.default();
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._stopped = false;
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._stopped) {
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
- console.dir(`MiniSearch found ${ids.length} results for search term "${messageSearch}"`, {
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
- console.dir(err);
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.InMemoryLogRecordExporter = InMemoryLogRecordExporter;
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;