@@ -43,7 +43,7 @@ type cpuCollector struct {
43
43
cpuPackageThrottle * prometheus.Desc
44
44
cpuIsolated * prometheus.Desc
45
45
logger log.Logger
46
- cpuStats [ ]procfs.CPUStat
46
+ cpuStats map [ int64 ]procfs.CPUStat
47
47
cpuStatsMutex sync.Mutex
48
48
isolatedCpus []uint16
49
49
@@ -126,6 +126,7 @@ func NewCPUCollector(logger log.Logger) (Collector, error) {
126
126
),
127
127
logger : logger ,
128
128
isolatedCpus : isolcpus ,
129
+ cpuStats : make (map [int64 ]procfs.CPUStat ),
129
130
}
130
131
err = c .compileIncludeFlags (flagsInclude , bugsInclude )
131
132
if err != nil {
@@ -324,7 +325,7 @@ func (c *cpuCollector) updateStat(ch chan<- prometheus.Metric) error {
324
325
c .cpuStatsMutex .Lock ()
325
326
defer c .cpuStatsMutex .Unlock ()
326
327
for cpuID , cpuStat := range c .cpuStats {
327
- cpuNum := strconv .Itoa (cpuID )
328
+ cpuNum := strconv .Itoa (int ( cpuID ) )
328
329
ch <- prometheus .MustNewConstMetric (c .cpu , prometheus .CounterValue , cpuStat .User , cpuNum , "user" )
329
330
ch <- prometheus .MustNewConstMetric (c .cpu , prometheus .CounterValue , cpuStat .Nice , cpuNum , "nice" )
330
331
ch <- prometheus .MustNewConstMetric (c .cpu , prometheus .CounterValue , cpuStat .System , cpuNum , "system" )
@@ -345,82 +346,82 @@ func (c *cpuCollector) updateStat(ch chan<- prometheus.Metric) error {
345
346
}
346
347
347
348
// updateCPUStats updates the internal cache of CPU stats.
348
- func (c * cpuCollector ) updateCPUStats (newStats [ ]procfs.CPUStat ) {
349
+ func (c * cpuCollector ) updateCPUStats (newStats map [ int64 ]procfs.CPUStat ) {
349
350
350
351
// Acquire a lock to update the stats.
351
352
c .cpuStatsMutex .Lock ()
352
353
defer c .cpuStatsMutex .Unlock ()
353
354
354
355
// Reset the cache if the list of CPUs has changed.
355
- if len (c .cpuStats ) != len (newStats ) {
356
- c .cpuStats = make ([]procfs.CPUStat , len (newStats ))
357
- }
358
-
359
356
for i , n := range newStats {
357
+ cpuStats := c .cpuStats [i ]
358
+
360
359
// If idle jumps backwards by more than X seconds, assume we had a hotplug event and reset the stats for this CPU.
361
- if (c . cpuStats [ i ] .Idle - n .Idle ) >= jumpBackSeconds {
362
- level .Debug (c .logger ).Log ("msg" , jumpBackDebugMessage , "cpu" , i , "old_value" , c . cpuStats [ i ] .Idle , "new_value" , n .Idle )
363
- c . cpuStats [ i ] = procfs.CPUStat {}
360
+ if (cpuStats .Idle - n .Idle ) >= jumpBackSeconds {
361
+ level .Debug (c .logger ).Log ("msg" , jumpBackDebugMessage , "cpu" , i , "old_value" , cpuStats .Idle , "new_value" , n .Idle )
362
+ cpuStats = procfs.CPUStat {}
364
363
}
365
364
366
- if n .Idle >= c . cpuStats [ i ] .Idle {
367
- c . cpuStats [ i ] .Idle = n .Idle
365
+ if n .Idle >= cpuStats .Idle {
366
+ cpuStats .Idle = n .Idle
368
367
} else {
369
- level .Debug (c .logger ).Log ("msg" , "CPU Idle counter jumped backwards" , "cpu" , i , "old_value" , c . cpuStats [ i ] .Idle , "new_value" , n .Idle )
368
+ level .Debug (c .logger ).Log ("msg" , "CPU Idle counter jumped backwards" , "cpu" , i , "old_value" , cpuStats .Idle , "new_value" , n .Idle )
370
369
}
371
370
372
- if n .User >= c . cpuStats [ i ] .User {
373
- c . cpuStats [ i ] .User = n .User
371
+ if n .User >= cpuStats .User {
372
+ cpuStats .User = n .User
374
373
} else {
375
- level .Debug (c .logger ).Log ("msg" , "CPU User counter jumped backwards" , "cpu" , i , "old_value" , c . cpuStats [ i ] .User , "new_value" , n .User )
374
+ level .Debug (c .logger ).Log ("msg" , "CPU User counter jumped backwards" , "cpu" , i , "old_value" , cpuStats .User , "new_value" , n .User )
376
375
}
377
376
378
- if n .Nice >= c . cpuStats [ i ] .Nice {
379
- c . cpuStats [ i ] .Nice = n .Nice
377
+ if n .Nice >= cpuStats .Nice {
378
+ cpuStats .Nice = n .Nice
380
379
} else {
381
- level .Debug (c .logger ).Log ("msg" , "CPU Nice counter jumped backwards" , "cpu" , i , "old_value" , c . cpuStats [ i ] .Nice , "new_value" , n .Nice )
380
+ level .Debug (c .logger ).Log ("msg" , "CPU Nice counter jumped backwards" , "cpu" , i , "old_value" , cpuStats .Nice , "new_value" , n .Nice )
382
381
}
383
382
384
- if n .System >= c . cpuStats [ i ] .System {
385
- c . cpuStats [ i ] .System = n .System
383
+ if n .System >= cpuStats .System {
384
+ cpuStats .System = n .System
386
385
} else {
387
- level .Debug (c .logger ).Log ("msg" , "CPU System counter jumped backwards" , "cpu" , i , "old_value" , c . cpuStats [ i ] .System , "new_value" , n .System )
386
+ level .Debug (c .logger ).Log ("msg" , "CPU System counter jumped backwards" , "cpu" , i , "old_value" , cpuStats .System , "new_value" , n .System )
388
387
}
389
388
390
- if n .Iowait >= c . cpuStats [ i ] .Iowait {
391
- c . cpuStats [ i ] .Iowait = n .Iowait
389
+ if n .Iowait >= cpuStats .Iowait {
390
+ cpuStats .Iowait = n .Iowait
392
391
} else {
393
- level .Debug (c .logger ).Log ("msg" , "CPU Iowait counter jumped backwards" , "cpu" , i , "old_value" , c . cpuStats [ i ] .Iowait , "new_value" , n .Iowait )
392
+ level .Debug (c .logger ).Log ("msg" , "CPU Iowait counter jumped backwards" , "cpu" , i , "old_value" , cpuStats .Iowait , "new_value" , n .Iowait )
394
393
}
395
394
396
- if n .IRQ >= c . cpuStats [ i ] .IRQ {
397
- c . cpuStats [ i ] .IRQ = n .IRQ
395
+ if n .IRQ >= cpuStats .IRQ {
396
+ cpuStats .IRQ = n .IRQ
398
397
} else {
399
- level .Debug (c .logger ).Log ("msg" , "CPU IRQ counter jumped backwards" , "cpu" , i , "old_value" , c . cpuStats [ i ] .IRQ , "new_value" , n .IRQ )
398
+ level .Debug (c .logger ).Log ("msg" , "CPU IRQ counter jumped backwards" , "cpu" , i , "old_value" , cpuStats .IRQ , "new_value" , n .IRQ )
400
399
}
401
400
402
- if n .SoftIRQ >= c . cpuStats [ i ] .SoftIRQ {
403
- c . cpuStats [ i ] .SoftIRQ = n .SoftIRQ
401
+ if n .SoftIRQ >= cpuStats .SoftIRQ {
402
+ cpuStats .SoftIRQ = n .SoftIRQ
404
403
} else {
405
- level .Debug (c .logger ).Log ("msg" , "CPU SoftIRQ counter jumped backwards" , "cpu" , i , "old_value" , c . cpuStats [ i ] .SoftIRQ , "new_value" , n .SoftIRQ )
404
+ level .Debug (c .logger ).Log ("msg" , "CPU SoftIRQ counter jumped backwards" , "cpu" , i , "old_value" , cpuStats .SoftIRQ , "new_value" , n .SoftIRQ )
406
405
}
407
406
408
- if n .Steal >= c . cpuStats [ i ] .Steal {
409
- c . cpuStats [ i ] .Steal = n .Steal
407
+ if n .Steal >= cpuStats .Steal {
408
+ cpuStats .Steal = n .Steal
410
409
} else {
411
- level .Debug (c .logger ).Log ("msg" , "CPU Steal counter jumped backwards" , "cpu" , i , "old_value" , c . cpuStats [ i ] .Steal , "new_value" , n .Steal )
410
+ level .Debug (c .logger ).Log ("msg" , "CPU Steal counter jumped backwards" , "cpu" , i , "old_value" , cpuStats .Steal , "new_value" , n .Steal )
412
411
}
413
412
414
- if n .Guest >= c . cpuStats [ i ] .Guest {
415
- c . cpuStats [ i ] .Guest = n .Guest
413
+ if n .Guest >= cpuStats .Guest {
414
+ cpuStats .Guest = n .Guest
416
415
} else {
417
- level .Debug (c .logger ).Log ("msg" , "CPU Guest counter jumped backwards" , "cpu" , i , "old_value" , c . cpuStats [ i ] .Guest , "new_value" , n .Guest )
416
+ level .Debug (c .logger ).Log ("msg" , "CPU Guest counter jumped backwards" , "cpu" , i , "old_value" , cpuStats .Guest , "new_value" , n .Guest )
418
417
}
419
418
420
- if n .GuestNice >= c . cpuStats [ i ] .GuestNice {
421
- c . cpuStats [ i ] .GuestNice = n .GuestNice
419
+ if n .GuestNice >= cpuStats .GuestNice {
420
+ cpuStats .GuestNice = n .GuestNice
422
421
} else {
423
- level .Debug (c .logger ).Log ("msg" , "CPU GuestNice counter jumped backwards" , "cpu" , i , "old_value" , c . cpuStats [ i ] .GuestNice , "new_value" , n .GuestNice )
422
+ level .Debug (c .logger ).Log ("msg" , "CPU GuestNice counter jumped backwards" , "cpu" , i , "old_value" , cpuStats .GuestNice , "new_value" , n .GuestNice )
424
423
}
424
+
425
+ c .cpuStats [i ] = cpuStats
425
426
}
426
427
}
0 commit comments