Skip to main content
Version: next 🚧

Charon Metrics Reference

Charon exposes a Prometheus-compatible metrics endpoint on its monitoring API, configured with the --monitoring-address flag and defaulting to 127.0.0.1:3620. Scraping this endpoint with Prometheus lets you build dashboards, health checks, and alerts on the distributed validator's real-time behavior, from peer connectivity to duty completion.

If you are running the CDVN repository, Prometheus and Grafana are already part of the docker compose setup and scrape this endpoint automatically, so no extra configuration is needed to get started. See Monitoring Your Node for how to use the pre-built dashboards and alerts.

Standard Labels​

All metrics on this page include the following labels, so they are omitted from the tables below.

  • cluster_hash: The cluster lock hash uniquely identifying the cluster.
  • cluster_name: The cluster lock name.
  • cluster_network: The cluster network name; Goerli, Mainnet, etc.
  • cluster_peer: The name of this node in the cluster. It is determined from the operator's Ethereum Node Record (ENR).

The cluster_* labels uniquely identify a specific node's metrics, which is required when storing metrics from multiple nodes or clusters in one Prometheus instance.

Key Metrics to Watch​

The full reference table below covers every metric Charon exposes, but a smaller set is especially useful for day-to-day operations. These are a good starting point for dashboards and alerts.

MetricWhy It Matters
app_monitoring_readyzReports the node's readiness state: 1 if operational, 2 if the beacon node is down, 3 if the beacon node is syncing, or 4 if quorum peers are not connected (otherwise 0). Drives the ClusterInUnknownStatus and ClusterInsufficientPeers alerts in Monitoring Your Node.
app_eth2_using_fallbackIndicates whether the client is using a fallback (1) or primary (0) beacon node, useful for spotting an unhealthy primary beacon node.
app_beacon_node_peersPeer count of the upstream beacon node; low values can precede sync or attestation issues and relate to the ClusterBeaconNodeZeroPeers alert.
app_log_error_totalTotal count of logged errors by topic, a quick signal for rising error rates before they cause duty failures.
core_tracker_participationSet to 1 if a peer participated successfully for a given duty, or 0 otherwise; useful for spotting an underperforming peer.
core_tracker_failed_duties_totalTotal number of failed duties by type, the underlying signal behind the ClusterFailureRate and ClusterMissedAttestations alerts.
p2p_ping_latency_secsPing latency in seconds per peer, the basis for the PeerPingLatency alert.
p2p_ping_successWhether the last ping to a peer was successful (1) or not (0); can be used as a proxy for connected peers.

Full Metrics Reference​

The table below is generated from the Charon source code and reflects the metrics defined in the codebase. For the latest, canonical version, see docs/metrics.md in the Charon repository.

