使用 shell 脚本自动获取发版指标数据

2024-08-31 13:58

本文主要是介绍使用 shell 脚本自动获取发版指标数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

🚀 优质资源分享 🚀

学习路线指引(点击解锁)知识定位人群定位
🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
💛Python量化交易实战💛入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

问题背景

大一点的公司都会建立一套规章流程来避免低级错误,例如合入代码前必需经过同行评审;上线前必需提测且通过 QA 验证;全量前必需经过 1%、5%、10%、20%、50% 的灰度过程。尤其是最后一步,需要严密的监控发版指标来保证新版本的质量,如果与主力版本的指标相比有异常变动,就需要及时停止放量并分析原因。

一个版本的重点观察指标,除崩溃率外有小 20 项,分布在系统的 10 多个页面,且每个指标均需要指定多达 6-10 个过滤条件,最常用的包括版本号、端类型 (PC/ Mac/Android/iOS/…)、用户类型 (user/vip/svip),此外还有一些复杂的下拉列表选项,每次都记不住,需要参考文档才能确定选对了 😓;另外像版本号这种选项,系统需要很长时间才能刷出来全部版本列表,有时等了很长时间也出不来,还得手动刷一下才能好;最后,有一些指标系统里没有直接给出,需要综合多个指标数据进行计算,例如版本流量占比是由版本流量除以总流量得出的,类似的还有播放流量占比;另外还有一些通用的计算,例如速度的单位是 B/s,实际上使用 MB/s 更贴切,人工记录数据时,一般直接除以 1000 来进行简单估算,与除以 1024 相比还是有比较大误判的。走一遍完整流程下来,快了也得半小时,慢了一上午就过去了。

解决方案

凡是重复性的劳动都有优化空间,凡是收集数据的工作都能用脚本完成——本着这两个原则,尝试做一个自动获取发版指标数据的 shell 脚本。之前有使用 curl 访问 restful api 的经验 (用 shell 脚本做 restful api 接口监控),这次访问 web 服务器原理也是一样的,通过浏览器的页面调试功能,可以查看到一次请求的详细信息:

主要使用的是 http post 数据,数据基于 json 格式返回:

不同请求返回的 json 格式不同,不过都可以使用 jq 命令处理。

拉取数据

用 curl 尝试一下:

curl -s "http://iyuntu.xxxxx.com/xxxxxx/api/xxxxxxxxxxxxx/" -H "Accept: */*" -H "Connection: keep-alive" 
-H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" -H "Accept-Encoding: gzip, deflate"  
-d "start=1642137792&end=1642310592&method=p2pflow&version=3.0.0.112&vipLevel=all&clusterItem=cluster\_hour&clientType=pc"

提交的表单数据与 web 请求完全一致,然而得到了服务器错误:

{"error\_code":1006,"message":"userinfo is wrong.","data":[]}

提示用户信息错误,难道是因为没有携带登录信息?再看一下浏览器中请求的 cookie 信息:

确实不少,将整个 cookie 携带到 curl 的请求中:

