游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

深入理解Prometheus在告警时附带指标趋势图

  Prometheus是一个开源系统监控和告警工具包,于2016年加入云原生计算基金会,成为继Kubernetes之后的第二个托管项目。
  在以前的文章《深入理解prometheus:如何为表达式抽取和注入Labels》中介绍了如何修改PromQL的labels,但一直没有介绍有什么用途,本篇文章将结合告警信息来一起了解下如何实现在告警时附带指标趋势图,以便能更好的定位告警原因和发生时间。在告警时附带指标趋势图的难点
  在Prometheus中提供了三种查看指标出图的方式,分别是EXPRESSIONBROWSERGrafanaConsoletemplates
  我们通常会更推荐使用Grafana,拥有EXPRESSIONBROWSER的所有能力,同时还支持令人映像深刻的出图效果和友好的使用体验。
  node内存使用指标趋势图
  Prometheus支持基于PromQL的告警规则,通常如下所示groups:name:examplerules:alert:NodeHighMemoryUsedexpr:nodememoryusedpercent{jobmyjob}0。8for:10mlabels:severity:warnannotations:summary:nodehighmemoryused
  其中最重要的就是expr字段,它的值是一个表达式PromQL表达式,如果表达式的结果为true,也即能过滤到数据,那么就会对每个时序metric生成一条告警,默认的告警信息中通常会包含labels和annotations内地信息,这些信息通常是预置的文本和文本模版(annotations内支持将labels作为变量的模版,最后告警时会渲染为实际的值,最后也是文本)
  基于告警文本的消息只能获得告警当时的状态信息,告警只是第一步,如果要定位告警原因,通常需要告警发生前的历史累积状态信息,那就需要针对每个具体告警,生成对应的专有指标趋势图。
  默认的告警表达式,如上图所示,会展示所有符合条件的数据,但有两个问题:每个告警其实只需要自己的趋势图,不需要展示别的对象的趋势图希望展示完整的趋势图,更便于发现趋势问题
  如下图所示,只针对某个告警对象,且既有告警趋势,也有基线,这样的图更加方便定位。
  通常我们的规则都是形式如下:nodecpuusage0rate(nodecputotal{noden1}〔1m〕)rate(nodecputotal{noden2}〔1m〕)containercpulimitusageavgovertime(containercpulimitusage〔1d〕offset1d)1。01containercpulimitusage0andcontainermemorylimitusage0containercpulimitusage0。5andcontainermemorylimitusage0。5orcontainercpulimitusage0。8sum(rate(apiserverrequestdurationsecondssum{subresource!log,verb!LISTWATCHWATCHLISTDELETECOLLECTIONPROXYCONNECT}〔5m〕))without(instance,pod)sum(rate(apiserverrequestdurationsecondscount{subresource!log,verb!LISTWATCHWATCHLISTDELETECOLLECTIONPROXYCONNECT}〔5m〕))without(instance,pod)
  这些规则的基本规律就是基于metricname和labels筛选数据,并做一些函数处理,最后与某个阈值行比较,在PromQL中,比较操作其实会被转换为过滤操作,如果能过滤出符合的数据,就触发告警。
  如果要查明白为啥告警,首先需要对每个表达式进行拆分,然后分别查询每个拆分后的表达式,看看到底是哪个数据有问题,同时也需要看看每个表达式在数据异常前后的一些情况,也就需要比告警的时间范围大一些。
  另外一点是,通常告警规则是适用于一类对象的,比如都是node的cpu告警,或者内存告警,但实际告警时是会给出每个具体的node信息,其他告警也类似,如果要查询告警数据,也只需要查发生告警的对象的指标数据,其他对象不需要查。
  为了实现上述的能力,通常需要解决两个问题:将Prometheusalertrules拆分成多个查询表达式在Prometheusalertrules中增加本次告警专属的用于区分告警对象的labels解决思路
  上述两个功能,在prometheus中并没有提供直接可用的能力,但可以根据代码分析出可以使用和借鉴的能力。
  在以前的文章《深入理解prometheus:如何为表达式抽取和注入Labels》中,我们先分析了Prometheus支持的每种类型和基本的四种类型,同时也说明了PromQL是一种嵌套函数语言,最后也介绍了如何增加和抽取labels的方法,也给出了基本代码,问题2自然就解了。funcInjectSelectors(exprExpr,selectors〔〕labels。Matcher)error{Inspect(expr,func(nodeNode,〔〕Node)error{vs,ok:node。(VectorSelector)ifok{vs。LabelMatchersappend(vs。LabelMatchers,selectors。。。)}returnnil})returnnil}
  对于问题1,在上述文章的分析过程中,也发现了对应的解决办法,但当时没有意识到,直到后续debug一步一步测试中才发现规律,同时也加深了对PromQL设计的理解。
  PromQL是一门函数嵌套语言,同时也支持基本的算数和逻辑运算,既然是这样,那么我们就可以像解数学计算题一样,一步一步的解,而且组成PromQL表达式的元素的固定的,有11种类型(详情见上面引用的文章,这里不再赘述),每个表达式都可以拆解为这些Type的实例的组合。
  对于我们的告警表达式来说,绝大多数都是左右两个数据进行算数或者逻辑运算,这种都是BinaryExpr类型,也即由更下层的类型组合成的新的表达式类型。我们可以直接识别BinaryExpr类型,如果是BinaryExpr,那就进行拆分,就得到两个表达式用于绘图,如果不是,跳过即可。实战验证
  拆分测试代码:funcTestSplitQuery(ttesting。T){testExprs:〔〕string{nodecpuusage0,rate(nodecputotal{noden1}〔1m〕)rate(nodecputotal{noden2}〔1m〕),containercpulimitusageavgovertime(containercpulimitusage〔1d〕offset1d)1。01,containercpulimitusage0andcontainermemorylimitusage0,containercpulimitusage0。5andcontainermemorylimitusage0。5orcontainercpulimitusage0。8,sum(rate(apiserverrequestdurationsecondssum{subresource!log,verb!LISTWATCHWATCHLISTDELETECOLLECTIONPROXYCONNECT}〔5m〕))without(instance,pod)sum(rate(apiserverrequestdurationsecondscount{subresource!log,verb!LISTWATCHWATCHLISTDELETECOLLECTIONPROXYCONNECT}〔5m〕))without(instance,pod),}for,qs:rangetestExprs{expr,err:parser。ParseExpr(string(qs))iferr!nil{t。Fatal(err)}parser。Inspect(expr,func(nodeparser。Node,〔〕parser。Node)error{switchT:node。(type){caseparser。VectorSelector:t。Log(VectorSelector,T。String())caseparser。BinaryExpr:t。Log(BinaryExpr,T。String(),T。Op。String(),T。LHS。String(),T。RHS。String())returnnil}returnnil})}}
  结果:Runningtool:usrlocalgobingotesttimeout30srunTestSplitQueryxxxpkgxxxvRUNTestSplitQueryxxxpkgxxxtest。go:77:BinaryExprnodecpuusage0nodecpuusage0xxxpkgxxxtest。go:75:VectorSelectornodecpuusagexxxpkgxxxtest。go:77:BinaryExprrate(nodecputotal{noden1}〔1m〕)rate(nodecputotal{noden2}〔1m〕)rate(nodecputotal{noden1}〔1m〕)rate(nodecputotal{noden2}〔1m〕)xxxpkgxxxtest。go:75:VectorSelectornodecputotal{noden1}xxxpkgxxxtest。go:75:VectorSelectornodecputotal{noden2}xxxpkgxxxtest。go:77:BinaryExprcontainercpulimitusageavgovertime(containercpulimitusage〔1d〕offset1d)1。01containercpulimitusageavgovertime(containercpulimitusage〔1d〕offset1d)1。01xxxpkgxxxtest。go:77:BinaryExprcontainercpulimitusageavgovertime(containercpulimitusage〔1d〕offset1d)containercpulimitusageavgovertime(containercpulimitusage〔1d〕offset1d)xxxpkgxxxtest。go:75:VectorSelectorcontainercpulimitusagexxxpkgxxxtest。go:75:VectorSelectorcontainercpulimitusageoffset1dxxxpkgxxxtest。go:77:BinaryExprcontainercpulimitusage0andcontainermemorylimitusage0andcontainercpulimitusage0containermemorylimitusage0xxxpkgxxxtest。go:77:BinaryExprcontainercpulimitusage0containercpulimitusage0xxxpkgxxxtest。go:75:VectorSelectorcontainercpulimitusagexxxpkgxxxtest。go:77:BinaryExprcontainermemorylimitusage0containermemorylimitusage0xxxpkgxxxtest。go:75:VectorSelectorcontainermemorylimitusagexxxpkgxxxtest。go:77:BinaryExprcontainercpulimitusage0。5andcontainermemorylimitusage0。5orcontainercpulimitusage0。8orcontainercpulimitusage0。5andcontainermemorylimitusage0。5containercpulimitusage0。8xxxpkgxxxtest。go:77:BinaryExprcontainercpulimitusage0。5andcontainermemorylimitusage0。5andcontainercpulimitusage0。5containermemorylimitusage0。5xxxpkgxxxtest。go:77:BinaryExprcontainercpulimitusage0。5containercpulimitusage0。5xxxpkgxxxtest。go:75:VectorSelectorcontainercpulimitusagexxxpkgxxxtest。go:77:BinaryExprcontainermemorylimitusage0。5containermemorylimitusage0。5xxxpkgxxxtest。go:75:VectorSelectorcontainermemorylimitusagexxxpkgxxxtest。go:77:BinaryExprcontainercpulimitusage0。8containercpulimitusage0。8xxxpkgxxxtest。go:75:VectorSelectorcontainercpulimitusagexxxpkgxxxtest。go:77:BinaryExprsumwithout(instance,pod)(rate(apiserverrequestdurationsecondssum{subresource!log,verb!LISTWATCHWATCHLISTDELETECOLLECTIONPROXYCONNECT}〔5m〕))sumwithout(instance,pod)(rate(apiserverrequestdurationsecondscount{subresource!log,verb!LISTWATCHWATCHLISTDELETECOLLECTIONPROXYCONNECT}〔5m〕))sumwithout(instance,pod)(rate(apiserverrequestdurationsecondssum{subresource!log,verb!LISTWATCHWATCHLISTDELETECOLLECTIONPROXYCONNECT}〔5m〕))sumwithout(instance,pod)(rate(apiserverrequestdurationsecondscount{subresource!log,verb!LISTWATCHWATCHLISTDELETECOLLECTIONPROXYCONNECT}〔5m〕))xxxpkgxxxtest。go:75:VectorSelectorapiserverrequestdurationsecondssum{subresource!log,verb!LISTWATCHWATCHLISTDELETECOLLECTIONPROXYCONNECT}xxxpkgxxxtest。go:75:VectorSelectorapiserverrequestdurationsecondscount{subresource!log,verb!LISTWATCHWATCHLISTDELETECOLLECTIONPROXYCONNECT}PASS:TestSplitQuery(0。00s)PASSokxxxpkgxxx0。025s总结
  本文主要探讨如何在告警信息中,加入拆分后的、专属告警本身的指标趋势图,来更加方便的定位告警原因。主要解决两个问题:如何拆分告警表达式和对表达式加入新的labelmatchers。在文章《深入理解prometheus:如何为表达式抽取和注入Labels》中我们给出了如何对已有表达式加入新的labelmatchers的详细分析和代码;而本篇继续深入分析,并给出了如何拆分告警表达式的详细分析和代码示例;这样结合两者我们就能完整的实现我们的需求了。

