36 lines
1004 B
TypeScript
36 lines
1004 B
TypeScript
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,
|
|
};
|
|
}
|
|
}
|