diff --git a/protocol/lib/metrics/lib.go b/protocol/lib/metrics/lib.go index e647fc3c2a..16ce2040d2 100644 --- a/protocol/lib/metrics/lib.go +++ b/protocol/lib/metrics/lib.go @@ -4,6 +4,7 @@ import ( "time" "github.com/cosmos/cosmos-sdk/telemetry" + sdk "github.com/cosmos/cosmos-sdk/types" gometrics "github.com/hashicorp/go-metrics" ) @@ -12,6 +13,7 @@ import ( // that supports float64 (i.e hashicorp go-metrics) type Label = gometrics.Label +type TelemetryEmitWithLabelsFunc func(key string, val float32, labels ...gometrics.Label) // IncrCounterWithLabels provides a wrapper functionality for emitting a counter // metric with global labels (if any) along with the provided labels. @@ -90,3 +92,29 @@ func ModuleMeasureSinceWithLabels( ), ) } + +func isAllowedExecutionMode( + ctx sdk.Context, + allowedModes []sdk.ExecMode, +) bool { + contextExecMode := ctx.ExecMode() + for _, mode := range allowedModes { + if contextExecMode == mode { + return true + } + } + return false +} + +func EmitTelemetryWithLabelsForExecMode( + ctx sdk.Context, + allowedModes []sdk.ExecMode, + telemtryFuncWithLabels TelemetryEmitWithLabelsFunc, + key string, + val float32, + labels ...gometrics.Label, +) { + if isAllowedExecutionMode(ctx, allowedModes) { + telemtryFuncWithLabels(key, val, labels...) + } +} diff --git a/protocol/lib/metrics/lib_test.go b/protocol/lib/metrics/lib_test.go new file mode 100644 index 0000000000..1b50de80a3 --- /dev/null +++ b/protocol/lib/metrics/lib_test.go @@ -0,0 +1,70 @@ +package metrics_test + +import ( + "testing" + "time" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/dydxprotocol/v4-chain/protocol/lib/metrics" + gometrics "github.com/hashicorp/go-metrics" + + "github.com/stretchr/testify/require" +) + +func TestSetGaugeWithLabelsForExecMode(t *testing.T) { + t.Cleanup(gometrics.Shutdown) + context := sdk.Context{} + conf := gometrics.DefaultConfig("testService") + conf.EnableHostname = false + sink := gometrics.NewInmemSink(time.Hour, time.Hour) + _, err := gometrics.NewGlobal(conf, sink) + require.NoError(t, err) + + context = context.WithExecMode(sdk.ExecModeFinalize) + metrics.EmitTelemetryWithLabelsForExecMode( + context, + []sdk.ExecMode{sdk.ExecModeFinalize}, + metrics.SetGaugeWithLabels, + "testKey1", + 3.14, + gometrics.Label{ + Name: "testLabel", + Value: "testLabelValue", + }, + ) + + metrics.EmitTelemetryWithLabelsForExecMode( + context, + []sdk.ExecMode{sdk.ExecModeSimulate}, + metrics.SetGaugeWithLabels, + "testKey2", + 3.14, + gometrics.Label{ + Name: "testLabel", + Value: "testLabelValue", + }, + ) + + FinalizeModeKeyFound := false + SimulateModeKeyFound := false + for _, metrics := range sink.Data() { + metrics.RLock() + defer metrics.RUnlock() + + if metric, ok := metrics.Gauges["testService.testKey1;testLabel=testLabelValue"]; ok { + require.Equal(t, + []gometrics.Label{{ + Name: "testLabel", + Value: "testLabelValue", + }}, + metric.Labels) + require.Equal(t, float32(3.14), metric.Value) + FinalizeModeKeyFound = true + } + if _, ok := metrics.Gauges["testService.testKey2;testLabel=testLabelValue"]; ok { + SimulateModeKeyFound = true + } + } + require.True(t, FinalizeModeKeyFound) + require.False(t, SimulateModeKeyFound) +} diff --git a/protocol/lib/metrics/metric_keys.go b/protocol/lib/metrics/metric_keys.go index f89f634e42..79dc3d2686 100644 --- a/protocol/lib/metrics/metric_keys.go +++ b/protocol/lib/metrics/metric_keys.go @@ -31,6 +31,7 @@ const ( ClobConditionalOrderTriggerPrice = "clob_conditional_order_trigger_price" ClobConditionalOrderTriggered = "clob_conditional_order_triggered" ClobSubaccountsRequiringDeleveragingCount = "clob_subaccounts_requiring_deleveraging_count" + SendingProcessDepositToSubaccount = "sending_process_deposit_to_subaccount" // Samples ClobDeleverageSubaccountTotalQuoteQuantumsDistribution = "clob_deleverage_subaccount_total_quote_quantums_distribution" diff --git a/protocol/x/sending/keeper/transfer.go b/protocol/x/sending/keeper/transfer.go index 498294332d..99205460b6 100644 --- a/protocol/x/sending/keeper/transfer.go +++ b/protocol/x/sending/keeper/transfer.go @@ -104,15 +104,14 @@ func (k Keeper) ProcessDepositToSubaccount( // Emit gauge metric with labels if deposit to subaccount succeeds. if err == nil { - telemetry.SetGaugeWithLabels( - []string{ - types.ModuleName, - metrics.ProcessDepositToSubaccount, - }, + metrics.EmitTelemetryWithLabelsForExecMode( + ctx, + // sdk.ExecModeFinalize is used here to ensure metrics are only emitted in the Finalize ExecMode. + []sdk.ExecMode{sdk.ExecModeFinalize}, + metrics.SetGaugeWithLabels, + metrics.SendingProcessDepositToSubaccount, float32(msgDepositToSubaccount.Quantums), - []gometrics.Label{ - metrics.GetLabelForIntValue(metrics.AssetId, int(msgDepositToSubaccount.AssetId)), - }, + metrics.GetLabelForIntValue(metrics.AssetId, int(msgDepositToSubaccount.AssetId)), ) // Add deposit event to Indexer block message.