diff --git a/VERSION b/VERSION index ece61c6..f9cbc01 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0.6 \ No newline at end of file +1.0.7 \ No newline at end of file diff --git a/cmd/ovn_exporter/main.go b/cmd/ovn_exporter/main.go index 2d2dbfb..9fbd169 100644 --- a/cmd/ovn_exporter/main.go +++ b/cmd/ovn_exporter/main.go @@ -13,6 +13,13 @@ import ( ) func main() { + var collectOvsdbServerMetrics bool + var collectVswitchMetrics bool + var collectPidMetrics bool + var collectLogMetrics bool + var collectNorthboundMetrics bool + var collectSouthboundMetrics bool + var collectNorthdMetrics bool var listenAddress string var metricsPath string var pollTimeout int @@ -49,15 +56,20 @@ func main() { var serviceNorthdFileLogPath string var serviceNorthdFilePidPath string + flag.BoolVar(&collectOvsdbServerMetrics, "collect.ovsdb.server.metrics", true, "Collect metrics from ovsdb-server.") + flag.BoolVar(&collectVswitchMetrics, "collect.vswitch.metrics", true, "Collect metrics from Open vSwitch.") + flag.BoolVar(&collectPidMetrics, "collect.pid.metrics", true, "Collect metrics from process IDs.") + flag.BoolVar(&collectLogMetrics, "collect.log.metrics", true, "Collect metrics from log files.") + flag.BoolVar(&collectNorthboundMetrics, "collect.northbound.metrics", true, "Collect metrics from OVN Northbound DB.") + flag.BoolVar(&collectSouthboundMetrics, "collect.southbound.metrics", true, "Collect metrics from OVN Southbound DB.") + flag.BoolVar(&collectNorthdMetrics, "collect.northd.metrics", true, "Collect metrics from ovn-northd.") flag.StringVar(&listenAddress, "web.listen-address", ":9476", "Address to listen on for web interface and telemetry.") flag.StringVar(&metricsPath, "web.telemetry-path", "/metrics", "Path under which to expose metrics.") flag.IntVar(&pollTimeout, "ovn.timeout", 2, "Timeout on gRPC requests to OVN.") flag.IntVar(&pollInterval, "ovn.poll-interval", 15, "The minimum interval (in seconds) between collections from OVN server.") flag.BoolVar(&isShowVersion, "version", false, "version information") flag.StringVar(&logLevel, "log.level", "info", "logging severity level") - flag.StringVar(&systemRunDir, "system.run.dir", "/var/run/openvswitch", "OVS default run directory.") - flag.StringVar(&databaseVswitchName, "database.vswitch.name", "Open_vSwitch", "The name of OVS db.") flag.StringVar(&databaseVswitchSocketRemote, "database.vswitch.socket.remote", "unix:/var/run/openvswitch/db.sock", "JSON-RPC unix socket to OVS db.") flag.StringVar(&databaseVswitchFileDataPath, "database.vswitch.file.data.path", "/etc/openvswitch/conf.db", "OVS db file.") @@ -126,6 +138,14 @@ func main() { opts := ovn.Options{ Timeout: pollTimeout, Logger: logger, + EnabledFeatures: map[string]bool{ + "collectOvsdbServerMetrics": collectOvsdbServerMetrics, + "collectVswitchMetrics": collectVswitchMetrics, + "collectPidMetrics": collectPidMetrics, + "collectLogMetrics": collectLogMetrics, + "collectNorthboundMetrics": collectNorthboundMetrics, + "collectSouthboundMetrics": collectSouthboundMetrics, + }, } exporter, err := ovn.NewExporter(opts) @@ -136,7 +156,7 @@ func main() { ) os.Exit(1) } - + // TODO: check if SystemRunDir is disabled before setting it exporter.Client.System.RunDir = systemRunDir exporter.Client.Database.Vswitch.Name = databaseVswitchName diff --git a/pkg/ovn_exporter/ovn_exporter.go b/pkg/ovn_exporter/ovn_exporter.go index ed7d005..05912ab 100644 --- a/pkg/ovn_exporter/ovn_exporter.go +++ b/pkg/ovn_exporter/ovn_exporter.go @@ -46,7 +46,7 @@ func init() { app = versioned.NewPackageManager("ovn-exporter") app.Description = "Prometheus Exporter for Open Virtual Network (OVN)" app.Documentation = "https://github.com/greenpau/ovn_exporter/" - app.SetVersion(appVersion, "1.0.6") + app.SetVersion(appVersion, "1.0.7") app.SetGitBranch(gitBranch, "") app.SetGitCommit(gitCommit, "") app.SetBuildUser(buildUser, "") @@ -287,11 +287,13 @@ type Exporter struct { nextCollectionTicker int64 metrics []prometheus.Metric logger log.Logger + EnabledFeatures map[string]bool } type Options struct { - Timeout int - Logger log.Logger + Timeout int + Logger log.Logger + EnabledFeatures map[string]bool } // NewLogger returns an instance of logger. @@ -315,8 +317,9 @@ func NewExporter(opts Options) (*Exporter, error) { version.BuildUser = buildUser version.BuildDate = buildDate e := Exporter{ - timeout: opts.Timeout, - logger: opts.Logger, + timeout: opts.Timeout, + logger: opts.Logger, + EnabledFeatures: opts.EnabledFeatures, } client := ovsdb.NewOvnClient() client.Timeout = opts.Timeout @@ -498,122 +501,142 @@ func (e *Exporter) GatherMetrics() { ) } - components := []string{ - "ovsdb-server", - "ovsdb-server-southbound", - "ovsdb-server-southbound-monitoring", - "ovsdb-server-northbound", - "ovsdb-server-northbound-monitoring", - "ovn-northd", - "ovn-northd-monitoring", - "ovs-vswitchd", + components := []string{} + + features := map[string]string{ + "collectOvsdbServerMetrics": "ovsdb-server", + // currently unused, as GetLogicalSwitches() requires both north- and southbound DBs + "collectSouthboundMetrics": "ovsdb-server-southbound ovsdb-server-southbound-monitoring", + "collectNorthboundMetrics": "ovsdb-server-northbound ovsdb-server-northbound-monitoring", + "collectNorthdMetrics": "ovn-northd ovn-northd-monitoring", + "collectVswitchMetrics": "ovs-vswitchd", } + + for feature, component := range features { + if e.EnabledFeatures[feature] { + components = append(components, component) + } + } + for _, component := range components { - p, err := e.Client.GetProcessInfo(component) - level.Debug(e.logger).Log( - "msg", "GatherMetrics() calls GetProcessInfo()", - "component", component, - "system_id", e.Client.System.ID, - ) - if err != nil { - level.Error(e.logger).Log( - "msg", "GetProcessInfo() failed", + if e.EnabledFeatures["collectPidMetrics"] { + p, err := e.Client.GetProcessInfo(component) + level.Debug(e.logger).Log( + "msg", "GatherMetrics() calls GetProcessInfo()", + "component", component, + "system_id", e.Client.System.ID, + ) + if err != nil { + level.Error(e.logger).Log( + "msg", "GetProcessInfo() failed", + "component", component, + "system_id", e.Client.System.ID, + "error", err.Error(), + ) + e.IncrementErrorCounter() + upValue = 0 + } + e.metrics = append(e.metrics, prometheus.MustNewConstMetric( + pid, + prometheus.GaugeValue, + float64(p.ID), + e.Client.System.ID, + component, + p.User, + p.Group, + )) + level.Debug(e.logger).Log( + "msg", "GatherMetrics() completed GetProcessInfo()", "component", component, "system_id", e.Client.System.ID, - "error", err.Error(), ) - e.IncrementErrorCounter() - upValue = 0 } - e.metrics = append(e.metrics, prometheus.MustNewConstMetric( - pid, - prometheus.GaugeValue, - float64(p.ID), - e.Client.System.ID, - component, - p.User, - p.Group, - )) - level.Debug(e.logger).Log( - "msg", "GatherMetrics() completed GetProcessInfo()", - "component", component, - "system_id", e.Client.System.ID, - ) } components = []string{ "ovsdb-server", - "ovsdb-server-southbound", - "ovsdb-server-northbound", - "ovn-northd", - "ovs-vswitchd", } - for _, component := range components { - level.Debug(e.logger).Log( - "msg", "GatherMetrics() calls GetLogFileInfo()", - "component", component, - "system_id", e.Client.System.ID, - ) - file, err := e.Client.GetLogFileInfo(component) - if err != nil { - level.Error(e.logger).Log( - "msg", "GetLogFileInfo() failed", + + features = map[string]string{ + "collectSouthboundMetrics": "ovsdb-server-southbound", + "collectNorthboundMetrics": "ovsdb-server-northbound", + "collectNorthdMetrics": "ovn-northd", + "collectVswitchMetrics": "ovs-vswitchd", + } + + for feature, component := range features { + if e.EnabledFeatures[feature] { + components = append(components, component) + } + } + + if e.EnabledFeatures["collectLogMetrics"] { + for _, component := range components { + level.Debug(e.logger).Log( + "msg", "GatherMetrics() calls GetLogFileInfo()", "component", component, "system_id", e.Client.System.ID, - "error", err.Error(), ) - e.IncrementErrorCounter() - continue - } - level.Debug(e.logger).Log( - "msg", "GatherMetrics() completed GetLogFileInfo()", - "component", component, - "system_id", e.Client.System.ID, - ) - e.metrics = append(e.metrics, prometheus.MustNewConstMetric( - logFileSize, - prometheus.GaugeValue, - float64(file.Info.Size()), - e.Client.System.ID, - file.Component, - file.Path, - )) - level.Debug(e.logger).Log( - "msg", "GatherMetrics() calls GetLogFileEventStats()", - "component", component, - "system_id", e.Client.System.ID, - ) - eventStats, err := e.Client.GetLogFileEventStats(component) - if err != nil { - level.Error(e.logger).Log( - "msg", "GetLogFileEventStats() failed", + file, err := e.Client.GetLogFileInfo(component) + if err != nil { + level.Error(e.logger).Log( + "msg", "GetLogFileInfo() failed", + "component", component, + "system_id", e.Client.System.ID, + "error", err.Error(), + ) + e.IncrementErrorCounter() + continue + } + level.Debug(e.logger).Log( + "msg", "GatherMetrics() completed GetLogFileInfo()", "component", component, "system_id", e.Client.System.ID, - "error", err.Error(), ) - e.IncrementErrorCounter() - continue - } - level.Debug(e.logger).Log( - "msg", "GatherMetrics() completed GetLogFileEventStats()", - "component", component, - "system_id", e.Client.System.ID, - ) - for sev, sources := range eventStats { - for source, count := range sources { - e.metrics = append(e.metrics, prometheus.MustNewConstMetric( - logEventStat, - prometheus.GaugeValue, - float64(count), - e.Client.System.ID, - component, - sev, - source, - )) + e.metrics = append(e.metrics, prometheus.MustNewConstMetric( + logFileSize, + prometheus.GaugeValue, + float64(file.Info.Size()), + e.Client.System.ID, + file.Component, + file.Path, + )) + level.Debug(e.logger).Log( + "msg", "GatherMetrics() calls GetLogFileEventStats()", + "component", component, + "system_id", e.Client.System.ID, + ) + eventStats, err := e.Client.GetLogFileEventStats(component) + if err != nil { + level.Error(e.logger).Log( + "msg", "GetLogFileEventStats() failed", + "component", component, + "system_id", e.Client.System.ID, + "error", err.Error(), + ) + e.IncrementErrorCounter() + continue + } + level.Debug(e.logger).Log( + "msg", "GatherMetrics() completed GetLogFileEventStats()", + "component", component, + "system_id", e.Client.System.ID, + ) + for sev, sources := range eventStats { + for source, count := range sources { + e.metrics = append(e.metrics, prometheus.MustNewConstMetric( + logEventStat, + prometheus.GaugeValue, + float64(count), + e.Client.System.ID, + component, + sev, + source, + )) + } } } } - level.Debug(e.logger).Log( "msg", "GatherMetrics() calls GetChassis()", "system_id", e.Client.System.ID,