Docs Plugins

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.

DebugSanitizationPlugin → All Plugins