From 5644fb2275c6feb4edb472089e050cc489d1a5a1 Mon Sep 17 00:00:00 2001 From: Jaden Weiss Date: Wed, 20 May 2020 12:27:27 -0400 Subject: [PATCH] add metrics for transactions --- api.go | 39 ++++++++++++++++++++++++++++++++++++--- metrics.go | 7 +++++++ 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/api.go b/api.go index 77a3fc34e..e617837c2 100644 --- a/api.go +++ b/api.go @@ -1594,14 +1594,41 @@ func (api *API) StartTransaction(ctx context.Context, id string, timeout time.Du if err := api.validate(apiStartTransaction); err != nil { return nil, errors.Wrap(err, "validating api method") } - return api.server.StartTransaction(ctx, id, timeout, exclusive, remote) + t, err := api.server.StartTransaction(ctx, id, timeout, exclusive, remote) + if exclusive { + switch err { + case nil: + api.holder.Stats.Count(MetricExclusiveTransactionRequest, 1, 1.0) + case ErrTransactionExclusive: + api.holder.Stats.Count(MetricExclusiveTransactionBlocked, 1, 1.0) + } + if t.Active { + api.holder.Stats.Count(MetricExclusiveTransactionActive, 1, 1.0) + } + } else { + switch err { + case nil: + api.holder.Stats.Count(MetricTransactionStart, 1, 1.0) + case ErrTransactionExclusive: + api.holder.Stats.Count(MetricTransactionBlocked, 1, 1.0) + } + } + return t, err } func (api *API) FinishTransaction(ctx context.Context, id string, remote bool) (*Transaction, error) { if err := api.validate(apiFinishTransaction); err != nil { return nil, errors.Wrap(err, "validating api method") } - return api.server.FinishTransaction(ctx, id, remote) + t, err := api.server.FinishTransaction(ctx, id, remote) + if err == nil { + if t.Exclusive { + api.holder.Stats.Count(MetricExclusiveTransactionEnd, 1, 1.0) + } else { + api.holder.Stats.Count(MetricTransactionEnd, 1, 1.0) + } + } + return t, err } func (api *API) Transactions(ctx context.Context) (map[string]*Transaction, error) { @@ -1615,7 +1642,13 @@ func (api *API) GetTransaction(ctx context.Context, id string, remote bool) (*Tr if err := api.validate(apiGetTransaction); err != nil { return nil, errors.Wrap(err, "validating api method") } - return api.server.GetTransaction(ctx, id, remote) + t, err := api.server.GetTransaction(ctx, id, remote) + if err == nil { + if t.Exclusive && t.Active { + api.holder.Stats.Count(MetricExclusiveTransactionActive, 1, 1.0) + } + } + return t, err } type serverInfo struct { diff --git a/metrics.go b/metrics.go index c1888e0f6..8d58f8a73 100644 --- a/metrics.go +++ b/metrics.go @@ -58,4 +58,11 @@ const ( MetricStackInuse = "stack_inuse" MetricMallocs = "mallocs" MetricFrees = "frees" + MetricTransactionStart = "transaction_start" + MetricTransactionEnd = "trasaction_end" + MetricTransactionBlocked = "transaction_blocked" + MetricExclusiveTransactionRequest = "transaction_exclusive_request" + MetricExclusiveTransactionActive = "transaction_exclusive_active" + MetricExclusiveTransactionEnd = "trasaction_exclusive_end" + MetricExclusiveTransactionBlocked = "transaction_exclusive_blocked" )