-
Notifications
You must be signed in to change notification settings - Fork 20
/
request_latency.go
72 lines (62 loc) · 1.7 KB
/
request_latency.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
package k8srestclient
import (
"context"
"net/url"
"sync"
"time"
"github.com/SAP/stewardci-core/pkg/metrics"
"github.com/prometheus/client_golang/prometheus"
k8sclientmetrics "k8s.io/client-go/tools/metrics"
)
var (
_ k8sclientmetrics.LatencyMetric = (*requestLatency)(nil)
requestLatencyInstance *requestLatency = &requestLatency{}
)
func init() {
requestLatencyInstance.init()
}
// requestLatency is the adapter for the `RequestLatency` metric of client-go.
type requestLatency struct {
metric *prometheus.HistogramVec
initOnlyOnce sync.Once
}
func (m *requestLatency) init() {
m.initOnlyOnce.Do(func() {
buckets := func() []float64 {
list := make([]float64, 0, 18)
for i := 1.0; i <= 1e+6; i *= 10.0 {
list = append(list, i, i*5.0)
}
return list
}
m.metric = prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Subsystem: subsystem,
Name: "request_latency_millis",
Help: "A histogram vector of request latency partitioned by URL scheme, hostname, port, URL path and HTTP method.",
Buckets: buckets(),
},
[]string{
"scheme",
"hostname",
"port",
"path",
"method",
},
)
metrics.Registerer().MustRegister(m.metric)
})
}
func (m *requestLatency) Observe(ctx context.Context, method string, u url.URL, latency time.Duration) {
labels := prometheus.Labels{
"scheme": u.Scheme,
"hostname": u.Hostname(),
// Set the scheme's default port if none is specified in the URL to avoid
// having possibly two partitions (with default port, without port) for
// effectively equal URLs.
"port": urlPort(u),
"path": u.Path,
"method": method,
}
m.metric.With(labels).Observe(float64(latency.Milliseconds()))
}