@@ -19,8 +19,8 @@ package collector
19
19
20
20
import (
21
21
"errors"
22
+ "fmt"
22
23
"log/slog"
23
- "regexp"
24
24
25
25
"github.com/alecthomas/kingpin/v2"
26
26
"github.com/prometheus/client_golang/prometheus"
36
36
mountPointsExcludeSet bool
37
37
mountPointsExclude = kingpin .Flag (
38
38
"collector.filesystem.mount-points-exclude" ,
39
- "Regexp of mount points to exclude for filesystem collector." ,
39
+ "Regexp of mount points to exclude for filesystem collector. (mutually exclusive to mount-points-include) " ,
40
40
).Default (defMountPointsExcluded ).PreAction (func (c * kingpin.ParseContext ) error {
41
41
mountPointsExcludeSet = true
42
42
return nil
@@ -45,11 +45,15 @@ var (
45
45
"collector.filesystem.ignored-mount-points" ,
46
46
"Regexp of mount points to ignore for filesystem collector." ,
47
47
).Hidden ().String ()
48
+ mountPointsInclude = kingpin .Flag (
49
+ "collector.filesystem.mount-points-include" ,
50
+ "Regexp of mount points to include for filesystem collector. (mutually exclusive to mount-points-exclude)" ,
51
+ ).String ()
48
52
49
53
fsTypesExcludeSet bool
50
54
fsTypesExclude = kingpin .Flag (
51
55
"collector.filesystem.fs-types-exclude" ,
52
- "Regexp of filesystem types to exclude for filesystem collector." ,
56
+ "Regexp of filesystem types to exclude for filesystem collector. (mutually exclusive to fs-types-include) " ,
53
57
).Default (defFSTypesExcluded ).PreAction (func (c * kingpin.ParseContext ) error {
54
58
fsTypesExcludeSet = true
55
59
return nil
@@ -58,13 +62,17 @@ var (
58
62
"collector.filesystem.ignored-fs-types" ,
59
63
"Regexp of filesystem types to ignore for filesystem collector." ,
60
64
).Hidden ().String ()
65
+ fsTypesInclude = kingpin .Flag (
66
+ "collector.filesystem.fs-types-include" ,
67
+ "Regexp of filesystem types to exclude for filesystem collector. (mutually exclusive to fs-types-exclude)" ,
68
+ ).String ()
61
69
62
70
filesystemLabelNames = []string {"device" , "mountpoint" , "fstype" , "device_error" }
63
71
)
64
72
65
73
type filesystemCollector struct {
66
- excludedMountPointsPattern * regexp. Regexp
67
- excludedFSTypesPattern * regexp. Regexp
74
+ mountPointFilter deviceFilter
75
+ fsTypeFilter deviceFilter
68
76
sizeDesc , freeDesc , availDesc * prometheus.Desc
69
77
filesDesc , filesFreeDesc * prometheus.Desc
70
78
roDesc , deviceErrorDesc * prometheus.Desc
@@ -89,29 +97,7 @@ func init() {
89
97
90
98
// NewFilesystemCollector returns a new Collector exposing filesystems stats.
91
99
func NewFilesystemCollector (logger * slog.Logger ) (Collector , error ) {
92
- if * oldMountPointsExcluded != "" {
93
- if ! mountPointsExcludeSet {
94
- logger .Warn ("--collector.filesystem.ignored-mount-points is DEPRECATED and will be removed in 2.0.0, use --collector.filesystem.mount-points-exclude" )
95
- * mountPointsExclude = * oldMountPointsExcluded
96
- } else {
97
- return nil , errors .New ("--collector.filesystem.ignored-mount-points and --collector.filesystem.mount-points-exclude are mutually exclusive" )
98
- }
99
- }
100
-
101
- if * oldFSTypesExcluded != "" {
102
- if ! fsTypesExcludeSet {
103
- logger .Warn ("--collector.filesystem.ignored-fs-types is DEPRECATED and will be removed in 2.0.0, use --collector.filesystem.fs-types-exclude" )
104
- * fsTypesExclude = * oldFSTypesExcluded
105
- } else {
106
- return nil , errors .New ("--collector.filesystem.ignored-fs-types and --collector.filesystem.fs-types-exclude are mutually exclusive" )
107
- }
108
- }
109
-
110
- subsystem := "filesystem"
111
- logger .Info ("Parsed flag --collector.filesystem.mount-points-exclude" , "flag" , * mountPointsExclude )
112
- mountPointPattern := regexp .MustCompile (* mountPointsExclude )
113
- logger .Info ("Parsed flag --collector.filesystem.fs-types-exclude" , "flag" , * fsTypesExclude )
114
- filesystemsTypesPattern := regexp .MustCompile (* fsTypesExclude )
100
+ const subsystem = "filesystem"
115
101
116
102
sizeDesc := prometheus .NewDesc (
117
103
prometheus .BuildFQName (namespace , subsystem , "size_bytes" ),
@@ -162,18 +148,28 @@ func NewFilesystemCollector(logger *slog.Logger) (Collector, error) {
162
148
nil ,
163
149
)
164
150
151
+ mountPointFilter , err := newMountPointsFilter (logger )
152
+ if err != nil {
153
+ return nil , fmt .Errorf ("unable to parse mount points filter flags: %w" , err )
154
+ }
155
+
156
+ fsTypeFilter , err := newFSTypeFilter (logger )
157
+ if err != nil {
158
+ return nil , fmt .Errorf ("unable to parse fs types filter flags: %w" , err )
159
+ }
160
+
165
161
return & filesystemCollector {
166
- excludedMountPointsPattern : mountPointPattern ,
167
- excludedFSTypesPattern : filesystemsTypesPattern ,
168
- sizeDesc : sizeDesc ,
169
- freeDesc : freeDesc ,
170
- availDesc : availDesc ,
171
- filesDesc : filesDesc ,
172
- filesFreeDesc : filesFreeDesc ,
173
- roDesc : roDesc ,
174
- deviceErrorDesc : deviceErrorDesc ,
175
- mountInfoDesc : mountInfoDesc ,
176
- logger : logger ,
162
+ mountPointFilter : mountPointFilter ,
163
+ fsTypeFilter : fsTypeFilter ,
164
+ sizeDesc : sizeDesc ,
165
+ freeDesc : freeDesc ,
166
+ availDesc : availDesc ,
167
+ filesDesc : filesDesc ,
168
+ filesFreeDesc : filesFreeDesc ,
169
+ roDesc : roDesc ,
170
+ deviceErrorDesc : deviceErrorDesc ,
171
+ mountInfoDesc : mountInfoDesc ,
172
+ logger : logger ,
177
173
}, nil
178
174
}
179
175
@@ -230,3 +226,61 @@ func (c *filesystemCollector) Update(ch chan<- prometheus.Metric) error {
230
226
}
231
227
return nil
232
228
}
229
+
230
+ func newMountPointsFilter (logger * slog.Logger ) (deviceFilter , error ) {
231
+ if * oldMountPointsExcluded != "" {
232
+ if ! mountPointsExcludeSet {
233
+ logger .Warn ("--collector.filesystem.ignored-mount-points is DEPRECATED and will be removed in 2.0.0, use --collector.filesystem.mount-points-exclude" )
234
+ * mountPointsExclude = * oldMountPointsExcluded
235
+ } else {
236
+ return deviceFilter {}, errors .New ("--collector.filesystem.ignored-mount-points and --collector.filesystem.mount-points-exclude are mutually exclusive" )
237
+ }
238
+ }
239
+
240
+ if * mountPointsInclude != "" && ! mountPointsExcludeSet {
241
+ logger .Debug ("mount-points-exclude flag not set when mount-points-include flag is set, assuming include is desired" )
242
+ * mountPointsExclude = ""
243
+ }
244
+
245
+ if * mountPointsExclude != "" && * mountPointsInclude != "" {
246
+ return deviceFilter {}, errors .New ("--collector.filesystem.mount-points-exclude and --collector.filesystem.mount-points-include are mutually exclusive" )
247
+ }
248
+
249
+ if * mountPointsExclude != "" {
250
+ logger .Info ("Parsed flag --collector.filesystem.mount-points-exclude" , "flag" , * mountPointsExclude )
251
+ }
252
+ if * mountPointsInclude != "" {
253
+ logger .Info ("Parsed flag --collector.filesystem.mount-points-include" , "flag" , * mountPointsInclude )
254
+ }
255
+
256
+ return newDeviceFilter (* mountPointsExclude , * mountPointsInclude ), nil
257
+ }
258
+
259
+ func newFSTypeFilter (logger * slog.Logger ) (deviceFilter , error ) {
260
+ if * oldFSTypesExcluded != "" {
261
+ if ! fsTypesExcludeSet {
262
+ logger .Warn ("--collector.filesystem.ignored-fs-types is DEPRECATED and will be removed in 2.0.0, use --collector.filesystem.fs-types-exclude" )
263
+ * fsTypesExclude = * oldFSTypesExcluded
264
+ } else {
265
+ return deviceFilter {}, errors .New ("--collector.filesystem.ignored-fs-types and --collector.filesystem.fs-types-exclude are mutually exclusive" )
266
+ }
267
+ }
268
+
269
+ if * fsTypesInclude != "" && ! fsTypesExcludeSet {
270
+ logger .Debug ("fs-types-exclude flag not set when fs-types-include flag is set, assuming include is desired" )
271
+ * fsTypesExclude = ""
272
+ }
273
+
274
+ if * fsTypesExclude != "" && * fsTypesInclude != "" {
275
+ return deviceFilter {}, errors .New ("--collector.filesystem.fs-types-exclude and --collector.filesystem.fs-types-include are mutually exclusive" )
276
+ }
277
+
278
+ if * fsTypesExclude != "" {
279
+ logger .Info ("Parsed flag --collector.filesystem.fs-types-exclude" , "flag" , * fsTypesExclude )
280
+ }
281
+ if * fsTypesInclude != "" {
282
+ logger .Info ("Parsed flag --collector.filesystem.fs-types-include" , "flag" , * fsTypesInclude )
283
+ }
284
+
285
+ return newDeviceFilter (* fsTypesExclude , * fsTypesInclude ), nil
286
+ }
0 commit comments