• jmeter采集ELK平台海量业务日志( 采用Scroll)


            由于性能测试需要,需采集某业务系统海量日志(百万以上)来使用。但Elasticsearch的结果分页size单次最大为10000(运维同事为保证ES安全)。为了能够快速采集ELK平台业务日志,可以使用以下2种方式采集:

    1)结果分页方式:

            通过使用 from 和 size 参数来完成。 from 参数定义了您要提取的第一个结果的偏移量。 size 参数允许您配置要返回的最大匹配数。虽然 from 和 size 可以设置为请求参数,但它们也可以在搜索正文中设置。from 默认值为 0,size 默认为 10。

    注意 from + size 不能超过 index.max_result_window 索引设置,默认为 10,000

    2)滚动方式(Scroll,类似于游标):

            可以用于从单个搜索请求中检索大量结果(甚至是所有结果),与在传统数据库上使用游标的方式大致相同。滚动不是用于实时用户请求,而是用于处理大量数据,例如,以便将一个索引的内容重新索引到具有不同配置的新索引中。

    综合考虑,滚动方式对于采集数据更方便实用,且不用关注from的值及不受size 10000的限制。

    主流程图:

    ELK日志平台业务日志:

    以下为使用 jmeter 工具的详细实例:

    Jmeter脚本全貌:

    下面开始详细分段说明:

    1. BeanShell PreProcessor前置处理器。用来获取起止时间戳。如下图:

    BeanShell 代码

    import java.util.*;

    long current = System.currentTimeMillis();//当前时间毫秒数
    long todaySatartMillis = current / (1000 * 3600 * 24) * (1000 * 3600 * 24) - TimeZone.getDefault().getRawOffset();//今天零点零分零秒的毫秒数
    long before = todaySatartMillis + 9 * 60 * 60 * 1000;
    long end = before + 3 * 60 * 60 * 1000;
    String startTime = Long.toString((before));
    String endTime = Long.toString((end));
    vars.put("start",startTime);
    vars.put("end",endTime);
    log.info("开始时间:"+startTime+", 结束时间:"+endTime);

    2. 线程组

    1)线程组下 HTTP请求插件中参数设置(非常重要)

    如下图所示

    查询条件信息

    _sourcethrift.params
    qthrift.Uri:"/keyWordsSearchService/1.0.0/autoSuggest" AND @timestamp:[${start} TO ${end}]
    size1000
    scroll1m

    2)JSON提取器。

     用来按条件获取HTTP请求后返回结果中_scroll_id字段的值,因为下次请求的入参需要_scroll_id字段的值。如下图。

    3)使用迭代器循环调用日志采集http请求插件。

    http请求插件下,需要创建2个JSON 提取器,如下图所示:

    JSON提取器一

    JSON提取器二

    获取 json中 htis节点值。

    4)迭代器下创建BeanShell Sampler。用来对返回结果值(hits节点)加工处理后,存入指定目录下文件。

    Beanshell 代码如下:

    1. import com.alibaba.fastjson.JSONObject;
    2. import com.alibaba.fastjson.JSONArray;
    3. import org.apache.commons.lang.StringUtils;
    4. import java.io.*;
    5. import java.io.File;
    6. /**
    7. * 写入文件
    8. */
    9. public class WriteFile{
    10. public void writeFile(String str, File fileName){
    11. if((str!=null || !str.trim().equals("")) && fileName!=null ) {
    12. try {
    13. FileOutputStream fos = new FileOutputStream(fileName,true);
    14. Writer w = new OutputStreamWriter(fos,"UTF-8");
    15. try {
    16. str = str.replaceAll("%(?![0-9a-fA-F]{2})", "%25");
    17. str = str.replaceAll("\\+", "%2B");
    18. w.write(java.net.URLDecoder.decode(str, "UTF-8"));
    19. w.flush();
    20. w.close();
    21. fos.close();
    22. } catch (IOException e) {
    23. e.printStackTrace();
    24. }
    25. } catch (FileNotFoundException e) {
    26. e.printStackTrace();
    27. } catch (UnsupportedEncodingException e) {
    28. e.printStackTrace();
    29. }
    30. }
    31. }
    32. }
    33. String strDocs = vars.get("returnJson");
    34. String cityIds = vars.get("cityId");
    35. //System.out.println(strDocs);
    36. JSONObject jsonObject = JSONObject.parseObject(strDocs);
    37. JSONArray hitsArray = jsonObject.getJSONArray("hits");
    38. //文件路径及文件名称
    39. String filePath = "D:/FullLinkData/nlp/autoSuggest.csv";
    40. File fileName = new File(filePath);
    41. StringBuffer sb = new StringBuffer();
    42. WriteFile wr = new WriteFile();
    43. String request = null;
    44. String requestStr = null;
    45. for(int i = 0;i< hitsArray.size();i++){
    46. request = hitsArray.getJSONObject(i).getJSONObject("_source").getString("thrift.params");
    47. requestStr = org.apache.commons.lang.StringUtils.strip(request, "[]");//去除[]*/
    48. JSONObject jo = JSONObject.parseObject(requestStr);
    49. jo.put("version",2);
    50. if(jo!=null){
    51. sb.append(jo.toJSONString()+"\r\n");//post请求 换行
    52. }
    53. }
    54. wr.writeFile(sb.toString(),fileName);//写入文件

    最后,运行后,生成文件如下,采集速度杠杠滴!(敏感信息已处理)

    参考:Scroll - Elasticsearch 高手之路

    手工整理不易,如转载请注明出处~~ 

  • 相关阅读:
    mindspore mindcv图像分类算法;模型保存与加载
    Ubuntu上无sudo权限,安装zsh、on-my-zsh及其插件
    多目标优化算法:多目标圆圈搜索算法(Multi-Objective Circle Search Algorithm,MOCSA)
    Array.from()的作用
    X书6.97版本shield-unidbg调用方式
    SpringMVC实现文件的上传(CommonsMultipartResolver和StanderServletMultipartResolver)
    springBoot对接多个mq并且实现延迟队列---未完待续
    黑马JVM总结(十一)
    一篇带你搞定Javaの继承
    区块链是如何演化的?
  • 原文地址:https://blog.csdn.net/junior77/article/details/132831502