一种基于prometheus的告警方法、
装置和系统
技术领域
1.本发明涉及
分布式告警领域,尤其涉及一种基于prometheus的告警方法、装置和系统。
背景技术:
2.prometheus是一个开源的系统监控和告警系统,现有的prometheus系统中,prometheus服务只能读取存放在prometheus服务器本地的告警
规则配置文件,如果部署多个prometheus服务副本,每个副本都必须有自己的告警规则配置文件,而且每个副本都是独立的发出告警,可能出现同一个告警规则触发多个prometheus副本发出告警。prometheus系统无法进行分布式部署,无法容器化部署,告警规则配置文件依赖于部署的prometheus服务器。
3.在实现本发明过程中,申请人发现现有技术中至少存在如下问题:
4.基于prometheus的告警系统无法进行分布式部署,无法容器化部署,告警规则配置文件依赖于部署的prometheus服务器。
技术实现要素:
5.本发明实施例提供一种基于prometheus的告警方法、装置和系统,解决了基于prometheus的告警系统无法进行分布式部署,无法容器化部署,告警规则配置文件依赖于部署的prometheus服务器的问题。
6.为达上述目的,一方面,本发明实施例提供一种基于prometheus的告警方法,由基于prometheus的告警装置执行,
所述方法包括:
7.从数据库中读取并加载所有告警规则;
8.按预设时间间隔周期性地调用prometheus应用程序接口api执行所述告警规则,根据所述告警规则的执行情况更新告警状态,并且针对告警状态为已告警的告警规则生成对应的告警信息;
9.在分布式告警系统提供的分布式资源锁的约束下,向预设的告警信息接收方发送所有告警信息,并将所述告警信息写入数据库;
10.其中,在所述分布式告警系统中分布式部署有至少一个所述基于prometheus的告警装置;所述数据库由所述至少一个所述基于prometheus的告警装置共享访问;所述分布式资源锁用于在同一时间仅允许一个所述基于prometheus的告警装置发送所述告警信息。
11.进一步地,所述从数据库中读取并加载所有告警规则,包括:
12.从所述数据库中读取所有告警规则和各告警规则对应的告警规则标识;
13.根据各告警规则对应的所述告警规则标识将所有告警规则划分到至少一个告警规则组。
14.进一步地,所述根据各告警规则对应的所述告警规则标识将所有告警规则划分到至少一个告警规则组,包括:
15.针对每个告警规则标识,将所述告警规则标识输入给hash散列算法得到所述告警规则标识对应的散列结果;
16.将散列结果相同的告警规则标识对应的告警规则设置为同一个告警规则组。
17.进一步地,所述方法还包括:
18.从预设的告警规则管理api接收到针对指定告警规则的管理操作的情况下,根据所述管理操作更新所述数据库中的所述指定告警规则,并将所述指定告警规则的告警规则标识和所述管理操作的类型写入消息队列;
19.从所述消息队列中读取所述指定告警规则的告警规则标识和所述管理操作的类型,并根据所述告警规则标识确定所述指定告警规则所在的告警规则组,根据所述管理操作的类型更新所述告警规则组中的所述指定告警规则;
20.所述管理操作的类型包括:增加、删除、修改或查询;
21.所述指定告警规则是所有所述告警规则中之一或者需要增加的告警规则。
22.进一步地,所述方法还包括:
23.当从预设的告警信息查询api接收到针对指定告警规则标识的告警信息查询操作时,从所述数据库中查询与所述指定告警规则标识对应的告警信息,并通过所述告警信息查询api返回所述告警信息。
24.进一步地,所述方法还包括:
25.当从预设的告警规则状态查询api接收到告警规则状态查询操作时,通过所述告警规则状态查询api返回最近一次调用prometheus api执行告警规则后得到的告警状态。
26.进一步地,所述告警状态包括:不活跃的、待处理的、已告警、已暂停、错误。
27.另一方面,本发明实施例提供一种基于prometheus的告警装置,包括:
28.告警规则加载单元,用于从数据库中读取并加载所有告警规则;
29.告警规则执行单元,用于按预设时间间隔周期性地调用prometheus应用程序接口api执行所述告警规则,根据所述告警规则的执行情况更新告警状态,并且针对告警状态为已告警的告警规则生成对应的告警信息;
30.告警通知单元,用于在分布式告警系统提供的分布式资源锁的约束下,向预设的告警信息接收方发送所有告警信息,并将所述告警信息写入数据库;
31.其中,在所述分布式告警系统中分布式部署有至少一个所述基于prometheus的告警装置;所述数据库由至少一个所述基于prometheus的告警装置共享访问;所述分布式资源锁用于在同一时间仅允许一个所述基于prometheus的告警装置发送所述告警信息。
32.另一方面,本发明实施例提供一种分布式告警系统,包括:数据库、prometheus服务器、分布式资源服务组件、和至少一个如前所述的基于prometheus的告警装置;
33.所述基于prometheus的告警装置从数据库中读取并加载所有告警规则;
34.所述基于prometheus的告警装置按预设时间间隔周期性地调用prometheus服务器提供的prometheus应用程序接口api执行所述告警规则,根据所述告警规则的执行情况更新告警状态,并且针对告警状态为已告警的告警规则生成对应的告警信息;
35.所述基于prometheus的告警装置在所述分布式资源服务组件提供的分布式资源锁的约束下,向预设的告警信息接收方发送所有告警信息,并将所述告警信息写入所述数据库;
36.其中,所述告警规则预先保存在数据库中;至少一个所述基于prometheus的告警装置分布式部署在所述分布式告警系统中;所述数据库由至少一个所述基于prometheus的告警装置共享访问;所述分布式资源锁用于在同一时间仅允许一个所述基于prometheus的告警装置发送所述告警信息。
37.进一步地,所述分布式资源服务组件为:kubernetes系统;
38.至少一个所述的基于prometheus的告警装置以分布式方式部署在所述kubernetes系统中;所述分布式资源锁由kubernetes系统中的lease租约机制实现。
39.上述技术方案具有如下有益效果:本发明技术方案使用可共享的数据库存储告警规则,并提供更新告警规则的api接口,通过使用本发明技术方案实现的告警功能替换prometheus原有的告警功能,并调用prometheus系统原有的prometheus api执行告警规则,从而实现基于prometheus的原始语句的分布式告警系统,实现了具有高可用性的告警系统,并且告警系统可容器化、分布式部署,通过告警规则分组技术实现告警规则的分组加载,减低部分告警规则错误导致的告警规则不能加载的影响,告警规则支持暂停状态,对不需要的告警规则可以暂停执行,每次告警都有告警信息记录到数据库中,方便后期查看告警记录。
附图说明
40.为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
41.图1是本发明实施例之一的一种基于prometheus的告警方法的流程图;
42.图2是本发明实施例之一的一种基于prometheus的告警装置的架构图;
43.图3是本发明实施例之一的告警规则经hash散列后的存储结构示意图;
44.图4是本发明实施例之一的hash散列流程示意图;
45.图5是本发明实施例之一的一种分布式告警系统的架构图;
46.图6是本发明实施例之一的一种分布式告警系统的另一种架构图。
具体实施方式
47.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
48.发明人发现现有基于prometheus的告警系统没有实现告警功能的分布式部署,其主要原因是prometheus软件分层设计及数据存储问题导致,prometheus为了满足自己高效准确的监控数据采集功能,需要高效的数据存储服务,所有告警功能也直接采用了使用本地磁盘的方式;同时因为软件分层设计问题导致数据采集功能和告警功能高度耦合无法拆分,从而导致没法拆分出来进行分布式部署;基于上述原因,发明人使用本发明技术方案替换了prometheus原有的告警功能,并通过调用prometheus应用程序接口api的方式采用了
prometheus服务的告警语句执行和查询功能。
49.一方面,如图1所示,本发明实施例提供一种基于prometheus的告警方法,由基于prometheus的告警装置执行,所述方法包括:
50.步骤s100:从数据库中读取并加载所有告警规则;
51.步骤s101:按预设时间间隔周期性地调用prometheus应用程序接口api执行所述告警规则,根据所述告警规则的执行情况更新告警状态,并且针对告警状态为已告警的告警规则生成对应的告警信息;
52.步骤s102:在分布式告警系统提供的分布式资源锁的约束下,向预设的告警信息接收方发送所有告警信息,并将所述告警信息写入数据库;
53.其中,在所述分布式告警系统中分布式部署有至少一个所述基于prometheus的告警装置;所述数据库由所述至少一个所述基于prometheus的告警装置共享访问;所述分布式资源锁用于在同一时间仅允许一个所述基于prometheus的告警装置发送所述告警信息。所述基于prometheus的告警装置可以部署一个,也可以部署两个或两个以上,具体数量不作限定。
54.在一些实施例中,数据库可以是包括但不限于数据库集、共享数据库和分布式数据库等;告警规则预先存储在数据库中,数据库可以被共享访问,例如分布式部署的多个基于prometheus的告警装置可以共享数据库中的告警规则。各基于prometheus的告警装置都从数据库中加载告警规则,各基于prometheus的告警装置各自按预设时间间隔周期性地调用prometheus应用程序接口api执行告警规则,并且更新告警规则的告警状态,并且针对告警状态为已告警的告警规则生成告警信息;在分布式告警系统中由于存在多个基于prometheus的告警装置的副本,可能产生同一告警信息,为了避免出现重复报警,使用分布式告警系统提供的分布式资源锁限制只有一个基于prometheus的告警装置可以发出告警通知。具体地,在分布式告警系统中,可以通过分布式资源服务组件包括但不限于kubernetes、redis或zookeeper提供分布式资源锁的功能。redis是一个开源的使用ansic语言编写、支持网络、可基于内存亦可持久化的日志型、key-value数据库,并提供多种语言的api;zookeeper是一个分布式的,开放源码的分布式应用程序协调服务框架;例如,通过告警通知单元实现步骤s102的操作时,将告警通知单元作为一个独立的服务,通过分布式资源锁启动多个告警通知单元服务中的一个,此告警通知单元服务用于管理告警的发送,不能同时启动多个告警通知单元服务否则报警信息将重复,如果当前执行告警通知的告警通知单元服务宕机了,在分布式资源锁的机制下,会启动其他基于prometheus的告警装置中的告警通知单元服务继续执行告警通知服务。基于分布式资源锁的整个分布式告警系统可以满足高可用性和唯一性。作为一个具体的实施例,可以基于kubernetes的lease(租约)实现分布式资源锁,在启动告警通知单元的时候,会通过kubernetes api访问lease,如果lease不存在则创建lease并启动告警通知单元服务;如果已经存在则查看lease上的租约信息,假如租期已到期则启动告警通知单元并对此租约进行续租,否则定期查看lease上租约是否到期一旦到期则启动告警通知单元。
55.进一步地,所述从数据库中读取并加载所有告警规则,包括:
56.从所述数据库中读取所有告警规则和各告警规则对应的告警规则标识;
57.根据各告警规则对应的所述告警规则标识将所有告警规则划分到至少一个告警
规则组。
58.现有技术中的prometheus在加载告警规则时,必须所有告警规则一起加载,如果其中一条告警规则错误,将导致全部告警规则无法加载,为了解决此问题,在一些实施例中,通过将使用报警规则标识对报警规则进行划分得到至少一个告警规则组,并且分别独立的加载各告警规则组,从而避免某条告警规则错误导致全部告警规则无法加载的问题,将告警规则错误的影响尽可能降低。具体地,各告警规则组可以分别设置在各自相应的协程中,由各协程分别加载各告警规则组中的告警规则,当修改某个告警规则组中的告警规则时,只导致该告警规则组对应的协程重新加载告警规则,不会影响其他协程。
59.进一步地,所述根据各告警规则对应的所述告警规则标识将所有告警规则划分到至少一个告警规则组,包括:
60.针对每个告警规则标识,将所述告警规则标识输入给hash散列算法得到所述告警规则标识对应的散列结果;
61.将散列结果相同的告警规则标识对应的告警规则设置为同一个告警规则组。
62.在一些实施例中,使用hash散列算法根据告警规则标识将告警规则划分到不同的告警规则组。通过hash散列分组把存在数据库中的告警规则按照告警规则标识进行hash散列分组,hash散列组会去数据库中读取告警规则,根据告警规则标识对告警规则进行散列,散列方式可以是任意已知的散列算法,最终的效果就是,有相同散列结果的告警规则会以字典的方式进行存储,字典的键为告警规则标识散列后的值,值为告警规则列表。
63.进一步地,所述方法还包括:
64.从预设的告警规则管理api接收到针对指定告警规则的管理操作的情况下,根据所述管理操作更新所述数据库中的所述指定告警规则,并将所述指定告警规则的告警规则标识和所述管理操作的类型写入消息队列;
65.从所述消息队列中读取所述指定告警规则的告警规则标识和所述管理操作的类型,并根据所述告警规则标识确定所述指定告警规则所在的告警规则组,根据所述管理操作的类型更新所述告警规则组中的所述指定告警规则;
66.所述管理操作的类型包括:增加、删除、修改或查询;
67.所述指定告警规则是所有所述告警规则中之一或者需要增加的告警规则。在管理操作的类型为增加的情况下,所述指定告警规则是需要增加的告警规则;在管理操作的类型为删除、修改或查询的情况下,所述指定告警规则是所有所述告警规则中之一。
68.在一些实施例中,在分布式告警系统中,各基于prometheus的告警装置的副本可通过告警规则管理api维护数据库中的告警规则,并进一步确定更新的告警规则所在的告警规则组,并更新告警规则组中的该告警规则。具体地,各告警规则组可以设置在各自相应的协程中,由协程加载各告警规则组中的告警规则,当修改某个告警规则组中的告警规则时,只导致该告警规则组对应的协程重新加载告警规则,不会影响其他协程。
69.进一步地,所述方法还包括:
70.当从预设的告警信息查询api接收到针对指定告警规则标识的告警信息查询操作时,从所述数据库中查询与所述指定告警规则标识对应的告警信息,并通过所述告警信息查询api返回所述告警信息。
71.在一些实施例中,通过按预设时间间隔周期性地调用prometheus api执行告警规
则,并且更新告警规则的告警状态,并且针对告警状态为已告警的告警规则生成告警信息,生成的告警信息会被写入到数据库中;通过告警信息查询api并指定告警规则标识,可以从数据库中查询出已经发生的告警信息记录。方便对系统历史工作性能的分析。
72.进一步地,所述方法还包括:
73.当从预设的告警规则状态查询api接收到告警规则状态查询操作时,通过所述告警规则状态查询api返回最近一次调用prometheus api执行告警规则后得到的告警状态。
74.在一些实施例中,通过按预设时间间隔周期性地调用prometheus api执行告警规则,并且更新告警规则的告警状态;告警规则的告警状态自动周期性的更新,告警规则的告警状态可以存储于内存、文件或数据库中,在需要了解告警规则的状态时,可以通过告警规则状态查询api从告警状态的保存位置获取告警状态并返回给查询方。
75.进一步地,所述告警规则状态包括:不活跃的、待处理的、已告警、已暂停、错误。
76.在一些实施例中,所述告警规则的状态包括:inactive(不活跃的)、pending(待处理的)、firing(已告警的)、paused(已暂停的)、error(错误)。
77.所有告警状态都可以转换成paused(已暂停的);inactive(不活跃的)可以转换成pending(待处理的);pending(待处理的)可以转换成firing(已告警的);firing(已告警的)可以转换成inactive(不活跃的);error(错误)可以与inactive(不活跃的)相互转换。
78.本发明实施例具有如下技术效果:本发明技术方案使用可共享的数据库存储告警规则,并提供更新告警规则的api接口,通过使用本发明技术方案实现的告警功能替换prometheus原有的告警功能,并调用prometheus系统原有的prometheus api执行告警规则,从而实现基于prometheus的原始语句的分布式告警系统,实现了具有高可用性的告警系统,并且告警系统可容器化、分布式部署,通过告警规则分组技术实现告警规则的分组加载,减低部分告警规则错误导致的告警规则不能加载的影响,告警规则支持暂停状态,对不需要的告警规则可以暂停执行,每次报警都有报警记录存储到数据库中,方便后期查看告警记录。
79.另一方面,如图2所示,本发明实施例提供一种基于prometheus的告警装置,包括:
80.告警规则加载单元200,用于从数据库中读取并加载所有告警规则;
81.告警规则执行单元201,用于按预设时间间隔周期性地调用prometheus应用程序接口api执行所述告警规则,根据所述告警规则的执行情况更新告警状态,并且针对告警状态为已告警的告警规则生成对应的告警信息;
82.告警通知单元202,用于在分布式告警系统提供的分布式资源锁的约束下,向预设的告警信息接收方发送所有告警信息,并将所述告警信息写入数据库;
83.其中,在所述分布式告警系统中分布式部署有至少一个所述基于prometheus的告警装置;所述数据库由至少一个所述基于prometheus的告警装置共享访问;所述分布式资源锁用于在同一时间仅允许一个所述基于prometheus的告警装置发送所述告警信息。
84.进一步地,所述告警规则加载单元200,包括:
85.告警规则读取模块,用于从所述数据库中读取所有告警规则和各告警规则对应的告警规则标识;
86.告警规则分组模块,用于根据各告警规则对应的所述告警规则标识将所有告警规则划分到至少一个告警规则组。
87.进一步地,所述告警规则分组模块,包括:
88.散列模块,用于针对每个告警规则标识,将所述告警规则标识输入给hash散列算法得到所述告警规则标识对应的散列结果;
89.散列分组模块,用于将散列结果相同的告警规则标识对应的告警规则设置为同一个告警规则组。
90.进一步地,所述装置还包括:
91.数据库更新单元,用于从预设的告警规则管理api接收到针对指定告警规则的管理操作的情况下,根据所述管理操作更新所述数据库中的所述指定告警规则,并将所述指定告警规则的告警规则标识和所述管理操作的类型写入消息队列;
92.告警规则组更新单元,用于从所述消息队列中读取所述指定告警规则的告警规则标识和所述管理操作的类型,并根据所述告警规则标识确定所述指定告警规则所在的告警规则组,根据所述管理操作的类型更新所述告警规则组中的所述指定告警规则;
93.所述管理操作的类型包括:增加、删除、修改或查询;
94.所述指定告警规则是所有所述告警规则中之一或者需要增加的告警规则。
95.进一步地,所述装置还包括:
96.告警信息查询单元,用于当从预设的告警信息查询api接收到针对指定告警规则标识的告警信息查询操作时,从所述数据库中查询与所述指定告警规则标识对应的告警信息,并通过所述告警信息查询api返回所述告警信息。
97.进一步地,所述装置还包括:
98.告警状态查询单元,用于当从预设的告警规则状态查询api接收到告警规则状态查询操作时,通过所述告警规则状态查询api返回最近一次调用prometheus api执行告警规则后得到的告警状态。
99.本发明实施例提供的基于prometheus的告警装置是与前述发明实施例提供的基于prometheus的告警方法一一对应的装置类实施例,可根据前述的基于prometheus的告警方法理解本发明实施例,在此不再赘述。
100.本发明实施例具有如下技术效果:本发明技术方案使用可共享的数据库存储告警规则,并提供更新告警规则的api接口,通过使用本发明技术方案实现的告警功能替换prometheus原有的告警功能,并调用prometheus系统原有的prometheus api执行告警规则,从而实现基于prometheus的原始语句的分布式告警系统,实现了具有高可用性的告警系统,并且告警系统可容器化、分布式部署,通过告警规则分组技术实现告警规则的分组加载,减低部分告警规则错误导致的告警规则不能加载的影响,告警规则支持暂停状态,对不需要的告警规则可以暂停执行,每次告警都有告警信息记录到数据库中,方便后期查看告警记录。
101.另一方面,如图5所示,本发明实施例提供一种分布式告警系统,包括:prometheus服务器201、数据库202、分布式资源服务组件203、和至少一个上述基于prometheus的告警装置204;
102.所述基于prometheus的告警装置204从数据库202中读取并加载所有告警规则;
103.所述基于prometheus的告警装置204按预设时间间隔周期性地调用prometheus服务器201提供的prometheus应用程序接口api执行所述告警规则,根据所述告警规则的执行
情况更新告警状态,并且针对告警状态为已告警的告警规则生成对应的告警信息;
104.所述基于prometheus的告警装置204在所述分布式资源服务组件203提供的分布式资源锁的约束下,向预设的告警信息接收方发送所有告警信息,并将所述告警信息写入所述数据库202;
105.其中,所述告警规则预先保存在数据库202中;至少一个所述基于prometheus的告警装置204分布式部署在所述分布式告警系统203中;所述数据库202由至少一个所述基于prometheus的告警装置204共享访问;所述分布式资源锁用于在同一时间仅允许一个所述基于prometheus的告警装置204发送所述告警信息。
106.在一些实施例中,分布式地部署至少一个基于prometheus的告警装置204,各基于prometheus的告警装置204都从共享的数据库202中读取告警规则,各基于prometheus的告警装置204都调用prometheus服务器201提供的prometheus应用程序接口api执行所述告警规则并更新告警状态,并且针对告警状态为已告警的告警规则生成对应的告警信息,但在分布式告警系统中的分布式资源服务组件203提供的分布式资源锁的约束下,仅有其中一个基于prometheus的告警装置204可以针对告警信息发出告警信息以及将告警信息写入数据库202。分布式资源服务组件203包括但不限于kubernetes、redis或zookeeper;通过将告警规则共享的保存在数据库202中,代替了prometheus原生技术中将告警规则保存在各prometheus服务器本地的方案,实现了将告警规则与告警功能解耦,为告警功能的分布式部署提供方便;进一步地,在分布式资源锁的约束下,自动选择其中一个基于prometheus的告警装置204发送告警信息以及将告警信息写入数据库202,避免了分布式部署的告警功能重复告警,而且,分布式部署的基于prometheus的告警装置204可以实现在其中一个基于prometheus的告警装置204宕机时,在分布式资源锁的机制下自动选择其他能正常启动的基于prometheus的告警装置204之一执行发送告警信息和将告警信息写入数据库202的工作,实现了告警功能的高可用性。本发明实施例提供的分布式告警系统中提供分布式的告警功能,实现了告警功能的高可用性,从而确保分布式告警系统中的业务系统安全可靠的运行。
107.进一步地,如图5所示,所述分布式资源服务组件203包括:kubernetes系统;
108.至少一个所述的基于prometheus的告警装置204以分布式方式部署在所述kubernetes系统中;所述分布式资源锁由所述kubernetes系统中的lease租约机制实现。
109.在一些实施例中,多个基于prometheus的告警装置204可以部署在分布式告警系统中的kubernetes系统的多个从节点中,具体地在kubernetes系统中,从节点包括但不限于pod中的container、和/或node。图5中的主节点是kubernetes系统的master节点。数据库202和prometheus服务器201可以独立的部署在物理机器上也可以部署在是kubernetes系统的从节点上。多个基于prometheus的告警装置204可以通过kubernetes系统提供的通信机制与prometheus服务器201和数据库202通信。所述分布式资源锁由所述kubernetes系统中的lease租约机制实现,从而使多个基于prometheus的告警装置204中仅有一个可以发出告警信息。
110.进一步地,所述分布式告警系统还包括:web应用;
111.所述基于prometheus的告警装置204提供以http方式进行告警规则的增、删、改和/或查的http api接口;
112.所述web应用通过所述http api接口实现自定义web前端页面进行告警规则的增、删、改和/或查。
113.本发明实施例具有如下技术效果:本发明技术方案使用可共享的数据库存储告警规则,并提供更新告警规则的api接口,通过使用本发明技术方案实现的告警功能替换prometheus原有的告警功能,并调用prometheus系统原有的prometheus api执行告警规则,从而实现基于prometheus的原始语句的分布式告警系统,实现了具有高可用性的告警系统,并且告警系统可容器化、分布式部署,通过告警规则分组技术实现告警规则的分组加载,减低部分告警规则错误导致的告警规则不能加载的影响,告警规则支持暂停状态,对不需要的告警规则可以暂停执行,每次报警都有报警记录存储到数据库中,方便后期查看告警记录。
114.下面结合具体的应用实例对本发明实施例上述技术方案进行详细说明,实施过程中没有介绍到的技术细节,可以参考前文的相关描述。
115.发明人在使用prometheus监控告警系统过程中发现了现有的prometheus监控告警系统的如下技术缺点:
116.无法使用web页面进行告警规则的增、删、改,必须在服务器上编辑yaml格式的文件进行告警规则的配置,使用起来有局限性;
117.yaml格式的告警规则修改完成后必须手动重新加载告警规则,需手动操作无法自动完成;
118.整个告警系统无法进行分布式部署,无法容器化部署,配置文件依赖于部署的服务器;
119.告警规则配置错误后,所有告警规则都不能更新成功,必须解决错误后才可以提交更改;
120.告警规则加载的时候不能分组,所有配置都需要重新加载,配置之间相互干扰;
121.告警规则不支持告警暂定功能,如不想报警但是保留告警规则则无法操作;
122.告警系统没有告警记录,无法查过往告警信息。
123.针对在prometheus监控告警系统的环境下发现的上述问题,发明人提出了以下技术手段予以解决:
124.对外提供http api接口,用户通过接口可以直接以任何http方式进行告警规则的增、删、改、查;
125.告警规则统一存储在数据库中,可以对数据库进行高可用部署保证告警规则的高可用;
126.可以使用kubernetes系统,对告警服务进行分布式部署,整个系统可容器化部署;
127.告警规则配置错误后,可以通过告警状态查看告警规则错误信息;
128.告警规则加载的时候采用hash散列分组技术,减少告警规则重新加载直接的干扰;
129.告警规则支持暂停功能,对暂时不需要报警的报警规则可以给与暂停;
130.每次报警都有报警记录存储到数据库中,方便后期查看告警记录。
131.下面以另一个具体实施例对本发明技术方案进行说明:
132.如图6所示,本发明实施例提供的另一种分布式告警系统,具体是一种基于
prometheus的、且告警功能分布式部署的告警系统,包括web应用001、告警核心模块002、数据库003、hash散列组004、规则管理模块005、消息队列006、事件监听模块007、状态监控模块008、prometheus api模块009、告警管理模块010、通知管理模块012、alertmanager模块013、分布式资源锁014等。
133.以下分别对每个模块进行说明:
134.web应用001:
135.通过告警核心模块002提供的http api接口,用户可以自己开发web前端页面进行告警规则的增、删、改、查。
136.告警核心模块002:
137.接收http请求,处理http api提交的告警规则的增、删、改、查请求,然后操作数据库003进行告警规则的存储、删除及修改。
138.通过查询状态监控模块008,获取告警规则的状态信息,包括告警规则告警状态、评估时间、最后评估时间。
139.启动时配置prometheus client对象,通过prometheus client对象可以直接访问prometheus api模块009。
140.告警规则的增、删、改、查事件会存入到消息队列006中。
141.启动时启动规则管理模块005,以便加载告警规则信息。
142.启动时启动通知管理模块012。
143.hash散列组004:
144.读取数据库003中的告警规则对告警规则进行hash散列分组,此功能为了避免所有的告警规则都处于一个分组中,这样在重新加载告警规则的时候不会影响到所有的告警规则。告警规则标识经hash散列组(即散列计算模块)处理后得到散列结果即图3中的id散后的值,以散列结果为键以该散列结果对应的告警规则为值,如图3中示例的值中包含告警规则a和告警规则b。
145.规则管理模块005:
146.通过hash散列组004获取到告警规则及分组,同一个分组的告警加入到一个协程中。告警规则标识经hash散列组(即散列计算模块)处理后得到散列结果即图3中的id散后的值,以散列结果为键以该散列结果对应的告警规则为值,如图3中示例的值中包含告警规则a和告警规则b;如图4所示,告警规则a、b、c、d和e经hash散列组004处理后分为两组,其中告警规则a和b一组,告警规则c、d和e为另一组,两组规则分别被分配给协程p1和p2。
147.消息队列006:
148.接收告警核心模块002发送过来的消息事件,放到消息队列中,供事件监听模块007进行消费。
149.事件监听模块007:
150.消费消息队列006的事件,调用hash散列组004对告警规则进行散列分组,并需要调用规则管理模块005提供的更新接口,重新更新告警规则。
151.状态监控模块008:
152.从告警管理模块010中获取每一条告警规则的状态,告警状态、评估时间、最后评估时间。
153.告警管理模块010:
154.告警规则会通过告警管理模块010调用prometheus api模块009进行告警规则的执行,根据不同的执行结果返回不同的状态信息,对需要报警的告警规则调用通知管理模块012。
155.通知管理模块012:
156.接收告警管理模块010发送过来的告警,发送给alertmanager模块013。
157.记录告警信息,记录到数据库003中,以便查看告警规则的告警记录。
158.分布式资源锁014:
159.分布式资源锁属于一种在kubernetes系统中启动分布式服务的时候,确保同一时刻只有一个激活的服务在运行,一旦此激活的服务无法提供服务则可以激活其他服务,保证服务的高可用运行。
160.此分布式资源锁采用调用kubernetes api模块015创建lease(即租约,kubernetes系统中的一种资源)016的方式,通过lease是否到期的方式保证服务可以单一运行并保证高可用。
161.alertmanager模块013:
162.一种告警发送系统,可以和prometheus配套使用,此系统为了兼容prometheus的报警方式,默认接入此系统。
163.以下对本系统的处理逻辑进行说明
164.告警核心模块002:
165.此模块为整个系统的核心管理模块,对外提供http api接口,通过此接口可以对告警规则进行增、删、改、查。web应用001通过调用http api接口进行告警规则的增、删、改、查的时候,核心处理模块会把相对于的告警规则保存到数据库003中并对此告警规则生成一个唯一的id值(即告警规则标识)。
166.在保存到数据库003中成功后,会发送一个消息到消息队列006中,发送到消息队列的消息为此告警规则的id及操作类型(增、删、改)。
167.告警核心模块除了对外提供告警规则的增、删、改、查接口还提供了告警规则状态的信息查询,此状态信息由状态监控模块008获取。
168.告警核心模块还提供了告警记录的查询接口,此信息由通知管理模块012在发生告警后写入到数据库中。告警核心模块会通过告警规则id进行查并对外提供http api接口。
169.告警核心模块在启动的时候会创建一个可以访问prometheus api模块009的对象prometheus client,通过使用此对象,其他模块可以直接访问prometheus api。
170.告警核心模块在启动的时候会通过分布式资源锁014启动通知管理模块012服务,此服务因为是管理告警的发送,不能同时启动多个否则报警信息将重复。而分布式资源锁014的实现是基于kubernetes的lease(即租约)016去实现的。告警核心模块在启动通知管理模块的时候,会通过kubernetes api模块015访问lease租约016,如果lease租约016不存在则创建lease租约并启动通知管理模块;如果已经存在则查看lease上的租约信息,假如租期已到期则启动通知管理模块并对此租约进行续租,否则定期查看lease上租约是否到期一旦到期则启动通知管理模块。添加了分布式资源的整个告警系统可以满足高可用性和
唯一性。
171.告警核心模块在启动的时候会启动规则管理模块005。
172.hash散列组004:
173.规则管理模块005启动的时候,规则管理模块,会通过hash散列分组这个功能把存在数据库中的告警规则按照告警规则id进行hash散列分组,不同组的告警规则会加载到规则管理模块启动的不同协程中。
174.hash散列工作原理:
175.在规则管理模块调用hash散列组的时候,hash散列组会去数据库003中读取告警规则,根据告警规则id对告警规则进行散列,散列方式可以是任意已知的散列算法,最终的效果就是,有相同散列结果的告警规则会以字典002的方式进行存储,如图3所示,字典的键为告警规则id散列后的值,值为告警规则列表。
176.告警规则的增、删、改处理:
177.告警规则的增、删、改处理都会被告警核心模块写入到消息队列006中由事件监听模块007进行消费。
178.事件监听模块007消费队列的时候,会调用hash散列组004服务,对队列里面的告警规则id进行散列处理,通过散列后的值,作为字典键值查对应的字典002的值,如果是增加类型,则对字典的值进行增加;如果删除类型,则对字典的值进行删除;如果改类型,则对字典的值进行修改。一旦对字典中的值操作完成,事件监听模块007会调用规则管理模块005的更新接口,规则管理模块会根据字典的键值,到对应的协程,对此协程执行重新加载字典值的操作,以完成告警规则的增、删、改操作。
179.规则管理模块:
180.根据字典002的键值,创建多个协程,协程中含有字典键值(即具体的告警规则),并调用告警管理模块010去执行协程中的告警规则。
181.提供一个接口,用于重新加载协程中的告警规则,供事件监听模块使用007。
182.告警管理模块,告警状态转换:
183.告警规则有五种告警状态分别为:inactive(不活跃的)、pending(待处理的)、firing(告警的)、paused(已暂停的)、error(错误)。
184.状态转换,所有告警状态都可以转换成paused(已暂停的),inactive(不活跃的)可以转换成pending(待处理的);pending(待处理的)可以转换成firing(告警的);firing(告警的)可以转换成inactive(不活跃的);error(错误)可以与inactive(不活跃的)相互转换。
185.error(错误)执行告警规则语句的时候,如果告警语句无法在prometheus api模块009中执行则显示error状态,并提示错误原因。
186.paused(已暂停的)这个状态是用户赋予的一种状态,如用户想对该告警规则做暂停处理,需要告警核心模块002提供的告警规则暂停接口对该告警规则赋予暂停标识,存在此标识的告警规则不在告警管理模块010进行执行,并给以paused(已暂停的)这种状态。
187.正常情况下告警规则都处于inactive(不活跃的)状态,告警管理模块010会定时调用prometheus api模块009执行此告警规则,一旦执行产生结果则转换告警状态为pending(待处理的),并开始记录时间,如果记录的时间超过了告警规则定义的持续时间则
转换告警状态为firing(告警的),并把告警信息推送给通知管理模块012。
188.通知管理模块012:
189.通知管理模块012会接收告警管理模块010发过来的状态为firing的告警,先把告警信息保存到数据库中003,作为此条告警规则的告警历史记录,然后通过alertmanager模块013提供的http api接口,发送给alertmanager,完成告警的发送。
190.本发明技术方案具有如下技术效果:对外提供http api接口,用户通过接口可以直接以任何http方式进行告警规则的增、删、改、查。告警规则统一存储在数据库中,可以对数据库进行高可用部署保证告警规则的高可用。可以使用kubernetes系统,对告警服务进行分布式部署,整个系统可容器化部署。告警规则配置错误后,可以通过告警状态查看告警规则错误信息。告警规则加载的时候采用hash散列分组技术,减少告警规则重新加载直接的干扰。告警规则支持暂停功能,对暂时不需要报警的报警规则可以给与暂停。每次报警都有报警记录存储到数据库中,方便后期查看告警记录。告警规则配置错误后,可以通过告警状态查看告警规则错误信息。告警规则加载的时候采用hash散列分组技术,减少告警规则重新加载直接的干扰。告警规则支持暂停功能,对暂时不需要报警的报警规则可以给与暂停。每次报警都有报警记录存储到数据库中,方便后期查看告警记录。
191.应该明白,公开的过程中的步骤的特定顺序或层次是示例性方法的实例。基于设计偏好,应该理解,过程中的步骤的特定顺序或层次可以在不脱离本公开的保护范围的情况下得到重新安排。所附的方法权利要求以示例性的顺序给出了各种步骤的要素,并且不是要限于所述的特定顺序或层次。
192.在上述的详细描述中,各种特征一起组合在单个的实施方案中,以简化本公开。不应该将这种公开方法解释为反映了这样的意图,即,所要求保护的主题的实施方案需要比清楚地在每个权利要求中所陈述的特征更多的特征。相反,如所附的权利要求书所反映的那样,本发明处于比所公开的单个实施方案的全部特征少的状态。因此,所附的权利要求书特此清楚地被并入详细描述中,其中每项权利要求独自作为本发明单独的优选实施方案。
193.为使本领域内的任何技术人员能够实现或者使用本发明,上面对所公开实施例进行了描述。对于本领域技术人员来说;这些实施例的各种修改方式都是显而易见的,并且本文定义的一般原理也可以在不脱离本公开的精神和保护范围的基础上适用于其它实施例。因此,本公开并不限于本文给出的实施例,而是与本技术公开的原理和新颖性特征的最广范围相一致。
194.上文的描述包括一个或多个实施例的举例。当然,为了描述上述实施例而描述部件或方法的所有可能的结合是不可能的,但是本领域普通技术人员应该认识到,各个实施例可以做进一步的组合和排列。因此,本文中描述的实施例旨在涵盖落入所附权利要求书的保护范围内的所有这样的改变、修改和变型。此外,就说明书或权利要求书中使用的术语“包含”,该词的涵盖方式类似于术语“包括”。此外,使用在权利要求书的说明书中的任何一个术语“或者”是要表示“非排它性的或者”。
195.本领域技术人员还可以了解到本发明实施例列出的各种说明性逻辑块(illustrative logical block),单元,和步骤可以通过电子硬件、电脑软件,或两者的结合进行实现。为清楚展示硬件和软件的可替换性(interchangeability),上述的各种说明性部件(illustrative components),单元和步骤已经通用地描述了它们的功能。这样的功
能是通过硬件还是软件来实现取决于特定的应用和整个系统的设计要求。本领域技术人员可以对于每种特定的应用,可以使用各种方法实现所述的功能,但这种实现不应被理解为超出本发明实施例保护的范围。
196.本发明实施例中所描述的各种说明性的逻辑块,或单元都可以通过通用处理器,数字信号处理器,专用集成电路(asic),现场可编程门阵列或其它可编程逻辑装置,离散门或晶体管逻辑,离散硬件部件,或上述任何组合的设计来实现或操作所描述的功能。通用处理器可以为微处理器,可选地,该通用处理器也可以为任何传统的处理器、控制器、微控制器或状态机。处理器也可以通过计算装置的组合来实现,例如数字信号处理器和微处理器,多个微处理器,一个或多个微处理器联合一个数字信号处理器核,或任何其它类似的配置来实现。
197.本发明实施例中所描述的方法或算法的步骤可以直接嵌入硬件、处理器执行的软件模块、或者这两者的结合。软件模块可以存储于ram存储器、闪存、rom存储器、eprom存储器、eeprom存储器、寄存器、硬盘、可移动磁盘、cd-rom或本领域中其它任意形式的存储媒介中。示例性地,存储媒介可以与处理器连接,以使得处理器可以从存储媒介中读取信息,并可以向存储媒介存写信息。可选地,存储媒介还可以集成到处理器中。处理器和存储媒介可以设置于asic中,asic可以设置于用户终端中。可选地,处理器和存储媒介也可以设置于用户终端中的不同的部件中。
198.在一个或多个示例性的设计中,本发明实施例所描述的上述功能可以在硬件、软件、固件或这三者的任意组合来实现。如果在软件中实现,这些功能可以存储与电脑可读的媒介上,或以一个或多个指令或代码形式传输于电脑可读的媒介上。电脑可读媒介包括电脑存储媒介和便于使得让电脑程序从一个地方转移到其它地方的通信媒介。存储媒介可以是任何通用或特殊电脑可以接入访问的可用媒体。例如,这样的电脑可读媒体可以包括但不限于ram、rom、eeprom、cd-rom或其它光盘存储、磁盘存储或其它磁性存储装置,或其它任何可以用于承载或存储以指令或数据结构和其它可被通用或特殊电脑、或通用或特殊处理器读取形式的程序代码的媒介。此外,任何连接都可以被适当地定义为电脑可读媒介,例如,如果软件是从一个网站站点、服务器或其它远程资源通过一个同轴电缆、光纤电缆、双绞线、数字用户线(dsl)或以例如红外、无线和微波等无线方式传输的也被包含在所定义的电脑可读媒介中。所述的碟片(disk)和磁盘(disc)包括压缩磁盘、镭射盘、光盘、dvd、软盘和蓝光光盘,磁盘通常以磁性复制数据,而碟片通常以激光进行光学复制数据。上述的组合也可以包含在电脑可读媒介中。
199.以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
技术特征:
1.一种基于prometheus的告警方法,其特征在于,由基于prometheus的告警装置执行,所述方法包括:从数据库中读取并加载所有告警规则;按预设时间间隔周期性地调用prometheus应用程序接口api执行所述告警规则,根据所述告警规则的执行情况更新告警状态,并且针对告警状态为已告警的告警规则生成对应的告警信息;在分布式告警系统提供的分布式资源锁的约束下,向预设的告警信息接收方发送所有告警信息,并将所述告警信息写入数据库;其中,在所述分布式告警系统中分布式部署有至少一个所述基于prometheus的告警装置;所述数据库由所述至少一个所述基于prometheus的告警装置共享访问;所述分布式资源锁用于在同一时间仅允许一个所述基于prometheus的告警装置发送所述告警信息。2.如权利要求1所述的基于prometheus的告警方法,其特征在于,所述从数据库中读取并加载所有告警规则,包括:从所述数据库中读取所有告警规则和各告警规则对应的告警规则标识;根据各告警规则对应的所述告警规则标识将所有告警规则划分到至少一个告警规则组。3.如权利要求2所述的基于prometheus的告警方法,其特征在于,所述根据各告警规则对应的所述告警规则标识将所有告警规则划分到至少一个告警规则组,包括:针对每个告警规则标识,将所述告警规则标识输入给hash散列算法得到所述告警规则标识对应的散列结果;将散列结果相同的告警规则标识对应的告警规则设置为同一个告警规则组。4.如权利要求2所述的基于prometheus的告警方法,其特征在于,所述方法还包括:从预设的告警规则管理api接收到针对指定告警规则的管理操作的情况下,根据所述管理操作更新所述数据库中的所述指定告警规则,并将所述指定告警规则的告警规则标识和所述管理操作的类型写入消息队列;从所述消息队列中读取所述指定告警规则的告警规则标识和所述管理操作的类型,并根据所述告警规则标识确定所述指定告警规则所在的告警规则组,根据所述管理操作的类型更新所述告警规则组中的所述指定告警规则;所述管理操作的类型包括:增加、删除、修改或查询;所述指定告警规则是所有所述告警规则中之一或者需要增加的告警规则。5.如权利要求1所述的基于prometheus的告警方法,其特征在于,所述方法还包括:当从预设的告警信息查询api接收到针对指定告警规则标识的告警信息查询操作时,从所述数据库中查询与所述指定告警规则标识对应的告警信息,并通过所述告警信息查询api返回所述告警信息。6.如权利要求1所述的基于prometheus的告警方法,其特征在于,所述方法还包括:当从预设的告警规则状态查询api接收到告警规则状态查询操作时,通过所述告警规则状态查询api返回最近一次调用prometheus api执行告警规则后得到的告警状态。7.如权利要求1所述的基于prometheus的告警方法,其特征在于,所述告警状态包括:不活跃的、待处理的、已告警、已暂停、错误。
8.一种基于prometheus的告警装置,其特征在于,包括:告警规则加载单元,用于从数据库中读取并加载所有告警规则;告警规则执行单元,用于按预设时间间隔周期性地调用prometheus应用程序接口api执行所述告警规则,根据所述告警规则的执行情况更新告警状态,并且针对告警状态为已告警的告警规则生成对应的告警信息;告警通知单元,用于在分布式告警系统提供的分布式资源锁的约束下,向预设的告警信息接收方发送所有告警信息,并将所述告警信息写入数据库;其中,在所述分布式告警系统中分布式部署有至少一个所述基于prometheus的告警装置;所述数据库由至少一个所述基于prometheus的告警装置共享访问;所述分布式资源锁用于在同一时间仅允许一个所述基于prometheus的告警装置发送所述告警信息。9.一种分布式告警系统,其特征在于,包括:数据库、prometheus服务器、分布式资源服务组件、和至少一个基于prometheus的告警装置;所述基于prometheus的告警装置从数据库中读取并加载所有告警规则;所述基于prometheus的告警装置按预设时间间隔周期性地调用prometheus服务器提供的prometheus应用程序接口api执行所述告警规则,根据所述告警规则的执行情况更新告警状态,并且针对告警状态为已告警的告警规则生成对应的告警信息;所述基于prometheus的告警装置在所述分布式资源服务组件提供的分布式资源锁的约束下,向预设的告警信息接收方发送所有告警信息,并将所述告警信息写入所述数据库;其中,所述告警规则预先保存在数据库中;至少一个所述基于prometheus的告警装置分布式部署在所述分布式告警系统中;所述数据库由至少一个所述基于prometheus的告警装置共享访问;所述分布式资源锁用于在同一时间仅允许一个所述基于prometheus的告警装置发送所述告警信息。10.如权利要求9所述的分布式告警系统,其特征在于,所述分布式资源服务组件为kubernetes系统;至少一个所述的基于prometheus的告警装置以分布式方式部署在所述kubernetes系统中;所述分布式资源锁由所述kubernetes系统中的lease租约机制实现。
技术总结
本发明实施例提供基于Prometheus的告警方法,包括:从数据库中读取并加载所有告警规则;按预设时间间隔周期性地调用Prometheus应用程序接口API执行所述告警规则,根据所述告警规则的执行情况更新告警状态,并且针对告警状态为已告警的告警规则生成对应的告警信息;在分布式告警系统提供的分布式资源锁的约束下,向预设的告警信息接收方发送所有告警信息,并将所述告警信息写入数据库。并将所述告警信息写入数据库。并将所述告警信息写入数据库。
技术研发人员:
贾永鹏
受保护的技术使用者:
新浪技术(中国)有限公司
技术研发日:
2022.11.18
技术公布日:
2023/3/3