-
Notifications
You must be signed in to change notification settings - Fork 50
/
middleware_metrics.go
66 lines (53 loc) · 1.63 KB
/
middleware_metrics.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
package limit
import (
"context"
"github.com/justtrackio/gosoline/pkg/clock"
"github.com/justtrackio/gosoline/pkg/metric"
)
const (
MetricNameRateLimitRelease = "rate-limit-release"
MetricNameRateLimitTake = "rate-limit-take"
MetricNameRateLimitThrottle = "rate-limit-throttle"
MetricNameRateLimitError = "rate-limit-error"
)
type metricMiddleware struct {
metricWriter metric.Writer
}
func NewMetricMiddleware() Middleware {
metricWriter := metric.NewWriter()
return NewMetricMiddlewareWithInterfaces(metricWriter)
}
func NewMetricMiddlewareWithInterfaces(metricWriter metric.Writer) *metricMiddleware {
return &metricMiddleware{
metricWriter: metricWriter,
}
}
func (m metricMiddleware) OnTake(_ context.Context, i Invocation) {
m.write(m.buildMetric(MetricNameRateLimitTake, i))
}
func (m metricMiddleware) OnRelease(_ context.Context, i Invocation) {
m.write(m.buildMetric(MetricNameRateLimitRelease, i))
}
func (m metricMiddleware) OnThrottle(_ context.Context, i Invocation) {
m.write(m.buildMetric(MetricNameRateLimitThrottle, i))
}
func (m metricMiddleware) OnError(_ context.Context, i Invocation) {
m.write(m.buildMetric(MetricNameRateLimitError, i))
}
func (m metricMiddleware) write(metric *metric.Datum) {
m.metricWriter.WriteOne(metric)
}
func (m metricMiddleware) buildMetric(metricName string, i Invocation) *metric.Datum {
return &metric.Datum{
Priority: metric.PriorityHigh,
Timestamp: clock.Provider.Now(),
MetricName: metricName,
Dimensions: metric.Dimensions{
"trace_id": i.GetTraceId(),
"name": i.GetName(),
"prefix": i.GetPrefix(),
},
Value: 1,
Unit: metric.UnitCount,
}
}