Validator health

ValidatorPulse

Keep operators healthy and catch downtime or penalties early. Answers one question: is my {{ snapshot.operator_label }} operating correctly?

{{ snapshot.chain_display_name }} {% if snapshot.chain == 'polkadot' and snapshot.parachain_id %} para {{ snapshot.parachain_id }} · {{ snapshot.reward_token_symbol }} {% elif snapshot.chain == 'polkadot' %} {{ snapshot.reward_token_symbol }} {% endif %} {% if snapshot.demo_mode %} Demo mode {% endif %}
{{ snapshot.verdict.status }}

{{ snapshot.verdict.answer }}

{{ snapshot.verdict.summary }}

Collected
{{ snapshot.collected_at }}
operator_effectiveness_score
{{ snapshot.metrics.validator_effectiveness_score }}%
Effectiveness
operator_missed_primary_duties_total
{{ snapshot.metrics.validator_missed_attestations_total }}
{{ snapshot.missed_duty_label }}
operator_risk_score
{{ snapshot.metrics.validator_slashing_risk_score }}
{{ snapshot.risk_label }}
{% set duty_legend = namespace(show=false) %} {% for v in snapshot.validators %} {% if v.recent_attestations or v.recent_proposals or v.recent_duties %} {% set duty_legend.show = true %} {% endif %} {% endfor %}

{{ snapshot.operator_label|capitalize }} monitoring

{{ snapshot.validators|length }} {{ snapshot.operator_label }}{% if snapshot.validators|length != 1 %}s{% endif %}
{% if duty_legend.show %}

success late missed pending

{% endif %}
{% for v in snapshot.validators %}
{% if v.operator_index is not none %}#{{ v.operator_index }}{% else %}{{ v.operator_id }}{% endif %}
{% if v.display_name %}
{{ v.display_name }}
{{ v.pubkey or v.operator_id or "—" }}
{% elif v.pubkey %}
{{ v.pubkey }}
{% elif v.operator_index is not none and v.operator_id and v.operator_id != (v.pubkey or '') %}
{{ v.operator_id }}
{% endif %}
{{ v.status }}
{{ format_balance(v.balance_base_units if v.balance_base_units is not none else v.balance_gwei, snapshot) }}
Effectiveness{{ v.effectiveness_score }}%
{{ snapshot.risk_label }}{{ v.risk_score if v.risk_score is not none else v.slashing_risk_score }}
{{ snapshot.primary_duty_label }}
{{ v.attestations.successful }}/{{ v.attestations.expected }}
Missed
{{ v.attestations.missed }}
{{ snapshot.secondary_duty_label }}
{{ v.proposals.successful }}/{{ v.proposals.expected or "—" }}
{% if snapshot.chain == 'ethereum' %} Window rewards · {{ "complete" if v.reward_data_complete else "partial" }} {% else %} Rewards {% endif %}
{{ format_rewards(v.rewards_base_units if v.rewards_base_units is not none else v.rewards_gwei, snapshot) }}
{% if v.recent_attestations or v.recent_proposals or v.recent_duties %}
{% if v.recent_attestations %}
Recent {{ snapshot.primary_duty_label|lower }}
{% for d in v.recent_attestations %} {{ d.outcome[0]|upper }} {% endfor %}
{% endif %} {% if v.recent_proposals %}
Recent {{ snapshot.secondary_duty_label|lower }}
{% for d in v.recent_proposals %} {{ d.outcome[0]|upper }} {% endfor %}
{% endif %} {% if v.recent_duties and not v.recent_attestations and not v.recent_proposals %}
Recent duties
{% for d in v.recent_duties %} {{ d.outcome[0]|upper }} {% endfor %}
{% endif %}
{% endif %}
{% endfor %}

Consensus

{{ snapshot.consensus.status }}
{% if snapshot.chain == 'polkadot' %}Head block{% else %}Head slot{% endif %}
{{ "{:,}".format(snapshot.consensus.head_slot) }}
Sync distance
{{ snapshot.consensus.sync_distance }}
{% if snapshot.chain == 'polkadot' %}Finalized block{% else %}Finalized epoch{% endif %}
{{ "{:,}".format(snapshot.consensus.finalized_epoch) }}
{% if snapshot.chain == 'polkadot' %}Best block{% else %}Justified epoch{% endif %}
{{ "{:,}".format(snapshot.consensus.justified_epoch) }}
Peers
{{ snapshot.consensus.connected_peers }}/{{ snapshot.consensus.peer_count }}
{{ snapshot.consensus_node_label }}
{{ "reachable" if snapshot.consensus.beacon_reachable else "down" }}
{% if snapshot.consensus.last_error %}

{{ snapshot.consensus.last_error }}

{% endif %}

Infrastructure

{{ snapshot.infrastructure.status }}
CPU{{ snapshot.infrastructure.cpu_usage_percent }}%
Memory{{ snapshot.infrastructure.memory_usage_percent }}%
Disk{{ snapshot.infrastructure.disk_usage_percent }}%
Disk latency
{{ snapshot.infrastructure.disk_latency_ms }} ms
Clock drift
{{ snapshot.infrastructure.clock_drift_ms }} ms
Network
{{ "healthy" if snapshot.infrastructure.network_healthy else "unhealthy" }}

Alerting

Telegram, Slack, Discord, webhooks, and PagerDuty.

{% for channel in channels %} {{ channel }} · {% if channel in snapshot.configured_channels %}on{% else %}off{% endif %} {% endfor %}
{% if not snapshot.recent_alerts %}

No recent alerts.

{% else %} {% for alert in snapshot.recent_alerts[:6] %}
{{ alert.severity }} {{ alert.created_at }}
{{ alert.title }}
{{ alert.message }}
{% endfor %} {% endif %}

Metrics scrape

Prometheus-compatible endpoint for the core KPIs.

# HELP operator_effectiveness_score ...
operator_effectiveness_score{chain="{{ snapshot.chain }}"} {{ snapshot.metrics.validator_effectiveness_score }}
operator_missed_primary_duties_total{chain="{{ snapshot.chain }}"} {{ snapshot.metrics.validator_missed_attestations_total }}
operator_risk_score{chain="{{ snapshot.chain }}",risk_kind="{{ snapshot.risk_kind }}"} {{ snapshot.metrics.validator_slashing_risk_score }}
# legacy aliases still exported: validator_* / *_gwei
Open /api/metrics