mirror of
https://github.com/linka-cloud/grpc.git
synced 2025-06-22 01:02:29 +00:00
interceptors: migrate to otel and add logging interceptor
Signed-off-by: Adphi <philippe.adrien.nousse@gmail.com>
This commit is contained in:
95
example/service.go
Normal file
95
example/service.go
Normal file
@ -0,0 +1,95 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
logging2 "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/logging"
|
||||
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
|
||||
"go.opentelemetry.io/otel/trace"
|
||||
|
||||
"go.linka.cloud/grpc-tookit/example/pb"
|
||||
"go.linka.cloud/grpc-toolkit/interceptors/auth"
|
||||
"go.linka.cloud/grpc-toolkit/interceptors/ban"
|
||||
"go.linka.cloud/grpc-toolkit/interceptors/defaulter"
|
||||
"go.linka.cloud/grpc-toolkit/interceptors/iface"
|
||||
"go.linka.cloud/grpc-toolkit/interceptors/logging"
|
||||
metrics2 "go.linka.cloud/grpc-toolkit/interceptors/metrics"
|
||||
"go.linka.cloud/grpc-toolkit/interceptors/tracing"
|
||||
validation2 "go.linka.cloud/grpc-toolkit/interceptors/validation"
|
||||
"go.linka.cloud/grpc-toolkit/logger"
|
||||
"go.linka.cloud/grpc-toolkit/service"
|
||||
)
|
||||
|
||||
func newService(ctx context.Context, opts ...service.Option) (service.Service, error) {
|
||||
log := logger.C(ctx)
|
||||
metrics := metrics2.NewInterceptors(metrics2.WithExemplarFromContext(metrics2.DefaultExemplarFromCtx))
|
||||
|
||||
address := "0.0.0.0:9991"
|
||||
|
||||
var svc service.Service
|
||||
opts = append(opts,
|
||||
service.WithContext(ctx),
|
||||
service.WithAddress(address),
|
||||
// service.WithRegistry(mdns.NewRegistry()),
|
||||
service.WithReflection(true),
|
||||
service.WithoutCmux(),
|
||||
service.WithGateway(pb.RegisterGreeterHandler),
|
||||
service.WithGatewayPrefix("/rest"),
|
||||
service.WithGRPCWeb(true),
|
||||
service.WithGRPCWebPrefix("/grpc"),
|
||||
service.WithMiddlewares(otelhttp.NewMiddleware("hello"), httpLogger),
|
||||
service.WithInterceptors(
|
||||
tracing.NewInterceptors(),
|
||||
metrics,
|
||||
logging.New(ctx, logging2.WithFieldsFromContext(func(ctx context.Context) logging2.Fields {
|
||||
if span := trace.SpanContextFromContext(ctx); span.IsSampled() {
|
||||
return logging2.Fields{"traceID", span.TraceID().String()}
|
||||
}
|
||||
return nil
|
||||
})),
|
||||
),
|
||||
service.WithServerInterceptors(
|
||||
ban.NewInterceptors(ban.WithDefaultJailDuration(time.Second), ban.WithDefaultCallback(func(action ban.Action, actor string, rule *ban.Rule) error {
|
||||
log.WithFields("action", action, "actor", actor, "rule", rule.Name).Info("ban callback")
|
||||
return nil
|
||||
})),
|
||||
auth.NewServerInterceptors(auth.WithBasicValidators(func(ctx context.Context, user, password string) (context.Context, error) {
|
||||
if !auth.Equals(user, "admin") || !auth.Equals(password, "admin") {
|
||||
return ctx, fmt.Errorf("invalid user or password")
|
||||
}
|
||||
log.Infof("request authenticated")
|
||||
return ctx, nil
|
||||
})),
|
||||
),
|
||||
service.WithInterceptors(
|
||||
defaulter.NewInterceptors(),
|
||||
validation2.NewInterceptors(true),
|
||||
),
|
||||
// enable server interface interceptor
|
||||
service.WithServerInterceptors(iface.New()),
|
||||
)
|
||||
svc, err := service.New(opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
pb.RegisterGreeterServer(svc, &GreeterHandler{})
|
||||
metrics.Register(svc)
|
||||
return svc, nil
|
||||
}
|
||||
|
||||
func httpLogger(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
|
||||
start := time.Now()
|
||||
log := logger.From(request.Context()).WithFields(
|
||||
"method", request.Method,
|
||||
"host", request.Host,
|
||||
"path", request.URL.Path,
|
||||
"remoteAddress", request.RemoteAddr,
|
||||
)
|
||||
next.ServeHTTP(writer, request)
|
||||
log.WithField("duration", time.Since(start)).Info()
|
||||
})
|
||||
}
|
Reference in New Issue
Block a user