35 lines
970 B
Go
35 lines
970 B
Go
package grpc
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
|
|
"github.com/letsencrypt/boulder/metrics"
|
|
|
|
"github.com/jmhodges/clock"
|
|
"golang.org/x/net/context"
|
|
"google.golang.org/grpc"
|
|
)
|
|
|
|
type serverInterceptor struct {
|
|
stats metrics.Scope
|
|
clk clock.Clock
|
|
}
|
|
|
|
func (si *serverInterceptor) intercept(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
|
|
if info == nil {
|
|
si.stats.Inc("gRPC.NoInfo", 1)
|
|
return nil, errors.New("passed nil *grpc.UnaryServerInfo")
|
|
}
|
|
si.stats.Inc(fmt.Sprintf("gRPC.%s", info.FullMethod), 1)
|
|
si.stats.GaugeDelta(fmt.Sprintf("gRPC.%s.InProgress", info.FullMethod), 1)
|
|
s := si.clk.Now()
|
|
resp, err := handler(ctx, req)
|
|
si.stats.TimingDuration(fmt.Sprintf("gRPC.%s", info.FullMethod), si.clk.Now().Sub(s))
|
|
si.stats.GaugeDelta(fmt.Sprintf("gRPC.%s.InProgress", info.FullMethod), -1)
|
|
if err != nil {
|
|
si.stats.Inc(fmt.Sprintf("gRPC.%s.Failed", info.FullMethod), 1)
|
|
}
|
|
return resp, err
|
|
}
|