observability-toolkit 1.8.4 → 1.8.5

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 (164) hide show
  1. package/dist/backends/local-jsonl-boolean-search.test.js +8 -8
  2. package/dist/backends/local-jsonl-boolean-search.test.js.map +1 -1
  3. package/dist/backends/local-jsonl-cache.test.d.ts +2 -0
  4. package/dist/backends/local-jsonl-cache.test.d.ts.map +1 -0
  5. package/dist/backends/local-jsonl-cache.test.js +295 -0
  6. package/dist/backends/local-jsonl-cache.test.js.map +1 -0
  7. package/dist/backends/local-jsonl-circuit-breaker.test.d.ts +2 -0
  8. package/dist/backends/local-jsonl-circuit-breaker.test.d.ts.map +1 -0
  9. package/dist/backends/local-jsonl-circuit-breaker.test.js +180 -0
  10. package/dist/backends/local-jsonl-circuit-breaker.test.js.map +1 -0
  11. package/dist/backends/local-jsonl-export.test.d.ts +2 -0
  12. package/dist/backends/local-jsonl-export.test.d.ts.map +1 -0
  13. package/dist/backends/local-jsonl-export.test.js +704 -0
  14. package/dist/backends/local-jsonl-export.test.js.map +1 -0
  15. package/dist/backends/local-jsonl-index.test.d.ts +2 -0
  16. package/dist/backends/local-jsonl-index.test.d.ts.map +1 -0
  17. package/dist/backends/local-jsonl-index.test.js +554 -0
  18. package/dist/backends/local-jsonl-index.test.js.map +1 -0
  19. package/dist/backends/local-jsonl-logs.test.js +52 -43
  20. package/dist/backends/local-jsonl-logs.test.js.map +1 -1
  21. package/dist/backends/local-jsonl-metrics.test.d.ts +2 -0
  22. package/dist/backends/local-jsonl-metrics.test.d.ts.map +1 -0
  23. package/dist/backends/local-jsonl-metrics.test.js +876 -0
  24. package/dist/backends/local-jsonl-metrics.test.js.map +1 -0
  25. package/dist/backends/local-jsonl-traces.test.js +89 -83
  26. package/dist/backends/local-jsonl-traces.test.js.map +1 -1
  27. package/dist/backends/local-jsonl.d.ts +9 -0
  28. package/dist/backends/local-jsonl.d.ts.map +1 -1
  29. package/dist/backends/local-jsonl.js +348 -227
  30. package/dist/backends/local-jsonl.js.map +1 -1
  31. package/dist/backends/signoz-api-circuit-breaker.test.d.ts +6 -0
  32. package/dist/backends/signoz-api-circuit-breaker.test.d.ts.map +1 -0
  33. package/dist/backends/signoz-api-circuit-breaker.test.js +548 -0
  34. package/dist/backends/signoz-api-circuit-breaker.test.js.map +1 -0
  35. package/dist/backends/signoz-api-rate-limiter.test.d.ts +6 -0
  36. package/dist/backends/signoz-api-rate-limiter.test.d.ts.map +1 -0
  37. package/dist/backends/signoz-api-rate-limiter.test.js +389 -0
  38. package/dist/backends/signoz-api-rate-limiter.test.js.map +1 -0
  39. package/dist/backends/signoz-api-ssrf.test.d.ts +6 -0
  40. package/dist/backends/signoz-api-ssrf.test.d.ts.map +1 -0
  41. package/dist/backends/signoz-api-ssrf.test.js +216 -0
  42. package/dist/backends/signoz-api-ssrf.test.js.map +1 -0
  43. package/dist/backends/signoz-api-test-helpers.d.ts +80 -0
  44. package/dist/backends/signoz-api-test-helpers.d.ts.map +1 -0
  45. package/dist/backends/signoz-api-test-helpers.js +79 -0
  46. package/dist/backends/signoz-api-test-helpers.js.map +1 -0
  47. package/dist/backends/signoz-api.d.ts +16 -0
  48. package/dist/backends/signoz-api.d.ts.map +1 -1
  49. package/dist/backends/signoz-api.js +71 -9
  50. package/dist/backends/signoz-api.js.map +1 -1
  51. package/dist/backends/signoz-api.test.d.ts +9 -0
  52. package/dist/backends/signoz-api.test.d.ts.map +1 -1
  53. package/dist/backends/signoz-api.test.js +14 -1027
  54. package/dist/backends/signoz-api.test.js.map +1 -1
  55. package/dist/lib/cache.d.ts +47 -1
  56. package/dist/lib/cache.d.ts.map +1 -1
  57. package/dist/lib/cache.js +40 -3
  58. package/dist/lib/cache.js.map +1 -1
  59. package/dist/lib/circuit-breaker.d.ts +83 -0
  60. package/dist/lib/circuit-breaker.d.ts.map +1 -0
  61. package/dist/lib/circuit-breaker.js +125 -0
  62. package/dist/lib/circuit-breaker.js.map +1 -0
  63. package/dist/lib/circuit-breaker.test.d.ts +2 -0
  64. package/dist/lib/circuit-breaker.test.d.ts.map +1 -0
  65. package/dist/lib/circuit-breaker.test.js +263 -0
  66. package/dist/lib/circuit-breaker.test.js.map +1 -0
  67. package/dist/lib/constants-symlink.test.d.ts +12 -0
  68. package/dist/lib/constants-symlink.test.d.ts.map +1 -0
  69. package/dist/lib/constants-symlink.test.js +357 -0
  70. package/dist/lib/constants-symlink.test.js.map +1 -0
  71. package/dist/lib/edge-cases.test.js +17 -17
  72. package/dist/lib/edge-cases.test.js.map +1 -1
  73. package/dist/lib/error-sanitizer.d.ts.map +1 -1
  74. package/dist/lib/error-sanitizer.js +29 -3
  75. package/dist/lib/error-sanitizer.js.map +1 -1
  76. package/dist/lib/error-sanitizer.test.js +159 -0
  77. package/dist/lib/error-sanitizer.test.js.map +1 -1
  78. package/dist/lib/error-types.d.ts +54 -0
  79. package/dist/lib/error-types.d.ts.map +1 -0
  80. package/dist/lib/error-types.js +154 -0
  81. package/dist/lib/error-types.js.map +1 -0
  82. package/dist/lib/error-types.test.d.ts +2 -0
  83. package/dist/lib/error-types.test.d.ts.map +1 -0
  84. package/dist/lib/error-types.test.js +196 -0
  85. package/dist/lib/error-types.test.js.map +1 -0
  86. package/dist/lib/indexer.test.js +27 -27
  87. package/dist/lib/indexer.test.js.map +1 -1
  88. package/dist/lib/input-validator.d.ts +12 -0
  89. package/dist/lib/input-validator.d.ts.map +1 -1
  90. package/dist/lib/input-validator.fuzz.test.d.ts +12 -0
  91. package/dist/lib/input-validator.fuzz.test.d.ts.map +1 -0
  92. package/dist/lib/input-validator.fuzz.test.js +290 -0
  93. package/dist/lib/input-validator.fuzz.test.js.map +1 -0
  94. package/dist/lib/input-validator.js +57 -3
  95. package/dist/lib/input-validator.js.map +1 -1
  96. package/dist/lib/input-validator.test.js +129 -1
  97. package/dist/lib/input-validator.test.js.map +1 -1
  98. package/dist/lib/logger.d.ts +46 -0
  99. package/dist/lib/logger.d.ts.map +1 -0
  100. package/dist/lib/logger.js +81 -0
  101. package/dist/lib/logger.js.map +1 -0
  102. package/dist/lib/logger.test.d.ts +2 -0
  103. package/dist/lib/logger.test.d.ts.map +1 -0
  104. package/dist/lib/logger.test.js +122 -0
  105. package/dist/lib/logger.test.js.map +1 -0
  106. package/dist/lib/server-utils.d.ts +8 -0
  107. package/dist/lib/server-utils.d.ts.map +1 -1
  108. package/dist/lib/server-utils.js +34 -2
  109. package/dist/lib/server-utils.js.map +1 -1
  110. package/dist/lib/shared-schemas.d.ts +22 -0
  111. package/dist/lib/shared-schemas.d.ts.map +1 -1
  112. package/dist/lib/shared-schemas.js +22 -0
  113. package/dist/lib/shared-schemas.js.map +1 -1
  114. package/dist/lib/toon-encoder.d.ts +7 -2
  115. package/dist/lib/toon-encoder.d.ts.map +1 -1
  116. package/dist/lib/toon-encoder.js +21 -6
  117. package/dist/lib/toon-encoder.js.map +1 -1
  118. package/dist/lib/toon-encoder.test.d.ts +5 -0
  119. package/dist/lib/toon-encoder.test.d.ts.map +1 -0
  120. package/dist/lib/toon-encoder.test.js +85 -0
  121. package/dist/lib/toon-encoder.test.js.map +1 -0
  122. package/dist/server.js +2 -0
  123. package/dist/server.js.map +1 -1
  124. package/dist/server.test.js +30 -0
  125. package/dist/server.test.js.map +1 -1
  126. package/dist/test-helpers/env-utils.d.ts +22 -0
  127. package/dist/test-helpers/env-utils.d.ts.map +1 -1
  128. package/dist/test-helpers/env-utils.js +38 -0
  129. package/dist/test-helpers/env-utils.js.map +1 -1
  130. package/dist/test-helpers/fuzz-generators.d.ts +58 -0
  131. package/dist/test-helpers/fuzz-generators.d.ts.map +1 -0
  132. package/dist/test-helpers/fuzz-generators.js +216 -0
  133. package/dist/test-helpers/fuzz-generators.js.map +1 -0
  134. package/dist/test-helpers/index.d.ts +1 -0
  135. package/dist/test-helpers/index.d.ts.map +1 -1
  136. package/dist/test-helpers/index.js +2 -0
  137. package/dist/test-helpers/index.js.map +1 -1
  138. package/dist/test-helpers/memfs-utils.d.ts +181 -0
  139. package/dist/test-helpers/memfs-utils.d.ts.map +1 -0
  140. package/dist/test-helpers/memfs-utils.js +292 -0
  141. package/dist/test-helpers/memfs-utils.js.map +1 -0
  142. package/dist/test-helpers/memfs-utils.test.d.ts +5 -0
  143. package/dist/test-helpers/memfs-utils.test.d.ts.map +1 -0
  144. package/dist/test-helpers/memfs-utils.test.js +338 -0
  145. package/dist/test-helpers/memfs-utils.test.js.map +1 -0
  146. package/dist/test-helpers/race-condition-helpers.d.ts +85 -0
  147. package/dist/test-helpers/race-condition-helpers.d.ts.map +1 -0
  148. package/dist/test-helpers/race-condition-helpers.js +279 -0
  149. package/dist/test-helpers/race-condition-helpers.js.map +1 -0
  150. package/dist/test-helpers/test-data-builders.d.ts +40 -3
  151. package/dist/test-helpers/test-data-builders.d.ts.map +1 -1
  152. package/dist/test-helpers/test-data-builders.js +54 -5
  153. package/dist/test-helpers/test-data-builders.js.map +1 -1
  154. package/dist/test-helpers/tool-validators.d.ts.map +1 -1
  155. package/dist/test-helpers/tool-validators.js +16 -1
  156. package/dist/test-helpers/tool-validators.js.map +1 -1
  157. package/dist/tools/query-evaluations.d.ts.map +1 -1
  158. package/dist/tools/query-evaluations.js +16 -2
  159. package/dist/tools/query-evaluations.js.map +1 -1
  160. package/dist/tools/query-evaluations.test.js +53 -46
  161. package/dist/tools/query-evaluations.test.js.map +1 -1
  162. package/dist/tools/query-llm-events.test.js +6 -3
  163. package/dist/tools/query-llm-events.test.js.map +1 -1
  164. package/package.json +2 -1
