Moved the collection of stats into its own go routine
This commit is contained in:
parent
3e8a3a4917
commit
26d0642831
@ -16,6 +16,7 @@ package main
|
|||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/alecthomas/kingpin"
|
"github.com/alecthomas/kingpin"
|
||||||
@ -293,7 +294,7 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// CollectFromLogline collects metrict from a Postfix log line.
|
// CollectFromLogline collects metrict from a Postfix log line.
|
||||||
func (e *PostfixExporter) CollectFromLogline(line string) {
|
func (e *PostfixExporter) CollectFromLogLine(line string) {
|
||||||
// Strip off timestamp, hostname, etc.
|
// Strip off timestamp, hostname, etc.
|
||||||
if logMatches := logLine.FindStringSubmatch(line); logMatches != nil {
|
if logMatches := logLine.FindStringSubmatch(line); logMatches != nil {
|
||||||
// Group patterns to check by Postfix service.
|
// Group patterns to check by Postfix service.
|
||||||
@ -397,7 +398,7 @@ func (e *PostfixExporter) CollectFromLogline(line string) {
|
|||||||
}
|
}
|
||||||
e.smtpDelays.WithLabelValues("transmission").Observe(xdelay)
|
e.smtpDelays.WithLabelValues("transmission").Observe(xdelay)
|
||||||
|
|
||||||
if smtpMatches := smtpStatusDeferredLine.FindStringSubmatch(logMatches[2]) ; smtpMatches != nil {
|
if smtpMatches := smtpStatusDeferredLine.FindStringSubmatch(logMatches[2]); smtpMatches != nil {
|
||||||
e.smtpStatusDeferred.Inc()
|
e.smtpStatusDeferred.Inc()
|
||||||
}
|
}
|
||||||
} else if smtpTLSMatches := smtpTLSLine.FindStringSubmatch(logMatches[2]); smtpTLSMatches != nil {
|
} else if smtpTLSMatches := smtpTLSLine.FindStringSubmatch(logMatches[2]); smtpTLSMatches != nil {
|
||||||
@ -438,14 +439,25 @@ func (e *PostfixExporter) CollectFromLogline(line string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// CollectLogfileFromFile tails a Postfix log file and collects entries from it.
|
// CollectLogfileFromFile tails a Postfix log file and collects entries from it.
|
||||||
func (e *PostfixExporter) CollectLogfileFromFile() error {
|
func (e *PostfixExporter) CollectLogfileFromFile(ctx context.Context) {
|
||||||
|
gaugeVec := prometheus.NewGaugeVec(
|
||||||
|
prometheus.GaugeOpts{
|
||||||
|
Namespace: "postfix",
|
||||||
|
Subsystem: "",
|
||||||
|
Name: "up",
|
||||||
|
Help: "Whether scraping Postfix's metrics was successful.",
|
||||||
|
},
|
||||||
|
[]string{"path"})
|
||||||
|
gauge := gaugeVec.With(prometheus.Labels{"path": e.tailer.Filename})
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case line := <-e.tailer.Lines:
|
case line := <-e.tailer.Lines:
|
||||||
e.CollectFromLogline(line.Text)
|
e.CollectFromLogLine(line.Text)
|
||||||
default:
|
case <-ctx.Done():
|
||||||
return nil
|
gauge.Set(0)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
gauge.Set(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -596,7 +608,6 @@ func NewPostfixExporter(showqPath string, logfilePath string, journal *Journal)
|
|||||||
Name: "smtp_status_deferred",
|
Name: "smtp_status_deferred",
|
||||||
Help: "Total number of messages deferred.",
|
Help: "Total number of messages deferred.",
|
||||||
}),
|
}),
|
||||||
|
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -627,6 +638,48 @@ func (e *PostfixExporter) Describe(ch chan<- *prometheus.Desc) {
|
|||||||
e.unsupportedLogEntries.Describe(ch)
|
e.unsupportedLogEntries.Describe(ch)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (e *PostfixExporter) foreverCollectFromJournal(ctx context.Context) {
|
||||||
|
gauge := prometheus.NewGaugeVec(
|
||||||
|
prometheus.GaugeOpts{
|
||||||
|
Namespace: "postfix",
|
||||||
|
Subsystem: "",
|
||||||
|
Name: "up",
|
||||||
|
Help: "Whether scraping Postfix's metrics was successful.",
|
||||||
|
},
|
||||||
|
[]string{"path"}).With(prometheus.Labels{"path": e.journal.Path})
|
||||||
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
gauge.Set(0)
|
||||||
|
return
|
||||||
|
default:
|
||||||
|
err := e.CollectLogfileFromJournal()
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Couldn't read journal: %v", err)
|
||||||
|
gauge.Set(0)
|
||||||
|
} else {
|
||||||
|
gauge.Set(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *PostfixExporter) StartMetricCollection(ctx context.Context) {
|
||||||
|
if e.journal != nil {
|
||||||
|
e.foreverCollectFromJournal(ctx)
|
||||||
|
} else {
|
||||||
|
e.CollectLogfileFromFile(ctx)
|
||||||
|
}
|
||||||
|
|
||||||
|
prometheus.NewGaugeVec(
|
||||||
|
prometheus.GaugeOpts{
|
||||||
|
Namespace: "postfix",
|
||||||
|
Subsystem: "",
|
||||||
|
Name: "up",
|
||||||
|
Help: "Whether scraping Postfix's metrics was successful.",
|
||||||
|
},
|
||||||
|
[]string{"path"})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// Collect metrics from Postfix's showq socket and its log file.
|
// Collect metrics from Postfix's showq socket and its log file.
|
||||||
func (e *PostfixExporter) Collect(ch chan<- prometheus.Metric) {
|
func (e *PostfixExporter) Collect(ch chan<- prometheus.Metric) {
|
||||||
err := CollectShowqFromSocket(e.showqPath, ch)
|
err := CollectShowqFromSocket(e.showqPath, ch)
|
||||||
@ -645,29 +698,6 @@ func (e *PostfixExporter) Collect(ch chan<- prometheus.Metric) {
|
|||||||
e.showqPath)
|
e.showqPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
var src string
|
|
||||||
if e.journal != nil {
|
|
||||||
err = e.CollectLogfileFromJournal()
|
|
||||||
src = e.journal.Path
|
|
||||||
} else {
|
|
||||||
err = e.CollectLogfileFromFile()
|
|
||||||
src = e.tailer.Filename
|
|
||||||
}
|
|
||||||
if err == nil {
|
|
||||||
ch <- prometheus.MustNewConstMetric(
|
|
||||||
postfixUpDesc,
|
|
||||||
prometheus.GaugeValue,
|
|
||||||
1.0,
|
|
||||||
src)
|
|
||||||
} else {
|
|
||||||
log.Printf("Failed to scrape log: %s", err)
|
|
||||||
ch <- prometheus.MustNewConstMetric(
|
|
||||||
postfixUpDesc,
|
|
||||||
prometheus.GaugeValue,
|
|
||||||
0.0,
|
|
||||||
src)
|
|
||||||
}
|
|
||||||
|
|
||||||
ch <- e.cleanupProcesses
|
ch <- e.cleanupProcesses
|
||||||
ch <- e.cleanupRejects
|
ch <- e.cleanupRejects
|
||||||
ch <- e.cleanupNotAccepted
|
ch <- e.cleanupNotAccepted
|
||||||
@ -742,7 +772,9 @@ func main() {
|
|||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
ctx, cancelFunc := context.WithCancel(context.Background())
|
||||||
|
defer cancelFunc()
|
||||||
|
go exporter.StartMetricCollection(ctx)
|
||||||
log.Print("Listening on ", *listenAddress)
|
log.Print("Listening on ", *listenAddress)
|
||||||
log.Fatal(http.ListenAndServe(*listenAddress, nil))
|
log.Fatal(http.ListenAndServe(*listenAddress, nil))
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user