聚合把日志变成统计
聚合把原始日志变成趋势与分布:按时间分桶得到序列,按字段分组得到维度统计,去重计数估算独立数量,各类指标计算嵌套在分桶之内。日志平台因此不止能查,还能回答每小时错误多少、哪些接口最慢。
两个容易被忽略的细节
写统计查询时有两处常被忽略:只要统计结果时把返回文档数设为 0,可以显著降低开销;分组统计默认只返回前若干组,需要更多结果时必须显式指定数量与排序方式,否则长尾数据会被静默丢掉。
基本信息
| 时间分桶 | 按固定间隔把日志聚合成序列 |
|---|---|
| 维度分组 | 按字段取值分组统计 |
| 去重计数 | 估算独立取值数量,属于近似算法 |
| 结果规模 | 分组返回数量需要显式指定 |
典型使用场景
- 错误趋势:按分钟统计错误日志量,观察突增时段
- 维度排名:按接口或主机统计错误数,找出最差的对象
- 影响面估算:统计一段时间内受影响的独立用户数量
- 分布分析:按耗时区间分组,观察整体分布形态
- 看板取数:把聚合结果直接画成趋势图
按分钟统计错误并去重
按分钟统计错误并去重
GET /logs-app/_search
{
"size": 0, # 不返回命中文档,只取聚合
"aggs": {
"per_minute": {
"date_histogram": { "field": "@timestamp", "fixed_interval": "1m" },
"aggs": {
"errors": { "filter": { "term": { "level.keyword": "error" } } },
"uv": { "cardinality": { "field": "user_id.keyword" } }
}
}
}
}常用聚合
| 聚合 | 作用 | 注意 |
|---|---|---|
| 时间分桶 | 按间隔生成序列 | 间隔过小会返回大量数据点 |
| 维度分组 | 按字段取值统计 | 默认只返回前若干组 |
| 去重计数 | 估算独立数量 | 近似结果,不适合对账 |
| 条件分组 | 先筛选再统计 | 嵌套层级不宜过深 |
只取统计结果时把返回文档数设为 0:既减少传输,也避免无用的文档加载,是纯统计查询的标准写法。
去重计数是近似算法:对账级别的精确统计不能依赖它,需要改用精确计算方式并评估相应开销。
写聚合查询的检查项
- 确认是否需要命中文档:纯统计要把返回数量设为 0
- 确认时间间隔:过小会产生大量数据点
- 确认分组数量:不要依赖默认返回条数
- 确认字段类型:聚合字段应是可分组的类型