Cuando se opera un único nodo blockchain, un Prometheus local con Grafana puede ser suficiente. Pero cuando la flota crece a decenas o cientos de nodos, distribuidos en multiples regiones y ejecutando diferentes clientes, se necesita una arquitectura de métricas diseñada para escalar. En esta guía abordamos el diseño del pipeline completo de métricas para infraestructura blockchain: desde la recolección en los nodos hasta el almacenamiento a largo plazo, la visualización y los KPIs específicos que un equipo DevOps debe rastrear.

Diseño del pipeline de métricas

Una arquitectura de métricas para blockchain sigue las mismas capas que cualquier sistema de observabilidad, pero con requisitos específicos:

Capa de recolección

Los nodos blockchain exponen métricas en endpoints HTTP. La recolección se realiza mediante:

Prometheus (modelo pull): Ideal para flotas de nodos donde el servidor de métricas puede alcanzar cada nodo directamente.

# prometheus.yml para una flota multi-nodo
scrape_configs:
  - job_name: 'execution-clients'
    file_sd_configs:
      - files:
          - '/etc/prometheus/targets/execution/*.yml'
        refresh_interval: 30s

  - job_name: 'consensus-clients'
    file_sd_configs:
      - files:
          - '/etc/prometheus/targets/consensus/*.yml'
        refresh_interval: 30s
# /etc/prometheus/targets/execution/nodes.yml
- targets: ['node-01:6060', 'node-02:9091', 'node-03:9091']
  labels:
    region: 'us-east-1'
    environment: 'production'

- targets: ['node-04:6060', 'node-05:9091']
  labels:
    region: 'eu-west-1'
    environment: 'production'

Telegraf (modelo push): Util cuando los nodos estan detras de NAT o firewalls que impiden el scrape directo. Telegraf puede recolectar métricas localmente y enviarlas a un endpoint central:

# telegraf.conf - agente en cada nodo
[[inputs.prometheus]]
  urls = ["http://localhost:6060/debug/metrics/prometheus"]
  metric_version = 2
  [inputs.prometheus.tags]
    node_id = "node-01"
    client = "geth"

[[inputs.prometheus]]
  urls = ["http://localhost:5054/metrics"]
  metric_version = 2
  [inputs.prometheus.tags]
    node_id = "node-01"
    client = "lighthouse"

[[outputs.influxdb_v2]]
  urls = ["https://metrics-central.example.com:8086"]
  token = "${INFLUX_TOKEN}"
  organization = "blockchain-ops"
  bucket = "node-metrics"

Capa de almacenamiento

El almacenamiento local de Prometheus tiene limitaciones para flotas grandes y retención a largo plazo. Las soluciones mas utilizadas son:

Thanos: Extiende Prometheus con almacenamiento en object storage (S3, GCS) y permite consultar multiples instancias de Prometheus de forma unificada.

# Thanos Sidecar junto a cada Prometheus
# docker-compose.yml
services:
  prometheus:
    image: prom/prometheus:latest
    volumes:
      - prometheus-data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--storage.tsdb.min-block-duration=2h'
      - '--storage.tsdb.max-block-duration=2h'

  thanos-sidecar:
    image: thanosio/thanos:latest
    command:
      - 'sidecar'
      - '--tsdb.path=/prometheus'
      - '--prometheus.url=http://prometheus:9090'
      - '--objstore.config-file=/etc/thanos/bucket.yml'
    volumes:
      - prometheus-data:/prometheus

VictoriaMetrics: Alternativa a Prometheus con mejor rendimiento en ingestion y compresion de datos. Compatible con PromQL y el protocolo de remote write de Prometheus:

# Prometheus con remote write a VictoriaMetrics
remote_write:
  - url: "http://victoriametrics:8428/api/v1/write"
    queue_config:
      max_samples_per_send: 10000
      batch_send_deadline: 5s
      max_shards: 30

Comparación de opciones de almacenamiento

AspectoPrometheus localThanosVictoriaMetrics
RetenciónLimitada (semanas)Ilimitada (object storage)Configurable
Multi-regiónNoSi (query federado)Si (cluster)
CompresionBuenaExcelente (object storage)Superior
ComplejidadBajaAltaMedia
PromQLNativoCompatibleCompatible

Capa de visualización

Grafana sigue siendo la herramienta dominante para visualización de métricas blockchain. La clave esta en organizar los dashboards por nivel de abstracción:

  • Vista de flota: Estado general de todos los nodos, porcentaje sincronizado, alertas activas.
  • Vista por nodo: Detalle de un nodo específico con todas sus métricas.
  • Vista por cliente: Comparación de rendimiento entre diferentes implementaciones de clientes.
  • Vista de negocio: KPIs de alto nivel relevantes para staking (rendimiento, penalties, balance).

KPIs específicos para blockchain

Mas alla de las métricas técnicas de cada nodo, una arquitectura de métricas madura debe rastrear KPIs de negocio y operacionales:

Transacciones por segundo (TPS)

# TPS calculado a partir de las transacciones incluidas en bloques
sum(rate(chain_transactions_total[5m]))

