OpenSearch SQL 语言 - Amazon CloudWatch 日志

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

OpenSearch SQL 语言

本节包含使用 OpenSearch SQL 查询 CloudWatch 日志的基本介绍。如果你习惯使用关系数据库,它提供了一个熟悉的选项。 OpenSearch SQL 提供了 SQL 功能的子集,使其成为执行临时查询和数据分析任务的理想选择。在 S OpenSearch QL 中,您可以使用诸如 SELECT、FROM、WHERE、GROUP BY、HAVING 等命令和各种其他 SQL 命令和函数。您可以 JOINs 跨日志组执行,使用子查询关联日志组中的数据,并使用丰富的 JSON、数学、字符串、条件和其他 SQL 函数集对日志和安全数据进行强有力的分析。

您只能 OpenSearch 将 SQL 用于查询标准日志类中的日志组。

下表列出了 CloudWatch 日志中支持的 SQL 命令和函数。有关包括语法在内的所有 OpenSearch SQL 命令的信息,请参阅《 OpenSearch 服务开发人员指南》中支持的 SQL 命令

支持的 SQL 命令

命令或功能 示例查询 描述

SELECT

SELECT `@message`, Operation FROM `LogGroupA`

显示投影值。

FROM

SELECT `@message`, Operation FROM `LogGroupA`

内置子句,用于指定要从中检索数据的源表或视图,支持各种类型的联接和子查询。

WHERE

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

根据提供的字段条件筛选日志事件。

GROUP BY

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

根据类别对记录事件进行分组,并根据统计数据查找平均值。

HAVING

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

根据分组条件筛选结果。

ORDER BY

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

根据 ORDER BY 子句中的字段对结果进行排序。您可以按降序或升序进行排序。

JOIN

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

根据常用字段连接两个表的结果。必须指定 “内连接” 或 “左外连接”

LIMIT

Select * from `LogGroupA` limit 10

将显示的查询结果限制在前 N 行。

字符串函数

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

SQL 中的内置函数,可以在 SQL 查询中操作和转换字符串和文本数据。例如,转换大小写、合并字符串、提取部分和清理文本。

日期函数

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

用于在 SQL 查询中处理和转换日期和时间戳数据的内置函数。例如,date_add、date_format、datediff 和当前日期。

条件函数

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

基于指定条件执行操作或有条件地评估表达式的内置函数。例如,大小写和如果。

聚合函数

SELECT AVG(bytes) as bytesWritten FROM `LogGroupA`

内置函数,可对多行执行计算以生成单个汇总值。例如,SUM、COUNT、AVG、MAX 和 MIN。

JSON 函数

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

内置函数,用于在 SQL 查询中解析、提取、修改和查询 JSON 格式的数据(例如,from_json、to_json、get_json_object、json_tuple),允许操作数据集中的 JSON 结构。

数组函数

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

用于在 SQL 查询中处理数组类型列的内置函数,允许诸如访问、修改和分析数组数据(例如,大小、爆炸、array_contains)之类的操作。

窗口函数

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

内置函数,可对与当前行(窗口)相关的一组指定行进行计算,从而实现排名、运行总数和移动平均值等操作。例如,ROW_NUMBER、RANK、LAG 和 LEAD

转换函数

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

内置函数,用于在 SQL 查询中将数据从一种类型转换为另一种类型,从而实现数据类型转换和格式转换。例如,CAST、TO_DATE、TO_TIMESTAMP 和 BINARY。

谓词函数

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

基于指定条件或模式评估条件并返回布尔值(真/假)的内置函数。例如,IN、LIKE、BETWEEN、为空和存在。

选择多个日志组

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

允许您在 SELECT 语句中指定多个日志组

支持用于 multi-log-group查询的 SQL

要支持在 SQL 中查询多个日志组的用例,可以使用logGroups命令。使用此语法,您可以通过在 FROM 命令中指定多个日志组来查询它们。

语法:

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

在此语法中,最多可在logGroupIdentifier参数中指定 50 个日志组。要引用监控账户中的日志组,请使用 ARNs 而不是LogGroup名称。

示例查询:

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

查询日志时,不支持在语FROM句后面使用以下涉及多个 CloudWatch 日志组的语法。

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

限制

当您使用 OpenSearch SQL 在 Lo CloudWatch gs Insights 中进行查询时,将适用以下限制。

  • 您只能在 SELECT 语句中包含一个联接。

  • 仅支持一个级别的嵌套子查询。

  • 不支持用分号 (;) 分隔的多个语句查询。

  • 不支持包含相同但仅在大小写上不同的字段名称的查询(例如 field1 和 FIELD1)。

    例如,不支持以下查询:

    Select AWSAccountId, AwsAccountId from LogGroup

    但是,由于两个日志组中的字段名 (@logStream) 相同,因此支持以下查询:

    Select a.`@logStream`, b.`@logStream` from Table A INNER Join Table B on a.id = b.id
  • 函数和表达式必须对字段名进行操作,并且是 SELECT 语句的一部分,日志组在 FROM 子句中指定。

    例如,不支持此查询:

    SELECT cos(10) FROM LogGroup

    支持此查询:

    SELECT cos(field1) FROM LogGroup
  • 使用 SQL 或 PPL 命令时,请将某些字段用反引号括起来,以便成功查询它们。对于带有特殊字符(非字母和非数字)的字段,必须使用反引号。例如,用反引号@messageOperation.Export、和Test::Field括起来。您无需用反引号将纯字母名称的列括起来。

    包含简单字段的查询示例:

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

    附加了反引号的类似查询:

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