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 }