巧用Flashcat“定时功能”监控大数据平台的任务超时
背景
近期和客户交流,客户的大数据团队有这样一个痛点: 客户当前使用的大数据平台,每天凌晨开始处理大数据任务,早晨算出报表供业务团队使用。
目前最大的痛点是,某个大数据子任务可能会由于某些原因,导致任务处理耗时过长(明显高于过去同环比),如果不及时介入处理,可能会造成报表延迟生产,从而影响业务团队。 但是目前在在该系统中,并没有能够体现任务超时的监控指标。
该系统的任务执行分为很多子任务,运行数据保存在 HANA 数据库中,在对应的数据表中,没有记录任务总体执行耗时,也没有记录每个子任务的执行耗时,只有每个子任务的执行状态字段,表示任务在进行中、未开始还是状态异常(注:可能存在任务耗时很久,但最终状态执行成功的情况,所以不能简单用状态异常来标识超时),无法用于告警。对异常任务状态做报警比较简单,本文不赘述,而能否能够及时监控到任务执行超时(超过了近期的平均耗时),从而及时干预,则是一个比较棘手的问题。
思考与实现
想要监控大数据任务是否超时,我们需要明确两个数据:
- 实时获取本次任务的执行时间;
- 获取历史任务的执行时间; 只有知道这两个数据,我们才能进行数值判断。
在Flashcat平台中,我们如何获取上述数据,进行告警呢?
- 获取本次任务的执行时间 目前Flashcat的采集器 Categraf ,已经支持 HANA 数据库监控插件,在可以监控 HANA 本身性能的同时,也支持对 HANA 普通表的数据,从而得到各个子任务的执行状态,得到如下的监控曲线:
上图中,hana_rspclogchain_analyzed_status_mapped
表示子任务的状态,标签chain_id
用来区分子任务。每分钟获取任务当前状态,状态值为1,表示任务正在进行,状态值为0,表示任务执行完成,所以,我们只要执行sum_over_time
, 就能获取该任务当天执行的分钟数。
sum_over_time
需要一个时间参数,即多长时间范围内的求和。这里根据实际情况,HANA各子任务理论上最长执行时间不会超过12h(因为大数据任务0点开始,第二天早上报表一定要生产出来),所以我们使用 sum(sum_over_time(hana_rspclogchain_analyzed_status_mapped [12h]) ) by (chain_id)
, 来表示各个子任务的执行时间。基于任务执行时间不会超过当天12点,因此该表达式计算得到的累计值肯定不包含前一天的执行时间。
- 获取历史任务的执行时间 这里比较直白的想法是,在每次任务执行完成的时间,记录一下本次任务的执行耗时,然后生成一个指标数据上报。但是目前没有哪个监控平台具备类似能力,用户只能自己去写脚本实现,通用性不强。 概括起来,实现的核心点在于: 在特定的时间(任务结束的时间),记录下本次任务的耗时;
在Flashcat中,我们可以利用记录规则,实现类似能力: 记录规则,类似Prometheus中的 recording rule, 将一些复杂的、经常需要的查询语句执行后,生成一个新的时序指标,用于后续的计算。在Flashcat中,我们更进一步,不仅可以周期执行记录规则,还可以定时执行记录规则,如下图所示:
结合大数据平台的实际情况,各个任务每天白天肯定会执行完成,所以我们每天只需要在23点前,定时执行 sum_over_time(sum(hana_rspclogchain_analyzed_status_mapped>0) by (chain_id) [24h])
, 即可以计算出,当天任务的执行耗时, 计算结果存入新指标hana_rspclogchain_average_duration .
效果
通过Flashcat的定时执行功能,我们获取各个子任务每天的执行耗时,如下图所示:
通过一定的计算方法,得出一个平均时间做为超时判断阈值(比如近5次的执行耗时,去掉一个最大值,再求平均)。
最终,配置任务超时的报警规则如下: (sum_over_time(sum(hana_rspclogchain_analyzed_status_mapped{}) by (chain_id)[12h]) / hana_rspclogchain_average_duration) >1.3
其中:
hana_rspclogchain_average_duration
表示任务的平均执行时间;>1.3
表示超时30%时触发报警;
报警触发后,通过Flashduty发送到大数据的值班同学。 目前该团队已经通过这个Flashcat的监控技巧,完善了相关任务类型的告警覆盖,实现了问题的及时干预,避免报表延迟。
后话
在监控的典型场景中,一般都是“周期性”的情况,比如周期性的采集指标,周期性的执行报警规则等等。但是“定时”类型的监控能力,在很多场景下也有用武之地,比如批处理任务类型,甚至是在某些行业中,都需要“定时”类型的功能才能满足告警。 目前Flashcat已经在支持了“定时的执行数据采集”、“定时的执行记录规则”、“定时的执行报警策略”等,满足各类业务场景。