Skip to content

JIUW5/obAlert

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 

Repository files navigation

告警治理平台可行方案与详细设计 对标 Flashduty

执行摘要

本报告给出“自研一套告警治理平台(对标 Flashduty)”的可行方案与详细设计,结论为:可行,但应以“事件化内核 + 可插拔集成 + 强约束一致性/可审计”作为主线,并以阶段化交付控制复杂度与风险。Flashduty 的公开资料体现了典型 On-Call 告警管理能力:多源告警统一接入、智能降噪(聚合/抑制/去重)、动态路由与多级升级、排班、触达、以及分析看板与开发者接口(Open API、Event API、Webhook)。citeturn0search0turn0search19turn9search13turn0search1turn0search8

对标这些能力并自行实现时,真正的难点不在“收告警/发消息”,而在“降噪与路由的正确性、幂等与一致性、以及全链路可观测与审计可追溯”。Flashduty 在其 Event API 文档中明确提到“事件层面去重 + 告警层面状态/描述一致时丢弃 + 规则丢弃/抑制/静默”的多层降噪思路,这类设计对大规模噪音治理非常关键。citeturn9search4

建议的总体方案是:以事件总线驱动的告警/故障(Incident)内核为中心,构建“接入 → 规范化 → 去噪/聚合/抑制/抖动处理 → 路由/分派 → 通知/升级 → 生命周期与审计 → 指标与可视化”的闭环;内部事件采用 CloudEvents 形式统一封装(利于幂等与可追踪),关键状态以关系型数据库为事实源(SoR),高吞吐历史与分析数据进入列式/时序库,通知与自动化以可插拔渠道实现。citeturn3search0turn3search36turn4search2turn15search2

在基础设施与一致性方面,推荐默认采用:Kafka 作为消息总线(事务/幂等能力更强)+ PostgreSQL 作为配置与状态事实源(可用 RLS 做多租户纵深隔离)+ ClickHouse/TimescaleDB 作为分析型存储 + Outbox/Inbox 保证“写库与发事件”的一致性与幂等。Kafka 的事务与幂等生产能力、以及“通过 producer 的事务性提交 consumer offset 来实现整体 exactly-once 行为”的设计,在事件驱动系统中非常适合构建“至少一次投递 + 幂等处理”的工程闭环。citeturn7search8turn7search13turn7search35turn4search9turn4search13

目标与范围

本节定义平台目标边界、核心功能范围与“未指定”项。未在本报告中明确约束的功能,按需求说明视为无特定约束

总体目标:建设一套面向 DevOps/SRE/运维团队的告警治理平台,实现多源告警统一收敛、降噪与协同处置,并提供可审计、可度量、可持续优化的告警管理能力。Flashduty 对外描述的“降噪、值班、分派、升级、触达”能力可以作为对标的北极星指标集合。citeturn0search19turn0search0

核心功能范围(明确实现)

  • 告警接入:HTTP/HTTPS Webhook、事件上报 API(Event API 风格)、以及主流监控系统适配器(如 Prometheus Alertmanager Webhook 兼容格式)。Flashduty 文档体现其可通过标准 API 推送告警事件与变更事件,并提供 Webhook 将告警/故障变化推送到第三方系统。citeturn9search8turn9search4turn9search0turn0search1turn0search8
  • 去噪/聚合:事件去重、告警聚合、抑制(依赖告警存在进行抑制)、静默(基于匹配条件与时间窗)、风暴预警/限流、抖动(flapping)治理。Prometheus Alertmanager 的“去重、分组、路由、静默与抑制”概念是成熟参考。citeturn0search3turn11search2turn9search6turn12view0turn13view0
  • 路由/分配:基于标签/属性匹配的路由树(支持 continue 语义与兜底),以及到“协作空间/团队/服务”的归属规则。Alertmanager 的路由树概念(首个匹配节点、continue 控制继续匹配)值得复用。citeturn13view2
  • 通知/升级:多渠道通知(IM、短信、电话、邮件等)与多级升级链;参考 Grafana OnCall 的“routes + escalation chains”与示例流程。citeturn0search2turn11search8turn11search5turn0search6
  • 告警生命周期管理:告警(Alert)与故障/事件(Incident)双对象模型;支持 ack、unack、snooze、resolve、reopen、merge、reassign 等动作。Flashduty 的告警/故障 Webhook 事件类型表明其对这些动作做了事件化抽象,便于审计与自动化。citeturn0search8
  • SLA/指标:MTTA/MTTR、降噪比例、触达成功率、升级命中率、重复告警比例、静默命中率、处理漏单率等。Flashduty 的“分析看板”与 MTTx 等指标实践可参考。citeturn1view0turn2view1
  • 审计与可视化:全量操作审计(谁在何时对哪个对象做了什么)、告警/故障时间线、路由与通知链路可解释性(why this route / why this escalation)。citeturn0search1turn0search8
  • 多租户/权限:租户隔离、组织/团队/协作空间维度权限、细粒度对象级鉴权;建议采用 OIDC 登录 + 内部 RBAC/ABAC + 审计。Keycloak 支持基于 OpenID Connect、OAuth2、SAML 的 SSO,可作为自建 IdP。citeturn3search10turn3search2turn8search1

未指定(需在立项/PoC 阶段补齐的关键参数)

  • 告警峰值写入量(events/s)、并发租户数、每租户对象规模(协作空间/规则/排班/人员数):未指定
  • 数据保留策略(事件明细、聚合结果、审计日志、通知回执):未指定(但建议审计与关键状态至少满足合规/内控要求)。
  • 部署形态(公有云 SaaS / 私有化 / 混合云)、地域容灾级别(RPO/RTO)、合规要求(等保/ISO/SOC2 等):未指定
  • 渠道能力(短信/电话供应商、IM 平台范围)与成本上限:未指定

