Jusqu'à présent, vous avez appris les bases de l'utilisation de NRQL, comment utiliser NRQL pour contrôler vos données et comment utiliser NRQL pour faire progresser votre dashboard. Dans cette dernière série de didacticiels, vous apprendrez les techniques NRQL les plus avancées qui vous permettent d'interroger absolument tout ce dont vous avez besoin à partir de vos données. Ce didacticiel abordera des techniques d'agrégation supplémentaires, des fonctions mathématiques de niveau supérieur et des fonctionnalités avancées telles que le filtrage Regex et l'agrégation imbriquée. Plus précisément, vous apprendrez à utiliser :
- La fonction d'agrégation
stddev()
et comment regrouper des données agrégées à l'aide de la fonctionbuckets()
. - Les fonctions mathématiques avancées disponibles dans NRQL pour lisser, limiter et manipuler les données.
- Comment découvrir les types d'événements et les attributs disponibles dans vos données sur une période spécifique.
- Comment filtrer des données avec Regex en utilisant
RLIKE
. - Comment utiliser l'agrégation imbriquée et les sous-requêtes.
Nous pensons que vous trouverez ces fonctionnalités tout simplement inestimables. C'est parti !
Utiliser le bucketing avec l'agrégation
L'écart type mesure la quantité de variation ou de dispersion au sein d'un ensemble de valeurs. Elle utilise une échelle allant de faible (valeurs proches de la moyenne) à élevée (valeurs éloignées de la moyenne). La fonction stddev()
vous permet de regarder entre les lignes des moyennes et de comprendre les valeurs rapportées à un niveau plus profond. Dans cet exemple, vous comparez l'écart type des temps de réponse (« durée ») des transactions du dernier jour à celui du jour précédent.
SELECT stddev(duration) FROM Transaction SINCE 24 hours ago COMPARE WITH 24 hours ago TIMESERIES

La fonction stdvar()
fonctionne de manière similaire à stddev()
mais renvoie la variance standard pour l'attribut numérique.
Dans une leçon précédente, vous avez appris à regrouper des données dans une configuration spécifique de buckets à l'aide de FACET cases()
. Vous pouvez également regrouper automatiquement les données en fonction d'un attribut spécifique à l'aide de FACET buckets()
. Cette fonction simplifie le regroupement des données pour toute fonction d'agrégation et prend trois arguments :
buckets(attribute, ceiling, number-of-buckets)
.
L'attribut que vous souhaitez utiliser pour effectuer le regroupement.
Valeur maximale de la plage d'échantillons (toute valeur hors norme apparaîtra dans le compartiment final).
Le nombre total de seaux dont vous avez besoin.
Dans l'exemple de requête, vous utilisez NRQL pour trouver la durée moyenne d'une transaction entière. Mais vous regroupez ces performances en transactions qui génèrent des volumes spécifiques d’appels de base de données. Vous spécifiez donc l'attribut bucket comme
databaseCallCount
, définissez le plafond à 400 appels et regroupez-le en 10 buckets. Cela se traduit par des performances de transactions effectuant 0 à 40, 40 à 80, 80 à 120, 120 à 160, 160 à 200, 200 à 240, 240 à 280, 280 à 320, 320 à 360 et > 360 appels de base de données. 10 compartiments clairs répartis uniformément jusqu'au plafond.SELECT average(duration)FROM TransactionSINCE 12 hours agoFACET buckets(databaseCallCount, 400, 10)
Avec cela, vous avez maintenant appris toutes les fonctions d’agrégation qui existent actuellement dans NRQL ! Vous pouvez découper et analyser vos données comme un pro. Si vous pensez qu'une capacité d'agrégation manque à NRQL, informez-en votre équipe de compte : nous sommes toujours à la recherche de la prochaine fonctionnalité révolutionnaire dont vous pourriez avoir besoin.
Utiliser des fonctions mathématiques avancées
NRQL prend également en charge des fonctions mathématiques plus avancées pour ceux qui ont besoin d'approfondir leurs données. Ces fonctions peuvent extrapoler des valeurs à la puissance de X, trouver des racines carrées, appliquer un serrage pour imposer des limites supérieures et inférieures, ou même simplement conserver des valeurs positives sur l'axe Y.
NRQL possède de nombreuses fonctions mathématiques qui manipulent les valeurs d'une manière ou d'une autre. Dans cet exemple, vous en verrez quelques-uns démontrés simultanément.
La fonction abs(n)
renvoie la valeur absolue de n : pour les valeurs n non négatives, elle renvoie « n », et pour les valeurs n négatives, elle renvoie le nombre positif « n ». Par exemple, abs(2)
= 2 et abs(-4)
= 4.
Vous pouvez également arrondir les nombres décimaux en entiers en utilisant floor()
, ceil()
et round()
. floor()
renvoie l'entier complet le plus proche arrondi à l'inférieur, et ceil()
fait l'inverse en arrondissant à l'entier supérieur. round()
est bidirectionnel et arrondit vers le haut ou vers le bas à l'entier complet le plus proche.
SELECT abs(duration), round(duration), ceil(duration), floor(duration) FROM Transaction SINCE 1 day ago

