Skip to content

Commit

Permalink
*: make transaction duration metrics more reasonable (pingcap#13444)
Browse files Browse the repository at this point in the history
  • Loading branch information
jackysp authored and sre-bot committed Nov 15, 2019
1 parent 161a2eb commit 39a6f7f
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 15 deletions.
15 changes: 14 additions & 1 deletion executor/simple.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (
"fmt"
"os"
"strings"
"time"

"github.com/ngaut/pools"
"github.com/pingcap/errors"
Expand All @@ -30,6 +31,7 @@ import (
"github.com/pingcap/tidb/domain"
"github.com/pingcap/tidb/infoschema"
"github.com/pingcap/tidb/kv"
"github.com/pingcap/tidb/metrics"
"github.com/pingcap/tidb/planner/core"
"github.com/pingcap/tidb/plugin"
"github.com/pingcap/tidb/privilege"
Expand All @@ -41,6 +43,11 @@ import (
"go.uber.org/zap"
)

var (
transactionDurationInternalRollback = metrics.TransactionDuration.WithLabelValues(metrics.LblInternal, metrics.LblRollback)
transactionDurationGeneralRollback = metrics.TransactionDuration.WithLabelValues(metrics.LblGeneral, metrics.LblRollback)
)

// SimpleExec represents simple statement executor.
// For statements do simple execution.
// includes `UseStmt`, 'SetStmt`, `DoStmt`,
Expand Down Expand Up @@ -602,7 +609,13 @@ func (e *SimpleExec) executeRollback(s *ast.RollbackStmt) error {
return err
}
if txn.Valid() {
e.ctx.GetSessionVars().TxnCtx.ClearDelta()
duration := time.Since(sessVars.TxnCtx.CreateTime).Seconds()
if sessVars.InRestrictedSQL {
transactionDurationInternalRollback.Observe(duration)
} else {
transactionDurationGeneralRollback.Observe(duration)
}
sessVars.TxnCtx.ClearDelta()
return txn.Rollback()
}
return nil
Expand Down
2 changes: 2 additions & 0 deletions metrics/session.go
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,8 @@ const (
LblReachMax = "reach_max"
LblOK = "ok"
LblError = "error"
LblCommit = "commit"
LblAbort = "abort"
LblRollback = "rollback"
LblComRol = "com_rol"
LblType = "type"
Expand Down
31 changes: 17 additions & 14 deletions session/session.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,10 +76,10 @@ var (
statementPerTransactionInternalError = metrics.StatementPerTransaction.WithLabelValues(metrics.LblInternal, "error")
statementPerTransactionGeneralOK = metrics.StatementPerTransaction.WithLabelValues(metrics.LblGeneral, "ok")
statementPerTransactionGeneralError = metrics.StatementPerTransaction.WithLabelValues(metrics.LblGeneral, "error")
transactionDurationInternalOK = metrics.TransactionDuration.WithLabelValues(metrics.LblInternal, "ok")
transactionDurationInternalError = metrics.TransactionDuration.WithLabelValues(metrics.LblInternal, "error")
transactionDurationGeneralOK = metrics.TransactionDuration.WithLabelValues(metrics.LblGeneral, "ok")
transactionDurationGeneralError = metrics.TransactionDuration.WithLabelValues(metrics.LblGeneral, "error")
transactionDurationInternalCommit = metrics.TransactionDuration.WithLabelValues(metrics.LblInternal, metrics.LblCommit)
transactionDurationInternalAbort = metrics.TransactionDuration.WithLabelValues(metrics.LblInternal, metrics.LblAbort)
transactionDurationGeneralCommit = metrics.TransactionDuration.WithLabelValues(metrics.LblGeneral, metrics.LblCommit)
transactionDurationGeneralAbort = metrics.TransactionDuration.WithLabelValues(metrics.LblGeneral, metrics.LblAbort)

transactionCounterInternalOK = metrics.TransactionCounter.WithLabelValues(metrics.LblInternal, metrics.LblOK)
transactionCounterInternalErr = metrics.TransactionCounter.WithLabelValues(metrics.LblInternal, metrics.LblError)
Expand Down Expand Up @@ -441,12 +441,16 @@ func (s *session) doCommit(ctx context.Context) error {
}

func (s *session) doCommitWithRetry(ctx context.Context) error {
var txnSize int
var isPessimistic bool
if s.txn.Valid() {
txnSize = s.txn.Size()
isPessimistic = s.txn.IsPessimistic()
defer func() {
s.txn.changeToInvalid()
s.cleanRetryInfo()
}()
if !s.txn.Valid() {
// If the transaction is invalid, maybe it has already been rolled back by the client.
return nil
}
txnSize := s.txn.Size()
isPessimistic := s.txn.IsPessimistic()
if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil {
span1 := span.Tracer().StartSpan("session.doCommitWitRetry", opentracing.ChildOf(span.Context()))
defer span1.Finish()
Expand Down Expand Up @@ -476,7 +480,6 @@ func (s *session) doCommitWithRetry(ctx context.Context) error {
counter := s.sessionVars.TxnCtx.StatementCount
duration := time.Since(s.GetSessionVars().TxnCtx.CreateTime).Seconds()
s.recordOnTransactionExecution(err, counter, duration)
s.cleanRetryInfo()

if isoLevelOneShot := &s.sessionVars.TxnIsolationLevelOneShot; isoLevelOneShot.State != 0 {
switch isoLevelOneShot.State {
Expand Down Expand Up @@ -2033,18 +2036,18 @@ func (s *session) recordOnTransactionExecution(err error, counter int, duration
if s.isInternal() {
if err != nil {
statementPerTransactionInternalError.Observe(float64(counter))
transactionDurationInternalError.Observe(duration)
transactionDurationInternalAbort.Observe(duration)
} else {
statementPerTransactionInternalOK.Observe(float64(counter))
transactionDurationInternalOK.Observe(duration)
transactionDurationInternalCommit.Observe(duration)
}
} else {
if err != nil {
statementPerTransactionGeneralError.Observe(float64(counter))
transactionDurationGeneralError.Observe(duration)
transactionDurationGeneralAbort.Observe(duration)
} else {
statementPerTransactionGeneralOK.Observe(float64(counter))
transactionDurationGeneralOK.Observe(duration)
transactionDurationGeneralCommit.Observe(duration)
}
}
}
Expand Down
11 changes: 11 additions & 0 deletions session/tidb.go
Original file line number Diff line number Diff line change
Expand Up @@ -162,15 +162,26 @@ func Compile(ctx context.Context, sctx sessionctx.Context, stmtNode ast.StmtNode
return stmt, err
}

func recordAbortTxnDuration(sessVars *variable.SessionVars) {
duration := time.Since(sessVars.TxnCtx.CreateTime).Seconds()
if sessVars.InRestrictedSQL {
transactionDurationInternalAbort.Observe(duration)
} else {
transactionDurationGeneralAbort.Observe(duration)
}
}

func finishStmt(ctx context.Context, sctx sessionctx.Context, se *session, sessVars *variable.SessionVars,
meetsErr error, sql sqlexec.Statement) error {
if meetsErr != nil {
if !sessVars.InTxn() {
logutil.BgLogger().Info("rollbackTxn for ddl/autocommit failed")
se.RollbackTxn(ctx)
recordAbortTxnDuration(sessVars)
} else if se.txn.Valid() && se.txn.IsPessimistic() && executor.ErrDeadlock.Equal(meetsErr) {
logutil.BgLogger().Info("rollbackTxn for deadlock", zap.Uint64("txn", se.txn.StartTS()))
se.RollbackTxn(ctx)
recordAbortTxnDuration(sessVars)
}
return meetsErr
}
Expand Down

0 comments on commit 39a6f7f

Please sign in to comment.