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