抗生素对真菌起作用吗抗生素最多能连用几天抗生素是一种市面上很常见的药物,但是因为抗生素的副作用是很多的,所以在服用抗生素的时候是需要对症的,而不对症是不可以服用的,那么我们在这里便来了解一下抗生素对真菌起作用吗?抗生……抗生素是抗病毒还是细菌抗生素是处方药还是非处方药抗生素是一种我们大家都很熟悉的药物,还有很多人都服用过抗生素,但是很多人还不知道抗生素是主要治疗什么的,因此我们在这里便来了解一下抗生素是抗病毒还是细菌?抗生素是处方药还是非处……阿莫西林会产生耐药性吗阿莫西林产生抗药性了怎么办以前吃阿莫西林只用吃一颗就好了,现在加到两颗还是觉得效果不是很明显,是不是阿莫西林吃多了产生了抗药性啊!阿莫西林会产生耐药性吗?阿莫西林产生耐药性了怎么办?阿莫西林会产生耐药性……重庆一株百年古银杏树满目金黄吸引民众重庆北碚,一株300多岁的古银杏树满目金黄,落叶缤纷。何蓬磊摄古银杏树与古建筑相映成趣。何蓬磊摄市民在银杏树下拍照游玩。何蓬磊摄市民在银杏树下拍照游玩。何蓬磊……头孢是饭后吃还是饭前吃头孢是青霉素类药物吗头孢是一种市面上常见的药物,我们很多人都服用过头孢,所以我们大家应该都知道头孢的服用方法,但是还是有些人不清楚,因此我们便来了解一下头孢是饭后吃还是饭前吃?头孢是青霉素类药物吗……倍婷减肥胶囊安全吗倍婷减肥胶囊成分倍婷减肥胶囊应该有很多人都听说过,这款减肥胶囊的口碑还算不错,对身体的副作用较小,下面我们就来详细了解下它里面的成分,来看看这款减肥胶囊到底安不安全吧。倍婷减肥胶囊安全吗……无人深空Steam国区再次涨价!无人深空售价变贵30!俗话说晚买享折扣,这句话其实也有例外,因为有的游戏会涨价。太空沙盒游戏《无人深空》最近就迎来一波涨价,国区从156元变为198元。早知道就早点入手了!这不是《无人深空》的……什么是湿气呢湿气会造成什么危害呢大家在生活中应该都听说过湿气吧,但是你了解湿气吗?你知道什么是湿气吗?跟着小编我们一起来了解一下吧,究竟什么是湿气呢,以及湿气会造成什么危害呢。什么是湿气呢湿气是一种中医……人为什么会有湿气呢是什么造成湿气的呢夏天到了很多人都会身体不舒服去医院检查医生一般都会说是体内的湿气太大造成的,今天小编就和你们一起来了解一下什么是湿气吧以及为什么人会有湿气以及造成湿气的原因吧。人为什么会有湿气……看到这些瞬间,才知道我们经历了一个怎样的2022转眼间,我们迎来了2023年。过去的一年里,什么事让你印象最深刻呢?北京冬季残奥会顺利举办,俄乌局势愈演愈烈,阿根廷勇夺大力神杯。。。。。。除了这些举足轻重的年度大事记以……倍婷胶囊减肥药怎么样倍婷减肥胶囊有副作用吗倍婷减肥胶囊是一款口碑还不错的减肥药,这款减肥胶囊采用的成分都是比较天然的,吃下去副作用较小,下面一起来了解下这款减肥药怎么样吧。倍婷胶囊减肥药怎么样倍婷胶囊是当下比较火……日本救心丸多少钱一盒?日本救心丸价格介绍日本救心丸是一款在日本本土很出名的救心丸,效果非常好,下面5号网的小编为你们介绍日本救心丸多少钱一盒?日本救心丸价格介绍。日本救心丸多少钱一盒日本救心丸价格是600RMB……
眼药水有副作用吗?眼药水副作用有哪些?眼药水看起来是很安全无害的,但是据说使用久了也是有副作用的,那么到底具体是哪些副作用呢,下面5号网的小编为你们介绍眼药水有副作用吗?眼药水副作用有哪些?眼药水有副作用吗市……大内存成行业内卷新方向?网曝RedmiK60全系提供1651不得不说,在智能手机各项功能体验日趋成熟完善的今天,为了打造出差异化体验,近些年各大手机厂商可谓卷出了新高度,诸如超大容量电池、百瓦快充、1亿像素镜头、1英寸大底等黑科技层出不……深度分析摩洛哥到底是一个什么国家?凭什么走到现在?摩洛哥是联合国、世界贸易组织、世界银行、国际货币基金组织等主要国际机构,以及阿拉伯联盟、非洲联盟、马格里布联盟等重要地区组织的成员。摩洛哥位于非洲西北部,地处撒哈拉沙漠边缘,面……让梦想永远闪闪发光让梦想永远闪闪发光有些梦想会成为现实有些梦想或许永远是梦想无论怎样梦想都让人心驰神往无论怎样梦想都值得拼搏一场世上最大的幸……隐形眼镜多少度不能戴?隐形眼镜如何清洗教程如今几乎很多人都有隐形眼镜,甚至有些人度数不高的为了防止框式眼睛让眼睛变形,所以也选择隐形眼镜。那么,隐形眼镜多少度不能戴?隐形眼镜如何清洗教程?隐形眼镜多少度不能戴大部……过年在家吃胖了怎么办?过年在家如何减肥?过年在家就是长肉的时间,因为每天都会走亲戚,各种饭局、零食、水果等,都是各种吃。不少人困惑,过年在家吃胖了怎么办?关于,过年在家吃胖了怎么办?过年在家如何减肥?5号网小编来为您……冬天空调外机滴水吗?冬天空调外机滴水怎么办?冬天大家在使用空调的时候,可能会出现空调外机漏水的情况,影响楼下居民的生活。那么,冬天空调漏水是怎么一回事呢?该怎么解决呢?冬天空调外机滴水吗冬天使用空调供暖运行,……健脾固肾润肺冬季滋补,看看你适合哪种?冬季进补,膏方莫属。根据中医理论,冬季是一年四季中进补的最好季节,而此时更是以中药膏方为最佳的进补方式。为什么冬季季膏方进补最好?俗话说冬季进补,来春打虎,人体在冬……芪参益气滴丸能长期服用吗?芪参益气滴丸适用人群芪参益气滴丸的商标名是天士力,常用于治疗冠心病、心绞痛、心肌梗塞的病症。但是有些中老年人担心,长期服用会有毒副作用。芪参益气滴丸能长期服用吗芪参益气滴丸属于中成药,其主要……龙胆泻肝丸配一宝,嗓子里痰多痰湿,失眠阴虚阳虚皆可用说起龙胆泻肝丸可能大家都不陌生,很多人都听说过,但是有的人不知道该怎么去用,有的则用了之后没有什么太大的作用,甚至有的人用了之后还会出现一些不良的反应,那今天我就来教大家如何正……锂矿价格调整,并不是新能源汽车降价的信号近日,国际知名锂矿商皮尔巴拉(PilbaraMinerals)完成了一次锂精矿拍卖,成交价较上个月下降300美元吨。据业界测算,这批锂精矿生产成电池级碳酸锂的成本约为54。9万……乐敦小粉花多少钱?乐敦小粉花价格乐敦小粉花是一款非常好用的戴隐形眼镜时用的眼药水,下面5号网的小编为你们介绍乐敦小粉花多少钱?乐敦小粉花价格。乐敦小粉花多少钱乐敦小粉花Lycee眼药水价格:83元……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网