【升职加薪秘籍】我在服务监控方面的实践(7)-业务维度的redis监控
大家好,我是蓝胖子,关于性能分析的视频和文章我也大大小小出了有一二十篇了,算是已经有了一个系列,之前的代码已经上传到github.com/HobbyBear/performance-analyze,接下来这段时间我将在之前内容的基础上,结合自己在公司生产上构建监控系统的经验,详细的展示如何对线上服务进行监控,内容涉及到的指标设计,软件配置,监控方案等等你都可以拿来直接复刻到你的项目里,这是一套非常适合中小企业的监控体系。
在上一节我们完成了对mysql的监控,这一节我们来讲讲如何对redis进行监控,同样的,我们需要让监控指标更好的反映业务情况,由于我们生产上的服务是部署到云环境的,常见的redis监控指标,云服务商已经提供了,所以没必要重读对其造轮子了。
我们新建立的指标是redis key维度的qps,这样在看到redis 总qps升高时,能一眼看出是哪些key造成的,并根据key定位到具体业务代码。
监控系列的代码已经上传到github
github.com/HobbyBear/easymonitor
按key维度建立redis监控
要想让redis的监控指标能更好反映业务情况,那就只有按key维度建立监控指标,这样能知道是哪部分业务访问redis最频繁。
想想我们通常使用redis时,建立key的规范,是不是一般都是 服务名:业务名:业务key 这种形式,其中业务key可以是uid,也可以是其他类型id,如果按完整的key建立redis的qps监控,将会导致key维度过多,影响prometheus聚合性能,并且由于key维度过于分散,不好定位到具体业务,所以我们需要在记录指标时,需要将业务key去掉进行记录。比如对key webapp:login:uid1 和 webapp:login:uid2 的操作都将记为webapp:login 对redis的操作,这样便能很好的反映业务访问redis的情况。
下面,我们来看看如何实现这段逻辑。
实现方式
我们的项目用的是go-redis这个库,它提供了一个WrapProcess函数可以在命令执行前后添加一些自定义的操作。如下所示,我在命令执行前记录了对应key的访问次数。其中matchkey则是将应用程序的key排除掉业务key获得最终的只携带业务名的redis key。
func (r *redisMonitor) AddRedisHook(client *redis.Client, redisInstanceName string) {
client.WrapProcess(func(oldProcess func(cmd redis.Cmder) error) func(cmd redis.Cmder) error {
return func(cmd redis.Cmder) error {
start := time.Now()
dealKey, match := matchKey(truncateKey(100, strings.TrimSuffix(strings.TrimLeft(fmt.Sprintf("%v", cmd.Args()), "["), "]")))
if match {
// 记录redis前缀key的访问次数
RecordClientCount(TypeRedis, cmd.Name(), dealKey, redisInstanceName)
}
err := oldProcess(cmd)
cacheWrapper(cmd, start, err, redisInstanceName)
return err
}
})
}
matchKey 的实现逻辑是看应用服务传来的redis key是不是在监控的key范围内,是的话,才会对key访问次数进行监控,所有需要监控的key都是monitorKeys 这个切片里保存的。
var (
monitorKeys = make([]string, 0, 100)
)
func matchKey(key string) (string, bool) {
var (
matchKey string
)
for _, k := range monitorKeys {
if strings.Contains(key, k) {
matchKey = k
break
}
}
if len(matchKey) == 0 {
return "", false
}
return getCmdFromKey(key) + " " + matchKey, true
}
应用服务会将它需要监控的key写入到monitorKeys 这个切片里,写入时只写业务前缀,像下面这样。
infra.RedisMonitor.AddMonitorKey("webapp:login")
方式弊端
不过上面的方式弊端很明显,那就是需要业务方较大的改动,基本上每次定义redis key时,都需要手动添加一下到monitor keys里,侵入性比较大,不过我目前还是没有想好特别好的方法让redis比较透明的按业务范围监控key的办法,如果你有任何新的点子,欢迎留言,我们一起探讨探讨。
【升职加薪秘籍】我在服务监控方面的实践(7)-业务维度的redis监控的更多相关文章
- DB监控-redis监控
公司的redis业务很多,redis监控自然也是DB监控的一大模块,包括采集.展示.监控告警.本文主要介绍redis监控的主要指标和采集方法. 一.Redis监控系统逻辑 1.DBA通过前台页面添加r ...
- 工作不到一年,做出了100k系统,老板给我升职加薪
看了下自己上一次发技术文还是在6月15日,算了算也是两个来月了.别怕,短暂的离开,是为了更好的相遇. 来到新公司以后啊,发现公司的搜索业务是真的太多了,大大小小有几百个搜索业务.来了之后得先梳理.熟悉 ...
- 不懂DevOps!他在升职加薪的那天下午,提出了离职
不久前我们一个已毕业的学员向班主任老师分享了前几天他遇到的一件事: 一个许久未联系他的朋友突然打电话给他,寒暄了几句后突然说,想来北京找工作,问能不能帮忙给介绍一些工作. 在接下来的通话中,我们学员了 ...
- jmeter & 性能测试:从0到实战(实操易用、面试造火箭、升职加薪必备)
[性能基础] 性能测试概念.术语:https://www.cnblogs.com/uncleyong/p/10706519.html 性能测试流程(新):https://www.cnblogs.com ...
- 一文搞懂秒杀系统,欢迎参与开源,提交PR,提高竞争力。早日上岸,升职加薪。
前言 秒杀和高并发是面试的高频考点,也是我们做电商项目必知必会的场景.欢迎大家参与我们的开源项目,提交PR,提高竞争力.早日上岸,升职加薪. 知识点详解 秒杀系统架构图 秒杀流程图 秒杀系统设计 这篇 ...
- 改造断路器集群监控Hystrix Turbine实现自动注册消费者、实时监控多个服务
在上一篇文章中,我们搭建了Hystrix Dashoard,对指定接口进行监控.但是只能对一个接口进行监听,功能比较局限: Turbine:汇总系统内多个服务的数据并显示到 Hystrix Dashb ...
- 《一头扎进》系列之Python+Selenium框架实战篇7 - 年底升职加薪,年终奖全靠它!Merry Christmas
1. 简介 截止到上一篇文章为止,框架基本完全搭建完成.那么今天我们要做什么呢????聪明如你的小伙伴或者是童鞋一定已经猜到了,都测试完了,当然是要生成一份高端大气上档次的测试报告了.没错的,今天宏哥 ...
- 📚C#/.NET/.NET Core推荐学习书籍(升职加薪,你值得拥有)
前言: 作为一名程序员,我们无时无刻都要考虑着如何通过不断地学习来提升自己的核心竞争力.古人有云:"书中自有黄金屋,书中只有颜如玉",说明了书籍的重要性,没错工作多年来,发现身边那 ...
- TDengine在浙商银行微服务监控中的实践
作者:楼永红 王轩宇|浙商银行 浙商银行股份有限公司(简称"浙商银行")是 12 家全国性股份制商业银行之一,总部设在浙江杭州,全国第13家"A+H"上市 ...
- 微服务探索之路04篇k8s增加子节点,metrics资源监控,ingress-nginx域名配置及https配置
1 k8s增加子节点 1.1 子节点服务器安装docker,使用脚本自动安装 curl -fsSL https://get.docker.com | bash -s docker --mirror A ...
随机推荐
- 40% building 31/38 modules 7 active ...es\core-js\modules\es6.object.assign.jsBrowserslist: caniuse-lite is outdated.
一早运行项目发现不正常 虽然能运行,但是怎么看都不顺眼啊,那就照着提示先: npm update 一连串下来啥也看不懂是不是 我就直接npm install看看重新下载一下依赖结果直接给我来了个 :c ...
- svn is already locked 最终解决方案
今日执行项目更新时,手贱点击了cancel 中断了操作,最后导致项目被锁,杯具了. 首先想到了Clean up 直接提示 看来不行呀 -// 省略 n 多种尝试 最后使用删除db 中的 lock 表来 ...
- flutter填坑之旅(环境搭建篇--mac系统)
上次配置过Mac到flutter环境,但是由于最近系统更新了,什么都没了又得从新配置,发现自己竟然好多都忘记了,看来还是得把它记下来才行 在Mac上安装并运行Flutter 最低要求: 操作系统:ma ...
- Python基础 - 比较运算符
以下假设变量a为10,变量b为20: 运算符 描述 实例 == 等于 - 比较对象是否相等 (a == b) 返回 False. != 不等于 - 比较两个对象是否不相等 (a != b) 返回 tr ...
- 从 pheatmap 无缝迁移至 ComplexHeatmap
pheatmap 是一个非常受欢迎的绘制热图的 R 包.ComplexHeatmap 包即是受之启发而来.你可以发现Heatmap()函数中很多参数都与pheatmap()相同.在 pheatmap ...
- WPF中控件转命令
WPF不是所有控件都有Command属性,如果窗体需要在ViewModel 使用System.Windows.Interactivity事件 在nuget浏览搜索 下载System.Windows.I ...
- 数位DP?记忆化罢了!
我看了半天的数位 DP,DP 没学会,人倒是麻了. 解决什么 一般用于求解给你一个区间 \([l,r]\),问你其中满足条件的数有多少个. 这种题目还是蛮常见的,我们一般情况下暴力只能拿一少部分分,之 ...
- 前端Vue非常简单实用商品分类展示组件 侧边商品分类组件
前端vue非常简单实用商品分类展示组件 侧边商品分类组件 , 下载完整代码请访问uni-app插件市场址:https://ext.dcloud.net.cn/plugin?id=13084 效果图如下 ...
- Pinot2的无人机任务和数据处理实践
目录 1. 引言 2. 技术原理及概念 2.1 基本概念解释 2.2 技术原理介绍 2.3 相关技术比较 3. 实现步骤与流程 4. 应用示例与代码实现讲解 4.1 应用场景介绍 4.2 应用实例分析 ...
- 用 Golang 从0到1实现一个高性能的 Worker Pool(一) - 每天5分钟玩转 GPT 编程系列(3)
目录 1. 概述 2. 设计 2.1 让 GPT-4 给出功能点 2.2 自己总结需求,再给 GPT 派活 3. 实现 3.1 你先随意发挥 3.2 你得让 Worker 跑起来呀 3.3 你说说 P ...