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.
- package/dist/backends/local-jsonl-boolean-search.test.js +8 -8
- package/dist/backends/local-jsonl-boolean-search.test.js.map +1 -1
- package/dist/backends/local-jsonl-cache.test.d.ts +2 -0
- package/dist/backends/local-jsonl-cache.test.d.ts.map +1 -0
- package/dist/backends/local-jsonl-cache.test.js +295 -0
- package/dist/backends/local-jsonl-cache.test.js.map +1 -0
- package/dist/backends/local-jsonl-circuit-breaker.test.d.ts +2 -0
- package/dist/backends/local-jsonl-circuit-breaker.test.d.ts.map +1 -0
- package/dist/backends/local-jsonl-circuit-breaker.test.js +180 -0
- package/dist/backends/local-jsonl-circuit-breaker.test.js.map +1 -0
- package/dist/backends/local-jsonl-export.test.d.ts +2 -0
- package/dist/backends/local-jsonl-export.test.d.ts.map +1 -0
- package/dist/backends/local-jsonl-export.test.js +704 -0
- package/dist/backends/local-jsonl-export.test.js.map +1 -0
- package/dist/backends/local-jsonl-index.test.d.ts +2 -0
- package/dist/backends/local-jsonl-index.test.d.ts.map +1 -0
- package/dist/backends/local-jsonl-index.test.js +554 -0
- package/dist/backends/local-jsonl-index.test.js.map +1 -0
- package/dist/backends/local-jsonl-logs.test.js +52 -43
- package/dist/backends/local-jsonl-logs.test.js.map +1 -1
- package/dist/backends/local-jsonl-metrics.test.d.ts +2 -0
- package/dist/backends/local-jsonl-metrics.test.d.ts.map +1 -0
- package/dist/backends/local-jsonl-metrics.test.js +876 -0
- package/dist/backends/local-jsonl-metrics.test.js.map +1 -0
- package/dist/backends/local-jsonl-traces.test.js +89 -83
- package/dist/backends/local-jsonl-traces.test.js.map +1 -1
- package/dist/backends/local-jsonl.d.ts +9 -0
- package/dist/backends/local-jsonl.d.ts.map +1 -1
- package/dist/backends/local-jsonl.js +348 -227
- package/dist/backends/local-jsonl.js.map +1 -1
- package/dist/backends/signoz-api-circuit-breaker.test.d.ts +6 -0
- package/dist/backends/signoz-api-circuit-breaker.test.d.ts.map +1 -0
- package/dist/backends/signoz-api-circuit-breaker.test.js +548 -0
- package/dist/backends/signoz-api-circuit-breaker.test.js.map +1 -0
- package/dist/backends/signoz-api-rate-limiter.test.d.ts +6 -0
- package/dist/backends/signoz-api-rate-limiter.test.d.ts.map +1 -0
- package/dist/backends/signoz-api-rate-limiter.test.js +389 -0
- package/dist/backends/signoz-api-rate-limiter.test.js.map +1 -0
- package/dist/backends/signoz-api-ssrf.test.d.ts +6 -0
- package/dist/backends/signoz-api-ssrf.test.d.ts.map +1 -0
- package/dist/backends/signoz-api-ssrf.test.js +216 -0
- package/dist/backends/signoz-api-ssrf.test.js.map +1 -0
- package/dist/backends/signoz-api-test-helpers.d.ts +80 -0
- package/dist/backends/signoz-api-test-helpers.d.ts.map +1 -0
- package/dist/backends/signoz-api-test-helpers.js +79 -0
- package/dist/backends/signoz-api-test-helpers.js.map +1 -0
- package/dist/backends/signoz-api.d.ts +16 -0
- package/dist/backends/signoz-api.d.ts.map +1 -1
- package/dist/backends/signoz-api.js +71 -9
- package/dist/backends/signoz-api.js.map +1 -1
- package/dist/backends/signoz-api.test.d.ts +9 -0
- package/dist/backends/signoz-api.test.d.ts.map +1 -1
- package/dist/backends/signoz-api.test.js +14 -1027
- package/dist/backends/signoz-api.test.js.map +1 -1
- package/dist/lib/cache.d.ts +47 -1
- package/dist/lib/cache.d.ts.map +1 -1
- package/dist/lib/cache.js +40 -3
- package/dist/lib/cache.js.map +1 -1
- package/dist/lib/circuit-breaker.d.ts +83 -0
- package/dist/lib/circuit-breaker.d.ts.map +1 -0
- package/dist/lib/circuit-breaker.js +125 -0
- package/dist/lib/circuit-breaker.js.map +1 -0
- package/dist/lib/circuit-breaker.test.d.ts +2 -0
- package/dist/lib/circuit-breaker.test.d.ts.map +1 -0
- package/dist/lib/circuit-breaker.test.js +263 -0
- package/dist/lib/circuit-breaker.test.js.map +1 -0
- package/dist/lib/constants-symlink.test.d.ts +12 -0
- package/dist/lib/constants-symlink.test.d.ts.map +1 -0
- package/dist/lib/constants-symlink.test.js +357 -0
- package/dist/lib/constants-symlink.test.js.map +1 -0
- package/dist/lib/edge-cases.test.js +17 -17
- package/dist/lib/edge-cases.test.js.map +1 -1
- package/dist/lib/error-sanitizer.d.ts.map +1 -1
- package/dist/lib/error-sanitizer.js +29 -3
- package/dist/lib/error-sanitizer.js.map +1 -1
- package/dist/lib/error-sanitizer.test.js +159 -0
- package/dist/lib/error-sanitizer.test.js.map +1 -1
- package/dist/lib/error-types.d.ts +54 -0
- package/dist/lib/error-types.d.ts.map +1 -0
- package/dist/lib/error-types.js +154 -0
- package/dist/lib/error-types.js.map +1 -0
- package/dist/lib/error-types.test.d.ts +2 -0
- package/dist/lib/error-types.test.d.ts.map +1 -0
- package/dist/lib/error-types.test.js +196 -0
- package/dist/lib/error-types.test.js.map +1 -0
- package/dist/lib/indexer.test.js +27 -27
- package/dist/lib/indexer.test.js.map +1 -1
- package/dist/lib/input-validator.d.ts +12 -0
- package/dist/lib/input-validator.d.ts.map +1 -1
- package/dist/lib/input-validator.fuzz.test.d.ts +12 -0
- package/dist/lib/input-validator.fuzz.test.d.ts.map +1 -0
- package/dist/lib/input-validator.fuzz.test.js +290 -0
- package/dist/lib/input-validator.fuzz.test.js.map +1 -0
- package/dist/lib/input-validator.js +57 -3
- package/dist/lib/input-validator.js.map +1 -1
- package/dist/lib/input-validator.test.js +129 -1
- package/dist/lib/input-validator.test.js.map +1 -1
- package/dist/lib/logger.d.ts +46 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +81 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/logger.test.d.ts +2 -0
- package/dist/lib/logger.test.d.ts.map +1 -0
- package/dist/lib/logger.test.js +122 -0
- package/dist/lib/logger.test.js.map +1 -0
- package/dist/lib/server-utils.d.ts +8 -0
- package/dist/lib/server-utils.d.ts.map +1 -1
- package/dist/lib/server-utils.js +34 -2
- package/dist/lib/server-utils.js.map +1 -1
- package/dist/lib/shared-schemas.d.ts +22 -0
- package/dist/lib/shared-schemas.d.ts.map +1 -1
- package/dist/lib/shared-schemas.js +22 -0
- package/dist/lib/shared-schemas.js.map +1 -1
- package/dist/lib/toon-encoder.d.ts +7 -2
- package/dist/lib/toon-encoder.d.ts.map +1 -1
- package/dist/lib/toon-encoder.js +21 -6
- package/dist/lib/toon-encoder.js.map +1 -1
- package/dist/lib/toon-encoder.test.d.ts +5 -0
- package/dist/lib/toon-encoder.test.d.ts.map +1 -0
- package/dist/lib/toon-encoder.test.js +85 -0
- package/dist/lib/toon-encoder.test.js.map +1 -0
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -1
- package/dist/server.test.js +30 -0
- package/dist/server.test.js.map +1 -1
- package/dist/test-helpers/env-utils.d.ts +22 -0
- package/dist/test-helpers/env-utils.d.ts.map +1 -1
- package/dist/test-helpers/env-utils.js +38 -0
- package/dist/test-helpers/env-utils.js.map +1 -1
- package/dist/test-helpers/fuzz-generators.d.ts +58 -0
- package/dist/test-helpers/fuzz-generators.d.ts.map +1 -0
- package/dist/test-helpers/fuzz-generators.js +216 -0
- package/dist/test-helpers/fuzz-generators.js.map +1 -0
- package/dist/test-helpers/index.d.ts +1 -0
- package/dist/test-helpers/index.d.ts.map +1 -1
- package/dist/test-helpers/index.js +2 -0
- package/dist/test-helpers/index.js.map +1 -1
- package/dist/test-helpers/memfs-utils.d.ts +181 -0
- package/dist/test-helpers/memfs-utils.d.ts.map +1 -0
- package/dist/test-helpers/memfs-utils.js +292 -0
- package/dist/test-helpers/memfs-utils.js.map +1 -0
- package/dist/test-helpers/memfs-utils.test.d.ts +5 -0
- package/dist/test-helpers/memfs-utils.test.d.ts.map +1 -0
- package/dist/test-helpers/memfs-utils.test.js +338 -0
- package/dist/test-helpers/memfs-utils.test.js.map +1 -0
- package/dist/test-helpers/race-condition-helpers.d.ts +85 -0
- package/dist/test-helpers/race-condition-helpers.d.ts.map +1 -0
- package/dist/test-helpers/race-condition-helpers.js +279 -0
- package/dist/test-helpers/race-condition-helpers.js.map +1 -0
- package/dist/test-helpers/test-data-builders.d.ts +40 -3
- package/dist/test-helpers/test-data-builders.d.ts.map +1 -1
- package/dist/test-helpers/test-data-builders.js +54 -5
- package/dist/test-helpers/test-data-builders.js.map +1 -1
- package/dist/test-helpers/tool-validators.d.ts.map +1 -1
- package/dist/test-helpers/tool-validators.js +16 -1
- package/dist/test-helpers/tool-validators.js.map +1 -1
- package/dist/tools/query-evaluations.d.ts.map +1 -1
- package/dist/tools/query-evaluations.js +16 -2
- package/dist/tools/query-evaluations.js.map +1 -1
- package/dist/tools/query-evaluations.test.js +53 -46
- package/dist/tools/query-evaluations.test.js.map +1 -1
- package/dist/tools/query-llm-events.test.js +6 -3
- package/dist/tools/query-llm-events.test.js.map +1 -1
- 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 @@
|
|
|
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"}
|