fix(monitoring): use a per-second ring buffer for DNS query metrics, improve DNS logging rate limiting and security event aggregation, and bump smartmta dependency

This commit is contained in:
2026-03-02 15:06:26 +00:00
parent 17deb481e0
commit 94fa0f04d8
8 changed files with 128 additions and 76 deletions
+11 -6
View File
@@ -222,7 +222,8 @@ export class DcRouter {
public detectedPublicIp: string | null = null;
// DNS query logging rate limiter state
private dnsLogWindow: number[] = [];
private dnsLogWindowSecond: number = 0; // epoch second of current window
private dnsLogWindowCount: number = 0; // queries logged this second
private dnsBatchCount: number = 0;
private dnsBatchTimer: ReturnType<typeof setTimeout> | null = null;
@@ -901,7 +902,8 @@ export class DcRouter {
}
this.dnsBatchTimer = null;
this.dnsBatchCount = 0;
this.dnsLogWindow = [];
this.dnsLogWindowSecond = 0;
this.dnsLogWindowCount = 0;
}
await this.opsServer.stop();
@@ -1312,11 +1314,14 @@ export class DcRouter {
}
// Adaptive logging: individual logs up to 2/sec, then batch
const now = Date.now();
this.dnsLogWindow = this.dnsLogWindow.filter(t => now - t < 1000);
const nowSec = Math.floor(Date.now() / 1000);
if (nowSec !== this.dnsLogWindowSecond) {
this.dnsLogWindowSecond = nowSec;
this.dnsLogWindowCount = 0;
}
if (this.dnsLogWindow.length < 2) {
this.dnsLogWindow.push(now);
if (this.dnsLogWindowCount < 2) {
this.dnsLogWindowCount++;
const summary = event.questions.map(q => `${q.type} ${q.name}`).join(', ');
logger.log('info', `DNS query: ${summary} (${event.responseTimeMs}ms, ${event.answered ? 'answered' : 'unanswered'})`, { zone: 'dns' });
} else {