Skip to content

Commit

Permalink
Require poll metrics to be registered (#2260)
Browse files Browse the repository at this point in the history
  • Loading branch information
StephenButtolph authored Nov 3, 2023
1 parent e4cb2cd commit cec1cd1
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 24 deletions.
18 changes: 10 additions & 8 deletions snow/consensus/snowman/poll/set.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
package poll

import (
"errors"
"fmt"
"strings"
"time"
Expand All @@ -19,6 +20,11 @@ import (
"github.com/ava-labs/avalanchego/utils/metric"
)

var (
errFailedPollsMetric = errors.New("failed to register polls metric")
errFailedPollDurationMetrics = errors.New("failed to register poll_duration metrics")
)

type pollHolder interface {
GetPoll() Poll
StartTime() time.Time
Expand Down Expand Up @@ -52,16 +58,14 @@ func NewSet(
log logging.Logger,
namespace string,
reg prometheus.Registerer,
) Set {
) (Set, error) {
numPolls := prometheus.NewGauge(prometheus.GaugeOpts{
Namespace: namespace,
Name: "polls",
Help: "Number of pending network polls",
})
if err := reg.Register(numPolls); err != nil {
log.Error("failed to register polls statistics",
zap.Error(err),
)
return nil, fmt.Errorf("%w: %w", errFailedPollsMetric, err)
}

durPolls, err := metric.NewAverager(
Expand All @@ -71,9 +75,7 @@ func NewSet(
reg,
)
if err != nil {
log.Error("failed to register poll_duration statistics",
zap.Error(err),
)
return nil, fmt.Errorf("%w: %w", errFailedPollDurationMetrics, err)
}

return &set{
Expand All @@ -82,7 +84,7 @@ func NewSet(
durPolls: durPolls,
factory: factory,
polls: linkedhashmap.New[uint32, pollHolder](),
}
}, nil
}

// Add to the current set of polls
Expand Down
42 changes: 32 additions & 10 deletions snow/consensus/snowman/poll/set_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ var (
vdr5 = ids.NodeID{5}
)

func TestNewSetErrorOnMetrics(t *testing.T) {
func TestNewSetErrorOnPollsMetrics(t *testing.T) {
require := require.New(t)

factory := NewEarlyTermNoTraversalFactory(1, 1)
Expand All @@ -37,13 +37,29 @@ func TestNewSetErrorOnMetrics(t *testing.T) {
registerer := prometheus.NewRegistry()

require.NoError(registerer.Register(prometheus.NewCounter(prometheus.CounterOpts{
Name: "polls",
Namespace: namespace,
Name: "polls",
})))

_, err := NewSet(factory, log, namespace, registerer)
require.ErrorIs(err, errFailedPollsMetric)
}

func TestNewSetErrorOnPollDurationMetrics(t *testing.T) {
require := require.New(t)

factory := NewEarlyTermNoTraversalFactory(1, 1)
log := logging.NoLog{}
namespace := ""
registerer := prometheus.NewRegistry()

require.NoError(registerer.Register(prometheus.NewCounter(prometheus.CounterOpts{
Name: "poll_duration",
Namespace: namespace,
Name: "poll_duration_count",
})))

require.NotNil(NewSet(factory, log, namespace, registerer))
_, err := NewSet(factory, log, namespace, registerer)
require.ErrorIs(err, errFailedPollDurationMetrics)
}

func TestCreateAndFinishPollOutOfOrder_NewerFinishesFirst(t *testing.T) {
Expand All @@ -56,7 +72,8 @@ func TestCreateAndFinishPollOutOfOrder_NewerFinishesFirst(t *testing.T) {
log := logging.NoLog{}
namespace := ""
registerer := prometheus.NewRegistry()
s := NewSet(factory, log, namespace, registerer)
s, err := NewSet(factory, log, namespace, registerer)
require.NoError(err)

// create two polls for the two blocks
vdrBag := bag.Of(vdrs...)
Expand Down Expand Up @@ -92,7 +109,8 @@ func TestCreateAndFinishPollOutOfOrder_OlderFinishesFirst(t *testing.T) {
log := logging.NoLog{}
namespace := ""
registerer := prometheus.NewRegistry()
s := NewSet(factory, log, namespace, registerer)
s, err := NewSet(factory, log, namespace, registerer)
require.NoError(err)

// create two polls for the two blocks
vdrBag := bag.Of(vdrs...)
Expand Down Expand Up @@ -128,7 +146,8 @@ func TestCreateAndFinishPollOutOfOrder_UnfinishedPollsGaps(t *testing.T) {
log := logging.NoLog{}
namespace := ""
registerer := prometheus.NewRegistry()
s := NewSet(factory, log, namespace, registerer)
s, err := NewSet(factory, log, namespace, registerer)
require.NoError(err)

// create three polls for the two blocks
vdrBag := bag.Of(vdrs...)
Expand Down Expand Up @@ -172,7 +191,8 @@ func TestCreateAndFinishSuccessfulPoll(t *testing.T) {
log := logging.NoLog{}
namespace := ""
registerer := prometheus.NewRegistry()
s := NewSet(factory, log, namespace, registerer)
s, err := NewSet(factory, log, namespace, registerer)
require.NoError(err)

require.Zero(s.Len())

Expand Down Expand Up @@ -204,7 +224,8 @@ func TestCreateAndFinishFailedPoll(t *testing.T) {
log := logging.NoLog{}
namespace := ""
registerer := prometheus.NewRegistry()
s := NewSet(factory, log, namespace, registerer)
s, err := NewSet(factory, log, namespace, registerer)
require.NoError(err)

require.Zero(s.Len())

Expand Down Expand Up @@ -233,7 +254,8 @@ func TestSetString(t *testing.T) {
log := logging.NoLog{}
namespace := ""
registerer := prometheus.NewRegistry()
s := NewSet(factory, log, namespace, registerer)
s, err := NewSet(factory, log, namespace, registerer)
require.NoError(err)

expected := `current polls: (Size = 1)
RequestID 0:
Expand Down
17 changes: 11 additions & 6 deletions snow/engine/snowman/transitive.go
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,16 @@ func newTransitive(config Config) (*Transitive, error) {
config.Params.AlphaPreference,
config.Params.AlphaConfidence,
)
polls, err := poll.NewSet(
factory,
config.Ctx.Log,
"",
config.Ctx.Registerer,
)
if err != nil {
return nil, err
}

t := &Transitive{
Config: config,
StateSummaryFrontierHandler: common.NewNoOpStateSummaryFrontierHandler(config.Ctx.Log),
Expand All @@ -129,12 +139,7 @@ func newTransitive(config Config) (*Transitive, error) {
nonVerifieds: ancestor.NewTree(),
nonVerifiedCache: nonVerifiedCache,
acceptedFrontiers: acceptedFrontiers,
polls: poll.NewSet(
factory,
config.Ctx.Log,
"",
config.Ctx.Registerer,
),
polls: polls,
}

return t, t.metrics.Initialize("", config.Ctx.Registerer)
Expand Down

0 comments on commit cec1cd1

Please sign in to comment.