curl -s "http://iyuntu.baidu.com/clientive" -H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" -H "Accept-Encoding: gzip, deflate"  
-d "start=1642137792&end=1642310592&method=p2pflow&version=3.0.0.112&vipLevel=all&clusterItem=cluster\_hour&clientType=pc" 
--cookie 'XXXXXXX=6955BFF6EBA75EA12FB35312F4B67309:FG=1; UUAP\_TRACE\_TOKEN=00253a0352ac05ddf2abb3867e1383dc; Hm\_lvt\_8d2a248ae863804cbd8d4f34ef769db3=1641283185,1641283813,1641780693,1642304682; jsdk-uuid=0c8f1b25-11a8-4b29-9bde-8203c9d92ba6; RT="z=1&dm=baidu.com&si=h7sa38uz0c7&ss=kycewdz5&sl=0&tt=0&bcn=https%3A%2F%2Ffclog.xxxxx.com%2Flog%2Fweirwood%3Ftype%3Dperf&ld=itd&cl=hr8&ul=kzlat&hd=kzlf2"; XXX\_X\_XXXXX=BppxvwS4efrHrfU1N5YBV52pvnablZcVWysHnik+JuWM8I/Ujn+rS8e2vD2ig3MkYKVYXq326XyE8GeQThgT7g==; XXXXX=GkyaW9RbklUY0VLRWpac3hMUlRsNjh5M25PTlNiZWxGRVdvT1pnWDE3ZXVuUHRoRVFBQUFBJCQAAAAAAAAAAAEAAABjkC9mY2F2ZXBhcGVybWFuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK4P1GGuD9RhS; UUAP\_P\_TOKEN=PT-685223097977524224-iAPxtFmvd3-uuap; jsdk-user=d6zmte6yU7ahGWlxTQZghw==; PHPSESSID=ST-689506677214060545-7KJVo-uuap; Hm\_lpvt\_8d2a248ae863804cbd8d4f34ef769db3=1642320803'

这次不报错了,但是也没有请求到任何结果,查看 curl 返回值:

$ echo $?
23

百度了一下,curl 23 错误是写失败,难道需要重定向到文件?为上面的命令加入:

--output temp.dat

将结果保存在 temp.dat 文件中,这次 curl 正常了,但查看 temp.dat 却是一团乱麻:

$ head -n 1 temp.dat
?ٮ?E?E?7?!?bA,9p?6???YuN׮?n ?c?'??n?5????[?????c/?>??\_?????????????̥?z\_?\_??m>~?R?ʥ??gI?=\_????G\_????Xş??????9k?5????

难道是被压缩了?使用 gunzip 解压试试:

$ cat temp.dat  | gunzip
{"p2p\u6d41\u91cf":[[1642140000000,28249601382.447],[1642143600000,29701279461.349],[1642147200000,30004732054.571],
[1642150800000,28226621579.753],[1642154400000,27565004131.18],[1642158000000,30050204384.371],[1642161600000,34357590257.653],
[1642165200000,37445146977.384],[1642168800000,37507405282.629],……

确实是,解压后得到的就是 json 内容了,内容解析暂时放一下,先聚焦一下 cookie 。

使用浏览器 cookie 可以得到想要的结果,但会对浏览器形成依赖——每次跑脚本前需要从浏览器抓一份 cookie 保存在本地。经过一番探究,发现只要保留 cookie 中的这一条就能访问:

PHPSESSID=ST-689506677214060545-7KJVo-uuap;

应该是 SSO 登录后的访问凭证。从浏览器复制一条 cookie 虽然有一点麻烦,但也不是不能接受,相比手工记录发版指标数据,还是友好不少了嘛~

下面以流量指标为例,串起来上面的一系列命令:


# @param: starttime
# @param: endtime
# @param: version
# @param: clienttype
# @param: cookie
# @param: select-time [option]
function fetch\_flow()
{local starttime="$1"local endtime="$2"local version="$3"local clienttype="$4"local cookie="$5"local selecttime=""if [ $# -gt 5 ]; then selecttime="$6"filocal data="start=${starttime}&end=${endtime}&method=p2pflow&version=${version}&vipLevel=all&clusterItem=cluster\_hour&clientType=${clienttype}"curl -s "http://${HOST}/client/api/xxxxxxxxxxxx/" -H "Accept: */*" -H "Connection: keep-alive" -H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" -H "Accept-Encoding: gzip, deflate" -H "Origin: ${HOST}" -H "Referer: http://${HOST}/stability/main?typeName2=total\_flow&typeName2=cluster\_hour&typeName2=${clienttype}&datepicker0=${starttime}&datepicker1=${endtime}" -H "X-Requested-With: XMLHttpRequest" --cookie "$cookie"  -d "$data" --output temp.gzipif [ $? -eq 

这篇关于使用 shell 脚本自动获取发版指标数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1124099

相关文章

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景