new flag to disable all default collectors (#1460)

* new flag to disable all default collectors

Signed-off-by: Paul Gier <pgier@redhat.com>

Co-authored-by: Ben Kochie <superq@gmail.com>
This commit is contained in:
Paul Gier 2020-02-20 04:03:33 -06:00 committed by GitHub
parent 3e1b0f1bee
commit b40954dce5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 36 additions and 5 deletions

View file

@ -18,6 +18,7 @@
* [CHANGE] Refactor mdadm collector #1403 * [CHANGE] Refactor mdadm collector #1403
* [CHANGE] Add `mountaddr` label to NFS metrics. #1417 * [CHANGE] Add `mountaddr` label to NFS metrics. #1417
* [CHANGE] Don't count empty collectors as success. #... * [CHANGE] Don't count empty collectors as success. #...
* [FEATURE] New flag to disable default collectors #1276
* [FEATURE] Add new schedstat collector #1389 * [FEATURE] Add new schedstat collector #1389
* [FEATURE] Add uname support for Darwin and OpenBSD #1433 * [FEATURE] Add uname support for Darwin and OpenBSD #1433
* [FEATURE] Add new metric node_cpu_info #1489 * [FEATURE] Add new metric node_cpu_info #1489

View file

@ -23,7 +23,7 @@ import (
"github.com/go-kit/kit/log" "github.com/go-kit/kit/log"
"github.com/go-kit/kit/log/level" "github.com/go-kit/kit/log/level"
"github.com/prometheus/client_golang/prometheus" "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. // Namespace defines the common namespace to be used by all metrics.
@ -52,6 +52,7 @@ const (
var ( var (
factories = make(map[string]func(logger log.Logger) (Collector, error)) factories = make(map[string]func(logger log.Logger) (Collector, error))
collectorState = make(map[string]*bool) 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)) { 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) flagHelp := fmt.Sprintf("Enable the %s collector (default: %s).", collector, helpDefaultState)
defaultValue := fmt.Sprintf("%v", isDefaultEnabled) 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 collectorState[collector] = flag
factories[collector] = factory factories[collector] = factory
@ -78,6 +79,28 @@ type NodeCollector struct {
logger log.Logger 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. // NewNodeCollector creates a new NodeCollector.
func NewNodeCollector(logger log.Logger, filters ...string) (*NodeCollector, error) { func NewNodeCollector(logger log.Logger, filters ...string) (*NodeCollector, error) {
f := make(map[string]bool) f := make(map[string]bool)

View file

@ -29,7 +29,7 @@ import (
"github.com/prometheus/common/version" "github.com/prometheus/common/version"
"github.com/prometheus/node_exporter/collector" "github.com/prometheus/node_exporter/collector"
"github.com/prometheus/node_exporter/https" "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, // handler wraps an unfiltered http.Handler but uses a filtered handler,
@ -153,6 +153,10 @@ func main() {
"web.max-requests", "web.max-requests",
"Maximum number of parallel scrape requests. Use 0 to disable.", "Maximum number of parallel scrape requests. Use 0 to disable.",
).Default("40").Int() ).Default("40").Int()
disableDefaultCollectors = kingpin.Flag(
"collector.disable-defaults",
"Set all collectors to disabled by default.",
).Default("false").Bool()
configFile = kingpin.Flag( configFile = kingpin.Flag(
"web.config", "web.config",
"Path to config yaml file that can enable TLS or authentication.", "Path to config yaml file that can enable TLS or authentication.",
@ -166,6 +170,9 @@ func main() {
kingpin.Parse() kingpin.Parse()
logger := promlog.New(promlogConfig) logger := promlog.New(promlogConfig)
if *disableDefaultCollectors {
collector.DisableDefaultCollectors()
}
level.Info(logger).Log("msg", "Starting node_exporter", "version", version.Info()) level.Info(logger).Log("msg", "Starting node_exporter", "version", version.Info())
level.Info(logger).Log("msg", "Build context", "build_context", version.BuildContext()) level.Info(logger).Log("msg", "Build context", "build_context", version.BuildContext())