diff --git a/CHANGELOG.md b/CHANGELOG.md index a109af1c..f017b571 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ * [CHANGE] Refactor mdadm collector #1403 * [CHANGE] Add `mountaddr` label to NFS metrics. #1417 * [CHANGE] Don't count empty collectors as success. #... +* [FEATURE] New flag to disable default collectors #1276 * [FEATURE] Add new schedstat collector #1389 * [FEATURE] Add uname support for Darwin and OpenBSD #1433 * [FEATURE] Add new metric node_cpu_info #1489 diff --git a/collector/collector.go b/collector/collector.go index 0fec09c9..e9ea14c0 100644 --- a/collector/collector.go +++ b/collector/collector.go @@ -23,7 +23,7 @@ import ( "github.com/go-kit/kit/log" "github.com/go-kit/kit/log/level" "github.com/prometheus/client_golang/prometheus" - "gopkg.in/alecthomas/kingpin.v2" + kingpin "gopkg.in/alecthomas/kingpin.v2" ) // Namespace defines the common namespace to be used by all metrics. @@ -50,8 +50,9 @@ const ( ) var ( - factories = make(map[string]func(logger log.Logger) (Collector, error)) - collectorState = make(map[string]*bool) + factories = make(map[string]func(logger log.Logger) (Collector, error)) + collectorState = make(map[string]*bool) + forcedCollectors = map[string]bool{} // collectors which have been explicitly enabled or disabled ) func registerCollector(collector string, isDefaultEnabled bool, factory func(logger log.Logger) (Collector, error)) { @@ -66,7 +67,7 @@ func registerCollector(collector string, isDefaultEnabled bool, factory func(log flagHelp := fmt.Sprintf("Enable the %s collector (default: %s).", collector, helpDefaultState) defaultValue := fmt.Sprintf("%v", isDefaultEnabled) - flag := kingpin.Flag(flagName, flagHelp).Default(defaultValue).Bool() + flag := kingpin.Flag(flagName, flagHelp).Default(defaultValue).Action(collectorFlagAction(collector)).Bool() collectorState[collector] = flag factories[collector] = factory @@ -78,6 +79,28 @@ type NodeCollector struct { logger log.Logger } +// DisableDefaultCollectors sets the collector state to false for all collectors which +// have not been explicitly enabled on the command line. +func DisableDefaultCollectors() { + for c := range collectorState { + if _, ok := forcedCollectors[c]; !ok { + *collectorState[c] = false + } + } +} + +// collectorFlagAction generates a new action function for the given collector +// to track whether it has been explicitly enabled or disabled from the command line. +// A new action function is needed for each collector flag because the ParseContext +// does not contain information about which flag called the action. +// See: https://github.com/alecthomas/kingpin/issues/294 +func collectorFlagAction(collector string) func(ctx *kingpin.ParseContext) error { + return func(ctx *kingpin.ParseContext) error { + forcedCollectors[collector] = true + return nil + } +} + // NewNodeCollector creates a new NodeCollector. func NewNodeCollector(logger log.Logger, filters ...string) (*NodeCollector, error) { f := make(map[string]bool) diff --git a/node_exporter.go b/node_exporter.go index 6e92cc39..88039bd6 100644 --- a/node_exporter.go +++ b/node_exporter.go @@ -29,7 +29,7 @@ import ( "github.com/prometheus/common/version" "github.com/prometheus/node_exporter/collector" "github.com/prometheus/node_exporter/https" - "gopkg.in/alecthomas/kingpin.v2" + kingpin "gopkg.in/alecthomas/kingpin.v2" ) // handler wraps an unfiltered http.Handler but uses a filtered handler, @@ -153,6 +153,10 @@ func main() { "web.max-requests", "Maximum number of parallel scrape requests. Use 0 to disable.", ).Default("40").Int() + disableDefaultCollectors = kingpin.Flag( + "collector.disable-defaults", + "Set all collectors to disabled by default.", + ).Default("false").Bool() configFile = kingpin.Flag( "web.config", "Path to config yaml file that can enable TLS or authentication.", @@ -166,6 +170,9 @@ func main() { kingpin.Parse() logger := promlog.New(promlogConfig) + if *disableDefaultCollectors { + collector.DisableDefaultCollectors() + } level.Info(logger).Log("msg", "Starting node_exporter", "version", version.Info()) level.Info(logger).Log("msg", "Build context", "build_context", version.BuildContext())