forked from SuperQ/smokeping_prober
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcollector.go
108 lines (93 loc) · 2.98 KB
/
collector.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
// Copyright 2018 Ben Kochie <superq@gmail.com>
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package main
import (
"github.com/sparrc/go-ping"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/common/log"
)
const (
namespace = "smokeping"
)
var (
labelNames = []string{"ip", "host"}
pingResponseTtl = prometheus.NewGaugeVec(
prometheus.GaugeOpts{
Namespace: namespace,
Name: "response_ttl",
Help: "The last response Time To Live (TTL).",
},
labelNames,
)
)
func init() {
prometheus.MustRegister(pingResponseTtl)
}
func newPingResponseHistogram(buckets []float64) *prometheus.HistogramVec {
return prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Namespace: namespace,
Name: "response_duration_seconds",
Help: "A histogram of latencies for ping responses.",
Buckets: buckets,
},
labelNames,
)
}
// SmokepingCollector collects metrics from the pinger.
type SmokepingCollector struct {
pingers *[]*ping.Pinger
requestsSent *prometheus.Desc
}
func NewSmokepingCollector(pingers *[]*ping.Pinger, pingResponseSeconds prometheus.HistogramVec) *SmokepingCollector {
for _, pinger := range *pingers {
pinger.OnRecv = func(pkt *ping.Packet) {
pingResponseSeconds.WithLabelValues(pkt.IPAddr.String(), pkt.Addr).Observe(pkt.Rtt.Seconds())
pingResponseTtl.WithLabelValues(pkt.IPAddr.String(), pkt.Addr).Set(float64(pkt.Ttl))
log.Debugf("%d bytes from %s: icmp_seq=%d time=%v ttl=%v\n",
pkt.Nbytes, pkt.IPAddr, pkt.Seq, pkt.Rtt, pkt.Ttl)
}
pinger.OnFinish = func(stats *ping.Statistics) {
log.Debugf("\n--- %s ping statistics ---\n", stats.Addr)
log.Debugf("%d packets transmitted, %d packets received, %v%% packet loss\n",
stats.PacketsSent, stats.PacketsRecv, stats.PacketLoss)
log.Debugf("round-trip min/avg/max/stddev = %v/%v/%v/%v\n",
stats.MinRtt, stats.AvgRtt, stats.MaxRtt, stats.StdDevRtt)
}
}
return &SmokepingCollector{
pingers: pingers,
requestsSent: prometheus.NewDesc(
prometheus.BuildFQName(namespace, "", "requests_total"),
"Number of ping requests sent",
labelNames,
nil,
),
}
}
func (s *SmokepingCollector) Describe(ch chan<- *prometheus.Desc) {
ch <- s.requestsSent
}
func (s *SmokepingCollector) Collect(ch chan<- prometheus.Metric) {
for _, pinger := range *s.pingers {
stats := pinger.Statistics()
ch <- prometheus.MustNewConstMetric(
s.requestsSent,
prometheus.CounterValue,
float64(stats.PacketsSent),
stats.IPAddr.String(),
stats.Addr,
)
}
}