从线上日志统计接口访问量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)}
从线上日志统计接口访问量QPS的更多相关文章
- 研发流程 接口定义&开发&前后端联调 线上日志观察 模型变动
阿里等大厂的研发流程,进去前先了解一下_我们一起进大厂 - SegmentFault 思否 https://segmentfault.com/a/1190000021831640 接口定义 测试用例评 ...
- Flume线上日志采集【模板】
Flume线上日志采集[模板] 预装软件 Java HDFS Lzo/Lzop 系统版本 Flume 1.5.0-cdh5.4.0 系统流程图 flume-env.sh配置文件 export JAVA ...
- nginx 日志统计接口每个小时访问量
指定时间段增量统计nginx日志不同接口的访问量: #!/bin/bash#此脚本用于统计nginx日志当前时间15分钟之内不同接口(URL)的访问量统计LOG=/usr/local/nginx/lo ...
- 线上日志集中化可视化管理:ELK
本文来自网易云社区 作者:王贝 为什么推荐ELK: 当线上服务器出了问题,我们要做的最重要的事情是什么?当需要实时监控跟踪服务器的健康情况,我们又要拿什么去分析?大家一定会说,去看日志,去分析日志.是 ...
- Nodejs线上日志部署
Nodejs 被越来越多的使用到线上系统中,但线上系统没有日志怎么行呢. 一.forever记录日志 我的线上系统使用forever来启动服务,最开始就直接使用了forever来记录 forever ...
- 查看线上日志利器less
less实用命令 搜索 很多关于命令的解释有点令人困惑,因为前字,forward是向前,before也是前面. 上表示backward 下表示forward 向下搜索 / - 使用一个模式进行搜索,并 ...
- 一次错误使用 go-cache 导致出现的线上问题
话说一个美滋滋的上午, 突然就出现大量报警, 接口大量请求都响应超时了. 排查过程 查看服务器的监控系统, CPU, 内存, 负载等指标正常 排查日志, 日志能够响应的结果也正常. request.l ...
- 记一次ArrayList产生的线上OOM问题
前言:本以为(OutOfMemoryError)OOM问题会离我们很远,但在一次生产上线灰度的过程中就出现了Java.Lang.OutOfMemoryError:Java heap space异常,通 ...
- Java架构师线上问题排查,这些命令程序员一定用得到!
Java架构师线上问题排查,这些命令程序员一定用得到! 线上问题排查,以下场景,你遇到过吗? 一.了解机器连接数情况 问题:1.2.3.4的sshd的监听端口是22,如何统计1.2.3.4的sshd服 ...
随机推荐
- 深度学习算子优化-FFT
作者:严健文 | 旷视 MegEngine 架构师 背景 在数字信号和数字图像领域, 对频域的研究是一个重要分支. 我们日常"加工"的图像都是像素级,被称为是图像的空域数据.空域数 ...
- Windows服务器如何磁盘分区,Windows服务器磁盘分区常见的三种
原文来自:https://www.sohu.com/a/272133008_100217178 我怕链接会失效,故转载此篇文章,解析得很透彻,一目了然!记录. -------------------- ...
- Wireshark基础
Wireshark基础 wireshark简介: wireshark是一款用于追踪网络流量的辅助工具,帮助捕获.分析网络封包,并进行分析. 主要功能: 1.网络分析任务 查看网 ...
- jmeter之json提取器详解
Json提取器详解 *Apply to:参照正则表达式提取器 *Names of created:自定义变量名. 变量名可以填写多个,变量名之间使用分号进行分隔. 一旦变量名有多个,则下方的json ...
- RedisTemplate连接不释放、Redis断线不重连问题、Redis连接数高飙升
使用RedisTemplate操作Redis数据,但遇到网络断线后不会重新连接 毫无头绪 一顿捣鼓 最终解决 整理如下 帮助更多的人 1.起因 使用RedisTemplate 配置 开启了事务 ena ...
- 定制bash命令提示符
使用shell时经常要知道当前路径,如果将它写在提示符里很节省很多敲pwd的动作,方法是在启动文件(.bash_profile, .bashrc)里加上: export PS1="[\u@\ ...
- MySQL学习03(MySQL数据管理)
MySQL数据管理 外键 外键概念 如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键.由此可见,外键表示了两个关系之间的相关联系.以另一个关系的外键作主关键字的表被称为主 ...
- OSI网络参考模型学习
文章目录 一.计算机与网络的发展 1.1 批处理系统 1.2 分时系统 1.3 计算机之间的通信 1.4 基于分组交换技术的计算机网络 1.5 互联网时代的计算机网络 1.6 计算机网络中协议的规定 ...
- 51单片机—使用PWM对直流电机调速
文章目录 - 什么是PWM - PWM是怎么对直流电机进行调速的 - 通过定时器中断实现PWM调速 - 上代码 - 什么是PWM PWM(脉宽调制),是靠改变脉冲宽度来控制输出电压,通过改变周期来控制 ...
- Synchronized和ReentranLock的区别
1.底层实现上来说? Synchronized是JVM层面的锁,是Java关键字,通过monitor对象来完成. ReentranLock是API层面的锁底层使用AQS. 2.是否可手动释放锁? sy ...