首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >巧用腾讯云CLS实现业务监控

巧用腾讯云CLS实现业务监控

原创
作者头像
快乐的小兄弟
发布于 2022-11-14 14:56:51
发布于 2022-11-14 14:56:51
1.4K0
举报
文章被收录于专栏:云产品实践云产品实践

1. 前言

1.1 为什么需要业务监控?

所有的软件或者系统,都无法保证100%的稳定运行,由于各种原因都会导致异常故障,如果发现太晚延误了解决问题,则会扩大线上影响。从故障出现到问题修复之间的每一分钟都是值得优化的,监控的目的就是为了快速发现问题,协助开发或者产品分析业务状态。

项目中一般常用的监控有基础设施监控、用户行为监控、前端监控、后台服务监控,这些监控的衡量指标缺乏业务语意,无法直观地体现出来,比如当日下单平均响应时长、成功率,比如有哪些文章拉取失败了,失败的文章请求量有多少等。

1.2 为什么需要开发自己来做监控?

  • 最早发现问题:开发是需求实现的第一线角色,编码实现逻辑由开发同学掌控,只有开发能最早地发现可能存在的问题,由开发设计监控,能够最快地发现问题。
  • 成本低,效率高: 如果由数据分析同学来实现,则需要数据同学也对需求实现充分理解,然后与开发约定上报规则,开发加上埋点,数据同学通过数据流转,聚合数据后才能进行分析展示。沟通和研发成本都是比较高的。而如果由研发自己完成监控,则可以省去沟通的成本和数据流转的成本。

1.3 业务监控关注什么?

  1. 适用的场景有哪些?
    • 一些业务状态分析:下单、搜索等关键路径的行为访问分析等。
    • 错误拆解分析: 对一些接口的错误进行统计分析。
    • 接口成功率监控等手段不能监控的地方。
  2. 如何做?
    • 不要影响业务流程,旁路完成。
    • 每一个监控是带有目的的,实现前需要想好以下两个问题:想要发现什么问题?需要哪些指标?

2. 案例展示

2.1 主题

文章拉取失败统计与分析

2.2 背景,为什么做?

项目中的文章服务由第三方合作伙伴提供,业务中保存了许多的文章ID,文章的内容需要调用合作伙伴的接口来获得,现在需要切换为带鉴权的新接口拉取,没有加入白名单的文章ID会拉取失败。

由于历史原因,有大量场景配置或者使用到了文章,现在把最重要的场景的文章提供给合作伙伴进行了加白。

那么,这里我们可能会遇到这些问题:

    1. 没有加白的文章里面是否有大量请求的(说明比较重要的)文章? 这些文章应该加白。
    1. 请求失败的文章里面,是否包含了已下架的文章? 这些文章应该删除配置。

2.2 需要统计哪些指标?

  • 文章ID: 以文章id为数据分析维度。
  • 失败次数:失败次数越多,说明越多用户请求,是有价值的文章。
  • 文章是否存在:文章已经下架,则应该取消配置。

2.3 上报与报表

  • 在文章列表拉取接口,检查请求参数与返回内容,将没有拉取到的文章打印到日志。
  • 文章是否存在,接口不带有这些信息,则由报表分析后人工判断top文章。
代码语言:txt
AI代码解释
复制
// LogContentFail 文章拉取失败上报
func LogContentFail(ctx context.Context, docId string, title string, err error) {
   info := Monitor{Str1: docId, Str2: title, Num1: 1}
   if err != nil {
      info.Str3 = err.Error()
   }

   Log(ctx, KeyContentFail, &info)
}

2.4 发现的问题

  1. 发现了大量已下架文章
    文章已下架.png
    文章已下架.png
  2. 发现数篇需要授权的文章没有被授权
    授权遗漏.png
    授权遗漏.png

3. 具体实现

3.1 日志指定关键词

在日志库中新增了一个接口,支持指定关键词,在日志中打印note_keyword字段。

代码语言:txt
AI代码解释
复制
// Log 答应关键词为noteKey的日志
func Log(ctx context.Context, noteKey string, msg *Monitor) {
   if len(noteKey) == 0 || msg == nil || len(msg.Str1) == 0 {
      log.Fatalf(ctx, "monitor log fail, noteKey or msg is empty.")
      return
   }
   jsonStr, err := json.Marshal(msg)
   if err != nil {
      log.Fatalf(ctx, "monitor log fail, msg marshal fail, err: %s", err.Error())
      return
   }
   log.InfoK(ctx, noteKey, string(jsonStr))
}

// InfoK logs to INFO log with custom keyword.
func (l *logger) InfoK(ctx context.Context, keyword string, args ...interface{}) {
   l.logK(ctx, LevelInfo, keyword, "", args...)
}

3.2 固定一套日志结构

固定几个字符串类型字段,和几个数字类型字段,这样的好处是所有的业务监控可以复用这样的结构,方便CLS索引字段的设置。

