利用线上日志统计接口的QPS

背景:

最近在对接sentinel到项目中,利用jMeter压测确定限流规则的QPS值,同时想查看一下线上接口的QPS值。

材料:

日志是本地压测产生的日志,重要的是格式

2019-07-03T11:16:23+0800|127.0.0.1|-|-|GET|http|127.0.0.1|/iptv/api/new/video/play/get?...
2019-07-03T11:16:23+0800|127.0.0.1|-|-|GET|http|127.0.0.1|/iptv/api/new/video/play/get?...
2019-07-03T11:16:23+0800|127.0.0.1|-|-|GET|http|127.0.0.1|/iptv/api/new/video/play/get?...

问题:

如何统计某个接口每秒的QPS那?

分析:

看如下日志,2019-07-03T11:16:23+0800|127.0.0.1|-|-|GET|http|127.0.0.1|/iptv/api/new/video/play/get?...;其实,我们就是要统计接口/iptv/api/new/video/play/get在相同秒数(即:同一个时间秒数,2019-07-03T11:16:23)出现的次数。

解决办法:

先抛出命令行:tail -f host-access.log | grep '/iptv/api/new/video/play/get' | awk -F '|' '{print substr($1,1,19)}' | uniq -c

  1. 首先,通过tail -f 不间断查询日志(-f 表示不间断查询最新统计上来的日志)
  2. 第二,我们要锁定指定行(即,包含指定访问接口的日志),一般使用grep命令,如 grep /iptv/api/new/video/play/get ,得到一个请求对应的一行日志
  3. 截取对应列中秒级时间并打印(即:2019-07-03T11:16:23),常用的命令工具有cut和awk,这里用awk演示:
    1. 上面的日志格式是用 ‘ | ’进行分割的,所用awk的 -F参数指定分隔符为 | ,分割完后我们取第一个结果,即 $1 ;再用substr截取第1到第19位(格式:2019-07-03T11:16:21),用print打印结果为:
      2019-07-03T11:16:21
      2019-07-03T11:16:21
      2019-07-03T11:16:21
      2019-07-03T11:16:22
      2019-07-03T11:16:22
      2019-07-03T11:16:22
      2019-07-03T11:16:22
      2019-07-03T11:16:23
      2019-07-03T11:16:23
      2019-07-03T11:16:23
      2019-07-03T11:16:23
  4. 对结果进行去重统计,常用工具uniq,参数指定 -c:

    20 2019-07-03T11:05:22
    14 2019-07-03T11:05:23
    22 2019-07-03T11:05:24
    20 2019-07-03T11:05:25
    20 2019-07-03T11:05:26
    20 2019-07-03T11:05:27
    20 2019-07-03T11:05:28

命令行综述:

tail -f host-access.log | grep '/iptv/api/new/video/play/get' | awk -F '|' '{print substr($1,1,19)}' | uniq -c

    获取增量日志         |        每个请求对应的行信息           |     截取相同秒数的时间              | 去重计数

结果:

每秒的QPS值在20左右

扫描二维码关注公众号,回复: 9757819 查看本文章

注:使用cut工具统计的QPS,传送门

发布了75 篇原创文章 · 获赞 48 · 访问量 35万+

猜你喜欢

转载自blog.csdn.net/KingJin_CSDN_/article/details/94884513
QPS