@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.
Files changed (194) hide show
  1. package/.env.example +17 -3
  2. package/README.md +1 -2
  3. package/dist/cjs/config/bootConfig.cjs +16 -14
  4. package/dist/cjs/config/config.cjs +120 -125
  5. package/dist/cjs/config/config.types.cjs +1 -4
  6. package/dist/cjs/docs/openapi.yaml +158 -4
  7. package/dist/cjs/index.cjs +27 -30
  8. package/dist/cjs/routesManager.cjs +62 -70
  9. package/dist/cjs/telemetry/custom-implementations/exporters/DiskLogExporter.cjs +121 -0
  10. package/dist/cjs/telemetry/custom-implementations/exporters/DiskMetricExporter.cjs +101 -0
  11. package/dist/cjs/telemetry/custom-implementations/exporters/DiskTraceExporter.cjs +103 -0
  12. package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.cjs +194 -190
  13. package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.cjs +147 -99
  14. package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.cjs +143 -116
  15. package/dist/cjs/telemetry/custom-implementations/exporters/MultiMetricExporter.cjs +57 -0
  16. package/dist/cjs/telemetry/custom-implementations/instrumentations/logsInstrumentation.cjs +92 -0
  17. package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/Chunk.cjs +159 -0
  18. package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/Series.cjs +168 -0
  19. package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/SeriesRegistry.cjs +392 -0
  20. package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/types.cjs +2 -0
  21. package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/utils.cjs +77 -0
  22. package/dist/cjs/telemetry/custom-implementations/processors/dynamicMultiLogProcessor.cjs +65 -63
  23. package/dist/cjs/telemetry/custom-implementations/processors/dynamicMultiSpanProcessor.cjs +63 -62
  24. package/dist/cjs/telemetry/custom-implementations/utils/circular.cjs +47 -47
  25. package/dist/cjs/telemetry/custom-implementations/wrappers.cjs +209 -138
  26. package/dist/cjs/telemetry/initializeTelemetry.cjs +35 -91
  27. package/dist/cjs/telemetry/persistence/DiskImporter.cjs +85 -0
  28. package/dist/cjs/telemetry/persistence/DiskUtils.cjs +61 -0
  29. package/dist/cjs/telemetry/persistence/DiskWriter.cjs +66 -0
  30. package/dist/cjs/telemetry/telemetryConfigurator.cjs +139 -72
  31. package/dist/cjs/telemetry/telemetryRegistry.cjs +45 -31
  32. package/dist/cjs/tlm-ai/agent.cjs +49 -64
  33. package/dist/cjs/tlm-ai/aiController.cjs +54 -76
  34. package/dist/cjs/tlm-ai/aiRoutes.cjs +17 -20
  35. package/dist/cjs/tlm-ai/aiService.cjs +91 -95
  36. package/dist/cjs/tlm-ai/tools.cjs +177 -174
  37. package/dist/cjs/tlm-auth/authController.cjs +80 -123
  38. package/dist/cjs/tlm-auth/authMiddleware.cjs +25 -30
  39. package/dist/cjs/tlm-auth/authRoutes.cjs +11 -14
  40. package/dist/cjs/tlm-log/logController.cjs +135 -116
  41. package/dist/cjs/tlm-log/logRoutes.cjs +19 -20
  42. package/dist/cjs/tlm-log/logService.cjs +29 -0
  43. package/dist/cjs/tlm-metric/metricsController.cjs +154 -122
  44. package/dist/cjs/tlm-metric/metricsRoutes.cjs +22 -20
  45. package/dist/cjs/tlm-metric/metricsService.cjs +26 -0
  46. package/dist/cjs/tlm-plugin/pluginController.cjs +128 -140
  47. package/dist/cjs/tlm-plugin/pluginProcess.cjs +89 -94
  48. package/dist/cjs/tlm-plugin/pluginRoutes.cjs +11 -14
  49. package/dist/cjs/tlm-plugin/pluginService.cjs +73 -74
  50. package/dist/cjs/tlm-trace/traceController.cjs +140 -123
  51. package/dist/cjs/tlm-trace/traceRoutes.cjs +19 -20
  52. package/dist/cjs/tlm-trace/traceService.cjs +29 -0
  53. package/dist/cjs/tlm-ui/uiRoutes.cjs +63 -32
  54. package/dist/cjs/tlm-util/utilController.cjs +68 -70
  55. package/dist/cjs/tlm-util/utilRoutes.cjs +51 -63
  56. package/dist/cjs/types/index.cjs +2 -5
  57. package/dist/cjs/utils/logger.cjs +38 -43
  58. package/dist/cjs/utils/regexUtils.cjs +22 -22
  59. package/dist/esm/config/bootConfig.js +5 -2
  60. package/dist/esm/config/config.js +9 -2
  61. package/dist/esm/docs/openapi.yaml +158 -4
  62. package/dist/esm/index.js +9 -8
  63. package/dist/esm/routesManager.js +6 -10
  64. package/dist/esm/telemetry/custom-implementations/exporters/DiskLogExporter.js +114 -0
  65. package/dist/esm/telemetry/custom-implementations/exporters/DiskMetricExporter.js +94 -0
  66. package/dist/esm/telemetry/custom-implementations/exporters/DiskTraceExporter.js +96 -0
  67. package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.js +38 -7
  68. package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.js +107 -48
  69. package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.js +60 -29
  70. package/dist/esm/telemetry/custom-implementations/exporters/MultiMetricExporter.js +53 -0
  71. package/dist/esm/telemetry/custom-implementations/instrumentations/logsInstrumentation.js +85 -0
  72. package/dist/esm/telemetry/custom-implementations/metrics/tsdb/Chunk.js +155 -0
  73. package/dist/esm/telemetry/custom-implementations/metrics/tsdb/Series.js +164 -0
  74. package/dist/esm/telemetry/custom-implementations/metrics/tsdb/SeriesRegistry.js +385 -0
  75. package/dist/esm/telemetry/custom-implementations/metrics/tsdb/types.js +1 -0
  76. package/dist/esm/telemetry/custom-implementations/metrics/tsdb/utils.js +74 -0
  77. package/dist/esm/telemetry/custom-implementations/processors/dynamicMultiLogProcessor.js +2 -1
  78. package/dist/esm/telemetry/custom-implementations/processors/dynamicMultiSpanProcessor.js +1 -1
  79. package/dist/esm/telemetry/custom-implementations/wrappers.js +77 -6
  80. package/dist/esm/telemetry/initializeTelemetry.js +27 -69
  81. package/dist/esm/telemetry/persistence/DiskImporter.js +78 -0
  82. package/dist/esm/telemetry/persistence/DiskUtils.js +51 -0
  83. package/dist/esm/telemetry/persistence/DiskWriter.js +59 -0
  84. package/dist/esm/telemetry/telemetryConfigurator.js +110 -39
  85. package/dist/esm/telemetry/telemetryRegistry.js +12 -1
  86. package/dist/esm/tlm-ai/agent.js +5 -3
  87. package/dist/esm/tlm-ai/aiController.js +3 -3
  88. package/dist/esm/tlm-ai/aiService.js +6 -2
  89. package/dist/esm/tlm-ai/tools.js +5 -9
  90. package/dist/esm/tlm-auth/authController.js +3 -2
  91. package/dist/esm/tlm-log/logController.js +62 -18
  92. package/dist/esm/tlm-log/logRoutes.js +3 -1
  93. package/dist/esm/tlm-log/logService.js +25 -0
  94. package/dist/esm/tlm-metric/metricsController.js +116 -50
  95. package/dist/esm/tlm-metric/metricsRoutes.js +8 -3
  96. package/dist/esm/tlm-metric/metricsService.js +22 -0
  97. package/dist/esm/tlm-plugin/pluginController.js +6 -11
  98. package/dist/esm/tlm-plugin/pluginService.js +2 -4
  99. package/dist/esm/tlm-trace/traceController.js +87 -36
  100. package/dist/esm/tlm-trace/traceRoutes.js +3 -1
  101. package/dist/esm/tlm-trace/traceService.js +25 -0
  102. package/dist/esm/tlm-ui/uiRoutes.js +5 -5
  103. package/dist/esm/tlm-util/utilController.js +3 -9
  104. package/dist/esm/tlm-util/utilRoutes.js +2 -2
  105. package/dist/types/config/bootConfig.d.ts +3 -0
  106. package/dist/types/config/config.d.ts +48 -7
  107. package/dist/types/config/config.types.d.ts +7 -0
  108. package/dist/types/index.d.ts +2 -3
  109. package/dist/types/telemetry/custom-implementations/exporters/DiskLogExporter.d.ts +24 -0
  110. package/dist/types/telemetry/custom-implementations/exporters/DiskMetricExporter.d.ts +23 -0
  111. package/dist/types/telemetry/custom-implementations/exporters/DiskTraceExporter.d.ts +23 -0
  112. package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.d.ts +3 -1
  113. package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.d.ts +56 -15
  114. package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.d.ts +8 -4
  115. package/dist/types/telemetry/custom-implementations/exporters/MultiMetricExporter.d.ts +9 -0
  116. package/dist/types/telemetry/custom-implementations/instrumentations/logsInstrumentation.d.ts +23 -0
  117. package/dist/types/telemetry/custom-implementations/metrics/tsdb/Chunk.d.ts +49 -0
  118. package/dist/types/telemetry/custom-implementations/metrics/tsdb/Series.d.ts +67 -0
  119. package/dist/types/telemetry/custom-implementations/metrics/tsdb/SeriesRegistry.d.ts +69 -0
  120. package/dist/types/telemetry/custom-implementations/metrics/tsdb/types.d.ts +68 -0
  121. package/dist/types/telemetry/custom-implementations/metrics/tsdb/utils.d.ts +21 -0
  122. package/dist/types/telemetry/custom-implementations/processors/dynamicMultiLogProcessor.d.ts +2 -2
  123. package/dist/types/telemetry/custom-implementations/wrappers.d.ts +2 -1
  124. package/dist/types/telemetry/persistence/DiskImporter.d.ts +17 -0
  125. package/dist/types/telemetry/persistence/DiskUtils.d.ts +11 -0
  126. package/dist/types/telemetry/persistence/DiskWriter.d.ts +21 -0
  127. package/dist/types/telemetry/telemetryConfigurator.d.ts +1 -1
  128. package/dist/types/telemetry/telemetryRegistry.d.ts +8 -0
  129. package/dist/types/tlm-ai/agent.d.ts +1 -1
  130. package/dist/types/tlm-ai/aiService.d.ts +1 -1
  131. package/dist/types/tlm-log/logController.d.ts +2 -0
  132. package/dist/types/tlm-log/logService.d.ts +4 -0
  133. package/dist/types/tlm-metric/metricsController.d.ts +11 -2
  134. package/dist/types/tlm-metric/metricsService.d.ts +6 -0
  135. package/dist/types/tlm-trace/traceController.d.ts +9 -7
  136. package/dist/types/tlm-trace/traceService.d.ts +4 -0
  137. package/dist/types/types/index.d.ts +2 -2
  138. package/dist/ui/assets/{ApiDocsPage-C_VVPPHa.js → ApiDocsPage-DTCgVbW2.js} +2 -2
  139. package/dist/ui/assets/CollapsibleCard-lWgfsaAn.js +1 -0
  140. package/dist/ui/assets/DevToolsPage-DEhf8CBy.js +1 -0
  141. package/dist/ui/assets/LandingPage-CfEHCDxY.js +6 -0
  142. package/dist/ui/assets/LogsPage-DFDKRuGH.js +1 -0
  143. package/dist/ui/assets/{NotFoundPage-B3quk3P1.js → NotFoundPage-DCy0DcV7.js} +1 -1
  144. package/dist/ui/assets/PluginCreatePage-BawZ5_-h.js +50 -0
  145. package/dist/ui/assets/PluginPage-D3FmgU7d.js +27 -0
  146. package/dist/ui/assets/TraceSpansPage-D0_L45Rb.js +6 -0
  147. package/dist/ui/assets/VirtualizedListPanel-q605n9He.js +16 -0
  148. package/dist/ui/assets/alert-DBAFshSi.js +1133 -0
  149. package/dist/ui/assets/badge-DGNBtnxU.js +1 -0
  150. package/dist/ui/assets/{chevron-down-CPsvsmqj.js → chevron-down-CFEqYzGC.js} +1 -1
  151. package/dist/ui/assets/{chevron-up-Df9jMo1X.js → chevron-up-lDnFwAJq.js} +1 -1
  152. package/dist/ui/assets/{circle-alert-DOPQPvU8.js → circle-alert-BpYUuRs7.js} +1 -1
  153. package/dist/ui/assets/dialog-1dRyI6SC.js +15 -0
  154. package/dist/ui/assets/index-C7RfU6hR.js +1 -0
  155. package/dist/ui/assets/index-C9dDYIpd.js +305 -0
  156. package/dist/ui/assets/index-D6f1KjWV.css +1 -0
  157. package/dist/ui/assets/info-CuJQWoBU.js +6 -0
  158. package/dist/ui/assets/{input-Dzvg_ZEZ.js → input-BLXaar0X.js} +1 -1
  159. package/dist/ui/assets/label-DfAcltsl.js +1 -0
  160. package/dist/ui/assets/{loader-circle-CrvlRy5o.js → loader-circle-B7oLyPsi.js} +1 -1
  161. package/dist/ui/assets/{loginPage-qa4V-B70.js → loginPage-DswZvOJ-.js} +1 -1
  162. package/dist/ui/assets/metrics-page-BhtXrfUW.js +31 -0
  163. package/dist/ui/assets/metrics-page-D1GxaB_c.css +1 -0
  164. package/dist/ui/assets/popover-IDker85U.js +11 -0
  165. package/dist/ui/assets/select-B8y5IidE.js +6 -0
  166. package/dist/ui/assets/separator-B6EzrxYY.js +6 -0
  167. package/dist/ui/assets/severityOptions-DtCsaAZK.js +11 -0
  168. package/dist/ui/assets/square-pen-D_oecB1x.js +6 -0
  169. package/dist/ui/assets/switch-Dqo0XkRD.js +1 -0
  170. package/dist/ui/assets/trace-DJq1miYa.js +1 -0
  171. package/dist/ui/assets/upload-prIohEdY.js +11 -0
  172. package/dist/ui/assets/{utilService-DNyqzwj0.js → utilService-C8TJKLqs.js} +1 -1
  173. package/dist/ui/assets/wand-sparkles-OgXuzsSx.js +6 -0
  174. package/dist/ui/index.html +2 -2
  175. package/package.json +44 -49
  176. package/dist/ui/assets/CollapsibleCard-B3KR_8mL.js +0 -1
  177. package/dist/ui/assets/DevToolsPage-OyZcDcmw.js +0 -1
  178. package/dist/ui/assets/LandingPage-CppFBA6K.js +0 -6
  179. package/dist/ui/assets/LogsPage-9Fq8GArS.js +0 -26
  180. package/dist/ui/assets/PluginCreatePage-X_aCH4t4.js +0 -50
  181. package/dist/ui/assets/PluginPage-DMDSihrZ.js +0 -27
  182. package/dist/ui/assets/alert-jQ9HCPIf.js +0 -1133
  183. package/dist/ui/assets/badge-CNq0-mH5.js +0 -1
  184. package/dist/ui/assets/card-DFAwwhN3.js +0 -1
  185. package/dist/ui/assets/index-BkD6DijD.js +0 -15
  186. package/dist/ui/assets/index-CERGVYZK.js +0 -292
  187. package/dist/ui/assets/index-CSIPf9qw.css +0 -1
  188. package/dist/ui/assets/label-DuVnkZ4q.js +0 -1
  189. package/dist/ui/assets/select-DhS8YUtJ.js +0 -1
  190. package/dist/ui/assets/separator-isK4chBP.js +0 -6
  191. package/dist/ui/assets/severityOptions-O38dSOfk.js +0 -11
  192. package/dist/ui/assets/switch-Z3mImG9n.js +0 -1
  193. package/dist/ui/assets/tabs-_77MUUQe.js +0 -16
  194. package/dist/ui/assets/upload-C1LT4Gkb.js +0 -16
