从线上日志统计接口访问量QPS

这一阵子在面试,连续遇到好几家(大小厂都有)问我的项目线上qps的情况了,说实话,我作为一个大头兵,本来没关注过这个数据,只能含混地给个“大概、也许”的回答。
回来之后,我决定对业务线上请求进行一下qps统计。

统计用到的基本命令:

  • sed    切分出关键词
  • awk    按统计要求的维度组织数据,并计数
  • sort    对统计结果进行排序

统计要求:

  1. 精确到秒(或分钟)
  2. 区分不同接口
  3. 找出前n个请求量最高的

日志格式

[20210525 17:00:00 733149][INFO][xxx.xxx.xxx.xxx:pppp] method:moduleXXX.funcYYY

解决思路

  1. 我们需要切出几个关键字:时间、模块、请求方法:

    	sed -nre 's/^.*(20210525 [0-9:]{8}).*method:([a-zA-Z0-9_.]+).*/\1 \2/p'
    

    上边这条语句,是匹配出“20210525 hh:ii:ss” 时间,和 “moudleXXX.funcYYY” 请求字串,然后print出来(-n选项表示静默不输出,sed语句内的action p表示输出匹配行,这样就能过滤掉不匹配的日志行)

  2. 然后,我们需要对切出来的请求进行计数:

    	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
    
  3. 最后,可以对统计出来的qps数值进行排序

    	sort -gr -k4,4
    

    最后得到的就是按请求数倒序排列qps统计结果啦

  4. 最后的最后,我们需要对上边出现的请求,按照方法进行去重,这里可以用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)}
posted @ 2021-05-25 18:14  leozmm  阅读(819)  评论(0编辑  收藏  举报