我这里的指标是用Prometheus jmx_exporter导出的,具体如何使用见:https://github.com/prometheus/jmx_exporter
jvm通用的指标这里就不列了,重点梳理一下azkaban扩展的metrics
azkaban-web:
指标 | 含义 | 详细释义 |
---|---|---|
azkaban_jmx_jmxexecutormanager_executormanager_numrunningflows | 正在运行的flow数 | 对于azkaban-web来说,每个任务对应一个配置的flow,每个flow都可以包含多个job;azkaban-web只负责调度,实际的job执行由azkaban-exec执行 |
azkaban_jmx_jmxexecutormanager_executormanager_lastsuccessfulexecutorinforefresh | 最近executorinfo刷新时间 | azkaban-web会定期调用azkaban-exec接口查询节点最新的状态信息,并保存在内存中,这里是记录最近一次的时间 |
azkaban_jmx_jmxexecutormanager_executormanager_lastthreadchecktime | executormanager检测线程最近更新时间 | executormanager有一个专门的线程,每隔一段时间(2s或200ms,取决于是否有运行中的executors),执行一次updateExecutions操作。updateExecutions主要流程是调azkaban-exec的api接口,查询运行中flow的信息,并把最新的flow信息缓存在内存中 |
azkaban_jmx_jmxexecutormanager_executormanager_threadactive | executormanager检测线程是否活跃 | 直接调用的Thread.isAlive()方法,用来判断线程是否开始工作,并且没有挂掉 |
azkaban_jmx_jmxexecutormanager_executormanager_queueprocessoractive | executormanager队列处理线程是否活跃 | 直接调用的Thread.isAlive()方法;azkaban-web push模式下,flow的执行流程是:先把flow执行信息放入一个队列中,然后有个队列处理线程从队列中拉取flow信息并调用对应的azkaban-exec的api接口真正提交任务。如果这个队列处理线程出问题,那azkaban就没法进行任务提交了(正常来说这里不应该有问题,但是如果代码哪里没有处理好异常之类的,这个线程挂掉也是有可能的,这时候只能通过重启来解决) |
azkaban_jmx_jmxtriggermanager_triggermanager_lastrunnerthreadchecktime | trigger扫描线程最近运行时间 | 首先说一下什么是Trigger,azkaban配置的每个定时任务都是一个Trigger缓存在内存中,任务的执行就是由Trigger来触发的。triggermanager有个扫描线程,默认每隔60s(参数trigger.scan.interval)执行一次,会遍历所有的Trigger,并执行对应的操作(触发定时任务执行、trigger过期移除等) |
azkaban_jmx_jmxtriggermanager_triggermanager_numtriggers | trigger数量 | 对应的是页面中配置的定时任务数量 |
azkaban_jmx_jmxtriggermanager_triggermanager_runnerthreadactive | trigger扫描线程是否活跃 | 直接调用的Thread.isAlive()方法 |
azkaban_jmx_jmxtriggermanager_triggermanager_scanneridletime | trigger扫描线程空闲等待时间 | scanneridletime = scannerInterval(默认60s) - (当前时间-lastRunnerThreadCheckTime)扫描线程每次执行完扫描处理逻辑,会按这个公式计算应该wait多长时间,通过这个保证没两次执行之间的间隔为scanneridletime(60s) |
azkaban-exec:
指标 | 含义 | 详细释义 |
---|---|---|
azkaban_execapp_jmx_jmxflowrunnermanager_flowrunnermanager_numrunningflows | 正在运行的flow数量 | azkaban一个flow由多个job组成,一般从人的角度来说,习惯把一个flow叫做一个任务,但是从azkaban-exec角度来说,job才是实际执行的“任务” |
azkaban_execapp_jmx_jmxflowrunnermanager_flowrunnermanager_totalnumexecutedflows | 执行的总flow数量 | 通过总数,可以计算过去某段时间的执行flow数 |
azkaban_execapp_jmx_jmxjobmbeanmanager_jobjmxmbean_numrunningjobs | 正在运行的job数量 | |
azkaban_execapp_jmx_jmxjobmbeanmanager_jobjmxmbean_totalnumexecutedjobs | 执行的总job数量 | 通过总数,可以计算过去某段时间的执行job数 |
azkaban_execapp_jmx_jmxjobmbeanmanager_jobjmxmbean_totalsucceededjobs | 执行成功的job总数 | |
azkaban_execapp_jmx_jmxjobmbeanmanager_jobjmxmbean_totalsucceededjobsbyjobtype | 执行成功的job总数(按job类型过滤),类型有javaprocess、command | job的jobType有多种,我们用的主要是java进程和执行shell命令(主要是这种).关于jobType的介绍:https://azkaban.readthedocs.io/en/latest/jobTypes.html |
azkaban_execapp_jmx_jmxjobmbeanmanager_jobjmxmbean_totalfailedjobs | 运行失败的总的job数 | |
azkaban_execapp_jmx_jmxjobmbeanmanager_jobjmxmbean_totalfailedjobsbyjobtype | 运行失败的job总数(按job类型过滤),类型有javaprocess、command | |
azkaban_execapp_jmx_jmxflowrunnermanager_flowrunnermanager_executorthreadpoolshutdown | flowrunner线程池是否关闭,1:关闭,0:未关闭 | azkaban-exec执行flow是通过线程池来提交任务执行的,如果线程池异常关闭,就会导致无法提交任务 |
azkaban_execapp_jmx_jmxflowrunnermanager_flowrunnermanager_maxnumrunningflows | 最大同时执行flow数量 | 其实就是线程池最大线程数(等于核心线程数 |
azkaban_execapp_jmx_jmxflowrunnermanager_flowrunnermanager_numqueuedflows | flowrunner线程池队列中当前的flow数 | 如果队列中的flow较多,可能是azkaban-exec的负载较高,导致任务堆积在队列中 |
azkaban_execapp_jmx_jmxflowrunnermanager_flowrunnermanager_maxqueuedflows | flowrunner线程池队列大小 | 默认使用的无界队列,这种情况下这个值没有意义,返回-1;要配置executor.use.bounded.threadpool.queue=true,才会使用有界队列,这时可以通过executor.threadpool.workqueue.size配置来调整队列的大小,没有配置则默认等于线程池核心线程数(30) |
azkaban_execapp_jmx_jmxflowrunnermanager_flowrunnermanager_lastcleanerthreadchecktime | flowrunner manager清理线程最近执行时间 | flowrunner有一个清理线程,每分钟执行一次,执行逻辑主要有两个:1、每2分钟触发一次清理最近完成flow操作,从最近完成的flow map中移除flow信息。flow完成的时候,会把这个flow缓存到一个Map中,之所以要缓存,是因为azkaban会定时来查询flow信息,对于刚刚完成的flow,要可以查询到,但是这个信息也不能无限期的缓存,至少保留1分钟后进行清理;2、如果有配置flow最大执行时间(azkaban.server.flow.max.running.minutes),则每5分钟触发一次kill执行时间过长的任务; |
azkaban_execapp_jmx_jmxflowrunnermanager_flowrunnermanager_cleanerthreadactive | flowrunner manager清理线程是否存活 | 直接调Thread.isAlive()方法 |
azkaban_execapp_jmx_jmxjobcallback_jobcallbackjmxmbean_numsuccessfuljobcallbacks | job回调http请求成功次数 | azkaban-exec的job执行有个回调机制,在任务执行成功或失败时,通过回调机制可以调用外部接口来通知任务执行情况。外部接口调用使用的httpclient这个类库的FutureRequestExecutionService.execute()方法,FutureRequestExecutionService内置有一个FutureRequestExecutionMetrics,提供对http请求的指标统计。 |
zkaban_execapp_jmx_jmxjobcallback_jobcallbackjmxmbean_numfailedjobcallbacks | job回调http请求失败次数 | |
azkaban_execapp_jmx_jmxjobcallback_jobcallbackjmxmbean_numactivejobcallbacks | job回调http请求连接活跃数 | |
azkaban_execapp_jmx_jmxjobcallback_jobcallbackjmxmbean_numjobcallbacks | job回调http请求次数 |