DBA Mary extraordinaire,
Qu’est-ce qui fait grandir vos tables ?
Lorsque les requêtes se propulsent dans mon shell TSQL
les données sont ingérées en petites rangées soignées.
Ce sera probablement le dernier article de ma série sur la surveillance du serveur DNS pihole. Vous pouvez trouver la partie 1, « Votre Pi-Hole est une riche source de données », ici et la partie 2, « Mind the Gap », ici. Si vous avez lu, il devrait être clair qu’il ne s’agit pas tant du pi-hole en particulier que de la manière dont New Relic vous permet de manipuler les données d’observabilité. La vérité est que le pi-hole m’a fourni un certain nombre d’excellents exemples des différentes façons dont les données peuvent se présenter à partir de divers systèmes.
Cela dit, dans cet article, je vais aborder une situation qui se produit souvent avec la sortie JSON — des données qui doivent être enregistrées sous forme de lignes séquentielles sous un seul champ mais qui finissent par être réparties sur plusieurs champs.
Je vais continuer à tirer parti du pi-trou pour cet exemple. Dans le post précédent, toute notre attention était concentrée sur la sortie d’un point de terminaison d’API unique : ?summaryRaw
. Mais, le pi-hole a de nombreux autres points de terminaison qui émettent des données, notamment :
topItems=xx
— affiche les xx meilleurs domaines et les meilleurs annonceurs demandés.topClients=xx
— affiche les principales sources de requêtes DNS au sein de votre réseau.- getForwardDestinations – Affiche les serveurs DNS externes où vont les requêtes DNS une fois qu’elles sortent de votre réseau.
getQueryTypes
— Afficher le volume de chaque type de requête DNS (A, AAAA, PTR, SRV, etc.).
(Vous pouvez en savoir plus sur tous les points de terminaison API possibles dans cet article.).
Considérons donc une intégration Flex configurée pour rassembler certaines des informations que j’ai identifiées ci-dessus :
integrations:
- name: nri-flex
config:
name: badpihole
apis:
- name: badpihole_querytypes
url: http://pi.hole/admin/api.php?getQueryTypes&auth=abcdefg1234567890 #your auth key goes here
headers:
accept: application/json
(Notez que j’ai volontairement nommé les éléments « mauvais » pour que vous puissiez les trouver car, finalement, je ne pense pas qu’ils aient de la valeur dans le format actuel)
Lorsque vous le regardez dans NRQL, vous verrez un résultat comme celui-ci :
Le problème devient encore pire lorsque les résultats sont très variables. Par exemple, topItems
renverra les meilleurs domaines et annonceurs pour une période donnée. Bien que cela POURRAIT rester quelque peu cohérent, dans des réseaux plus grands ou plus dynamiques, cette liste peut changer radicalement.
Donc, avec l’élément YAML de :
- name: badpihole_topitems
url: http://pi.hole/admin/api.php?topItems=10&auth=abcdefg1234567890 #your auth key goes here
headers:
accept: application/json
Vous pouvez voir le nombre de colonnes augmenter d’un instant à l’autre :
Ce qu’il faut, c’est transformer les données entrantes de sorte qu’au lieu d’apparaître comme ceci :
"top_ads.unity3d.com": 54,
"top_ads.display.ravm.tv": 90,
"top_ads.hbopenbid.pubmatic.com": 49,
Au lieu de cela, il est réorganisé dans un format plus semblable à celui-ci :
Name: "top_ads.display.ravm.tv",
Count: 90,
Name: "top_ads.display.ravm.tv"
Count: 90,
Name: "top_ads.hbopenbid.pubmatic.com"
Count: 49,
Le résultat ressemble à ceci lorsqu’il est affiché dans New Relic :
Puissance cosmique phénoménale, Itty Bitty Command
Comment cette transformation s’opère-t-elle ? Grâce à l’utilisation remarquablement simple du jq
utilitaire. j’ai mentionné jq
dans la partie 2 de cette série où l’utilisation était beaucoup plus complexe.
Comme cela arrive souvent dans la technologie, ce que nous demandons est une opération beaucoup plus complexe, et pourtant la structure est bien plus facile à comprendre :
jq: >
.[]|.top_queries|to_entries|map({queryname:.key,querycount:.value})
Comme avec le jq
sorcellerie dans mon dernier post ; cela est dû en grande partie au génie de mon collègue Haihong Ren. En plaçant cette ligne dans le contexte d’un fichier Flex YAML complet, cela ressemblerait à ceci :
integrations:
- name: nri-flex
config:
name: pihole
apis:
- name: pihole_topitems
url: http://pi.hole/admin/api.php?topItems=10&auth=abcdefg1234567890 #your auth key goes here
headers:
accept: application/json
jq: >
.[]|.top_queries|to_entries|map({queryname:.key,querycount:.value})
Le résultat, comme je l’ai montré plus tôt, est des données plus faciles à résumer, interroger, trier, sélectionner et afficher.
Section bonus spéciale Clip-and-Save
Il n’y a pas vraiment grand-chose à résumer ici, sauf pour souligner que la plate-forme de New Relic n’est pas seulement suffisamment flexible pour vous permettre de collecter à peu près n’importe quel type de télémétrie dont vous avez besoin ; mais aussi pour les manipuler afin de transformer les données en informations, ce qui motive une action réfléchie au sein de votre organisation.
Si vous souhaitez essayer tout cela par vous-même mais préférez ne pas avoir à tout CONSTRUIRE vous-même (et en cela, j’applaudis votre engagement envers l’économie d’effort), alors vous trouverez ci-dessous le fichier YAML complet. Et voici un lien vers un démarrage rapide avec le tableau de bord illustré ci-dessus.
integrations:
- name: nri-flex
config:
name: pihole
variable_store:
authkey: abcdefg1234567890 #your auth key goes here
# In order for this integration to work, you need to include your pihole API key.
# You can get the token by loggin into your pihole and going to Settings/API/Show API token
# or by connecting directly to the pihole device and getting the WEBPASSWORD variable from /etc/pihole/setupVars.conf
apis:
- name: pihole_summary
url: http://pi.hole/admin/api.php?summaryRaw&auth=${var:authkey}
headers:
accept: application/json
- name: pihole_topitems
url: http://pi.hole/admin/api.php?topItems=10&auth=${var:authkey}
headers:
accept: application/json
jq: >
.[]|.top_queries|to_entries|map({queryname:.key,querycount:.value})
- name: pihole_topclients
url: http://pi.hole/admin/api.php?topClients=10&auth=${var:authkey}
headers:
accept: application/json
jq: >
.[]|.top_sources|to_entries|map({clientname:.key,clientcount:.value})
- name: pihole_toforwarddest
url: http://pi.hole/admin/api.php?getForwardDestinations&auth=${var:authkey}
headers:
accept: application/json
jq: >
.[]|.forward_destinations|to_entries|map({destinationname:.key,destinationcount:.value})
- name: pihole_querytypes
url: http://pi.hole/admin/api.php?getQueryTypes&auth=${var:authkey}
headers:
accept: application/json
jq: >
.[]|.querytypes|to_entries|map({querytype:.key,querycount:.value})
- name: pihole_recentblocked
url: http://pi.hole/admin/api.php?recentBlocked&auth=${var:authkey}
headers:
accept: application/json