{"_id":"@bernierllc/retry-metrics","_rev":"10-b31244016b1183ff2960b9a9236be7db","name":"@bernierllc/retry-metrics","dist-tags":{"latest":"0.5.0"},"versions":{"0.1.1":{"name":"@bernierllc/retry-metrics","version":"0.1.1","keywords":["retry","metrics","analytics","performance","monitoring","atomic","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/retry-metrics@0.1.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools/tree/main/packages/retry-metrics#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"07fc2f8bef311ce76706af32b93d8855a46a41c4","tarball":"https://registry.npmjs.org/@bernierllc/retry-metrics/-/retry-metrics-0.1.1.tgz","fileCount":27,"integrity":"sha512-tuZ96ffse/SbDhsJM199v+nWANMhDGMt5cQX5TA0tjrVR5NGS6VCLrNG5RB5c4KLAXy9UEL7291jYCtMMUHOHA==","signatures":[{"sig":"MEYCIQCXLCJakqEEVwyVE47Skuoe36pGnngJmZVKV2UVSwMg0QIhAO2fGpCSfVJ9xPkDyIUjXbya/liLeiaTMmAHGWrISNni","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98477},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"2e39a175f564b70c8f9405f206c73f1529494c1a","scripts":{"test":"jest","build":"tsc","clean":"rm -rf dist","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/retry-metrics"},"_npmVersion":"11.4.2","description":"Atomic retry metrics and analytics utilities for the BernierLLC package suite","directories":{},"_nodeVersion":"24.4.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/retry-metrics_0.1.1_1753675436034_0.12644604221979838","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@bernierllc/retry-metrics","version":"0.1.3","keywords":["retry","metrics","analytics","performance","monitoring","atomic","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/retry-metrics@0.1.3","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools/tree/main/packages/retry-metrics#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"24973e6ac517ddabf283c52c08f5120d389044c1","tarball":"https://registry.npmjs.org/@bernierllc/retry-metrics/-/retry-metrics-0.1.3.tgz","fileCount":27,"integrity":"sha512-2DgahI2IxzvEzCkSTw8L+QYR31CZPbnhu6Hn6iZBqHHOQgjcTz83If4uKt4RByDArtOet9ZKb8TG0yYPiErZJA==","signatures":[{"sig":"MEUCIF0F2WeHC1bIUkAsdxsTrRvMuQ0Ua76XPhBq3cr/iSR4AiEAzyP9Ye6IMK561Np1PZ6MwTNSzmCP8TWAMdb6xyQwOd4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98479},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"761225cb108546e1372507af7f887f63bf49ee3e","private":false,"scripts":{"test":"jest","build":"tsc","clean":"rm -rf dist","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/retry-metrics"},"_npmVersion":"11.4.2","description":"Atomic retry metrics collection and analysis utilities","directories":{},"_nodeVersion":"24.4.1","publishConfig":{"access":"restricted"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/retry-metrics_0.1.3_1756845269967_0.5147306816879027","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@bernierllc/retry-metrics","version":"0.2.0","keywords":["retry","metrics","analytics","performance","monitoring","atomic","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/retry-metrics@0.2.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools/tree/main/packages/retry-metrics#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"1fc79abf3e7251bea00ee2c9061c4ced7678d8d4","tarball":"https://registry.npmjs.org/@bernierllc/retry-metrics/-/retry-metrics-0.2.0.tgz","fileCount":27,"integrity":"sha512-61ostfAB4jafPAJeJMoyoGCup9rYjrCyRUESsWzie3rnfYGeRbkQBqFlCjeC3t8LGijD0dGd5iMiLgrwYW8iVg==","signatures":[{"sig":"MEUCIH9YbiA/19or2QAS49EyVW6jZUqwMdgcIwg05Km+AaThAiEAppylPEFPpD68dTsH8STTAQTw5Ci4YFDt1u6MGlF2Jnw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98521},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"db551cb6bf3978b86c5dbb9404a7ad53e8c837da","private":false,"scripts":{"test":"jest","build":"tsc","clean":"rm -rf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/retry-metrics"},"_npmVersion":"11.6.2","description":"Atomic retry metrics collection and analysis utilities","directories":{},"_nodeVersion":"25.2.1","publishConfig":{"access":"restricted"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/retry-metrics_0.2.0_1771269581727_0.3476915509536578","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@bernierllc/retry-metrics","version":"0.2.1","keywords":["retry","metrics","analytics","performance","monitoring","atomic","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/retry-metrics@0.2.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools/tree/main/packages/retry-metrics#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"7ed0f5796e7d18e63fd7178a5cfec24c3fa2e1e6","tarball":"https://registry.npmjs.org/@bernierllc/retry-metrics/-/retry-metrics-0.2.1.tgz","fileCount":27,"integrity":"sha512-jluD2WjqEXAtsHJP9TAJTIlrAOyVNyzor4ex3qjNnbmZyZ2i3O/sNtk44D7yKN82/Kr3UKYuLOSBRtp0rFl8Vw==","signatures":[{"sig":"MEUCIQCjgE2ZiV1gspDqWqaeO7bEOd0nUEsCwkERxQj2HFQw+gIgE9V5Qd9xp33mYe8KyM6YbAOpbfeHRoDB+hlYKinD6MI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98516},"main":"dist/index.js","_from":"file:bernierllc-retry-metrics-0.2.1.tgz","types":"dist/index.d.ts","private":false,"scripts":{"test":"jest","build":"tsc","clean":"rm -rf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"_resolved":"/Users/mattbernier/projects/tools/packages/core/retry-metrics/bernierllc-retry-metrics-0.2.1.tgz","_integrity":"sha512-jluD2WjqEXAtsHJP9TAJTIlrAOyVNyzor4ex3qjNnbmZyZ2i3O/sNtk44D7yKN82/Kr3UKYuLOSBRtp0rFl8Vw==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/retry-metrics"},"_npmVersion":"11.6.2","description":"Atomic retry metrics collection and analysis utilities","directories":{},"_nodeVersion":"25.2.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/retry-metrics_0.2.1_1772571986128_0.5216043774231802","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@bernierllc/retry-metrics","version":"0.2.2","keywords":["retry","metrics","analytics","performance","monitoring","atomic","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/retry-metrics@0.2.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools/tree/main/packages/retry-metrics#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"515539a70e649cf25a218e613586f9d5582841dc","tarball":"https://registry.npmjs.org/@bernierllc/retry-metrics/-/retry-metrics-0.2.2.tgz","fileCount":27,"integrity":"sha512-h2H03T7a0Xso9bPghTX20qUKPeRKeqgc4spWNDkcn7BLpNX/Hgkpe6FaCaN+2MThL6IL+wMxAX4upxeWT4XgoQ==","signatures":[{"sig":"MEYCIQDwbTAyM7LEK7oMaf25h7JJnaw8GzBz4dMhxRefY0BxEwIhAIFbEAAZQEZyOTzD7T2MymtfQmoChlGvfrAQcOjVZ0HV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98516},"main":"dist/index.js","_from":"file:bernierllc-retry-metrics-0.2.2.tgz","types":"dist/index.d.ts","private":false,"scripts":{"test":"jest","build":"tsc","clean":"rm -rf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f749ba45-3340-425c-a75d-dfb7457f4685"}},"_resolved":"/home/runner/work/tools/tools/packages/core/retry-metrics/bernierllc-retry-metrics-0.2.2.tgz","_integrity":"sha512-h2H03T7a0Xso9bPghTX20qUKPeRKeqgc4spWNDkcn7BLpNX/Hgkpe6FaCaN+2MThL6IL+wMxAX4upxeWT4XgoQ==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/retry-metrics"},"_npmVersion":"11.11.0","description":"Atomic retry metrics collection and analysis utilities","directories":{},"_nodeVersion":"20.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/retry-metrics_0.2.2_1773164731255_0.002284600681855764","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@bernierllc/retry-metrics","version":"0.3.0","keywords":["retry","metrics","analytics","performance","monitoring","atomic","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/retry-metrics@0.3.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools/tree/main/packages/retry-metrics#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"239356323cc46457e5b5a74b7ed98e051c6d0ff3","tarball":"https://registry.npmjs.org/@bernierllc/retry-metrics/-/retry-metrics-0.3.0.tgz","fileCount":27,"integrity":"sha512-eFqlg26YxUW1Qxc8/7ROGM2x2/6qmrbpAWAtTe5aA/Rc3QdUkayN3JhwxWBmOHpmz1FpdjzD7ByDrrhOqujwtQ==","signatures":[{"sig":"MEUCIQDMGYPvHYPTFCnJ4zpThzmgRm+cSeYpplL+zlEfHJ2G8AIgdH6vsdW9piGbB1FOCrWL0sNcdVZ0SMgx60UvtFc0Yl0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98516},"main":"dist/index.js","_from":"file:bernierllc-retry-metrics-0.3.0.tgz","types":"dist/index.d.ts","private":false,"scripts":{"test":"jest","build":"tsc","clean":"rm -rf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f749ba45-3340-425c-a75d-dfb7457f4685"}},"_resolved":"/home/runner/work/tools/tools/packages/core/retry-metrics/bernierllc-retry-metrics-0.3.0.tgz","_integrity":"sha512-eFqlg26YxUW1Qxc8/7ROGM2x2/6qmrbpAWAtTe5aA/Rc3QdUkayN3JhwxWBmOHpmz1FpdjzD7ByDrrhOqujwtQ==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/retry-metrics"},"_npmVersion":"11.14.1","description":"Atomic retry metrics collection and analysis utilities","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/retry-metrics_0.3.0_1779241371500_0.6508887379632933","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@bernierllc/retry-metrics","version":"0.4.0","keywords":["retry","metrics","analytics","performance","monitoring","atomic","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/retry-metrics@0.4.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools/tree/main/packages/retry-metrics#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"50d3ce9d61480087286de80b5f31ec7746bfddc4","tarball":"https://registry.npmjs.org/@bernierllc/retry-metrics/-/retry-metrics-0.4.0.tgz","fileCount":31,"integrity":"sha512-PRjLq9u3QifaHi1MB4+gZPIodSYX63nIz13sZFGNjoM3nmYNhgTOEmV1x1VPTlErGV2jK9lEKdIuwuy1c/DsXA==","signatures":[{"sig":"MEUCIDa2Sx1oLAL+METcOm9P0r1oNhbFTxKPHER/OvlsZmOxAiEAyKUfPLhRL0rKAA+F5wzq4QKlQX/yxYPMd8D4Yob5GrQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":101786},"main":"dist/index.js","_from":"file:bernierllc-retry-metrics-0.4.0.tgz","types":"dist/index.d.ts","private":false,"scripts":{"test":"jest","build":"tsc","clean":"rm -rf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f749ba45-3340-425c-a75d-dfb7457f4685"}},"_resolved":"/home/runner/work/tools/tools/packages/core/retry-metrics/bernierllc-retry-metrics-0.4.0.tgz","_integrity":"sha512-PRjLq9u3QifaHi1MB4+gZPIodSYX63nIz13sZFGNjoM3nmYNhgTOEmV1x1VPTlErGV2jK9lEKdIuwuy1c/DsXA==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/retry-metrics"},"_npmVersion":"11.14.1","description":"Atomic retry metrics collection and analysis utilities","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/retry-metrics_0.4.0_1779243283709_0.7916286312329024","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@bernierllc/retry-metrics","version":"0.5.0","private":false,"description":"Atomic retry metrics collection and analysis utilities","main":"dist/index.js","types":"dist/index.d.ts","keywords":["retry","metrics","analytics","performance","monitoring","atomic","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","devDependencies":{"@types/jest":"^29.5.0","@types/node":"^20.0.0","jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0"},"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/bernierllc/tools.git","directory":"packages/retry-metrics"},"bugs":{"url":"https://github.com/bernierllc/tools/issues"},"homepage":"https://github.com/bernierllc/tools/tree/main/packages/retry-metrics#readme","scripts":{"build":"tsc","test":"jest","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage","clean":"rm -rf dist"},"_id":"@bernierllc/retry-metrics@0.5.0","_integrity":"sha512-fAQH9aZwT6j8Ojs8O5sIBxBW333aBAmAGjUYMVIG78xfj3ZuHjBdBNMlNwOxt2KrKTMsyskhtJ43W57fYvsiDQ==","_resolved":"/home/runner/work/tools/tools/packages/core/retry-metrics/bernierllc-retry-metrics-0.5.0.tgz","_from":"file:bernierllc-retry-metrics-0.5.0.tgz","_nodeVersion":"20.20.2","_npmVersion":"11.14.1","dist":{"integrity":"sha512-fAQH9aZwT6j8Ojs8O5sIBxBW333aBAmAGjUYMVIG78xfj3ZuHjBdBNMlNwOxt2KrKTMsyskhtJ43W57fYvsiDQ==","shasum":"5df759860b8f96e62ef7143d608c458aeda1adea","tarball":"https://registry.npmjs.org/@bernierllc/retry-metrics/-/retry-metrics-0.5.0.tgz","fileCount":31,"unpackedSize":101786,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDy0jjYGkhQ3Cj++n9Q4BPTAc8qVs67J9lhnbQT9/aWQQIgK2W6z4nx/i8RGM+VK1SXM9npiRb6ZVXMtR11vgbCVMM="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f749ba45-3340-425c-a75d-dfb7457f4685"}},"directories":{},"maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/retry-metrics_0.5.0_1779250119676_0.8335178819311597"},"_hasShrinkwrap":false}},"time":{"created":"2025-07-28T04:03:55.961Z","modified":"2026-05-20T04:08:39.977Z","0.1.1":"2025-07-28T04:03:56.206Z","0.1.3":"2025-09-02T20:34:30.153Z","0.2.0":"2026-02-16T19:19:41.879Z","0.2.1":"2026-03-03T21:06:26.278Z","0.2.2":"2026-03-10T17:45:31.415Z","0.3.0":"2026-05-20T01:42:51.644Z","0.4.0":"2026-05-20T02:14:43.884Z","0.5.0":"2026-05-20T04:08:39.815Z"},"bugs":{"url":"https://github.com/bernierllc/tools/issues"},"author":{"name":"Bernier LLC"},"license":"MIT","homepage":"https://github.com/bernierllc/tools/tree/main/packages/retry-metrics#readme","keywords":["retry","metrics","analytics","performance","monitoring","atomic","bernierllc"],"repository":{"type":"git","url":"git+https://github.com/bernierllc/tools.git","directory":"packages/retry-metrics"},"description":"Atomic retry metrics collection and analysis utilities","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"# @bernierllc/retry-metrics\n\nAtomic retry metrics and analytics utilities for the BernierLLC package suite.\n\n## Overview\n\n`@bernierllc/retry-metrics` provides comprehensive metrics collection, analytics, and performance monitoring for retry operations. It's designed to be a lightweight, atomic package that can be used independently or as part of larger retry systems.\n\n## Features\n\n- **Real-time Metrics Collection**: Track retry attempts, success rates, and performance metrics\n- **Performance Scoring**: Calculate performance scores with customizable weights and grades\n- **Analytics & Reporting**: Generate comprehensive reports with distributions and trends\n- **Alert System**: Configurable alerts for performance thresholds\n- **Storage Adapters**: In-memory and Redis storage options\n- **Event System**: Subscribe to metrics events for real-time monitoring\n- **Time-based Aggregation**: Aggregate metrics by minute, hour, day, week, or month\n- **Custom Metrics**: Add application-specific metrics alongside standard ones\n\n## Installation\n\n```bash\nnpm install @bernierllc/retry-metrics\n```\n\n## Quick Start\n\n```typescript\nimport { MetricsCollector, createMetricsStorage } from '@bernierllc/retry-metrics';\n\n// Create a metrics collector\nconst collector = new MetricsCollector({\n  enabled: true,\n  maxStoredAttempts: 1000\n});\n\n// Record retry attempts\ncollector.recordAttemptStart('operation-1', 1);\n// ... perform retry operation ...\ncollector.recordAttemptEnd('operation-1', 1, true, 150);\n\n// Get current metrics\nconst metrics = collector.getMetrics();\nconsole.log(`Success rate: ${(metrics.successfulRetries / metrics.totalRetries * 100).toFixed(1)}%`);\n\n// Calculate performance score\nconst score = collector.calculatePerformanceScore();\nconsole.log(`Performance grade: ${score.grade} (${(score.score * 100).toFixed(1)}%)`);\n```\n\n## API Reference\n\n### MetricsCollector\n\nThe main class for collecting and managing retry metrics.\n\n#### Constructor\n\n```typescript\nnew MetricsCollector(config: MetricsCollectorConfig)\n```\n\n**Configuration Options:**\n- `enabled`: Whether metrics collection is enabled (default: `true`)\n- `storage`: Optional storage adapter for persistence\n- `performanceWeights`: Custom weights for performance scoring\n- `maxStoredAttempts`: Maximum attempts to store in memory (default: `1000`)\n- `cleanupInterval`: Auto-cleanup interval in milliseconds (default: `60000`)\n\n#### Methods\n\n##### `recordAttemptStart(id: string, attempt: number, metadata?: Record<string, unknown>): void`\n\nRecord the start of a retry attempt.\n\n```typescript\ncollector.recordAttemptStart('api-call-1', 1, { endpoint: '/users' });\n```\n\n##### `recordAttemptEnd(id: string, attempt: number, success: boolean, duration: number, error?: string): void`\n\nRecord the completion of a retry attempt.\n\n```typescript\ncollector.recordAttemptEnd('api-call-1', 1, true, 150);\n// or for failed attempts\ncollector.recordAttemptEnd('api-call-1', 1, false, 200, 'Network timeout');\n```\n\n##### `getMetrics(): RetryMetrics`\n\nGet current metrics snapshot.\n\n```typescript\nconst metrics = collector.getMetrics();\nconsole.log(`Total retries: ${metrics.totalRetries}`);\nconsole.log(`Success rate: ${(metrics.successfulRetries / metrics.totalRetries * 100).toFixed(1)}%`);\n```\n\n##### `calculatePerformanceScore(weights?: Partial<PerformanceWeights>): PerformanceScore`\n\nCalculate overall performance score.\n\n```typescript\nconst score = collector.calculatePerformanceScore();\nconsole.log(`Grade: ${score.grade}, Score: ${(score.score * 100).toFixed(1)}%`);\nconsole.log('Recommendations:', score.recommendations);\n```\n\n##### `on(eventType: string, listener: MetricsEventListener): void`\n\nSubscribe to metrics events.\n\n```typescript\ncollector.on('attempt_completed', (event) => {\n  console.log(`Attempt ${event.data.id} completed: ${event.data.success}`);\n});\n\ncollector.on('metrics_updated', (event) => {\n  console.log('Metrics updated:', event.data.metrics);\n});\n```\n\n##### `updateMemoryUsage(usage: number): void`\n\nUpdate current memory usage.\n\n```typescript\ncollector.updateMemoryUsage(process.memoryUsage().heapUsed);\n```\n\n##### `addCustomMetric(key: string, value: number): void`\n\nAdd custom application-specific metrics.\n\n```typescript\ncollector.addCustomMetric('api_latency_p95', 250);\ncollector.addCustomMetric('cache_hit_rate', 0.85);\n```\n\n### Storage Adapters\n\n#### Memory Storage\n\n```typescript\nimport { MemoryMetricsStorage } from '@bernierllc/retry-metrics';\n\nconst storage = new MemoryMetricsStorage(1000); // Max 1000 attempts\n```\n\n#### Redis Storage\n\n```typescript\nimport { RedisMetricsStorage } from '@bernierllc/retry-metrics';\nimport Redis from 'ioredis';\n\nconst redis = new Redis();\nconst storage = new RedisMetricsStorage(redis, 'retry:metrics:', 86400);\n```\n\n#### Factory Function\n\n```typescript\nimport { createMetricsStorage } from '@bernierllc/retry-metrics';\n\n// Memory storage\nconst memoryStorage = createMetricsStorage('memory', { maxAttempts: 1000 });\n\n// Redis storage\nconst redisStorage = createMetricsStorage('redis', { \n  redisClient: redis,\n  prefix: 'retry:metrics:',\n  ttl: 86400\n});\n```\n\n### Analytics Utilities\n\n#### Basic Calculations\n\n```typescript\nimport { \n  calculateSuccessRate, \n  calculateFailureRate,\n  calculateThroughput,\n  calculateMedianRetryTime,\n  calculate95thPercentileRetryTime\n} from '@bernierllc/retry-metrics';\n\nconst successRate = calculateSuccessRate(metrics);\nconst failureRate = calculateFailureRate(metrics);\nconst throughput = calculateThroughput(attempts, 60000); // ops per minute\nconst medianTime = calculateMedianRetryTime(attempts);\nconst p95Time = calculate95thPercentileRetryTime(attempts);\n```\n\n#### Distributions\n\n```typescript\nimport { \n  calculateErrorDistribution,\n  calculateHourlyDistribution,\n  calculateDailyDistribution\n} from '@bernierllc/retry-metrics';\n\nconst errorDist = calculateErrorDistribution(attempts);\nconst hourlyDist = calculateHourlyDistribution(attempts);\nconst dailyDist = calculateDailyDistribution(attempts);\n```\n\n#### Aggregation\n\n```typescript\nimport { aggregateMetrics } from '@bernierllc/retry-metrics';\n\nconst hourlyMetrics = await aggregateMetrics(\n  attempts,\n  startTime,\n  endTime,\n  'hour'\n);\n```\n\n#### Performance Scoring\n\n```typescript\nimport { calculatePerformanceScore } from '@bernierllc/retry-metrics';\n\nconst score = calculatePerformanceScore(metrics, {\n  successRate: 0.4,\n  averageTime: 0.3,\n  memoryUsage: 0.2,\n  throughput: 0.1\n});\n```\n\n#### Report Generation\n\n```typescript\nimport { generateMetricsReport } from '@bernierllc/retry-metrics';\n\nconst report = generateMetricsReport(metrics, attempts, {\n  start: new Date('2025-01-01T00:00:00Z'),\n  end: new Date('2025-01-01T23:59:59Z')\n});\n\nconsole.log('Summary:', report.summary);\nconsole.log('Performance:', report.performance);\nconsole.log('Distributions:', report.distribution);\nconsole.log('Trends:', report.trends);\n```\n\n## Types\n\n### RetryMetrics\n\n```typescript\ninterface RetryMetrics {\n  totalRetries: number;\n  successfulRetries: number;\n  failedRetries: number;\n  averageRetryTime: number;\n  memoryUsage: number;\n  lastUpdated: Date;\n  customMetrics?: Record<string, number>;\n}\n```\n\n### RetryAttempt\n\n```typescript\ninterface RetryAttempt {\n  id: string;\n  attempt: number;\n  success: boolean;\n  duration: number;\n  error?: string;\n  startTime: Date;\n  endTime: Date;\n  metadata?: Record<string, unknown>;\n}\n```\n\n### PerformanceScore\n\n```typescript\ninterface PerformanceScore {\n  score: number; // 0-1\n  components: {\n    successRate: number;\n    averageTime: number;\n    memoryUsage: number;\n    throughput: number;\n  };\n  grade: 'A' | 'B' | 'C' | 'D' | 'F';\n  recommendations: string[];\n}\n```\n\n### Alert\n\n```typescript\ninterface Alert {\n  type: 'success_rate' | 'average_time' | 'memory_usage' | 'performance_score';\n  severity: 'warning' | 'critical';\n  message: string;\n  currentValue: number;\n  thresholdValue: number;\n  timestamp: Date;\n  context?: Record<string, unknown>;\n}\n```\n\n## Examples\n\n### Basic Usage with Alerts\n\n```typescript\nimport { MetricsCollector } from '@bernierllc/retry-metrics';\n\nconst collector = new MetricsCollector({\n  enabled: true,\n  onAlert: (alert) => {\n    console.log(`[${alert.severity.toUpperCase()}] ${alert.message}`);\n    // Send to monitoring system, Slack, etc.\n  }\n});\n\n// Configure alert thresholds\ncollector.configureAlerts({\n  enabled: true,\n  thresholds: {\n    minSuccessRate: 0.8,\n    maxAverageTime: 5000,\n    maxMemoryUsage: 100 * 1024 * 1024, // 100MB\n    minPerformanceScore: 0.7\n  }\n});\n```\n\n### Integration with Retry System\n\n```typescript\nimport { MetricsCollector } from '@bernierllc/retry-metrics';\n\nclass RetryManager {\n  private metrics: MetricsCollector;\n\n  constructor() {\n    this.metrics = new MetricsCollector({\n      enabled: true,\n      maxStoredAttempts: 10000\n    });\n  }\n\n  async executeWithRetry<T>(id: string, fn: () => Promise<T>, maxRetries: number = 3): Promise<T> {\n    for (let attempt = 1; attempt <= maxRetries; attempt++) {\n      const startTime = Date.now();\n      \n      this.metrics.recordAttemptStart(id, attempt);\n      \n      try {\n        const result = await fn();\n        const duration = Date.now() - startTime;\n        \n        this.metrics.recordAttemptEnd(id, attempt, true, duration);\n        return result;\n      } catch (error) {\n        const duration = Date.now() - startTime;\n        \n        this.metrics.recordAttemptEnd(id, attempt, false, duration, error.message);\n        \n        if (attempt === maxRetries) {\n          throw error;\n        }\n        \n        // Wait before retry\n        await new Promise(resolve => setTimeout(resolve, Math.pow(2, attempt) * 1000));\n      }\n    }\n  }\n\n  getMetrics() {\n    return this.metrics.getMetrics();\n  }\n\n  getPerformanceScore() {\n    return this.metrics.calculatePerformanceScore();\n  }\n}\n```\n\n### Redis Storage with Persistence\n\n```typescript\nimport { MetricsCollector, createMetricsStorage } from '@bernierllc/retry-metrics';\nimport Redis from 'ioredis';\n\nconst redis = new Redis();\nconst storage = createMetricsStorage('redis', { \n  redisClient: redis,\n  prefix: 'myapp:retry:',\n  ttl: 86400 * 7 // 7 days\n});\n\nconst collector = new MetricsCollector({\n  enabled: true,\n  storage,\n  maxStoredAttempts: 5000\n});\n\n// Metrics will be automatically persisted to Redis\ncollector.recordAttemptStart('api-call', 1);\ncollector.recordAttemptEnd('api-call', 1, true, 150);\n\n// Retrieve historical metrics\nconst historicalMetrics = await storage.getMetrics(\n  new Date('2025-01-01T00:00:00Z'),\n  new Date('2025-01-01T23:59:59Z')\n);\n```\n\n### Custom Metrics and Monitoring\n\n```typescript\nimport { MetricsCollector } from '@bernierllc/retry-metrics';\n\nconst collector = new MetricsCollector({\n  enabled: true\n});\n\n// Add custom metrics\ncollector.addCustomMetric('api_latency_p95', 250);\ncollector.addCustomMetric('cache_hit_rate', 0.85);\ncollector.addCustomMetric('database_connections', 12);\n\n// Subscribe to events for monitoring\ncollector.on('metrics_updated', (event) => {\n  const metrics = event.data.metrics;\n  \n  // Send to monitoring system\n  monitoringSystem.record('retry.success_rate', metrics.successfulRetries / metrics.totalRetries);\n  monitoringSystem.record('retry.average_time', metrics.averageRetryTime);\n  monitoringSystem.record('retry.memory_usage', metrics.memoryUsage);\n  \n  // Log custom metrics\n  Object.entries(metrics.customMetrics || {}).forEach(([key, value]) => {\n    monitoringSystem.record(`retry.custom.${key}`, value);\n  });\n});\n\ncollector.on('performance_score_calculated', (event) => {\n  const score = event.data.performanceScore;\n  \n  if (score.grade === 'F') {\n    // Send critical alert\n    alertSystem.sendCritical('Retry performance is critically low', score);\n  }\n});\n```\n\n## Performance Considerations\n\n- **Memory Usage**: The in-memory storage keeps attempts in memory. Use `maxStoredAttempts` to limit memory usage.\n- **Redis Performance**: Redis storage uses sorted sets for time-based queries. Consider Redis memory limits and TTL settings.\n- **Event Listeners**: Remove event listeners when no longer needed to prevent memory leaks.\n- **Cleanup**: Use `clearOldMetrics()` to remove old data and free memory.\n\n## Testing\n\n```typescript\nimport { MetricsCollector } from '@bernierllc/retry-metrics';\n\ndescribe('Retry Metrics', () => {\n  let collector: MetricsCollector;\n\n  beforeEach(() => {\n    collector = new MetricsCollector({ enabled: true });\n  });\n\n  afterEach(() => {\n    collector.destroy();\n  });\n\n  it('should track retry attempts', () => {\n    collector.recordAttemptStart('test-1', 1);\n    collector.recordAttemptEnd('test-1', 1, true, 100);\n\n    const metrics = collector.getMetrics();\n    expect(metrics.totalRetries).toBe(1);\n    expect(metrics.successfulRetries).toBe(1);\n  });\n});\n```\n\n## License\n\nMIT License - see [LICENSE](LICENSE) file for details.\n\n## Contributing\n\nThis package is part of the BernierLLC tools suite. Please refer to the main project documentation for contribution guidelines. ","readmeFilename":"README.md"}