对标分析与关键决策

对标的目的不是“复刻 UI”,而是抽取可泛化的能力模型与工程约束

Flashduty 的公开文档将其定位为“一站式告警响应平台”,强调“智能降噪(聚合、抑制、去重)、灵活分派(多级升级、动态路由、轮询值班)、多渠道通知、丰富集成”等核心能力。citeturn0search19turn0search0 其开发者接口体系包括 Open API(实体数据访问/配置)、Event API(上报告警与变更事件)、Webhook(把告警/故障变化推送到外部系统),这对“平台化 + 自动化闭环”非常关键。citeturn9search13turn9search0turn0search1turn0search16

平台“告警进入后的路线图”可借鉴开源与同类产品的共性机制:

  • Prometheus Alertmanager 明确提供去重、分组、路由,并支持静默与抑制(inhibition)来减少告警风暴。citeturn0search3turn9search6turn11search2
  • Alertmanager 的路由树具备 continue 语义,且 group_wait/group_interval/repeat_interval 具备“缓冲聚合、降低抖动噪音、以及按周期重复通知”的成熟解释;其中“告警在 group_wait 内恢复则不发送通知”可直接用作抖动治理的工程基线。citeturn13view2turn13view0
  • Grafana OnCall 以“集成(integration)作为唯一入口 + routes 与 escalation chains”组织值班与响应,入站/出站 Webhook 与模板化能力适合做“连接器与自动化”。citeturn11search8turn11search0turn11search5turn11search3
  • 在产品实践层面,像 entity["company","PagerDuty","incident management saas"] 的文档中强调“acknowledge/resolve”等生命周期动作,以及 escalation policies 的超时升级规则;entity["company","Atlassian","software company"] Opsgenie 文档强调告警去重与升级顺序规则,这些都是 On-Call 类平台的共性。citeturn10search0turn10search1turn10search2turn10search6

image_group{"layout":"carousel","aspect_ratio":"16:9","query":["Flashduty On-Call 告警管理 平台 截图","Prometheus Alertmanager web UI silences screenshot","Grafana OnCall OSS escalation chains routes UI screenshot","incident management alert routing escalation dashboard UI"],"num_per_query":1}

关键决策与理由(本报告主张)

  • 内核事件化(Event-first):把“平台内发生的一切”统一表示为事件流,告警/故障/通知/审计都由事件驱动生成视图与状态;这能最大化可追溯性与可扩展性。CloudEvents 明确要求 id/source/specversion/type 等字段,并强调 source + id 的唯一性与重复事件的可识别性,适合作为内部事件信封。citeturn3search0turn3search36
  • 至少一次投递 + 幂等处理,而非追求端到端 exactly-once:告警治理天然允许“重复到达但不可重复通知”的业务语义,工程上以幂等键与状态机约束更稳健。Kafka 侧可使用幂等生产与事务降低重复与乱序带来的复杂度。citeturn7search13turn7search8turn7search35
  • 事实源单点(SoR)清晰:告警/故障当前状态与配置必须有单一事实源(建议 PostgreSQL),避免多存储写入导致的分歧;审计/分析可走异步投递到列式库。PostgreSQL 的 Row Level Security(RLS)可作为多租户“纵深防御”手段(仍需配合应用层鉴权)。citeturn4search9turn4search13
  • 规则系统要“可解释”:降噪与路由的决策必须能回放(replay)与解释(explain),否则平台会变成“黑盒”,线上治理将不可控。Alertmanager 的路由/分组/静默/抑制模型为可解释规则提供了可复用的抽象与术语。citeturn13view2turn11search2turn12view0
  • 认证与授权分离:认证采用 OIDC/OAuth2 标准,授权采用策略引擎(如 OPA)或 RBAC/ABAC 混合;这是降低安全耦合、支持多租户隔离的长期收益点。OPA 以 Rego 表达策略并提供统一决策 API,适合微服务鉴权中台化。citeturn8search1turn8search0turn3search7turn3search3
  • 以官方安全基线约束 API:平台会暴露大量对象级 API,必须显式对齐 entity["organization","OWASP","api security project"] API Security Top 10(尤其对象级鉴权与资源消耗控制)。citeturn8search6turn8search2

替代方案比较表

决策点 推荐方案 备选方案 取舍要点
消息总线 Kafka NATS JetStream;RabbitMQ Kafka 更适合“大吞吐事件流 + 分区扩展 + 事务/幂等”;JetStream 更轻量但以 at-least-once 为主;RabbitMQ 适合任务队列与复杂路由但流式与分区扩展弱于 Kafka(对本平台需权衡)。citeturn7search8turn7search13turn4search1turn15search3
元数据与状态事实源 PostgreSQL MySQL PostgreSQL 生态支持 RLS、强事务与复杂查询,适合配置/授权/状态机。citeturn4search9turn4search13
分析/历史明细存储 ClickHouse TimescaleDB ClickHouse 更适合高吞吐写入与 OLAP 分析,支持表级复制;TimescaleDB 作为 PostgreSQL 扩展,运维一体化、适合中等规模时序/事件分析。citeturn4search5turn15search2turn15search6
多租户隔离 应用层鉴权 + PostgreSQL RLS + 每租户加密域 独立库/独立集群 RLS 提供“纵深防御”,但高安全/强隔离场景可能需要独立库或独立集群(成本更高)。citeturn4search9turn4search13
内部事件模型 CloudEvents + 业务扩展字段 自定义 JSON CloudEvents 统一事件元数据,利于跨服务追踪与幂等;自定义方案短期快但长期集成与治理成本更高。citeturn3search0turn3search36