NameTypeHelpLabels
app_beacon_node_peersGaugeGauge set to the peer count of the upstream beacon node
app_beacon_node_sse_blockHistogramBlock imported into fork choice delay, supplied by beacon node's SSE endpoint. Values between 0s and 4s for Ethereum mainnet are considered safeaddr
app_beacon_node_sse_block_gossipHistogramBlock reception via gossip delay, supplied by beacon node's SSE endpoint. Values between 0s and 4s for Ethereum mainnet are considered safeaddr
app_beacon_node_sse_block_processing_timeHistogramTime in seconds between block gossip and head events, indicating block processing time. Lower values indicate better CPU/disk/RAM performance.addr
app_beacon_node_sse_chain_reorg_depthHistogramChain reorg depth, supplied by beacon node's SSE endpointaddr
app_beacon_node_sse_head_delayHistogramDelay in seconds between slot start and head update, supplied by beacon node's SSE endpoint. Values between 8s and 12s for Ethereum mainnet are considered safe.addr
app_beacon_node_sse_head_slotGaugeCurrent beacon node head slot, supplied by beacon node's SSE endpointaddr
app_beacon_node_versionGaugeConstant gauge with labels set to the version and beacon_id of the upstream beacon nodeversion, beacon_id
app_cache_hits_totalCounterTotal number of times the cache was usedendpoint
app_cache_invalidated_reorg_totalCounterTotal number of times the cache was invalidated due to a chain reorgendpoint
app_cache_misses_totalCounterTotal number of times the cache was missedendpoint
app_eth2_errors_totalCounterTotal number of errors returned by eth2 beacon node requestsendpoint
app_eth2_latency_secondsHistogramLatency in seconds for eth2 beacon node requestsendpoint
app_eth2_requests_totalCounterTotal number of requests sent to eth2 beacon nodeendpoint
app_eth2_using_fallbackGaugeIndicates if client is using fallback (1) or primary (0) beacon node
app_execution_layer_versionGaugeConstant gauge with labels set to the version of the upstream execution layerversion
app_feature_flagsGaugeConstant gauge with custom enabled feature flagsfeature_flags
app_git_commitGaugeConstant gauge with label set to current git commit hashgit_hash
app_health_checksGaugeApplication health checks by name and severity. Set to 1 for failing, 0 for ok.severity, name, description
app_health_checks_failed_totalCounterTotal number of times each health check has been observed failing. Allows querying historical failures via increase().severity, name, description
app_health_metrics_high_cardinalityGaugeMetrics with high cardinality by name.name
app_log_error_totalCounterTotal count of logged errors by topictopic
app_log_loki_dropped_totalCounterTotal count of dropped log lines due to full buffer
app_log_warn_totalCounterTotal count of logged warnings by topictopic
app_monitoring_readyzGaugeSet to 1 if the node is operational and monitoring api /readyz endpoint is returning 200s. Else /readyz is returning 500s and this metric is either set to 2 if the beacon node is down, 3 if the beacon node is syncing, or 4 if quorum peers are not connected.
app_peer_nameGaugeConstant gauge with label set to the name of the cluster peerpeer_name
app_peerinfo_builder_api_enabledGaugeSet to 1 if builder API is enabled on this peer, else 0 if disabled.peer
app_peerinfo_clock_offset_secondsGaugePeer clock offset in secondspeer
app_peerinfo_git_commitGaugeConstant gauge with git_hash label set to peer's git commit hash.peer, git_hash
app_peerinfo_indexGaugeConstant gauge set to the peer index in the cluster definitionpeer
app_peerinfo_nicknameGaugeConstant gauge with nickname label set to peer's Charon nickname.peer, peer_nickname
app_peerinfo_start_time_secsGaugeConstant gauge set to the peer start time of the binary in unix secondspeer
app_peerinfo_versionGaugeConstant gauge with version label set to peer's Charon version.peer, version
app_peerinfo_version_supportGaugeSet to 1 if the peer's version is supported by (compatible with) the current version, else 0 if unsupported.peer
app_start_time_secsGaugeGauge set to the app start time of the binary in unix seconds
app_validator_stack_paramsGaugeParameters for each component of the validator stack in which this Charon instance is deployed intocomponent, cli_parameters
app_versionGaugeConstant gauge with label set to current app versionversion
cluster_networkGaugeConstant gauge with label set to the current network (chain)network
cluster_operatorsGaugeNumber of operators in the cluster lock
cluster_thresholdGaugeAggregation threshold in the cluster lock
cluster_validatorsGaugeNumber of validators in the cluster lock
core_bcast_broadcast_delay_secondsHistogramDuty broadcast delay since the expected duty submission in seconds by typeduty
core_bcast_broadcast_totalCounterThe total count of successfully broadcast duties by typeduty
core_consensus_decided_leader_indexGaugeIndex of the decided leader by protocol and dutyprotocol, duty
core_consensus_decided_roundsGaugeNumber of decided rounds by protocol, duty, and timerprotocol, duty, timer
core_consensus_duration_secondsHistogramDuration of the consensus process by protocol, duty, and timerprotocol, duty, timer
core_consensus_error_totalCounterTotal count of consensus errors by protocolprotocol
core_consensus_timeout_totalCounterTotal count of consensus timeouts by protocol, duty, and timerprotocol, duty, timer
core_fetcher_proposal_blindedGaugeWhether the fetched proposal was blinded (1) or local (2)
core_fetcher_proposal_local_mismatch_fee_recipientGaugeCounts the number of times a local proposal has a mismatched fee recipient
core_parsigdb_exit_totalCounterTotal number of partially signed voluntary exits per public keypubkey
core_parsigdb_storeHistogramLatency of partial signatures received since earliest expected time, per duty, per peer indexduty, peer_idx
core_parsigex_set_verification_secondsHistogramDuration to verify all partial signatures in a received set, in secondsduty
core_scheduler_current_epochGaugeThe current epoch
core_scheduler_current_slotGaugeThe current slot
core_scheduler_duty_totalCounterThe total count of duties scheduled by typeduty
core_scheduler_skipped_slots_totalCounterTotal number times slots were skipped
core_scheduler_submit_registration_errors_totalCounterThe total count of failed submit registration requests
core_scheduler_submit_registration_totalCounterThe total number of submit registration requests
core_scheduler_validator_balance_gweiGaugeTotal balance of a validator by public keypubkey_full, pubkey
core_scheduler_validator_statusGaugeGauge with validator pubkey and status as labels, value=1 is current status, value=0 is previous.pubkey_full, pubkey, status
core_scheduler_validators_activeGaugeNumber of active validators
core_sigagg_slot_aggregation_secondsHistogramTotal duration to aggregate all validators for a duty in a slot, in secondsduty
core_tracker_attestation_expect_totalCounterTotal number of expected attestations for the slot (counts individual attestations, not duties)
core_tracker_attestation_success_totalCounterTotal number of successful attestations for the slot (counts individual attestations, not duties)
core_tracker_expect_duties_totalCounterTotal number of expected duties (failed + success) by typeduty
core_tracker_failed_duties_totalCounterTotal number of failed duties by typeduty
core_tracker_failed_duty_reasons_totalCounterTotal number of failed duties by type and reason codeduty, reason
core_tracker_inclusion_delayGaugeCluster's average attestation inclusion delay in slots. Available only when attestation_inclusion feature flag is enabled.
core_tracker_inclusion_missed_totalCounterTotal number of broadcast duties never included in any block by typeduty
core_tracker_inconsistent_parsigs_totalCounterTotal number of duties that contained inconsistent partial signed data by duty typeduty
core_tracker_participationGaugeSet to 1 if peer participated successfully for the given duty or else 0duty, peer
core_tracker_participation_expected_totalCounterTotal number of expected participations (fail + success) by peer and duty typeduty, peer
core_tracker_participation_missed_totalCounterTotal number of missed participations by peer and duty typeduty, peer
core_tracker_participation_success_totalCounterTotal number of successful participations by peer and duty typeduty, peer
core_tracker_participation_totalCounterTotal number of successful participations by peer and duty typeduty, peer
core_tracker_success_duties_totalCounterTotal number of successful duties by typeduty
core_tracker_unexpected_events_totalCounterTotal number of unexpected events by peerpeer
core_validatorapi_proxy_request_latency_secondsHistogramThe validatorapi proxy request latencies in seconds by pathpath
core_validatorapi_request_error_totalCounterThe total number of validatorapi request errorsendpoint, status_code
core_validatorapi_request_latency_secondsHistogramThe validatorapi request latencies in seconds by endpointendpoint
core_validatorapi_request_totalCounterThe total number of requests per content-type and endpointendpoint, content_type
core_validatorapi_vc_user_agentGaugeGauge with label set to user agent string of requests made by VCuser_agent
p2p_peer_connection_totalCounterTotal number of libp2p connections per peer.peer
p2p_peer_connection_typesGaugeCurrent number of libp2p connections by peer, type (direct or relay), and protocol (tcp, quic). Note that peers may have multiple connections.peer, type, protocol
p2p_peer_network_receive_bytes_totalCounterTotal number of network bytes received from the peer by protocol and transport. Transport is based on first active connection (accurate in steady state).peer, protocol, transport
p2p_peer_network_sent_bytes_totalCounterTotal number of network bytes sent to the peer by protocol and transport. Transport is based on first active connection (accurate in steady state).peer, protocol, transport
p2p_peer_streamsGaugeCurrent number of libp2p streams by peer, direction (inbound or outbound or unknown), protocol and transport.peer, direction, protocol, transport
p2p_ping_error_totalCounterTotal number of ping errors per peerpeer
p2p_ping_latency_secsHistogramPing latencies in seconds per peerpeer
p2p_ping_successGaugeWhether the last ping was successful (1) or not (0). Can be used as proxy for connected peerspeer
p2p_reachability_statusGaugeCurrent libp2p reachability status of this node as detected by autonat: unknown(0), public(1) or private(2).
p2p_relay_connection_typesGaugeCurrent number of libp2p connections by relay, type (direct or relay), and protocol (tcp, quic). Note that peers may have multiple connections.peer, type, protocol
p2p_relay_connectionsGaugeConnected relays by namepeer
relay_p2p_active_connectionsGaugeCurrent number of active connections by peer and clusterpeer, peer_cluster
relay_p2p_connection_totalCounterTotal number of new connections by peer and clusterpeer, peer_cluster
relay_p2p_network_receive_bytes_totalCounterTotal number of network bytes received from the peer and clusterpeer, peer_cluster
relay_p2p_network_sent_bytes_totalCounterTotal number of network bytes sent to the peer and clusterpeer, peer_cluster
relay_p2p_ping_latencyHistogramPing latency by peer and clusterpeer, peer_cluster

Next Steps​

  • See Monitoring Your Node for pre-built Grafana dashboards, alert definitions, and best practices for running your own Prometheus and Grafana server.
  • See Push Metrics and Logs to Obol to send these metrics to Obol's hosted monitoring instead of running your own.