1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
10 "git.curoverse.com/arvados.git/sdk/go/httpserver"
11 "github.com/prometheus/client_golang/prometheus"
14 type nodeMetrics struct {
15 reg *prometheus.Registry
18 func (m *nodeMetrics) setupBufferPoolMetrics(b *bufferPool) {
19 m.reg.MustRegister(prometheus.NewGaugeFunc(
22 Subsystem: "keepstore",
23 Name: "bufferpool_allocated_bytes",
24 Help: "Number of bytes allocated to buffers",
26 func() float64 { return float64(b.Alloc()) },
28 m.reg.MustRegister(prometheus.NewGaugeFunc(
31 Subsystem: "keepstore",
32 Name: "bufferpool_max_buffers",
33 Help: "Maximum number of buffers allowed",
35 func() float64 { return float64(b.Cap()) },
37 m.reg.MustRegister(prometheus.NewGaugeFunc(
40 Subsystem: "keepstore",
41 Name: "bufferpool_inuse_buffers",
42 Help: "Number of buffers in use",
44 func() float64 { return float64(b.Len()) },
48 func (m *nodeMetrics) setupWorkQueueMetrics(q *WorkQueue, qName string) {
49 m.reg.MustRegister(prometheus.NewGaugeFunc(
52 Subsystem: "keepstore",
53 Name: fmt.Sprintf("%s_queue_inprogress_entries", qName),
54 Help: fmt.Sprintf("Number of %s requests in progress", qName),
56 func() float64 { return float64(getWorkQueueStatus(q).InProgress) },
58 m.reg.MustRegister(prometheus.NewGaugeFunc(
61 Subsystem: "keepstore",
62 Name: fmt.Sprintf("%s_queue_pending_entries", qName),
63 Help: fmt.Sprintf("Number of queued %s requests", qName),
65 func() float64 { return float64(getWorkQueueStatus(q).Queued) },
69 func (m *nodeMetrics) setupRequestMetrics(rc httpserver.RequestCounter) {
70 m.reg.MustRegister(prometheus.NewGaugeFunc(
73 Subsystem: "keepstore",
74 Name: "concurrent_requests",
75 Help: "Number of requests in progress",
77 func() float64 { return float64(rc.Current()) },
79 m.reg.MustRegister(prometheus.NewGaugeFunc(
82 Subsystem: "keepstore",
83 Name: "max_concurrent_requests",
84 Help: "Maximum number of concurrent requests",
86 func() float64 { return float64(rc.Max()) },
90 type volumeMetricsVecs struct {
91 ioBytes *prometheus.CounterVec
92 errCounters *prometheus.CounterVec
93 opsCounters *prometheus.CounterVec
96 func newVolumeMetricsVecs(reg *prometheus.Registry) *volumeMetricsVecs {
97 m := &volumeMetricsVecs{}
98 m.opsCounters = prometheus.NewCounterVec(
99 prometheus.CounterOpts{
100 Namespace: "arvados",
101 Subsystem: "keepstore",
102 Name: "volume_operations",
103 Help: "Number of volume operations",
105 []string{"device_id", "operation"},
107 reg.MustRegister(m.opsCounters)
108 m.errCounters = prometheus.NewCounterVec(
109 prometheus.CounterOpts{
110 Namespace: "arvados",
111 Subsystem: "keepstore",
112 Name: "volume_errors",
113 Help: "Number of volume errors",
115 []string{"device_id", "error_type"},
117 reg.MustRegister(m.errCounters)
118 m.ioBytes = prometheus.NewCounterVec(
119 prometheus.CounterOpts{
120 Namespace: "arvados",
121 Subsystem: "keepstore",
122 Name: "volume_io_bytes",
123 Help: "Volume I/O traffic in bytes",
125 []string{"device_id", "direction"},
127 reg.MustRegister(m.ioBytes)
132 func (vm *volumeMetricsVecs) getCounterVecsFor(lbls prometheus.Labels) (opsCV, errCV, ioCV *prometheus.CounterVec) {
133 opsCV = vm.opsCounters.MustCurryWith(lbls)
134 errCV = vm.errCounters.MustCurryWith(lbls)
135 ioCV = vm.ioBytes.MustCurryWith(lbls)