diff --git a/pkg/rpcinfo/tracer.go b/pkg/rpcinfo/tracer.go index 0ae6cde695..f1783202cd 100644 --- a/pkg/rpcinfo/tracer.go +++ b/pkg/rpcinfo/tracer.go @@ -18,6 +18,7 @@ package rpcinfo import ( "context" + "errors" "io" "runtime/debug" @@ -75,7 +76,7 @@ func (c *TraceController) DoFinish(ctx context.Context, ri RPCInfo, err error) { } func buildStreamingEvent(statsEvent stats.Event, err error) Event { - if err == nil || err == io.EOF { + if err == nil { return NewEvent(statsEvent, stats.StatusInfo, "") } else { return NewEvent(statsEvent, stats.StatusError, err.Error()) @@ -87,6 +88,11 @@ func (c *TraceController) ReportStreamEvent(ctx context.Context, statsEvent stat if !c.HasStreamEventReporter() { return } + // we should ignore event if stream.RecvMsg return EOF + // because it means there is no data incoming and stream closed by peer normally + if errors.Is(err, io.EOF) { + return + } defer c.tryRecover(ctx) event := buildStreamingEvent(statsEvent, err) defer func() { diff --git a/pkg/rpcinfo/tracer_test.go b/pkg/rpcinfo/tracer_test.go index e1b596513b..3d7e114a50 100644 --- a/pkg/rpcinfo/tracer_test.go +++ b/pkg/rpcinfo/tracer_test.go @@ -181,13 +181,6 @@ func Test_buildStreamingEvent(t *testing.T) { test.Assert(t, evt.Info() == "") }) - t.Run("io.EOF", func(t *testing.T) { - evt := buildStreamingEvent(stats.StreamSend, io.EOF) - test.Assert(t, evt.Event() == stats.StreamSend) - test.Assert(t, evt.Status() == stats.StatusInfo) - test.Assert(t, evt.Info() == "") - }) - t.Run("error", func(t *testing.T) { err := errors.New("XXX") evt := buildStreamingEvent(stats.StreamSend, err)