我们正尝试使用ElasticSearch
在Percentiles 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 /hist/t/_search
{
"aggs": {
"avg_time_percentile": {
"percentiles": {
"field": "avg",
"percents" : [75, 95, 99]
}
}
}
}
我们得到以下回复
"avg_time_percentile": {
"values": {
"75.0": 3.75,
"95.0": 5.549999999999999,
"99.0": 5.909999999999999
}
然而,我们想要的是:
"avg_time_percentile": {
"values": {
"75.0": 2,
"95.0": 4.349999999999998,
"99.0": 5.670000000000002
}
值不正确的原因是,它需要例如2.2
只在一条记录中。但是计数是5
,应该考虑5次。
我如何在ElasticSearch中完成。
答案 0 :(得分:1)
您可以使用field
而不是使用script
,以便将多个字段组合在一起并在这些新值上运行百分位数
POST /hist/t/_search
{
"aggs": {
"avg_time_percentile": {
"percentiles": {
"script": {
"inline": "doc.avg.value * doc.count.value"
},
"percents" : [75, 95, 99]
}
}
}
}