Vous pouvez utiliser le serrage sur un attribut pour imposer une limite supérieure ou inférieure à sa valeur. Cela est utile pour des choses comme garantir que les valeurs extrêmes hors norme ne faussent pas l'échelle d'un graphique de série chronologique. clamp_max(duration, 10)
renvoie la durée, sauf si elle dépasse 10, auquel cas elle renvoie 10. En termes simples, tout ce qui est supérieur à 10 renvoie toujours comme étant égal à 10. clamp_min(duration,1)
fait l'inverse ; si une durée est inférieure à 1, elle renvoie comme étant égale à 1.
SELECT clamp_max(average(duration), 10), clamp_min(average(duration), 1) FROM Transaction SINCE 1 day ago TIMESERIES

Vous pouvez maintenant passer aux mathématiques avancées que beaucoup trouvent difficiles à utiliser. Comme précédemment, nous pouvons vous montrer toutes ces fonctions dans un seul exemple de requête.
La fonction pow()
élève le premier argument à la puissance du deuxième argument. Dans cet exemple, vous élevez la durée à la puissance 2. Si vous avez besoin de la racine carrée d'une valeur, la fonction sqrt()
peut vous la fournir rapidement. Et la fonction exp()
calcule la fonction exponentielle naturelle de son argument.
Enfin, NRQL propose également des logarithmes adaptés à un certain nombre de fonctions similaires :
ln(n)
calcule le logarithme népérien : le logarithme en base e.log2(n)
calcule le logarithme base 2.log10(n)
calcule le logarithme base 10.log(n, b)
permet de calculer des logarithmes avec une base b arbitraire.SELECT pow(duration, 2), sqrt(duration), exp(duration), ln(duration), log2(duration)FROM TransactionSINCE 1 day ago
Dans cette leçon, vous avez appris à lisser vos données d’événement. round()
/ceil()
/floor()
vous permettent d'arrondir comme vous le souhaitez. Le serrage vous permet de définir des limites sur les données, et les outils mathématiques avancés pour le logarithme, la racine carrée, la puissance et l'exponentielle offrent tous un contrôle supplémentaire pour manipuler les données selon vos besoins. Ensuite, vous apprendrez à découvrir un événement et un attribut.
Découvrez l'événement et l'attribut
La découverte d'événements et d'attributs peut aider à répondre aux questions sur vos données disponibles avant de les interroger et à faciliter l'automatisation ! Prenons un moment pour explorer ce puissant utilitaire.
Disons que vous souhaitez une liste de tous les types d'événements actuellement signalés sur votre compte New Relic. La syntaxe SHOW EVENT TYPES
renvoie une liste de tous les types d'événements signalés dans une période donnée. C'est l'une des rares exceptions où une requête NRQL n'a pas besoin SELECT
et FROM
. Vous pouvez utiliser cette fonctionnalité pour des choses comme confirmer l'existence de données d'événements personnalisés.
SHOW EVENT TYPES SINCE 1 week ago

Vous devrez peut-être savoir quel attribut vous disposez pour un type d’événement donné. La fonction keyset()
fournit une liste de tous les attributs pour un type d'événement, regroupés par type d'attribut. Vous n'obtiendrez que des attributs contenant des valeurs dans la fenêtre temporelle fournie, que vous pouvez utiliser pour explorer vos données. Vous pouvez également l'utiliser dans l'automatisation, pour garantir par exemple que les rapports de données des clients sont corrects.
SELECT keyset() FROM Transaction SINCE 1 week ago

