我们正在尝试在 ElasticSearch 中生成直方图使用Histogram aggregation
我们正在使用 ElasticSearch 监控我们的 API 性能。我们存储的一组示例文档是
{"name": "GET /login", "avg":2.2, "count": 5}
{"name": "GET /login", "avg":1.5, "count": 3}
{"name": "GET /login", "avg":6.9, "count": 1}
{"name": "GET /login", "avg":3.1, "count": 1}
哪里
-
count
数量为GET /login
在特定时间段内到达我们服务器的网络请求。 -
avg
是平均响应时间。
直方图问题
当我运行 GET /login
的直方图时单独,间隔为1 second
,我明白
1-2 seconds - 1
2-3 seconds - 1
3-4 seconds - 1
5-6 seconds - 1
但是,我们正在做的是,我们只存储平均值和计数(以节省空间并且不重复记录)。但实际上,我们想要得到的是
1-2 seconds - 3
2-3 seconds - 5
3-4 seconds - 1
5-6 seconds - 1
映射我们当前的hist
索引
PUT hist/_mapping/t
{
"properties": {
"name": {
"type": "string"
},
"avg": {
"type": "long"
},
"count": {
"type": "long"
}
}
}
我们使用以下查询来获取直方图。
GET /hist/t/_search
{
"aggs": {
"avgs": {
"histogram": {
"field": "avg",
"interval": 1
}
}
}
}
百分位问题
同样的问题也出现在百分位数上。
1.5, 2.2, 3.1, 6.9
- 75th percentile
报告为3.1
第二。
1.5, 1.5, 1.5, 2.2, 2.2, 2.2, 2.2, 2.2, 3.1, 6.9
- 真实75th percentile
是 2.2
秒
我们使用以下查询来获取百分位。
GET /hist/t/_search
{
"aggs": {
"avgs": {
"percentiles": {
"field": "avg"
}
}
}
}
如何在 Elasticsearch 中执行此操作?
最佳答案
您现在得到的是每个直方图存储桶的文档计数。您可以在 count
字段上添加一个 sum
子聚合,您应该会得到您所期望的结果。试试这个:
POST /hist/t/_search
{
"aggs": {
"avgs": {
"histogram": {
"field": "avg",
"interval": 1
},
"aggs": {
"sum_of_count": {
"sum": {
"field": "count"
}
},
"perc_of_count": {
"percentiles": {
"field": "count"
}
}
}
}
}
}
关于elasticsearch - 如何在 ElasticSearch 中获取带有计数的直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40386933/