Feat/replace circuit breaker with bounded retry (#393)

Feat/replace circuit breaker with bounded retry (#393)
This commit is contained in:
Renato Alcara
2026-04-27 01:06:25 -03:00
committed by GitHub
parent 8b0a20fed9
commit a32be8d594
16 changed files with 944 additions and 1803 deletions
+9 -19
View File
@@ -29,8 +29,7 @@ const TimeMs = {
jest.mock('../../Utils/prometheus-metrics.js', () => ({
metrics: {
socketEvents: { inc: jest.fn() },
errors: { inc: jest.fn() },
circuitBreakerTrips: { inc: jest.fn() }
errors: { inc: jest.fn() }
}
}))
@@ -59,7 +58,6 @@ describe('UnifiedSessionManager', () => {
manager = createUnifiedSessionManager({
enabled: true,
logger: mockLogger as any,
enableCircuitBreaker: false, // Disable for simpler testing
sendNode: mockSendNode
})
})
@@ -356,7 +354,11 @@ describe('shouldEnableUnifiedSession', () => {
})
})
describe('UnifiedSessionManager with CircuitBreaker', () => {
describe('UnifiedSessionManager — non-critical send semantics', () => {
// The previous "with CircuitBreaker" suite is gone — telemetry no longer
// uses a circuit breaker. Verify equivalent behavior still holds:
// failures are swallowed (telemetry is non-critical) and don't propagate.
let manager: UnifiedSessionManager
let mockSendNode: MockSendNode
@@ -366,7 +368,6 @@ describe('UnifiedSessionManager with CircuitBreaker', () => {
manager = createUnifiedSessionManager({
enabled: true,
logger: createMockLogger() as any,
enableCircuitBreaker: true,
sendNode: mockSendNode
})
})
@@ -375,24 +376,13 @@ describe('UnifiedSessionManager with CircuitBreaker', () => {
manager.destroy()
})
it('should work with circuit breaker enabled', async () => {
it('should send telemetry once per call', async () => {
await manager.send('login')
expect(mockSendNode).toHaveBeenCalledTimes(1)
})
it('should handle circuit breaker failures gracefully', async () => {
// Make send fail multiple times to trigger circuit breaker
let callCount = 0
mockSendNode.mockImplementation(async () => {
callCount++
if (callCount <= 3) {
throw new Error(`Fail ${callCount}`)
}
})
// These should not throw even with failures
await expect(manager.send('login')).resolves.toBeUndefined()
await expect(manager.send('login')).resolves.toBeUndefined()
it('should swallow send failures gracefully (telemetry is non-critical)', async () => {
mockSendNode.mockRejectedValueOnce(new Error('boom'))
await expect(manager.send('login')).resolves.toBeUndefined()
})
})