Ces fonctionnalités vous aident à découvrir les changements dans les types et les attributs d'événements. De plus en plus d'ingénieurs DevOps utilisent ces fonctionnalités pour terminer des tâches, voire les automatiser rapidement. Ensuite, vous apprendrez à filtrer les données avec Regex.
Filtrer avec regex
Vous souhaiterez peut-être occasionnellement filtrer des données avec des correspondances de modèles plus complexes que celles que LIKE
peut fournir. Avec la clause RLIKE
, vous pouvez filtrer avec des expressions régulières pour des correspondances plus complexes.
Dans n'importe quel scénario où vous pourriez utiliser LIKE
, vous avez la possibilité d'utiliser RLIKE
à la place pour fournir une expression régulière correspondante entre guillemets. Dans cet exemple, il y a une liste de tous les noms d'hôtes se terminant par des nombres pairs ou des consonnes.
Vous pouvez également effectuer une correspondance simple. Par instance, si vous souhaitez faire correspondre une valeur qui commence par une lettre ou un mot donné.
SELECT count(*) FROM Transaction WHERE name RLIKE 'W.*|O.*' FACET name
Le moteur d'expressions régulières utilise la syntaxe RE2. Si vous devez supprimer des caractères, vous devrez peut-être utiliser les séquences d'échappement à double barre oblique inverse. (par exemple \\
).
N'oubliez pas que RLIKE
présente intrinsèquement plus de complexité et moins de performances que LIKE
. Utilisez-le uniquement lorsque LIKE
et d’autres fonctionnalités de filtrage ne répondent pas à vos besoins.
La prise en charge des expressions régulières permet des possibilités de correspondance de modèles quasi infinies. Si vous êtes déjà un gourou des expressions régulières, vous connaissez la puissance que cela ajoute à NRQL. Mais si ce n’est pas le cas, ne vous inquiétez pas ! Regex dispose de nombreuses ressources disponibles pour référence en ligne. Maintenant que vous avez appris à utiliser les expressions régulières avec NRQL, l’étape suivante sur la liste est l’utilisation de l’agrégation imbriquée.
Utiliser l'agrégation imbriquée
Vous pouvez écrire une requête d'agrégation imbriquée avec NRQL qui utilise une requête comme FROM
pour la requête parent. Cela vous permet de répondre à des questions telles que :
- Combien de transactions par minute mon application a-t-elle traitées et quel a été le taux maximal de requests par minute au cours de la dernière heure ?
- Quelle est l'utilisation moyenne du processeur de tous mes serveurs et quels serveurs spécifiques dépassent 90 % ?
- Quel pourcentage de toutes les sessions utilisateur ont rebondi immédiatement (c'est-à-dire (une seule page vue dans la session) ?
Explorons chacun de ces cas d’utilisation plus en détail.
Exemple 1 : Appel d'API maximal au cours de la dernière heure
Tout d'abord, vous pouvez compter le nombre d'appels API par minute au cours de la dernière heure. Cela renvoie 60 points de données sur un graphique :
SELECT count(*) AS apicallsFROM Transaction TIMESERIES 1 MINUTE

Maintenant, pour trouver la valeur maximale signalée sur cette période, vous placez la requête entre parenthèses et utilisez SELECT ... FROM
comme ceci : SELECT z FROM (SELECT x AS z FROM y)
SELECT max(apicalls) FROM ( SELECT count(*) AS apicalls FROM Public_APICall TIMESERIES 1 minute )
Exemple 2 : serveurs avec une charge CPU élevée
Cet exemple utilise des données de New Relic Infrastructure. Parfois, vous souhaitez uniquement voir les hôtes dont le CPU a, en moyenne, dépassé un certain pourcentage. Si vous demandez à NRQL le average(cpuPercent)
, vous obtenez une liste d'hôtes avec le pourcentage moyen de CPU le plus élevé. Mais vous ne pouvez pas simplement ajouter un WHERE cpuPercent > 90
pour limiter cela aux seuls hôtes fonctionnant à 90 % ou plus, car cela supprimerait les données avant de calculer la moyenne.
Mais vous pouvez résoudre ce problème avec une agrégation imbriquée ! En demandant average(cpuPercent)
dans la sous-requête, vous obtenez la liste des hôtes et leur CPU moyen. Désormais, dans la requête externe, vous pouvez filtrer uniquement les résultats qui étaient > x%
! (Astuce : vous devrez peut-être ajuster le seuil de cette requête pour qu'il fonctionne avec le processeur de vos hôtes. Nous l'avons fixé à 20 % ici.)
SELECT hostname, cpu FROM (SELECT average(cpuPercent) AS cpu FROM SystemSample FACET hostname) WHERE cpu > 20
Exemple 3 – Rebonds de session
Les gens se demandent souvent comment calculer le taux de rebond sur monitoring du front-end. Cela fait référence aux sessions qui consultent une seule page et « rebondissent » avant de visiter d'autres pages. Avec l’agrégation imbriquée, vous pouvez y parvenir facilement. Notre requête interne compte les PageViews
, en les regroupant par session. L'ensemble de résultats transmis à la requête externe répertorie toutes les sessions et le nombre de pages consultées pour chacune d'elles. La requête externe calcule ensuite le pourcentage de sessions avec un compte de 1 (cela indique une « session rebondie », car elles n'ont consulté qu'une seule page).
SELECT percentage(count(*), WHERE sessionLength = 1) FROM (SELECT count(*) AS sessionLength FROM PageView FACET session)
Dans cette leçon, vous avez appris comment utiliser une requête comme FROM
d'une autre requête pour répondre à des questions plus complexes. Il ne reste plus qu'une dernière chose à apprendre : comment utiliser les sous-requêtes !
Utiliser des sous-requêtes
Les sous-requêtes dans NRQL sont similaires aux agrégations imbriquées, vous permettant d'utiliser une requête imbriquée dans une autre requête. Avec les sous-requêtes, la requête imbriquée entre dans l'instruction SELECT
et la clause WHERE
, tandis que les agrégations imbriquées entrent dans la clause FROM
.
Regardons quelques exemples de ces différents types de sous-requêtes.
Conditions numériques
Vous pouvez utiliser n’importe quelle requête qui renvoie une seule valeur numérique dans des conditions numériques. Cet exemple utilise une sous-requête dans la clause WHERE
qui renvoie la valeur du 97e percentile de la durée de l'appel d'API, puis renvoie le nom et la durée des appels supérieurs à cette valeur.
SELECT http.url, duration FROM Public_APICall WHERE duration > (SELECT percentile(duration,97) FROM Public_APICall)

Dans les conditions
Lorsque plusieurs valeurs sont renvoyées par une sous-requête, utilisez une condition IN
pour que la requête parent effectue une comparaison avec chaque valeur. Dans l'exemple, l'attribut entity.guid
fournit des données pour chaque entité unique qui présente une erreur de transaction, et cela correspond à la valeur entity.guid
des transactions pour déterminer la durée moyenne de l'entité en erreur.
SELECT average(duration) FROM Transaction WHERE entity.guid IN (SELECT uniques(entity.guid) FROM TransactionError) FACET appName TIMESERIES

Sous-requêtes dans l'instruction SELECT
Vous pouvez utiliser les résultats de sous-requête dans les calculs avec une instruction SELECT
et spécifier une plage horaire différente de celle de la requête externe. Cet exemple calcule le delta entre la durée moyenne actuelle et celle des 7 derniers jours.
SELECT average(duration) - (SELECT average(duration) FROM Public_APICall SINCE 7 days ago) FROM Public_APICall TIMESERIES

Les sous-requêtes sont un outil puissant pour l'exploration des données, permettant des requêtes plus sophistiquées sur différentes sources de données et plages de temps.
Félicitations pour avoir terminé ce tutoriel. Vous avez découvert des techniques d'agrégation supplémentaires, des fonctions mathématiques de niveau supérieur et des fonctionnalités avancées telles que le filtrage Regex, l'agrégation imbriquée et les sous-requêtes. Si vous avez terminé les trois didacticiels précédents, vous avez travaillé avec presque tous les aspects de NRQL que vous pouvez utiliser !
Nous espérons que vous trouverez NRQL utile pour explorer vos données, et si vous avez d'autres questions ou rencontrez des problèmes, n'hésitez pas à contacter le support New Relic. Ou, si vous préférez, vous pouvez partager votre expérience avec notre communauté en ligne.