/
metric_interceptor.go
45 lines (39 loc) · 1.21 KB
/
metric_interceptor.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
package server
import (
"context"
"github.com/kuan525/grpcwrapper/prome"
"github.com/kuan525/grpcwrapper/util"
"time"
"github.com/prometheus/client_golang/prometheus"
"google.golang.org/grpc"
"google.golang.org/grpc/status"
)
const nameSpace = "grpcwrapper_server"
var (
serverHandleCounter = prome.NewCounterVec(
prometheus.CounterOpts{
Namespace: nameSpace,
Subsystem: "req",
Name: "client_handle_total",
},
[]string{"method", "server", "code", "ip"},
)
serverHandleHistogram = prome.NewHistogramVec(
prometheus.HistogramOpts{
Namespace: nameSpace,
Subsystem: "req",
Name: "client_handle_seconds",
},
[]string{"method", "server", "ip"},
)
)
func MetricUnaryServerInterceptor(serverName string) grpc.UnaryServerInterceptor {
return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) {
beg := time.Now()
resp, err = handler(ctx, req)
code := status.Code(err)
serverHandleCounter.WithLabelValues(info.FullMethod, serverName, code.String(), util.ExternaIP()).Inc()
serverHandleHistogram.WithLabelValues(info.FullMethod, serverName, util.ExternaIP()).Observe(time.Since(beg).Seconds())
return
}
}