

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

# stats
<a name="CWL_QuerySyntax-Stats"></a>

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

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

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

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

`bin` 函数支持以下时间单位和缩写。对于所有包含多个字符的单位和缩写，支持添加复数形式。这样，`hr` 和 `hrs` 都可以指定小时数。
+ `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`

**Topics**
+ [可视化时间序列数据](#CWL_Insights-Visualizing-TimeSeries)
+ [可视化按字段分组的日志数据](#CWL_Insights-Visualizing-ByFields)
+ [在单个查询中使用多个 stats 命令](#CWL_QuerySyntax-stats-multi)
+ [用于统计数据的函数](#CWL_QuerySyntax-stats-functions)

## 可视化时间序列数据
<a name="CWL_Insights-Visualizing-TimeSeries"></a>

时间序列可视化适用于具有以下特征的查询：
+ 此查询包含一个或多个聚合函数。有关更多信息，请参阅 [Aggregation Functions in the Stats Command](#CWL_Insights_Aggregation_Functions)。
+ 此查询使用 `bin()` 函数按一个字段对数据分组。

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

**示例**

有关完整的教程，请参阅[教程：运行生成时间序列可视化的查询](CWL_AnalyzeLogData_VisualizationQuery.md)。

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

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

```
stats avg(myfield1) by bin(5m)
```

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

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

**折线图和堆叠面积图限制**

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

## 可视化按字段分组的日志数据
<a name="CWL_Insights-Visualizing-ByFields"></a>

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

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

**示例**

有关完整的教程，请参阅[教程：运行生成按日志字段分组的可视化的查询](CWL_AnalyzeLogData_VisualizationFieldQuery.md)。以下部分包括更多适用于按字段可视化的示例查询。

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

```
stats avg(bytes) by dstAddr
```

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

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

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

```
stats count(*) by queryType
```

## 在单个查询中使用多个 stats 命令
<a name="CWL_QuerySyntax-stats-multi"></a>

您可以在单个查询中使用多达两个 `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 命令与其他函数（例如 `filter`、`fields`、`bin`）结合**

您可以在单个查询中将两个 `stats` 命令与其他命令（例如 `filter` 和 `fields`）结合。例如，以下查询查找会话中不同 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` 命令的查询中使用 `bin` 和 `dateceil` 函数。例如，以下查询首先将消息组合成 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` 命令。无法更改此配额。

如果您使用 `sort` 或 `limit` 命令，则它必须出现在第二个 `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)
```

## 用于统计数据的函数
<a name="CWL_QuerySyntax-stats-functions"></a><a name="CWL_Insights_Aggregation_Functions"></a>

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

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


| 函数 | 结果类型 | 说明 | 
| --- | --- | --- | 
|  `avg(fieldName: NumericLogField)` |  数字 |  指定的字段中值的平均值。  | 
|  `count()` `count(fieldName: LogField)` |  数字 |  计算日志事件的数量。`count()`（或 `count(*)`）对查询返回的所有事件进行计数，而 `count(fieldName)` 对包含所指定字段名称的所有记录进行计数。  | 
|  `count_distinct(fieldName: LogField)` |  数字 |  返回字段的唯一值的数量。如果字段具有非常高的基数（包含许多唯一值），则 `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)` |  数字 |  指定的字段中值的标准偏差。  | 
|  `sum(fieldName: NumericLogField)` |  数字 |  指定的字段中值的总和。  | 

 **统计非聚合函数** <a name="CWL_Insights_Non-Aggregation_Functions"></a>

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


| 函数 | 结果类型 | 说明 | 
| --- | --- | --- | 
|  `earliest(fieldName: LogField)` |  LogField |  从查询的日志中具有最早时间戳的日志事件返回 `fieldName` 的值。  | 
|  `latest(fieldName: LogField)` |  LogField |  从查询的日志中具有最晚时间戳的日志事件返回 `fieldName` 的值。  | 
|  `sortsFirst(fieldName: LogField)` |  LogField |  返回在查询的日志中排在第一位的 `fieldName` 的值。  | 
|  `sortsLast(fieldName: LogField)` |  LogField |  返回在查询的日志中排在最后一位的 `fieldName` 的值。  | 