-
-
Notifications
You must be signed in to change notification settings - Fork 10
/
api_metrics.go
51 lines (48 loc) · 1.26 KB
/
api_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
package dns
import (
"context"
"strconv"
"strings"
"beryju.io/gravity/pkg/roles/dns/types"
tsdbTypes "beryju.io/gravity/pkg/roles/tsdb/types"
"github.com/swaggest/usecase"
"github.com/swaggest/usecase/status"
clientv3 "go.etcd.io/etcd/client/v3"
"go.uber.org/zap"
)
func (r *Role) APIMetrics() usecase.Interactor {
u := usecase.NewInteractor(func(ctx context.Context, input struct{}, output *tsdbTypes.APIMetricsGetOutput) error {
prefix := r.i.KV().Key(
tsdbTypes.KeyRole,
types.KeyRole,
).Prefix(true).String()
rawMetrics, err := r.i.KV().Get(
ctx,
prefix,
clientv3.WithPrefix(),
)
if err != nil {
return status.Wrap(err, status.Internal)
}
for _, kv := range rawMetrics.Kvs {
value, err := strconv.ParseInt(string(kv.Value), 10, 0)
if err != nil {
r.log.Warn("failed to parse metric value", zap.Error(err))
continue
}
keyParts := strings.Split(strings.TrimPrefix(string(kv.Key), prefix), "/")
output.Records = append(output.Records, tsdbTypes.APIMetricsRecord{
Time: keyParts[2],
Handler: keyParts[0],
Node: keyParts[1],
Value: value,
})
}
return nil
})
u.SetName("dns.get_metrics")
u.SetTitle("DNS Metrics")
u.SetTags("roles/dns")
u.SetExpectedErrors(status.Internal)
return u
}