Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
normalize extra metrics to gigagas
  • Loading branch information
aaronbuchwald authored and RodrigoVillar committed Sep 26, 2025
commit b046a4b393ddcce3de7cffb664267da22c88d41a
129 changes: 129 additions & 0 deletions tests/reexecute/c/metrics.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
// Copyright (C) 2019-2025, Ava Labs, Inc. All rights reserved.
// See the file LICENSE for licensing terms.

package vm

import (
"fmt"
"testing"
"time"

"github.com/prometheus/client_golang/prometheus"
"github.com/stretchr/testify/require"
)

var (
gasMetric = topLevelMetric{
Name: "gas",
Queries: []string{"avalanche_evm_eth_chain_block_gas_used_processed"},
}
topLevelMetrics = []topLevelMetric{
{
Name: "content_validation",
Queries: []string{"avalanche_evm_eth_chain_block_validations_content"},
},
{
Name: "state_init",
Queries: []string{
"avalanche_evm_eth_chain_block_inits_state",
},
},
{
Name: "execution",
Queries: []string{
"avalanche_evm_eth_chain_block_executions",
},
},
{
Name: "block_validation",
Queries: []string{
"avalanche_evm_eth_chain_block_validations_state",
},
},
{
Name: "trie_hash",
Queries: []string{
"avalanche_evm_eth_chain_storage_hashes",
"avalanche_evm_eth_chain_account_hashes",
},
},
{
Name: "trie_update",
Queries: []string{
"avalanche_evm_eth_chain_account_updates",
"avalanche_evm_eth_chain_storage_updates",
},
},
{
Name: "trie_read",
Queries: []string{
"avalanche_evm_eth_chain_snapshot_account_reads",
"avalanche_evm_eth_chain_account_reads",
"avalanche_evm_eth_chain_snapshot_storage_reads",
"avalanche_evm_eth_chain_storage_reads",
},
},
{
Name: "block_write",
Queries: []string{
"avalanche_evm_eth_chain_block_writes",
},
},
{
Name: "commit",
Queries: []string{
"avalanche_evm_eth_chain_account_commits",
"avalanche_evm_eth_chain_storage_commits",
"avalanche_evm_eth_chain_snapshot_commits",
"avalanche_evm_eth_chain_triedb_commits",
},
},
}
)

func getCounterMetricValue(registry prometheus.Gatherer, query string) (float64, error) {
metricFamilies, err := registry.Gather()
if err != nil {
return 0, fmt.Errorf("failed to gather metrics: %w", err)
}

for _, mf := range metricFamilies {
if mf.GetName() == query {
return mf.GetMetric()[0].Counter.GetValue(), nil
}
}

return 0, fmt.Errorf("metric %s not found", query)
}

type topLevelMetric struct {
Name string
Queries []string
}

func calcMetric(tb testing.TB, m topLevelMetric, registry prometheus.Gatherer) float64 {
r := require.New(tb)
sum := float64(0)
for _, query := range m.Queries {
val, err := getCounterMetricValue(registry, query)
r.NoError(err, "failed to get counter value for metric %q query %q", m.Name, query)
sum += val
}
return sum
}