@@ -1,35 +1,36 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.EnablerSpanExporter = exports.EnablerMultiSpanExporter = exports.EnablerMultiLogExporter = exports.EnablerMetricReader = exports.EnablerLogExporter = exports.Enabler = void 0;
7
- var _resources = require("@opentelemetry/resources");
8
- var _logger = _interopRequireDefault(require("../../utils/logger.cjs"));
9
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
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.EnablerMetricReader = exports.EnablerMultiLogExporter = exports.EnablerMultiSpanExporter = exports.EnablerLogExporter = exports.EnablerSpanExporter = exports.Enabler = void 0;
7
+ const core_1 = require("@opentelemetry/core");
8
+ const resources_1 = require("@opentelemetry/resources");
9
+ const logger_js_1 = __importDefault(require("../../utils/logger.cjs"));
10
10
  class Enabler {
11
- constructor(enabled) {
12
- this._enabled = true;
13
- if (typeof enabled === 'boolean') {
14
- this._enabled = enabled;
15
- }
16
- }
17
- setEnabledValue(value) {
18
- this._enabled = value;
19
- }
20
- enable() {
21
- this._enabled = true;
22
- }
23
- disable() {
24
- this._enabled = false;
25
- }
26
- isEnabled() {
27
- return this._enabled;
28
- }
29
- toggle() {
30
- this._enabled = !this._enabled;
31
- }
11
+ _enabled = true;
12
+ constructor(enabled) {
13
+ if (typeof enabled === 'boolean') {
14
+ this._enabled = enabled;
15
+ }
16
+ }
17
+ setEnabledValue(value) {
18
+ this._enabled = value;
19
+ }
20
+ enable() {
21
+ this._enabled = true;
22
+ }
23
+ disable() {
24
+ this._enabled = false;
25
+ }
26
+ isEnabled() {
27
+ return this._enabled;
28
+ }
29
+ toggle() {
30
+ this._enabled = !this._enabled;
31
+ }
32
32
  }
