interceptors: migrate to otel and add logging interceptor

Signed-off-by: Adphi <philippe.adrien.nousse@gmail.com>
This commit is contained in:
2024-10-17 17:15:05 +02:00
parent 9591a64e09
commit 3a3d77169c
41 changed files with 2817 additions and 852 deletions

View File

@ -1,14 +1,24 @@
package metrics
import (
grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus"
"context"
grpc_prometheus "github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus"
"github.com/prometheus/client_golang/prometheus"
"go.opentelemetry.io/otel/trace"
"google.golang.org/grpc"
"go.linka.cloud/grpc-toolkit/interceptors"
"go.linka.cloud/grpc-toolkit/service"
)
func DefaultExemplarFromCtx(ctx context.Context) prometheus.Labels {
if span := trace.SpanContextFromContext(ctx); span.IsSampled() {
return prometheus.Labels{"traceID": span.TraceID().String()}
}
return nil
}
type Registerer interface {
Register(svc service.Service)
}
@ -22,11 +32,6 @@ type ServerInterceptors interface {
Registerer
interceptors.ServerInterceptors
prometheus.Collector
EnableHandlingTimeHistogram(opts ...grpc_prometheus.HistogramOption)
EnableClientHandlingTimeHistogram(opts ...grpc_prometheus.HistogramOption)
EnableClientStreamReceiveTimeHistogram(opts ...grpc_prometheus.HistogramOption)
EnableClientStreamSendTimeHistogram(opts ...grpc_prometheus.HistogramOption)
}
type ClientInterceptors interface {
@ -36,46 +41,7 @@ type ClientInterceptors interface {
type metrics struct {
s *grpc_prometheus.ServerMetrics
c *grpc_prometheus.ClientMetrics
}
func (m *metrics) EnableHandlingTimeHistogram(opts ...grpc_prometheus.HistogramOption) {
if m.s != nil {
if m.s == grpc_prometheus.DefaultServerMetrics {
grpc_prometheus.EnableHandlingTimeHistogram(opts...)
} else {
m.s.EnableHandlingTimeHistogram(opts...)
}
}
}
func (m *metrics) EnableClientHandlingTimeHistogram(opts ...grpc_prometheus.HistogramOption) {
if m.c != nil {
if m.c == grpc_prometheus.DefaultClientMetrics {
grpc_prometheus.EnableClientHandlingTimeHistogram(opts...)
} else {
m.c.EnableClientHandlingTimeHistogram(opts...)
}
}
}
func (m *metrics) EnableClientStreamReceiveTimeHistogram(opts ...grpc_prometheus.HistogramOption) {
if m.c != nil {
if m.c == grpc_prometheus.DefaultClientMetrics {
grpc_prometheus.EnableClientStreamReceiveTimeHistogram(opts...)
} else {
m.c.EnableClientStreamReceiveTimeHistogram(opts...)
}
}
}
func (m *metrics) EnableClientStreamSendTimeHistogram(opts ...grpc_prometheus.HistogramOption) {
if m.c != nil {
if m.c == grpc_prometheus.DefaultClientMetrics {
grpc_prometheus.EnableClientStreamSendTimeHistogram(opts...)
} else {
m.c.EnableClientStreamSendTimeHistogram(opts...)
}
}
o *options
}
func (m *metrics) Describe(descs chan<- *prometheus.Desc) {
@ -96,36 +62,45 @@ func (m *metrics) Register(svc service.Service) {
}
}
func NewInterceptors(opts ...grpc_prometheus.CounterOption) Interceptors {
s := grpc_prometheus.NewServerMetrics(opts...)
c := grpc_prometheus.NewClientMetrics(opts...)
return &metrics{s: s, c: c}
func NewInterceptors(opts ...Option) Interceptors {
o := (&options{}).apply(opts...)
s := grpc_prometheus.NewServerMetrics(
grpc_prometheus.WithServerCounterOptions(o.copts...),
grpc_prometheus.WithServerHandlingTimeHistogram(o.hopts...),
)
c := grpc_prometheus.NewClientMetrics(
grpc_prometheus.WithClientCounterOptions(o.copts...),
grpc_prometheus.WithClientHandlingTimeHistogram(o.hopts...),
)
m := &metrics{s: s, c: c, o: o}
o.reg.MustRegister(m)
return m
}
func NewServerInterceptors(opts ...grpc_prometheus.CounterOption) ServerInterceptors {
s := grpc_prometheus.NewServerMetrics(opts...)
return &metrics{s: s}
func NewServerInterceptors(opts ...Option) ServerInterceptors {
o := (&options{}).apply(opts...)
s := grpc_prometheus.NewServerMetrics(
grpc_prometheus.WithServerCounterOptions(o.copts...),
grpc_prometheus.WithServerHandlingTimeHistogram(o.hopts...),
)
m := &metrics{s: s, o: o}
o.reg.MustRegister(m)
return m
}
func NewClientInterceptors(opts ...grpc_prometheus.CounterOption) ClientInterceptors {
c := grpc_prometheus.NewClientMetrics(opts...)
return &metrics{c: c}
}
func DefaultInterceptors() Interceptors {
return &metrics{s: grpc_prometheus.DefaultServerMetrics, c: grpc_prometheus.DefaultClientMetrics}
}
func DefaultServerInterceptors() ServerInterceptors {
return &metrics{s: grpc_prometheus.DefaultServerMetrics}
}
func DefaultClientInterceptors() ClientInterceptors {
return &metrics{c: grpc_prometheus.DefaultClientMetrics}
func NewClientInterceptors(opts ...Option) ClientInterceptors {
o := (&options{}).apply(opts...)
c := grpc_prometheus.NewClientMetrics(
grpc_prometheus.WithClientCounterOptions(o.copts...),
grpc_prometheus.WithClientHandlingTimeHistogram(o.hopts...),
)
m := &metrics{c: c, o: o}
o.reg.MustRegister(m)
return m
}
func (m *metrics) UnaryServerInterceptor() grpc.UnaryServerInterceptor {
return m.s.UnaryServerInterceptor()
return m.s.UnaryServerInterceptor(grpc_prometheus.WithExemplarFromContext(m.o.fn))
}
func (m *metrics) StreamServerInterceptor() grpc.StreamServerInterceptor {