【升职加薪秘籍】我在服务监控方面的实践(7)-业务维度的redis监控

news/2025/1/16 4:48:07/

大家好,我是蓝胖子,关于性能分析的视频和文章我也大大小小出了有一二十篇了,算是已经有了一个系列,之前的代码已经上传到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的办法,如果你有任何新的点子,欢迎留言,我们一起探讨探讨。


http://www.ppmy.cn/news/1054957.html

相关文章

如何将应用程序发布到 App Store

憧憬blog主页 在强者的眼中,没有最好,只有更好。我们是移动开发领域的优质创作者,同时也是阿里云专家博主。 ✨ 关注我们的主页,探索iOS开发的无限可能! 🔥我们与您分享最新的技术洞察和实战经验&#xff0…

宠物小程序开发

在当今社会,宠物已成为许多人生活中不可或缺的一部分。宠物市场的持续增长为创业者提供了巨大的商机。然而,作为一个创业者,要在竞争激烈的宠物市场中脱颖而出并不容易。因此,开发一个专属于自己的宠物小程序成为了解决这一难题的…

探析低代码开发平台的核心能力

低代码开发平台正在成为当今软件开发领域的热门话题。它以其卓越的灵活性和高效性,被越来越多的企业所选择。作为一种创新性的解决方案,低代码开发平台大大降低了开发难度,极大地缩短了开发周期,并且可兼容多平台应用程序的快速迭…

(一)Docker简介(一篇足以)

一、简介 一个项目环境配置相当麻烦,如果换一台机器跑起来,所有配置就要重来一次,费力费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环…

项目计划怎么写? 6 个步骤助你万无一失

项目计划是项目管理的关键步骤,如果跳过这一步,项目还未启动就已岌岌可危。 什么是项目计划? 项目计划是实现特定目标或成果的详细路线图。它是一份全面的文件,回答了 “谁”、“什么”、“为什么”、"如何 "和 "…

攻防世界-base÷4

原题 解题思路 base644,莫不是base16,base16解码网站: 千千秀字

如何使用图形数据库构建实时推荐引擎

推荐:使用 NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景 “这是给你的”,“为你推荐的”或“你可能也喜欢”,是大多数数字业务中必不可少的短语,特别是在电子商务或流媒体平台中。 尽管它们看起来像一个简单的概念&#xf…

RHCE——五、Web服务器及内网穿透(实验篇)

Web服务器篇 一、快速搭建网站二、更改网页启动目录三、内网穿透1、准备工作2、搭建网站3、测试:浏览器中输入ip进行测试4、使用花生壳进行内网穿透4.1 注册并登陆4.2 点击添加映射4.3 Linux安装花生壳客户端 5、注意 四、搭建具有身份验证功能网站1、准备工作2、编…