11package queue
22
33import (
4- "sync"
4+ "os"
5+ "path/filepath"
56
67 "github.com/prometheus/client_golang/prometheus"
78 "github.com/prometheus/client_golang/prometheus/promauto"
8- )
9-
10- // largest bucket is 5 seconds
11- var durationMsBuckets = []float64 {10 , 50 , 100 , 200 , 300 , 500 , 1000 , 2000 , 3000 , 5000 }
12-
13- var (
14- queueMetricLabels = []string {"queue" }
15- taskMetricLabels = []string {"queue" , "type" }
16- oneTaskQueueMetricsSetup sync.Once
17- oneSchedulerMetricsSetup sync.Once
9+ "github.com/sirupsen/logrus"
1810)
1911
2012// TaskQueueMetricsType provides access to the prometheus metric objects for the task queue
@@ -24,70 +16,138 @@ type TaskQueueMetricsType struct {
2416 EnqueueDuration * prometheus.HistogramVec
2517}
2618
27- // TaskQueueMetrics is the global metrics instance for the task queue of this instance
28- var TaskQueueMetrics TaskQueueMetricsType
29-
30- // SetupTaskQueueMetrics must be called before any other call to the metric subsystem happens
31- func SetupTaskQueueMetrics (namespace string ) {
32- oneTaskQueueMetricsSetup .Do (func () {
33- TaskQueueMetrics = TaskQueueMetricsType {
34- Labels : queueMetricLabels ,
35- TaskCounter : promauto .NewCounterVec (
36- prometheus.CounterOpts {
37- Namespace : namespace ,
38- Subsystem : "queue" ,
39- Name : "task" ,
40- Help : "count of tasks that have been enqueued" ,
41- },
42- taskMetricLabels ,
43- ),
44- EnqueueDuration : promauto .NewHistogramVec (
45- prometheus.HistogramOpts {
46- Namespace : namespace ,
47- Subsystem : "queue" ,
48- Name : "enqueue_duration_ms" ,
49- Help : "duration the enqueue action in ms" ,
50- Buckets : durationMsBuckets ,
51- },
52- queueMetricLabels ,
53- ),
54- }
55- })
56- }
57-
5819// TaskQueueMetricsType provides access to the prometheus metric objects for the scheduler
5920type SchedulerMetricsType struct {
6021 Labels []string
6122 ScheduleCounter * prometheus.CounterVec
6223 ErrorCounter * prometheus.CounterVec
6324}
6425
65- // SchedulerMetrics is the global metrics instance for the scheduler of this instance
66- var SchedulerMetrics SchedulerMetricsType
67-
68- // SetupSchedulerMetrics must be called before any other call to the metric subsystem happens
69- func SetupSchedulerMetrics (namespace string ) {
70- oneSchedulerMetricsSetup .Do (func () {
71- SchedulerMetrics = SchedulerMetricsType {
72- Labels : queueMetricLabels ,
73- ScheduleCounter : promauto .NewCounterVec (
74- prometheus.CounterOpts {
75- Namespace : namespace ,
76- Subsystem : "scheduler" ,
77- Name : "task" ,
78- Help : "count of tasks that have been scheduled" ,
79- },
80- taskMetricLabels ,
81- ),
82- ErrorCounter : promauto .NewCounterVec (
83- prometheus.CounterOpts {
84- Namespace : namespace ,
85- Subsystem : "scheduler" ,
86- Name : "error" ,
87- Help : "count of errors while scheduling" ,
88- },
89- taskMetricLabels ,
90- ),
91- }
92- })
26+ const (
27+ instanceKey = "instance"
28+ serviceKey = "service"
29+ )
30+
31+ var (
32+ // largest bucket is 5 seconds
33+ durationMsBuckets = []float64 {10 , 50 , 100 , 200 , 300 , 500 , 1000 , 2000 , 3000 , 5000 }
34+ processName = filepath .Base (os .Args [0 ])
35+ constLabels = prometheus.Labels {
36+ serviceKey : processName ,
37+ instanceKey : getHostname (),
38+ }
39+ queueMetricLabels = []string {"queue" }
40+ taskMetricLabels = []string {"queue" , "type" }
41+
42+ defTaskCounterOpts = prometheus.CounterOpts {
43+ Namespace : "queue" ,
44+ Subsystem : "task" ,
45+ Name : "total_count" ,
46+ Help : "count of tasks that have been enqueued" ,
47+ ConstLabels : constLabels ,
48+ }
49+ defEnqueueDurationOpts = prometheus.HistogramOpts {
50+ Namespace : "queue" ,
51+ Subsystem : "task" ,
52+ Name : "enqueue_duration_ms" ,
53+ Help : "duration the enqueue action in ms" ,
54+ Buckets : durationMsBuckets ,
55+ ConstLabels : constLabels ,
56+ }
57+ defScheduleCounterOpts = prometheus.CounterOpts {
58+ Namespace : "queue" ,
59+ Subsystem : "scheduler" ,
60+ Name : "total_scheduled" ,
61+ Help : "count of tasks that have been scheduled" ,
62+ ConstLabels : constLabels ,
63+ }
64+
65+ defSchedulerErrorCounterOpts = prometheus.CounterOpts {
66+ Namespace : "queue" ,
67+ Subsystem : "scheduler" ,
68+ Name : "total_errors" ,
69+ Help : "count of errors while scheduling" ,
70+ ConstLabels : constLabels ,
71+ }
72+
73+ // TaskQueueMetrics is the global metrics instance for the task queue of this instance
74+ TaskQueueMetrics = TaskQueueMetricsType {
75+ Labels : queueMetricLabels ,
76+ TaskCounter : promauto .NewCounterVec (
77+ defTaskCounterOpts ,
78+ taskMetricLabels ,
79+ ),
80+ EnqueueDuration : promauto .NewHistogramVec (
81+ defEnqueueDurationOpts ,
82+ queueMetricLabels ,
83+ ),
84+ }
85+
86+ // SchedulerMetrics is the global metrics instance for the scheduler of this instance
87+ SchedulerMetrics = SchedulerMetricsType {
88+ Labels : queueMetricLabels ,
89+ ScheduleCounter : promauto .NewCounterVec (
90+ defScheduleCounterOpts ,
91+ taskMetricLabels ,
92+ ),
93+ ErrorCounter : promauto .NewCounterVec (
94+ defSchedulerErrorCounterOpts ,
95+ taskMetricLabels ,
96+ ),
97+ }
98+ )
99+
100+ // SwitchMetricsServiceName changes the service label used in the metrics,
101+ // so it can be customized
102+ func SwitchMetricsServiceName (serviceName string ) {
103+ newConstLabels := prometheus.Labels {
104+ instanceKey : constLabels [instanceKey ],
105+ serviceKey : serviceName ,
106+ }
107+ newTaskCounterOpts := defTaskCounterOpts
108+ newTaskCounterOpts .ConstLabels = newConstLabels
109+
110+ newEnqueueDurationOpts := defEnqueueDurationOpts
111+ newEnqueueDurationOpts .ConstLabels = newConstLabels
112+
113+ newScheduleCounterOpts := defScheduleCounterOpts
114+ newScheduleCounterOpts .ConstLabels = newConstLabels
115+
116+ newSchedulerErrorCounterOpts := defSchedulerErrorCounterOpts
117+ newSchedulerErrorCounterOpts .ConstLabels = newConstLabels
118+
119+ TaskQueueMetrics = TaskQueueMetricsType {
120+ Labels : queueMetricLabels ,
121+ TaskCounter : promauto .NewCounterVec (
122+ newTaskCounterOpts ,
123+ taskMetricLabels ,
124+ ),
125+ EnqueueDuration : promauto .NewHistogramVec (
126+ newEnqueueDurationOpts ,
127+ queueMetricLabels ,
128+ ),
129+ }
130+
131+ // SchedulerMetrics is the global metrics instance for the scheduler of this instance
132+ SchedulerMetrics = SchedulerMetricsType {
133+ Labels : queueMetricLabels ,
134+ ScheduleCounter : promauto .NewCounterVec (
135+ newScheduleCounterOpts ,
136+ taskMetricLabels ,
137+ ),
138+ ErrorCounter : promauto .NewCounterVec (
139+ newSchedulerErrorCounterOpts ,
140+ taskMetricLabels ,
141+ ),
142+ }
143+ }
144+
145+ func getHostname () string {
146+ hostname , err := os .Hostname ()
147+ if err != nil {
148+ logrus .Errorf ("unable to retrieve hostname - setting to unknown" )
149+ hostname = "unknown"
150+ }
151+
152+ return hostname
93153}
0 commit comments