MetricsPlugin
Activates live retry counters and the onMetricsUpdated event. Without this plugin, getMetrics() still works but always returns a zeroed snapshot — keeping the core overhead-free.
Install
import { createMetricsPlugin } from 'axios-retryer/plugins/MetricsPlugin'; Basic usage
import { createRetryer } from 'axios-retryer';
import { createMetricsPlugin } from 'axios-retryer/plugins/MetricsPlugin';
const retryer = createRetryer({ retries: 3 }).use(createMetricsPlugin());
// Subscribe to live updates
retryer.on('onMetricsUpdated', (metrics) => {
console.log('Total requests: ', metrics.totalRequests);
console.log('Successful retries:', metrics.successfulRetries);
console.log('Failed completely: ', metrics.completelyFailedRequests);
console.log('Timer health: ', metrics.timerHealth.healthScore);
});
// Get a snapshot at any time
const snapshot = retryer.getMetrics();
console.log(snapshot); Metrics shape
interface RetryMetrics {
totalRequests: number; // All requests dispatched
successfulRetries: number; // Requests that succeeded after ≥1 retry
failedRetries: number; // Individual retry attempts that failed
completelyFailedRequests: number; // Requests that exhausted all retries
completelyFailedCriticalRequests: number; // Failed CRITICAL priority requests
totalRetryAttempts: number; // Sum of all retry attempts made
averageRetryDelay: number; // ms average delay between retries
timerHealth: {
activeTimers: number; // Total active internal timers
activeRetryTimers: number; // Active retry-delay timers
healthScore: number; // 0 = excellent, 50+ = investigate, 100+ = likely leak
};
} Dashboard integration
retryer.on('onMetricsUpdated', (metrics) => {
// Push to your metrics backend (Datadog, Prometheus, custom)
metricsClient.gauge('api.retries.success', metrics.successfulRetries);
metricsClient.gauge('api.retries.failed', metrics.completelyFailedRequests);
metricsClient.gauge('api.retry.avg_delay', metrics.averageRetryDelay);
// Alert on timer accumulation
if (metrics.timerHealth.healthScore > 50) {
alerting.warn('High timer count detected in RetryManager');
}
}); Periodic health check
setInterval(() => {
const { timerHealth } = retryer.getMetrics();
const stats = retryer.getTimerStats();
if (stats.activeTimers > 100) {
console.warn(`High timer count: ${stats.activeTimers} active timers`);
}
}, 10_000);
// Always clean up
process.on('SIGTERM', () => retryer.destroy()); Zero cost without the plugin
The core never increments any counters unless MetricsPlugin is installed. If you don't need retry metrics, omit the plugin and pay no overhead.