公司应用es有一段时间,今天接触了一个相对复杂的业务,针对每隔几分钟,几小时,几天进行统计折线图,具体逻辑如下图:

如图,系统必须要支持查询,每小时(每隔10分钟),每日(每隔4小时统计),每周(每隔1日),每月(每隔5日)进行统计,找到最大值显示到折线图上。

首先4张图像使用term聚合,每张图像上有两条线,表示cpu和内存,也属于term聚合方式,整个折线图采用dateHistogram聚合方式。

使用语句如下:

GET /system-audit1/auditEvent/_search
{"aggs": {"sales": {"terms": {"field": "psName.keyword"},"aggs": {"type": {"terms": {"field": "type.keyword"},"aggs": {"staticTime": {"date_histogram": {"field": "statisticTime","interval": "4h"},"aggs": {"maxValue": {"max": {"field": "value"}}}}}}}}}
}

执行结果:

"aggregations": {"sales": {"doc_count_error_upper_bound": 0,"sum_other_doc_count": 0,"buckets": [{"key": "192.168.1.241:es","doc_count": 7516,"type": {"doc_count_error_upper_bound": 0,"sum_other_doc_count": 0,"buckets": [{"key": "cpu","doc_count": 3763,"staticTime": {"buckets": [{"key_as_string": "2018-01-05T16:00:00.000Z","key": 1515168000000,"doc_count": 2067,"maxValue": {"value": 23.100000381469727}},{"key_as_string": "2018-01-05T20:00:00.000Z","key": 1515182400000,"doc_count": 132,"maxValue": {"value": 22.799999237060547}},{"key_as_string": "2018-01-06T00:00:00.000Z","key": 1515196800000,"doc_count": 0,"maxValue": {"value": null}}...

java代码实现:

List<SystemDistribution> list = new ArrayList<>(); //统计最终的数据
BoolQueryBuilder boolQueryBuilder=QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.rangeQuery("createTime").lte(endTime).gt(startTime)); //createTime是YYYYMMDDHHMMSSSSS格式字符串
DateHistogramInterval dateHistogramInterval=getDateHistogramInterval(timeType); //聚合时间类型
TermsAggregationBuilder termAggregation=AggregationBuilders.terms("psName").field("psName.keyword"); //服务器名称聚合
TermsAggregationBuilder typeAggregation=AggregationBuilders.terms("type").field("type.keyword");
AggregationBuilder timeAggregation =AggregationBuilders.dateHistogram("agg").field("statisticTime")//统计时间聚合.dateHistogramInterval(dateHistogramInterval);
MaxAggregationBuilder maxAggregation = AggregationBuilders.max("maxValue").field("value");//最大值聚合
timeAggregation.subAggregation(maxAggregation);
typeAggregation.subAggregation(timeAggregation);
termAggregation.subAggregation(typeAggregation);
SearchResponse response = client.prepareSearch(INDEX_NAME).setTypes(TYPE).setQuery(boolQueryBuilder).addAggregation(termAggregation).execute().actionGet();
Terms genders = response.getAggregations().get("psName");
for (Terms.Bucket entry : genders.getBuckets()) {SystemDistribution systemDistribution=new SystemDistribution();String psName=entry.getKey().toString();systemDistribution.setHostName(psName);Terms typeTerm = entry.getAggregations().get("type");List<RiskStatisticsVo> memRiskStatistics=new ArrayList<>();List<RiskStatisticsVo> cpuRiskStatisTics=new ArrayList<>();for (Terms.Bucket entry1 : typeTerm.getBuckets()) {String type = entry1.getKeyAsString(); // Key as String  2017-12-27T00:00:00.000ZHistogram histogram=entry1.getAggregations().get("agg");for(Histogram.Bucket entry2 : histogram.getBuckets()){RiskStatisticsVo riskStatisticsVo=new RiskStatisticsVo();riskStatisticsVo.setRiskType(type);String statisTime=entry2.getKeyAsString();Max max=entry2.getAggregations().get("maxValue");Double maxValue=max.getValue();if(maxValue.equals(Double.NEGATIVE_INFINITY)){ //如果为无穷大,赋值为0maxValue=0.0;}//-InfinityriskStatisticsVo.setStatisticTime(formatReturnTime(statisTime,timeType));//2018-01-08T11:00:00.000ZriskStatisticsVo.setCount(maxValue.toString());if("mem".equals(type)){memRiskStatistics.add(riskStatisticsVo);}else{cpuRiskStatisTics.add(riskStatisticsVo);}}}systemDistribution.setCpuStatisticList(cpuRiskStatisTics);systemDistribution.setEmeStatisticList(memRiskStatistics);list.add(systemDistribution);
}
return list;

获得时间类型:

  private DateHistogramInterval getDateHistogramInterval(String dateType) {if(StatisticTimeTypeEnum.HOUR.getName().equals(dateType)){return DateHistogramInterval.minutes(10);//统计一个小时内数据,每隔10分钟一个显示}else if(StatisticTimeTypeEnum.Day.getName().equals(dateType)){return DateHistogramInterval.hours(4); //统计每日,每隔4小时统计}else if(StatisticTimeTypeEnum.WEEK.getName().equals(dateType)){return DateHistogramInterval.days(1); //每周,统计每天的数据统计}else{return DateHistogramInterval.days(5); //每月,每隔5天一个统计数据}}

格式化返回时间:

  private String formatReturnTime(String time,String dateType){if(StatisticTimeTypeEnum.HOUR.getName().equals(dateType)){return time.substring(11,16);}else if(StatisticTimeTypeEnum.Day.getName().equals(dateType)){return time.substring(8,10)+"日"+time.substring(11,13)+"时";}else{return time.substring(8,10)+"日";}}

ES 按照每隔几分钟,几小时,几天统计折线图相关推荐

  1. linux定时每隔多少天,Linux中Cron任务间隔执行:每隔几分钟/几小时/几天

    一.配置 1)全局用户配置文件(/etc/crontab) 直接VI等编辑就可以. 2)个人用户配置(临时配置) 加任务: crontab -e 0 */1 * * * command 0 */2 * ...

  2. Cron任务间隔执行:每隔几分钟/几小时/几天

    每个子表达式代表的含义 一个cron表达式有至少5个(也可能6,7个)有空格分隔的时间元素. 按顺序依次为 秒(0~59) 分钟(0~59) 小时(0~23) 天(月)(0~31,但是你需要考虑你月的 ...

  3. cron每半个小时执行一次_Linux中Cron任务间隔执行:每隔几分钟/几小时/几天

    一.配置 1)全局用户配置文件(/etc/crontab) 直接VI等编辑就可以. 2)个人用户配置(临时配置) 加任务: crontab -e 0 */1 * * * command 0 */2 * ...

  4. 每隔5分钟输出最近一小时内点击量最多的前N个商品(flink+kafka)

    需求 每隔5分钟输出最近一小时内点击量最多的前N个商品. 样例数据,分别代表(用户id,商品id,类别id,行为,时间戳): 543462,1715,1464116,pv,1511658000 实现 ...

  5. Flink入门第十二课:DataStream api/Flink sql实现每隔5分钟统计最近一小时热门商品小案例

    用到的数据文件 用到的数据文件 链接:https://pan.baidu.com/s/1uCk-IF4wWVfUkuuTAKaD0w 提取码:2hmu 1.需求 & 数据 用户行为数据不断写入 ...

  6. mysql十分钟分组_MYSQL每隔10分钟进行分组统计的实现方法

    前言 本文的内容主要是介绍了mysql每隔10分钟进行分组统计的实现方法,在画用户登录.操作情况在一天内的分布图时会非常有用,之前我只知道用「存储过程」实现的方法(虽然执行速度快,但真的是太不灵活了) ...

  7. mysql的每隔1分钟定时_简单易用,spring boot集成quartz,实现分布式定时任务

    什么是quartz? Quartz是一个完全由 Java 编写的开源任务调度框架. 我们经常会遇到一些问题: 想每个月27号,提醒信用卡还款: 想每隔1小时,提醒一下,累了,站起来活动一下: 想每个月 ...

  8. 原生js获取一段时间内每隔几分钟的时间数组

    姊妹篇 原生js获取一段时间内每隔几天的时间数组 情况: 项目中有这么一个需求,输入开始时间.结束时间.时间间隔,获取一段时间内每隔几分钟的时间数组 接下来我必须现在网上找找有没有类似的稍微改改就好了 ...

  9. mysql每隔俩小时、四小时、八小时进行数据统计

    mysql每隔俩小时.四小时.八小时进行数据统计 需求:我们经常会遇到每隔一分钟.一小时.一天.一个月进行数据统计,遇到如标题所说的统计信息比较少见,在遇到一些坑之后,解决了问题,先上坑: HOUR ...

最新文章

  1. 5训练需要更改参数吗_PM2.5和臭氧需要协同控制吗?
  2. H.264---CABAC---基础---二进制算术编码
  3. OPA 5 - CreateButtonTest creates CreateButtonSteps
  4. android抽奖动画,Android App中实现简单的刮刮卡抽奖效果的实例详解
  5. Oracle数据库备份和恢复配置详解
  6. element ui html编辑器,Vue + Element UI使用富文本编辑器
  7. 威联通NAS-QTS系统中一些功能的释义
  8. 互联网软件开发和传统软件开发的不同(转型互联网开发需要适应的那些事)
  9. 云栖大会 mysql_【资料合集】2018云栖大会•深圳峰会回顾:PDF下载
  10. 小米路由器安转linux,小米路由器 傻瓜式 一键安装Entware 安装opkg Ⅱ 海量软件随便装...
  11. 百度网盘解除限速的神器(二)
  12. 月租最便宜的手机卡_月租最高不超过10元!最适合当副卡的手机卡套餐全在这了...
  13. 什么是GRAY色彩空间
  14. HTTP协议:三.HTTP 报文信息
  15. 《2022微隔离技术与安全用例研究报告》发布
  16. 什么是串并口硬盘 串口与并口硬盘的区别
  17. 63名研究生的微信群被解散,导师发声:和你们没感情,江湖不见
  18. xgboost 算法参数解释
  19. 小米手机如何把数据备份到电脑上?目前可行的备份方案有哪些?附【多种方法助力小米(安卓)手机提升速度。】
  20. go语言学习笔记 — go工具(4):使用go install,编译并安装

热门文章

  1. 【线上研讨会】多位重磅嘉宾莅临RT-Thread 嵌入式人工智能教学研讨会
  2. python 中的MQTT模块 mqtt-paho的使用
  3. K8S Pod 保护之 PodDisruptionBudget
  4. SAP请求本地导出导入
  5. 安装ut2004, usarsim on linux
  6. 创业时全力以赴和留有后路的结果相同吗?
  7. HaProxy 1.5 说明文档翻译
  8. 从单机架构------》到现在复杂的微服务,分布式,集群,云平台途中是遇到了什么问题,又如何解决的?
  9. WAMP和PHPStorm安装(Win10)
  10. Windows-EmEditor emed_v1910 超大文本编辑器