add new metric to collect ban time for each jail

This commit is contained in:
Hector 2021-10-14 21:30:38 +01:00
parent bb5c15de1b
commit 3169bbcbda
3 changed files with 34 additions and 0 deletions

View File

@ -46,6 +46,11 @@ var (
"Total number of IPs banned by this jail (includes expired bans)", "Total number of IPs banned by this jail (includes expired bans)",
[]string{"jail"}, nil, []string{"jail"}, nil,
) )
metricJailBanTime = prometheus.NewDesc(
prometheus.BuildFQName(namespace, "config", "jail_ban_time"),
"How long an IP is banned for in this jail (in seconds)",
[]string{"jail"}, nil,
)
metricVersionInfo = prometheus.NewDesc( metricVersionInfo = prometheus.NewDesc(
prometheus.BuildFQName(namespace, "", "version"), prometheus.BuildFQName(namespace, "", "version"),
"Version of the exporter and fail2ban server", "Version of the exporter and fail2ban server",
@ -98,6 +103,7 @@ func (c *Collector) collectJailMetrics(ch chan<- prometheus.Metric, s *socket.Fa
for i := range jails { for i := range jails {
c.collectJailStatsMetric(ch, s, jails[i]) c.collectJailStatsMetric(ch, s, jails[i])
c.collectJailConfigMetrics(ch, s, jails[i])
} }
} }
@ -123,6 +129,18 @@ func (c *Collector) collectJailStatsMetric(ch chan<- prometheus.Metric, s *socke
) )
} }
func (c *Collector) collectJailConfigMetrics(ch chan<- prometheus.Metric, s *socket.Fail2BanSocket, jail string) {
banTime, err := s.GetJailBanTime(jail)
if err != nil {
c.socketRequestErrorCount++
log.Printf("failed to get ban time for jail %s: %v", jail, err)
} else {
ch <- prometheus.MustNewConstMetric(
metricJailBanTime, prometheus.GaugeValue, float64(banTime), jail,
)
}
}
func (c *Collector) collectVersionMetric(ch chan<- prometheus.Metric, s *socket.Fail2BanSocket) { func (c *Collector) collectVersionMetric(ch chan<- prometheus.Metric, s *socket.Fail2BanSocket) {
var err error var err error
var fail2banVersion = "" var fail2banVersion = ""

View File

@ -118,6 +118,21 @@ func (s *Fail2BanSocket) GetJailStats(jail string) (JailStats, error) {
return stats, newBadFormatError(statusCommand, response) return stats, newBadFormatError(statusCommand, response)
} }
func (s *Fail2BanSocket) GetJailBanTime(jail string) (int, error) {
command := fmt.Sprintf(banTimeCommandFmt, jail)
response, err := s.sendCommand(strings.Split(command, " "))
if err != nil {
return -1, err
}
if lvl1, ok := response.(*types.Tuple); ok {
if banTime, ok := lvl1.Get(1).(int); ok {
return banTime, nil
}
}
return -1, newBadFormatError(command, response)
}
func (s *Fail2BanSocket) GetServerVersion() (string, error) { func (s *Fail2BanSocket) GetServerVersion() (string, error) {
response, err := s.sendCommand([]string{versionCommand}) response, err := s.sendCommand([]string{versionCommand})
if err != nil { if err != nil {

View File

@ -12,6 +12,7 @@ const (
pingCommand = "ping" pingCommand = "ping"
statusCommand = "status" statusCommand = "status"
versionCommand = "version" versionCommand = "version"
banTimeCommandFmt = "get %s bantime"
socketReadBufferSize = 1024 socketReadBufferSize = 1024
) )