33
+ exports.Enabler = Enabler;
33
34
  /*
34
35
  * Classes for enabler exporters, allowing enable/disable toggling of exporters at runtime.
35
36
  *
@@ -46,130 +47,200 @@ class Enabler {
46
47
  * disabled, the reader's `collect` method is not called at all, saving additional resources compared to disabling the exporter.
47
48
  *
48
49
  */
49
- exports.Enabler = Enabler;
50
50
  class EnablerSpanExporter extends Enabler {
51
- constructor(exporter) {
52
- super();
53
- this.exporter = exporter;
54
- }
55
- export(spans, resultCallback) {
56
- if (this.isEnabled()) {
57
- this.exporter.export(spans, resultCallback);
58
- }
59
- }
60
- shutdown() {
61
- return this.exporter.shutdown();
62
- }
63
- forceFlush() {
64
- if (typeof this.exporter.forceFlush === 'function') {
65
- return this.exporter.forceFlush();
66
- }
67
- return Promise.resolve();
68
- }
51
+ exporter;
52
+ constructor(exporter) {
53
+ super();
54
+ this.exporter = exporter;
55
+ }
56
+ export(spans, resultCallback) {
57
+ if (this.isEnabled()) {
58
+ this.exporter.export(spans, resultCallback);
59
+ }
60
+ }
61
+ shutdown() {
62
+ return this.exporter.shutdown();
63
+ }
64
+ forceFlush() {
65
+ if (typeof this.exporter.forceFlush === 'function') {
66
+ return this.exporter.forceFlush();
67
+ }
68
+ return Promise.resolve();
69
+ }
69
70
  }
