mirror of
https://github.com/luxfi/evm.git
synced 2026-09-24 00:27:44 +00:00
133 lines
5.1 KiB
Go
133 lines
5.1 KiB
Go
// (c) 2021-2025, Lux Industries, Inc. All rights reserved.
|
|
// See the file LICENSE for licensing terms.
|
|
|
|
package prometheus
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
"github.com/luxfi/evm/internal/testutils"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
"github.com/luxfi/geth/metrics"
|
|
)
|
|
|
|
func TestGatherer_Gather(t *testing.T) {
|
|
testutils.WithMetrics(t)
|
|
|
|
registry := metrics.NewRegistry()
|
|
register := func(t *testing.T, name string, collector any) {
|
|
t.Helper()
|
|
err := registry.Register(name, collector)
|
|
require.NoErrorf(t, err, "registering collector %q", name)
|
|
}
|
|
|
|
counter := metrics.NewCounter()
|
|
counter.Inc(12345)
|
|
register(t, "test/counter", counter)
|
|
|
|
counterFloat64 := metrics.NewCounterFloat64()
|
|
counterFloat64.Inc(1.1)
|
|
register(t, "test/counter_float64", counterFloat64)
|
|
|
|
gauge := metrics.NewGauge()
|
|
gauge.Update(23456)
|
|
register(t, "test/gauge", gauge)
|
|
|
|
gaugeFloat64 := metrics.NewGaugeFloat64()
|
|
gaugeFloat64.Update(34567.89)
|
|
register(t, "test/gauge_float64", gaugeFloat64)
|
|
|
|
gaugeInfo := metrics.NewGaugeInfo()
|
|
gaugeInfo.Update(metrics.GaugeInfoValue{"key": "value"})
|
|
register(t, "test/gauge_info", gaugeInfo) // skipped
|
|
|
|
sample := metrics.NewUniformSample(1028)
|
|
histogram := metrics.NewHistogram(sample)
|
|
register(t, "test/histogram", histogram)
|
|
|
|
meter := metrics.NewMeter()
|
|
t.Cleanup(meter.Stop)
|
|
meter.Mark(9999999)
|
|
register(t, "test/meter", meter)
|
|
|
|
timer := metrics.NewTimer()
|
|
t.Cleanup(timer.Stop)
|
|
timer.Update(20 * time.Millisecond)
|
|
timer.Update(21 * time.Millisecond)
|
|
timer.Update(22 * time.Millisecond)
|
|
timer.Update(120 * time.Millisecond)
|
|
timer.Update(23 * time.Millisecond)
|
|
timer.Update(24 * time.Millisecond)
|
|
register(t, "test/timer", timer)
|
|
|
|
resettingTimer := metrics.NewResettingTimer()
|
|
register(t, "test/resetting_timer", resettingTimer)
|
|
resettingTimer.Update(time.Second) // must be after register call
|
|
|
|
emptyResettingTimer := metrics.NewResettingTimer()
|
|
register(t, "test/empty_resetting_timer", emptyResettingTimer)
|
|
|
|
emptyResettingTimer.Update(time.Second) // no effect because of snapshot below
|
|
register(t, "test/empty_resetting_timer_snapshot", emptyResettingTimer.Snapshot())
|
|
|
|
registerNilMetrics(t, register)
|
|
|
|
gatherer := NewGatherer(registry)
|
|
|
|
families, err := gatherer.Gather()
|
|
require.NoError(t, err)
|
|
familyStrings := make([]string, len(families))
|
|
for i := range families {
|
|
familyStrings[i] = families[i].String()
|
|
}
|
|
want := []string{
|
|
`name:"test_counter" type:COUNTER metric:{counter:{value:12345}}`,
|
|
`name:"test_counter_float64" type:COUNTER metric:{counter:{value:1.1}}`,
|
|
`name:"test_gauge" type:GAUGE metric:{gauge:{value:23456}}`,
|
|
`name:"test_gauge_float64" type:GAUGE metric:{gauge:{value:34567.89}}`,
|
|
`name:"test_histogram" type:SUMMARY metric:{summary:{sample_count:0 sample_sum:0 quantile:{quantile:0.5 value:0} quantile:{quantile:0.75 value:0} quantile:{quantile:0.95 value:0} quantile:{quantile:0.99 value:0} quantile:{quantile:0.999 value:0} quantile:{quantile:0.9999 value:0}}}`,
|
|
`name:"test_meter" type:GAUGE metric:{gauge:{value:9.999999e+06}}`,
|
|
`name:"test_resetting_timer" type:SUMMARY metric:{summary:{sample_count:1 quantile:{quantile:50 value:1e+09} quantile:{quantile:95 value:1e+09} quantile:{quantile:99 value:1e+09}}}`,
|
|
`name:"test_timer" type:SUMMARY metric:{summary:{sample_count:6 sample_sum:2.3e+08 quantile:{quantile:0.5 value:2.25e+07} quantile:{quantile:0.75 value:4.8e+07} quantile:{quantile:0.95 value:1.2e+08} quantile:{quantile:0.99 value:1.2e+08} quantile:{quantile:0.999 value:1.2e+08} quantile:{quantile:0.9999 value:1.2e+08}}}`,
|
|
}
|
|
assert.Equal(t, want, familyStrings)
|
|
|
|
register(t, "unsupported", metrics.NewHealthcheck(nil))
|
|
families, err = gatherer.Gather()
|
|
assert.ErrorIs(t, err, errMetricTypeNotSupported)
|
|
assert.Empty(t, families)
|
|
}
|
|
|
|
func registerNilMetrics(t *testing.T, register func(t *testing.T, name string, collector any)) {
|
|
// Note: metrics.Enabled is a function, not a variable.
|
|
// We can't disable metrics at runtime in this way.
|
|
// Instead, we'll test with nil metrics directly
|
|
nilCounter := metrics.NewCounter()
|
|
register(t, "nil/counter", nilCounter)
|
|
nilCounterFloat64 := metrics.NewCounterFloat64()
|
|
register(t, "nil/counter_float64", nilCounterFloat64)
|
|
nilEWMA := metrics.NewEWMA(0.5)
|
|
register(t, "nil/ewma", nilEWMA)
|
|
nilGauge := metrics.NewGauge()
|
|
register(t, "nil/gauge", nilGauge)
|
|
nilGaugeFloat64 := metrics.NewGaugeFloat64()
|
|
register(t, "nil/gauge_float64", nilGaugeFloat64)
|
|
nilGaugeInfo := metrics.NewGaugeInfo()
|
|
register(t, "nil/gauge_info", nilGaugeInfo)
|
|
nilHealthcheck := metrics.NewHealthcheck(nil)
|
|
register(t, "nil/healthcheck", nilHealthcheck)
|
|
// Create histogram with a sample to avoid nil panic
|
|
nilSample := metrics.NewUniformSample(100)
|
|
nilHistogram := metrics.NewHistogram(nilSample)
|
|
register(t, "nil/histogram", nilHistogram)
|
|
nilMeter := metrics.NewMeter()
|
|
register(t, "nil/meter", nilMeter)
|
|
nilResettingTimer := metrics.NewResettingTimer()
|
|
register(t, "nil/resetting_timer", nilResettingTimer)
|
|
nilSample2 := metrics.NewUniformSample(1028)
|
|
register(t, "nil/sample", nilSample2)
|
|
nilTimer := metrics.NewTimer()
|
|
register(t, "nil/timer", nilTimer)
|
|
}
|