-
Notifications
You must be signed in to change notification settings - Fork 0
/
collector.go
115 lines (102 loc) · 3.31 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
109
110
111
112
113
114
115
// Copyright 2018 Ben Kochie <[email protected]>
//
// 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/prometheus/client_golang/prometheus"
"github.com/prometheus/common/log"
)
const (
namespace = "ioping"
)
var (
labelNames = []string{"target", "mode"}
//pingResponseTtl = promauto.NewGaugeVec(
// prometheus.GaugeOpts{
// Namespace: namespace,
// Name: "response_ttl",
// Help: "The last response Time To Live (TTL).",
// },
// labelNames,
//)
//pingResponseDuplicates = promauto.NewCounterVec(
// prometheus.CounterOpts{
// Namespace: namespace,
// Name: "response_duplicates_total",
// Help: "The number of duplicated response packets.",
// },
// labelNames,
//)
)
func newPingResponseHistogram(buckets []float64) *prometheus.HistogramVec {
return prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Namespace: namespace,
Name: "measurement_duration_seconds",
Help: "A histogram of latencies for io responses.",
Buckets: buckets,
},
labelNames,
)
}
// IopingCollector collects metrics from the pinger.
type IopingCollector struct {
pingers *[]*Iopinger
requestsSent *prometheus.Desc
}
func NewIopingCollector(pingers *[]*Iopinger, pingResponseSeconds prometheus.HistogramVec) *IopingCollector {
for _, pinger := range *pingers {
// Init all metrics to 0s.
target := pinger.Target
mode := pinger.Mode()
pingResponseSeconds.WithLabelValues(target, mode)
// Setup handler functions.
pinger.OnMeasure = func(stats *Statistics) {
measurement_nanosec := float64(stats.Max)
var nsec_to_sec float64 = 0.000000001
measurement_sec := measurement_nanosec * nsec_to_sec
pingResponseSeconds.WithLabelValues(stats.Target, stats.Mode).Observe(measurement_sec)
log.Debugf("Measurement time: %f sec (%f nanosec) of %s\n", measurement_sec, measurement_nanosec, stats.Target)
}
//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 &IopingCollector{
pingers: pingers,
requestsSent: prometheus.NewDesc(
prometheus.BuildFQName(namespace, "", "measurements_total"),
"Number of measurements performed",
labelNames,
nil,
),
}
}
func (s *IopingCollector) Describe(ch chan<- *prometheus.Desc) {
ch <- s.requestsSent
}
func (s *IopingCollector) Collect(ch chan<- prometheus.Metric) {
for _, pinger := range *s.pingers {
ch <- prometheus.MustNewConstMetric(
s.requestsSent,
prometheus.CounterValue,
float64(pinger.Measurements),
pinger.Target,
pinger.Mode(),
)
}
}