Bonjour à tous. Oui, je sais, nous sommes vendredi et je vois que nombre d’entre vous sont déjà déçus de ne pas avoir de billet “Rognotudju”. Même si l’envie ne m’en manque pas, je vais être plus constructif en cette veille de week-end bienvenue ! Je vous propose dans ce petit billet de vous présenter une méthode ‘artisanale’ vous permettant de superviser les débits des ports de vos différents tier0/tier1 via les API, le tout envoyé et graphé vers une base classique Telegraf/InfluxDB/Grafana.
Extraire les metrics des API
L’API REST de NSX-T est extrêmement riche, c’est même la première méthode développée par VMware pour configurer et gérer le produit, plus encore que l’interface Web (on en a déjà parlé sur vBlog ^^). A ce titre, sa documentation est très fournie (voir ici, attention, l’affichage prend du temps). Cela nous a permis de trouver ce qu’il nous fallait assez vite.
Notre objectif ici est donc d’extraire des données de débits ou de volumes des ports logiques de routeurs T0 ou T1. Pour cela on va utiliser la méthode GET /logical-router-ports/. Dans la pratique cela se traduit par une requête complète de ce type, via curl :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
cedric@monptiserveur:~/tests$ curl -sk -u audit:XXXXXXX https://nsx.monlab.local/api/v1/logical-router-ports/ | grep -A 1 "\"id\"" "id" : "XXXXXXXX-0862-4b80-8734-AAAAEEEEEEEE", "display_name" : "infra-commun-dlrp", -- "id" : "XXXXXXXX-60c1-4674-96fc-AAAAEEEEEEEE", "display_name" : "infra-segment-prod-dlrp", -- "id" : "XXXXXXXX-d157-4b4b-b140-AAAAEEEEEEEE", "display_name" : "infra-segment-admin-dlrp", -- "id" : "XXXXXXXX-37d1-4321-8871-AAAAEEEEEEEE", "display_name" : "infra-segment-test-dlrp", (...) |
En retour, on obtient la liste exhaustive de tous les ports logiques de tous les routeurs en place dans l’infrastructure NSX-T. Autant dire que cela peut faire du monde. Ce qu’il faut retenir ici c’est que chaque port logique est identifié (comme tout objet NSX par ailleurs) par un UUID au format “XXXXXXXX-BBBB-CCCC-DDDD-EEEEEEEEEEEE”. C’est avec cet UUID que l’on va pouvoir extraire les statistiques recherchées. Il faut également récupérer l’UUID du edge node duquel vous souhaitez extraire les stats. En effet, que vous ayez choisi le mode actif/standby ou l’actif-actif lors de la définition de vos routeurs, les statisques sont spécifiques à chaque instance déployée et donc spécifiques au edge node que vous allez interroger.
Ensuite, il suffit de produire une requête GET /logical-router-ports/XXXXXXXX-BBBB-CCCC-DDDD-EEEEEEEEEEE/statistics?transport_node_id=YYYYYYYY-BBBB-CCCC-DDDD-EEEEEEEEEEE avec les bon UUID et vous obtenez une sortie JSON de ce type :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
cedric@monptiserveur:~/tests$ curl -sk -u audit:XXXXXXX https://nsx.monlab.local/api/v1/logical-router-ports/XXXXXXXX-BBBB-CCCC-DDDD-EEEEEEEEEEE/statistics?transport_node_id=YYYYYYYY-BBBB-CCCC-DDDD-EEEEEEEEEEE { "logical_router_port_id" : "XXXXXXXX-BBBB-CCCC-DDDD-EEEEEEEEEE", "per_node_statistics" : [ { "transport_node_id" : "YYYYYYYY-BBBB-CCCC-DDDD-EEEEEEEEEEE", "last_update_timestamp" : 1576228132121, "rx" : { "total_bytes" : 5825852644, "total_packets" : 7076337, "dropped_packets" : 0 }, "tx" : { "total_bytes" : 1623133039, "total_packets" : 3863172, "dropped_packets" : 0 } } ] } |
Les données intéressantes sont là, à porter de main : total_bytes, total_packets et dropped_packets. Le reste n’est que de la mise en forme et du scripting. A noter que vous pouvez aussi superviser unitairement un port au sein de vos segments, utilisez plutôt la méthode basée GET /logical-ports/ , ça marche très bien aussi !
Comment trouver facilement les UUID de vos logical ports et edge nodes
Si vous êtes familier des requêtes REST API, vous pouvez vous en sortir en ligne de commande, mais il y a un moyen plus simple de retrouver les UUID dont vous aurez besoin via l’interface de management. Pour les edges nodes, rendez-vous dans la section “System”, onglet “Fabric->Nodes”. Ensuite cliquez directement sur l’ID du edge node pour le consulter en totalité.
Pour la partie logical port des routeurs, rendez-vous cette fois-ci dans “Advanced Network & Security”, onglet “Routers”, puis ouvrez la fiche du routeur cible. Enfin, ouvrez le menu contextuel “Configuration” puis “Router ports”. Il vous suffit, comme pour les edges node, dans la liste des port, de cliquer sur l’ID pour l’afficher en entier.
Mise en forme pour Telegraf/InFluxDB
On est paré pour extraire les données de NSX-T, les mettre en forme et les injecter dans InfluxDB via Telegraf. Pour se faire, j’ai construit un petit script sans grosses ambitions pour le moment, mais “qui fait le taff” comme on dit (Il faudrait sans doute pas mal le faire évoluer notamment pour la gestion des exceptions et erreurs). En entrée, vous indiquez l’UUID du logical port à interroger, suivi d’une description (plus facile de sélectionner une description qu’un UUID de port dans l’interface Grafana ^^) et enfin, le nom du edge node (vers lequel on fait un simple mapping nom->UUID). Nous avons aujourd’hui deux TIER0 en production chez nous, donc assez logiquement 4 edge nodes.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
#!/bin/sh # Constantes LOGFILE="/tmp/get_nsx_interface_stats.log" BASE_URL="https://nsx.monlab.local/api/v1" AUTHENT="audit:MonSuperMDP" EDGE1_UUID="e7e904e9-1943-46f0-880f-627c4386487c" EDGE2_UUID="e3da0c77-7727-4881-be9d-a7a9c865db2b" EDGE3_UUID="0ccb0d6c-200e-4a54-952d-7ef124a08520" EDGE4_UUID="10dd7c3f-9628-47c4-963d-42897693300f" GET_LP="/logical-router-ports/" # Gestion (a la hussarde) des options de ligne de commaned if [ "$1" = "" ]; then echo "USAGE: $0 port-uuid port-description edge-name" exit 0 fi if [ "$2" = "" ]; then DESC="no-desc" else DESC=$2 fi PORT_UUID=$1 CUR_DATE=`date +%s` # Mapping edge name vers UUID (lisibilite dans la conf Telegraf) case $3 in "nsxedgeprd1") EDGE_NAME="nsxedgeprd1" EDGE_UUID=$EDGE1_UUID ;; "nsxedgeprd2") EDGE_NAME="nsxedgeprd2" EDGE_UUID=$EDGE2_UUID ;; "nsxedgeprd3") EDGE_NAME="nsxedgeprd3" EDGE_UUID=$EDGE3_UUID ;; "nsxedgeprd4") EDGE_NAME="nsxedgeprd4" EDGE_UUID=$EDGE4_UUID ;; *) EDGE_NAME="nsxedgeprd1" EDGE_UUID=$EDGE1_UUID ;; esac # Request NSX API COMPLETE_URL="${BASE_URL}$GET_LP${PORT_UUID}/statistics?transport_node_id=${EDGE_UUID}" curl -sk -u $AUTHENT $COMPLETE_URL >/tmp/nsx_out_$$ # Mise en forme pour Telegraf vers InfluxDB RX_BYTES=`cat /tmp/nsx_out_$$ | grep -A 3 "rx" | head -2 | tail -1 | cut -d ':' -f 2 | tr -d ", "` TX_BYTES=`cat /tmp/nsx_out_$$ | grep -A 3 "tx" | head -2 | tail -1 | cut -d ':' -f 2 | tr -d ", "` echo "nsx_perf,port_uuid=$PORT_UUID,edge_uuid=$EDGE_UUID,edge_name=$EDGE_NAME,desc=$DESC rx_bytes=$RX_BYTES ${CUR_DATE}000000000" echo "nsx_perf,port_uuid=$PORT_UUID,edge_uuid=$EDGE_UUID,edge_name=$EDGE_NAME,desc=$DESC tx_bytes=$TX_BYTES ${CUR_DATE}000000000" ### DEBUGGING #echo "DEBUG: curl -sk -u $AUTHENT $COMPLETE_URL" >>$LOGFILE #echo "DEBUG: edge_name: $EDGE_NAME / edge_uuid: $EDGE_UUID / port_uuid: $PORT_UUID" >>$LOGFILE #echo "DEBUG: rx=$RX_BYTES tx=$TX_BYTES" >>$LOGFILE #echo "DEBUG: nsx_perf,port_uuid=$PORT_UUID,edge_uuid=$EDGE_UUID,edge_name=$EDGE_NAME,desc=$DESC rx_bytes=$RX_BYTES ${CUR_DATE}000000000" >>$LOGFILE #echo "DEBUG: nsx_perf,port_uuid=$PORT_UUID,edge_uuid=$EDGE_UUID,edge_name=$EDGE_NAME,desc=$DESC tx_bytes=$TX_BYTES ${CUR_DATE}000000000" >>$LOGFILE rm /tmp/nsx_out_$$ exit 0 |
Ce script, lancé directement avec les bonne infos, renvoie deux lignes spécifiques compatible avec l’injection Telegraf->InfluxDB :
1 2 3 |
cedric@monptiserveur:~/tests$ ./get_nsx_lp_stats.sh f8fbe852-e4ed-4a36-ad88-368f28be9783 downlink-segment-toto nsxedgeprd3 nsx_perf,port_uuid=f8fbe852-e4ed-4a36-ad88-368f28be9783,edge_uuid=0ccb0d6c-200e-4a54-952d-7ef124a08520,edge_name=nsxedgeprd3,desc=downlink-segment-toto rx_bytes=5826339477 1576231555000000000 nsx_perf,port_uuid=f8fbe852-e4ed-4a36-ad88-368f28be9783,edge_uuid=0ccb0d6c-200e-4a54-952d-7ef124a08520,edge_name=nsxedgeprd3,desc=downlink-segment-toto tx_bytes=1624069310 1576231555000000000 |
Coté Telegraf, la configuration est très simple, il vous suffit d’ajouter cette source avec des valeurs adaptées :
1 2 3 4 5 6 |
# port downlink du tier1-public-toto vers le segment segment-toto [[inputs.exec]] commands = ["get_nsx_lp_stats.sh f8fbe852-e4ed-4a36-ad88-368f28be9783 downlink-segment-toto nsxedgeprd3"] timeout = "120s" data_format = "influx" interval = "60s" |
C’est bôô !
Les informaticiens sont souvent des gens simples, qui s’émerveillent de pixels formant des courbes souvent incompréhensibles par le “vulgus pecum”. Donc, on va s’extasier ensemble, voila ce que ça peut donner avec une petite dizaine de requêtes NSX-T intégrées et mises en formes sur Grafana :
Comme toujours, n’hésitez pas à commenter, surtout ce genre d’articles techniques, cela permet d’enrichir le sujet !
5
Hi,
Thank you for this article, where do i need telegraf agent, how does this setup work ?
Thanks
Basem
Hi,
The telegraf agent is needed to execute the NSX scripts and send back the returned informations to influxDB. You can get more info about this Telegraf/influxDB/Grafana pipeline on many web sites and technical blogs.
Regards,
Cédric
Thank you for your response, can i put all of them together on same linux machine ( telegraf, infludb and Grafana) .
Thank you in advance .
Hello Basem, yes, sure, my little VM hosts all the components as well as my NSX scripts.