@@ -19,8 +19,8 @@ package collector
1919
2020import (
2121 "errors"
22+ "fmt"
2223 "log/slog"
23- "regexp"
2424
2525 "github.com/alecthomas/kingpin/v2"
2626 "github.com/prometheus/client_golang/prometheus"
3636 mountPointsExcludeSet bool
3737 mountPointsExclude = kingpin .Flag (
3838 "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) " ,
4040 ).Default (defMountPointsExcluded ).PreAction (func (c * kingpin.ParseContext ) error {
4141 mountPointsExcludeSet = true
4242 return nil
@@ -45,11 +45,15 @@ var (
4545 "collector.filesystem.ignored-mount-points" ,
4646 "Regexp of mount points to ignore for filesystem collector." ,
4747 ).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 ()
4852
4953 fsTypesExcludeSet bool
5054 fsTypesExclude = kingpin .Flag (
5155 "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) " ,
5357 ).Default (defFSTypesExcluded ).PreAction (func (c * kingpin.ParseContext ) error {
5458 fsTypesExcludeSet = true
5559 return nil
@@ -58,13 +62,17 @@ var (
5862 "collector.filesystem.ignored-fs-types" ,
5963 "Regexp of filesystem types to ignore for filesystem collector." ,
6064 ).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 ()
6169
6270 filesystemLabelNames = []string {"device" , "mountpoint" , "fstype" , "device_error" }
6371)
6472
6573type filesystemCollector struct {
66- excludedMountPointsPattern * regexp. Regexp
67- excludedFSTypesPattern * regexp. Regexp
74+ mountPointFilter deviceFilter
75+ fsTypeFilter deviceFilter
6876 sizeDesc , freeDesc , availDesc * prometheus.Desc
6977 filesDesc , filesFreeDesc * prometheus.Desc
7078 roDesc , deviceErrorDesc * prometheus.Desc
@@ -89,29 +97,7 @@ func init() {
8997
9098// NewFilesystemCollector returns a new Collector exposing filesystems stats.
9199func 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"
115101
116102 sizeDesc := prometheus .NewDesc (
117103 prometheus .BuildFQName (namespace , subsystem , "size_bytes" ),
@@ -162,18 +148,28 @@ func NewFilesystemCollector(logger *slog.Logger) (Collector, error) {
162148 nil ,
163149 )
164150
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+
165161 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 ,
177173 }, nil
178174}
179175
@@ -230,3 +226,61 @@ func (c *filesystemCollector) Update(ch chan<- prometheus.Metric) error {
230226 }
231227 return nil
232228}
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