Flink 自定义 Failure Enricher:把失败“打标签”,让告警、归因、统计更聪明

1、它解决什么问题?

FailureEnricher 的典型用途:

  • 故障分类/归因 :给失败贴上 type=Systemtype=Usercomponent=Kafkareason=AuthFailed 等标签
  • 告警路由:不同标签推送到不同 oncall(平台组/业务组/中间件组)
  • 可观测性增强:把标签送到外部系统(Prometheus/OTel/自研平台)做统计报表
  • 联动通知 :在 processFailure() 里调用外部通知系统(注意:建议异步且要兜底超时)

触发时机:

  • 每次 JobManager 在运行时收到异常报告时都会触发 FailureEnrichers
  • Enricher 可以 异步 返回 labels(CompletableFuture<Map<String,String>>

2、插件结构与加载方式(重点)

2.1 你要实现的 3 件事

  1. 实现 FailureEnricher
  2. 实现 FailureEnricherFactory
  3. 使用 Java SPI 注册工厂:
    META-INF/services/org.apache.flink.core.failure.FailureEnricherFactory

然后把 jar 放到 Flink plugins/ 下的某个目录,例如:

text 复制代码
$FLINK_HOME/plugins/
  failure-enrichment/
    my-failure-enricher.jar

2.2 关键约束:output keys 必须唯一

每个 FailureEnricher 都要声明自己可能输出的 key 集合(getOutputKeys())。
所有 enrichers 的 key 集合必须互不重叠 ,否则有重叠 key 的 enrichers 会被忽略 (直接不生效)。

实践建议:统一加前缀,例如 fe.org.

  • fe.type
  • fe.component
  • fe.owner
  • fe.ticket

3、最小可用示例(可直接改成你们的规则)

3.1 Factory

java 复制代码
public class CustomFailureEnricherFactory implements FailureEnricherFactory {
   @Override
   public FailureEnricher createFailureEnricher(Configuration conf) {
        return new CustomEnricher(conf);
   }
}

3.2 Enricher(示例:按异常类型简单分类)

java 复制代码
public class CustomEnricher implements FailureEnricher {
    private final Set<String> outputKeys;

    public CustomEnricher(Configuration conf) {
        this.outputKeys = Set.of("fe.type", "fe.component");
    }

    @Override
    public Set<String> getOutputKeys() {
        return outputKeys;
    }

    @Override
    public CompletableFuture<Map<String, String>> processFailure(Throwable cause, Context context) {
        return CompletableFuture.supplyAsync(() -> {
            Map<String, String> labels = new HashMap<>();

            String msg = String.valueOf(cause.getMessage());
            labels.put("fe.type", "System");

            if (msg.contains("org.apache.kafka") || msg.contains("Sasl") || msg.contains("Kafka")) {
                labels.put("fe.component", "Kafka");
            } else if (msg.contains("org.apache.hadoop") || msg.contains("hdfs")) {
                labels.put("fe.component", "HDFS");
            } else {
                labels.put("fe.component", "Unknown");
            }

            return labels;
        });
    }
}

生产建议:这里的异步线程池别用默认 ForkJoinPool,最好用你自己可控的 executor,并设置超时/熔断,避免 enrichment 本身成为压力源。

3.3 SPI 文件内容

文件路径:

text 复制代码
META-INF/services/org.apache.flink.core.failure.FailureEnricherFactory

文件内容(一行一个工厂类名):

text 复制代码
com.yourcompany.flink.failure.CustomFailureEnricherFactory

4、配置:不配就不会启动

JobManager 启动时加载 FailureEnricher 插件,但 是否启用由配置决定:

properties 复制代码
jobmanager.failure-enrichers = com.yourcompany.flink.failure.CustomEnricher

注意点:

  • 如果 jobmanager.failure-enrichers 为空:不会启动任何 enricher
  • 配置的是 FailureEnricher 的类名(按你给的示例是这样写的),确保与实际类一致

5、如何验证它是否生效?

5.1 看 JobManager 日志

启动时会出现类似日志:

text 复制代码
Found failure enricher com.xxx.CustomEnricher at jar:file:/path/to/flink/plugins/failure-enrichment/xxx.jar!/...

5.2 看 REST API 输出的 failureLabels

从 JobManager REST API 查询时,会出现:

json 复制代码
"failureLabels": {
  "fe.type": "System",
  "fe.component": "Kafka"
}

你们可以用这个字段做:

  • 告警系统的规则匹配
  • 失败原因的聚合统计(按 label 分组)
  • 自助排障页的"失败类型"展示

6、生产落地建议(少踩坑)

  • label key 规范化:统一前缀 + 固定枚举值,避免团队各写各的导致不可聚合
  • 异步要可控:线程池、超时、异常兜底(enricher 失败不应影响主流程)
  • 避免重 IO/外部依赖:如要调用外部系统,务必做熔断/缓存/降级(否则故障时雪上加霜)
  • 和 Metrics/Event/Trace 打通 :failureLabels 很适合与 structured logging 的 flink-job-id 一起作为关联维度
相关推荐
建筑工程企业管理系统2 小时前
工程计划管理软件能解决工期延误问题吗?施工节点数字化管控实操解读
大数据·软件工程·软件需求
AI推荐率9 小时前
想让AI在选购问题中推荐品牌,应该找什么类型的服务商?
大数据·人工智能·microsoft
浅思科技集9 小时前
工业生产运营软件如何选择?看端到端可见性、数据贯通与AI落地
大数据·人工智能
浅念-10 小时前
一文吃透Git:本地操作|冲突处理|远程协作|GitFlow工作流详解
大数据·git·elasticsearch·搜索引擎·gitflow
葫三生10 小时前
《论三生原理》神话学构想与“神话历史”理论、《古史中的神话》思路异同?
大数据·人工智能·科技·深度学习·算法
国科安芯10 小时前
星链供电架构中的高集成度电源管理方案研究——基于ASP4644四通道降压稳压器在低轨卫星星座中的应用分析
大数据·单片机·嵌入式硬件·架构·低轨卫星·星间链路
小王毕业啦10 小时前
2011-2024年 各地级市养老服务信息面板数据 xlsx
大数据·人工智能·数据挖掘·数据分析·社科数据·实证分析·经管数据
ailsa_hui11 小时前
对于医疗器械行业,鼎捷的ERP有成熟的行业解决方案和合规性支持吗?
大数据
资讯综合12 小时前
500亿招聘市场悖论:AI技术能否填平行业的信任深坑
大数据·人工智能
百胜软件@百胜软件13 小时前
胜券AI的Skills可插拔技能包,让零售AI从“泛”到“专”
大数据·人工智能·零售