最近在做一个flink程序的监控,技术选型以后最终选择将flink指标通过pushgateway来写道prometheus中,程序架构如下:
JobManager和TaskManager进程都独立将指标push给PushGateway,然后Prometheus再定时去抓去PushGateway中指标,指标进Prometheus以后再通过grafana配置监控图。
flink配置参数如下:
metrics.reporter.promgateway.class: "org.apache.flink.metrics.prometheus.PrometheusPushGatewayReporter"
metrics.reporter.promgateway.host: "pushgateway"
metrics.reporter.promgateway.port: "9091"
metrics.reporter.promgateway.jobName: "jobName"
metrics.reporter.promgateway.randomJobNameSuffix: "false"
metrics.reporter.promgateway.deleteOnShutdown: "true"
metrics.reporter.promgateway.interval: "10 SECONDS"
metrics.reporter.promgateway.groupingKey: "instanceId=1"
其中flink默认的randomJobNameSuffix为true flink会在jobName后拼接一个32位长度的字符串,具体源码见
org.apache.flink.metrics.prometheus.PrometheusPushGatewayReporterFactory#createMetricReporter
由于配置监控图时候需要用到jobName所以就将该属性改为false了,刚改完以后看pushgateway那边以及grafana感觉没啥问题,后来发现很多指标莫名其妙断断续续的,自己将两个指标放到一起观察才发现问题,如下图:
基本上JobManager和TaskManager图是互补的,两个图中的数据加起来才是完整的,为了验证这个猜测拿grafana将指标放一起,取最近几分钟数据观察一下:
图中每一个点之间间隔是15s,更加确定了上述猜想,即同一时刻多个进程写到PushGateway中的数据是互相覆盖掉的,查找PushGateway相关文档以后才知道在JobName和GroupingKey完全一样的情况下会出现这样的问题,这会才知道为啥Flink要提供randomJobNameSuffix这个参数,并且默认为true了。
所以最终结局办法就是将metrics.reporter.promgateway.randomJobNameSuffix参数改为true,然后查询的地方通过metrics.reporter.promgateway.groupingKey中的instanceId来查询。