import { Injectable } from '@nestjs/common'; type Bucket = { requests: number; errors: number; totalDurationMs: number; }; @Injectable() export class MetricsService { private readonly bucket: Bucket = { requests: 0, errors: 0, totalDurationMs: 0 }; private startedAt = Date.now(); record(statusCode: number, durationMs: number): void { this.bucket.requests += 1; if (statusCode >= 400) this.bucket.errors += 1; this.bucket.totalDurationMs += durationMs; } snapshot() { const uptimeSec = Math.max(1, Math.floor((Date.now() - this.startedAt) / 1000)); const qps = this.bucket.requests / uptimeSec; const avgLatencyMs = this.bucket.requests > 0 ? this.bucket.totalDurationMs / this.bucket.requests : 0; const errorRate = this.bucket.requests > 0 ? this.bucket.errors / this.bucket.requests : 0; return { requests: this.bucket.requests, errors: this.bucket.errors, qps, avgLatencyMs, errorRate, uptimeSec, }; } }