fix: resolve buffer_flushes_total metric label mismatch

The buffer_flushes_total metric was registered twice with different labels:
- In main metrics object: ['type', 'reason']
- In getEventBufferMetrics(): ['forced']

This caused recordBufferFlush() to silently fail because it tried to
increment with { forced } labels but the registered metric expected
{ type, reason } labels.

Fix:
- Remove duplicate bufferFlushes from getEventBufferMetrics()
- Update recordBufferFlush() to use metrics.bufferFlushes with correct labels
- Update recordEventBuffered() to use main metrics.eventsBuffered
- Rename local variable to avoid shadowing global metrics object
This commit is contained in:
Claude
2026-01-22 12:57:44 +00:00
parent e4ffbb4b5c
commit b1687389cd
+14 -36
View File
@@ -1798,31 +1798,19 @@ export function trackOperation(
// Event Buffer Metrics Integration
// ============================================
// Event buffer metrics (lazy initialized)
// Event buffer metrics (lazy initialized) - for detailed buffer tracking
// Note: bufferFlushes is NOT here - use metrics.bufferFlushes from main metrics object
let eventBufferMetrics: {
eventsBuffered: Counter | null
bufferFlushes: Counter | null
bufferFlushEvents: Histogram | null
bufferCurrentSize: Gauge | null
bufferPeakSize: Gauge | null
bufferHistoryCacheSize: Gauge | null
bufferOverflows: Counter | null
bufferLruCleanups: Counter | null
} | null = null
function getEventBufferMetrics() {
if (!eventBufferMetrics) {
eventBufferMetrics = {
eventsBuffered: new Counter(
'events_buffered_total',
'Total number of events buffered',
['event_type']
),
bufferFlushes: new Counter(
'buffer_flushes_total',
'Total number of buffer flushes',
['forced']
),
bufferFlushEvents: new Histogram(
'buffer_flush_events',
'Number of events per buffer flush',
@@ -1841,24 +1829,11 @@ function getEventBufferMetrics() {
'buffer_history_cache_size',
'Current size of history cache'
),
bufferOverflows: new Counter(
'buffer_overflows_total',
'Total number of buffer overflows detected'
),
bufferLruCleanups: new Counter(
'buffer_lru_cleanups_total',
'Total number of LRU cache cleanups performed'
)
}
// Register all metrics
if (eventBufferMetrics.eventsBuffered) baileysMetrics.register(eventBufferMetrics.eventsBuffered)
if (eventBufferMetrics.bufferFlushes) baileysMetrics.register(eventBufferMetrics.bufferFlushes)
if (eventBufferMetrics.bufferFlushEvents) baileysMetrics.register(eventBufferMetrics.bufferFlushEvents)
if (eventBufferMetrics.bufferCurrentSize) baileysMetrics.register(eventBufferMetrics.bufferCurrentSize)
if (eventBufferMetrics.bufferPeakSize) baileysMetrics.register(eventBufferMetrics.bufferPeakSize)
if (eventBufferMetrics.bufferHistoryCacheSize) baileysMetrics.register(eventBufferMetrics.bufferHistoryCacheSize)
if (eventBufferMetrics.bufferOverflows) baileysMetrics.register(eventBufferMetrics.bufferOverflows)
if (eventBufferMetrics.bufferLruCleanups) baileysMetrics.register(eventBufferMetrics.bufferLruCleanups)
}
return eventBufferMetrics
}
@@ -1869,7 +1844,7 @@ function getEventBufferMetrics() {
*/
export function recordEventBuffered(eventType: string, count: number = 1): void {
try {
const metrics = getEventBufferMetrics()
// Use the main metrics object which has eventsBuffered with label ['event_type']
metrics.eventsBuffered?.inc({ event_type: eventType }, count)
} catch {
// Metrics not initialized, ignore silently
@@ -1882,10 +1857,13 @@ export function recordEventBuffered(eventType: string, count: number = 1): void
*/
export function recordBufferFlush(eventCount: number, forced: boolean): void {
try {
const metrics = getEventBufferMetrics()
metrics.bufferFlushes?.inc({ forced: forced ? 'true' : 'false' })
metrics.bufferFlushEvents?.observe({}, eventCount)
metrics.bufferCurrentSize?.set({}, 0) // Reset after flush
// Use the main metrics object which has the correct labels ['type', 'reason']
metrics.bufferFlushes?.inc({ type: 'event', reason: forced ? 'forced' : 'normal' })
// Also update the lazy-loaded event buffer metrics for detailed tracking
const ebMetrics = getEventBufferMetrics()
ebMetrics.bufferFlushEvents?.observe({}, eventCount)
ebMetrics.bufferCurrentSize?.set({}, 0) // Reset after flush
} catch {
// Metrics not initialized, ignore silently
}
@@ -1903,10 +1881,10 @@ export function updateBufferStatistics(stats: {
lruCleanups: number
}): void {
try {
const metrics = getEventBufferMetrics()
metrics.bufferCurrentSize?.set({}, stats.currentSize)
metrics.bufferPeakSize?.set({}, stats.peakSize)
metrics.bufferHistoryCacheSize?.set({}, stats.historyCacheSize)
const ebMetrics = getEventBufferMetrics()
ebMetrics.bufferCurrentSize?.set({}, stats.currentSize)
ebMetrics.bufferPeakSize?.set({}, stats.peakSize)
ebMetrics.bufferHistoryCacheSize?.set({}, stats.historyCacheSize)
} catch {
// Metrics not initialized, ignore silently
}