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
16 rc httpserver.RequestCounter
19 func (m *nodeMetrics) setup() {
20 m.reg.MustRegister(prometheus.NewGaugeFunc(
23 Subsystem: "keepstore",
24 Name: "bufferpool_bytes_allocated",
25 Help: "Number of bytes allocated to buffers",
27 func() float64 { return float64(bufs.Alloc()) },
29 m.reg.MustRegister(prometheus.NewGaugeFunc(
32 Subsystem: "keepstore",
33 Name: "bufferpool_buffers_max",
34 Help: "Maximum number of buffers allowed",
36 func() float64 { return float64(bufs.Cap()) },
38 m.reg.MustRegister(prometheus.NewGaugeFunc(
41 Subsystem: "keepstore",
42 Name: "bufferpool_buffers_in_use",
43 Help: "Number of buffers in use",
45 func() float64 { return float64(bufs.Len()) },
47 m.reg.MustRegister(prometheus.NewGaugeFunc(
50 Subsystem: "keepstore",
51 Name: "pull_queue_in_progress",
52 Help: "Number of pull requests in progress",
54 func() float64 { return float64(getWorkQueueStatus(pullq).InProgress) },
56 m.reg.MustRegister(prometheus.NewGaugeFunc(
59 Subsystem: "keepstore",
60 Name: "pull_queue_queued",
61 Help: "Number of queued pull requests",
63 func() float64 { return float64(getWorkQueueStatus(pullq).Queued) },
65 m.reg.MustRegister(prometheus.NewGaugeFunc(
68 Subsystem: "keepstore",
69 Name: "trash_queue_in_progress",
70 Help: "Number of trash requests in progress",
72 func() float64 { return float64(getWorkQueueStatus(trashq).InProgress) },
74 m.reg.MustRegister(prometheus.NewGaugeFunc(
77 Subsystem: "keepstore",
78 Name: "trash_queue_queued",
79 Help: "Number of queued trash requests",
81 func() float64 { return float64(getWorkQueueStatus(trashq).Queued) },
83 m.reg.MustRegister(prometheus.NewGaugeFunc(
86 Subsystem: "keepstore",
87 Name: "requests_current",
88 Help: "Number of requests in progress",
90 func() float64 { return float64(m.rc.Current()) },
92 m.reg.MustRegister(prometheus.NewGaugeFunc(
95 Subsystem: "keepstore",
97 Help: "Maximum number of concurrent requests",
99 func() float64 { return float64(m.rc.Max()) },
101 // Register individual volume's metrics
102 vols := KeepVM.AllReadable()
103 for _, vol := range vols {
104 labels := prometheus.Labels{
105 "label": vol.String(),
106 "mount_point": vol.Status().MountPoint,
107 "device_number": fmt.Sprintf("%d", vol.Status().DeviceNum),
109 if vol, ok := vol.(InternalMetricser); ok {
110 // Per-driver internal metrics
111 vol.SetupInternalMetrics(m.reg, labels)
113 m.reg.Register(prometheus.NewGaugeFunc(
114 prometheus.GaugeOpts{
115 Namespace: "arvados",
116 Subsystem: "keepstore",
117 Name: "volume_bytes_free",
118 Help: "Number of free bytes on the volume",
121 func() float64 { return float64(vol.Status().BytesFree) },
123 m.reg.Register(prometheus.NewGaugeFunc(
124 prometheus.GaugeOpts{
125 Namespace: "arvados",
126 Subsystem: "keepstore",
127 Name: "volume_bytes_used",
128 Help: "Number of used bytes on the volume",
131 func() float64 { return float64(vol.Status().BytesUsed) },
133 m.reg.Register(prometheus.NewGaugeFunc(
134 prometheus.GaugeOpts{
135 Namespace: "arvados",
136 Subsystem: "keepstore",
137 Name: "volume_io_errors",
138 Help: "Number of I/O errors",
141 func() float64 { return float64(KeepVM.VolumeStats(vol).Errors) },
143 m.reg.Register(prometheus.NewGaugeFunc(
144 prometheus.GaugeOpts{
145 Namespace: "arvados",
146 Subsystem: "keepstore",
147 Name: "volume_io_ops",
148 Help: "Number of I/O operations",
151 func() float64 { return float64(KeepVM.VolumeStats(vol).Ops) },
153 m.reg.Register(prometheus.NewGaugeFunc(
154 prometheus.GaugeOpts{
155 Namespace: "arvados",
156 Subsystem: "keepstore",
157 Name: "volume_io_compare_ops",
158 Help: "Number of I/O compare operations",
161 func() float64 { return float64(KeepVM.VolumeStats(vol).CompareOps) },
163 m.reg.Register(prometheus.NewGaugeFunc(
164 prometheus.GaugeOpts{
165 Namespace: "arvados",
166 Subsystem: "keepstore",
167 Name: "volume_io_get_ops",
168 Help: "Number of I/O get operations",
171 func() float64 { return float64(KeepVM.VolumeStats(vol).GetOps) },
173 m.reg.Register(prometheus.NewGaugeFunc(
174 prometheus.GaugeOpts{
175 Namespace: "arvados",
176 Subsystem: "keepstore",
177 Name: "volume_io_put_ops",
178 Help: "Number of I/O put operations",
181 func() float64 { return float64(KeepVM.VolumeStats(vol).PutOps) },
183 m.reg.Register(prometheus.NewGaugeFunc(
184 prometheus.GaugeOpts{
185 Namespace: "arvados",
186 Subsystem: "keepstore",
187 Name: "volume_io_touch_ops",
188 Help: "Number of I/O touch operations",
191 func() float64 { return float64(KeepVM.VolumeStats(vol).TouchOps) },
193 m.reg.Register(prometheus.NewGaugeFunc(
194 prometheus.GaugeOpts{
195 Namespace: "arvados",
196 Subsystem: "keepstore",
197 Name: "volume_io_input_bytes",
198 Help: "Number of input bytes",
201 func() float64 { return float64(KeepVM.VolumeStats(vol).InBytes) },
203 m.reg.Register(prometheus.NewGaugeFunc(
204 prometheus.GaugeOpts{
205 Namespace: "arvados",
206 Subsystem: "keepstore",
207 Name: "volume_io_output_bytes",
208 Help: "Number of output bytes",
211 func() float64 { return float64(KeepVM.VolumeStats(vol).OutBytes) },