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 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: { let eventBufferMetrics: {
eventsBuffered: Counter | null
bufferFlushes: Counter | null
bufferFlushEvents: Histogram | null bufferFlushEvents: Histogram | null
bufferCurrentSize: Gauge | null bufferCurrentSize: Gauge | null
bufferPeakSize: Gauge | null bufferPeakSize: Gauge | null
bufferHistoryCacheSize: Gauge | null bufferHistoryCacheSize: Gauge | null
bufferOverflows: Counter | null
bufferLruCleanups: Counter | null bufferLruCleanups: Counter | null
} | null = null } | null = null
function getEventBufferMetrics() { function getEventBufferMetrics() {
if (!eventBufferMetrics) { if (!eventBufferMetrics) {
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( bufferFlushEvents: new Histogram(
'buffer_flush_events', 'buffer_flush_events',
'Number of events per buffer flush', 'Number of events per buffer flush',
@@ -1841,24 +1829,11 @@ function getEventBufferMetrics() {
'buffer_history_cache_size', 'buffer_history_cache_size',
'Current size of history cache' 'Current size of history cache'
), ),
bufferOverflows: new Counter(
'buffer_overflows_total',
'Total number of buffer overflows detected'
),
bufferLruCleanups: new Counter( bufferLruCleanups: new Counter(
'buffer_lru_cleanups_total', 'buffer_lru_cleanups_total',
'Total number of LRU cache cleanups performed' '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 return eventBufferMetrics
} }
@@ -1869,7 +1844,7 @@ function getEventBufferMetrics() {
*/ */
export function recordEventBuffered(eventType: string, count: number = 1): void { export function recordEventBuffered(eventType: string, count: number = 1): void {
try { try {
const metrics = getEventBufferMetrics() // Use the main metrics object which has eventsBuffered with label ['event_type']
metrics.eventsBuffered?.inc({ event_type: eventType }, count) metrics.eventsBuffered?.inc({ event_type: eventType }, count)
} catch { } catch {
// Metrics not initialized, ignore silently // 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 { export function recordBufferFlush(eventCount: number, forced: boolean): void {
try { try {
const metrics = getEventBufferMetrics() // Use the main metrics object which has the correct labels ['type', 'reason']
metrics.bufferFlushes?.inc({ forced: forced ? 'true' : 'false' }) metrics.bufferFlushes?.inc({ type: 'event', reason: forced ? 'forced' : 'normal' })
metrics.bufferFlushEvents?.observe({}, eventCount)
metrics.bufferCurrentSize?.set({}, 0) // Reset after flush // 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 { } catch {
// Metrics not initialized, ignore silently // Metrics not initialized, ignore silently
} }
@@ -1903,10 +1881,10 @@ export function updateBufferStatistics(stats: {
lruCleanups: number lruCleanups: number
}): void { }): void {
try { try {
const metrics = getEventBufferMetrics() const ebMetrics = getEventBufferMetrics()
metrics.bufferCurrentSize?.set({}, stats.currentSize) ebMetrics.bufferCurrentSize?.set({}, stats.currentSize)
metrics.bufferPeakSize?.set({}, stats.peakSize) ebMetrics.bufferPeakSize?.set({}, stats.peakSize)
metrics.bufferHistoryCacheSize?.set({}, stats.historyCacheSize) ebMetrics.bufferHistoryCacheSize?.set({}, stats.historyCacheSize)
} catch { } catch {
// Metrics not initialized, ignore silently // Metrics not initialized, ignore silently
} }