stats - Amazon CloudWatch 日志
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

stats

使用 stats 创建日志数据的可视化效果,例如条形图、折线图和堆叠面积图。这可以帮助您更有效地识别日志数据中的模式。 CloudWatch Logs Insights 为使用该stats函数和一个或多个聚合函数的查询生成可视化效果。

例如,Route 53 日志组中的以下查询返回按查询类型显示 Route 53 记录每小时分布的可视化结果。

stats count(*) by queryType, bin(1h)

所有此类查询都可以生成条形图。如果查询使用 bin() 函数,按一个字段对数据随时间的变化进行分组,您还可以查看折线图和堆叠面积图。

bin 函数支持以下时间单位和缩写。对于所有包含多个字符的单位和缩写,支持添加复数形式。这样,hrhrs 都可以指定小时数。

  • millisecond ms msec

  • second s sec

  • minute m min

  • hour h hr

  • day d

  • week w

  • month mo mon

  • quarter q qtr

  • year y yr

可视化时间序列数据

时间序列可视化适用于具有以下特征的查询:

这些查询可以生成折线图、堆叠面积图、条形图和饼图。

示例

有关完整的教程,请参阅教程:运行生成时间序列可视化的查询

以下是更多适用于时间序列可视化的示例查询。

以下查询将生成 myfield1 字段的平均值的可视化(每 5 分钟创建一个数据点)。每个数据点都是前一个五分钟的日志中的 myfield1 值的平均值的聚合。

stats avg(myfield1) by bin(5m)

以下查询根据不同字段生成三个值的可视化(每 5 分钟创建一个数据点)。由于查询包含聚合函数并使用 bin() 作为分组字段,因此生成了可视化。

stats avg(myfield1), min(myfield2), max(myfield3) by bin(5m)

折线图和堆叠面积图限制

如果查询聚合日志条目信息但不使用 bin() 函数,则可以生成条形图。但是,这种查询无法生成折线图或堆叠面积图。有关这些查询类型的更多信息,请参阅可视化按字段分组的日志数据

可视化按字段分组的日志数据

您可以为使用 stats 函数以及一个或多个聚合函数的查询生成条形图。有关更多信息,请参阅 Aggregation Functions in the Stats Command

要查看可视化,请运行查询。接下来,选择 Visualization(可视化)选项卡,选择 Line(折线图)旁边的箭头,然后选择 Bar(条形图)。在条形图中,可视化限制为最多 100 个条形。

示例

有关完整的教程,请参阅教程:运行生成按日志字段分组的可视化的查询。以下部分包括更多适用于按字段可视化的示例查询。

以下VPC流日志查询查找每个目标地址每次会话传输的平均字节数。

stats avg(bytes) by dstAddr

您还可以生成每个结果值包含多个条形图的图表。例如,以下VPC流日志查询查找每个目标地址每次会话传输的平均字节数和最大字节数。

stats avg(bytes), max(bytes) by dstAddr

以下查询为每个查询类型查找 Amazon Route 53 查询日志的数量。

stats count(*) by queryType

在单个查询中使用多个 stats 命令

您可以在单个查询中使用多达两个 stats 命令。这可让您对第一个聚合的输出执行额外的聚合。

示例:使用两个 stats 命令进行查询

例如,以下查询首先查找 5 分钟条柱中的总流量,然后计算这些 5 分钟条柱中的最高、最低和平均流量。

FIELDS strlen(@message) AS message_length | STATS sum(message_length)/1024/1024 as logs_mb BY bin(5m) | STATS max(logs_mb) AS peak_ingest_mb, min(logs_mb) AS min_ingest_mb, avg(logs_mb) AS avg_ingest_mb

示例:将多个 stats 命令与其他函数(例如 filterfieldsbin)结合

您可以在单个查询中将两个 stats 命令与其他命令(例如 filterfields)结合。例如,以下查询查找会话中不同 IP 地址的数量并按客户端平台查找会话数,筛选这些 IP 地址,最后找到每个客户端平台的会话请求平均值。

STATS count_distinct(client_ip) AS session_ips, count(*) AS requests BY session_id, client_platform | FILTER session_ips > 1 | STATS count(*) AS multiple_ip_sessions, sum(requests) / count(*) AS avg_session_requests BY client_platform

