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:
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user