Arista vEOS-lab, gNMIc et Prometheus

Dernière modification le 30 octobre 2020

La destination Prometheus pour gNMIc avait été promise et elle a été développée. C’est l’occasion de réaliser un test pour voir comment utiliser gNMI/gRPC pour s’abonner à de la télémétrie sur un équipement réseau et stocker les résultats dans Prometheus de manière à l’afficher dans Grafana.

Le test est réalisé sur un commutateur virtuel Arista vEOS-lab version 4.24.2.3F tournant dans le simulateur EVE-NG. Hormis la configuration de base permettant l’accès au commutateur, seules ces quelques lignes suffisent pour utiliser gNMI/gRPC :

!
management api gnmi
   transport grpc default
!

L’objectif étant d’utiliser gNMIc comme un « Exporter » Prometheus, on va commencer par simplifier la ligne de commande au maximum afin de pouvoir le lancer facilement comme un service. Toujours dans un soucis de simplification, le comportement par défaut de gNMIc, par rapport au fichier de configuration, est respecté. Il est de la forme $HOME/gnmic.[yml, toml, json].

# gNMI target address; CLI flag --address
address: "192.168.199.61:6030"
# gNMI target user name; CLI flag --username
username: admin
# gNMI target user password; CLI flag --password
password: arista
# Connection mode; CLI flag --insecure
insecure: true

subscriptions:
  # A named subscription, a key is a name
  port_stats:
    # List of subscription paths for that named subscription
    paths:
      - "/interfaces/interface[name=Management1]/subinterfaces/subinterface/state/counters/in-octets"
      - "/interfaces/interface[name=Management1]/subinterfaces/subinterface/state/counters/out-octets"
    # One of [on-change target-defined sample]
    stream-mode: sample
    sample-interval: 5s
    qos: 0

outputs:
  group1:
    - type: prometheus
      # Address to listen on for incoming scape requests
      listen: :9804
      # Path to query to get the metrics
      path: /metrics
      # Maximum lifetime of metrics in the local cache
      expiration: 60s
      # Enable debug for prometheus output
      debug: false

Les paths utilisés sont issus du module YANG openconfig-interfaces.yang et les valeurs recueillies permettent la génération des métriques Prometheus selon la logique décrite dans le diagramme ci-dessous.

gNMIc Prometheus Metrics
Génération du métrique Prometheus (source : karimra/gnmic)

Le nom du métrique Prometheus commence par la chaîne gnmic, puis vient le nom de la subscription tel que spécifié dans le fichier de configuration gnmic, suivi du chemin gNMI allégé de ses clés s’il y en a. Les labels de métriques sont générés à partir des métadonnées de subscription (comme le nom de l’abonnement et la source) et des clés présentes dans les éléments du path gNMI.

Pour lancer gNMIc en tant que service, le fichier /etc/systemd/system/gnmic.service est créé avec le contenu suivant :

[Unit]
Description=gNMIc
Wants=network-online.target
After=network-online.target

[Service]
User=gilbert
Group=gilbert
Type=simple
ExecStart=/usr/local/bin/gnmic subscribe

[Install]
WantedBy=multi-user.target

Le fichier est pris en compte et lancé à l’aide des commandes sudo systemctl daemon-reload et sudo systemctl start gnmic.

Dans ce test, Prometheus et Grafana sont installés sur la même machine virtuelle Linux Ubuntu 20.04 que gNMIc. La configuration de Prometheus consiste à rajouter ces quelques lignes dans le fichier /etc/prometheus/prometheus.yml au chapitre scrape_configs.

  scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # Override the global default and scrape targets from this job every 5 seconds.
    scrape_interval: 5s
    scrape_timeout: 5s

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ['localhost:9090']

  - job_name: node
    # If prometheus-node-exporter is installed, grab stats about the local
    # machine by default.
    static_configs:
      - targets: ['localhost:9100']

  - job_name: gnmic
    # The job for gNMI / gRPC
    static_configs:
      - targets: ['localhost:9804']

Après avoir relancé Prometheus, il est possible de vérifier la prise en compte de la nouvelle cible gNMIc.

Prometheus Targets
Prise en compte effective de gNMIc

Dans Grafana, il convient de configurer une nouvelle source de données Prometheus, si ce n’était déjà fait, et de construire des Queries sur le panel du Dashboard.

Grafana Queries
Grafana Queries

Après application de la logique de transformation décrite plus haut, les requêtes sont de la forme :

(irate(gnmic_port_stats_interfaces_interface_subinterfaces_subinterface_state_counters_in_octets{instance="localhost:9804",interface_name="Management1",job="gnmic",source="192.168.199.61:6030",subinterface_index="0",subscription_name="port_stats"}[5m])*8)

(irate(gnmic_port_stats_interfaces_interface_subinterfaces_subinterface_state_counters_out_octets{instance="localhost:9804",interface_name="Management1",job="gnmic",source="192.168.199.61:6030",subinterface_index="0",subscription_name="port_stats"}[5m])*8)
Grafana Panel

Pour voir la structure xpath que j’ai utilisé, j’ai généré la structure du module openconfig-interfaces.yang au format UML (vous pouvez l’agrandir en cliquant dessus).

openconfig-interfaces format UML