总体架构与数据模型

总体形态:建议采用“控制面(Control Plane)+ 数据面(Data Plane)”分层。

  • 控制面:租户、组织/团队、协作空间、路由/降噪/静默/升级策略、排班、集成配置、权限与审计策略。
  • 数据面:接入与规范化、事件流处理(去噪/聚合/抑制/抖动)、路由与分派、通知与回执、指标与日志。

高层架构图

flowchart LR
  subgraph Sources[告警来源]
    S1[监控系统/Webhook]
    S2[自研系统/Event API]
    S3[云监控/日志告警]
  end

  subgraph Edge[接入层]
    G1[Ingest Gateway\nHTTP/gRPC]
    G2[Adapter/Parser\n格式适配与校验]
    G3[Normalizer\n规范化/补全/标签化]
  end

  subgraph Bus[事件总线]
    MQ[(Event Bus)]
  end

  subgraph Core[治理内核]
    N1[Noise Engine\n去重/聚合/抑制/静默/抖动]
    R1[Routing Engine\n路由/归属/优先级]
    I1[Incident Service\n告警/故障状态机]
    Sched[Schedule & Escalation\n值班/升级链计算]
    Notif[Notification Orchestrator\n渠道编排/重试/回执]
  end

  subgraph Storage[存储层]
    PG[(PostgreSQL\n配置/状态/权限/审计索引)]
    OLAP[(ClickHouse/TimescaleDB\n事件明细/指标分析)]
    OBJ[(Object Storage\n附件/导出/长期审计归档)]
    Cache[(Redis\n缓存/限流/幂等键)]
  end

  subgraph Access[访问层]
    API[API Gateway\nOpenAPI/gRPC]
    UI[Web Console\n运营/值班/分析]
    Auth[AuthN/AuthZ\nOIDC + Policy]
  end

  S1 --> G1
  S2 --> G1
  S3 --> G1
  G1 --> G2 --> G3 --> MQ

  MQ --> N1 --> R1 --> I1
  I1 --> Sched --> Notif

  N1 <--> PG
  R1 <--> PG
  I1 <--> PG
  Notif <--> PG

  MQ --> OLAP
  I1 --> OLAP
  Notif --> OLAP
  I1 --> OBJ

  API --> PG
  UI --> API
  Auth --> API
  Cache <--> Core
Loading

设计依据与参考抽象

  • “告警去重、分组、路由、静默、抑制”属于成熟且可验证的治理抽象,Alertmanager 文档明确其职责并给出配置要素(group_by、continue、group_wait 等)。citeturn0search3turn13view2turn13view0turn11search2turn12view0
  • “路由与升级链”可参考 Grafana OnCall 的 integrations(唯一入口 URL)、routes 与 escalation chains,以及入站/出站 Webhook 能力。citeturn11search8turn0search2turn11search5turn11search0
  • 多源云服务接入可通过 Webhook 集成完成;例如部分云服务会以“目标系统提供 Webhook URL”为模式对接事件响应平台。citeturn0search5turn0search24

组件清单与职责边界

为避免“微服务过度拆分”,建议按领域边界拆分为 7 类核心服务(可先以模块化单体实现,后续再拆分):

  1. Ingest Gateway:签名校验、限流、请求落盘/入队、返回 request_id。
  2. Adapter/Normalizer:多格式适配、字段映射、标签统一、数据质量校验(缺字段、非法值)。
  3. Noise Engine:去重、聚合、抑制、静默、抖动检测、风暴预警、降级策略。参考 Alertmanager 的 group_wait/group_interval/repeat_interval 与 silence/inhibition 概念。citeturn13view0turn11search2turn9search6
  4. Routing Engine:路由树匹配(matchers + continue + default),归属协作空间/服务,计算优先级与紧急度。路由先于分组是工程上更易解释的实践,在 Grafana IRM 的路由最佳实践中也强调路由与分组的先后关系。citeturn0search17
  5. Incident Service:告警与故障对象状态机、认领/协作、合并/拆分、关闭与复开、关联变更与上下文。
  6. Schedule & Escalation:排班(轮换、节假日、覆盖)、升级链(超时未 ack/未关闭触发下一环节)。升级链/路由在 Grafana OnCall 与行业产品中是核心能力。citeturn0search2turn10search1turn10search6
  7. Notification Orchestrator:通道编排、模板渲染、重试与回执、电话/短信等成本型资源的配额控制(参考 API 安全“资源消耗不可控”风险)。citeturn8search2

事件模型与一致性策略

内部事件信封(推荐 CloudEvents Structured Mode)

  • 必选字段:id/source/specversion/type;其中 source + id 用于判断重复事件、支撑幂等消费。citeturn3search0turn3search4
  • 建议扩展字段:tenantidworkspaceidtraceparentsubject(对象主键)、timedatacontenttype。CloudEvents 允许扩展属性。citeturn3search0turn3search28