代码语言:txt
AI代码解释
复制
// Monitor 监控日志
type Monitor struct {
   Str1 string `json:"str1"`
   Str2 string `json:"str2"`
   Str3 string `json:"str3"`
   Str4 string `json:"str4"`
   Str5 string `json:"str5"`
   Str6 string `json:"str6"`
   Num1 int    `json:"num1"`
   Num2 int    `json:"num2"`
   Num3 int    `json:"num3"`
}

3.3 CLS日志加工分流

通过数据加工,把监控类型的日志转存到指定的日志集,将监控类日志独立存储方便单独设置存储规则,并且检索会更快。将msg中字段带上msg_展开到外层,带上前缀可以有效避免msg中的字段与外层其他字段重名,同时方便检索分析。

  1. 将带有非常规日志的关键词丢弃
  2. 将msg字段按json格式展开到第一层
代码语言:txt
AI代码解释
复制
log_drop(regex_match(v("note_keyword"),regex="deug|info|error|fatal|Info|Error|Fatal|Debug"))
ext_json("msg", prefix="msg_")

3.4 打印业务日志

代码语言:txt
AI代码解释
复制
// LogContentFail 文章拉取失败上报
func LogContentFail(ctx context.Context, docId string, title string, err error) {
   info := Monitor{Str1: docId, Str2: title, Num1: 1}
   if err != nil {
      info.Str3 = err.Error()
   }

   Log(ctx, KeyContentFail, &info)
}

3.5 报表分析

eg: 文章拉取失败统计

  1. 新建仪表盘
    新建仪表盘.png
    新建仪表盘.png
  2. 添加图表
    新建图表.png
    新建图表.png
  3. 编辑规则语句并应用即可
    编辑图表.png
    编辑图表.png
