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:
+11
-6
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user