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)))