Skip to content

Commit 6cd53b4

Browse files
committed
add stream logger
1 parent 4368a05 commit 6cd53b4

File tree

1 file changed

+41
-0
lines changed

1 file changed

+41
-0
lines changed

internal/xtest/grpclogger.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,16 @@ package xtest
33
import (
44
"context"
55
"fmt"
6+
"sync/atomic"
67
"testing"
78

89
"github.com/golang/protobuf/jsonpb"
910
"github.com/golang/protobuf/proto"
1011
"google.golang.org/grpc"
1112
)
1213

14+
var globalLastStreamID int64 = 0
15+
1316
// GrpcLogger use for log raw grpc messages
1417
//
1518
// Usage:
@@ -32,6 +35,44 @@ func (l GrpcLogger) UnaryClientInterceptor(ctx context.Context, method string, r
3235
return err
3336
}
3437

38+
func (l GrpcLogger) StreamClientInterceptor(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, streamer grpc.Streamer, opts ...grpc.CallOption) (grpc.ClientStream, error) {
39+
stream, err := streamer(ctx, desc, cc, method, opts...)
40+
streamWrapper := newGrpcLoggerStream(stream, l.t)
41+
if stream != nil {
42+
stream = streamWrapper
43+
}
44+
l.t.Logf("StreamStart: %v with err '%v' (streamID: %v)", method, err, streamWrapper.streamID)
45+
return stream, err
46+
}
47+
48+
type grpcLoggerStream struct {
49+
grpc.ClientStream
50+
streamID int64
51+
t testing.TB
52+
}
53+
54+
func newGrpcLoggerStream(stream grpc.ClientStream, t testing.TB) grpcLoggerStream {
55+
return grpcLoggerStream{stream, atomic.AddInt64(&globalLastStreamID, 1), t}
56+
}
57+
58+
func (g grpcLoggerStream) CloseSend() error {
59+
err := g.ClientStream.CloseSend()
60+
g.t.Logf("CloseSend: %v (streamID: %v)", err, g.streamID)
61+
return err
62+
}
63+
64+
func (g grpcLoggerStream) SendMsg(m interface{}) error {
65+
err := g.ClientStream.SendMsg(m)
66+
g.t.Logf("SendMsg (streamID: %v) with err '%v':\n%v ", g.streamID, err, protoToString(m))
67+
return err
68+
}
69+
70+
func (g grpcLoggerStream) RecvMsg(m interface{}) error {
71+
err := g.ClientStream.RecvMsg(m)
72+
g.t.Logf("RecvMsg (streamID: %v) with err '%v':\n%v ", g.streamID, err, protoToString(m))
73+
return err
74+
}
75+
3576
func protoToString(v interface{}) string {
3677
if mess, ok := v.(proto.Message); ok {
3778
marshaler := jsonpb.Marshaler{}

0 commit comments

Comments
 (0)