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