这一阵子在面试,连续遇到好几家(大小厂都有)问我的项目线上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)}

从线上日志统计接口访问量QPS的更多相关文章

  1. 研发流程 接口定义&开发&前后端联调 线上日志观察 模型变动

    阿里等大厂的研发流程,进去前先了解一下_我们一起进大厂 - SegmentFault 思否 https://segmentfault.com/a/1190000021831640 接口定义 测试用例评 ...

  2. Flume线上日志采集【模板】

    Flume线上日志采集[模板] 预装软件 Java HDFS Lzo/Lzop 系统版本 Flume 1.5.0-cdh5.4.0 系统流程图 flume-env.sh配置文件 export JAVA ...

  3. nginx 日志统计接口每个小时访问量

    指定时间段增量统计nginx日志不同接口的访问量: #!/bin/bash#此脚本用于统计nginx日志当前时间15分钟之内不同接口(URL)的访问量统计LOG=/usr/local/nginx/lo ...

  4. 线上日志集中化可视化管理:ELK

    本文来自网易云社区 作者:王贝 为什么推荐ELK: 当线上服务器出了问题,我们要做的最重要的事情是什么?当需要实时监控跟踪服务器的健康情况,我们又要拿什么去分析?大家一定会说,去看日志,去分析日志.是 ...

  5. Nodejs线上日志部署

    Nodejs 被越来越多的使用到线上系统中,但线上系统没有日志怎么行呢. 一.forever记录日志 我的线上系统使用forever来启动服务,最开始就直接使用了forever来记录 forever ...

  6. 查看线上日志利器less

    less实用命令 搜索 很多关于命令的解释有点令人困惑,因为前字,forward是向前,before也是前面. 上表示backward 下表示forward 向下搜索 / - 使用一个模式进行搜索,并 ...

  7. 一次错误使用 go-cache 导致出现的线上问题

    话说一个美滋滋的上午, 突然就出现大量报警, 接口大量请求都响应超时了. 排查过程 查看服务器的监控系统, CPU, 内存, 负载等指标正常 排查日志, 日志能够响应的结果也正常. request.l ...

  8. 记一次ArrayList产生的线上OOM问题

    前言:本以为(OutOfMemoryError)OOM问题会离我们很远,但在一次生产上线灰度的过程中就出现了Java.Lang.OutOfMemoryError:Java heap space异常,通 ...

  9. Java架构师线上问题排查,这些命令程序员一定用得到!

    Java架构师线上问题排查,这些命令程序员一定用得到! 线上问题排查,以下场景,你遇到过吗? 一.了解机器连接数情况 问题:1.2.3.4的sshd的监听端口是22,如何统计1.2.3.4的sshd服 ...

随机推荐

  1. JUC学习笔记(三)

    JUC学习笔记(一)https://www.cnblogs.com/lm66/p/15118407.html JUC学习笔记(二)https://www.cnblogs.com/lm66/p/1511 ...

  2. C++ //纯虚函数和抽象类 // 语法 virtual 返回值类型 函数名 (参数列表)=0 //当类中有了纯虚函数 这个类也称为抽象类

    1 //纯虚函数和抽象类 2 // 语法 virtual 返回值类型 函数名 (参数列表)=0 3 //当类中有了纯虚函数 这个类也称为抽象类 4 5 6 #include <iostream& ...

  3. Kerberos相关的安全问题

    用户名枚举 原理 不存在的用户 存在的用户 通过这个比较就可以写脚本改变cname的值进行用户名枚举. 利用 https://github.com/ropnop/kerbrute/ kerbrute. ...

  4. 解决Win10用户VS Code的C/C++更新到1.6.0后无法调试的问题

    今天突然遇到一个问题 Win10上 vscode C++突然无法正常调试 在运行调试后 编译成功后没有任何提示 直接就停止了 没有错误 不运行程序 尝试重新写一遍launch.json 自动生成lau ...

  5. Greenplum数仓监控解决方案(开源版本)

    Greenplum监控解决方案 基于Prometheus+Grafana+greenplum_exporter+node_exporter实现 关联图 一.基本概念 1.Prometheus ​ Pr ...

  6. SQL注入:sqli-labs:5~6 double injection(Query)

    第五题: http://127.0.0.1/sqli/Less-5/?id=1 显示:You are in--.后面发现,不管是1,2,3,4都死显示Your are in --,不打紧,继续看看 h ...

  7. xv6学习笔记(3):中断处理和系统调用

    xv6学习笔记(3):中断处理和系统调用 1. tvinit函数 这个函数位于main函数内 表明了就是设置idt表 void tvinit(void) { int i; for(i = 0; i & ...

  8. 带你从0到1实现canvas的undo和redo功能

    不知不觉又到了周末,又到了Fly写文章的日子,今天给大家介绍下一个web中很常见的功能, 就是撤销和复原这样一个功能,对于任何一个画图软件,或者是建模软件.没有撤销和复原.这不是傻了对啊吧,所以本篇文 ...

  9. noip31

    T1 关于我考场上乱冲平衡树这件sb事 很快就冲了出来 然后手抖打错样例,把我hack了 sb字典序 正解: 先不考虑字典序问题,先将最大分数找出来,然后按照顺序考虑每一个位置填什么那个数能让分数尽可 ...

  10. GitLabRunner命令

    启动命令 gitlab-runner --debug <command> #调试模式排查错误特别有用. gitlab-runner <command> --help #获取帮助 ...