func getTopLevelMetrics(b *testing.B, registry prometheus.Gatherer, elapsed time.Duration) {
r := require.New(b)

totalGas := calcMetric(b, gasMetric, registry)
r.NotZero(totalGas, "denominator metric %q has value 0", gasMetric.Name)

mgasPerSecond := totalGas / 1_000_000 / elapsed.Seconds() // mega
b.ReportMetric(mgasPerSecond, fmt.Sprintf("m%s/s", gasMetric.Name))

totalGGas := totalGas / 1_000_000_000 // giga
for _, metric := range topLevelMetrics {
counterVal := calcMetric(b, metric, registry) / (totalGGas) // metric / ggas
b.ReportMetric(counterVal, fmt.Sprintf("%s/g%s", metric.Name, gasMetric.Name))
}
}
124 changes: 0 additions & 124 deletions tests/reexecute/c/vm_reexecute_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,81 +82,6 @@ var (
"state-sync-enabled": false
}`,
}
denominatorMetric = topLevelMetric{
MetricName: "mgas",
Queries: []string{"avalanche_evm_eth_chain_block_gas_used_processed"},
Denominator: 1_000_000,
}
topLevelMetrics = []topLevelMetric{
{
MetricName: "content_validation",
Queries: []string{"avalanche_evm_eth_chain_block_validations_content"},
Denominator: 1,
},
{
MetricName: "state_init",
Queries: []string{
"avalanche_evm_eth_chain_block_inits_state",
},
Denominator: 1,
},
{
MetricName: "execution",
Queries: []string{
"avalanche_evm_eth_chain_block_executions",
},
Denominator: 1,
},
{
MetricName: "block_validation",
Queries: []string{
"avalanche_evm_eth_chain_block_validations_state",
},
Denominator: 1,
},
{
MetricName: "trie_hash",
Queries: []string{
"avalanche_evm_eth_chain_storage_hashes",
"avalanche_evm_eth_chain_account_hashes",
},
Denominator: 1,
},
{
MetricName: "trie_update",
Queries: []string{
"avalanche_evm_eth_chain_account_updates",
"avalanche_evm_eth_chain_storage_updates",
},
Denominator: 1,
},
{
MetricName: "trie_read",
Queries: []string{
"avalanche_evm_eth_chain_snapshot_account_reads",
"avalanche_evm_eth_chain_account_reads",
"avalanche_evm_eth_chain_snapshot_storage_reads",
"avalanche_evm_eth_chain_storage_reads",
},
Denominator: 1,
},
{
MetricName: "block_write",
Queries: []string{
"avalanche_evm_eth_chain_block_writes",
},
Denominator: 1,
},
{
MetricName: "commit",
Queries: []string{
"avalanche_evm_eth_chain_account_commits",
"avalanche_evm_eth_chain_storage_commits",
"avalanche_evm_eth_chain_snapshot_commits",
"avalanche_evm_eth_chain_triedb_commits",
},
},
}

configNameArg string
runnerNameArg string
Expand Down Expand Up @@ -667,52 +592,3 @@ func parseCustomLabels(labelsStr string) (map[string]string, error) {
}
return labels, nil
}

func getCounterMetricValue(registry prometheus.Gatherer, query string) (float64, error) {
metricFamilies, err := registry.Gather()
if err != nil {
return 0, fmt.Errorf("failed to gather metrics: %w", err)
}

for _, mf := range metricFamilies {
if mf.GetName() == query {
return mf.GetMetric()[0].Counter.GetValue(), nil
}
}

return 0, fmt.Errorf("metric %s not found", query)
}

type topLevelMetric struct {
MetricName string
Queries []string
Denominator float64
}

func calcMetric(tb testing.TB, m topLevelMetric, registry prometheus.Gatherer) float64 {
r := require.New(tb)
sum := float64(0)
for _, query := range m.Queries {
val, err := getCounterMetricValue(registry, query)
r.NoError(err, "failed to get counter value for metric %q query %q", m.MetricName, query)
sum += val
}
return sum / m.Denominator
}

func getTopLevelMetrics(b *testing.B, registry prometheus.Gatherer, elapsed time.Duration) {
r := require.New(b)

denominatorMetricVal := calcMetric(b, denominatorMetric, registry)
r.NotZero(denominatorMetricVal, "denominator metric %q has value 0", denominatorMetric.MetricName)

denominatorPerSecond := denominatorMetricVal / elapsed.Seconds()
b.ReportMetric(denominatorPerSecond, fmt.Sprintf("%s/s", denominatorMetric.MetricName))

for _, metric := range topLevelMetrics {
counterVal := calcMetric(b, metric, registry)
counterVal /= denominatorMetricVal

b.ReportMetric(counterVal, fmt.Sprintf("%s/%s", metric.MetricName, denominatorMetric.MetricName))
}
}