stats: add BeginTime to stats.End (#1907)
This commit is contained in:

committed by
dfawley

parent
3a9e1bab62
commit
2c2d834e8e
12
server.go
12
server.go
@ -777,13 +777,15 @@ func (s *Server) sendResponse(t transport.ServerTransport, stream *transport.Str
|
|||||||
func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport.Stream, srv *service, md *MethodDesc, trInfo *traceInfo) (err error) {
|
func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport.Stream, srv *service, md *MethodDesc, trInfo *traceInfo) (err error) {
|
||||||
sh := s.opts.statsHandler
|
sh := s.opts.statsHandler
|
||||||
if sh != nil {
|
if sh != nil {
|
||||||
|
beginTime := time.Now()
|
||||||
begin := &stats.Begin{
|
begin := &stats.Begin{
|
||||||
BeginTime: time.Now(),
|
BeginTime: beginTime,
|
||||||
}
|
}
|
||||||
sh.HandleRPC(stream.Context(), begin)
|
sh.HandleRPC(stream.Context(), begin)
|
||||||
defer func() {
|
defer func() {
|
||||||
end := &stats.End{
|
end := &stats.End{
|
||||||
EndTime: time.Now(),
|
BeginTime: beginTime,
|
||||||
|
EndTime: time.Now(),
|
||||||
}
|
}
|
||||||
if err != nil && err != io.EOF {
|
if err != nil && err != io.EOF {
|
||||||
end.Error = toRPCErr(err)
|
end.Error = toRPCErr(err)
|
||||||
@ -977,13 +979,15 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport.
|
|||||||
func (s *Server) processStreamingRPC(t transport.ServerTransport, stream *transport.Stream, srv *service, sd *StreamDesc, trInfo *traceInfo) (err error) {
|
func (s *Server) processStreamingRPC(t transport.ServerTransport, stream *transport.Stream, srv *service, sd *StreamDesc, trInfo *traceInfo) (err error) {
|
||||||
sh := s.opts.statsHandler
|
sh := s.opts.statsHandler
|
||||||
if sh != nil {
|
if sh != nil {
|
||||||
|
beginTime := time.Now()
|
||||||
begin := &stats.Begin{
|
begin := &stats.Begin{
|
||||||
BeginTime: time.Now(),
|
BeginTime: beginTime,
|
||||||
}
|
}
|
||||||
sh.HandleRPC(stream.Context(), begin)
|
sh.HandleRPC(stream.Context(), begin)
|
||||||
defer func() {
|
defer func() {
|
||||||
end := &stats.End{
|
end := &stats.End{
|
||||||
EndTime: time.Now(),
|
BeginTime: beginTime,
|
||||||
|
EndTime: time.Now(),
|
||||||
}
|
}
|
||||||
if err != nil && err != io.EOF {
|
if err != nil && err != io.EOF {
|
||||||
end.Error = toRPCErr(err)
|
end.Error = toRPCErr(err)
|
||||||
|
@ -169,6 +169,8 @@ func (s *OutTrailer) isRPCStats() {}
|
|||||||
type End struct {
|
type End struct {
|
||||||
// Client is true if this End is from client side.
|
// Client is true if this End is from client side.
|
||||||
Client bool
|
Client bool
|
||||||
|
// BeginTime is the time when the RPC began.
|
||||||
|
BeginTime time.Time
|
||||||
// EndTime is the time when the RPC ends.
|
// EndTime is the time when the RPC ends.
|
||||||
EndTime time.Time
|
EndTime time.Time
|
||||||
// Error is the error the RPC ended with. It is an error generated from
|
// Error is the error the RPC ended with. It is an error generated from
|
||||||
|
@ -638,6 +638,9 @@ func checkEnd(t *testing.T, d *gotData, e *expectedData) {
|
|||||||
if d.ctx == nil {
|
if d.ctx == nil {
|
||||||
t.Fatalf("d.ctx = nil, want <non-nil>")
|
t.Fatalf("d.ctx = nil, want <non-nil>")
|
||||||
}
|
}
|
||||||
|
if st.BeginTime.IsZero() {
|
||||||
|
t.Fatalf("st.BeginTime = %v, want <non-zero>", st.BeginTime)
|
||||||
|
}
|
||||||
if st.EndTime.IsZero() {
|
if st.EndTime.IsZero() {
|
||||||
t.Fatalf("st.EndTime = %v, want <non-zero>", st.EndTime)
|
t.Fatalf("st.EndTime = %v, want <non-zero>", st.EndTime)
|
||||||
}
|
}
|
||||||
|
19
stream.go
19
stream.go
@ -205,11 +205,13 @@ func newClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, meth
|
|||||||
}
|
}
|
||||||
ctx = newContextWithRPCInfo(ctx, c.failFast)
|
ctx = newContextWithRPCInfo(ctx, c.failFast)
|
||||||
sh := cc.dopts.copts.StatsHandler
|
sh := cc.dopts.copts.StatsHandler
|
||||||
|
var beginTime time.Time
|
||||||
if sh != nil {
|
if sh != nil {
|
||||||
ctx = sh.TagRPC(ctx, &stats.RPCTagInfo{FullMethodName: method, FailFast: c.failFast})
|
ctx = sh.TagRPC(ctx, &stats.RPCTagInfo{FullMethodName: method, FailFast: c.failFast})
|
||||||
|
beginTime = time.Now()
|
||||||
begin := &stats.Begin{
|
begin := &stats.Begin{
|
||||||
Client: true,
|
Client: true,
|
||||||
BeginTime: time.Now(),
|
BeginTime: beginTime,
|
||||||
FailFast: c.failFast,
|
FailFast: c.failFast,
|
||||||
}
|
}
|
||||||
sh.HandleRPC(ctx, begin)
|
sh.HandleRPC(ctx, begin)
|
||||||
@ -217,8 +219,10 @@ func newClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, meth
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
// Only handle end stats if err != nil.
|
// Only handle end stats if err != nil.
|
||||||
end := &stats.End{
|
end := &stats.End{
|
||||||
Client: true,
|
Client: true,
|
||||||
Error: err,
|
Error: err,
|
||||||
|
BeginTime: beginTime,
|
||||||
|
EndTime: time.Now(),
|
||||||
}
|
}
|
||||||
sh.HandleRPC(ctx, end)
|
sh.HandleRPC(ctx, end)
|
||||||
}
|
}
|
||||||
@ -283,6 +287,7 @@ func newClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, meth
|
|||||||
|
|
||||||
statsCtx: ctx,
|
statsCtx: ctx,
|
||||||
statsHandler: cc.dopts.copts.StatsHandler,
|
statsHandler: cc.dopts.copts.StatsHandler,
|
||||||
|
beginTime: beginTime,
|
||||||
}
|
}
|
||||||
if desc != unaryStreamDesc {
|
if desc != unaryStreamDesc {
|
||||||
// Listen on cc and stream contexts to cleanup when the user closes the
|
// Listen on cc and stream contexts to cleanup when the user closes the
|
||||||
@ -337,6 +342,7 @@ type clientStream struct {
|
|||||||
// so that all the generated stats for a particular RPC can be associated in the processing phase.
|
// so that all the generated stats for a particular RPC can be associated in the processing phase.
|
||||||
statsCtx context.Context
|
statsCtx context.Context
|
||||||
statsHandler stats.Handler
|
statsHandler stats.Handler
|
||||||
|
beginTime time.Time
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cs *clientStream) Context() context.Context {
|
func (cs *clientStream) Context() context.Context {
|
||||||
@ -512,9 +518,10 @@ func (cs *clientStream) finish(err error) {
|
|||||||
}
|
}
|
||||||
if cs.statsHandler != nil {
|
if cs.statsHandler != nil {
|
||||||
end := &stats.End{
|
end := &stats.End{
|
||||||
Client: true,
|
Client: true,
|
||||||
EndTime: time.Now(),
|
BeginTime: cs.beginTime,
|
||||||
Error: err,
|
EndTime: time.Now(),
|
||||||
|
Error: err,
|
||||||
}
|
}
|
||||||
cs.statsHandler.HandleRPC(cs.statsCtx, end)
|
cs.statsHandler.HandleRPC(cs.statsCtx, end)
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user