一致性策略(工程重点)

  • 接入幂等:对每个入站请求生成 request_id;对事件生成 event_key = tenant_id + integration_id + external_event_id(external_event_id 未提供则按规范化字段 hash),保证重复投递不会导致重复告警。CloudEvents 的重复事件语义也支持“重复发送可复用同一 id”。citeturn3search0
  • 写库与发消息一致性:采用 Transactional Outbox(在 PostgreSQL 事务内写业务表与 outbox 表),由 Outbox Relay 异步投递到 Kafka;消费侧采用 Inbox(已处理事件表)保障幂等。Kafka 侧可使用事务/幂等生产进一步降低重复与乱序带来的影响。citeturn7search8turn7search13
  • 至少一次 vs 精确一次:总线侧与消费者侧默认按至少一次处理,业务层以状态机与幂等键保证“不会重复触达/重复升级”。NATS JetStream 与 RabbitMQ 都明确以 ack 机制实现 at-least-once,进一步证明“幂等消费”是跨 MQ 的通用做法。citeturn4search1turn15search3turn15search5

存储方案

元数据与状态(PostgreSQL)

  • 表类型:租户/成员/团队、协作空间、路由/降噪/静默/升级策略、排班、告警/故障当前状态、通知任务与回执索引、审计日志索引(可与正文分层)。
  • 多租户隔离:建议应用层强制 tenant_id 过滤 + PostgreSQL RLS policy 双保险。PostgreSQL 文档明确 RLS policy 的定义方式(CREATE POLICY)与启用方式。citeturn4search9turn4search13

事件明细与分析(ClickHouse 或 TimescaleDB)

  • ClickHouse:适合“高吞吐事件写入 + 聚合分析(按租户/空间/标签维度统计降噪效果、MTTx、通知成功率)”;其 ReplicatedMergeTree 等机制支持表级副本。citeturn4search5
  • TimescaleDB:作为 PostgreSQL 扩展,可用 hypertable 分区与 chunk_interval 管理时序/事件,适合规模较小或希望降低运维栈复杂度的场景。citeturn15search2turn15search6

审计与归档(对象存储)

  • 审计日志建议分两层:
    • 热审计(可检索):PG 表(追加写、不可变字段),按 tenant_id/time 分区与归档策略;
    • 冷审计(长期保留):对象存储(JSONL/Parquet),可做 WORM/合规存证(具体合规要求未指定)。

核心 ER 数据模型草案

