从线上日志统计接口访问量QPS
这一阵子在面试,连续遇到好几家(大小厂都有)问我的项目线上qps的情况了,说实话,我作为一个大头兵,本来没关注过这个数据,只能含混地给个“大概、也许”的回答。
回来之后,我决定对业务线上请求进行一下qps统计。
统计用到的基本命令:
- sed 切分出关键词
- awk 按统计要求的维度组织数据,并计数
- sort 对统计结果进行排序
统计要求:
- 精确到秒(或分钟)
- 区分不同接口
- 找出前n个请求量最高的
日志格式
[20210525 17:00:00 733149][INFO][xxx.xxx.xxx.xxx:pppp] method:moduleXXX.funcYYY
解决思路
-
我们需要切出几个关键字:时间、模块、请求方法:
sed -nre 's/^.*(20210525 [0-9:]{8}).*method:([a-zA-Z0-9_.]+).*/\1 \2/p'
上边这条语句,是匹配出“20210525 hh:ii:ss” 时间,和 “moudleXXX.funcYYY” 请求字串,然后print出来(
-n
选项表示静默不输出,sed语句内的actionp
表示输出匹配行,这样就能过滤掉不匹配的日志行) -
然后,我们需要对切出来的请求进行计数:
awk '{a[$1" "$2" "$3]+=1}END{for(k in a){printf("%s %i\n", k,a[k]}}'
上边的语句,是利用awk内部数组a,把切出来的日志时间和请求方法,拼接成形如“20210525 10:00:00 moduleXXX.funcYYY”的形式,然后作为awk数组的key,对其进行统计计数。然后再awk读取结束之后,对数组a中统计的所有key,都输出其计数值——这样就能把每一秒对应的请求和数量给统计出来了——即qps。如下所示:
20210525 00:00:00 moduleXXX.funcYYY 12345
-
最后,可以对统计出来的qps数值进行排序
sort -gr -k4,4
最后得到的就是按请求数倒序排列qps统计结果啦
-
最后的最后,我们需要对上边出现的请求,按照方法进行去重,这里可以用awk来做,稍显复杂:
awk '$3 in a{next}{a[$3];printf("%i %s", $4, $3)}'
这里,首先判断
$3
是否被内部数组a设置上了,如果有,则跳过后续条件语句块;否则,将其设置上,然后输出$3
和$4
(即请求接口名,和请求次数)。这里的逻辑就是只输出每个请求的第一个统计行——即最大的qps
齐活~贴一下最终的语句:
cat log_file |
sed -nre '{s/^.*(20210525 [0-9:]{8}).*method:([0-9a-z.A-Z]+).*$/\1 \2/p}'|
awk '{a[\$1\" \"\$2\" \"\$3]+=1} END {
for(k in a) {printf (\"%s %i\\n\", k, a[k])}
}'|
sort -gr -k4,4"|
awk '$3 in a {next} {a[$3];printf("%i %s", $4, $3)}