Skip to content

Events

Strategies report events to the instrumentation of the execution. Every event has a type. attempt is 1-based.

type Fields Reported by
retry.scheduled attempt, delayMs, error or value Retry
retry.exhausted attempts, error or value Retry
retry.declined attempt, error or value, reason: 'budget', 'idempotency' or 'delay' Retry
timeout attempt, timeoutMs Timeout
circuit.state_changed breaker, from, to Circuit breaker
circuit.rejected breaker, state, retryAfterMs Circuit breaker
bulkhead.rejected bulkhead, running, queued Bulkhead
fallback.used error Fallback
fallback.stale key, ageMs Stale fallback
rate_limit.rejected key, retryAfterMs Rate limit
lock.rejected key Lock
dedupe.joined key Dedupe
cache.hit key Cache
cache.miss key Cache
cache.stale key, error Cache
cache.failed key, error Cache
custom name, attributes? Custom strategies

The union of these shapes is the TenaceEvent type. A switch on event.type narrows it:

import { listener, type TenaceEvent } from '@julr/tenace'
function describeEvent(event: TenaceEvent): string {
switch (event.type) {
case 'retry.scheduled':
return `retry ${event.attempt} in ${event.delayMs}ms`
case 'circuit.state_changed':
return `${event.breaker}: ${event.from} -> ${event.to}`
default:
return event.type
}
}
const instrumentation = listener(event => logger.info(describeEvent(event)))