You've already forked prometheus-fail2ban-exporter
							
							feat: new metric to track error counts
Add a new metric to count the number of database errors that have been found since startup. This complements the `up` metric to have better visibility into occasional database errors.
This commit is contained in:
		@@ -99,6 +99,7 @@ Access exported metrics at `/metrics` (on the provided port).
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Exposed metrics:
 | 
					Exposed metrics:
 | 
				
			||||||
* `up` - Returns 1 if the service is up
 | 
					* `up` - Returns 1 if the service is up
 | 
				
			||||||
 | 
					* `errors` - Returns the number of errors found since startup
 | 
				
			||||||
* `enabled_jails` - Returns 1 for each jail that is enabled, 0 if disabled.
 | 
					* `enabled_jails` - Returns 1 for each jail that is enabled, 0 if disabled.
 | 
				
			||||||
* `bad_ips` (per jail)
 | 
					* `bad_ips` (per jail)
 | 
				
			||||||
    * A *bad IP* is defined as an IP that has been banned at least once in the past
 | 
					    * A *bad IP* is defined as an IP that has been banned at least once in the past
 | 
				
			||||||
@@ -125,4 +126,7 @@ fail2ban_up 1
 | 
				
			|||||||
# TYPE fail2ban_enabled_jails gauge
 | 
					# TYPE fail2ban_enabled_jails gauge
 | 
				
			||||||
fail2ban_enabled_jails{jail="jail1"} 1
 | 
					fail2ban_enabled_jails{jail="jail1"} 1
 | 
				
			||||||
fail2ban_enabled_jails{jail="jail2"} 1
 | 
					fail2ban_enabled_jails{jail="jail2"} 1
 | 
				
			||||||
 | 
					# HELP fail2ban_errors Number of errors found since startup.
 | 
				
			||||||
 | 
					# TYPE fail2ban_errors counter
 | 
				
			||||||
 | 
					fail2ban_errors{type="db"} 0
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -39,11 +39,17 @@ var (
 | 
				
			|||||||
		"Enabled jails.",
 | 
							"Enabled jails.",
 | 
				
			||||||
		[]string{"jail"}, nil,
 | 
							[]string{"jail"}, nil,
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
 | 
						metricErrorCount = prometheus.NewDesc(
 | 
				
			||||||
 | 
							prometheus.BuildFQName(namespace, "", "errors"),
 | 
				
			||||||
 | 
							"Number of errors found since startup.",
 | 
				
			||||||
 | 
							[]string{"type"}, nil,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Exporter struct {
 | 
					type Exporter struct {
 | 
				
			||||||
	db        *fail2banDb.Fail2BanDB
 | 
						db           *fail2banDb.Fail2BanDB
 | 
				
			||||||
	lastError error
 | 
						lastError    error
 | 
				
			||||||
 | 
						dbErrorCount int
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (e *Exporter) Describe(ch chan<- *prometheus.Desc) {
 | 
					func (e *Exporter) Describe(ch chan<- *prometheus.Desc) {
 | 
				
			||||||
@@ -51,6 +57,7 @@ func (e *Exporter) Describe(ch chan<- *prometheus.Desc) {
 | 
				
			|||||||
	ch <- metricBadIpsPerJail
 | 
						ch <- metricBadIpsPerJail
 | 
				
			||||||
	ch <- metricBannedIpsPerJail
 | 
						ch <- metricBannedIpsPerJail
 | 
				
			||||||
	ch <- metricEnabledJails
 | 
						ch <- metricEnabledJails
 | 
				
			||||||
 | 
						ch <- metricErrorCount
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (e *Exporter) Collect(ch chan<- prometheus.Metric) {
 | 
					func (e *Exporter) Collect(ch chan<- prometheus.Metric) {
 | 
				
			||||||
@@ -58,6 +65,7 @@ func (e *Exporter) Collect(ch chan<- prometheus.Metric) {
 | 
				
			|||||||
	e.collectBannedIpsPerJailMetrics(ch)
 | 
						e.collectBannedIpsPerJailMetrics(ch)
 | 
				
			||||||
	e.collectEnabledJailMetrics(ch)
 | 
						e.collectEnabledJailMetrics(ch)
 | 
				
			||||||
	e.collectUpMetric(ch)
 | 
						e.collectUpMetric(ch)
 | 
				
			||||||
 | 
						e.collectErrorCountMetric(ch)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (e *Exporter) collectUpMetric(ch chan<- prometheus.Metric) {
 | 
					func (e *Exporter) collectUpMetric(ch chan<- prometheus.Metric) {
 | 
				
			||||||
@@ -70,11 +78,18 @@ func (e *Exporter) collectUpMetric(ch chan<- prometheus.Metric) {
 | 
				
			|||||||
	)
 | 
						)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (e *Exporter) collectErrorCountMetric(ch chan<- prometheus.Metric) {
 | 
				
			||||||
 | 
						ch <- prometheus.MustNewConstMetric(
 | 
				
			||||||
 | 
							metricErrorCount, prometheus.CounterValue, float64(e.dbErrorCount), "db",
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (e *Exporter) collectBadIpsPerJailMetrics(ch chan<- prometheus.Metric) {
 | 
					func (e *Exporter) collectBadIpsPerJailMetrics(ch chan<- prometheus.Metric) {
 | 
				
			||||||
	jailNameToCountMap, err := e.db.CountBadIpsPerJail()
 | 
						jailNameToCountMap, err := e.db.CountBadIpsPerJail()
 | 
				
			||||||
	e.lastError = err
 | 
						e.lastError = err
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
 | 
							e.dbErrorCount++
 | 
				
			||||||
		log.Print(err)
 | 
							log.Print(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -90,6 +105,7 @@ func (e *Exporter) collectBannedIpsPerJailMetrics(ch chan<- prometheus.Metric) {
 | 
				
			|||||||
	e.lastError = err
 | 
						e.lastError = err
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
 | 
							e.dbErrorCount++
 | 
				
			||||||
		log.Print(err)
 | 
							log.Print(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -105,6 +121,7 @@ func (e *Exporter) collectEnabledJailMetrics(ch chan<- prometheus.Metric) {
 | 
				
			|||||||
	e.lastError = err
 | 
						e.lastError = err
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
 | 
							e.dbErrorCount++
 | 
				
			||||||
		log.Print(err)
 | 
							log.Print(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user