1 介绍
aodh是openstack监控服务(Telemetry)下的一个模块,telemetry下还有一个模块ceilometer
OpenStack Docs: 2024.1 Administrator Guides
Get Started on the Open Source Cloud Platform - OpenStack
Telemetry - OpenStack
1.1 代码仓
博客总结基于zed分支展开(版本15.X)
代码仓可以从openstasck代码仓或github下载
openstack/aodh: OpenStack Telemetry (Ceilometer) Alarming - aodh - OpenDev: Free Software Needs Free Tools
1.2 结构
主要三个部分:aodh-notifier, aodh-evaluator, aodh-listener,这三个会以进程形式一直处理告警,其他console_scripts下的东西类似于命令行,执行结束就完了
每个部分都看下
2 aodh-evaluator
作用 周期评估告警
2.1 评估告警
从入口函数进入,执行aodh.cmd.alarm.evaluator函数,该函数会创建aodh-evaluator逻辑类(即aodh-evaluator主要逻辑封装到一个类里)aodh.evaluator.AlarmEvaluationService的实例
aodh-evaluator业务主要逻辑在实例的初始化里,实例化过程中,会创定时任务,然后启动定时任务,定时任务会周期查db的告警和系统指标,去评估指标是否超过告警里的阈值,如果超过阈值则按一定规则上报给aodh-notifier
告警阈值通过查db得到,即先从db查告警,然后从查询结果获取阈值对应的字段作为阈值,用阈值去评估告警
待评估的数据(告警)也通过查询获取,查询具体动作由插件实现,调插件的evaluate方法。每个插件查询待评估数据的方法都可能不同,无法统一看。比如gnocchi就是在插件里调client去查数据然后和告警阈值评估
评估告警后发送告警业务逻辑也在相同插件里实现,插件列表如下
2.2 发送告警
如果评估需要发送告警,则根据情况先修改db的告警定义状态,然后组装告警数据,上报上去,最后上报到notifier_topic队列,默认值是alarming
3 aodh-notifier
主要逻辑为监听aodh-evaluator发送的告警,然后监听发送告警所在队列,如果监测到告警则交给处理函数处理,处理后发送出去
主要逻辑封装在一个类里,服务启动时,py脚本会创建该类的实例,实例创建完成,则业务主要逻辑也创建完成
3.1 监听告警
监听发送告警所在队列逻辑在类初始化里完成,监听队列名从conf.notifier_topic获取,默认为alarming
3.2 处理告警
处理告警通过插件实现,插件定义在setup.cfg里,插件通过stevedore.extension模块被加载,加载后被封装到AlarmEndpoint里,然后在创建实例时实现监听告警逻辑时同时提供插件,当监听到告警时直接调用插件里的接口notify方法对告警处理
插件定义
aodh-notifier接受到告警后,进行怎样的告警处理依赖于aodh-evaluator发送告警时调用的方法。处理告警执行的类方法与告警发送时调用的方法名应该一致
3.3 发送告警
处理完告警会继续将告警发给下一环,下一环可以是用户自定义的处理目标,通过url请求发送告警,url地址通常在aodh-evaluator发送评估后告警的结构体中包含,aodh-notifier发告警时直接从告警里取出目标url,然后将告警发出去
4 aodh-listener
主要逻辑也是监听告警(队列),然后处理告警,主要处理event类型告警
监听队列名为conf的event_alarn_topic的值,默认为alarm.all
4.1 监听告警
4.2 处理告警
处理告警逻辑封装在EventAlarmEndpoint里,endpoint函数处理告警时直接调用函数入参的evaluate_events方法实现
从发送的告警结构体里获取告警的tenant_id或alarm_id,然后从数据库查在这个tenant_id或alarm_id下enabled的event类型告警,查到以后,遍历查到的每个告警,然后评估告警并发送告警
注意,此处数据库里查到的告警是告警定义,目的是为了从查db获取的告警结构体里获取阈值,将该阈值和监听到的event的字段比较来具体评估是否要上报告警
4.3 发送与上报告警
当当前评估周期会发告警时,还会和上一个评估周期比较
如果上评估周期无告警本周期有告警,则先在db改告警状态为有告警,再notify上报本告警
如果上评估周期有告警本周期有告警则直接notify上报本告警,无需更新db告警状态
最后发送告警到notifier_topic队列,默认值alarming