Skip to content

Commit 02f5005

Browse files
committed
Add diskstat include/exclude flag to all platforms
Refactor diskstats collector include/exclude to work on all platforms. * Fix up default ignored devices. Signed-off-by: Ben Kochie <[email protected]>
1 parent 8fcc632 commit 02f5005

File tree

5 files changed

+90
-33
lines changed

5 files changed

+90
-33
lines changed

collector/diskstats_common.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,12 @@
1818
package collector
1919

2020
import (
21+
"errors"
22+
23+
"github.com/go-kit/log"
24+
"github.com/go-kit/log/level"
2125
"github.com/prometheus/client_golang/prometheus"
26+
"gopkg.in/alecthomas/kingpin.v2"
2227
)
2328

2429
const (
@@ -28,6 +33,10 @@ const (
2833
var (
2934
diskLabelNames = []string{"device"}
3035

36+
diskstatsDeviceExclude = kingpin.Flag("collector.diskstats.device-exclude", "Regexp of diskstats devices to exclude (mutually exclusive to device-include).").Default(diskstatsDefaultIgnoredDevices).String()
37+
oldDiskstatsDeviceExclude = kingpin.Flag("collector.diskstats.ignored-devices", "DEPRECATED: Use collector.diskstats.device-exclude").String()
38+
diskstatsDeviceInclude = kingpin.Flag("collector.diskstats.device-include", "Regexp of diskstats devices to include (mutually exclusive to device-exclude).").String()
39+
3140
readsCompletedDesc = prometheus.NewDesc(
3241
prometheus.BuildFQName(namespace, diskSubsystem, "reads_completed_total"),
3342
"The total number of reads completed successfully.",
@@ -72,3 +81,28 @@ var (
7281
nil,
7382
)
7483
)
84+
85+
func newDiskstatsDeviceFilter(logger log.Logger) (deviceFilter, error) {
86+
if *oldDiskstatsDeviceExclude != "" {
87+
if *diskstatsDeviceExclude == "" {
88+
level.Warn(logger).Log("msg", "--collector.diskstats.ignored-devices is DEPRECATED and will be removed in 2.0.0, use --collector.diskstats.device-exclude")
89+
*diskstatsDeviceExclude = *oldDiskstatsDeviceExclude
90+
} else {
91+
return deviceFilter{}, errors.New("--collector.diskstats.ignored-devices and --collector.diskstats.device-exclude are mutually exclusive")
92+
}
93+
}
94+
95+
if *diskstatsDeviceExclude != "" && *diskstatsDeviceInclude != "" {
96+
return deviceFilter{}, errors.New("device-exclude & device-include are mutually exclusive")
97+
}
98+
99+
if *diskstatsDeviceExclude != "" {
100+
level.Info(logger).Log("msg", "Parsed flag --collector.diskstats.device-exclude", "flag", *diskstatsDeviceExclude)
101+
}
102+
103+
if *diskstatsDeviceInclude != "" {
104+
level.Info(logger).Log("msg", "Parsed Flag --collector.diskstats.device-include", "flag", *diskstatsDeviceInclude)
105+
}
106+
107+
return newDeviceFilter(*diskstatsDeviceExclude, *diskstatsDeviceInclude), nil
108+
}

collector/diskstats_darwin.go

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,18 @@ import (
2424
"github.com/prometheus/client_golang/prometheus"
2525
)
2626

27+
const diskstatsDefaultIgnoredDevices = ""
28+
2729
type typedDescFunc struct {
2830
typedDesc
2931
value func(stat *iostat.DriveStats) float64
3032
}
3133

3234
type diskstatsCollector struct {
33-
descs []typedDescFunc
34-
logger log.Logger
35+
descs []typedDescFunc
36+
37+
deviceFilter deviceFilter
38+
logger log.Logger
3539
}
3640

3741
func init() {
@@ -42,6 +46,11 @@ func init() {
4246
func NewDiskstatsCollector(logger log.Logger) (Collector, error) {
4347
var diskLabelNames = []string{"device"}
4448

49+
deviceFilter, err := newDiskstatsDeviceFilter(logger)
50+
if err != nil {
51+
return nil, fmt.Errorf("failed to parse device filter flags: %w", err)
52+
}
53+
4554
return &diskstatsCollector{
4655
descs: []typedDescFunc{
4756
{
@@ -183,7 +192,9 @@ func NewDiskstatsCollector(logger log.Logger) (Collector, error) {
183192
},
184193
},
185194
},
186-
logger: logger,
195+
196+
deviceFilter: deviceFilter,
197+
logger: logger,
187198
}, nil
188199
}
189200

@@ -194,6 +205,9 @@ func (c *diskstatsCollector) Update(ch chan<- prometheus.Metric) error {
194205
}
195206

196207
for _, stats := range diskStats {
208+
if c.deviceFilter.ignored(stats.Name) {
209+
continue
210+
}
197211
for _, desc := range c.descs {
198212
v := desc.value(stats)
199213
ch <- desc.mustNewConstMetric(v, stats.Name)

collector/diskstats_linux.go

Lines changed: 5 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,10 @@
1717
package collector
1818

1919
import (
20-
"errors"
2120
"fmt"
2221
"github.com/go-kit/log"
23-
"github.com/go-kit/log/level"
2422
"github.com/prometheus/client_golang/prometheus"
2523
"github.com/prometheus/procfs/blockdevice"
26-
"gopkg.in/alecthomas/kingpin.v2"
2724
)
2825

2926
const (
@@ -32,12 +29,8 @@ const (
3229
// Read sectors and write sectors are the "standard UNIX 512-byte sectors, not any device- or filesystem-specific block size."
3330
// See also https://www.kernel.org/doc/Documentation/block/stat.txt
3431
unixSectorSize = 512.0
35-
)
3632

37-
var (
38-
diskstatsDeviceExclude = kingpin.Flag("collector.diskstats.device-exclude", "Regexp of diskstats devices to exclude (mutually exclusive to device-include).").String()
39-
oldDiskstatsDeviceExclude = kingpin.Flag("collector.diskstats.ignored-devices", "DEPRECATED: Use collector.diskstats.device-exclude").String()
40-
diskstatsDeviceInclude = kingpin.Flag("collector.diskstats.device-include", "Regexp of diskstats devices to include (mutually exclusive to device-exclude).").String()
33+
diskstatsDefaultIgnoredDevices = "^(ram|loop|fd|(h|s|v|xv)d[a-z]|nvme\\d+n\\d+p)\\d+$"
4134
)
4235

4336
type typedFactorDesc struct {
@@ -69,28 +62,14 @@ func NewDiskstatsCollector(logger log.Logger) (Collector, error) {
6962
if err != nil {
7063
return nil, fmt.Errorf("failed to open sysfs: %w", err)
7164
}
72-
if *oldDiskstatsDeviceExclude != "" {
73-
if *diskstatsDeviceExclude == "" {
74-
level.Warn(logger).Log("msg", "--collector.diskstats.ignored-devices is DEPRECATED and will be removed in 2.0.0, use --collector.diskstats.device-exclude")
75-
*diskstatsDeviceExclude = *oldDiskstatsDeviceExclude
76-
} else {
77-
return nil, errors.New("--collector.diskstats.ignored-devices and --collector.diskstats.device-exclude are mutually exclusive")
78-
}
79-
}
8065

81-
if *diskstatsDeviceExclude != "" && *diskstatsDeviceInclude != "" {
82-
return nil, errors.New("device-exclude & device-include are mutually exclusive")
83-
}
84-
85-
if *diskstatsDeviceExclude != "" {
86-
level.Info(logger).Log("msg", "Parsed flag --collector.diskstats.device-exclude", "flag", *diskstatsDeviceExclude)
66+
deviceFilter, err := newDiskstatsDeviceFilter(logger)
67+
if err != nil {
68+
return nil, fmt.Errorf("failed to parse device filter flags: %w", err)
8769
}
8870

89-
if *diskstatsDeviceInclude != "" {
90-
level.Info(logger).Log("msg", "Parsed Flag --collector.diskstats.device-include", "flag", *diskstatsDeviceInclude)
91-
}
9271
return &diskstatsCollector{
93-
deviceFilter: newDeviceFilter(*diskstatsDeviceExclude, *diskstatsDeviceInclude),
72+
deviceFilter: deviceFilter,
9473
fs: fs,
9574
infoDesc: typedFactorDesc{
9675
desc: prometheus.NewDesc(prometheus.BuildFQName(namespace, diskSubsystem, "info"),

collector/diskstats_openbsd.go

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package collector
1818

1919
import (
20+
"fmt"
2021
"unsafe"
2122

2223
"github.com/go-kit/log"
@@ -30,13 +31,17 @@ import (
3031
*/
3132
import "C"
3233

34+
const diskstatsDefaultIgnoredDevices = ""
35+
3336
type diskstatsCollector struct {
3437
rxfer typedDesc
3538
rbytes typedDesc
3639
wxfer typedDesc
3740
wbytes typedDesc
3841
time typedDesc
39-
logger log.Logger
42+
43+
deviceFilter deviceFilter
44+
logger log.Logger
4045
}
4146

4247
func init() {
@@ -45,13 +50,20 @@ func init() {
4550

4651
// NewDiskstatsCollector returns a new Collector exposing disk device stats.
4752
func NewDiskstatsCollector(logger log.Logger) (Collector, error) {
53+
deviceFilter, err := newDiskstatsDeviceFilter(logger)
54+
if err != nil {
55+
return nil, fmt.Errorf("failed to parse device filter flags: %w", err)
56+
}
57+
4858
return &diskstatsCollector{
4959
rxfer: typedDesc{readsCompletedDesc, prometheus.CounterValue},
5060
rbytes: typedDesc{readBytesDesc, prometheus.CounterValue},
5161
wxfer: typedDesc{writesCompletedDesc, prometheus.CounterValue},
5262
wbytes: typedDesc{writtenBytesDesc, prometheus.CounterValue},
5363
time: typedDesc{ioTimeSecondsDesc, prometheus.CounterValue},
54-
logger: logger,
64+
65+
deviceFilter: deviceFilter,
66+
logger: logger,
5567
}, nil
5668
}
5769

@@ -66,6 +78,9 @@ func (c *diskstatsCollector) Update(ch chan<- prometheus.Metric) (err error) {
6678

6779
for i := 0; i < ndisks; i++ {
6880
diskname := C.GoString(&diskstats[i].ds_name[0])
81+
if c.deviceFilter.ignored(diskname) {
82+
continue
83+
}
6984

7085
ch <- c.rxfer.mustNewConstMetric(float64(diskstats[i].ds_rxfer), diskname)
7186
ch <- c.rbytes.mustNewConstMetric(float64(diskstats[i].ds_rbytes), diskname)

collector/diskstats_openbsd_amd64.go

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package collector
1818

1919
import (
20+
"fmt"
2021
"unsafe"
2122

2223
"github.com/go-kit/log"
@@ -26,6 +27,8 @@ import (
2627

2728
const (
2829
DS_DISKNAMELEN = 16
30+
31+
diskstatsDefaultIgnoredDevices = ""
2932
)
3033

3134
type DiskStats struct {
@@ -47,7 +50,9 @@ type diskstatsCollector struct {
4750
wxfer typedDesc
4851
wbytes typedDesc
4952
time typedDesc
50-
logger log.Logger
53+
54+
deviceFilter deviceFilter
55+
logger log.Logger
5156
}
5257

5358
func init() {
@@ -56,13 +61,20 @@ func init() {
5661

5762
// NewDiskstatsCollector returns a new Collector exposing disk device stats.
5863
func NewDiskstatsCollector(logger log.Logger) (Collector, error) {
64+
deviceFilter, err := newDiskstatsDeviceFilter(logger)
65+
if err != nil {
66+
return nil, fmt.Errorf("failed to parse device filter flags: %w", err)
67+
}
68+
5969
return &diskstatsCollector{
6070
rxfer: typedDesc{readsCompletedDesc, prometheus.CounterValue},
6171
rbytes: typedDesc{readBytesDesc, prometheus.CounterValue},
6272
wxfer: typedDesc{writesCompletedDesc, prometheus.CounterValue},
6373
wbytes: typedDesc{writtenBytesDesc, prometheus.CounterValue},
6474
time: typedDesc{ioTimeSecondsDesc, prometheus.CounterValue},
65-
logger: logger,
75+
76+
deviceFilter: deviceFilter,
77+
logger: logger,
6678
}, nil
6779
}
6880

@@ -78,6 +90,9 @@ func (c *diskstatsCollector) Update(ch chan<- prometheus.Metric) (err error) {
7890
for i := 0; i < ndisks; i++ {
7991
dn := *(*[DS_DISKNAMELEN]int8)(unsafe.Pointer(&diskstats[i].Name[0]))
8092
diskname := int8ToString(dn[:])
93+
if c.deviceFilter.ignored(diskname) {
94+
continue
95+
}
8196

8297
ch <- c.rxfer.mustNewConstMetric(float64(diskstats[i].Rxfer), diskname)
8398
ch <- c.rbytes.mustNewConstMetric(float64(diskstats[i].Rbytes), diskname)

0 commit comments

Comments
 (0)