From 60e6365e1fbba5dcfdfc28ab9b94e529b0926592 Mon Sep 17 00:00:00 2001 From: Hector Date: Wed, 13 Oct 2021 21:33:49 +0100 Subject: [PATCH] refactor: create new collector folder Create a new `collector` folder to store the code for the different collectors. Move the existing f2b and textfile collectors to this folder. Minor refactors to the f2b collector to better match the code style of the newer textfile collector. --- src/collector/f2b/collector.go | 83 +++++++++++++++++++++++ src/{export => collector/f2b}/database.go | 34 +++++----- src/{export => collector/f2b}/socket.go | 30 ++++---- src/{ => collector}/textfile/collector.go | 0 src/{ => collector}/textfile/file.go | 0 src/{ => collector}/textfile/writer.go | 0 src/export/build.go | 25 ------- src/export/exporter.go | 64 ----------------- src/exporter.go | 12 ++-- 9 files changed, 121 insertions(+), 127 deletions(-) create mode 100644 src/collector/f2b/collector.go rename src/{export => collector/f2b}/database.go (71%) rename src/{export => collector/f2b}/socket.go (78%) rename src/{ => collector}/textfile/collector.go (100%) rename src/{ => collector}/textfile/file.go (100%) rename src/{ => collector}/textfile/writer.go (100%) delete mode 100644 src/export/build.go delete mode 100644 src/export/exporter.go diff --git a/src/collector/f2b/collector.go b/src/collector/f2b/collector.go new file mode 100644 index 0000000..7f2d04d --- /dev/null +++ b/src/collector/f2b/collector.go @@ -0,0 +1,83 @@ +package f2b + +import ( + "fail2ban-prometheus-exporter/cfg" + fail2banDb "fail2ban-prometheus-exporter/db" + "fail2ban-prometheus-exporter/socket" + "github.com/prometheus/client_golang/prometheus" + "log" +) + +type Collector struct { + db *fail2banDb.Fail2BanDB + socketPath string + exporterVersion string + lastError error + dbErrorCount int + socketConnectionErrorCount int + socketRequestErrorCount int +} + +func NewExporter(appSettings *cfg.AppSettings, exporterVersion string) *Collector { + colector := &Collector{ + exporterVersion: exporterVersion, + lastError: nil, + dbErrorCount: 0, + socketConnectionErrorCount: 0, + socketRequestErrorCount: 0, + } + if appSettings.Fail2BanDbPath != "" { + log.Print("database-based metrics have been deprecated and will be removed in a future release") + colector.db = fail2banDb.MustConnectToDb(appSettings.Fail2BanDbPath) + } + if appSettings.Fail2BanSocketPath != "" { + colector.socketPath = appSettings.Fail2BanSocketPath + } + return colector +} + +func (c *Collector) Describe(ch chan<- *prometheus.Desc) { + if c.db != nil { + ch <- deprecatedMetricUp + ch <- deprecatedMetricBadIpsPerJail + ch <- deprecatedMetricBannedIpsPerJail + ch <- deprecatedMetricEnabledJails + ch <- deprecatedMetricErrorCount + } + if c.socketPath != "" { + ch <- metricServerUp + ch <- metricJailCount + ch <- metricJailFailedCurrent + ch <- metricJailFailedTotal + ch <- metricJailBannedCurrent + ch <- metricJailBannedTotal + } + ch <- metricErrorCount +} + +func (c *Collector) Collect(ch chan<- prometheus.Metric) { + if c.db != nil { + c.collectDeprecatedBadIpsPerJailMetrics(ch) + c.collectDeprecatedBannedIpsPerJailMetrics(ch) + c.collectDeprecatedEnabledJailMetrics(ch) + c.collectDeprecatedUpMetric(ch) + c.collectDeprecatedErrorCountMetric(ch) + } + if c.socketPath != "" { + s, err := socket.ConnectToSocket(c.socketPath) + if err != nil { + log.Printf("error opening socket: %v", err) + c.socketConnectionErrorCount++ + } else { + defer s.Close() + } + c.collectServerUpMetric(ch, s) + if err == nil && s != nil { + c.collectJailMetrics(ch, s) + } + c.collectVersionMetric(ch, s) + } else { + c.collectVersionMetric(ch, nil) + } + c.collectErrorCountMetric(ch) +} diff --git a/src/export/database.go b/src/collector/f2b/database.go similarity index 71% rename from src/export/database.go rename to src/collector/f2b/database.go index f030360..ea5fc33 100644 --- a/src/export/database.go +++ b/src/collector/f2b/database.go @@ -1,4 +1,4 @@ -package export +package f2b import ( "github.com/prometheus/client_golang/prometheus" @@ -37,9 +37,9 @@ var ( ) ) -func (e *Exporter) collectDeprecatedUpMetric(ch chan<- prometheus.Metric) { +func (c *Collector) collectDeprecatedUpMetric(ch chan<- prometheus.Metric) { var upMetricValue float64 = 1 - if e.lastError != nil { + if c.lastError != nil { upMetricValue = 0 } ch <- prometheus.MustNewConstMetric( @@ -47,18 +47,18 @@ func (e *Exporter) collectDeprecatedUpMetric(ch chan<- prometheus.Metric) { ) } -func (e *Exporter) collectDeprecatedErrorCountMetric(ch chan<- prometheus.Metric) { +func (c *Collector) collectDeprecatedErrorCountMetric(ch chan<- prometheus.Metric) { ch <- prometheus.MustNewConstMetric( - deprecatedMetricErrorCount, prometheus.CounterValue, float64(e.dbErrorCount), "db", + deprecatedMetricErrorCount, prometheus.CounterValue, float64(c.dbErrorCount), "db", ) } -func (e *Exporter) collectDeprecatedBadIpsPerJailMetrics(ch chan<- prometheus.Metric) { - jailNameToCountMap, err := e.db.CountBadIpsPerJail() - e.lastError = err +func (c *Collector) collectDeprecatedBadIpsPerJailMetrics(ch chan<- prometheus.Metric) { + jailNameToCountMap, err := c.db.CountBadIpsPerJail() + c.lastError = err if err != nil { - e.dbErrorCount++ + c.dbErrorCount++ log.Print(err) } @@ -69,12 +69,12 @@ func (e *Exporter) collectDeprecatedBadIpsPerJailMetrics(ch chan<- prometheus.Me } } -func (e *Exporter) collectDeprecatedBannedIpsPerJailMetrics(ch chan<- prometheus.Metric) { - jailNameToCountMap, err := e.db.CountBannedIpsPerJail() - e.lastError = err +func (c *Collector) collectDeprecatedBannedIpsPerJailMetrics(ch chan<- prometheus.Metric) { + jailNameToCountMap, err := c.db.CountBannedIpsPerJail() + c.lastError = err if err != nil { - e.dbErrorCount++ + c.dbErrorCount++ log.Print(err) } @@ -85,12 +85,12 @@ func (e *Exporter) collectDeprecatedBannedIpsPerJailMetrics(ch chan<- prometheus } } -func (e *Exporter) collectDeprecatedEnabledJailMetrics(ch chan<- prometheus.Metric) { - jailNameToEnabledMap, err := e.db.JailNameToEnabledValue() - e.lastError = err +func (c *Collector) collectDeprecatedEnabledJailMetrics(ch chan<- prometheus.Metric) { + jailNameToEnabledMap, err := c.db.JailNameToEnabledValue() + c.lastError = err if err != nil { - e.dbErrorCount++ + c.dbErrorCount++ log.Print(err) } diff --git a/src/export/socket.go b/src/collector/f2b/socket.go similarity index 78% rename from src/export/socket.go rename to src/collector/f2b/socket.go index ce2a258..96cdd92 100644 --- a/src/export/socket.go +++ b/src/collector/f2b/socket.go @@ -1,4 +1,4 @@ -package export +package f2b import ( "fail2ban-prometheus-exporter/socket" @@ -53,24 +53,24 @@ var ( ) ) -func (e *Exporter) collectErrorCountMetric(ch chan<- prometheus.Metric) { +func (c *Collector) collectErrorCountMetric(ch chan<- prometheus.Metric) { ch <- prometheus.MustNewConstMetric( - metricErrorCount, prometheus.CounterValue, float64(e.dbErrorCount), "db", + metricErrorCount, prometheus.CounterValue, float64(c.dbErrorCount), "db", ) ch <- prometheus.MustNewConstMetric( - metricErrorCount, prometheus.CounterValue, float64(e.socketConnectionErrorCount), "socket_conn", + metricErrorCount, prometheus.CounterValue, float64(c.socketConnectionErrorCount), "socket_conn", ) ch <- prometheus.MustNewConstMetric( - metricErrorCount, prometheus.CounterValue, float64(e.socketRequestErrorCount), "socket_req", + metricErrorCount, prometheus.CounterValue, float64(c.socketRequestErrorCount), "socket_req", ) } -func (e *Exporter) collectServerUpMetric(ch chan<- prometheus.Metric, s *socket.Fail2BanSocket) { +func (c *Collector) collectServerUpMetric(ch chan<- prometheus.Metric, s *socket.Fail2BanSocket) { var serverUp float64 = 0 if s != nil { pingSuccess, err := s.Ping() if err != nil { - e.socketRequestErrorCount++ + c.socketRequestErrorCount++ log.Print(err) } if err == nil && pingSuccess { @@ -82,11 +82,11 @@ func (e *Exporter) collectServerUpMetric(ch chan<- prometheus.Metric, s *socket. ) } -func (e *Exporter) collectJailMetrics(ch chan<- prometheus.Metric, s *socket.Fail2BanSocket) { +func (c *Collector) collectJailMetrics(ch chan<- prometheus.Metric, s *socket.Fail2BanSocket) { jails, err := s.GetJails() var count float64 = 0 if err != nil { - e.socketRequestErrorCount++ + c.socketRequestErrorCount++ log.Print(err) } if err == nil { @@ -97,14 +97,14 @@ func (e *Exporter) collectJailMetrics(ch chan<- prometheus.Metric, s *socket.Fai ) for i := range jails { - e.collectJailStatsMetric(ch, s, jails[i]) + c.collectJailStatsMetric(ch, s, jails[i]) } } -func (e *Exporter) collectJailStatsMetric(ch chan<- prometheus.Metric, s *socket.Fail2BanSocket, jail string) { +func (c *Collector) collectJailStatsMetric(ch chan<- prometheus.Metric, s *socket.Fail2BanSocket, jail string) { stats, err := s.GetJailStats(jail) if err != nil { - e.socketRequestErrorCount++ + c.socketRequestErrorCount++ log.Printf("failed to get stats for jail %s: %v", jail, err) return } @@ -123,18 +123,18 @@ func (e *Exporter) collectJailStatsMetric(ch chan<- prometheus.Metric, s *socket ) } -func (e *Exporter) collectVersionMetric(ch chan<- prometheus.Metric, s *socket.Fail2BanSocket) { +func (c *Collector) collectVersionMetric(ch chan<- prometheus.Metric, s *socket.Fail2BanSocket) { var err error var fail2banVersion = "" if s != nil { fail2banVersion, err = s.GetServerVersion() if err != nil { - e.socketRequestErrorCount++ + c.socketRequestErrorCount++ log.Printf("failed to get fail2ban server version: %v", err) } } ch <- prometheus.MustNewConstMetric( - metricVersionInfo, prometheus.GaugeValue, float64(1), e.exporterVersion, fail2banVersion, + metricVersionInfo, prometheus.GaugeValue, float64(1), c.exporterVersion, fail2banVersion, ) } diff --git a/src/textfile/collector.go b/src/collector/textfile/collector.go similarity index 100% rename from src/textfile/collector.go rename to src/collector/textfile/collector.go diff --git a/src/textfile/file.go b/src/collector/textfile/file.go similarity index 100% rename from src/textfile/file.go rename to src/collector/textfile/file.go diff --git a/src/textfile/writer.go b/src/collector/textfile/writer.go similarity index 100% rename from src/textfile/writer.go rename to src/collector/textfile/writer.go diff --git a/src/export/build.go b/src/export/build.go deleted file mode 100644 index a874cc2..0000000 --- a/src/export/build.go +++ /dev/null @@ -1,25 +0,0 @@ -package export - -import ( - "fail2ban-prometheus-exporter/cfg" - fail2banDb "fail2ban-prometheus-exporter/db" - "log" -) - -func NewExporter(appSettings *cfg.AppSettings, exporterVersion string) *Exporter { - exporter := &Exporter{ - exporterVersion: exporterVersion, - lastError: nil, - dbErrorCount: 0, - socketConnectionErrorCount: 0, - socketRequestErrorCount: 0, - } - if appSettings.Fail2BanDbPath != "" { - log.Print("database-based metrics have been deprecated and will be removed in a future release") - exporter.db = fail2banDb.MustConnectToDb(appSettings.Fail2BanDbPath) - } - if appSettings.Fail2BanSocketPath != "" { - exporter.socketPath = appSettings.Fail2BanSocketPath - } - return exporter -} diff --git a/src/export/exporter.go b/src/export/exporter.go deleted file mode 100644 index 76ebf18..0000000 --- a/src/export/exporter.go +++ /dev/null @@ -1,64 +0,0 @@ -package export - -import ( - fail2banDb "fail2ban-prometheus-exporter/db" - "fail2ban-prometheus-exporter/socket" - "github.com/prometheus/client_golang/prometheus" - "log" -) - -type Exporter struct { - db *fail2banDb.Fail2BanDB - socketPath string - exporterVersion string - lastError error - dbErrorCount int - socketConnectionErrorCount int - socketRequestErrorCount int -} - -func (e *Exporter) Describe(ch chan<- *prometheus.Desc) { - if e.db != nil { - ch <- deprecatedMetricUp - ch <- deprecatedMetricBadIpsPerJail - ch <- deprecatedMetricBannedIpsPerJail - ch <- deprecatedMetricEnabledJails - ch <- deprecatedMetricErrorCount - } - if e.socketPath != "" { - ch <- metricServerUp - ch <- metricJailCount - ch <- metricJailFailedCurrent - ch <- metricJailFailedTotal - ch <- metricJailBannedCurrent - ch <- metricJailBannedTotal - } - ch <- metricErrorCount -} - -func (e *Exporter) Collect(ch chan<- prometheus.Metric) { - if e.db != nil { - e.collectDeprecatedBadIpsPerJailMetrics(ch) - e.collectDeprecatedBannedIpsPerJailMetrics(ch) - e.collectDeprecatedEnabledJailMetrics(ch) - e.collectDeprecatedUpMetric(ch) - e.collectDeprecatedErrorCountMetric(ch) - } - if e.socketPath != "" { - s, err := socket.ConnectToSocket(e.socketPath) - if err != nil { - log.Printf("error opening socket: %v", err) - e.socketConnectionErrorCount++ - } else { - defer s.Close() - } - e.collectServerUpMetric(ch, s) - if err == nil && s != nil { - e.collectJailMetrics(ch, s) - } - e.collectVersionMetric(ch, s) - } else { - e.collectVersionMetric(ch, nil) - } - e.collectErrorCountMetric(ch) -} diff --git a/src/exporter.go b/src/exporter.go index 00fb395..2468ea0 100644 --- a/src/exporter.go +++ b/src/exporter.go @@ -2,8 +2,8 @@ package main import ( "fail2ban-prometheus-exporter/cfg" - "fail2ban-prometheus-exporter/export" - "fail2ban-prometheus-exporter/textfile" + "fail2ban-prometheus-exporter/collector/f2b" + textfile2 "fail2ban-prometheus-exporter/collector/textfile" "fmt" "log" "net/http" @@ -44,7 +44,7 @@ func rootHtmlHandler(w http.ResponseWriter, r *http.Request) { } } -func metricHandler(w http.ResponseWriter, r *http.Request, collector *textfile.Collector) { +func metricHandler(w http.ResponseWriter, r *http.Request, collector *textfile2.Collector) { promhttp.Handler().ServeHTTP(w, r) collector.WriteTextFileMetrics(w, r) } @@ -58,10 +58,10 @@ func main() { log.Printf("starting fail2ban exporter at %s", addr) - exporter := export.NewExporter(appSettings, version) - prometheus.MustRegister(exporter) + f2bCollector := f2b.NewExporter(appSettings, version) + prometheus.MustRegister(f2bCollector) - textFileCollector := textfile.NewCollector(appSettings) + textFileCollector := textfile2.NewCollector(appSettings) prometheus.MustRegister(textFileCollector) http.HandleFunc("/", rootHtmlHandler)