master
go 91 lines 2.59 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package ping
4
5 import (
6 "context"
7 "sync"
8
9 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/pinger"
10 )
11
12 func (c *Collector) collect(ctx context.Context) error {
13 samples := c.collectSamples(ctx, true)
14 if len(samples) == 0 {
15 return nil
16 }
17
18 vecMeter := c.store.Write().SnapshotMeter("").Vec("host")
19 minRTT := vecMeter.Gauge("min_rtt")
20 maxRTT := vecMeter.Gauge("max_rtt")
21 avgRTT := vecMeter.Gauge("avg_rtt")
22 stdDevRTT := vecMeter.Gauge("std_dev_rtt")
23 rttVariance := vecMeter.Gauge("rtt_variance")
24 meanJitter := vecMeter.Gauge("mean_jitter")
25 ewmaJitter := vecMeter.Gauge("ewma_jitter")
26 smaJitter := vecMeter.Gauge("sma_jitter")
27 packetLoss := vecMeter.Gauge("packet_loss")
28 packetsRecv := vecMeter.Gauge("packets_recv")
29 packetsSent := vecMeter.Gauge("packets_sent")
30
31 for _, sample := range samples {
32 packetsRecv.WithLabelValues(sample.Host).Observe(float64(sample.PacketsRecv))
33 packetsSent.WithLabelValues(sample.Host).Observe(float64(sample.PacketsSent))
34 packetLoss.WithLabelValues(sample.Host).Observe(sample.PacketLossPct * 1000)
35
36 if sample.RTT.Valid {
37 minRTT.WithLabelValues(sample.Host).Observe(float64(sample.RTT.Min.Microseconds()))
38 maxRTT.WithLabelValues(sample.Host).Observe(float64(sample.RTT.Max.Microseconds()))
39 avgRTT.WithLabelValues(sample.Host).Observe(float64(sample.RTT.Avg.Microseconds()))
40 stdDevRTT.WithLabelValues(sample.Host).Observe(float64(sample.RTT.StdDev.Microseconds()))
41 rttVariance.WithLabelValues(sample.Host).Observe(float64(sample.RTT.VarianceMicrosecondsSquared()))
42 }
43
44 if sample.Jitter.InstantValid {
45 meanJitter.WithLabelValues(sample.Host).Observe(float64(sample.Jitter.Mean.Microseconds()))
46 }
47 if sample.Jitter.SmoothedValid {
48 ewmaJitter.WithLabelValues(sample.Host).Observe(float64(sample.Jitter.EWMA.Microseconds()))
49 smaJitter.WithLabelValues(sample.Host).Observe(float64(sample.Jitter.SMA.Microseconds()))
50 }
51 }
52
53 return nil
54 }
55
56 func (c *Collector) collectSamples(ctx context.Context, track bool) []pinger.Sample {
57 if c.client == nil {
58 return nil
59 }
60
61 var (
62 mu sync.Mutex
63 samples = make([]pinger.Sample, 0, len(c.Hosts))
64 wg sync.WaitGroup
65 )
66
67 for _, host := range c.Hosts {
68 wg.Go(func() {
69 sample, err := c.probeHost(ctx, host, track)
70 if err != nil {
71 c.Error(err)
72 return
73 }
74
75 mu.Lock()
76 samples = append(samples, sample)
77 mu.Unlock()
78 })
79 }
80
81 wg.Wait()
82
83 return samples
84 }
85
86 func (c *Collector) probeHost(ctx context.Context, host string, track bool) (pinger.Sample, error) {
87 if track {
88 return c.client.ProbeAndTrack(ctx, host)
89 }
90 return c.client.Probe(ctx, host)
91 }