1. Case introduction
Statistical statistics of the total number of visits, access successes, and access failures of each application within a specific time range, and segmented statistics of the response time of each application request (within 1 second, 1-3 seconds, 3 -5 seconds, more than 5 seconds
2. Refer to Chapter 1 and Chapter 2 of the
document " Introduction to the Use of High-Performance Elasticsearch ORM Development Library " for preparation work, import bboss es dependency package and configure es parameters in your own project
3. Definition Statistics dsl
creates a new file esmapper/estrace/ESTracesMapper.xml in the source directory, the content is as follows
<properties> <!-- Application summary statistics: total visits, successes, failures bboss es dao reference script by name applicationSumStatic --> <property name="applicationSumStatic"> <![CDATA[ { "query": { "bool": { "filter": [ #if($channelApplications && $channelApplications.size() > 0) { "terms": { "applicationName.keyword": [ #foreach($application in $channelApplications) #if($velocityCount > 0),#end $application.applicationName #end ] } }, #end {"range": { "startTime": { "gte": #[startTime],##Statistics start time "lt": #[endTime] ##Statistics deadline } } } ] } }, "size":0, "aggs": { "applicationsums": { "terms": { "field": "applicationName.keyword",##Statistical count by application name "size":10000 }, "aggs":{ "successsums" : { "terms" : { "field" : "err" ##Count the number of successes and failures of each application according to the err ID, 0 for success, 1 for failure } }, "elapsed_ranges" : { "range" : { "field" : "elapsed", ##Statistics by response time "keyed" : true, "ranges" : [ { "key" : "1秒", "to" : 1000 }, { "key" : "3秒", "from" : 1000, "to" : 3000 }, { "key" : "5秒", "from" : 3000, "to" : 5000 }, { "key" : "5秒以上", "from" : 5000 } ] } } } } } } ]]> </property> </properties>
4. Write statistical dao and statistical methods
public class TraceESDao { public List<ApplicationStatic> getApplicationSumStatic(TraceExtraCriteria traceExtraCriteria){ init(); //Return the json statistics message, for debugging, assemble the list of statistics results according to the json message // String response = clientUtil.executeRequest("trace-*/_search", // "applicationSumStatic",traceExtraCriteria); //Statistics based on conditions, specify the start time and end time in the object traceExtraCriteria MapRestResponse restResponse = clientUtil.search("trace-*/_search", "applicationSumStatic",traceExtraCriteria); //Assembly statistics //Get a list of application statistics, including the name of each application, the total number of visits, and the number of successes and failures List<Map<String,Object>> appstatics = (List<Map<String,Object>>)restResponse.getAggBuckets("applicationsums"); if(appstatics != null && appstatics.size() > 0) { List<ApplicationStatic> applicationStatics = new ArrayList<ApplicationStatic>(appstatics.size()); ApplicationStatic applicationStatic = null; for (int i = 0; i < appstatics.size(); i++) { applicationStatic = new ApplicationStatic(); Map<String, Object> map = appstatics.get(i); //Application Name String appName = (String) map.get("key"); applicationStatic.setApplicationName(appName); //Total visits to the app Long totalsize = ResultUtil.longValue( map.get("doc_count"),0l); applicationStatic.setTotalSize(totalsize); //Get the number of successes and failures List<Map<String, Object>> appstatic = (List<Map<String, Object>>)ResultUtil.getAggBuckets(map, "successsums"); /** "buckets": [ { "key": 0, "doc_count": 30 } ] */ //key 0 Long success = 0l;//Number of successes Long failed = 0l;//Number of failures for (int j = 0; j < appstatic.size(); j++) { Map<String, Object> stats = appstatic.get(j); Integer key = (Integer) stats.get("key");//Success and error identification if (key == 0)//success success = ResultUtil.longValue( stats.get("doc_count"),0l); else if (key == 1)//failure failed = ResultUtil.longValue( stats.get("doc_count"),0l); } applicationStatic.setSuccessCount(success); applicationStatic.setFailCount(failed); List<ApplicationPeriodStatic> applicationPeriodStatics = new ArrayList<ApplicationPeriodStatic>(4); ApplicationPeriodStatic applicationPeriodStatic = null; //Get response time segmented statistics Map<String, Map<String, Object>> appPeriodstatic = (Map<String, Map<String, Object>>)ResultUtil.getAggBuckets(map, "elapsed_ranges"); //1 second Map<String, Object> period = appPeriodstatic.get("1秒"); applicationPeriodStatic = new ApplicationPeriodStatic(); applicationPeriodStatic.setPeriod("1秒"); applicationPeriodStatic.setDocCount(ResultUtil.longValue(period.get("doc_count"),0l)); applicationPeriodStatic.setTo(ResultUtil.intValue(period.get("to"),1000)); applicationPeriodStatics.add(applicationPeriodStatic); //3 seconds period = appPeriodstatic.get("3秒"); applicationPeriodStatic = new ApplicationPeriodStatic(); applicationPeriodStatic.setPeriod("3秒"); applicationPeriodStatic.setDocCount(ResultUtil.longValue(period.get("doc_count"),0l)); applicationPeriodStatic.setFrom(ResultUtil.intValue(period.get("from"),1000)); applicationPeriodStatic.setTo(ResultUtil.intValue(period.get("to"),3000)); applicationPeriodStatics.add(applicationPeriodStatic); //5 seconds period = appPeriodstatic.get("5秒"); applicationPeriodStatic = new ApplicationPeriodStatic(); applicationPeriodStatic.setPeriod("5秒"); applicationPeriodStatic.setDocCount(ResultUtil.longValue(period.get("doc_count"),0l)); applicationPeriodStatic.setFrom(ResultUtil.intValue(period.get("from"),3000)); applicationPeriodStatic.setTo(ResultUtil.intValue(period.get("to"),5000)); applicationPeriodStatics.add(applicationPeriodStatic); //more than 5 seconds period = appPeriodstatic.get("5秒以上"); applicationPeriodStatic = new ApplicationPeriodStatic(); applicationPeriodStatic.setPeriod("5秒以上"); applicationPeriodStatic.setDocCount(ResultUtil.longValue(period.get("doc_count"),0l)); applicationPeriodStatic.setFrom(ResultUtil.intValue(period.get("from"),5000)); applicationPeriodStatics.add(applicationPeriodStatic); applicationStatic.setApplicationPeriodStatics(applicationPeriodStatics); applicationStatics.add(applicationStatic); } //return statistics return applicationStatics; } return null; } }
5. Execute the test case
@Test public void testApplicationstaticList(){ TraceExtraCriteria traceExtraCriteria = new TraceExtraCriteria(); traceExtraCriteria.setStartTime(1516304868072l);//Set the start time of statistics in long mode, get the getTime method of Date traceExtraCriteria.setEndTime(1516349516377l);//Set the statistics deadline in long mode, and get the Date's getTime method TraceESDao traceESDao = new TraceESDao();//Define dao components List<ApplicationStatic> applicationStatics = traceESDao.getApplicationSumStatic(traceExtraCriteria); System.out.println(applicationStatics.size()); }
6. Test method for obtaining metadata information
@Test public void testAppStatic(){ TraceExtraCriteria traceExtraCriteria = new TraceExtraCriteria(); traceExtraCriteria.setStartTime(1516304868072l); traceExtraCriteria.setEndTime(1516349516377l); ClientInterface clientUtil = ElasticSearchHelper.getConfigRestClientUtil("esmapper/estrace/ESTracesMapper.xml"); //First get the json message of the query through the following method, and then traverse the results through the MapRestResponse query, and open the String response comment when debugging //String response = clientUtil.executeRequest("trace-*/_search","applicationSumStatic",traceExtraCriteria); //System.out.println(response); MapRestResponse restResponse = clientUtil.search("trace-*/_search","applicationSumStatic",traceExtraCriteria); List<Map<String,Object>> appstatics = restResponse.getAggBuckets("applicationsums",new ESTypeReference<List<Map<String,Object>>>(){}); int doc_count_error_upper_bound = restResponse.getAggAttribute("applicationsums","doc_count_error_upper_bound",int.class); int sum_other_doc_count = restResponse.getAggAttribute("applicationsums","sum_other_doc_count",int.class); System.out.println("doc_count_error_upper_bound:"+doc_count_error_upper_bound); System.out.println("sum_other_doc_count:"+sum_other_doc_count); for(int i = 0; i < appstatics.size(); i ++){ Map<String,Object> map = appstatics.get(i); //Application Name String appName = (String)map.get("key"); //Total visits to the app int totalsize = (int)map.get("doc_count"); //Get the number of successes and failures List<Map<String,Object>> appstatic = ResultUtil.getAggBuckets(map ,"successsums",new ESTypeReference<List<Map<String,Object>>>(){}); doc_count_error_upper_bound = ResultUtil.getAggAttribute(map ,"successsums","doc_count_error_upper_bound",int.class); sum_other_doc_count = ResultUtil.getAggAttribute(map ,"successsums","sum_other_doc_count",int.class); System.out.println("doc_count_error_upper_bound:"+doc_count_error_upper_bound); System.out.println("sum_other_doc_count:"+sum_other_doc_count); /** "buckets": [ { "key": 0, "doc_count": 30 } ] */ //key 0 int success = 0;//Number of successes int failed = 0;//Number of failures for(int j = 0; j < appstatic.size(); i ++){ Map<String,Object> stats = appstatic.get(i); int key = (int) stats.get("key");//Success and error identification if(key == 0) success = (int)stats.get("doc_count"); else if(key == 1) failed = (int)stats.get("doc_count"); } } }
7. Related information
Introduction to the use of high-performance elasticsearch ORM development library
https://my.oschina.net/bboss/blog/1556866
bboss elasticsearch exchange group: 166471282