Files
Fabric.Backend.Center/src/common/metrics.service.ts

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,
};
}
}