forked from natesales/sfptpd-exporter
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
96 lines (86 loc) · 2.72 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package main
import (
"bufio"
"flag"
"net/http"
"os"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
"github.com/prometheus/client_golang/prometheus/promhttp"
log "github.com/sirupsen/logrus"
)
var version = "dev"
var (
statsFile = flag.String("f", "/tmp/sfptpd_stats.jsonl", "sfptpd stats JSONL file")
metricsListen = flag.String("l", ":9979", "metrics listen address")
verbose = flag.Bool("v", false, "Enable verbose logging")
trace = flag.Bool("vv", false, "Enable extra verbose logging")
)
var (
metricLastUpdate = promauto.NewGaugeVec(prometheus.GaugeOpts{
Name: "sfptpd_last_update",
Help: "Last time we got an update from sfptpd",
}, []string{"instance"})
metricTime = promauto.NewGaugeVec(prometheus.GaugeOpts{
Name: "sfptpd_time",
}, []string{"instance"})
metricMaster = promauto.NewGaugeVec(prometheus.GaugeOpts{
Name: "sfptpd_master",
}, []string{"instance", "name"})
metricSlave = promauto.NewGaugeVec(prometheus.GaugeOpts{
Name: "sfptpd_slave",
}, []string{"instance", "name", "primary_interface"})
metricIsDisciplining = promauto.NewGaugeVec(prometheus.GaugeOpts{
Name: "sfptpd_is_disciplining",
}, []string{"instance"})
metricInSync = promauto.NewGaugeVec(prometheus.GaugeOpts{
Name: "sfptpd_in_sync",
}, []string{"instance"})
metricAlarms = promauto.NewGaugeVec(prometheus.GaugeOpts{
Name: "sfptpd_alarms",
}, []string{"instance"})
metricOffset = promauto.NewGaugeVec(prometheus.GaugeOpts{
Name: "sfptpd_offset",
}, []string{"instance"})
metricFreqAdj = promauto.NewGaugeVec(prometheus.GaugeOpts{
Name: "sfptpd_freq_adj",
}, []string{"instance"})
metricPTerm = promauto.NewGaugeVec(prometheus.GaugeOpts{
Name: "sfptpd_pterm",
}, []string{"instance"})
metricITerm = promauto.NewGaugeVec(prometheus.GaugeOpts{
Name: "sfptpd_iterm",
}, []string{"instance"})
)
func main() {
flag.Parse()
if *verbose {
log.SetLevel(log.DebugLevel)
log.Debug("Running in verbose mode")
}
if *trace {
log.SetLevel(log.TraceLevel)
log.Debug("Running in trace mode")
}
log.Infof("Starting sfptpd-exporter version %s stats from %s", version, *statsFile)
// Create a new reader from the JSONL file
file, err := os.Open(*statsFile)
if err != nil {
log.Fatalf("Error opening JSONL file: %s", err)
}
reader := bufio.NewReader(file)
go func() {
for {
scanner := bufio.NewScanner(reader)
scanner.Split(bufio.ScanLines)
for scanner.Scan() {
processLine(scanner.Text())
}
}
}()
// Metrics server
metricsMux := http.NewServeMux()
metricsMux.Handle("/metrics", promhttp.Handler())
log.Infof("Starting metrics exporter on %s/metrics", *metricsListen)
log.Fatal(http.ListenAndServe(*metricsListen, metricsMux))
}