@oas-tools/oas-telemetry 0.7.1 → 0.8.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/.env.example +21 -2
  2. package/README.md +1 -2
  3. package/dist/cjs/config/bootConfig.cjs +19 -14
  4. package/dist/cjs/config/config.cjs +112 -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/InMemoryDbLogExporter.cjs +202 -190
  10. package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.cjs +204 -99
  11. package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.cjs +152 -116
  12. package/dist/cjs/telemetry/custom-implementations/instrumentations/logsInstrumentation.cjs +92 -0
  13. package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/Chunk.cjs +159 -0
  14. package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/Series.cjs +168 -0
  15. package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/SeriesRegistry.cjs +389 -0
  16. package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/types.cjs +2 -0
  17. package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/utils.cjs +77 -0
  18. package/dist/cjs/telemetry/custom-implementations/processors/dynamicMultiLogProcessor.cjs +65 -63
  19. package/dist/cjs/telemetry/custom-implementations/processors/dynamicMultiSpanProcessor.cjs +63 -62
  20. package/dist/cjs/telemetry/custom-implementations/utils/circular.cjs +47 -47
  21. package/dist/cjs/telemetry/custom-implementations/utils/storagePath.cjs +39 -0
  22. package/dist/cjs/telemetry/custom-implementations/wrappers.cjs +141 -138
  23. package/dist/cjs/telemetry/initializeTelemetry.cjs +35 -91
  24. package/dist/cjs/telemetry/telemetryConfigurator.cjs +70 -72
  25. package/dist/cjs/telemetry/telemetryRegistry.cjs +45 -31
  26. package/dist/cjs/tlm-ai/agent.cjs +49 -64
  27. package/dist/cjs/tlm-ai/aiController.cjs +54 -76
  28. package/dist/cjs/tlm-ai/aiRoutes.cjs +17 -20
  29. package/dist/cjs/tlm-ai/aiService.cjs +91 -95
  30. package/dist/cjs/tlm-ai/tools.cjs +177 -174
  31. package/dist/cjs/tlm-auth/authController.cjs +80 -123
  32. package/dist/cjs/tlm-auth/authMiddleware.cjs +25 -30
  33. package/dist/cjs/tlm-auth/authRoutes.cjs +11 -14
  34. package/dist/cjs/tlm-log/logController.cjs +171 -116
  35. package/dist/cjs/tlm-log/logRoutes.cjs +20 -20
  36. package/dist/cjs/tlm-metric/metricsController.cjs +211 -121
  37. package/dist/cjs/tlm-metric/metricsRoutes.cjs +23 -20
  38. package/dist/cjs/tlm-plugin/pluginController.cjs +128 -140
  39. package/dist/cjs/tlm-plugin/pluginProcess.cjs +89 -94
  40. package/dist/cjs/tlm-plugin/pluginRoutes.cjs +11 -14
  41. package/dist/cjs/tlm-plugin/pluginService.cjs +73 -74
  42. package/dist/cjs/tlm-trace/traceController.cjs +169 -117
  43. package/dist/cjs/tlm-trace/traceRoutes.cjs +20 -20
  44. package/dist/cjs/tlm-ui/uiRoutes.cjs +63 -32
  45. package/dist/cjs/tlm-util/utilController.cjs +68 -70
  46. package/dist/cjs/tlm-util/utilRoutes.cjs +51 -63
  47. package/dist/cjs/types/index.cjs +2 -5
  48. package/dist/cjs/utils/logger.cjs +38 -43
  49. package/dist/cjs/utils/regexUtils.cjs +22 -22
  50. package/dist/esm/config/bootConfig.js +6 -0
  51. package/dist/esm/config/config.js +1 -2
  52. package/dist/esm/docs/openapi.yaml +158 -4
  53. package/dist/esm/index.js +9 -8
  54. package/dist/esm/routesManager.js +6 -10
  55. package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.js +47 -8
  56. package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.js +164 -48
  57. package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.js +69 -29
  58. package/dist/esm/telemetry/custom-implementations/instrumentations/logsInstrumentation.js +85 -0
  59. package/dist/esm/telemetry/custom-implementations/metrics/tsdb/Chunk.js +155 -0
  60. package/dist/esm/telemetry/custom-implementations/metrics/tsdb/Series.js +164 -0
  61. package/dist/esm/telemetry/custom-implementations/metrics/tsdb/SeriesRegistry.js +382 -0
  62. package/dist/esm/telemetry/custom-implementations/metrics/tsdb/types.js +1 -0
  63. package/dist/esm/telemetry/custom-implementations/metrics/tsdb/utils.js +74 -0
  64. package/dist/esm/telemetry/custom-implementations/processors/dynamicMultiLogProcessor.js +2 -1
  65. package/dist/esm/telemetry/custom-implementations/processors/dynamicMultiSpanProcessor.js +1 -1
  66. package/dist/esm/telemetry/custom-implementations/utils/storagePath.js +33 -0
  67. package/dist/esm/telemetry/custom-implementations/wrappers.js +5 -2
  68. package/dist/esm/telemetry/initializeTelemetry.js +27 -69
  69. package/dist/esm/telemetry/telemetryConfigurator.js +42 -40
  70. package/dist/esm/telemetry/telemetryRegistry.js +12 -1
  71. package/dist/esm/tlm-ai/agent.js +5 -3
  72. package/dist/esm/tlm-ai/aiController.js +3 -3
  73. package/dist/esm/tlm-ai/aiService.js +6 -2
  74. package/dist/esm/tlm-ai/tools.js +5 -9
  75. package/dist/esm/tlm-auth/authController.js +3 -2
  76. package/dist/esm/tlm-log/logController.js +84 -4
  77. package/dist/esm/tlm-log/logRoutes.js +5 -2
  78. package/dist/esm/tlm-metric/metricsController.js +172 -49
  79. package/dist/esm/tlm-metric/metricsRoutes.js +10 -4
  80. package/dist/esm/tlm-plugin/pluginController.js +6 -11
  81. package/dist/esm/tlm-plugin/pluginService.js +2 -4
  82. package/dist/esm/tlm-trace/traceController.js +102 -16
  83. package/dist/esm/tlm-trace/traceRoutes.js +5 -2
  84. package/dist/esm/tlm-ui/uiRoutes.js +5 -5
  85. package/dist/esm/tlm-util/utilController.js +3 -9
  86. package/dist/esm/tlm-util/utilRoutes.js +2 -2
  87. package/dist/types/config/bootConfig.d.ts +4 -0
  88. package/dist/types/config/config.d.ts +36 -7
  89. package/dist/types/config/config.types.d.ts +6 -0
  90. package/dist/types/index.d.ts +2 -3
  91. package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.d.ts +4 -1
  92. package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.d.ts +60 -15
  93. package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.d.ts +9 -4
  94. package/dist/types/telemetry/custom-implementations/instrumentations/logsInstrumentation.d.ts +23 -0
  95. package/dist/types/telemetry/custom-implementations/metrics/tsdb/Chunk.d.ts +49 -0
  96. package/dist/types/telemetry/custom-implementations/metrics/tsdb/Series.d.ts +67 -0
  97. package/dist/types/telemetry/custom-implementations/metrics/tsdb/SeriesRegistry.d.ts +69 -0
  98. package/dist/types/telemetry/custom-implementations/metrics/tsdb/types.d.ts +68 -0
  99. package/dist/types/telemetry/custom-implementations/metrics/tsdb/utils.d.ts +21 -0
  100. package/dist/types/telemetry/custom-implementations/processors/dynamicMultiLogProcessor.d.ts +2 -2
  101. package/dist/types/telemetry/custom-implementations/utils/storagePath.d.ts +12 -0
  102. package/dist/types/telemetry/custom-implementations/wrappers.d.ts +1 -1
  103. package/dist/types/telemetry/telemetryConfigurator.d.ts +1 -1
  104. package/dist/types/telemetry/telemetryRegistry.d.ts +8 -0
  105. package/dist/types/tlm-ai/agent.d.ts +1 -1
  106. package/dist/types/tlm-ai/aiService.d.ts +1 -1
  107. package/dist/types/tlm-log/logController.d.ts +2 -0
  108. package/dist/types/tlm-metric/metricsController.d.ts +16 -2
  109. package/dist/types/tlm-trace/traceController.d.ts +3 -1
  110. package/dist/types/types/index.d.ts +2 -2
  111. package/dist/ui/assets/{ApiDocsPage-C_VVPPHa.js → ApiDocsPage-BFUrXE5F.js} +2 -2
  112. package/dist/ui/assets/CollapsibleCard-STA1GVQO.js +1 -0
  113. package/dist/ui/assets/DevToolsPage-BRSfZqO_.js +1 -0
  114. package/dist/ui/assets/LandingPage-DzeDy7q7.js +6 -0
  115. package/dist/ui/assets/LogsPage-BeiFrV2X.js +1 -0
  116. package/dist/ui/assets/{NotFoundPage-B3quk3P1.js → NotFoundPage-fRNOatbM.js} +1 -1
  117. package/dist/ui/assets/PluginCreatePage-Ch_RXsdf.js +50 -0
  118. package/dist/ui/assets/PluginPage-Cl65ZZ_n.js +27 -0
  119. package/dist/ui/assets/TraceSpansPage-BoK4M5Hh.js +6 -0
  120. package/dist/ui/assets/VirtualizedListPanel-zcj0v7DL.js +16 -0
  121. package/dist/ui/assets/alert-BkNVKxJN.js +1133 -0
  122. package/dist/ui/assets/badge-CN7FeufU.js +1 -0
  123. package/dist/ui/assets/{chevron-down-CPsvsmqj.js → chevron-down-CG--ounh.js} +1 -1
  124. package/dist/ui/assets/{chevron-up-Df9jMo1X.js → chevron-up-B6tzMAOm.js} +1 -1
  125. package/dist/ui/assets/{circle-alert-DOPQPvU8.js → circle-alert-BDF8Tq9y.js} +1 -1
  126. package/dist/ui/assets/dialog-BrpWNk36.js +15 -0
  127. package/dist/ui/assets/index-6xOVKwKn.js +305 -0
  128. package/dist/ui/assets/index-D6f1KjWV.css +1 -0
  129. package/dist/ui/assets/index-D96rVSkR.js +1 -0
  130. package/dist/ui/assets/info-99kuqpbx.js +6 -0
  131. package/dist/ui/assets/{input-Dzvg_ZEZ.js → input-B-01QDg_.js} +1 -1
  132. package/dist/ui/assets/label-CQLeZjM1.js +1 -0
  133. package/dist/ui/assets/{loader-circle-CrvlRy5o.js → loader-circle-BoDGk-BO.js} +1 -1
  134. package/dist/ui/assets/{loginPage-qa4V-B70.js → loginPage-8F4EEd1B.js} +1 -1
  135. package/dist/ui/assets/metrics-page-D1GxaB_c.css +1 -0
  136. package/dist/ui/assets/metrics-page-DPtteXqY.js +31 -0
  137. package/dist/ui/assets/popover-DS_8DYYt.js +11 -0
  138. package/dist/ui/assets/select-DYjegiXi.js +6 -0
  139. package/dist/ui/assets/separator-DGsRxIrl.js +6 -0
  140. package/dist/ui/assets/severityOptions-DEOvJqC9.js +11 -0
  141. package/dist/ui/assets/square-pen-DPhgYz6O.js +6 -0
  142. package/dist/ui/assets/switch-Di9NJH2A.js +1 -0
  143. package/dist/ui/assets/trace-DJq1miYa.js +1 -0
  144. package/dist/ui/assets/upload-BiLTpCnX.js +11 -0
  145. package/dist/ui/assets/{utilService-DNyqzwj0.js → utilService-CNZOmadC.js} +1 -1
  146. package/dist/ui/assets/wand-sparkles-CPoBNFFg.js +6 -0
  147. package/dist/ui/index.html +2 -2
  148. package/package.json +44 -48
  149. package/dist/ui/assets/CollapsibleCard-B3KR_8mL.js +0 -1
  150. package/dist/ui/assets/DevToolsPage-OyZcDcmw.js +0 -1
  151. package/dist/ui/assets/LandingPage-CppFBA6K.js +0 -6
  152. package/dist/ui/assets/LogsPage-9Fq8GArS.js +0 -26
  153. package/dist/ui/assets/PluginCreatePage-X_aCH4t4.js +0 -50
  154. package/dist/ui/assets/PluginPage-DMDSihrZ.js +0 -27
  155. package/dist/ui/assets/alert-jQ9HCPIf.js +0 -1133
  156. package/dist/ui/assets/badge-CNq0-mH5.js +0 -1
  157. package/dist/ui/assets/card-DFAwwhN3.js +0 -1
  158. package/dist/ui/assets/index-BkD6DijD.js +0 -15
  159. package/dist/ui/assets/index-CERGVYZK.js +0 -292
  160. package/dist/ui/assets/index-CSIPf9qw.css +0 -1
  161. package/dist/ui/assets/label-DuVnkZ4q.js +0 -1
  162. package/dist/ui/assets/select-DhS8YUtJ.js +0 -1
  163. package/dist/ui/assets/separator-isK4chBP.js +0 -6
  164. package/dist/ui/assets/severityOptions-O38dSOfk.js +0 -11
  165. package/dist/ui/assets/switch-Z3mImG9n.js +0 -1
  166. package/dist/ui/assets/tabs-_77MUUQe.js +0 -16
  167. package/dist/ui/assets/upload-C1LT4Gkb.js +0 -16
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Chunk = void 0;
4
+ class Chunk {
5
+ maxSamples;
6
+ startTimes;
7
+ endTimes;
8
+ values;
9
+ histograms;
10
+ cursor = 0;
11
+ minEndTime = 0;
12
+ maxEndTime = 0;
13
+ isHistogram;
14
+ constructor(maxSamples = 120, isHistogram = false) {
15
+ this.maxSamples = maxSamples;
16
+ this.startTimes = new Float64Array(maxSamples);
17
+ this.endTimes = new Float64Array(maxSamples);
18
+ this.values = new Float64Array(maxSamples);
19
+ this.histograms = new Array(maxSamples).fill(null);
20
+ this.isHistogram = isHistogram;
21
+ }
22
+ /**
23
+ * Append a sample to the chunk.
24
+ * Returns true if successful or false if the chunk is full.
25
+ */
26
+ append(startTime, endTime, value) {
27
+ if (this.cursor >= this.maxSamples) {
28
+ return false;
29
+ }
30
+ if (this.cursor === 0) {
31
+ this.minEndTime = endTime;
32
+ }
33
+ this.startTimes[this.cursor] = startTime;
34
+ this.endTimes[this.cursor] = endTime;
35
+ if (this.isHistogram && typeof value === 'object') {
36
+ this.values[this.cursor] = value.count;
37
+ this.histograms[this.cursor] = value;
38
+ }
39
+ else if (typeof value === 'number') {
40
+ this.values[this.cursor] = value;
41
+ this.histograms[this.cursor] = null;
42
+ }
43
+ else {
44
+ const hv = value;
45
+ this.values[this.cursor] = hv.count;
46
+ this.histograms[this.cursor] = hv;
47
+ }
48
+ this.maxEndTime = endTime;
49
+ this.cursor++;
50
+ return true;
51
+ }
52
+ /**
53
+ * Binary search for first index with endTime >= targetTime
54
+ */
55
+ _binarySearchStart(targetTime) {
56
+ let left = 0;
57
+ let right = this.cursor - 1;
58
+ let result = this.cursor;
59
+ while (left <= right) {
60
+ const mid = (left + right) >> 1;
61
+ if (this.endTimes[mid] >= targetTime) {
62
+ result = mid;
63
+ right = mid - 1;
64
+ }
65
+ else {
66
+ left = mid + 1;
67
+ }
68
+ }
69
+ return result;
70
+ }
71
+ /**
72
+ * Binary search for last index with endTime <= targetTime
73
+ */
74
+ _binarySearchEnd(targetTime, startIdx = 0) {
75
+ let left = startIdx;
76
+ let right = this.cursor - 1;
77
+ let result = startIdx - 1;
78
+ while (left <= right) {
79
+ const mid = (left + right) >> 1;
80
+ if (this.endTimes[mid] <= targetTime) {
81
+ result = mid;
82
+ left = mid + 1;
83
+ }
84
+ else {
85
+ right = mid - 1;
86
+ }
87
+ }
88
+ return result;
89
+ }
90
+ /**
91
+ * Efficient slicing method for bulk operations.
92
+ * Always returns slices. Values can be either a Float64Array (numeric)
93
+ * or a JS array of HistogramValue objects (histogram series).
94
+ */
95
+ getSlices(startTime, endTime) {
96
+ const emptyResult = {
97
+ startTimes: new Float64Array(0),
98
+ endTimes: new Float64Array(0),
99
+ values: this.isHistogram ? [] : new Float64Array(0),
100
+ };
101
+ const start = startTime ?? 0;
102
+ const end = endTime ?? Number.MAX_SAFE_INTEGER;
103
+ if (this.cursor === 0 || this.maxEndTime < start || this.minEndTime > end) {
104
+ return emptyResult;
105
+ }
106
+ const startIdx = this._binarySearchStart(start);
107
+ const endIdx = this._binarySearchEnd(end, startIdx);
108
+ if (startIdx > endIdx) {
109
+ return emptyResult;
110
+ }
111
+ const startTimesNew = this.startTimes.subarray(startIdx, endIdx + 1);
112
+ const endTimesNew = this.endTimes.subarray(startIdx, endIdx + 1);
113
+ if (this.isHistogram) {
114
+ // Return histogram objects as a simple JS array slice
115
+ return {
116
+ startTimes: startTimesNew,
117
+ endTimes: endTimesNew,
118
+ values: this.histograms.slice(startIdx, endIdx + 1),
119
+ };
120
+ }
121
+ return {
122
+ startTimes: startTimesNew,
123
+ endTimes: endTimesNew,
124
+ values: this.values.subarray(startIdx, endIdx + 1),
125
+ };
126
+ }
127
+ isFull() {
128
+ return this.cursor >= this.maxSamples;
129
+ }
130
+ overlaps(startTime, endTime) {
131
+ if (this.cursor === 0)
132
+ return false;
133
+ return !(this.maxEndTime < startTime || this.minEndTime > endTime);
134
+ }
135
+ getStats() {
136
+ return {
137
+ samples: this.cursor,
138
+ maxSamples: this.maxSamples,
139
+ minEndTime: this.minEndTime,
140
+ maxEndTime: this.maxEndTime,
141
+ memoryBytes: this.getMemoryUsage(),
142
+ };
143
+ }
144
+ getMemoryUsage() {
145
+ const arrayMemory = this.maxSamples * 8 * 3;
146
+ const histogramMemory = this.histograms.filter(h => h !== null).length * 200;
147
+ return arrayMemory + histogramMemory;
148
+ }
149
+ getMinTime() {
150
+ return this.minEndTime;
151
+ }
152
+ getMaxTime() {
153
+ return this.maxEndTime;
154
+ }
155
+ size() {
156
+ return this.cursor;
157
+ }
158
+ }
159
+ exports.Chunk = Chunk;
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+ /**
3
+ * Series: Time-series storage with metadata and chunks
4
+ * One series per unique metric+labels combination
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.Series = void 0;
8
+ const Chunk_js_1 = require("./Chunk.cjs");
9
+ class Series {
10
+ labelSet;
11
+ metadata;
12
+ chunks = [];
13
+ maxChunks;
14
+ chunkSize;
15
+ isHistogram;
16
+ constructor(labelSet, metadata, chunkSize = 120, maxChunks = 60 // ~1 hour at 1min intervals with 120 samples/chunk
17
+ ) {
18
+ this.labelSet = labelSet;
19
+ this.metadata = metadata;
20
+ this.chunkSize = chunkSize;
21
+ this.maxChunks = maxChunks;
22
+ this.isHistogram = metadata.dataPointType === 0; // HISTOGRAM = 0
23
+ }
24
+ /**
25
+ * Append a sample to the series
26
+ */
27
+ append(startTime, endTime, value) {
28
+ // Get or create current chunk
29
+ let currentChunk = this.chunks[this.chunks.length - 1];
30
+ if (!currentChunk || currentChunk.isFull()) {
31
+ // Create new chunk
32
+ currentChunk = new Chunk_js_1.Chunk(this.chunkSize, this.isHistogram);
33
+ this.chunks.push(currentChunk);
34
+ // Enforce max chunks limit (circular buffer behavior)
35
+ if (this.chunks.length > this.maxChunks) {
36
+ this.chunks.shift(); // Remove oldest chunk
37
+ }
38
+ }
39
+ currentChunk.append(startTime, endTime, value);
40
+ }
41
+ /**
42
+ * Query slices with options object. Example:
43
+ * querySlices({ startTime, endTime, includeStartTimes: true })
44
+ * includeStartTimes defaults to false.
45
+ * If both startTime and endTime are undefined, returns all data (no time filtering).
46
+ */
47
+ querySlices(options) {
48
+ const start = options?.startTime ?? 0;
49
+ const end = options?.endTime ?? Number.MAX_VALUE;
50
+ const includeStartTimes = options?.includeStartTimes ?? false;
51
+ let totalLength = 0;
52
+ for (const chunk of this.chunks) {
53
+ if (!chunk.overlaps(start, end))
54
+ continue;
55
+ const slice = chunk.getSlices(start, end);
56
+ totalLength += slice.startTimes.length;
57
+ }
58
+ if (totalLength === 0) {
59
+ const empty = {
60
+ endTimes: new Float64Array(0),
61
+ values: this.isHistogram ? [] : new Float64Array(0),
62
+ };
63
+ if (includeStartTimes) {
64
+ empty.startTimes = new Float64Array(0);
65
+ }
66
+ return empty;
67
+ }
68
+ let resultStart;
69
+ if (includeStartTimes) {
70
+ resultStart = new Float64Array(totalLength);
71
+ }
72
+ const resultEnd = new Float64Array(totalLength);
73
+ const resultValues = this.isHistogram
74
+ ? new Array(totalLength)
75
+ : new Float64Array(totalLength);
76
+ let offset = 0;
77
+ for (const chunk of this.chunks) {
78
+ if (!chunk.overlaps(start, end))
79
+ continue;
80
+ const slice = chunk.getSlices(start, end);
81
+ const len = slice.startTimes.length;
82
+ if (len === 0)
83
+ continue;
84
+ // Copy start and end times
85
+ if (includeStartTimes && resultStart) {
86
+ resultStart.set(slice.startTimes, offset);
87
+ }
88
+ resultEnd.set(slice.endTimes, offset);
89
+ // Copy values (different type depending on metric)
90
+ if (this.isHistogram) {
91
+ resultValues.splice(offset, len, ...slice.values);
92
+ }
93
+ else {
94
+ resultValues.set(slice.values, offset);
95
+ }
96
+ offset += len;
97
+ }
98
+ const result = {
99
+ endTimes: resultEnd,
100
+ values: resultValues
101
+ };
102
+ if (includeStartTimes && resultStart) {
103
+ result.startTimes = resultStart;
104
+ }
105
+ return result;
106
+ }
107
+ /**
108
+ * Remove chunks older than threshold
109
+ */
110
+ evictOldChunks(thresholdTime) {
111
+ let evicted = 0;
112
+ while (this.chunks.length > 0 && this.chunks[0].getMaxTime() < thresholdTime) {
113
+ this.chunks.shift();
114
+ evicted++;
115
+ }
116
+ return evicted;
117
+ }
118
+ /**
119
+ * Get series metadata
120
+ */
121
+ getMetadata() {
122
+ return this.metadata;
123
+ }
124
+ getLabels() {
125
+ return this.labelSet.labels;
126
+ }
127
+ getOriginalAttributes() {
128
+ return this.labelSet.originalAttributes;
129
+ }
130
+ /**
131
+ * Get label hash
132
+ */
133
+ getLabelHash() {
134
+ return this.labelSet.hash;
135
+ }
136
+ getStats() {
137
+ const totalSamples = this.chunks.reduce((sum, chunk) => sum + chunk.size(), 0);
138
+ const memoryBytes = this.chunks.reduce((sum, chunk) => sum + chunk.getMemoryUsage(), 0);
139
+ return {
140
+ metricName: this.metadata?.descriptor?.name ?? 'unknown',
141
+ labels: this.labelSet?.labels ?? {},
142
+ chunks: this.chunks.length,
143
+ samples: totalSamples,
144
+ memoryBytes,
145
+ oldestTime: this.chunks[0]?.getMinTime() ?? 0,
146
+ newestTime: this.chunks[this.chunks.length - 1]?.getMaxTime() ?? 0
147
+ };
148
+ }
149
+ /**
150
+ * Check if series has any samples
151
+ */
152
+ isEmpty() {
153
+ return this.chunks.length === 0 || this.chunks.every(c => c.size() === 0);
154
+ }
155
+ /**
156
+ * Get time range covered by this series
157
+ */
158
+ getTimeRange() {
159
+ if (this.chunks.length === 0) {
160
+ return { min: 0, max: 0 };
161
+ }
162
+ return {
163
+ min: this.chunks[0].getMinTime(),
164
+ max: this.chunks[this.chunks.length - 1].getMaxTime()
165
+ };
166
+ }
167
+ }
168
+ exports.Series = Series;