可以在带有多个 stats 命令的查询中使用 bindateceil 函数。例如,以下查询首先将消息组合成 5 分钟的块,然后将这些 5 分钟的块聚合为 10 分钟的块,并计算每个 10 分钟块内的最高、最低和平均流量。

FIELDS strlen(@message) AS message_length | STATS sum(message_length) / 1024 / 1024 AS logs_mb BY BIN(5m) as @t | STATS max(logs_mb) AS peak_ingest_mb, min(logs_mb) AS min_ingest_mb, avg(logs_mb) AS avg_ingest_mb BY dateceil(@t, 10m)

注释和限制

一个查询最多可以有两个 stats 命令。无法更改此配额。

如果您使用 sortlimit 命令,则它必须出现在第二个 stats 命令之后。如果它出现在第二个 stats 命令之前,则查询无效。

当一个查询有两个 stats 命令时,查询的部分结果要等到第一个 stats 聚合完成后才会开始显示。

在单个查询的第二个 stats 命令中,您只能引用第一个 stats 命令中定义的字段。例如,以下查询无效,因为 @message 字段在第一个 stats 聚合后将不可用。

FIELDS @message | STATS SUM(Fault) by Operation # You can only reference `SUM(Fault)` or Operation at this point | STATS MAX(strlen(@message)) AS MaxMessageSize # Invalid reference to @message

在第一个 stats 命令之后引用的任何字段都必须在此第一个 stats 命令中定义。

STATS sum(x) as sum_x by y, z | STATS max(sum_x) as max_x by z # You can only reference `max(sum_x)`, max_x or z at this point
重要

bin 函数始终隐式使用 @timestamp 字段。这意味着,如果未使用第一个 stats 命令传播 timestamp 字段,就无法在第二个 stats 命令中使用 bin。例如,以下查询无效。

FIELDS strlen(@message) AS message_length | STATS sum(message_length) AS ingested_bytes BY @logStream | STATS avg(ingested_bytes) BY bin(5m) # Invalid reference to @timestamp field

相反,在第一个 stats 命令中定义 @timestamp 字段,然后就可以在第二个 stats 命令中结合 dateceil 使用该字段,如下例所示。

FIELDS strlen(@message) AS message_length | STATS sum(message_length) AS ingested_bytes, max(@timestamp) as @t BY @logStream | STATS avg(ingested_bytes) BY dateceil(@t, 5m)

用于统计数据的函数

CloudWatch Logs Insights 支持统计数据聚合函数和统计数据非聚合函数。

stats 命令中使用统计聚合函数,并将其用作其他函数的参数。

函数 结果类型 描述

avg(fieldName: NumericLogField)

number

指定的字段中值的平均值。

count()

count(fieldName: LogField)

number

计算日志事件的数量。count()(或 count(*))对查询返回的所有事件进行计数,而 count(fieldName) 对包含所指定字段名称的所有记录进行计数。

count_distinct(fieldName: LogField)

number

返回字段的唯一值的数量。如果字段具有非常高的基数(包含许多唯一值),则 count_distinct 返回的值只是一个近似值。

max(fieldName: LogField)

LogFieldValue

所查询的日志中此日志字段的值的最大值。

min(fieldName: LogField)

LogFieldValue

所查询的日志中此日志字段的值的最小值。

pct(fieldName: LogFieldValue, percent: number)

LogFieldValue

百分位数指示某个值在数据集中的相对位置。例如,pct(@duration, 95) 返回 @duration 值,95% 的 @duration 值低于此值,5% 的值高于此值。

stddev(fieldName: NumericLogField)

number

指定的字段中值的标准偏差。

sum(fieldName: NumericLogField)

number

指定的字段中值的总和。

统计非聚合函数

stats 命令中使用非聚合函数并将其用作其他函数的参数。

函数 结果类型 描述

earliest(fieldName: LogField)

LogField

从查询的日志中具有最早时间戳的日志事件返回 fieldName 的值。

latest(fieldName: LogField)

LogField

从查询的日志中具有最晚时间戳的日志事件返回 fieldName 的值。

sortsFirst(fieldName: LogField)

LogField

返回在查询的日志中排在第一位的 fieldName 的值。

sortsLast(fieldName: LogField)

LogField

返回在查询的日志中排在最后一位的 fieldName 的值。