1. Reporter 是怎么工作的在flink-conf.yaml配置metrics.reporters指定启用哪些 reporter每个 reporter 都要配置metrics.reporter.name.factory.classPush 型 reporter 还可以配置metrics.reporter.name.interval以控制上报周期Reporter jar 必须在 Flink 启动时可见Reporter以插件方式加载Flink 文档中的 reporter 通常默认可用2. 两个关键维度Identifier vs TagsPush vs Pull2.1 Identifier-based标识符型把 scope 信息和指标名拼成一个扁平字符串例如job.MyJobName.numRestarts典型Graphite、StatsD、Slf4j偏 identifier2.2 Tag-based标签型把“逻辑指标类”与“实例标签”分开例如逻辑指标job.numRestarts标签jobNameMyJobName典型Prometheus、InfluxDB、Datadog偏 tags2.3 Push vs PullPushReporter 定期主动发给外部系统需要 intervalPull外部系统来抓取/查询Prometheus/JMX 常见3. 通用配置参数所有 reporter 都能用的那套配置格式统一为metrics.reporter.reporter_name.property通用 Key最常用的几项factory.class必配指定 ReporterFactoryinterval默认 10s仅 Push 型生效scope.delimiter拼接 metric identifier 的分隔符默认.scope.variables.additional给 tag 型 reporter 增加额外标签mapscope.variables.excludes排除某些变量tag 型filter.includes/filter.excludes指标过滤强烈建议用来控量3.1 多 reporter 并存示例metrics.reporters:my_jmx_reporter,my_other_reportermetrics.reporter.my_jmx_reporter.factory.class:org.apache.flink.metrics.jmx.JMXReporterFactorymetrics.reporter.my_jmx_reporter.port:9020-9040metrics.reporter.my_other_reporter.factory.class:org.apache.flink.metrics.graphite.GraphiteReporterFactorymetrics.reporter.my_other_reporter.host:192.168.1.1metrics.reporter.my_other_reporter.port:100004. 过滤器filter.includes/excludes写对了能省一大半成本过滤器格式一个字符串就是一个 filterscope[:name[,name][:type[,type]]]scope逻辑范围用.分段*通配name指标名模式逗号分隔*通配type指标类型counter,meter,gauge,histogram匹配规则一个指标命中 filter 需要同时满足scope 匹配name 至少一个模式匹配type 至少一个类型匹配4.1 常见例子你直接拿去改全局匹配某类指标名metrics.reporter.prom.filter.includes:*:numRecords*只要 operator 层的 numRecords 指标metrics.reporter.prom.filter.includes:*.job.task.operator:numRecords*只要 operator 层的 meter如 numRecordsInPerSecondmetrics.reporter.prom.filter.includes:*.job.task.operator:numRecords*:meter只要 Records/Bytes 相关的 counter metermetrics.reporter.prom.filter.includes:*:*Records*,*Bytes*:counter,meter生产建议Prometheus/Datadog/InfluxDB 这类 tags 报表很容易“标签爆炸”务必用过滤器控制输出范围否则指标量和成本会快速失控。5. 常用 Reporter 配置模板与注意点下面把文档里几个最常用的 reporter 配置按“可直接复制”方式整理出来。5.1 JMXpull / tags适合 JVM 生态排障、用 JConsole/JMC 或被采集系统抓取。metrics.reporter.jmx.factory.class:org.apache.flink.metrics.jmx.JMXReporterFactorymetrics.reporter.jmx.port:9250-9260建议用端口范围同一台机器上可能同时有 JM/TM避免端口冲突实际绑定端口会在日志里打印。5.2 Prometheuspull / tags最常用的云原生采集方式。metrics.reporter.prom.factory.class:org.apache.flink.metrics.prometheus.PrometheusReporterFactorymetrics.reporter.prom.port:9250-9260# 可选标签值字符过滤默认 true# metrics.reporter.prom.filterLabelValueCharacters: true类型映射注意点很实用Flink Counter → Prometheus Gauge因为 Prometheus counter 不允许递减Histogram → Summary带固定 quantilesMeter → Gauge输出 rate5.3 Prometheus PushGatewaypush / tags适合“短生命周期任务”或无法被 Prometheus 直连抓取的环境。metrics.reporter.promgateway.factory.class:org.apache.flink.metrics.prometheus.PrometheusPushGatewayReporterFactorymetrics.reporter.promgateway.hostUrl:http://localhost:9091metrics.reporter.promgateway.jobName:myJobmetrics.reporter.promgateway.randomJobNameSuffix:truemetrics.reporter.promgateway.deleteOnShutdown:falsemetrics.reporter.promgateway.groupingKey:k1v1;k2v2metrics.reporter.promgateway.interval:60 SECONDS5.4 InfluxDBpush / tags适合时序库落库分析。metrics.reporter.influxdb.factory.class:org.apache.flink.metrics.influxdb.InfluxdbReporterFactorymetrics.reporter.influxdb.scheme:httpmetrics.reporter.influxdb.host:localhostmetrics.reporter.influxdb.port:8086metrics.reporter.influxdb.db:flinkmetrics.reporter.influxdb.username:flink-metricsmetrics.reporter.influxdb.password:qwertymetrics.reporter.influxdb.retentionPolicy:one_hourmetrics.reporter.influxdb.consistency:ANYmetrics.reporter.influxdb.connectTimeout:60000metrics.reporter.influxdb.writeTimeout:60000metrics.reporter.influxdb.interval:60 SECONDS5.5 Graphitepush / identifiermetrics.reporter.grph.factory.class:org.apache.flink.metrics.graphite.GraphiteReporterFactorymetrics.reporter.grph.host:localhostmetrics.reporter.grph.port:2003metrics.reporter.grph.protocol:TCPmetrics.reporter.grph.interval:60 SECONDS5.6 StatsDpush / identifiermetrics.reporter.stsd.factory.class:org.apache.flink.metrics.statsd.StatsDReporterFactorymetrics.reporter.stsd.host:localhostmetrics.reporter.stsd.port:8125metrics.reporter.stsd.interval:60 SECONDS5.7 Datadogpush / tags兼有 identifierDatadog 会把 host/job_name/tm_id/subtask_index/task_name/operator_name 等作为 tags 上报。metrics.reporter.dghttp.factory.class:org.apache.flink.metrics.datadog.DatadogHttpReporterFactorymetrics.reporter.dghttp.apikey:xxxmetrics.reporter.dghttp.proxyHost:my.web.proxy.commetrics.reporter.dghttp.proxyPort:8080metrics.reporter.dghttp.dataCenter:USmetrics.reporter.dghttp.maxMetricsPerRequest:2000metrics.reporter.dghttp.interval:60 SECONDSmetrics.reporter.dghttp.useLogicalIdentifier:true注意Histogram 会以一组 gauge 的形式上报如metric.aggregation并且聚合并非基于每个上报周期重新计算的那种“区间聚合”理解这一点很重要。5.8 OpenTelemetryOtel适合统一接入观测体系Collector → 多后端。metrics.reporter.otel.factory.class:org.apache.flink.metrics.otel.OpenTelemetryMetricReporterFactorymetrics.reporter.otel.exporter.endpoint:http://127.0.0.1:1337metrics.reporter.otel.exporter.protocol:gRPC# 可选# metrics.reporter.otel.exporter.timeout: 10s# metrics.reporter.otel.service.name: flink# metrics.reporter.otel.service.version: 1.0.0HTTP 协议的写法metrics.reporter.otel.factory.class:org.apache.flink.metrics.otel.OpenTelemetryMetricReporterFactorymetrics.reporter.otel.exporter.endpoint:http://127.0.0.1:9090metrics.reporter.otel.exporter.protocol:HTTP5.9 Slf4jpush / identifier适合调试或小规模环境不建议大集群长期打开日志量会爆。metrics.reporter.slf4j.factory.class:org.apache.flink.metrics.slf4j.Slf4jReporterFactorymetrics.reporter.slf4j.interval:60 SECONDS6. 自定义 Reporter两条接口要点实现org.apache.flink.metrics.reporter.MetricReporter如果要定期上报实现Scheduled接口report()方法不要长时间阻塞耗时操作建议异步化再实现MetricReporterFactory就能以插件方式加载也更符合 Flink 插件隔离机制7. 一套“生产默认建议”不引战但很实用云原生/K8s优先 Prometheuspull/tags端口用范围配 filter 控量需要落库分析InfluxDB/Otel → 统一收敛遗留体系Graphite/StatsD 仍可用但 identifier 模式要注意命名层级规划任何 tags 系统谨防标签爆炸scope.variables filter 是关键