代码语言:txt
AI代码解释
复制
note_keyword:"Monitor_Content_Fail" | select msg_str1 as docid, sum(msg_num1) as fail_count group by docid order by fail_count desc

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
最佳实践|用腾讯云AI图像能力实现AI作画
最近看到一篇有趣的文章,一副名为《太空歌剧院》(如下图)的艺术品在某美术比赛上,获得了第一名的成绩, 有意思的是这件作品是通过AI来实现的画作, 顿时觉得非常神奇。 结合近期科技媒体频频报道的AI作画爆火现象,深入了解了下,发现市面上有一些AI作画的小程序, 是通过输入一段文字给AI, 然后输出一副和文字意思相近的图片。 这个感觉非常有意思,某种程度上会给绘画行业带来新的发展契机。
腾讯云AI
2022/11/11
4.5K0
最佳实践|用腾讯云AI图像能力实现AI作画
go-kit 微服务 整合jwt实现授权认证
Json web token (JWT) 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。 JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
Johns
2021/03/22
1.3K0
go-kit 微服务 整合jwt实现授权认证
腾讯 tRPC-Go 教学——(5)filter、context 和日志组件
本文咱们来介绍一下在 tRPC 中的 filter 机制、context 用法,以及在相关机制上可以实现的 tracing log 能力。
amc
2024/03/04
1.4K0
腾讯 tRPC-Go 教学——(5)filter、context 和日志组件
从1开始,扩展Go语言后端业务系统的RPC功能
这次我们接上一篇文章《从0开始,用Go语言搭建一个简单的后端业务系统》,利用Google开源的RPC框架—gRPC来进行对接口的RPC功能横向扩展,也就是用RPC协议将restful的HTTP协议重写一遍。
闫同学
2023/10/12
2930
从0开始,用Go语言搭建一个简单的后端业务系统
Hello 小伙伴们,今天给大家带来了一份Go语言搭建后端业务系统的教程,restful风格哦,既然是简单的业务系统,那么必要的功能就少不了增删改查,也就是传说中的CRUD,当然相比Spring Boot而言,Go语言写后端业务系统不是那么的流行,但是对比一下我们也很容易能发现,Go语言搭建的Web后端系统的优势:
闫同学
2023/10/11
6140
Go每日一库之108:elastic
上一步,我们创建了client,接下来我们就要创建对应的索引以及mapping。根据开始介绍的功能,我们来设计我们的mapping结构:
luckpunk
2023/09/30
5820
自动监控文件并上传S3对象存储服务器 | Golang
本地平台:Windows 10 专业版 21H2 (19044.1826)、开发语言:go1.18.3 windows/amd64
ZGGSONG
2022/09/23
1.4K0
使用go-zero微服务框架实现云监控后台(二.远程指令下发)
这里记录下如何实现后台命令下发到终端设备上,触发终端上送日志文件,实现运维人员远程可以足不出户,采集设备日志的功能。
杨永贞
2022/01/07
8050
使用go-zero微服务框架实现云监控后台(二.远程指令下发)
go-kit 微服务 整合Promtheus解决监控告警问题
Prometheus基于中央化的规则计算、统一分析和告警的新模型, 完美地解决了传统监控模型的痛点。所以说其对传统监控系统的测试和告警模型进行了彻底的颠覆。
Johns
2021/04/08
1.4K0
go-kit 微服务 整合Promtheus解决监控告警问题
微服务架构下的熔断框架:hystrix-go
伴随着微服务架构被宣传得如火如茶,一些概念也被推到了我们的面前。一提到微服务,就离不开这几个字:高内聚低耦合;微服务的架构设计最终目的也就是实现这几个字。在微服务架构中,微服务就是完成一个单一的业务功能,每个微服务可以独立演进,一个应用可能会有多个微服务组成,微服务之间的数据交可以通过远程调用来完成,这样在一个微服务架构下就会形成这样的依赖关系:
Golang梦工厂
2022/07/11
5300
微服务架构下的熔断框架:hystrix-go
Golang 语言 Web 框架 beego v2 之控制器方法和输入输出数据
创建 beego 的控制器,首先要匿名组合 beego.Controller,beego.Controller实现了接口 beego.ControllerInterface,beego.ControllerInterface 定义了许多函数,这样我们创建的控制器就有了所有 beego.Controller 的方法,我们可以重写这些方法实现自己的业务逻辑。
frank.
2020/12/08
1.1K0
从4开始,在后端系统中增加用户注册和登录功能
本次我们接着上四篇文章进行讲解《从0开始,用Go语言搭建一个简单的后端业务系统》、《从1开始,扩展Go语言后端业务系统的RPC功能》、《从2开始,在Go语言后端业务系统中引入缓存》以及《从3开始,在业务系统中增加分页功能》,这次是系统中比较核心的功能——用户登录&注册,这个功能其实本应该是最先实现的,但是由于不同因素的影响,放到了本次进行实现,不过也无伤大雅,后期我们都会不断的进行查漏补缺和优化来使我们的项目总体上更加优雅,话不多说,我们开始正文:
闫同学
2023/10/12
3820
【升职加薪秘籍】我在服务监控方面的实践(6)-业务维度的mysql监控
在上一节我们是讲解了如何对应用服务进行监控,这一节我将会介绍如何对mysql进行监控,在传统监控mysql(对mysql整体服务质量的监控)的情况下,建立对表级别的监控,以及长事务,复杂sql的监控,并能定位到具体代码。
蓝胖子的编程梦
2023/12/04
4140
【升职加薪秘籍】我在服务监控方面的实践(6)-业务维度的mysql监控
go实现redis集群和单机快速切换
在实际的项目开发过程中,我们常常会遇到这样的情况:同一个项目部署在不同的环境下,所需要的配置会存在明显差异。当涉及到服务器集群搭建时,从众多客户的需求反馈来看,绝大多数客户都会明确要求采用 redis 集群配置。这主要是因为 redis 集群在高并发场景下,能够通过分布式的架构,有效提升数据读取和写入的效率,保障系统的高性能和高可用性,满足大规模业务数据处理的需求。然而,当项目仅仅部署在单个服务器上时,情况则大不相同,此时客户更多会要求使用单机配置。单机配置相对简单,成本较低,对于业务量较小、并发程度不高的场景而言,完全能够满足需求。
衝鋒壹号
2025/02/09
1180
go实现redis集群和单机快速切换
分布式日志存储架构代码实践
上一篇,我们针对分布式日志存储方案设计做了一个理论上的分析与总结,文章地址[1]。本文我们将结合其中的一种方案进行实战代码的演示。另外一种方案,将在下一篇文章进行分享,此篇文章分享的是MongoDB架构模式。在知乎上发布该文章时,有人提到使用opentelemtry+tsdb[2],感兴趣的可以去了解一下。
兔云小新LM
2022/06/08
6170
分布式日志存储架构代码实践
go-ElasticSearch实战篇(二)
下载好了依赖库,下面我们开始编写代码,首先我们需要创建一个client,用于操作ES,先看代码,然后在进行讲解:
Golang梦工厂
2022/07/07
7420
砥砺前行 | Kratos 框架 v2 版本架构演进之路
Kratos 是一套轻量级 Go 微服务框架,包含大量微服务相关功能及工具。名字来源于游戏《战神》,该游戏以希腊神话为背景,讲述了奎托斯(Kratos)由凡人成为战神并展开弑神屠杀的冒险历程。
从大数据到人工智能
2022/06/15
1.7K0
砥砺前行 | Kratos 框架 v2 版本架构演进之路
Golang框架Gin入门实战--(5)Get、Post以及动态路由转值、Get Post数据解析到结构体、Post Xml数据解析到结构体
此篇文章内容基于上篇文章继续修改Golang框架Gin入门实战–(4)HTML模板渲染以及模板语法 自定义模板函数 静态文件服务(下) main.go
互联网-小阿宇
2022/11/21
1.3K0
go-zero 中使用 gorm gen
由于go-zero自带的sqlx太难用, 实在无法忍受写这么多的魔法字符串, 所以这边在go-zero中引入gorm
seth-shi
2023/12/18
1.1K0
Go语言学习 - RPC篇:gRPC拦截器剖析
我们在前几讲提到过,优秀的RPC框架都提供了middleware的能力,可以减少很多重复代码的编写。在gRPC-Gateway的方案里,包括了两块中间件的能力:
junedayday
2022/12/02
1.1K0
Go语言学习 - RPC篇:gRPC拦截器剖析
推荐阅读
相关推荐
最佳实践|用腾讯云AI图像能力实现AI作画
更多 >
LV.1
腾讯应用开发工程师
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档