1package control
2
3import "github.com/prometheus/client_golang/prometheus"
4
5// controllerMetrics holds metrics related to the query controller.
6type controllerMetrics struct {
7	requests  *prometheus.CounterVec
8	functions *prometheus.CounterVec
9
10	all          *prometheus.GaugeVec
11	compiling    *prometheus.GaugeVec
12	queueing     *prometheus.GaugeVec
13	executing    *prometheus.GaugeVec
14	memoryUnused *prometheus.GaugeVec
15
16	allDur       *prometheus.HistogramVec
17	compilingDur *prometheus.HistogramVec
18	queueingDur  *prometheus.HistogramVec
19	executingDur *prometheus.HistogramVec
20}
21
22type requestsLabel string
23
24const (
25	labelSuccess      = requestsLabel("success")
26	labelCompileError = requestsLabel("compile_error")
27	labelRuntimeError = requestsLabel("runtime_error")
28	labelQueueError   = requestsLabel("queue_error")
29)
30
31func newControllerMetrics(labels []string) *controllerMetrics {
32	return &controllerMetrics{
33		requests: prometheus.NewCounterVec(prometheus.CounterOpts{
34			Name: "qc_requests_total",
35			Help: "Count of the query requests",
36		}, append(labels, "result")),
37
38		functions: prometheus.NewCounterVec(prometheus.CounterOpts{
39			Name: "qc_functions_total",
40			Help: "Count of functions in queries",
41		}, append(labels, "function")),
42
43		all: prometheus.NewGaugeVec(prometheus.GaugeOpts{
44			Name: "qc_all_active",
45			Help: "Number of queries in all states",
46		}, labels),
47
48		compiling: prometheus.NewGaugeVec(prometheus.GaugeOpts{
49			Name: "qc_compiling_active",
50			Help: "Number of queries actively compiling",
51		}, append(labels, "compiler_type")),
52
53		queueing: prometheus.NewGaugeVec(prometheus.GaugeOpts{
54			Name: "qc_queueing_active",
55			Help: "Number of queries actively queueing",
56		}, labels),
57
58		executing: prometheus.NewGaugeVec(prometheus.GaugeOpts{
59			Name: "qc_executing_active",
60			Help: "Number of queries actively executing",
61		}, labels),
62
63		memoryUnused: prometheus.NewGaugeVec(prometheus.GaugeOpts{
64			Name: "qc_memory_unused_bytes",
65			Help: "The free memory as seen by the internal memory manager",
66		}, labels),
67
68		allDur: prometheus.NewHistogramVec(prometheus.HistogramOpts{
69			Name:    "qc_all_duration_seconds",
70			Help:    "Histogram of total times spent in all query states",
71			Buckets: prometheus.ExponentialBuckets(1e-3, 5, 7),
72		}, labels),
73
74		compilingDur: prometheus.NewHistogramVec(prometheus.HistogramOpts{
75			Name:    "qc_compiling_duration_seconds",
76			Help:    "Histogram of times spent compiling queries",
77			Buckets: prometheus.ExponentialBuckets(1e-3, 5, 7),
78		}, append(labels, "compiler_type")),
79
80		queueingDur: prometheus.NewHistogramVec(prometheus.HistogramOpts{
81			Name:    "qc_queueing_duration_seconds",
82			Help:    "Histogram of times spent queueing queries",
83			Buckets: prometheus.ExponentialBuckets(1e-3, 5, 7),
84		}, labels),
85
86		executingDur: prometheus.NewHistogramVec(prometheus.HistogramOpts{
87			Name:    "qc_executing_duration_seconds",
88			Help:    "Histogram of times spent executing queries",
89			Buckets: prometheus.ExponentialBuckets(1e-3, 5, 7),
90		}, labels),
91	}
92}
93
94// PrometheusCollectors satisfies the prom.PrometheusCollector interface.
95func (cm *controllerMetrics) PrometheusCollectors() []prometheus.Collector {
96	return []prometheus.Collector{
97		cm.requests,
98		cm.functions,
99
100		cm.all,
101		cm.compiling,
102		cm.queueing,
103		cm.executing,
104		cm.memoryUnused,
105
106		cm.allDur,
107		cm.compilingDur,
108		cm.queueingDur,
109		cm.executingDur,
110	}
111}
112