概述
在之前写过一篇一条慢SQL导致购物车服务无法使用的文章,由于购物车是入口,出了故障,自然都不是小问题。这不,老板说要统计一下影响面。如果没有成熟的业务监控和统计工具,干这种活,只能用最原始的查日志的方式。
本来我想把日志下载下来,写段JAVA
代码分析一下,谁知日志文件居然有3个g,除了下载慢,用JAVA
分析起来也慢。果断放弃,换用江湖人称日志内容查找神器的awk
大哥出来帮忙。
找出添加购物车失败的有效次数
一般来说,业务操作失败后,是要记录请求的入参的,以便帮助定位问题,添加购物车失败的请求入参大概如下:
[qtp691540605-1332] ERROR ShopCartController 添加商品到购物车失败,userId:5555555,request:{"buyNum":1,"skuId":777777}
[qtp691540605-1332] ERROR ShopCartController 添加商品到购物车失败,userId:5555555,request:{"buyNum":1,"skuId":777777}
[qtp691540605-1332] ERROR ShopCartController 添加商品到购物车失败,userId:5555555,request:{"buyNum":1,"skuId":666666}
[qtp691540605-1332] ERROR ShopCartController 添加商品到购物车失败,userId:5555555,request:{"buyNum":1,"skuId":666666}
[qtp691540605-1332] ERROR ShopCartController 添加商品到购物车失败,userId:8888888,request:{"buyNum":1,"skuId":666666}
有些朋友可能会说,直接用
cat cart.log | grep 添加商品到购物车失败 | wc -l
不就搞定了吗?这样做,统计出来的失败次数会多很多的,因为很多用户发现添加商品到购物车失败后,会不断重试的,请求参数都是一样的,属于重复次数了。因此我们得针对用户id进行去重。因此我们首先可以先以userId
作为分割点,将日志行切分成两截,并打印出第二截。
cat cart.log | grep 添加商品到购物车失败 |awk -F 'userId' '{print $2}'
执行完后,输出的内容如下:
:5555555,request:{"buyNum":1,"skuId":777777}
:5555555,request:{"buyNum":1,"skuId":777777}
:5555555,request:{"buyNum":1,"skuId":666666}
:5555555,request:{"buyNum":1,"skuId":666666}
:8888888,request:{"buyNum":1,"skuId":666666}
接下来再按照userId
,例如上面的5555555后面的逗号作为分隔点,再次将日志内容切分成两截,并取用第一截的内容。
cat cart.log | grep 添加商品到购物车失败 |awk -F 'userId' '{print $2}' | awk -F ',' '{print $1}'
执行完后,输出结果如下:
:5555555
:5555555
:5555555
:5555555
:8888888
这个时候,我们就可以针对userId
排序去重了。
cat cart.log | grep 添加商品到购物车失败 |awk -F 'userId' '{print $2}' | awk -F ',' '{print $1}' |sort| uniq -c |
输出结果如下:
:5555555
:8888888
这种统计方式其实也是有问题的。因为同一个userId
,他可以买不同的商品的,例如上面的
[qtp691540605-1332] ERROR ShopCartController 添加商品到购物车失败,userId:5555555,request:{"buyNum":1,"skuId":777777}
[qtp691540605-1332] ERROR ShopCartController 添加商品到购物车失败,userId:5555555,request:{"buyNum":1,"skuId":666666}
因此只是按照userId
来统计的话,会少了一部分数据。为了得到真正有效的次数,我们应该以添加商品到购物车失败,
这段文字作为分割点,然后用第二截。
cat cart.log | grep 添加商品到购物车失败 |awk -F '添加商品到购物车失败,' '{print $2}'
执行后结果如下:
userId:5555555,request:{"buyNum":1,"skuId":777777}
userId:5555555,request:{"buyNum":1,"skuId":777777}
userId:5555555,request:{"buyNum":1,"skuId":666666}
userId:5555555,request:{"buyNum":1,"skuId":666666}
userId:8888888,request:{"buyNum":1,"skuId":666666}
以上面的行进行排序去重统计次数,完整命令如下:
cat cart.log | grep 添加商品到购物车失败 |awk -F '添加商品到购物车失败,' '{print $2}' | sort | uniq -c | wc -l
这样我们就统计出添加购物车失败的有效次数了,然后我们用这个数去除以添加购物车的总次数,就得到一个占比了。
有效的添加购物车失败次数/添加购物车的总次数
如果占比非常小的话,说明影响不严重。当然我们也可以用类似的命令去统计一下,当时的购物车故障,影响了多少人购买了。这个很简单,跟上面的命令差不多,留给读者自己思考哈。