package main import ( "context" "github.com/prometheus/client_golang/prometheus/promhttp" "log" "net/http" "os" "github.com/alecthomas/kingpin" "github.com/prometheus/client_golang/prometheus" ) func main() { var ( app = kingpin.New("postfix_exporter", "Prometheus metrics exporter for postfix") listenAddress = app.Flag("web.listen-address", "Address to listen on for web interface and telemetry.").Default(":9154").String() metricsPath = app.Flag("web.telemetry-path", "Path under which to expose metrics.").Default("/metrics").String() postfixShowqPath = app.Flag("postfix.showq_path", "Path at which Postfix places its showq socket.").Default("/var/spool/postfix/public/showq").String() postfixLogfilePath = app.Flag("postfix.logfile_path", "Path where Postfix writes log entries. This file will be truncated by this exporter.").Default("/var/log/postfix_exporter_input.log").String() logUnsupportedLines = app.Flag("log.unsupported", "Log all unsupported lines.").Bool() systemdEnable bool systemdUnit, systemdSlice, systemdJournalPath string ) systemdFlags(&systemdEnable, &systemdUnit, &systemdSlice, &systemdJournalPath, app) kingpin.MustParse(app.Parse(os.Args[1:])) var journal *Journal if systemdEnable { var err error journal, err = NewJournal(systemdUnit, systemdSlice, systemdJournalPath) if err != nil { log.Fatalf("Error opening systemd journal: %s", err) } defer journal.Close() log.Println("Reading log events from systemd") } else { log.Printf("Reading log events from %v", *postfixLogfilePath) } exporter, err := NewPostfixExporter( *postfixShowqPath, *postfixLogfilePath, journal, *logUnsupportedLines, ) if err != nil { log.Fatalf("Failed to create PostfixExporter: %s", err) } prometheus.MustRegister(exporter) http.Handle(*metricsPath, promhttp.Handler()) http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { _, err = w.Write([]byte(`