@@ -63,6 +63,12 @@ declareCounter beacon_light_client_optimistic_updates_sent,
6363declareCounter beacon_blocks_proposed,
6464 " Number of beacon chain blocks sent by this peer"
6565
66+ declareCounter beacon_block_production_errors,
67+ " Number of times we failed to produce a block"
68+
69+ declareCounter beacon_block_payload_errors,
70+ " Number of times execution client failed to produce block payload"
71+
6672declareGauge (attached_validator_balance,
6773 " Validator balance at slot end of the first 64 validators, in Gwei" ,
6874 labels = [" pubkey" ])
@@ -383,6 +389,7 @@ proc getExecutionPayload(
383389 build_empty_execution_payload (proposalState.bellatrixData.data)
384390
385391 if node.eth1Monitor.isNil:
392+ beacon_block_payload_errors.inc ()
386393 warn " getExecutionPayload: eth1Monitor not initialized; using empty execution payload"
387394 return Opt .some empty_execution_payload
388395
@@ -439,9 +446,11 @@ proc getExecutionPayload(
439446 awaitWithTimeout (
440447 get_execution_payload (payload_id, node.consensusManager.eth1Monitor),
441448 GETPAYLOAD_TIMEOUT ):
449+ beacon_block_payload_errors.inc ()
442450 warn " Getting execution payload from Engine API timed out" , payload_id
443451 empty_execution_payload
444452 except CatchableError as err:
453+ beacon_block_payload_errors.inc ()
445454 warn " Getting execution payload from Engine API failed" ,
446455 payload_id, err = err.msg
447456 empty_execution_payload
@@ -462,6 +471,7 @@ proc getExecutionPayload(
462471
463472 return Opt .some payload
464473 except CatchableError as err:
474+ beacon_block_payload_errors.inc ()
465475 error " Error creating non-empty execution payload; using empty execution payload" ,
466476 msg = err.msg
467477 return Opt .some empty_execution_payload
@@ -494,6 +504,7 @@ proc makeBeaconBlockForHeadAndSlot*(
494504 eth1Proposal = node.getBlockProposalEth1Data (state)
495505
496506 if eth1Proposal.hasMissingDeposits:
507+ beacon_block_production_errors.inc ()
497508 warn " Eth1 deposits not available. Skipping block proposal" , slot
498509 return ForkedBlockResult .err (" Eth1 deposits not available" )
499510
@@ -522,6 +533,7 @@ proc makeBeaconBlockForHeadAndSlot*(
522533 # TODO https://github.com/nim-lang/Nim/issues/19802
523534 if pubkey.isSome: pubkey.get.toPubKey else : default (ValidatorPubKey )))
524535 if maybeExecutionPayload.isNone:
536+ beacon_block_production_errors.inc ()
525537 warn " Unable to get execution payload. Skipping block proposal" ,
526538 slot, validator_index
527539 return ForkedBlockResult .err (" Unable to get execution payload" )
@@ -558,14 +570,17 @@ proc makeBeaconBlockForHeadAndSlot*(
558570 # This is almost certainly a bug, but it's complex enough that there's a
559571 # small risk it might happen even when most proposals succeed - thus we
560572 # log instead of asserting
573+ beacon_block_production_errors.inc ()
561574 error " Cannot create block for proposal" ,
562575 slot, head = shortLog (head), error = res.error ()
563576 return err ($ res.error)
564577 return ok (res.get ())
565578 do :
579+ beacon_block_production_errors.inc ()
566580 error " Cannot get proposal state - skipping block production, database corrupt?" ,
567581 head = shortLog (head),
568582 slot
583+ return err (" Cannot create proposal state" )
569584
570585proc getBlindedExecutionPayload (
571586 node: BeaconNode , slot: Slot , executionBlockRoot: Eth2Digest ,
0 commit comments