@@ -0,0 +1,548 @@
1
+ /**
2
+ * Circuit breaker tests for SigNoz API backend
3
+ * L-STYLE-2: Extracted from signoz-api.test.ts for maintainability
4
+ */
5
+ import { describe, it } from 'node:test';
6
+ import assert from 'node:assert';
7
+ import { SigNozApiBackend } from './signoz-api.js';
8
+ import { setupMock, createV5TraceResponse } from './signoz-api-test-helpers.js';
9
+ describe('SigNozApiBackend circuit breaker', () => {
10
+ it('should open circuit after 3 consecutive failures', async () => {
11
+ let callCount = 0;
12
+ globalThis.fetch = setupMock(async () => {
13
+ callCount++;
14
+ throw new Error('API error');
15
+ });
16
+ const backend = new SigNozApiBackend('https://signoz.example.com', 'test-key');
17
+ // First 3 failures should hit the API (non-circuit-breaker errors are thrown)
18
+ for (let i = 0; i < 3; i++) {
19
+ try {
20
+ await backend.queryTraces({});
21
+ }
22
+ catch {
23
+ // expected - API errors are thrown
24
+ }
25
+ }
26
+ assert.strictEqual(callCount, 3);
27
+ // 4th call should be blocked by circuit breaker (returns [] instead of calling fetch)
28
+ const prevCount = callCount;
29
+ const result = await backend.queryTraces({});
30
+ assert.deepStrictEqual(result, [], 'Should return empty array when circuit open');
31
+ assert.strictEqual(callCount, prevCount, 'Should not have made another fetch call when circuit open');
32
+ });
33
+ it('should allow request in half-open state after reset time', async () => {
34
+ const originalDateNow = Date.now;
35
+ let currentTime = 1000000;
36
+ Date.now = () => currentTime;
37
+ let callCount = 0;
38
+ globalThis.fetch = setupMock(async () => {
39
+ callCount++;
40
+ throw new Error('API error');
41
+ });
42
+ const backend = new SigNozApiBackend('https://signoz.example.com', 'test-key');
43
+ // Trigger 3 failures to open circuit
44
+ for (let i = 0; i < 3; i++) {
45
+ try {
46
+ await backend.queryTraces({});
47
+ }
48
+ catch {
49
+ // expected
50
+ }
51
+ }
52
+ assert.strictEqual(callCount, 3);
53
+ // Verify circuit is open (returns [] without fetch call)
54
+ const result = await backend.queryTraces({});
55
+ assert.deepStrictEqual(result, []);
56
+ assert.strictEqual(callCount, 3, 'Should not have made fetch call when circuit open');
57
+ // Advance time past reset period (default 60000ms)
58
+ currentTime += 61000;
59
+ // Should allow one request in half-open state
60
+ try {
61
+ await backend.queryTraces({});
62
+ }
63
+ catch {
64
+ // expected to fail, but should have made the request
65
+ }
66
+ assert.strictEqual(callCount, 4, 'Should have made request in half-open state');
67
+ Date.now = originalDateNow;
68
+ });
69
+ it('should close circuit after successful request in half-open state', async () => {
70
+ const originalDateNow = Date.now;
71
+ let currentTime = 1000000;
72
+ Date.now = () => currentTime;
73
+ let shouldFail = true;
74
+ let callCount = 0;
75
+ globalThis.fetch = setupMock(async () => {
76
+ callCount++;
77
+ if (shouldFail) {
78
+ throw new Error('API error');
79
+ }
80
+ return {
81
+ ok: true,
82
+ json: async () => createV5TraceResponse([]),
83
+ text: async () => '',
84
+ };
85
+ });
86
+ const backend = new SigNozApiBackend('https://signoz.example.com', 'test-key');
87
+ // Trigger 3 failures to open circuit
88
+ for (let i = 0; i < 3; i++) {
89
+ try {
90
+ await backend.queryTraces({});
91
+ }
92
+ catch {
93
+ // expected
94
+ }
95
+ }
96
+ // Advance time past reset period
97
+ currentTime += 61000;
98
+ shouldFail = false;
99
+ // Successful request in half-open state should close circuit
100
+ await backend.queryTraces({});
101
+ assert.strictEqual(callCount, 4);
102
+ // Circuit should be closed, subsequent requests should work
103
+ await backend.queryTraces({});
104
+ assert.strictEqual(callCount, 5);
105
+ Date.now = originalDateNow;
106
+ });
107
+ it('should reopen circuit after failure in half-open state', async () => {
108
+ const originalDateNow = Date.now;
109
+ let currentTime = 1000000;
110
+ Date.now = () => currentTime;
111
+ let callCount = 0;
112
+ globalThis.fetch = setupMock(async () => {
113
+ callCount++;
114
+ throw new Error('API error');
115
+ });
116
+ const backend = new SigNozApiBackend('https://signoz.example.com', 'test-key');
117
+ // Trigger 3 failures to open circuit
118
+ for (let i = 0; i < 3; i++) {
119
+ try {
120
+ await backend.queryTraces({});
121
+ }
122
+ catch {
123
+ // expected
124
+ }
125
+ }
126
+ assert.strictEqual(callCount, 3);
127
+ // Advance time past reset period
128
+ currentTime += 61000;
129
+ // Request in half-open state fails
130
+ try {
131
+ await backend.queryTraces({});
132
+ }
133
+ catch {
134
+ // expected
135
+ }
136
+ assert.strictEqual(callCount, 4);
137
+ // Circuit should be open again (failure in half-open reopens it)
138
+ const result = await backend.queryTraces({});
139
+ assert.deepStrictEqual(result, []);
140
+ assert.strictEqual(callCount, 4, 'Should not have made fetch call when circuit reopened');
141
+ Date.now = originalDateNow;
142
+ });
143
+ it('should reset failure count after successful request', async () => {
144
+ let shouldFail = true;
145
+ let callCount = 0;
146
+ globalThis.fetch = setupMock(async () => {
147
+ callCount++;
148
+ if (shouldFail) {
149
+ throw new Error('API error');
150
+ }
151
+ return {
152
+ ok: true,
153
+ json: async () => createV5TraceResponse([]),
154
+ text: async () => '',
155
+ };
156
+ });
157
+ const backend = new SigNozApiBackend('https://signoz.example.com', 'test-key');
158
+ // 2 failures (not enough to open circuit)
159
+ for (let i = 0; i < 2; i++) {
160
+ try {
161
+ await backend.queryTraces({});
162
+ }
163
+ catch {
164
+ // expected
165
+ }
166
+ }
167
+ assert.strictEqual(callCount, 2);
168
+ // Successful request should reset failure count
169
+ shouldFail = false;
170
+ await backend.queryTraces({});
171
+ assert.strictEqual(callCount, 3);
172
+ // 2 more failures should not open circuit (count was reset)
173
+ shouldFail = true;
174
+ for (let i = 0; i < 2; i++) {
175
+ try {
176
+ await backend.queryTraces({});
177
+ }
178
+ catch {
179
+ // expected
180
+ }
181
+ }
182
+ assert.strictEqual(callCount, 5);
183
+ // Should still be able to make requests (circuit not open)
184
+ try {
185
+ await backend.queryTraces({});
186
+ }
187
+ catch {
188
+ // expected to fail but should make the call
189
+ }
190
+ assert.strictEqual(callCount, 6, 'Circuit should still be closed');
191
+ });
192
+ it('should block all query methods when circuit is open', async () => {
193
+ let callCount = 0;
194
+ globalThis.fetch = setupMock(async () => {
195
+ callCount++;
196
+ throw new Error('API error');
197
+ });
198
+ const backend = new SigNozApiBackend('https://signoz.example.com', 'test-key');
199
+ // Open the circuit with traces
200
+ for (let i = 0; i < 3; i++) {
201
+ try {
202
+ await backend.queryTraces({});
203
+ }
204
+ catch {
205
+ // expected
206
+ }
207
+ }
208
+ assert.strictEqual(callCount, 3);
209
+ // All methods should be blocked
210
+ const methods = [
211
+ () => backend.queryTraces({}),
212
+ () => backend.queryLogs({}),
213
+ () => backend.queryMetrics({ metricName: 'test' }),
214
+ ];
215
+ for (const method of methods) {
216
+ const prevCount = callCount;
217
+ try {
218
+ await method();
219
+ }
220
+ catch {
221
+ // queryTraces and queryLogs return [] on error, queryMetrics might too
222
+ }
223
+ // Verify no additional fetch calls were made
224
+ assert.strictEqual(callCount, prevCount, 'Should not make fetch call when circuit open');
225
+ }
226
+ });
227
+ it('should report circuit breaker state in health check', async () => {
228
+ let callCount = 0;
229
+ globalThis.fetch = setupMock(async () => {
230
+ callCount++;
231
+ throw new Error('API error');
232
+ });
233
+ const backend = new SigNozApiBackend('https://signoz.example.com', 'test-key');
234
+ // Open the circuit
235
+ for (let i = 0; i < 3; i++) {
236
+ try {
237
+ await backend.queryTraces({});
238
+ }
239
+ catch {
240
+ // expected
241
+ }
242
+ }
243
+ // Health check should report circuit breaker status
244
+ const health = await backend.healthCheck();
245
+ assert.strictEqual(health.status, 'error');
246
+ assert(health.message?.includes('Circuit breaker'));
247
+ });
248
+ it('should log warning when circuit breaker opens', async () => {
249
+ const warnLogs = [];
250
+ const originalWarn = console.warn;
251
+ console.warn = (msg) => { warnLogs.push(msg); };
252
+ globalThis.fetch = setupMock(async () => {
253
+ throw new Error('API error');
254
+ });
255
+ const backend = new SigNozApiBackend('https://signoz.example.com', 'test-key');
256
+ // Trigger 3 failures to open circuit
257
+ for (let i = 0; i < 3; i++) {
258
+ try {
259
+ await backend.queryTraces({});
260
+ }
261
+ catch {
262
+ // expected
263
+ }
264
+ }
265
+ console.warn = originalWarn;
266
+ // Should have logged one warning when circuit opened
267
+ assert.strictEqual(warnLogs.length, 1);
268
+ assert(warnLogs[0].includes('[obs-toolkit] Circuit breaker OPENED'));
269
+ assert(warnLogs[0].includes('3 consecutive failures'));
270
+ assert(warnLogs[0].includes('was: closed'));
271
+ });
272
+ it('should log info when circuit breaker enters half-open state', async () => {
273
+ const originalDateNow = Date.now;
274
+ let currentTime = 1000000;
275
+ Date.now = () => currentTime;
276
+ const infoLogs = [];
277
+ const originalInfo = console.info;
278
+ console.info = (msg) => { infoLogs.push(msg); };
279
+ globalThis.fetch = setupMock(async () => {
280
+ throw new Error('API error');
281
+ });
282
+ const backend = new SigNozApiBackend('https://signoz.example.com', 'test-key');
283
+ // Trigger 3 failures to open circuit
284
+ for (let i = 0; i < 3; i++) {
285
+ try {
286
+ await backend.queryTraces({});
287
+ }
288
+ catch {
289
+ // expected
290
+ }
291
+ }
292
+ // Advance time past reset period (default 60000ms)
293
+ currentTime += 61000;
294
+ // Attempt a request which should trigger half-open transition
295
+ try {
296
+ await backend.queryTraces({});
297
+ }
298
+ catch {
299
+ // expected to fail
300
+ }
301
+ console.info = originalInfo;
302
+ Date.now = originalDateNow;
303
+ // Should have logged info when entering half-open state
304
+ assert(infoLogs.some(log => log.includes('[obs-toolkit] Circuit breaker entering HALF-OPEN state')));
305
+ });
306
+ it('should log info when circuit breaker closes after successful request', async () => {
307
+ const originalDateNow = Date.now;
308
+ let currentTime = 1000000;
309
+ Date.now = () => currentTime;
310
+ const infoLogs = [];
311
+ const originalInfo = console.info;
312
+ console.info = (msg) => { infoLogs.push(msg); };
313
+ let shouldFail = true;
314
+ globalThis.fetch = setupMock(async () => {
315
+ if (shouldFail) {
316
+ throw new Error('API error');
317
+ }
318
+ return {
319
+ ok: true,
320
+ json: async () => createV5TraceResponse([]),
321
+ text: async () => '',
322
+ };
323
+ });
324
+ const backend = new SigNozApiBackend('https://signoz.example.com', 'test-key');
325
+ // Trigger 3 failures to open circuit
326
+ for (let i = 0; i < 3; i++) {
327
+ try {
328
+ await backend.queryTraces({});
329
+ }
330
+ catch {
331
+ // expected
332
+ }
333
+ }
334
+ // Advance time past reset period
335
+ currentTime += 61000;
336
+ shouldFail = false;
337
+ // Successful request in half-open state should close circuit and log
338
+ await backend.queryTraces({});
339
+ console.info = originalInfo;
340
+ Date.now = originalDateNow;
341
+ // Should have logged both half-open transition and close
342
+ assert(infoLogs.some(log => log.includes('[obs-toolkit] Circuit breaker entering HALF-OPEN state')));
343
+ assert(infoLogs.some(log => log.includes('[obs-toolkit] Circuit breaker CLOSED after successful request')));
344
+ });
345
+ // A2 Category 2: Circuit Breaker State Transition Tests
346
+ describe('half-open state transition tests (A2)', () => {
347
+ it('should immediately return to OPEN on failure in half-open state', async () => {
348
+ const originalDateNow = Date.now;
349
+ let currentTime = 1000000;
350
+ Date.now = () => currentTime;
351
+ let callCount = 0;
352
+ globalThis.fetch = setupMock(async () => {
353
+ callCount++;
354
+ throw new Error('Persistent failure');
355
+ });
356
+ const backend = new SigNozApiBackend('https://signoz.example.com', 'test-key');
357
+ // Open the circuit with 3 failures
358
+ for (let i = 0; i < 3; i++) {
359
+ try {
360
+ await backend.queryTraces({});
361
+ }
362
+ catch {
363
+ // expected
364
+ }
365
+ }
366
+ assert.strictEqual(callCount, 3, 'Should make 3 requests to open circuit');
367
+ // Advance past reset timeout
368
+ currentTime += 61000;
369
+ // First request in half-open should be allowed
370
+ try {
371
+ await backend.queryTraces({});
372
+ }
373
+ catch {
374
+ // expected - the failure transitions back to open
375
+ }
376
+ assert.strictEqual(callCount, 4, 'Should allow one probe request in half-open');
377
+ // Circuit should be OPEN again, next request should be blocked
378
+ const result = await backend.queryTraces({});
379
+ assert.deepStrictEqual(result, [], 'Should return empty when circuit re-opened');
380
+ assert.strictEqual(callCount, 4, 'Should not make another request');
381
+ Date.now = originalDateNow;
382
+ });
383
+ it('should allow only ONE probe request in half-open state', async () => {
384
+ const originalDateNow = Date.now;
385
+ let currentTime = 1000000;
386
+ Date.now = () => currentTime;
387
+ let callCount = 0;
388
+ globalThis.fetch = setupMock(async () => {
389
+ callCount++;
390
+ // Simulate slow response that allows concurrent requests
391
+ await new Promise(resolve => setTimeout(resolve, 10));
392
+ return {
393
+ ok: true,
394
+ json: async () => createV5TraceResponse([]),
395
+ text: async () => '',
396
+ };
397
+ });
398
+ const backend = new SigNozApiBackend('https://signoz.example.com', 'test-key');
399
+ // Open the circuit
400
+ globalThis.fetch = setupMock(async () => {
401
+ callCount++;
402
+ throw new Error('Failure');
403
+ });
404
+ for (let i = 0; i < 3; i++) {
405
+ try {
406
+ await backend.queryTraces({});
407
+ }
408
+ catch {
409
+ // expected
410
+ }
411
+ }
412
+ callCount = 0;
413
+ // Advance past reset timeout
414
+ currentTime += 61000;
415
+ // Now set to success
416
+ globalThis.fetch = setupMock(async () => {
417
+ callCount++;
418
+ return {
419
+ ok: true,
420
+ json: async () => createV5TraceResponse([]),
421
+ text: async () => '',
422
+ };
423
+ });
424
+ // First request should be allowed (half-open probe)
425
+ await backend.queryTraces({});
426
+ assert.strictEqual(callCount, 1, 'Probe request should succeed');
427
+ Date.now = originalDateNow;
428
+ });
429
+ it('should remain open during timeout window and allow probe after', async () => {
430
+ const originalDateNow = Date.now;
431
+ let currentTime = 1000000;
432
+ // Mock Date.now BEFORE creating backend so circuit breaker uses mocked time
433
+ Date.now = () => currentTime;
434
+ let callCount = 0;
435
+ globalThis.fetch = setupMock(async () => {
436
+ callCount++;
437
+ throw new Error('Failure');
438
+ });
439
+ const backend = new SigNozApiBackend('https://signoz.example.com', 'test-key');
440
+ // Open the circuit with 3 failures
441
+ for (let i = 0; i < 3; i++) {
442
+ try {
443
+ await backend.queryTraces({});
444
+ }
445
+ catch {
446
+ // expected
447
+ }
448
+ }
449
+ assert.strictEqual(callCount, 3, 'Should make 3 requests to open circuit');
450
+ // Circuit should now be open - immediate request should be blocked
451
+ const result1 = await backend.queryTraces({});
452
+ assert.deepStrictEqual(result1, [], 'Should return empty when circuit open');
453
+ assert.strictEqual(callCount, 3, 'Should not make request when circuit open');
454
+ // Advance past reset timeout (61 seconds to ensure we're past the boundary)
455
+ currentTime += 61000;
456
+ // Now circuit should be in half-open state and allow one probe
457
+ try {
458
+ await backend.queryTraces({});
459
+ }
460
+ catch {
461
+ // expected - we still throw errors
462
+ }
463
+ assert.strictEqual(callCount, 4, 'Should make probe request after timeout');
464
+ Date.now = originalDateNow;
465
+ });
466
+ it('should increment failure count on half-open failure', async () => {
467
+ const originalDateNow = Date.now;
468
+ let currentTime = 1000000;
469
+ Date.now = () => currentTime;
470
+ // Track failure count through circuit breaker logging
471
+ let failureCountInLog = 0;
472
+ const originalWarn = console.warn;
473
+ console.warn = (msg) => {
474
+ const match = msg.match(/after (\d+) consecutive failures/);
475
+ if (match) {
476
+ failureCountInLog = parseInt(match[1], 10);
477
+ }
478
+ };
479
+ globalThis.fetch = setupMock(async () => {
480
+ throw new Error('Failure');
481
+ });
482
+ const backend = new SigNozApiBackend('https://signoz.example.com', 'test-key');
483
+ // Open the circuit with 3 failures
484
+ for (let i = 0; i < 3; i++) {
485
+ try {
486
+ await backend.queryTraces({});
487
+ }
488
+ catch {
489
+ // expected
490
+ }
491
+ }
492
+ assert.strictEqual(failureCountInLog, 3, 'Should open after 3 failures');
493
+ // Advance past reset timeout
494
+ currentTime += 61000;
495
+ // Fail in half-open state
496
+ failureCountInLog = 0;
497
+ try {
498
+ await backend.queryTraces({});
499
+ }
500
+ catch {
501
+ // expected
502
+ }
503
+ // Failure count should be 4 (3 + 1 from half-open failure)
504
+ assert.strictEqual(failureCountInLog, 4, 'Failure count should increment to 4');
505
+ console.warn = originalWarn;
506
+ Date.now = originalDateNow;
507
+ });
508
+ it('should log state transitions correctly', async () => {
509
+ const originalDateNow = Date.now;
510
+ let currentTime = 1000000;
511
+ Date.now = () => currentTime;
512
+ const logs = [];
513
+ const originalWarn = console.warn;
514
+ const originalInfo = console.info;
515
+ console.warn = (msg) => logs.push(`warn: ${msg}`);
516
+ console.info = (msg) => logs.push(`info: ${msg}`);
517
+ globalThis.fetch = setupMock(async () => {
518
+ throw new Error('Failure');
519
+ });
520
+ const backend = new SigNozApiBackend('https://signoz.example.com', 'test-key');
521
+ // Open the circuit
522
+ for (let i = 0; i < 3; i++) {
523
+ try {
524
+ await backend.queryTraces({});
525
+ }
526
+ catch {
527
+ // expected
528
+ }
529
+ }
530
+ // Check for OPENED log
531
+ assert(logs.some(l => l.includes('OPENED')), 'Should log when circuit opens');
532
+ // Advance and trigger half-open
533
+ currentTime += 61000;
534
+ try {
535
+ await backend.queryTraces({});
536
+ }
537
+ catch {
538
+ // expected
539
+ }
540
+ // Check for HALF-OPEN log
541
+ assert(logs.some(l => l.includes('HALF-OPEN')), 'Should log half-open transition');
542
+ console.warn = originalWarn;
543
+ console.info = originalInfo;
544
+ Date.now = originalDateNow;
545
+ });
546
+ });
547
+ });
548
+ //# sourceMappingURL=signoz-api-circuit-breaker.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signoz-api-circuit-breaker.test.js","sourceRoot":"","sources":["../../src/backends/signoz-api-circuit-breaker.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Rate limiter tests for SigNoz API backend
3
+ * L-STYLE-2: Extracted from signoz-api.test.ts for maintainability
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=signoz-api-rate-limiter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signoz-api-rate-limiter.test.d.ts","sourceRoot":"","sources":["../../src/backends/signoz-api-rate-limiter.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}