View a markdown version of this page

OpenSearch Langage de requêtes structuré (SQL) - CloudWatch Journaux Amazon

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

OpenSearch Langage de requêtes structuré (SQL)

Cette section contient une introduction de base à l'interrogation des CloudWatch journaux à l'aide de OpenSearch SQL. Il s'agit d'une option familière si vous avez l'habitude de travailler avec des bases de données relationnelles. OpenSearch SQL propose un sous-ensemble de fonctionnalités SQL, ce qui en fait un excellent choix pour effectuer des requêtes ad hoc et des tâches d'analyse de données. Avec OpenSearch SQL, vous pouvez utiliser des commandes telles que SELECT, FROM, WHERE, GROUP BY, HAVING et diverses autres commandes et fonctions SQL. Vous pouvez exécuter des JOIN dans des groupes de journaux, corréler les données entre les groupes de journaux à l'aide de sous-requêtes et utiliser le riche ensemble de fonctions JSON, mathématiques, chaînes, conditionnelles et autres fonctions SQL pour effectuer une analyse puissante des données de journal et de sécurité.

Utilisez cette filterIndex option pour renvoyer uniquement les données indexées, en forçant une requête à analyser uniquement les groupes de journaux indexés dans un champ que vous spécifiez dans la requête. Réduisez le volume analysé en ignorant les groupes de journaux qui ne contiennent aucun événement de journal contenant le champ spécifié dans la requête et en analysant uniquement les groupes de journaux qui correspondent à la valeur spécifiée dans la requête pour cet index de champ. Permet filterIndex de spécifier le nom du champ, ainsi que le nom et la valeur du champ pour interroger uniquement les données indexées contenant le champ et la valeur spécifiés.

Vous pouvez utiliser OpenSearch SQL pour interroger les groupes de journaux de la classe de journaux standard. SQL prend également en charge les requêtes à l'aide du nom de la source de données et du type de source de données.

Note

Le tableau suivant répertorie les commandes et fonctions SQL prises en charge dans les CloudWatch journaux. Pour plus d'informations sur toutes les commandes OpenSearch SQL, y compris leur syntaxe, consultez la section Commandes SQL prises en charge dans le OpenSearch Service Developer Guide.

Pour plus d'informations sur les autres langages de requête que vous pouvez utiliser, consultez CloudWatch Logs Insights, OpenSearch Service PPL et CloudWatch Metrics Insights.

Commandes SQL prises en charge

Note

Dans la colonne de requête d'exemple, <logGroup> remplacez-la si nécessaire en fonction de la source de données que vous interrogez.

Commande ou fonction Exemple de requête Description

SELECT

SELECT `@message`, Operation FROM `LogGroupA`

Affiche les valeurs projetées.

FROM

SELECT `@message`, Operation FROM `LogGroupA`

Built-in clause qui spécifie la ou les tables sources ou les vues à partir desquelles récupérer les données, prenant en charge différents types de jointures et de sous-requêtes.

WHERE

SELECT * FROM `LogGroupA` WHERE Operation = 'x'

Filtre les événements du journal en fonction des critères de champ fournis.

Index des filtres

SELECT * FROM `filterIndex('region' = 'us-east-1')` WHERE status = 200 LIMIT 10;

Renvoie uniquement les données indexées, en forçant une requête à analyser uniquement les groupes de journaux indexés sur un champ que vous spécifiez dans la requête.

GROUP BY

SELECT `@logStream`, COUNT(*) as log_count FROM `LogGroupA` GROUP BY `@logStream`

Les groupes enregistrent les événements en fonction de la catégorie et trouvent la moyenne en fonction des statistiques.

HAVING

SELECT `@logStream`, COUNT(*) as log_count FROM `LogGroupA` GROUP BY `@logStream` HAVING log_count > 100

Filtre les résultats en fonction des conditions de regroupement.

ORDER BY

SELECT * FROM `LogGroupA` ORDER BY `@timestamp` DESC

Organise les résultats en fonction des champs de la clause ORDER BY. Vous pouvez trier par ordre décroissant ou croissant.

JOIN

