feat: option to exit on socket conn error (#21)

Add a new startup option to exit the exporter when an error occurs when connecting to the fail2ban socket file.
This option is set to "false" by default.
This commit is contained in:
Hector 2022-06-19 07:20:45 +00:00
parent 951ceccf67
commit fd58b20162
3 changed files with 35 additions and 18 deletions

View File

@ -112,7 +112,7 @@ There are no configuration files.
**CLI flags** **CLI flags**
``` ```
usage: fail2ban_exporter [<flags>] usage: exporter [<flags>]
Flags: Flags:
-h, --help Show context-sensitive help (also try --help-long and --help-man). -h, --help Show context-sensitive help (also try --help-long and --help-man).
@ -127,6 +127,8 @@ Flags:
username to use to protect endpoints with basic auth username to use to protect endpoints with basic auth
--web.basic-auth.password="" --web.basic-auth.password=""
password to use to protect endpoints with basic auth password to use to protect endpoints with basic auth
--collector.f2b.exit-on-socket-connection-error
when set to true the exporter will immediately exit on a fail2ban socket connection error
``` ```
**Environment variables** **Environment variables**
@ -134,13 +136,14 @@ Flags:
Each environment variable corresponds to a CLI flag. Each environment variable corresponds to a CLI flag.
If both are specified, the CLI flag takes precedence. If both are specified, the CLI flag takes precedence.
| Environment variable | Corresponding CLI flag | | Environment variable | Corresponding CLI flag |
|---------------------------|----------------------------------| |---------------------------------|---------------------------------------------------|
| `F2B_COLLECTOR_SOCKET` | `--collector.f2b.socket` | | `F2B_COLLECTOR_SOCKET` | `--collector.f2b.socket` |
| `F2B_COLLECTOR_TEXT_PATH` | `--collector.textfile.directory` | | `F2B_COLLECTOR_TEXT_PATH` | `--collector.textfile.directory` |
| `F2B_WEB_LISTEN_ADDRESS` | `--web.listen-address` | | `F2B_WEB_LISTEN_ADDRESS` | `--web.listen-address` |
| `F2B_WEB_BASICAUTH_USER` | `--web.basic-auth.username` | | `F2B_WEB_BASICAUTH_USER` | `--web.basic-auth.username` |
| `F2B_WEB_BASICAUTH_PASS` | `--web.basic-auth.password` | | `F2B_WEB_BASICAUTH_PASS` | `--web.basic-auth.password` |
| `F2B_EXIT_ON_SOCKET_CONN_ERROR` | `--collector.f2b.exit-on-socket-connection-error` |
## 4. Building from source ## 4. Building from source

View File

@ -7,19 +7,21 @@ import (
) )
const ( const (
socketEnvName = "F2B_COLLECTOR_SOCKET" socketEnvName = "F2B_COLLECTOR_SOCKET"
fileCollectorPathEnvName = "F2B_COLLECTOR_TEXT_PATH" fileCollectorPathEnvName = "F2B_COLLECTOR_TEXT_PATH"
addressEnvName = "F2B_WEB_LISTEN_ADDRESS" addressEnvName = "F2B_WEB_LISTEN_ADDRESS"
basicAuthUserEnvName = "F2B_WEB_BASICAUTH_USER" basicAuthUserEnvName = "F2B_WEB_BASICAUTH_USER"
basicAuthPassEnvName = "F2B_WEB_BASICAUTH_PASS" basicAuthPassEnvName = "F2B_WEB_BASICAUTH_PASS"
exitOnSocketConnErrorEnvName = "F2B_EXIT_ON_SOCKET_CONN_ERROR"
) )
type AppSettings struct { type AppSettings struct {
VersionMode bool VersionMode bool
MetricsAddress string MetricsAddress string
Fail2BanSocketPath string Fail2BanSocketPath string
FileCollectorPath string FileCollectorPath string
BasicAuthProvider *hashedBasicAuth BasicAuthProvider *hashedBasicAuth
ExitOnSocketConnError bool
} }
func init() { func init() {
@ -64,6 +66,11 @@ func readParamsFromCli(settings *AppSettings) {
Default(""). Default("").
Envar(basicAuthPassEnvName). Envar(basicAuthPassEnvName).
String() String()
rawExitOnSocketConnError := kingpin.
Flag("collector.f2b.exit-on-socket-connection-error", "when set to true the exporter will immediately exit on a fail2ban socket connection error").
Default("false").
Envar(exitOnSocketConnErrorEnvName).
Bool()
kingpin.Parse() kingpin.Parse()
@ -72,6 +79,7 @@ func readParamsFromCli(settings *AppSettings) {
settings.Fail2BanSocketPath = *socketPath settings.Fail2BanSocketPath = *socketPath
settings.FileCollectorPath = *fileCollectorPath settings.FileCollectorPath = *fileCollectorPath
settings.setBasicAuthValues(*rawBasicAuthUsername, *rawBasicAuthPassword) settings.setBasicAuthValues(*rawBasicAuthUsername, *rawBasicAuthPassword)
settings.ExitOnSocketConnError = *rawExitOnSocketConnError
} }
func (settings *AppSettings) setBasicAuthValues(rawUsername, rawPassword string) { func (settings *AppSettings) setBasicAuthValues(rawUsername, rawPassword string) {

View File

@ -5,6 +5,7 @@ import (
"gitlab.com/hectorjsmith/fail2ban-prometheus-exporter/cfg" "gitlab.com/hectorjsmith/fail2ban-prometheus-exporter/cfg"
"gitlab.com/hectorjsmith/fail2ban-prometheus-exporter/socket" "gitlab.com/hectorjsmith/fail2ban-prometheus-exporter/socket"
"log" "log"
"os"
) )
type Collector struct { type Collector struct {
@ -13,6 +14,7 @@ type Collector struct {
lastError error lastError error
socketConnectionErrorCount int socketConnectionErrorCount int
socketRequestErrorCount int socketRequestErrorCount int
exitOnSocketConnError bool
} }
func NewExporter(appSettings *cfg.AppSettings, exporterVersion string) *Collector { func NewExporter(appSettings *cfg.AppSettings, exporterVersion string) *Collector {
@ -23,6 +25,7 @@ func NewExporter(appSettings *cfg.AppSettings, exporterVersion string) *Collecto
lastError: nil, lastError: nil,
socketConnectionErrorCount: 0, socketConnectionErrorCount: 0,
socketRequestErrorCount: 0, socketRequestErrorCount: 0,
exitOnSocketConnError: appSettings.ExitOnSocketConnError,
} }
} }
@ -41,6 +44,9 @@ func (c *Collector) Collect(ch chan<- prometheus.Metric) {
if err != nil { if err != nil {
log.Printf("error opening socket: %v", err) log.Printf("error opening socket: %v", err)
c.socketConnectionErrorCount++ c.socketConnectionErrorCount++
if c.exitOnSocketConnError {
os.Exit(1)
}
} else { } else {
defer s.Close() defer s.Close()
} }