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;
}
}