70
71
  exports.EnablerSpanExporter = EnablerSpanExporter;
71
72
  class EnablerLogExporter extends Enabler {
72
- constructor(exporter) {
73
- super();
74
- this.exporter = exporter;
75
- }
76
- export(logs, resultCallback) {
77
- if (this.isEnabled()) {
78
- this.exporter.export(logs, resultCallback);
79
- }
80
- }
81
- shutdown() {
82
- return this.exporter.shutdown();
83
- }
73
+ exporter;
74
+ constructor(exporter) {
75
+ super();
76
+ this.exporter = exporter;
77
+ }
78
+ export(logs, resultCallback) {
79
+ if (this.isEnabled()) {
80
+ this.exporter.export(logs, resultCallback);
81
+ }
82
+ }
83
+ shutdown() {
84
+ return this.exporter.shutdown();
85
+ }
84
86
  }
85
87
  exports.EnablerLogExporter = EnablerLogExporter;
86
88
  class EnablerMultiExporter extends Enabler {
87
- constructor(exporters) {
88
- super();
89
- this._exporters = [];
90
- if (exporters && Array.isArray(exporters)) {
91
- this._exporters = exporters;
92
- }
93
- }
94
- addExporters(exporter) {
95
- if (!this._exporters) {
96
- this._exporters = [];
97
- }
98
- if (Array.isArray(exporter)) {
99
- this._exporters.push(...exporter);
100
- } else {
101
- this._exporters.push(exporter);
102
- }
103
- }
89
+ _exporters = [];
90
+ constructor(exporters) {
91
+ super();
92
+ if (exporters && Array.isArray(exporters)) {
93
+ this._exporters = exporters;
94
+ }
95
+ }
96
+ addExporters(exporter) {
97
+ if (!this._exporters) {
98
+ this._exporters = [];
99
+ }
100
+ if (Array.isArray(exporter)) {
101
+ this._exporters.push(...exporter);
102
+ }
103
+ else {
104
+ this._exporters.push(exporter);
105
+ }
106
+ }
107
+ clearExporters() {
108
+ this._exporters = [];
109
+ }
104
110
  }