erDiagram
  TENANT ||--o{ USER : has
  TENANT ||--o{ TEAM : has
  TENANT ||--o{ WORKSPACE : has
  TEAM ||--o{ USER : member
  WORKSPACE ||--o{ INTEGRATION : owns
  WORKSPACE ||--o{ ROUTE_RULE : routes
  WORKSPACE ||--o{ NOISE_POLICY : governs
  WORKSPACE ||--o{ ESCALATION_CHAIN : uses
  WORKSPACE ||--o{ INCIDENT : contains
  INCIDENT ||--o{ ALERT : groups
  ALERT ||--o{ ALERT_EVENT : occurs
  INCIDENT ||--o{ ASSIGNMENT : assigns
  INCIDENT ||--o{ NOTIFICATION : notifies
  TENANT ||--o{ AUDIT_LOG : records

  TENANT {
    uuid id PK
    string name
    string plan
    timestamptz created_at
  }

  USER {
    uuid id PK
    uuid tenant_id FK
    string email
    string display_name
    string status
  }

  WORKSPACE {
    uuid id PK
    uuid tenant_id FK
    string name
    string timezone
  }

  INTEGRATION {
    uuid id PK
    uuid workspace_id FK
    string type
    string secret_ref
    string status
  }

  ROUTE_RULE {
    uuid id PK
    uuid workspace_id FK
    int priority
    jsonb matchers
    string target_type
    uuid target_id
  }

  NOISE_POLICY {
    uuid id PK
    uuid workspace_id FK
    jsonb dedup
    jsonb grouping
    jsonb inhibition
    jsonb silences
  }

  INCIDENT {
    uuid id PK
    uuid workspace_id FK
    string status
    string severity
    timestamptz opened_at
    timestamptz resolved_at
  }

  ALERT {
    uuid id PK
    uuid incident_id FK
    string fingerprint
    string title
    jsonb labels
  }

  ALERT_EVENT {
    uuid id PK
    uuid alert_id FK
    string external_event_id
    string state
    jsonb payload
    timestamptz occurred_at
  }

  NOTIFICATION {
    uuid id PK
    uuid incident_id FK
    string channel
    string status
    int attempt
  }

  AUDIT_LOG {
    uuid id PK
    uuid tenant_id FK
    string actor
    string action
    string object_ref
    jsonb detail
    timestamptz at
  }
Loading

核心模块与接口设计

模块职责与内部接口

Ingest Gateway

  • 统一入口:/ingest/webhook/*/ingest/events(Event API)、/ingest/prometheus(兼容 Alertmanager Webhook)。
  • 安全:HMAC/签名校验(若渠道支持)、IP allowlist、配额与限流、请求体大小限制(防资源消耗攻击)。citeturn8search2
  • 可靠性:请求先写入 MQ 或落地缓冲(落库 outbox / 写入 Kafka),返回 2xx 并携带 request_id

Normalizer

  • 统一字段:title/description/severity/urgency/resource/service/environment/labels/annotations/state/startAt/endAt
  • 统一时间语义:强制 UTC 写入,展示层按 workspace timezone 转换。
  • 统一标签:建立“平台保留标签”命名空间(如 fd.*),并对 UTF-8/regex 做安全处理(参考 Alertmanager matcher 解析升级提示)。citeturn12view0

Noise Engine(规则优先级建议)

以“可解释”顺序执行(并记录 explain trace):

  1. 事件级去重:完全相同事件丢弃;Flashduty 文档将“event 内容完全一致丢弃”作为第一层。citeturn9search4
  2. 告警级去重:若新事件与该告警上一事件的状态/标题/描述一致则丢弃或仅更新归属属性;Flashduty 将此作为第二层。citeturn9search4
  3. 排除/丢弃规则:明确声明“不进入治理”的事件。
  4. 抑制(Inhibition):当某个“源告警”存在时抑制“目标告警”的通知;概念与 Alertmanager inhibition 对齐。citeturn9search6turn12view0
  5. 静默(Silence):基于 matchers 与时间窗停止通知,但仍保留告警与事件;Alertmanager 明确“silence 只阻止通知,不阻止告警出现”。citeturn11search2turn11search16
  6. 分组聚合(Grouping):按 group_by 计算聚合键,按窗口合并;Alertmanager 对 group_by、group_wait、group_interval、repeat_interval 的语义描述可作为参考实现。citeturn13view2turn13view0

Routing Engine

  • 使用 matcher 树匹配,支持 continue。Alertmanager 的“首个匹配节点/continue 继续匹配兄弟节点”语义可直接对齐为实现规范。citeturn13view2
  • 支持 active/mute time intervals(按工作日/节假日/时段启用或静默路线),与 Alertmanager 的 mute_time_intervals/active_time_intervals 概念对齐。citeturn13view0
  • 输出:route_idworkspace/service/teamescalation_chain_idpriority、解释信息(命中的规则、未命中的原因)。

Schedule & Escalation

  • 升级触发条件:常见为“未 ack”“未关闭/未 resolve”;Opsgenie 的升级规则条件如下(not acknowledged / not closed)可作为兼容语义参考。citeturn10search6
  • 值班计算:支持轮换、覆盖、节假日;Flashduty 使用文档体现“值班规则、节假日/服务日历”等能力。citeturn1view0turn2view2

Notification Orchestrator

  • 支持多渠道与模板。Grafana OnCall 通过模板把原始 JSON 渲染为适配展示/路由的字段,且出站 Webhook 可按事件触发并用模板变换数据。citeturn11search3turn11search5turn11search0
  • 重试与去重:在通知层面必须保证“同一 incident 同一 escalation step 不重复触达同一人/同一通道”(除非配置 repeat)。

REST API 设计示例

# 1) 事件接入(Event API 风格)
POST /api/v1/ingest/events
Headers:
  X-Tenant-Id: <tenant_uuid>
  Authorization: Bearer <token>
Body:
{
  "source": "my-monitoring",
  "external_event_id": "evt-123",
  "event_type": "alert.firing",
  "title": "CPUHigh",
  "severity": "critical",
  "labels": {"service":"checkout","instance":"10.0.0.1"},
  "annotations": {"runbook":"..."},
  "occurred_at": "2026-04-02T08:00:00Z",
  "raw": {...}
}

# Response
202 Accepted
{
  "request_id": "req-...",
  "dedup": {"accepted": true, "reason": ""},
  "trace_id": "..."
}

# 2) Webhook 出站(告警/故障变化推送)
POST /api/v1/integrations/webhooks/{webhook_id}/deliveries/test

# 3) 故障生命周期
POST /api/v1/incidents/{id}/ack
POST /api/v1/incidents/{id}/resolve
POST /api/v1/incidents/{id}/reopen
POST /api/v1/incidents/{id}/snooze
POST /api/v1/incidents/{id}/merge
POST /api/v1/incidents/{id}/assign

# 4) 静默
POST /api/v1/silences
GET  /api/v1/silences?workspace_id=...
DELETE /api/v1/silences/{id}

# 5) 指标与分析
GET /api/v1/analytics/mttx?workspace_id=...&from=...&to=...
GET /api/v1/analytics/noise-reduction?workspace_id=...

gRPC API 设计示例

service AlertGovernance {
  rpc IngestEvent(IngestEventRequest) returns (IngestEventResponse);
  rpc ExplainDecision(ExplainRequest) returns (ExplainResponse);

  rpc AckIncident(IncidentActionRequest) returns (IncidentActionResponse);
  rpc ResolveIncident(IncidentActionRequest) returns (IncidentActionResponse);

  rpc CreateSilence(CreateSilenceRequest) returns (Silence);
  rpc ListSilences(ListSilencesRequest) returns (ListSilencesResponse);
}

规则/策略表达式示例

**路由规则(参考 Alertmanager matcher + continue 语义)**citeturn13view2turn12view0

routing_tree:
  - name: critical-to-core
    priority: 100
    matchers:
      - severity="critical"
      - service=~"checkout|payment"
    continue: false
    target:
      workspace: "core-prod"
      escalation_chain: "core-24x7"
  - name: offhours-muted
    priority: 50
    matchers:
      - env="prod"
    mute_time_intervals: ["offhours", "holidays"]
    continue: true
  - name: default
    priority: 0
    matchers: []
    target:
      workspace: "default"
      escalation_chain: "default-chain"

**聚合/窗口与风暴预警(参考 Flashduty 使用文档的聚合与风暴预警概念)**citeturn2view1

grouping:
  mode: "rule"
  group_by:
    - "title"
    - "labels.check"
  window: "30m"
storm_detection:
  threshold_events: 5
  window: "30m"
  action: "storm_warning"

**抑制规则(对齐 Alertmanager inhibition 概念)**citeturn9search6turn12view0

inhibition_rules:
  - name: "cluster_down_mutes_children"
    source_matchers:
      - alertname="ClusterNotReachable"
    target_matchers:
      - cluster!=""   # 伪语法示意:实现层可用 CEL/DSL 支持否定
    equal: ["cluster"]

**静默规则(对齐 silence 基于 matchers + time window)**citeturn11search2turn13view0

silences:
  - name: "maintenance_checkout"
    matchers:
      - service="checkout"
      - env="prod"
    start: "2026-04-02T22:00:00Z"
    end:   "2026-04-03T00:00:00Z"
    reason: "planned maintenance"

Webhook 与第三方集成点

  • 入站
    • 通用 Webhook(任意 JSON);Grafana OnCall 的 inbound webhook 也提供“raw webhook / formatted webhook”两种模式并识别若干字段(但字段可选)。citeturn11search0turn11search8
    • Prometheus Alertmanager Webhook(建议兼容其常见字段/labels/annotations)。
  • 出站
    • 告警/故障 Webhook:参考 Flashduty 的做法,按“告警变化/故障变化”推送,并支持自定义 headers。citeturn0search1turn0search8
    • 自动化操作(Custom Action):类似 Flashduty 在故障详情触发“自定义操作”调用外部接口,可用于自愈/工单/信息增强。citeturn0search16turn2view2

告警治理工作流

本节给出“事件进入平台后”的详细治理流程,强调去噪、聚合、抑制、抖动处理、路由与升级策略,并给出状态机。

端到端处理流程图

flowchart TD
  A[接入:Webhook/Event API] --> B[校验:鉴权/签名/限流/大小]
  B --> C[规范化:字段映射/标签化/严重度归一]
  C --> D{事件幂等判断}
  D -- 重复 --> D1[丢弃或仅更新索引\n记录审计 explain]
  D -- 新事件 --> E{规则:排除/丢弃?}
  E -- 是 --> E1[丢弃\n记录原因]
  E -- 否 --> F{抑制规则命中?}
  F -- 是 --> F1[抑制通知\n仍更新事件/状态]
  F -- 否 --> G{静默命中?}
  G -- 是 --> G1[静默通知\n仍进入事件流与分析]
  G -- 否 --> H[聚合:计算 group_key\n进入聚合窗口]
  H --> I{抖动检测}
  I -- 抖动且在窗口内恢复 --> I1[不触达或降级触达]
  I -- 需触达 --> J[路由:匹配路由树\n得到 workspace/chain]
  J --> K[生成/更新 Incident\n状态机推进]
  K --> L[通知编排:按升级链\n多渠道触达]
  L --> M[回执与重试\n失败升级/降级]
  M --> N[闭环:ack/resolve/reopen\n审计与指标沉淀]
Loading

其中:

  • “事件幂等 + 多层去重”可直接对齐 Flashduty 的两层降噪描述:事件内容一致丢弃、告警上一事件状态与描述一致丢弃、以及命中排除/丢弃/抑制/静默规则的丢弃。citeturn9search4
  • 抑制与静默语义可对齐 Alertmanager 的 inhibition 与 silences 概念:抑制依赖“源告警存在”来压制目标告警通知;静默基于 matchers 与时间窗阻止通知但保留告警。citeturn9search6turn11search2turn12view0
  • 聚合窗口与重复通知应借鉴 Alertmanager 的 group_wait/group_interval/repeat_interval:其文档明确 group_wait 可缓冲告警并等待抑制告警到达;repeat_interval 应是 group_interval 的倍数,否则会向上取整;并且“若告警在 group_wait 内恢复则不发送通知,降低抖动噪音”。citeturn13view0
  • 路由树匹配语义(continue 与默认行为)对齐 Alertmanager:每条告警进入路由树,默认在首个匹配 child 处停止,continue=true 才继续匹配兄弟节点。citeturn13view2

告警与故障状态机

建议采用“双层状态机”:

  • Alert:更贴近监控事件(firing/resolved 等)。
  • Incident:更贴近人协作处置(open/acknowledged/in_progress/resolved/closed/reopened),可合并多条 alerts。
stateDiagram-v2
  [*] --> Open: first_alert_firing
  Open --> Acknowledged: ack
  Open --> Snoozed: snooze
  Snoozed --> Open: wake
  Acknowledged --> InProgress: add_note/assign/attach
  InProgress --> Resolved: resolve
  Open --> Resolved: auto_resolve_policy
  Resolved --> Closed: close
  Resolved --> Reopened: new_related_firing
  Closed --> Reopened: reopen
  Reopened --> Open: reset_state
Loading

上述动作集合与 Flashduty 的告警/故障 Webhook 事件类型(assign、snooze、wake、ack、unack、rslv、reopen、merge 等)保持语义对齐,有利于后续与外部系统(工单、自愈)联动。citeturn0search8

路由与升级策略细化

路由(Routing)

  • 规则表达:matchers(等值/正则/集合)、优先级、continue、兜底。
  • 执行顺序:建议“先路由、后聚合”作为平台内核顺序,原因是:路由确定责任域后,同一 group_key 仅在同一路由域内聚合更合理;该思路在 Grafana IRM 的路由最佳实践中也明确提到“在其体系内 routing happens before grouping”。citeturn0search17
  • 可解释性:每次路由输出 explain:命中规则、命中 matcher、continue 行为、为何走 default。

升级(Escalation)

  • 触发条件:
    • 未 ACK 超时升级(最常见);
    • 未 RESOLVE/未 CLOSE 超时升级(更偏“处理进展”);
    • 风暴预警触发“广播给指挥/值班经理”。
  • 规则语义对齐:Opsgenie 的升级规则条件包含“alert is not acknowledged / not closed”,可作为行业兼容语义。citeturn10search6
  • 触达控制:电话/短信是成本型资源,需租户级配额、workspace 级预算与熔断,以对齐 API 资源消耗风险。citeturn8search2

抖动(Flapping)处理

建议三层处理:

  1. 利用 group_wait 缓冲:若告警在 group_wait 内恢复则不通知(Alertmanager 文档明示该行为能减少抖动噪音)。citeturn13view0
  2. 连续抖动计数:在滑动窗口内发生 N 次 firing/resolved 切换,触发“抖动告警”并降级为工单/低优通知(避免夜间持续打扰)。
  3. 根因提示:自动附带“最近 1h 变化次数、首次发生时间、查询链接/runbook”等上下文,便于治理。

技术选型部署与运维测试

技术选型建议

后端语言与框架

  • 推荐:Go(治理内核、路由/规则与高并发通知编排更契合),并提供 REST + gRPC 双栈。
  • 规则执行:建议选择“数据驱动 + 小 DSL”,可在 MVP 阶段仅支持 matchers(等值/正则/范围)与少量函数;后续再引入 CEL/表达式引擎(参数未指定,按无特定约束处理)。

消息系统

  • 默认推荐 Kafka:用于 ingress、治理决策、通知任务、审计流水的异步化与削峰;可利用 producer 幂等与事务能力降低重复与乱序的治理成本。citeturn7search13turn7search8turn7search35
  • 备选 NATS JetStream:更轻量,语义以 at-least-once 为主,适合中小规模或边缘化部署。citeturn4search1turn4search4
  • 备选 RabbitMQ:可靠性与 ack/confirm 机制成熟,文档明确“ack 保证 at-least-once”;适合通知任务/工单任务,但若要做高吞吐事件流与分区扩展,需要更谨慎的容量规划。citeturn15search3turn15search0turn15search28

数据库与存储

  • PostgreSQL:元数据、状态、权限与审计索引事实源;RLS 做多租户纵深防御。citeturn4search9turn4search13
  • ClickHouse 或 TimescaleDB:事件明细/分析;TimescaleDB 的 hypertable/chunk 机制有利于按时间分区维护。citeturn4search5turn15search2turn15search6
  • Redis:缓存、限流、幂等键、短期聚合窗口状态;若需要消息流替代方案,可评估 Redis Streams 的 consumer group + ack(但不建议作为主总线)。citeturn15search5turn15search9

可观测性

  • 推荐引入 OpenTelemetry:统一 trace/metric/log 语义与上下文传播,利于“告警入站 → 消息处理 → 通知触达”的全链路追踪与问题定位。OpenTelemetry 规范强调多信号与语义约定(Semantic Conventions)的统一命名收益。citeturn3search21turn3search1turn3search25

高可用与扩展性设计要点

水平扩展

  • Ingest Gateway、Normalizer、Noise Engine、Notification Orchestrator 均应无状态化,通过 Kafka 分区扩展。
  • 聚合与状态机:以 incident_id/group_key 分区做“同 key 串行处理”,避免并发写同一 incident 的冲突;其余 key 可并行。

高可用

  • Kafka:多副本 + ISR;关键 topic 设定合理保留周期(未指定,需补齐)。
  • PostgreSQL:主从或云托管 HA;关键表做逻辑备份 + PITR(RPO/RTO 未指定)。
  • 通知系统:通道级健康探测与熔断;失败自动降级(如 IM 失败转短信)。
  • 参考 Alertmanager HA:其文档说明可通过集群模式实现高可用,并提示“不要在 Prometheus 与 Alertmanager 之间做负载均衡,而应让 Prometheus 指向所有 Alertmanager 实例列表”,这类经验对“告警接入层多副本 + 去重”也有借鉴意义。citeturn14search6turn14search2

安全基线与部署建议

  • 认证:OIDC(Authorization Code + PKCE 等具体细节未指定),标准来自 OpenID Connect Core 与 OAuth2。citeturn8search1turn8search0
  • 权限:RBAC(组织/团队/协作空间/服务/规则)为主,ABAC(标签/属性)为辅;可用 OPA 做策略决策。citeturn3search7turn3search3
  • 多租户隔离:应用层 tenant_id 强制过滤 + PostgreSQL RLS + 审计;RLS 的 policy 定义与启用方式见官方文档。citeturn4search9turn4search13
  • API 安全:对齐 OWASP API Top 10,重点落实对象级鉴权、速率限制、以及“短信/电话等成本型资源的滥用防护”。citeturn8search6turn8search2
  • Kubernetes 部署:
    • 密钥:使用 Secret;并建议启用“etcd 中加密 Secret”等数据静态加密能力(若部署在自管集群)。citeturn14search4turn14search0
    • 网络隔离:使用 NetworkPolicy 限制 Pod 间通信,缩小攻击面。citeturn14search5turn14search1

运维与测试

部署步骤(建议 Helm/GitOps)

  1. 基础设施:Kafka、PostgreSQL、Redis、对象存储(MinIO/S3)、可观测性栈(Prometheus/Grafana/日志系统)。
  2. 安全底座:OIDC Provider(如 Keycloak)、证书与网关、密钥管理、NetworkPolicy。citeturn3search10turn14search5turn14search0
  3. 平台服务:按 “gateway → core → notif → ui/api” 顺序部署;先开只读与接入,再逐步启用降噪与升级。
  4. 灰度:对单一 workspace 启用新路由/新降噪策略,观察 explain 与指标后扩大范围。

回滚策略

  • 配置回滚:所有策略与排班应版本化(versioned),支持“按版本回退”。
  • 代码回滚:Helm release 回滚;数据库 schema 变更采用“向前兼容迁移”(expand/contract),避免必须回滚 schema。
  • 规则回滚:支持“影子执行(shadow mode)”,仅记录决策不触达,用于验证新规则。

性能测试指标与验收标准(建议基线,具体阈值未指定)

  • 接入层:
    • p99 接入响应 < 200ms(不含异步处理),丢包率≈0;
    • 峰值写入能力:未指定(建议压测至少覆盖目标峰值 2×)。
  • 治理链路:
    • 从事件接入到“生成 incident 并触发首条通知”的端到端 p95 < 5s(未指定,可按组织接受度调整);
    • 幂等:重复投递同一事件不会产生重复通知(核心验收项,需 e2e 用例覆盖)。
  • 通知链路:
    • 各渠道成功率、平均延迟、重试次数、失败降级率可观测;
    • 成本型渠道(短信/电话)配额与熔断生效(防滥用)。citeturn8search2

SLA 指标建议(平台自身)

  • 平台可用性:建议按组件分层(接入/治理/通知/控制台),并定义 RTO/RPO(均未指定)。
  • 数据一致性 SLA:
    • Incident 状态与通知回执的最终一致性窗口(例如 1 分钟内收敛);
    • 审计日志写入保证(例如 99.99% 事件具有审计记录)。

里程碑估算风险与交付物

里程碑与人月估算

以下估算以“中等复杂度、支持多租户、支持至少 3-5 类主流接入与 3-4 类通知渠道、并提供基础分析看板”为假设;由于规模与合规要求未指定,人月仅作区间参考。

阶段 交付目标 关键内容 估算人月
基础内核 MVP 跑通端到端闭环 租户/协作空间/成员;接入 API(Webhook + Event API);告警/故障状态机;基础路由;单渠道通知;审计骨架 6–8
降噪与可解释 稳定可用的降噪链路 事件幂等与多层去重(对齐 Flashduty 思路);group_by/窗口聚合;静默/抑制;explain 回放;风暴预警 5–7
值班与升级 形成 7×24 体系 排班/轮换/覆盖;升级链(未 ack/未关闭超时);多渠道通知编排与回执;通知模板 6–9
可视化与指标 可运营与可优化 MTTx/降噪比例/漏单率/触达成功率;分析存储(ClickHouse/TimescaleDB);报表导出 4–6
工程化与私有化 上生产与可运维 HA/扩展;备份与恢复;压测与容量模型;安全加固(RLS/OPA/审计归档);文档与培训 5–8

主要风险点与缓解策略

  • 规则正确性与可解释性不足:降噪/路由/升级若不可解释,很难在组织内推广。缓解:强制 explain 产出、支持回放(replay)、提供影子执行模式;规则变更必须有审计与版本。citeturn13view2turn0search1
  • 幂等与一致性缺陷导致漏单或重复骚扰:尤其在 MQ at-least-once 语义下更常见。缓解:CloudEvents source+id 幂等键、Inbox 表、通知去重键、Outbox 一致性投递。citeturn3search0turn7search13turn4search1turn15search3
  • 通知渠道成本与可靠性:短信/电话成本高且容易被误触发。缓解:配额/熔断/审批(未指定,建议纳入);对齐 API 资源消耗安全风险。citeturn8search2
  • 多租户隔离与权限复杂度:对象级鉴权容易出现 BOLA。缓解:OIDC 做认证、OPA/RBAC 做鉴权、RLS 纵深防御、审计覆盖关键对象访问。citeturn4search9turn8search6turn3search7
  • 集成矩阵爆炸:想“一次性覆盖 100+ 集成”会拖垮交付。缓解:优先做通用 Webhook + 3–5 个最常用适配器,把其余集成降为“模板化/映射化”的配置能力(类似 OnCall webhook + templates)。citeturn11search0turn11search3turn0search19

输出物与交付物清单

按“可交付、可验收、可运维”原则,建议形成以下产物(均可纳入版本库与 CI):

  • 架构图:高层架构 Mermaid 图(本报告已给出草案),以及关键数据流/容灾拓扑图。
  • 流程图与状态机:告警治理流程图、Incident 状态机 Mermaid 图(本报告已给出草案)。
  • 数据模型:ER 图(本报告已给出草案)+ 物理表结构(含索引、分区、RLS policy)。citeturn4search9turn4search13
  • API 文档:OpenAPI 3.0 规范(REST)、Protobuf(gRPC)、鉴权与错误码规范、Webhook 事件类型与签名规范(参考 Flashduty 告警/故障 Webhook 的“事件类型列表”做版本管理)。citeturn0search8turn0search1
  • 部署脚本示例:Helm Chart、values 样例;数据库迁移脚本;初始化租户与管理员脚本;NetworkPolicy 与 Secret 加密配置建议。citeturn14search5turn14search0
  • 测试用例:
    • 单元测试:规则匹配、group_key 计算、抑制/静默命中逻辑;
    • 集成测试:Kafka/DB/Redis/通知渠道 mock;
    • e2e 回归:重复投递幂等、升级链超时、静默窗口、抖动抑制(覆盖 Alertmanager group_wait 抑制抖动的关键语义)。citeturn13view0turn11search2
  • 运维手册草案:容量规划方法、常见故障(积压、重试风暴、渠道失败)、审计与合规导出、回滚与演练流程。
  • 用户手册草案:接入指南(Webhook/Event API)、规则配置(路由/降噪/静默/升级)、值班与排班、故障协作(认领/备注/合并/关闭)、分析看板解读。citeturn0search19turn9search8turn10search0

About

告警治理平台

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors