En esta publicación, vamos a aprender cómo monitorear tu nodo AVA usando prometheus.

El binario de AVA expone sus métricas en http://localhost:9650/ext/metrics
Puedes tener una idea de la pinta que tienen usando este comando:

curl -X POST localhost:9650/ext/metrics

La lista es realmente enorme. Más de 1300 métricas disponibles. Todavía estamos intentando determinar cuales de ellas son más interesantes desde el punto de vista del SysAdmin. Una que nunca falla es el número de peers. Puedes ver cómo se muestra eso en la cabecera de este artículo.

Advertencia: Nunca deberías exponer públicamente las métricas de tu nodo. Si lo haces estarás ofreciendo una gran superficie de ataques sobre tu servidor. Lo mejor es que utilices un firewall y permitas la conexión única y exclusivamente a la ip de tu servidor prometheus.

Añadiendo el job a prometheus

Como comentamos en anteriores entradas cada job necesita un nombre único para su bloque de configuración. Edita el archivo de configuración principal de prometheus. Normalmente reside en /etc/prometheus/prometheus.yml   Así es cómo ha quedado el job en el mío:

  - job_name: 'ava-test-node'
    metrics_path: '/ext/metrics'
    static_configs:
    - targets: ['123.123.123.123:9650']
      labels:
        network: 'ava'
        group: 'ava'

Cambia la IP por la de tu nodo y el nombre del job por el hostname de tu nodo. Me suele resultar útil añadir etiquetas (labels). Las usaremos más adelante en el panel de Grafana.

Una vez que hayas añadido el job a tu prometheus sólo tendrás que reiniciar el servicio para que este comience a recolectar las métricas.
Para comprobarlo dirígete a la url de tu prometheus y busca tus métricas de la siguiente manera:

Como puedes ver hay 1342 métricas diferentes. Para representar el número de Peers y obtener algo parecido a la imagen de cabecera de este post usa esta consulta:

gecko_peers{job="YOUR-JOB-NAME"}

Ejecuta la consulta y luego observa en la pestaña Graph el resultado. Una vez que tengas éxito en esto podrás crear tu primer panel en Grafana.

Este es el comienzo del mío. Más abajo puedes encontrar el json correspondiente a este panel. Con el podrás importar este panel en tu grafana para aprovecharlo.

AVA Dasboard (json)

Descarga la última versión:

https://raw.githubusercontent.com/Colm3na/avalanche/master/monitoring/grafana/ava-dashboard.json
{
  "annotations": {
    "list": [
      {
        "builtIn": 1,
        "datasource": "-- Grafana --",
        "enable": true,
        "hide": true,
        "iconColor": "rgba(0, 211, 255, 1)",
        "name": "Annotations & Alerts",
        "type": "dashboard"
      }
    ]
  },
  "editable": true,
  "gnetId": null,
  "graphTooltip": 0,
  "id": 35,
  "iteration": 1591874928400,
  "links": [
    {
      "icon": "external link",
      "tags": [],
      "title": "Blog de ColemenaLabs_SVQ",
      "type": "link",
      "url": "https://blog.colmenalabs.org"
    }
  ],
  "panels": [
    {
      "datasource": null,
      "fieldConfig": {
        "defaults": {
          "custom": {
            "align": null
          },
          "mappings": [],
          "thresholds": {
            "mode": "absolute",
            "steps": [
              {
                "color": "green",
                "value": null
              },
              {
                "color": "red",
                "value": 80
              }
            ]
          }
        },
        "overrides": []
      },
      "gridPos": {
        "h": 3,
        "w": 23,
        "x": 0,
        "y": 0
      },
      "id": 3,
      "options": {
        "displayMode": "lcd",
        "orientation": "horizontal",
        "reduceOptions": {
          "calcs": [
            "last"
          ],
          "values": false
        },
        "showUnfilled": true
      },
      "pluginVersion": "7.0.0",
      "targets": [
        {
          "expr": "up{group=\"[[group]]\",job=\"[[job]]\"}",
          "format": "table",
          "instant": false,
          "interval": "",
          "legendFormat": "{{job}}",
          "refId": "A"
        }
      ],
      "timeFrom": null,
      "timeShift": null,
      "title": "UP",
      "type": "bargauge"
    },
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": null,
      "fieldConfig": {
        "defaults": {
          "custom": {}
        },
        "overrides": []
      },
      "fill": 1,
      "fillGradient": 0,
      "gridPos": {
        "h": 12,
        "w": 23,
        "x": 0,
        "y": 3
      },
      "hiddenSeries": false,
      "id": 2,
      "legend": {
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 1,
      "nullPointMode": "null",
      "options": {
        "dataLinks": []
      },
      "percentage": false,
      "pointradius": 2,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "gecko_peers{group=\"[[group]]\",job=\"[[job]]\"}",
          "interval": "",
          "legendFormat": "{{job}}",
          "refId": "A"
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeRegions": [],
      "timeShift": null,
      "title": "Peers",
      "tooltip": {
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    }
  ],
  "schemaVersion": 25,
  "style": "dark",
  "tags": [],
  "templating": {
    "list": [
      {
        "allValue": null,
        "current": {
          "selected": false,
          "text": "ava",
          "value": "ava"
        },
        "datasource": "DS_PROMETHEUS",
        "definition": "label_values(group)",
        "hide": 0,
        "includeAll": false,
        "label": null,
        "multi": false,
        "name": "group",
        "options": [
          {
            "selected": true,
            "text": "ava",
            "value": "ava"
          },
          {
            "selected": false,
            "text": "kusama",
            "value": "kusama"
          },
          {
            "selected": false,
            "text": "polkadot",
            "value": "polkadot"
          },
          {
            "selected": false,
            "text": "prysm",
            "value": "prysm"
          }
        ],
        "query": "label_values(group)",
        "refresh": 0,
        "regex": "",
        "skipUrlSync": false,
        "sort": 0,
        "tagValuesQuery": "",
        "tags": [],
        "tagsQuery": "",
        "type": "query",
        "useTags": false
      },
      {
        "allValue": null,
        "current": {
          "selected": true,
          "text": "ava-test-node",
          "value": "ava-test-node"
        },
        "datasource": "DS_PROMETHEUS",
        "definition": "label_values(job)",
        "hide": 0,
        "includeAll": false,
        "label": null,
        "multi": false,
        "name": "job",
        "options": [
          {
            "selected": true,
            "text": "ava-test-node",
            "value": "ava-test-node"
          },
          {
            "selected": false,
            "text": "ava_avavirt",
            "value": "ava_avavirt"
          }
        ],
        "query": "label_values(job)",
        "refresh": 0,
        "regex": "/^ava*/",
        "skipUrlSync": false,
        "sort": 0,
        "tagValuesQuery": "",
        "tags": [],
        "tagsQuery": "",
        "type": "query",
        "useTags": false
      }
    ]
  },
  "time": {
    "from": "now-1h",
    "to": "now"
  },
  "timepicker": {
    "refresh_intervals": [
      "10s",
      "30s",
      "1m",
      "5m",
      "15m",
      "30m",
      "1h",
      "2h",
      "1d"
    ]
  },
  "timezone": "",
  "title": "AVA Dashboard",
  "uid": "ColmenaLabs_SVQ",
  "version": 10
}