Pour permettre l'observabilité sur tout votre stack, il est nécessaire de commencer par s'assurer que toutes vos données télémétriques, comprenant entre autres métriques, événements, traces et logs, soient au même endroit. Cependant, tous les meilleurs outils de bases de données de mesures et métriques au monde ne seront d'aucune aide si vous ne pouvez pas aisément connecter et explorer vos données pour comprendre l'état de santé et les performances de vos applications et systèmes.
Le langage NRQL (New Relic Query Language) vous permet d'analyser en détail vos données afin d'en tirer davantage d'informations, et il est désormais encore plus puissant ! Vous pouvez dorénavant connecter les données de plusieurs sources et plages de temps différentes dans une requête unique via des sous-requêtes. Regardez la vidéo ou poursuivez votre lecture pour découvrir comment utiliser des sous-requêtes pour mettre en corrélation des informations plus détaillées sur votre stack.
Qu'est-ce qu'une sous-requête ?
Une sous-requête est simplement une requête NRQL intégrée au sein d'une autre requête. Chaque sous-requête est évaluée, puis le résultat est utilisé lors de l'exécution de la requête au niveau supérieur. Vous pouvez imbriquer jusqu'à trois niveaux de sous-requêtes. Par exemple, la requête suivante trouve le nombre de transactions ayant une durée supérieure à la moyenne :
FROM Transaction SELECT count(*) WHERE duration > (
FROM Transaction SELECT average(duration)
)
Si vous aviez une durée moyenne de 30 ms, la requête ressemblerait à ceci :
FROM Transaction SELECT count(*) WHERE duration > 30
Auparavant, il était nécessaire d'exécuter d'abord une requête pour trouver la moyenne, avant d'entrer manuellement la valeur dans une seconde requête.
Connecter vos données : exemples de sous-requêtes
L'observabilité moderne requiert la télémétrie sur tous vos services. Cependant, plus vous intégrez des sources de données dans votre stack de monitoring, plus il est difficile d'estimer la performance de votre application. Voici quelques cas d'utilisation pour aider à résoudre ce problème.
Associer des erreurs d'applications et de performance en connectant des données d'entités
Une entité, c'est quelque chose qui a un identifiant d'entité unique et qui soit rapporte des données à New Relic, soit contient des données auxquelles New Relic peut accéder. Pour la plupart des entités, l'identifiant est indiqué par l'attribut entityGuid
.
Cet exemple de sous-requête NRQL compare la durée moyenne de différents services d'applications, ayant récemment rencontré des erreurs, pour révéler de quelle façon les erreurs de transactions affectent le temps d'exécution des applications. L'exemple illustre comment employer la clause IN
pour connecter des identifiants de deux sources de données différentes.
Voici l'exemple de requête :
FROM Transaction SELECT average(duration) WHERE entity.guid IN (
FROM TransactionError SELECT uniques(entity.guid)
)FACET appName TIMESERIES
Trouver des tendances dans des plages de temps multiples
Autre fonctionnalité puissante des sous-requêtes : la possibilité de comparer des données de plages de temps différentes. Vous bénéficiez de comparaisons plus intéressantes et plus détaillées que jamais grâce à la fonctionnalité COMPARE WITH
. Par exemple :
FROM Transaction SELECT average(duration)-(
FROM Transaction SELECT average(duration)SINCE 1 day AGO
) TIMESERIES 5 minutes SLIDE BY MAX
Cette requête calcule la durée moyenne de toutes les transactions pour le dernier jour, puis trouve la valeur delta avec une série chronologique de la dernière heure. SLIDE BY
est utilisé uniquement pour peaufiner le graphique. Cette requête vous montre comment votre système se comporte par rapport à hier, et vous informe ainsi des tendances récentes. Dans l'exemple de la capture d'écran, le système est relativement stable, avec une variation de quelques nanosecondes uniquement, mais ce n'est pas toujours le cas !
Connecter vos données avec des logs
Les logs fournissent des informations extrêmement utiles, et avec les logs en context New Relic, vous pouvez accéder rapidement aux détails de logs pertinents qu'il s'agisse d'applications, de serverless ou de clusters Kubernetes. À présent, vous pouvez également utiliser des sous-requêtes NRQL pour analyser les connexions entre transactions et logs.
FROM Log SELECT * WHERE hostname = (
FROM Transaction SELECT latest(host) WHERE containerId = 'insertcontainerid'
) AND level = 'ERROR'
L'exemple précédent interroge les transactions pour associer un identifiant containerId
particulier à un hôte contenant des logs d'erreurs pertinents. Avec les sous-requêtes, vous pouvez réaliser ces types d'associations facilement sans avoir à interroger et copier des valeurs manuellement. Vous pouvez également découvrir des transactions d'hôtes qui produisent des erreurs de logs, comme illustré dans cette requête :
FROM Transaction SELECT * WHERE hostname = (
FROM Log SELECT latest(host) WHERE level = 'ERROR'
)
Connecter vos transactions et spans avec des sous-requêtes imbriquées
Les spans et les transactions représentent chacun des parties d'une requête passant dans votre système, mais il peut être difficile de les connecter. La requête suivante exploite plusieurs sous-requêtes imbriquées et vous pouvez voir le nombre total de transactions dans chaque service incluant des spans qui sont plus lents que 99 % de tous les spans. Cette requête peut vous aider à trouver des goulots d'étranglement dans votre système.
FROM Transaction SELECT count(*) WHERE entity.guid IN (
FROM Span SELECT latest(entity.guid) WHERE duration > (
FROM Span SELECT percentile(duration, 99)
) FACET entity.guid ORDER BY average(duration) LIMIT 100
) FACET appName
Le schéma de sous-requête FROM Event SELECT latest(attribute) FACET attribute ORDER BY average(numAttribute)
peut être très utile ! Dans le cas présent, il vous permet d'obtenir les 100 premiers identifiants GUID
d'entités par durée moyenne, et d'utiliser ces 100 valeurs dans la requête parent. Il s'agit du second niveau de sous-requête dans la requête précédente.
Conseils pour utiliser les sous-requêtes
L'utilisation de sous-requêtes peut nécessiter de la pratique. Voici quelques conseils utiles :
- Testez la requête sans sous-requête. Exécutez la requête parent avec des valeurs test pour vous assurer qu'elle fonctionne comme prévu avant d'introduire une sous-requête.
- Testez la sous-requête seule. Exécutez la sous-requête pour vérifier les résultats avant de l'utiliser dans la requête parent.
- Comprenez les limites des sous-requêtes. Consultez la documentation sur les sous-requêtes NRQL pour en savoir plus.
- Faites passer votre expérience de requête au niveau supérieur avec Data Plus. Les utilisateurs de Data Plus bénéficient de limites de requêtes jusqu'à 3 fois plus élevées et de durées maximales de requêtes jusqu'à 2 fois plus élevées. Avec Data Plus, vous pouvez inspecter jusqu'à un trillion de points de données en 30 minutes and 100 milliards de points de données par minute (alors que le forfait original propose 300 milliards de points de données en 30 minutes et 10 milliards de points de données par minute).
- Vérifiez le type de résultat de la sous-requête. Ceci affectera le type de clauses pouvant être utilisé pour la sous-requête.
- Si la sous-requête renvoie un tableau contenant de nombreuses valeurs, elle ne fonctionnera qu'au sein d'une clause
IN
, telle que des requêtesFACET
ou des requêtesuniques(...)
. - Pour d'autres contextes tels que l'égalité
(=)
ou des opérations mathématiques(+, -, etc.)
,FACET
oucolumns
, les requêtes nécessiterontLIMIT 1
pour fonctionner. - Vous pouvez utiliser des requêtes qui renvoient une valeur unique si une valeur littérale normale peut être utilisée, par exemple un chiffre ou une chaîne de texte. Certains cas extrêmes, tels que le nombre de compartiments choisi pour une fonction d'histogramme, ne sont actuellement pas pris en charge. En général, le système de sous-requête fournit une erreur utile dans les cas incorrects.
- Si la sous-requête renvoie un tableau contenant de nombreuses valeurs, elle ne fonctionnera qu'au sein d'une clause
Les sous-requêtes sont un nouvel outil puissant pour l'exploration des données, car elles permettent de réaliser des requêtes plus sophistiquées sur une variété de sources de données et de plages de temps. Cet article de blog ne mentionne que quelques exemples, mais les possibilités sont illimitées. Nous sommes impatients de voir ce que vous allez créer en utilisant les sous-requêtes NRQL pour aller encore plus loin. Amusez-vous avec les requêtes !
Étapes suivantes
- Vous pouvez voir d'autres exemples de sous-requêtes, publiez vos propres sous-requêtes et faire part de votre avis dans la discussion du hub d'exploration.
- Consultez la documentation sur les sous-requêtes NRQL pour en savoir plus.
- Suivez les instructions de la vidéo sur les sous-requêtes NRQL.
- Si vous n'utilisez pas encore New Relic One, démarrez gratuitement avec New Relic. Votre compte gratuit comprend 100 Go/mois d'ingestion des données, un utilisateur Full Platform et un nombre illimité d'utilisateurs Basic.
Les opinions exprimées sur ce blog sont celles de l'auteur et ne reflètent pas nécessairement celles de New Relic. Toutes les solutions proposées par l'auteur sont spécifiques à l'environnement et ne font pas partie des solutions commerciales ou du support proposés par New Relic. Veuillez nous rejoindre exclusivement sur l'Explorers Hub (discuss.newrelic.com) pour toute question et assistance concernant cet article de blog. Ce blog peut contenir des liens vers du contenu de sites tiers. En fournissant de tels liens, New Relic n'adopte, ne garantit, n'approuve ou n'approuve pas les informations, vues ou produits disponibles sur ces sites.