105
111
  class EnablerMultiSpanExporter extends EnablerMultiExporter {
106
- export(spans, resultCallback) {
107
- _logger.default.debug(`EnablerMultiSpanExporter.export called with ${spans.length} spans, exporters: ${this._exporters?.length ?? 0}, enabled: ${this.isEnabled()}`);
108
- if (this.isEnabled() && this._exporters) {
109
- this._exporters.forEach(exporter => exporter.export(spans, resultCallback));
110
- }
111
- }
112
- async shutdown() {
113
- if (this._exporters) {
114
- await Promise.all(this._exporters.map(exporter => exporter.shutdown()));
115
- }
116
- return;
117
- }
112
+ export(spans, resultCallback) {
113
+ logger_js_1.default.debug(`EnablerMultiSpanExporter.export called with ${spans.length} spans, exporters: ${this._exporters?.length ?? 0}, enabled: ${this.isEnabled()}`);
114
+ if (!this.isEnabled() || !this._exporters || this._exporters.length === 0) {
115
+ resultCallback({ code: core_1.ExportResultCode.SUCCESS });
116
+ return;
117
+ }
118
+ let pending = this._exporters.length;
119
+ let failed = false;
120
+ let firstError;
121
+ this._exporters.forEach((exporter) => {
122
+ try {
123
+ exporter.export(spans, (result) => {
124
+ if (result.code === core_1.ExportResultCode.FAILED) {
125
+ failed = true;
126
+ if (result.error && !firstError) {
127
+ firstError = result.error;
128
+ }
129
+ }
130
+ pending -= 1;
131
+ if (pending === 0) {
132
+ resultCallback(failed
133
+ ? { code: core_1.ExportResultCode.FAILED, error: firstError }
134
+ : { code: core_1.ExportResultCode.SUCCESS });
135
+ }
136
+ });
137
+ }
138
+ catch (error) {
139
+ failed = true;
140
+ if (!firstError) {
141
+ firstError = error instanceof Error ? error : new Error(String(error));
142
+ }
143
+ pending -= 1;
144
+ if (pending === 0) {
145
+ resultCallback({ code: core_1.ExportResultCode.FAILED, error: firstError });
146
+ }
147
+ }
148
+ });
149
+ }
150
+ async shutdown() {
151
+ if (this._exporters) {
152
+ await Promise.all(this._exporters.map((exporter) => exporter.shutdown()));
153
+ }
154
+ return;
155
+ }
118
156
  }
119
157
  exports.EnablerMultiSpanExporter = EnablerMultiSpanExporter;
