一、场景描述:计算交易平均耗时、交易量、交易成功率
二、Rest api实现方式:
GET /ms_online/_search
{
"size":0,
"aggs":{
"trades_data": {
"date_histogram": {
"field": "@timestamp",
"interval": "10s", //周期10s
"format": "yyyy-MM-dd HH:mm:ss"
},
"aggs":{
"avg_hs":{
"avg":{
"field":"trans_hs" //平均耗时
}
},
"group_count":{
"terms":{
"field":"suc_flag.keyword", //group by 成功标识
"min_doc_count":0
}
}
}
}
}
}
三、对应的Java api实现方式:
/**
* 时间周期内统计交易平均耗时、交易笔数、交易成功率
* @param param
* @return
*/
public List<TradesMonitorVO> getTradesData(TradesMonitorVO param){
SearchRequestBuilder requestbuilder = client.prepareSearch(param.getIndex());
//不需要返回原始数据,只需要统计数据
requestbuilder.setSize(0);
BoolQueryBuilder bqb = QueryBuilders.boolQuery();
String host = param.getHost();
if(StringUtils.isNotEmpty(host))
{
bqb.must(QueryBuilders.termQuery("host", param.getHost()));
}
String type = param.getType();
if(StringUtils.isNotEmpty(type))
{
bqb.must(QueryBuilders.termQuery("_type", param.getHost()));
}
requestbuilder.setQuery(bqb);
//时间过滤
String date = param.getTimestamp();
if(StringUtils.isNotEmpty(date))
{
bqb.must(QueryBuilders.rangeQuery("@timestamp").gte(date).lte(date));
}
//统计规则
DateHistogramAggregationBuilder aggregation = AggregationBuilders.dateHistogram("trades_data");
aggregation.field("@timestamp");
//统计周期 默认10s
aggregation.dateHistogramInterval(DateHistogramInterval.seconds(10));
aggregation.format("yyyy-MM-dd HH:mm:ss");
//平均耗时
AvgAggregationBuilder avgAggregation = AggregationBuilders.avg("avg_hs").field("trans_hs");
aggregation.subAggregation(avgAggregation);
//成功失败group by count
TermsAggregationBuilder termsAggregation = AggregationBuilders.terms("group_count").field("suc_flag.keyword").minDocCount(0);
aggregation.subAggregation(termsAggregation);
requestbuilder.addAggregation(aggregation);
SearchResponse myresponse = requestbuilder.get();
Map<String, Aggregation> aggMap = myresponse.getAggregations().asMap();
InternalDateHistogram idh = (InternalDateHistogram) aggMap.get("trades_data");
List<Bucket> buckets = idh.getBuckets();
List<TradesMonitorVO> list = new ArrayList<TradesMonitorVO>();
TradesMonitorVO item = null;
for(Bucket bucket : buckets){
item = new TradesMonitorVO();
//时间戳
item.setTimestamp(bucket.getKeyAsString());
//交易量
long count = bucket.getDocCount();
item.setCount(count);
Map<String, Aggregation> subAggMap = bucket.getAggregations().asMap();
//平均耗时
double avgHs = (double)subAggMap.get("avg_hs").getProperty("value");
item.setAvgHs(avgHs);
//成功百分比
if(count != 0){
StringTerms groupCouont = (StringTerms)subAggMap.get("group_count");
long sucCount = groupCouont.getBucketByKey("0").getDocCount();
item.setSuccRate(Integer.parseInt(String.valueOf((sucCount * 100)/count)));
}else{
item.setSuccRate(100);
}
list.add(item);
}
return list;
}