From 02ab1ed7ee3031d8fbe2e3f82f0e2fd54e255470 Mon Sep 17 00:00:00 2001 From: tiancaiamao Date: Tue, 6 Aug 2019 14:18:31 +0800 Subject: [PATCH] executor,session: display the tree-like format of the trace statement (#11633) --- executor/adapter.go | 1 + executor/compiler.go | 1 + executor/executor.go | 2 ++ executor/trace.go | 24 ------------------------ executor/update.go | 6 ------ session/session.go | 2 ++ session/tidb.go | 1 + session/txn.go | 1 + 8 files changed, 8 insertions(+), 30 deletions(-) diff --git a/executor/adapter.go b/executor/adapter.go index cf61065498f1..c48a607f696b 100644 --- a/executor/adapter.go +++ b/executor/adapter.go @@ -398,6 +398,7 @@ func (a *ExecStmt) handleNoDelayExecutor(ctx context.Context, e Executor) (sqlex if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { span1 := span.Tracer().StartSpan("executor.handleNoDelayExecutor", opentracing.ChildOf(span.Context())) defer span1.Finish() + ctx = opentracing.ContextWithSpan(ctx, span1) } // Check if "tidb_snapshot" is set for the write executors. diff --git a/executor/compiler.go b/executor/compiler.go index 9190763fe68f..9c2bae6d34af 100644 --- a/executor/compiler.go +++ b/executor/compiler.go @@ -64,6 +64,7 @@ func (c *Compiler) compile(ctx context.Context, stmtNode ast.StmtNode, skipBind if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { span1 := span.Tracer().StartSpan("executor.Compile", opentracing.ChildOf(span.Context())) defer span1.Finish() + ctx = opentracing.ContextWithSpan(ctx, span1) } if !skipBind { diff --git a/executor/executor.go b/executor/executor.go index 32f1735f0979..73890001eee5 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -195,6 +195,7 @@ func Next(ctx context.Context, e Executor, req *chunk.Chunk) error { if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { span1 := span.Tracer().StartSpan(fmt.Sprintf("%T.Next", e), opentracing.ChildOf(span.Context())) defer span1.Finish() + ctx = opentracing.ContextWithSpan(ctx, span1) } return e.Next(ctx, req) } @@ -907,6 +908,7 @@ func init() { if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { span1 := span.Tracer().StartSpan("executor.EvalSubQuery", opentracing.ChildOf(span.Context())) defer span1.Finish() + ctx = opentracing.ContextWithSpan(ctx, span1) } e := &executorBuilder{is: is, ctx: sctx} diff --git a/executor/trace.go b/executor/trace.go index 9d30e21ebd94..92644c28015f 100644 --- a/executor/trace.go +++ b/executor/trace.go @@ -16,7 +16,6 @@ package executor import ( "context" "encoding/json" - "sort" "time" "github.com/opentracing/basictracer-go" @@ -91,7 +90,6 @@ func (e *TraceExec) Next(ctx context.Context, req *chunk.Chunk) error { return nil } trace := traces[0] - sortTraceByStartTime(trace) dfsTree(trace, "", false, req) e.exhausted = true return nil @@ -131,28 +129,6 @@ func drainRecordSet(ctx context.Context, sctx sessionctx.Context, rs sqlexec.Rec } } -type sortByStartTime []*appdash.Trace - -func (t sortByStartTime) Len() int { return len(t) } -func (t sortByStartTime) Less(i, j int) bool { - return getStartTime(t[j]).After(getStartTime(t[i])) -} -func (t sortByStartTime) Swap(i, j int) { t[i], t[j] = t[j], t[i] } - -func getStartTime(trace *appdash.Trace) (t time.Time) { - if e, err := trace.TimespanEvent(); err == nil { - t = e.Start() - } - return -} - -func sortTraceByStartTime(trace *appdash.Trace) { - sort.Sort(sortByStartTime(trace.Sub)) - for _, t := range trace.Sub { - sortTraceByStartTime(t) - } -} - func dfsTree(t *appdash.Trace, prefix string, isLast bool, chk *chunk.Chunk) { var newPrefix, suffix string if len(prefix) == 0 { diff --git a/executor/update.go b/executor/update.go index 2ac64ad2ed07..11538c1c8df1 100644 --- a/executor/update.go +++ b/executor/update.go @@ -17,7 +17,6 @@ import ( "context" "fmt" - "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" @@ -129,11 +128,6 @@ func (e *UpdateExec) canNotUpdate(handle types.Datum) bool { // Next implements the Executor Next interface. func (e *UpdateExec) Next(ctx context.Context, req *chunk.Chunk) error { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("update.Next", opentracing.ChildOf(span.Context())) - defer span1.Finish() - } - req.Reset() if !e.fetched { err := e.fetchChunkRows(ctx) diff --git a/session/session.go b/session/session.go index 84db86e0e6b7..236c78955e64 100644 --- a/session/session.go +++ b/session/session.go @@ -499,6 +499,7 @@ func (s *session) CommitTxn(ctx context.Context) error { if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { span1 := span.Tracer().StartSpan("session.CommitTxn", opentracing.ChildOf(span.Context())) defer span1.Finish() + ctx = opentracing.ContextWithSpan(ctx, span1) } var commitDetail *execdetails.CommitDetails @@ -1027,6 +1028,7 @@ func (s *session) Execute(ctx context.Context, sql string) (recordSets []sqlexec if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { span1 := span.Tracer().StartSpan("session.Execute", opentracing.ChildOf(span.Context())) defer span1.Finish() + ctx = opentracing.ContextWithSpan(ctx, span1) } if recordSets, err = s.execute(ctx, sql); err != nil { s.sessionVars.StmtCtx.AppendError(err) diff --git a/session/tidb.go b/session/tidb.go index 70c3f9a9665c..1834367da4e3 100644 --- a/session/tidb.go +++ b/session/tidb.go @@ -207,6 +207,7 @@ func runStmt(ctx context.Context, sctx sessionctx.Context, s sqlexec.Statement) span1 := span.Tracer().StartSpan("session.runStmt", opentracing.ChildOf(span.Context())) span1.LogKV("sql", s.OriginText()) defer span1.Finish() + ctx = opentracing.ContextWithSpan(ctx, span1) } se := sctx.(*session) defer func() { diff --git a/session/txn.go b/session/txn.go index ca1473975995..fca3be468b7f 100644 --- a/session/txn.go +++ b/session/txn.go @@ -399,6 +399,7 @@ func (s *session) getTxnFuture(ctx context.Context) *txnFuture { if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { span1 := span.Tracer().StartSpan("session.getTxnFuture", opentracing.ChildOf(span.Context())) defer span1.Finish() + ctx = opentracing.ContextWithSpan(ctx, span1) } oracleStore := s.store.GetOracle()