-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathmain.go
123 lines (103 loc) · 2.75 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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package main
import (
"flag"
"fmt"
"io/ioutil"
"os"
"gopkg.in/yaml.v2"
"github.com/exaring/matroschka-prober/pkg/config"
"github.com/exaring/matroschka-prober/pkg/frontend"
"github.com/exaring/matroschka-prober/pkg/prober"
"github.com/prometheus/client_golang/prometheus"
log "github.com/sirupsen/logrus"
_ "net/http/pprof"
)
var (
cfgFilepath = flag.String("config.file", "matroschka.yml", "Config file")
logLevel = flag.String("log.level", "debug", "Log Level")
)
func main() {
flag.Parse()
level, err := log.ParseLevel(*logLevel)
if err != nil {
log.Errorf("Unable to parse log.level: %v", err)
os.Exit(1)
}
log.SetLevel(level)
cfg, err := loadConfig(*cfgFilepath)
if err != nil {
log.Errorf("Unable to load config: %v", err)
os.Exit(1)
}
confSrc, err := cfg.GetConfiguredSrcAddr()
if err != nil {
log.Errorf("Unable to get configured src addr: %v", err)
os.Exit(1)
}
probers := make([]*prober.Prober, 0)
for i := range cfg.Paths {
for j := range cfg.Classes {
log.Infof("Starting prober for path %q class %q", cfg.Paths[i].Name, cfg.Classes[j].Name)
p, err := prober.New(prober.Config{
BasePort: *cfg.BasePort,
ConfiguredSrcAddr: confSrc,
SrcAddrs: config.GenerateAddrs(*cfg.SrcRange),
Hops: cfg.PathToProberHops(cfg.Paths[i]),
StaticLabels: []prober.Label{},
TOS: prober.TOS{
Name: cfg.Classes[j].Name,
Value: cfg.Classes[j].TOS,
},
PPS: *cfg.Paths[i].PPS,
PayloadSizeBytes: *cfg.Paths[i].PayloadSizeBytes,
MeasurementLengthMS: *cfg.Paths[i].MeasurementLengthMS,
TimeoutMS: *cfg.Paths[i].TimeoutMS,
})
if err != nil {
log.Errorf("Unable to get new prober: %v", err)
os.Exit(1)
}
err = p.Start()
if err != nil {
log.Errorf("Unable to start prober: %v", err)
os.Exit(1)
}
probers = append(probers, p)
}
}
fe := frontend.New(&frontend.Config{
Version: cfg.Version,
MetricsPath: *cfg.MetricsPath,
ListenAddress: *cfg.ListenAddress,
}, newRegistry(probers))
go fe.Start()
select {}
}
type registry struct {
probers []*prober.Prober
}
func newRegistry(probers []*prober.Prober) *registry {
return ®istry{
probers: probers,
}
}
func (r *registry) GetCollectors() []prometheus.Collector {
ret := make([]prometheus.Collector, len(r.probers))
for i := range r.probers {
ret[i] = r.probers[i]
}
return ret
}
func loadConfig(path string) (*config.Config, error) {
cfgFile, err := ioutil.ReadFile(path)
if err != nil {
return nil, fmt.Errorf("Unable to read file %q: %v", path, err)
}
cfg := &config.Config{}
err = yaml.Unmarshal(cfgFile, cfg)
if err != nil {
return nil, fmt.Errorf("Unable to unmarshal: %v", err)
}
cfg.ApplyDefaults()
return cfg, nil
}