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

    vi/vim文本编辑器 Vim是从 vi 发展出来的一个文本编辑器,vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性 vi/vim 共分为三种模式:命令模式.输入模式.底线命令模式(末 ...

  2. MVC配置原理-源码

    目录 举例 修改SpringBoot的默认配置 全面接管SpringMVC 参考链接 在进行项目编写前,我们还需要知道一个东西,就是SpringBoot对我们的SpringMVC还做了哪些配置,包括如 ...

  3. SpringBoot开发十七-事务管理

    需求介绍 熟悉事务管理. 什么是事务 事务是由N步数据库操作序列组成的逻辑执行单元,这系列操作要么全执行,要么全放弃执行. 事务的特性(ACID) 原子性(Atomicity):事务是应用中不可再分的 ...

  4. [08 Go语言基础-for循环]

    [08 Go语言基础-for循环] 循环 循环语句是用来重复执行某一段代码. for 是 Go 语言唯一的循环语句.Go 语言中并没有其他语言比如 C 语言中的 while 和 do while 循环 ...

  5. 北航OO第二单元——电梯调度

    三次作业要求简介 特点:目的选层电梯 在电梯的每层入口,都有一个输入装置,让每个乘客输入自己的目的楼层.电梯基于这样的一个目的地选择系统进行调度,将乘客运送到指定的目标楼层. 第一次: 在任意时刻输入 ...

  6. Linux sudo权限提升漏洞CVE-2021-3156 POC及复现过程

    漏洞简介 2021年1月26日,国外研究团队披露了sudo 中存在的堆溢出漏洞(CVE-2021-3156).利用该漏洞,非特权账户可以使用默认的sudo配置主机上获取root权限,该漏洞影响1.8. ...

  7. Docker的使用笔记

    介绍Docker Docker为了解决依赖的兼容问题的,采用了两个手段: 将应用的Libs(函数库).Deps(依赖).配置与应用一起打包 将每个应用放到一个隔离容器去运行,避免互相干扰 Docker ...

  8. Java实现WebSocket服务

    一.使用Tomcat提供的WebSocket库  Java可以使用Tomcat提供的WebSocket库接口实现WebSocket服务,代码编写也非常的简单.现在的H5联网游戏基本上都是使用WebSo ...

  9. docker 安装部署 redis(配置文件启动)

    获取 redis 镜像 docker pull redis:4.0.12 docker images 创建容器 创建宿主机 redis 容器的数据和配置文件目录 # 创建宿主机 redis 容器的数据 ...

  10. 【springboot】给你一份Spring Boot知识清单

    目录: 一.抛砖引玉:探索Spring IoC容器 1.1.Spring IoC容器 1.2.Spring容器扩展机制 二.夯实基础:JavaConfig与常见Annotation 2.1.JavaC ...