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êtes FACET ou des requêtes uniques(...).
    • Pour d'autres contextes tels que l'égalité (=) ou des opérations mathématiques (+, -, etc.), FACET ou columns, les requêtes nécessiteront LIMIT 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.

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 !