55
55
Name : "blocked_workers" ,
56
56
Help : "How many workers are waiting on an item to be ready." ,
57
57
})
58
+ workerIdleTime = prometheus .NewCounter (prometheus.CounterOpts {
59
+ Namespace : "cortex" ,
60
+ Name : "worker_idle_seconds_total" ,
61
+ Help : "How long workers have spent waiting for work." ,
62
+ })
58
63
evalLatency = prometheus .NewHistogram (prometheus.HistogramOpts {
59
64
Namespace : "cortex" ,
60
65
Name : "group_evaluation_latency_seconds" ,
@@ -68,6 +73,7 @@ func init() {
68
73
prometheus .MustRegister (evalLatency )
69
74
prometheus .MustRegister (rulesProcessed )
70
75
prometheus .MustRegister (blockedWorkers )
76
+ prometheus .MustRegister (workerIdleTime )
71
77
}
72
78
73
79
// Config is the configuration for the recording rules server.
@@ -460,15 +466,18 @@ func (w *worker) Run() {
460
466
return
461
467
default :
462
468
}
469
+ waitStart := time .Now ()
463
470
blockedWorkers .Inc ()
464
471
level .Debug (util .Logger ).Log ("msg" , "waiting for next work item" )
465
472
item := w .scheduler .nextWorkItem ()
466
473
blockedWorkers .Dec ()
474
+ waitElapsed := time .Now ().Sub (waitStart )
467
475
if item == nil {
468
476
level .Debug (util .Logger ).Log ("msg" , "queue closed and empty; terminating worker" )
469
477
return
470
478
}
471
479
evalLatency .Observe (time .Since (item .scheduled ).Seconds ())
480
+ workerIdleTime .Add (waitElapsed .Seconds ())
472
481
level .Debug (util .Logger ).Log ("msg" , "processing item" , "item" , item )
473
482
w .ruler .Evaluate (item .userID , item )
474
483
w .scheduler .workItemDone (* item )
0 commit comments