120
158
  class EnablerMultiLogExporter extends EnablerMultiExporter {
121
- export(logs, resultCallback) {
122
- if (this.isEnabled() && this._exporters) {
123
- this._exporters.forEach(exporter => exporter.export(logs, resultCallback));
159
+ export(logs, resultCallback) {
160
+ if (!this.isEnabled() || !this._exporters || this._exporters.length === 0) {
161
+ resultCallback({ code: core_1.ExportResultCode.SUCCESS });
162
+ return;
163
+ }
164
+ let pending = this._exporters.length;
165
+ let failed = false;
166
+ let firstError;
167
+ this._exporters.forEach((exporter) => {
168
+ try {
169
+ exporter.export(logs, (result) => {
170
+ if (result.code === core_1.ExportResultCode.FAILED) {
171
+ failed = true;
172
+ if (result.error && !firstError) {
173
+ firstError = result.error;
174
+ }
175
+ }
176
+ pending -= 1;
177
+ if (pending === 0) {
178
+ resultCallback(failed
179
+ ? { code: core_1.ExportResultCode.FAILED, error: firstError }
180
+ : { code: core_1.ExportResultCode.SUCCESS });
181
+ }
182
+ });
183
+ }
184
+ catch (error) {
185
+ failed = true;
186
+ if (!firstError) {
187
+ firstError = error instanceof Error ? error : new Error(String(error));
188
+ }
189
+ pending -= 1;
190
+ if (pending === 0) {
191
+ resultCallback({ code: core_1.ExportResultCode.FAILED, error: firstError });
192
+ }
193
+ }
194
+ });
124
195
  }
125
- }
126
- async shutdown() {
127
- if (this._exporters) {
128
- await Promise.all(this._exporters.map(exporter => exporter.shutdown()));
196
+ async shutdown() {
197
+ if (this._exporters) {
198
+ await Promise.all(this._exporters.map((exporter) => exporter.shutdown()));
199
+ }
200
+ return;
129
201
  }
130
- return;
131
- }
132
202
  }
133
203
  exports.EnablerMultiLogExporter = EnablerMultiLogExporter;
134
204
  class EnablerMetricReader extends Enabler {
135
- constructor(reader) {
136
- super();
137
- this.reader = reader;
138
- }
139
- forceFlush(options) {
140
- if (this.isEnabled()) {
141
- return this.reader.forceFlush(options);
142
- }
143
- return Promise.resolve();
144
- }
145
- setMetricProducer(metricProducer) {
146
- if (this.isEnabled()) {
147
- this.reader.setMetricProducer(metricProducer);
148
- }
149
- }
150
- selectAggregation(instrumentType) {
151
- return this.reader.selectAggregation(instrumentType);
152
- }
153
- selectAggregationTemporality(instrumentType) {
154
- return this.reader.selectAggregationTemporality(instrumentType);
155
- }
156
- selectCardinalityLimit(instrumentType) {
157
- return this.reader.selectCardinalityLimit(instrumentType);
158
- }
159
- async collect(options) {
160
- if (this.isEnabled()) {
161
- return await this.reader.collect(options);
162
- }
163
- return {
164
- resourceMetrics: {
165
- resource: (0, _resources.resourceFromAttributes)({}),
166
- scopeMetrics: []
167
- },
168
- errors: []
169
- };
170
- }
171
- shutdown(options) {
172
- return this.reader.shutdown(options);
173
- }
205
+ reader;
206
+ constructor(reader) {
207
+ super();
208
+ this.reader = reader;
209
+ }
210
+ forceFlush(options) {
211
+ if (this.isEnabled()) {
212
+ return this.reader.forceFlush(options);
213
+ }
214
+ return Promise.resolve();
215
+ }
216
+ setMetricProducer(metricProducer) {
217
+ if (this.isEnabled()) {
218
+ this.reader.setMetricProducer(metricProducer);
219
+ }
220
+ }
221
+ selectAggregation(instrumentType) {
222
+ return this.reader.selectAggregation(instrumentType);
223
+ }
224
+ selectAggregationTemporality(instrumentType) {
225
+ return this.reader.selectAggregationTemporality(instrumentType);
226
+ }
227
+ selectCardinalityLimit(instrumentType) {
228
+ return this.reader.selectCardinalityLimit(instrumentType);
229
+ }
230
+ async collect(options) {
231
+ if (this.isEnabled()) {
232
+ return await this.reader.collect(options);
233
+ }
234
+ return {
235
+ resourceMetrics: {
236
+ resource: (0, resources_1.resourceFromAttributes)({}),
237
+ scopeMetrics: [],
238
+ },
239
+ errors: [],
240
+ };
241
+ }
242
+ shutdown(options) {
243
+ return this.reader.shutdown(options);
244
+ }
174
245
  }
175
- exports.EnablerMetricReader = EnablerMetricReader;
246
+ exports.EnablerMetricReader = EnablerMetricReader;
@@ -1,98 +1,42 @@
1
1
  "use strict";
2
-
3
- var _instrumentationHttp = require("@opentelemetry/instrumentation-http");
4
- var _logger = _interopRequireDefault(require("../utils/logger.cjs"));
5
- var _instrumentation = require("@opentelemetry/instrumentation");
6
- var _telemetryRegistry = require("./telemetryRegistry.cjs");
7
- var _sdkTraceNode = require("@opentelemetry/sdk-trace-node");
8
- var _apiLogs = require("@opentelemetry/api-logs");
9
- var _sdkLogs = require("@opentelemetry/sdk-logs");
10
- var _bootConfig = require("../config/bootConfig.cjs");
11
- var _util = _interopRequireDefault(require("util"));
12
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
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
+ const logger_js_1 = __importDefault(require("../utils/logger.cjs"));
7
+ const bootConfig_js_1 = require("../config/bootConfig.cjs");
8
+ const instrumentation_http_1 = require("@opentelemetry/instrumentation-http");
9
+ const telemetryRegistry_js_1 = require("./telemetryRegistry.cjs");
10
+ const logsInstrumentation_js_1 = require("./custom-implementations/instrumentations/logsInstrumentation.cjs");
11
+ const instrumentation_runtime_node_1 = require("@opentelemetry/instrumentation-runtime-node");
13
12
  // THIS INSTRUMENTATIONS NEED TO BE LOADED BEFORE ANYTHING ELSE
14
13
  // They use monkey-patching to instrument the HTTP server and client.
15
14
  // THIS FILE MUST BE CALLED BEFORE ANYTHING ELSE
16
- if (_bootConfig.bootEnvVariables.OASTLM_BOOT_MODULE_DISABLED) {
17
- _logger.default.info('🚫 OASTLM module is disabled, Providers not initialized.');
18
- } else {
19
- _logger.default.info('🚀 Initializing Open Telemetry');
20
- initializeTraces();
21
- initializeMetrics();
22
- initializeLogs();
23
- (0, _instrumentation.registerInstrumentations)({
24
- instrumentations: [new _instrumentationHttp.HttpInstrumentation()
25
- // new ExpressInstrumentation(),
26
- ]
27
- });
15
+ if (bootConfig_js_1.bootEnvVariables.OASTLM_BOOT_MODULE_DISABLED) {
16
+ logger_js_1.default.info('🚫 OASTLM module is disabled, Auto Instrumentations not initialized.');
28
17
  }
29
- function initializeTraces() {
30
- _logger.default.info('📊 Initializing TracerProvider');
31
- const tracerProvider = new _sdkTraceNode.NodeTracerProvider({
32
- resource: _telemetryRegistry.oasTelemetryResource,
33
- spanProcessors: [_telemetryRegistry.dynamicMultiSpanProcessor]
34
- });
35
- tracerProvider.register();
36
- }
37
- function initializeLogs() {
38
- _logger.default.info('📜 Initializing LoggerProvider');
39
- // Create and configure LoggerProvider
40
- const loggerProvider = new _sdkLogs.LoggerProvider({
41
- resource: _telemetryRegistry.oasTelemetryResource,
42
- processors: [_telemetryRegistry.dynamicMultiLogProcessor]
43
- });
44
- // Get a logger instance
45
- const loggerInstance = loggerProvider.getLogger('oas-telemetry'); // Use loggerProvider to get the logger
46
- Object.keys(_telemetryRegistry.originalConsoleMethods).forEach(method => {
47
- // @ts-expect-error yes
48
- console[method] = (...args) => {
49
- const severity = getSeverityForMethod(method);
50
- loggerInstance.emit({
51
- severityNumber: severity.number,
52
- severityText: severity.text,
53
- body: _util.default.format(...args),
54
- attributes: {
55
- 'source': `console.${method}`,
56
- "library": "oas-telemetry"
18
+ else {
19
+ if (!(0, telemetryRegistry_js_1.isBootInitialized)()) {
20
+ // Only HTTP instrumentation por ahora
21
+ const httpInstrumentation = new instrumentation_http_1.HttpInstrumentation({
22
+ // Ignore internal telemetry routes
23
+ ignoreIncomingRequestHook: (req) => {
24
+ const url = req.url || '';
25
+ const path = url.split('?')[0]; // Remove query params
26
+ // Ignore all baseUrl routes except those with 'generate'
27
+ if (path.includes(bootConfig_js_1.bootEnvVariables.OASTLM_BOOT_BASE_URL)) {
28
+ return !path.includes('generate');
29
+ }
30
+ return false;
31
+ }
32
+ });
33
+ if (!bootConfig_js_1.bootEnvVariables.OASTLM_BOOT_AUTOINSTRUMENTATIONS_NODE_DISABLED) {
34
+ telemetryRegistry_js_1.instrumentations.push(httpInstrumentation, new instrumentation_runtime_node_1.RuntimeNodeInstrumentation());
57
35
  }
58
- });
59
- // @ts-expect-error yes
60
- _telemetryRegistry.originalConsoleMethods[method](...args);
61
- };
62
- });
63
- }
64
- function initializeMetrics() {
65
- _logger.default.info('📈 Initializing MeterProvider');
66
- // WARN: Default PeriodicExportingMetricReader is added post initialization (see telemetryConfigurator.ts)
67
- // The in memory exporter is added by default to that reader. More readers are allowed to be added dynamically
36
+ if (!bootConfig_js_1.bootEnvVariables.OASTLM_BOOT_AUTOINSTRUMENTATIONS_LOGS_DISABLED) {
37
+ telemetryRegistry_js_1.instrumentations.push(new logsInstrumentation_js_1.LogsInstrumentation());
38
+ }
39
+ (0, telemetryRegistry_js_1.setBootInitialized)(true);
40
+ logger_js_1.default.info('✅ Auto Instrumentations created successfully');
41
+ }
68
42
  }
69
- function getSeverityForMethod(method) {
70
- switch (method) {
71
- case "log":
72
- case "info":
73
- return {
74
- number: _apiLogs.SeverityNumber.INFO,
75
- text: "INFO"
76
- };
77
- case "debug":
78
- return {
79
- number: _apiLogs.SeverityNumber.DEBUG,
80
- text: "DEBUG"
81
- };
82
- case "warn":
83
- return {
84
- number: _apiLogs.SeverityNumber.WARN,
85
- text: "WARN"
86
- };
87
- case "error":
88
- return {
89
- number: _apiLogs.SeverityNumber.ERROR,
90
- text: "ERROR"
91
- };
92
- default:
93
- return {
94
- number: _apiLogs.SeverityNumber.INFO,
95
- text: "INFO"
96
- };
97
- }
98
- }
@@ -0,0 +1,85 @@
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.DiskImporter = void 0;
7
+ const promises_1 = __importDefault(require("fs/promises"));
8
+ const logger_js_1 = __importDefault(require("../../utils/logger.cjs"));
9
+ const DiskUtils_js_1 = require("./DiskUtils.cjs");
10
+ class DiskImporter {
11
+ directoryPath;
12
+ segmentPrefix;
13
+ importBatchSize;
14
+ constructor(options) {
15
+ this.directoryPath = options.directoryPath;
16
+ this.segmentPrefix = options.segmentPrefix || DiskUtils_js_1.DEFAULT_SEGMENT_PREFIX;
17
+ this.importBatchSize = options.importBatchSize || 500;
18
+ }
19
+ async import(onBatch) {
20
+ const stats = {
21
+ segmentFilesRead: 0,
22
+ importedRecords: 0,
23
+ failedFrames: 0,
24
+ };
25
+ const segments = await (0, DiskUtils_js_1.listSegments)(this.directoryPath, this.segmentPrefix);
26
+ if (!segments.length) {
27
+ return stats;
28
+ }
29
+ const importBuffer = [];
30
+ const flushImportBuffer = async () => {
31
+ if (!importBuffer.length)
32
+ return;
33
+ const batch = importBuffer.splice(0, importBuffer.length);
34
+ await onBatch(batch);
35
+ stats.importedRecords += batch.length;
36
+ };
37
+ for (const segment of segments) {
38
+ stats.segmentFilesRead += 1;
39
+ let fileBuffer;
40
+ try {
41
+ fileBuffer = await promises_1.default.readFile(segment.filePath);
42
+ }
43
+ catch (error) {
44
+ logger_js_1.default.warn(`[DiskImporter] Could not read segment ${segment.filePath}: ${error?.message || error}`);
45
+ continue;
46
+ }
47
+ let offset = 0;
48
+ while (offset + 4 <= fileBuffer.length) {
49
+ const frameLength = fileBuffer.readUInt32LE(offset);
50
+ offset += 4;
51
+ if (frameLength <= 0) {
52
+ stats.failedFrames += 1;
53
+ logger_js_1.default.warn(`[DiskImporter] Invalid frame length in ${segment.filePath}; stopping segment parse.`);
54
+ break;
55
+ }
56
+ if (offset + frameLength > fileBuffer.length) {
57
+ stats.failedFrames += 1;
58
+ logger_js_1.default.warn(`[DiskImporter] Truncated frame in ${segment.filePath}; stopping segment parse.`);
59
+ break;
60
+ }
61
+ const framePayload = fileBuffer.subarray(offset, offset + frameLength);
62
+ offset += frameLength;
63
+ try {
64
+ const decodedSpans = (0, DiskUtils_js_1.decodeRecordBatchFrame)(framePayload);
65
+ importBuffer.push(...decodedSpans);
66
+ while (importBuffer.length >= this.importBatchSize) {
67
+ const batch = importBuffer.splice(0, this.importBatchSize);
68
+ await onBatch(batch);
69
+ stats.importedRecords += batch.length;
70
+ }
71
+ }
72
+ catch (error) {
73
+ stats.failedFrames += 1;
74
+ logger_js_1.default.warn(`[DiskImporter] Failed to decode frame from ${segment.filePath}: ${error?.message || error}`);
75
+ }
76
+ }
77
+ if (offset !== fileBuffer.length) {
78
+ logger_js_1.default.warn(`[DiskImporter] Segment ${segment.filePath} has trailing or incomplete bytes.`);
79
+ }
80
+ }
81
+ await flushImportBuffer();
82
+ return stats;
83
+ }
84
+ }
85
+ exports.DiskImporter = DiskImporter;
@@ -0,0 +1,61 @@
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.DEFAULT_MAX_SEGMENT_BYTES = exports.SEGMENT_EXT = exports.DEFAULT_SEGMENT_PREFIX = void 0;
7
+ exports.getSegmentName = getSegmentName;
8
+ exports.listSegments = listSegments;
9
+ exports.encodeRecordBatchFrame = encodeRecordBatchFrame;
10
+ exports.decodeRecordBatchFrame = decodeRecordBatchFrame;
11
+ const promises_1 = __importDefault(require("fs/promises"));
12
+ const path_1 = __importDefault(require("path"));
13
+ const zlib_1 = require("zlib");
14
+ exports.DEFAULT_SEGMENT_PREFIX = 'traces';
15
+ exports.SEGMENT_EXT = '.oastlm';
16
+ exports.DEFAULT_MAX_SEGMENT_BYTES = 8 * 1024 * 1024;
17
+ function getSegmentName(index, prefix = exports.DEFAULT_SEGMENT_PREFIX) {
18
+ return `${prefix}-${index.toString().padStart(6, '0')}${exports.SEGMENT_EXT}`;
19
+ }
20
+ async function listSegments(directoryPath, prefix = exports.DEFAULT_SEGMENT_PREFIX) {
21
+ try {
22
+ const files = await promises_1.default.readdir(directoryPath);
23
+ const regex = new RegExp(`^${prefix}-(\\d{6})${exports.SEGMENT_EXT.replace('.', '\\.')}$`);
24
+ return files
25
+ .map((name) => {
26
+ const match = name.match(regex);
27
+ if (!match)
28
+ return null;
29
+ const index = Number.parseInt(match[1], 10);
30
+ return { index, filePath: path_1.default.join(directoryPath, name) };
31
+ })
32
+ .filter((value) => value !== null)
33
+ .sort((a, b) => a.index - b.index);
34
+ }
35
+ catch (error) {
36
+ if (error?.code === 'ENOENT') {
37
+ return [];
38
+ }
39
+ throw error;
40
+ }
41
+ }
42
+ function encodeRecordBatchFrame(records) {
43
+ const lineDelimitedJson = records.map((record) => JSON.stringify(record)).join('\n') + '\n';
44
+ const compressed = (0, zlib_1.gzipSync)(Buffer.from(lineDelimitedJson, 'utf-8'));
45
+ const frame = Buffer.allocUnsafe(4 + compressed.length);
46
+ frame.writeUInt32LE(compressed.length, 0);
47
+ compressed.copy(frame, 4);
48
+ return frame;
49
+ }
50
+ function decodeRecordBatchFrame(framePayload) {
51
+ const decompressed = (0, zlib_1.gunzipSync)(framePayload).toString('utf-8');
52
+ const lines = decompressed.split('\n').filter((line) => line.trim().length > 0);
53
+ return lines.map((line, index) => {
54
+ try {
55
+ return JSON.parse(line);
56
+ }
57
+ catch {
58
+ throw new Error(`Invalid JSON line at index ${index}`);
59
+ }
60
+ });
61
+ }