github.com/MetalBlockchain/metalgo@v1.11.9/snow/networking/handler/health.go (about)

     1  // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package handler
     5  
     6  import (
     7  	"context"
     8  	"errors"
     9  	"fmt"
    10  )
    11  
    12  var ErrNotConnectedEnoughStake = errors.New("not connected to enough stake")
    13  
    14  func (h *handler) HealthCheck(ctx context.Context) (interface{}, error) {
    15  	state := h.ctx.State.Get()
    16  	engine, ok := h.engineManager.Get(state.Type).Get(state.State)
    17  	if !ok {
    18  		return nil, fmt.Errorf(
    19  			"%w %s running %s",
    20  			errMissingEngine,
    21  			state.State,
    22  			state.Type,
    23  		)
    24  	}
    25  	engineIntf, engineErr := engine.HealthCheck(ctx)
    26  	networkingIntf, networkingErr := h.networkHealthCheck()
    27  	intf := map[string]interface{}{
    28  		"engine":     engineIntf,
    29  		"networking": networkingIntf,
    30  	}
    31  	if engineErr == nil {
    32  		return intf, networkingErr
    33  	}
    34  	if networkingErr == nil {
    35  		return intf, engineErr
    36  	}
    37  	return intf, fmt.Errorf("engine: %w; networking: %w", engineErr, networkingErr)
    38  }
    39  
    40  func (h *handler) networkHealthCheck() (interface{}, error) {
    41  	percentConnected := h.peerTracker.ConnectedPercent()
    42  	details := map[string]float64{
    43  		"percentConnected": percentConnected,
    44  	}
    45  
    46  	var err error
    47  	subnetConfig := h.subnet.Config()
    48  	minPercentConnected := subnetConfig.ConsensusParameters.MinPercentConnectedHealthy()
    49  	if percentConnected < minPercentConnected {
    50  		err = fmt.Errorf("%w: connected to %f%%; required at least %f%%",
    51  			ErrNotConnectedEnoughStake,
    52  			percentConnected*100,
    53  			minPercentConnected*100,
    54  		)
    55  	}
    56  
    57  	return details, err
    58  }