SELECT A.`@message`, B.`@timestamp`FROM `LogGroupA` as A INNER JOIN `LogGroupB` as B ON A.`requestId` = B.`requestId`

Joint les résultats de deux tables en fonction de champs communs. La jointure intérieure ou la jointure extérieure gauche doivent être spécifiées

LIMIT

Select * from `LogGroupA` limit 10

Limite les résultats de requête affichés aux N premières lignes.

Fonctions de chaîne

SELECT upper(Operation) , lower(Operation), Operation FROM `LogGroupA`

Built-in fonctions en SQL qui peuvent manipuler et transformer des chaînes et des données textuelles dans des requêtes SQL. Par exemple, convertir des majuscules, combiner des chaînes, extraire des parties et nettoyer du texte.

Fonctions de date

SELECT current_date() as today, date_add(current_date(), 30) as thirty_days_later, last_day(current_date()) as month_end FROM `LogGroupA`

Built-in fonctions de gestion et de transformation des données de date et d'horodatage dans les requêtes SQL. Par exemple, date_add, date_format, datediff et current_date.

Fonctions conditionnelles

SELECT Operation, IF(Error > 0, 'High', 'Low') as error_category FROM `LogGroupA`;

Built-in fonctions qui exécutent des actions en fonction de conditions spécifiées ou qui évaluent des expressions de manière conditionnelle. Par exemple, CASE et IF.

Fonctions d’agrégation

SELECT AVG(bytes) as bytesWritten FROM `LogGroupA`

Built-in fonctions qui effectuent des calculs sur plusieurs lignes pour produire une seule valeur résumée. Par exemple, SUM, COUNT, AVG, MAX et MIN.

Fonctions JSON

SELECT get_json_object(json_column, '$.name') as name FROM `LogGroupA`

Built-in fonctions pour analyser, extraire, modifier et interroger des JSON-formatted données dans des requêtes SQL (par exemple, from_json, to_json, get_json_object, json_tuple) permettant la manipulation de structures JSON dans des ensembles de données.

Fonctions de tableau

SELECT scores, size(scores) as length, array_contains(scores, 90) as has_90 FROM `LogGroupA`;

Built-in fonctions permettant de travailler avec des colonnes de type tableau dans les requêtes SQL, permettant des opérations telles que l'accès, la modification et l'analyse des données du tableau (par exemple, size, explode, array_contains).

Fonctions de fenêtrage

SELECT field1, field2, RANK() OVER (ORDER BY field2 DESC) as field2Rank FROM `LogGroupA`;

Built-in fonctions qui effectuent des calculs sur un ensemble spécifié de lignes liées à la ligne actuelle (fenêtre), permettant des opérations telles que le classement, les totaux cumulés et les moyennes mobiles. Par exemple, ROW_NUMBER, RANK, LAG et LEAD

Fonctions de conversion

SELECT CAST('123' AS INT) as converted_number, CAST(123 AS STRING) as converted_string FROM `LogGroupA`

Built-in fonctions pour convertir des données d'un type à un autre dans les requêtes SQL, permettant des transformations de types de données et des conversions de formats. Par exemple, CAST, TO_DATE, TO_TIMESTAMP et BINARY.

Fonctions de prédicat

SELECT scores, size(scores) as length, array_contains(scores, 90) as has_90 FROM `LogGroupA`;

Built-in fonctions qui évaluent les conditions et renvoient des valeurs booléennes (true/false) en fonction de critères ou de modèles spécifiés. Par exemple, IN, LIKE, BETWEEN, IS NULL et EXISTS.

Sélectionnez plusieurs groupes de journaux

SELECT lg1.field1, lg1.field2 from `logGroups( logGroupIdentifier: ['LogGroup1', 'LogGroup2'])` as lg1 where lg1.field3= "Success"

Vous permet de spécifier plusieurs groupes de journaux dans une instruction SELECT

Sélectionnez plusieurs sources de données

SELECT ds1.field1, ds1.field2 from `dataSource(['DataSource1', 'DataSource2'])` as ds1 where ds1.field3= "Success"

Vous permet de spécifier plusieurs sources de données dans une instruction SELECT

SQL pris en charge pour les requêtes multi-groupes de journaux