El TPS real de la red vs el TPS que tu infraestructura puede procesar es un indicador crítico de capacidad.

Finality time

El tiempo de finalización mide cuanto tarda una transacción en ser considerada irreversible:

# Epochs desde la ultima finalizacion
beacon_head_slot / 32 - beacon_finalized_epoch

En Ethereum, la finalización ocurre cada 2 epochs (~12.8 minutos) en condiciones normales. Un aumento en este tiempo indica problemas en la red.

Attestation effectiveness

Para operadores de validadores, la efectividad de atestación impacta directamente en los ingresos:

# Porcentaje de atestaciones incluidas exitosamente
validator_attestation_hit_percentage

# Distancia promedio de inclusion
avg(validator_attestation_inclusion_distance)

Una atestación incluida en el slot inmediato siguiente es optima (distancia 1). Distancias mayores reducen las recompensas.

Participation rate

# Tasa de participacion de la red
beacon_current_justified_epoch_participation_rate

Una participación por debajo del 66% impide la finalización y es un evento crítico para toda la red.

Disponibilidad del nodo

# Uptime calculado con probe_success (blackbox exporter)
avg_over_time(probe_success{job="blockchain-nodes"}[30d]) * 100

Monitoreo multi-nodo

Cuando se operan multiples nodos, la arquitectura debe soportar comparaciones y correlaciones:

Service discovery dinámico

Para flotas que escalan automáticamente (por ejemplo, en Kubernetes), el service discovery automático es esencial:

# Prometheus con Kubernetes service discovery
scrape_configs:
  - job_name: 'ethereum-nodes'
    kubernetes_sd_configs:
      - role: pod
        namespaces:
          names: ['blockchain']
    relabel_configs:
      - source_labels: [__meta_kubernetes_pod_label_app]
        regex: 'ethereum-.*'
        action: keep
      - source_labels: [__meta_kubernetes_pod_label_client]
        target_label: client
      - source_labels: [__meta_kubernetes_pod_label_layer]
        target_label: layer

Recording rules para rendimiento

Las recording rules pre-calculan métricas agregadas frecuentemente consultadas, reduciendo la carga en Prometheus:

# recording_rules.yml
groups:
  - name: blockchain-aggregations
    interval: 30s
    rules:
      - record: blockchain:sync_percentage:avg
        expr: avg by (region, client) (
          chain_head_block / ignoring(region, client) group_left
          max(chain_head_block)
        ) * 100

      - record: blockchain:peer_count:avg_by_region
        expr: avg by (region) (p2p_peers)

      - record: blockchain:attestation_effectiveness:avg
        expr: avg by (node_id) (validator_attestation_hit_percentage)

      - record: blockchain:disk_usage_percent:by_node
        expr: 1 - (node_filesystem_avail_bytes{mountpoint="/data"} /
          node_filesystem_size_bytes{mountpoint="/data"})

Capacity planning

Las métricas historicas son fundamentales para planificar la capacidad de la infraestructura:

Proyección de uso de disco

# Tasa de crecimiento de disco por dia
deriv(node_filesystem_size_bytes{mountpoint="/data"}[7d]) * 86400

# Dias restantes antes de quedarse sin espacio
(node_filesystem_avail_bytes{mountpoint="/data"})
  / (deriv(node_filesystem_size_bytes{mountpoint="/data"} -
     node_filesystem_avail_bytes{mountpoint="/data"}[7d]) * 86400)

Planificación de recursos

Datos tipicos de crecimiento para nodos Ethereum (orientativo):

RecursoGeth (snap)Nethermind (snap)Erigon (archive)
Disco (crecimiento/mes)~40-60 GB~40-60 GB~20-30 GB
RAM recomendada16 GB16 GB16 GB
IOPS requeridos10k+10k+15k+
Ancho de banda~25 Mbps~25 Mbps~25 Mbps

Estos valores cambian con los upgrades de protocolo y el nivel de actividad de la red.

Integración con alertas y respuesta

La arquitectura de métricas se completa con un sistema de respuesta que conecte las alertas con acciones:

# Ejemplo: alerta que activa un runbook automatizado
groups:
  - name: blockchain-response
    rules:
      - alert: NodeDiskCritical
        expr: blockchain:disk_usage_percent:by_node > 0.90
        for: 5m
        labels:
          severity: critical
          runbook: "https://wiki.internal/runbooks/blockchain-disk-full"
        annotations:
          summary: "Disco critico en {{ $labels.node_id }}"
          action: "Ejecutar pruning o expandir volumen"

Conclusion

Una arquitectura de métricas bien diseñada es la base de operaciones blockchain confiables a escala. El pipeline desde la recolección (Prometheus, Telegraf), pasando por el almacenamiento (Thanos, VictoriaMetrics), hasta la visualización (Grafana) y las alertas (Alertmanager) debe disenarse considerando el crecimiento de la flota, la retención de datos historicos para capacity planning, y los KPIs específicos de blockchain como TPS, finality y attestation effectiveness. Invertir en esta arquitectura temprano evita problemas operativos costosos cuando la infraestructura escala.

Recursos