flink reporter

326 阅读1分钟

Flink支持用户自定义一些监控指标,并支持对这些指标上报到用户自己的接收服务。 可以参考官方文档:Metric Reporter

错误实践

开始按照文档书写了Reporter的类并且实现了org.apache.flink.metrics.reporter.MetricReporter接口,如果需要周期性执行的话还需要实现org.apache.flink.metrics.reporter.Scheduled接口。 在此之外配置了conf.flink-conf.yaml文件,如下:

metrics.reporters: cts_reporter
metrics.reporter.cts_reporter.class: com.dibu.metric.StreamMetricReporter
metrics.reporter.cts_reporter.interval: 10 SECONDS

问题出在这里,我认为这个配置任务是配置在代码中即Jar中,然后伴随jar执行后启动,所以我把这个文件配置在了代码的resources目录下。导致实际执行的过程中一致不起作用,reporter未生效。

修正方案

这里reporter的实际执行是在flink集群启动时候就开始执行的,所以这里需要把conf.flink-conf.yaml配置文件配置的内容放在flink集群的$FLINK_HOME/conf/flink-conf.yaml中。

另外一点就是reporter所在的jar,需要提前放置在$FLINK_HOME/lib下,否则在集群启动的时候回找不到对应的reporter类。

这里可以直接继承org.apache.flink.metrics.reporter.AbstractReporter类,来省略掉固定无味的notify方法代码。

public class StreamMetricReporter extends AbstractReporter implements Scheduled {

    private static final Logger log = LoggerFactory.getLogger(StreamMetricReporter.class);

    private final IMonitorService<List<?>> monitorService = new CtsDBReporter();

    @Override
    public void open(MetricConfig metricConfig) {
        String string = metricConfig.getString("name", "de");
        log.info("StreamMetricReporter init:{}", string);
    }

    @Override
    public void close() {
        log.info("StreamMetricReporter close");
    }

    @Override
    public void report() {
        log.info("reporter report");
    }

    @Override
    public String filterCharacters(String input) {
        return input;
    }
}