Pour prendre en charge le cas d'utilisation permettant d'interroger plusieurs groupes de journaux dans SQL, vous pouvez utiliser la logGroups commande. À l'aide de cette syntaxe, vous pouvez interroger plusieurs groupes de journaux en les spécifiant dans la commande FROM.

Syntaxe :

`logGroups( logGroupIdentifier: ['LogGroup1','LogGroup2', ...'LogGroupn'] )

Dans cette syntaxe, vous pouvez spécifier jusqu'à 50 groupes de journaux dans le logGroupIdentifier paramètre. Pour référencer des groupes de journaux dans un compte de surveillance, utilisez des ARN plutôt que des LogGroup noms.

Exemple de requête :

SELECT LG1.Column1, LG1.Column2 from `logGroups( logGroupIdentifier: ['LogGroup1', 'LogGroup2'] )` as LG1 WHERE LG1.Column1 = 'ABC'

La syntaxe suivante impliquant plusieurs groupes de journaux après l'FROMinstruction n'est PAS prise en charge lors de l'interrogation CloudWatch des journaux.

SELECT Column1, Column2 FROM 'LogGroup1', 'LogGroup2', ...'LogGroupn' WHERE Column1 = 'ABC'

SQL pris en charge pour les requêtes sur les sources de données

Pour prendre en charge le cas d'utilisation de l'interrogation de sources de données dans SQL, vous pouvez utiliser la commande DataSource. À l'aide de cette syntaxe, vous pouvez interroger des sources de données en les spécifiant dans la FROM commande. Vous pouvez spécifier jusqu'à 10 sources de données.

Syntaxe

`dataSource( ['DataSource1', 'DataSource2', ...'DataSourcen'] )`

Exemple de requête

SELECT DS1.Column1, DS1.Column2 from `dataSource( ['DataSource1', 'DataSource2'] )` as DS1 WHERE DS1.Column1 = 'ABC'

Étendue de la requête

Dans l'API AWS CLI et, vous pouvez spécifier les journaux à interroger à l'aide du groupe de journaux, de la source et du type de données, ainsi que des index de champs.

Groupe de journaux

La sélection de la source du groupe de journaux peut être utilisée lorsque les clients savent exactement dans quel groupe de journaux il faut rechercher

SELECT * FROM `logGroups(logGroupIdentifier: ['/aws/lambda/my-function'])`;

Source et type de données

Les clients peuvent interroger leurs journaux à l'aide du nom de la source de données et du type de source de données.

La sélection de sources de données en fonction de la source et du type de données peut être utilisée lorsque les clients savent quelles sources de données exactes doivent être interrogées. Cette requête est exécutée sur un ou plusieurs groupes de journaux contenant la source et le type de données spécifiés.

Pour prendre en charge le cas d'utilisation de l'interrogation de sources de données dans SQL, vous pouvez utiliser la commande DataSource. À l'aide de cette syntaxe, vous pouvez interroger des sources de données en les spécifiant dans la commande FROM. Vous pouvez spécifier jusqu'à 10 sources de données.

Syntaxe :

`dataSource( ['DataSource1.Type1', 'DataSource2.Type2', ...'DataSourcen.Typen'] )`

Exemple de requête :

SELECT DS1.Column1, DS1.Column2 from `dataSource( ['DataSource1.Type1', 'DataSource2.Type2'] )` as DS1 WHERE DS1.Column1 = 'ABC'

Pour plus d'informations sur les requêtes par sources de données, consultezUtilisez les facettes pour regrouper et explorer les journaux.

Exemple combiné

Les clients peuvent spécifier tous les opérateurs de sélection de source dans les backticks dans n'importe quel ordre et les résultats seraient basés sur l'intersection de toutes les conditions appliquées.

Par exemple,/aws/lambda/my-function-1 peut contenir plusieurs sources et types de données, y compris une grande variété d'index. Lorsque la requête suivante a été exécutée, les résultats renvoyés ne contiendront que des événements de source et de type DataSource1.Type1 et correspondant aux critères « statut » = 200.

SELECT * FROM ` logGroups(logGroupIdentifier: ['/aws/lambda/my-function']) filterIndex('status' = 200) dataSource(['DataSource1.Type1']) `;

Indices de champs

La sélection de Index-based la source de champs identifie automatiquement les groupes de journaux pertinents lorsque vos filtres ciblent des champs indexés, ce qui réduit le volume d'analyse et l'exécution des requêtes.

Utilisez cette filterIndex option pour renvoyer uniquement les données indexées, en forçant une requête à analyser uniquement les groupes de journaux indexés dans un champ que vous spécifiez dans la requête. Pour ces groupes de journaux indexés sur ce champ, il optimise davantage la requête en ignorant les groupes de journaux qui ne contiennent aucun événement de journal contenant le champ spécifié dans la requête pour le champ indexé. Il réduit encore le volume scanné en essayant de scanner uniquement les événements de journal de ces groupes de journaux qui correspondent à la valeur spécifiée dans la requête pour cet index de champ. Pour plus d'informations sur les index de champs et la manière de les créer, voir Création d'index de champs pour améliorer les performances des requêtes et réduire le volume d'analyse.

En SQL, FilterIndex est utilisé pour spécifier quelles paires clé-valeur doivent être traitées comme des index. La syntaxe est la suivante

SELECT * FROM `filterIndex('region' = 'us-east-1')`;

Où :

  1. FilterIndex (...) spécifie et traite les valeurs clés qu'ils contiennent comme des index de champs. Chaque paire clé-valeur est séparée par une virgule (exemple ci-dessous)

  2. 'region' = 'us-east-1' spécifie la condition réelle à appliquer

    1. Remarque : Au lieu de =, les clients peuvent utiliser IN pour spécifier plusieurs valeurs (exemple ci-dessous)

L'utilisation de plusieurs FilterIndex combinerait les conditions en utilisant « ET ». Dans l'exemple, les journaux correspondant à status=200 et à la région dans us-east-1 ou us-west-2 seraient interrogés.

SELECT * FROM `filterIndex('status' = 200, 'region' IN ['us-east-1', 'us-west-2'])`;

Restrictions

Les restrictions suivantes s'appliquent lorsque vous utilisez OpenSearch SQL pour effectuer des requêtes dans CloudWatch Logs Insights.

  • Vous ne pouvez inclure qu'un seul JOIN dans une instruction SELECT.

  • Vous ne pouvez pas utiliser JOIN ou des sous-requêtes avec des requêtes de source de données.

  • Un seul niveau de sous-requêtes imbriquées est pris en charge.

  • Les requêtes à instructions multiples séparées par des points-virgules (;) ne sont pas prises en charge.

  • Les requêtes contenant des noms de champs identiques mais ne différant que par cas (comme field1 et FIELD1) ne sont pas prises en charge.

    Par exemple, la requête suivante n'est pas prise en charge :

    Select AWSAccountId, AwsAccountId from LogGroup

    Cependant, la requête suivante est prise en charge car le nom du champ (@logStream) est identique dans les deux groupes de journaux :

    Select a.`@logStream`, b.`@logStream` from Table A INNER Join Table B on a.id = b.id
  • Les fonctions et les expressions doivent opérer sur des noms de champs et faire partie d'une instruction SELECT avec un groupe de journaux spécifié dans la clause FROM.

    Par exemple, cette requête n'est pas prise en charge :

    SELECT cos(10) FROM LogGroup

    Cette requête est prise en charge :

    SELECT cos(field1) FROM LogGroup
  • Lorsque vous utilisez des commandes SQL ou PPL, placez certains champs dans des backticks pour les interroger avec succès. Des backticks sont nécessaires pour les champs contenant des caractères spéciaux (non alphabétiques et non numériques). Par exemple, placez et @message entre Operation.Export crochets Test::Field inverses. Il n'est pas nécessaire de placer des champs dont les noms sont purement alphabétiques dans des backticks.

    Exemple de requête avec des champs simples :

    SELECT SessionToken, Operation, StartTime FROM `LogGroup-A` LIMIT 1000;

    Requête similaire avec des backticks ajoutés :

    SELECT `@SessionToken`, `@Operation`, `@StartTime` FROM `LogGroup-A` LIMIT 1000;