From 50007e1d21103c0e6041f0cff11c79f715db03d6 Mon Sep 17 00:00:00 2001 From: Bradley Kemp Date: Mon, 29 Jul 2019 18:09:02 +0100 Subject: [PATCH 1/2] Fix errors not being proxied to client --- grpc-dump/dump/dump.go | 4 +++- grpc-dump/dump/dump_interceptor.go | 16 ++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/grpc-dump/dump/dump.go b/grpc-dump/dump/dump.go index da3e59f..cb2f032 100644 --- a/grpc-dump/dump/dump.go +++ b/grpc-dump/dump/dump.go @@ -3,6 +3,7 @@ package dump import ( "github.com/bradleyjkemp/grpc-tools/grpc-proxy" "github.com/bradleyjkemp/grpc-tools/internal/proto_decoder" + "github.com/sirupsen/logrus" "io" "strings" ) @@ -24,7 +25,8 @@ func Run(output io.Writer, protoRoots, protoDescriptors string, proxyConfig ...g resolvers = append(resolvers, r) } - opts := append(proxyConfig, grpc_proxy.WithInterceptor(dumpInterceptor(output, proto_decoder.NewDecoder(resolvers...)))) + // TODO: unify this logger with the one provided by grpc_proxy? + opts := append(proxyConfig, grpc_proxy.WithInterceptor(dumpInterceptor(logrus.New(), output, proto_decoder.NewDecoder(resolvers...)))) proxy, err := grpc_proxy.New( opts..., ) diff --git a/grpc-dump/dump/dump_interceptor.go b/grpc-dump/dump/dump_interceptor.go index 9fa8141..a86ec48 100644 --- a/grpc-dump/dump/dump_interceptor.go +++ b/grpc-dump/dump/dump_interceptor.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/bradleyjkemp/grpc-tools/internal" "github.com/bradleyjkemp/grpc-tools/internal/proto_decoder" + "github.com/sirupsen/logrus" "google.golang.org/grpc" "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" @@ -13,13 +14,13 @@ import ( ) // dump interceptor implements a gRPC.StreamingServerInterceptor that dumps all RPC details -func dumpInterceptor(output io.Writer, decoder proto_decoder.MessageDecoder) grpc.StreamServerInterceptor { +func dumpInterceptor(logger logrus.FieldLogger, output io.Writer, decoder proto_decoder.MessageDecoder) grpc.StreamServerInterceptor { return func(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { dss := &recordedServerStream{ServerStream: ss} - err := handler(srv, dss) + rpcErr := handler(srv, dss) var rpcStatus *internal.Status - if err != nil { - grpcStatus, _ := status.FromError(err) + if rpcErr != nil { + grpcStatus, _ := status.FromError(rpcErr) rpcStatus = &internal.Status{ Code: grpcStatus.Code().String(), Message: grpcStatus.Message(), @@ -36,13 +37,16 @@ func dumpInterceptor(output io.Writer, decoder proto_decoder.MessageDecoder) grp Metadata: md, } + var err error for _, message := range rpc.Messages { message.Message, err = decoder.Decode(info.FullMethod, message) - // TODO: log warning if error occurs here + if err != nil { + logger.WithError(err).Warn("Failed to decode message") + } } dump, _ := json.Marshal(rpc) fmt.Fprintln(output, string(dump)) - return err + return rpcErr } } From 7e9fa7ed8456430948240e193a76c13ca74a53a0 Mon Sep 17 00:00:00 2001 From: Bradley Kemp Date: Mon, 29 Jul 2019 18:14:16 +0100 Subject: [PATCH 2/2] Add changelog entry --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee19943..5211d7d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Changelog -## v0.2.1 (unreleased) +## [v0.2.1](https://github.com/bradleyjkemp/grpc-tools/releases/tag/v0.2.1) +* Fixed bug where `grpc-dump` would not forward errors from server to client [#45](https://github.com/bradleyjkemp/grpc-tools/pull/45). * `grpc-proxy` now will transparently forward all non-HTTP traffic to the original destination [#28](https://github.com/bradleyjkemp/grpc-tools/pull/28). * When the `--proto_roots` or `--proto_descriptors` flags are used, `grpc-replay` and `grpc-fixture` will marshall messages from the human readable form instead of using the raw message.