Skip to content

Commit 6f880e1

Browse files
zeidlitzquakj
authored andcommitted
refactor: clean up observer loop and fix DHCP/ICMP/DNS handling
1 parent 61a87d5 commit 6f880e1

File tree

2 files changed

+75
-62
lines changed

2 files changed

+75
-62
lines changed

icmp.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ func init() {
2929
prometheus.MustRegister(icmpAvgRtt)
3030
}
3131

32-
func sampleIcmp(targets []string, count int) {
32+
func sampleIcmp(targets []string, count int) error {
3333
for _, target := range targets {
3434
f := icmpSetupFailures.With(prometheus.Labels{
3535
"target": target,
@@ -38,7 +38,7 @@ func sampleIcmp(targets []string, count int) {
3838
pinger, err := probing.NewPinger(target)
3939
if err != nil {
4040
f.Inc()
41-
return
41+
return err
4242
}
4343
pinger.SetPrivileged(true)
4444
pinger.Count = count
@@ -57,7 +57,7 @@ func sampleIcmp(targets []string, count int) {
5757
err = pinger.Run()
5858
if err != nil {
5959
f.Inc()
60-
return
60+
return err
6161
}
6262

6363
stats := pinger.Statistics()
@@ -77,4 +77,6 @@ func sampleIcmp(targets []string, count int) {
7777
"resolved_addr": stats.IPAddr.String(),
7878
}).Set(stats.AvgRtt.Seconds())
7979
}
80+
81+
return nil
8082
}

main.go

Lines changed: 70 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -44,89 +44,51 @@ func main() {
4444
flag.IntVar(&hostPort, "host-port", 9023, "The port to listen on. Default: 9023")
4545
flag.Parse()
4646

47+
if iface == "" {
48+
slog.Error("interface must be specified")
49+
flag.Usage()
50+
os.Exit(1)
51+
}
52+
4753
if disable4 && disable6 {
4854
slog.Error("both disable4 and disable6 flag set, needs at least one")
4955
flag.Usage()
5056
os.Exit(1)
5157
}
5258

59+
link, err := netlink.LinkByName(iface)
60+
if err != nil {
61+
log.Fatalln(err)
62+
}
63+
5364
slog.Info("starting observer", "iface", iface, "icmp_targets", icmpTargets, "icmp_count", icmpCount, "interval", interval, "disable4", disable4, "disable6", disable6, "dns_qname", dnsQname, "dns_target", dnsTargets)
5465

5566
dnsTargetsList := strings.Split(dnsTargets, ",")
5667
icmpTargetsList := strings.Split(icmpTargets, ",")
57-
http.Handle("/metrics", promhttp.Handler())
5868

59-
link, err := netlink.LinkByName(iface)
60-
if err != nil {
61-
log.Fatalln(err)
62-
}
69+
http.Handle("/metrics", promhttp.Handler())
6370

6471
go func() {
6572
for {
66-
yourIPAddr, prefixBits, err := sampleDhcp(iface, verbose)
67-
if err != nil {
68-
slog.Warn("sampling dhcp", "your_ip_addr", yourIPAddr, "prefix_bits", prefixBits, "err", err)
69-
}
70-
71-
err = sampleDns(dnsTargetsList, dnsQname)
72-
if err != nil {
73-
slog.Warn("sampling DNS", "err", err)
74-
}
7573

76-
var addr *netlink.Addr
77-
var addr6 *netlink.Addr
7874
if !disable4 {
79-
yourIPAddr, prefixBits, err := sampleDhcp(iface, verbose)
80-
if err != nil {
81-
slog.Warn("sampling dhcp v4", "iface", iface, "err", err)
82-
}
83-
84-
addr, err = netlink.ParseAddr(yourIPAddr.String() + "/" + strconv.Itoa(prefixBits))
85-
if err != nil {
86-
slog.Error("parsing address", "err", err)
87-
os.Exit(1)
88-
}
89-
90-
err = netlink.AddrAdd(link, addr)
91-
if err != nil {
92-
slog.Warn("adding netlink", "link", link, "addr", addr, "err", err)
75+
if err := observeIPv4(link); err != nil {
76+
slog.Warn("issue with ipv4", "err", err)
9377
}
9478
}
9579

9680
if !disable6 {
97-
yourIP6Addr, prefix6Bits, err := sampleDhcp6(iface, verbose)
98-
if err != nil {
99-
slog.Warn("sampling dhcp v6", "iface", iface, "err", err)
100-
}
101-
102-
addr6, err = netlink.ParseAddr(yourIP6Addr.String() + "/" + strconv.Itoa(prefix6Bits))
103-
if err != nil {
104-
slog.Error("adding link", "addr6", addr6, "err", err)
105-
os.Exit(1)
106-
}
107-
108-
err = netlink.AddrAdd(link, addr6)
109-
if err != nil {
110-
slog.Warn("could not add netlink address", "link", link, "addr6", addr6, "err", err)
81+
if err := observeIPv6(link); err != nil {
82+
slog.Warn("issue with ipv6", "err", err)
11183
}
11284
}
11385

114-
if icmpTargets != "" && len(icmpTargetsList) > 0 {
115-
sampleIcmp(icmpTargetsList, icmpCount)
86+
if err := sampleDns(dnsTargetsList, dnsQname); err != nil {
87+
slog.Warn("issue with DNS sampling", "err", err)
11688
}
11789

118-
if !disable4 {
119-
err := netlink.AddrDel(link, addr)
120-
if err != nil {
121-
slog.Warn("deleting v4 netlink", "link", link, "addr", addr, "err", err)
122-
}
123-
}
124-
125-
if !disable6 {
126-
err := netlink.AddrDel(link, addr6)
127-
if err != nil {
128-
slog.Warn("deleting v6 netlink", "link", link, "addr", addr, "err", err)
129-
}
90+
if err := sampleIcmp(icmpTargetsList, icmpCount); err != nil {
91+
slog.Warn("issue sampling icmp", "err", err)
13092
}
13193

13294
time.Sleep(interval)
@@ -137,6 +99,55 @@ func main() {
13799
slog.Info("starting observer", "host_address", hostAddress)
138100
err = http.ListenAndServe(hostAddress, nil)
139101
if err != nil {
140-
panic(err)
102+
slog.Error("http server", "err", err)
103+
os.Exit(1)
104+
}
105+
}
106+
107+
func observeIPv4(link netlink.Link) error {
108+
ip, prefix, err := sampleDhcp(iface, verbose)
109+
if err != nil {
110+
return fmt.Errorf("DHCPv4 sampling failed: %w", err)
111+
}
112+
113+
addr, err := netlink.ParseAddr(ip.String() + "/" + strconv.Itoa(prefix))
114+
if err != nil {
115+
return fmt.Errorf("parsing IPv4 address failed: %w", err)
116+
}
117+
118+
if err := netlink.AddrAdd(link, addr); err != nil {
119+
slog.Warn("could not add IPv4 address", "addr", addr, "err", err)
120+
return nil
121+
}
122+
defer func() {
123+
if err := netlink.AddrDel(link, addr); err != nil {
124+
slog.Warn("could not delete IPv4 address", "addr", addr, "err", err)
125+
}
126+
}()
127+
128+
return nil
129+
}
130+
131+
func observeIPv6(link netlink.Link) error {
132+
ip6, prefix6, err := sampleDhcp6(iface, verbose)
133+
if err != nil {
134+
return fmt.Errorf("DHCPv6 sampling failed: %w", err)
135+
}
136+
137+
addr6, err := netlink.ParseAddr(ip6.String() + "/" + strconv.Itoa(prefix6))
138+
if err != nil {
139+
return fmt.Errorf("parsing IPv6 address failed: %w", err)
140+
}
141+
142+
if err := netlink.AddrAdd(link, addr6); err != nil {
143+
slog.Warn("could not add IPv6 address", "addr6", addr6, "err", err)
144+
return nil
141145
}
146+
defer func() {
147+
if err := netlink.AddrDel(link, addr6); err != nil {
148+
slog.Warn("could not delete IPv6 address", "addr6", addr6, "err", err)
149+
}
150+
}()
151+
152+
return nil
142153
}

0 commit comments

Comments
 (0)