Skip to content

Commit

Permalink
ref: instrumented grpc proxy with otel
Browse files Browse the repository at this point in the history
  • Loading branch information
kenriortega committed Nov 14, 2021
1 parent fd08b3d commit b2f214b
Showing 1 changed file with 55 additions and 3 deletions.
58 changes: 55 additions & 3 deletions cmd/cli/grpcxy.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,11 @@ import (

"github.com/kenriortega/ngonx/pkg/errors"
"github.com/kenriortega/ngonx/pkg/logger"
"github.com/kenriortega/ngonx/pkg/otelify"
"github.com/spf13/cobra"
"github.com/talos-systems/grpc-proxy/proxy"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/trace"
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/credentials"
Expand All @@ -25,6 +28,25 @@ var grpcCmd = &cobra.Command{
Use: "grpc",
Short: "Run ngonx as a grpc proxy",
Run: func(cmd *cobra.Command, args []string) {

enableMetric, err := cmd.Flags().GetBool(flagMetric)
if err != nil {
logger.LogError(errors.Errorf("proxy: %v", err).Error())
}
if enableMetric {
// TODO: pass from compile vars
flush := otelify.InitProvider(
"ngonx",
"v0.4.5",
"dev",
// TODO: pass from yml file object
"0.0.0.0:55680",
)
defer flush()
// Exporter Metrics
go otelify.ExposeMetricServer(configFromYaml.ProxyGateway.PortExporterProxy)
}

var opts []grpc.ServerOption

lis, err := net.Listen("tcp", configFromYaml.GrpcProxy.Listener)
Expand All @@ -34,14 +56,19 @@ var grpcCmd = &cobra.Command{

logger.LogInfo(fmt.Sprintf("Proxy running at %q\n", configFromYaml.GrpcProxy.Listener))
simpleBackendGen := func(hostname string) proxy.Backend {
ctx, span := otel.Tracer("grpcxy.simpleBackendGen").Start(context.Background(), "simpleBackendGen")
defer span.End()
traceID := trace.SpanContextFromContext(ctx).TraceID().String()
return &proxy.SingleBackend{
GetConn: func(ctx context.Context) (context.Context, *grpc.ClientConn, error) {
md, _ := metadata.FromIncomingContext(ctx)

outCtx := metadata.NewOutgoingContext(ctx, md.Copy())
if configFromYaml.GrpcSSL.Enable {
creds, sslErr := credentials.NewClientTLSFromFile(
configFromYaml.GrpcClientCert, "")
configFromYaml.GrpcClientCert,
"",
)
if sslErr != nil {
logger.LogError(errors.Errorf("grpc: failed to parse credentials: %v", sslErr).Error())
}
Expand All @@ -51,6 +78,10 @@ var grpcCmd = &cobra.Command{
grpc.WithTransportCredentials(creds),
grpc.WithCodec(proxy.Codec()),
) //nolint: staticcheck
if err != nil {
otelify.InstrumentedError(span, "grpcxy.grpc.DialContext", traceID, err)
}
otelify.InstrumentedInfo(span, "grpcxy.grpc.DialContext", traceID)
return outCtx, conn, err
}
conn, err := grpc.DialContext(
Expand All @@ -59,27 +90,48 @@ var grpcCmd = &cobra.Command{
grpc.WithInsecure(),
grpc.WithCodec(proxy.Codec()),
) //nolint: staticcheck

if err != nil {
otelify.InstrumentedError(span, "grpcxy.grpc.DialContext", traceID, err)
}
otelify.InstrumentedInfo(span, "grpcxy.grpc.DialContext", traceID)
return outCtx, conn, err
},
}
}

director = func(ctx context.Context, fullMethodName string) (proxy.Mode, []proxy.Backend, error) {
ctx, span := otel.Tracer("grpcxy.director").Start(context.Background(), "director")
defer span.End()
traceID := trace.SpanContextFromContext(ctx).TraceID().String()
for _, bkd := range configFromYaml.GrpcEndpoints {
// Make sure we never forward internal services.
if !strings.HasPrefix(fullMethodName, bkd.Name) {
otelify.InstrumentedError(
span,
"grpcxy.not.strings.HasPrefix",
traceID,
errors.NewError("Unknown method"),
)

return proxy.One2One, nil, status.Errorf(codes.Unimplemented, "Unknown method")
}
md, ok := metadata.FromIncomingContext(ctx)
if ok {
if _, exists := md[":authority"]; exists {
otelify.InstrumentedInfo(span, "director.proxy.One2One", traceID)

return proxy.One2One, []proxy.Backend{
simpleBackendGen(bkd.HostURI),
}, nil
}
}
}
otelify.InstrumentedError(
span,
"grpcxy.One2One",
traceID,
errors.NewError("Unknown method"),
)
return proxy.One2One, nil, status.Errorf(codes.Unimplemented, "Unknown method")
}
opts = append(opts,
Expand Down Expand Up @@ -110,7 +162,7 @@ var grpcCmd = &cobra.Command{
}

func init() {

grpcCmd.Flags().Bool(flagMetric, false, "Action for enable metrics OTEL")
rootCmd.AddCommand(grpcCmd)
}

Expand Down

0 comments on commit b2f214b

Please sign in to comment.