所有的软件或者系统,都无法保证100%的稳定运行,由于各种原因都会导致异常故障,如果发现太晚延误了解决问题,则会扩大线上影响。从故障出现到问题修复之间的每一分钟都是值得优化的,监控的目的就是为了快速发现问题,协助开发或者产品分析业务状态。
项目中一般常用的监控有基础设施监控、用户行为监控、前端监控、后台服务监控,这些监控的衡量指标缺乏业务语意,无法直观地体现出来,比如当日下单平均响应时长、成功率,比如有哪些文章拉取失败了,失败的文章请求量有多少等。
文章拉取失败统计与分析
项目中的文章服务由第三方合作伙伴提供,业务中保存了许多的文章ID,文章的内容需要调用合作伙伴的接口来获得,现在需要切换为带鉴权的新接口拉取,没有加入白名单的文章ID会拉取失败。
由于历史原因,有大量场景配置或者使用到了文章,现在把最重要的场景的文章提供给合作伙伴进行了加白。
那么,这里我们可能会遇到这些问题:
// 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)
}
在日志库中新增了一个接口,支持指定关键词,在日志中打印note_keyword字段。
// 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...)
}
固定几个字符串类型字段,和几个数字类型字段,这样的好处是所有的业务监控可以复用这样的结构,方便CLS索引字段的设置。
// 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"`
}
通过数据加工,把监控类型的日志转存到指定的日志集,将监控类日志独立存储方便单独设置存储规则,并且检索会更快。将msg中字段带上msg_
展开到外层,带上前缀可以有效避免msg中的字段与外层其他字段重名,同时方便检索分析。
log_drop(regex_match(v("note_keyword"),regex="deug|info|error|fatal|Info|Error|Fatal|Debug"))
ext_json("msg", prefix="msg_")
// 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)
}
eg: 文章拉取失败统计
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 删除。