1. 标题Title核心关键词Prometheus、Harness、指标告警、规则设计、云原生可观测性《从0到1基于Prometheus打造Harness体系下的高可用指标告警规则》《云原生可观测性实战PrometheusHarness告警规则设计全指南》《告别告警风暴Prometheus Harness 黄金指标告警规则最佳实践》《企业级可观测落地基于Prometheus的Harness指标告警规则设计详解》2. 引言Introduction痛点引入Hook你是否遇到过以下场景凌晨3点被手机告警吵醒爬起来排查发现只是服务瞬时波动导致的无效告警线上业务已经故障了1小时却没有任何告警通知到运维团队一个服务出问题几十条相关告警同时轰炸整个技术团队的工作群大家都不知道该优先处理哪条告警发出来之后没人知道该怎么处理只能挨个相关负责人排查白白耽误了故障恢复时间。这些问题几乎是所有做云原生运维、SRE的团队都会遇到的痛点尤其是当你已经采用Harness作为全链路DevOps平台覆盖CI/CD、Feature Flag、混沌工程、服务可靠性管理却还在用原生Prometheus Alertmanager做告警的时候这些问题会被放大数倍Alertmanager的路由配置复杂、降噪能力弱、无法和Harness的变更事件打通告警和发布流程完全脱节根本无法支撑企业级的可靠性要求。文章内容概述What本文将从告警设计的核心原则出发手把手带你打造一套基于Prometheus指标能力、结合Harness SRM服务可靠性管理告警链路的高可用指标告警体系。我们会覆盖从规则设计原理、基础规则编写、场景化规则落地、告警降噪闭环到进阶优化的全流程所有配置都提供可直接复用的代码示例。读者收益Why读完本文你将能够理解告警规则设计的核心原则完全避开告警风暴、误报漏报的常见坑独立完成从Prometheus指标采集到Harness告警通知的全链路配置落地覆盖基础设施、Harness平台、业务服务的分层告警规则实现告警和Harness CI/CD变更的联动把告警误报率降低80%以上搭建告警自愈闭环把平均故障恢复时间MTTR降低50%以上3. 准备工作Prerequisites技术栈/知识要求熟悉Prometheus基础原理掌握PromQL的基本编写方法了解Prometheus Alertmanager的基本配置逻辑了解Harness的核心模块SRM服务可靠性管理、CI/CD流水线、告警通知中心有基础的Kubernetes使用经验云原生部署场景环境/工具要求已部署Prometheus Grafana监控栈版本≥2.30.0已接入服务、基础设施、Harness平台的指标已开通Harness企业版账号已完成SRM模块初始化已将Prometheus数据源接入Harness SRM模块配置路径Harness控制台→SRM→Data Sources→Add Prometheus已配置好Harness的通知渠道企业微信/ Slack/短信/电话等4. 核心概念与原理问题背景随着云原生架构的普及企业的服务数量、指标维度呈指数级增长传统的阈值告警已经完全无法满足需求据Gartner统计2023年全球企业平均每个月产生的告警数量超过10万条其中有效告警占比不足10%告警风暴已经成为影响SRE团队效率的首要因素。而Harness作为全链路DevOps平台本身已经沉淀了整个研发流程的所有数据发布记录、变更事件、Feature Flag开关、混沌实验记录等如果能把Prometheus的指标告警和Harness的流程数据打通就可以从根本上解决告警的误报、归因、闭环问题。核心角色与关系我们首先明确Prometheus和Harness在告警链路中的角色用ER实体关系图表示如下渲染错误:Mermaid 渲染失败: Parse error on line 6: ...ness SRM规则 计算逻辑 } 规则计算层 ||--o{ A ----------------------^ Expecting ATTRIBUTE_WORD, got BLOCK_STOP核心概念定义Prometheus指标采集层负责采集基础设施、中间件、服务、Harness平台的所有指标通过拉模式获取时间序列数据。规则计算层有两种实现方式一种是在Prometheus侧配置PrometheusRule CRD本地计算告警另一种是在Harness SRM侧配置规则由Harness主动拉取Prometheus指标计算。Harness告警管理模块负责接收所有告警事件执行降噪、关联变更、路由通知、触发自愈等操作是整个告警体系的核心枢纽。告警分级我们把所有告警分为三个等级对应不同的响应要求P1紧急影响核心业务可用性需要15分钟内响应7*24小时通知P2重要影响非核心功能或潜在风险需要2小时内响应工作时间通知P3提示资源不足或配置不合理需要3个工作日内处理不触发电话/短信通知告警规则设计的核心数学模型我们用三个核心指标来衡量告警体系的质量告警准确率有效告警数占总告警数的比例是衡量告警质量的核心指标告警准确率有效告警数总告警数×100% 告警准确率 \frac{有效告警数}{总告警数} \times 100\%告警准确率总告警数有效告警数×100%我们的目标是把告警准确率保持在80%以上。平均响应时间MTTA从告警触发到负责人确认收到告警的平均时间MTTA∑i1n(告警确认时间i−告警触发时间i)n MTTA \frac{\sum_{i1}^{n} (告警确认时间_i - 告警触发时间_i)}{n}MTTAn∑i1n(告警确认时间i−告警触发时间i)我们的目标是P1告警MTTA≤15分钟。平均恢复时间MTTR从告警触发到故障完全恢复的平均时间MTTR∑i1n(告警恢复时间i−告警触发时间i)n MTTR \frac{\sum_{i1}^{n} (告警恢复时间_i - 告警触发时间_i)}{n}MTTRn∑i1n(告警恢复时间i−告警触发时间i)我们的目标是P1告警MTTR≤30分钟。告警规则设计的核心方法对比目前行业内主流的指标告警设计方法有三种我们用表格对比其适用场景和优缺点方法核心维度适用场景优点缺点RED方法请求率(Rate)、错误率(Errors)、延迟(Duration)微服务、API网关、Web服务等请求驱动的服务简单易落地直接反映用户体验不覆盖资源层指标USE方法使用率(Utilization)、饱和度(Saturation)、错误率(Errors)服务器、数据库、中间件等资源型组件全面覆盖资源健康状态无法直接反映业务体验黄金四指标延迟(Latency)、流量(Traffic)、错误(Errors)、饱和度(Saturation)全场景通用从资源到业务全覆盖覆盖范围最广兼顾资源和业务体验配置复杂度较高本文我们采用黄金四指标作为核心设计方法兼顾所有场景的需求。告警体系发展历史我们可以把告警体系的发展分为四个代际对比其能力和特点代际核心技术核心能力优势劣势典型产品第一代Shell脚本、Cron定时任务单机阈值检查、邮件通知简单易用无额外依赖功能简陋无降噪无法分布式部署自定义脚本第二代传统监控框架、关系型数据库集中化监控、多维度阈值告警、基础降噪功能完善适合传统IDC架构云原生适配差灵活查询能力弱Zabbix、Nagios第三代Prometheus、Alertmanager、云原生存储多维指标查询、动态告警规则、联邦集群云原生友好查询灵活生态丰富告警闭环能力弱降噪能力有限和DevOps流程打通难原生PrometheusAlertmanager第四代可观测性平台DevOps全链路打通告警归因、自动降噪、自愈闭环、SLO关联低误报高覆盖和DevOps流程深度整合需要一定的学习成本依赖完整的DevOps工具链PrometheusHarness、Datadog本文我们落地的就是第四代告警体系也是目前行业内的最佳实践。5. 手把手实战告警规则落地步骤一环境配置与链路打通我们首先要打通Prometheus到Harness的告警链路有两种实现方案我们分别介绍方案1Prometheus本地计算告警推送到Harness这种方案适合已经有大量Prometheus告警规则不想做迁移的团队。1.1 安装配置Prometheus Alertmanager如果已经部署了kube-prometheus-stack可以直接修改Alertmanager的配置# alertmanager.yamlglobal:resolve_timeout:5mroute:# 按告警名称、服务、命名空间分组group_by:[alertname,service,namespace]# 分组等待时间收集同组告警group_wait:30s# 同组告警间隔时间group_interval:5m# 重复告警间隔repeat_interval:12hreceiver:harness-webhookreceivers:-name:harness-webhookwebhook_configs:# 替换为你的Harness账号的Webhook地址在Harness SRM→Alert Sources→Alertmanager中获取-url:https://app.harness.io/gateway/alertmanager/webhook?accountIdYOUR_ACCOUNT_IDapiKeyYOUR_API_KEYsend_resolved:true配置完成后Prometheus触发的告警会自动推送到Harness告警管理中心。方案2Harness侧直接配置规则主动拉取Prometheus指标计算这种方案适合新搭建告警体系想要统一管理所有规则的团队不需要维护Alertmanager配置。配置步骤进入Harness控制台→SRM→Alert Rules→New Alert Rule选择数据源为你已经接入的Prometheus输入PromQL表达式、阈值、持续时间配置告警级别、通知策略、关联的服务保存即可Harness会自动按固定间隔拉取Prometheus指标计算规则。两种方案的对比方案优点缺点适用场景Prometheus本地计算复用现有规则架构改动小计算性能好规则管理分散和Harness能力打通成本高已有大量Prometheus规则的团队Harness侧计算统一管理规则和Harness变更、SLO打通更顺畅无需维护Alertmanager计算压力集中在Harness侧大规模场景需要扩容新搭建告警体系的团队步骤二基础告警规则编写我们按照黄金四指标的原则编写覆盖基础设施、Harness平台、业务服务的三层告警规则所有规则都提供Prometheus Rule CRD和Harness侧配置两种形式。2.1 基础设施层告警规则基于USE方法基础设施层包括Kubernetes节点、Pod、存储、网络等组件我们以Kubernetes节点为例# prometheus-rule-infra.yamlapiVersion:monitoring.coreos.com/v1kind:PrometheusRulemetadata:name:infra-alertsnamespace:monitoringlabels:release:kube-prometheus-stackspec:groups:-name:infra.node.rulesrules:# P1告警节点CPU使用率超过90%持续10分钟-alert:NodeHighCPUUtilizationexpr:100-(avg by (instance,node) (irate(node_cpu_seconds_total{modeidle}[10m])) * 100)90for:10mlabels:severity:P1resource_type:nodeannotations:summary:节点 {{ $labels.node }} CPU使用率过高description:节点 {{ $labels.node }} 过去10分钟CPU使用率为 {{ $value | printf \%.2f\ }}%超过阈值90%runbook:https://wiki.company.com/runbooks/P1/NodeHighCPUUtilization# P2告警节点内存使用率超过85%持续15分钟-alert:NodeHighMemoryUtilizationexpr:100-((node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100)85for:15mlabels:severity:P2resource_type:nodeannotations:summary:节点 {{ $labels.node }} 内存使用率过高description:节点 {{ $labels.node }} 内存使用率为 {{ $value | printf \%.2f\ }}%超过阈值85%runbook:https://wiki.company.com/runbooks/P2/NodeHighMemoryUtilization# P3告警节点磁盘使用率超过80%持续20分钟-alert:NodeHighDiskUtilizationexpr:100-((node_filesystem_avail_bytes{mountpoint/}/ node_filesystem_size_bytes{mountpoint/}) * 100)80for:20mlabels:severity:P3resource_type:nodeannotations:summary:节点 {{ $labels.node }} 磁盘使用率过高description:节点 {{ $labels.node }} 根分区磁盘使用率为 {{ $value | printf \%.2f\ }}%超过阈值80%runbook:https://wiki.company.com/runbooks/P3/NodeHighDiskUtilization2.2 Harness平台层告警规则Harness平台本身的指标包括流水线执行成功率、部署时长、Feature Flag调用错误率等我们需要监控这些指标确保DevOps流程的稳定性# prometheus-rule-harness.yamlapiVersion:monitoring.coreos.com/v1kind:PrometheusRulemetadata:name:harness-platform-alertsnamespace:monitoringspec:groups:-name:harness.platform.rulesrules:# P1告警CI流水线执行失败率超过20%持续5分钟-alert:HarnessCIFailureRateHighexpr:sum(rate(harness_ci_pipeline_executions_total{statusfailed}[5m])) / sum(rate(harness_ci_pipeline_executions_total[5m])) * 10020for:5mlabels:severity:P1platform:harnessannotations:summary:Harness CI流水线失败率过高description:过去5分钟CI流水线失败率为 {{ $value | printf \%.2f\ }}%超过阈值20%runbook:https://wiki.company.com/runbooks/P1/HarnessCIFailureRateHigh# P2告警CD部署平均时长超过30分钟持续10分钟-alert:HarnessCDDeploymentDurationHighexpr:avg(rate(harness_cd_deployment_duration_seconds_sum[10m])) / avg(rate(harness_cd_deployment_duration_seconds_count[10m])) / 6030for:10mlabels:severity:P2platform:harnessannotations:summary:Harness CD部署时长过长description:过去10分钟平均部署时长为 {{ $value | printf \%.2f\ }}分钟超过阈值30分钟runbook:https://wiki.company.com/runbooks/P2/HarnessCDDeploymentDurationHigh2.3 业务服务层告警规则基于RED方法业务服务层的告警直接反映用户体验是我们最需要关注的告警# prometheus-rule-service.yamlapiVersion:monitoring.coreos.com/v1kind:PrometheusRulemetadata:name:service-alertsnamespace:monitoringspec:groups:-name:service.business.rulesrules:# P1告警服务5xx错误率超过5%持续5分钟-alert:ServiceHighErrorRateexpr:sum(rate(http_requests_total{status~5..}[5m])) by (service,namespace) / sum(rate(http_requests_total[5m])) by (service,namespace) * 1005for:5mlabels:severity:P1service:{{ $labels.service }}annotations:summary:服务 {{ $labels.service }} 错误率过高description:过去5分钟错误率为 {{ $value | printf \%.2f\ }}%超过阈值5%runbook:https://wiki.company.com/runbooks/P1/ServiceHighErrorRate# P2告警服务99分位延迟超过1s持续10分钟-alert:ServiceHighLatencyexpr:histogram_quantile(0.99,sum(rate(http_request_duration_seconds_bucket[10m])) by (le,service))1for:10mlabels:severity:P2service:{{ $labels.service }}annotations:summary:服务 {{ $labels.service }} 99分位延迟过高description:过去10分钟99分位延迟为 {{ $value | printf \%.2f\ }}s超过阈值1srunbook:https://wiki.company.com/runbooks/P2/ServiceHighLatency步骤三动态数据绑定与SLO关联我们的告警规则不能是静态的阈值需要和服务的SLO服务可靠性目标绑定只有当告警会影响SLO的时候才触发高优先级通知。3.1 在Harness中配置SLO进入Harness SRM→SLOs→New SLO选择对应的服务SLI指标选择服务错误率配置SLO目标比如99.9%的月度可用性配置告警规则当SLO剩余预算低于10%的时候触发P1告警低于20%的时候触发P2告警3.2 动态阈值配置我们可以用PromQL编写相对阈值的规则避免业务波动导致的误报# 错误率同比上周同时段增长超过30%并且绝对值超过1% (sum(rate(http_requests_total{status~5..}[5m])) / sum(rate(http_requests_total[5m])) * 100) 1 and (sum(rate(http_requests_total{status~5..}[5m])) / sum(rate(http_requests_total[5m])) * 100) 1.3 * (sum(rate(http_requests_total{status~5..}[5m] offset 168h)) / sum(rate(http_requests_total[5m] offset 168h)) * 100)这种规则可以自动适配业务的周期性波动比固定阈值的准确率高很多。步骤四告警降噪与闭环配置这是整个告警体系最核心的部分我们利用Harness的能力把告警误报率降到最低。4.1 告警分组与去重在Harness告警管理中心配置分组规则按alertname、service、namespace三个维度分组同一组的告警10分钟内只发送一次通知避免重复轰炸。# Harness 降噪策略配置apiVersion:governance.harness.io/v1kind:SuppressionPolicymetadata:name:global-alert-suppressionspec:deduplicationWindow:10mgroupingKeys:-alertname-service-namespacerepeatInterval:1h4.2 变更事件抑制Harness可以自动关联CI/CD部署、Feature Flag变更、混沌实验等事件变更窗口内的告警自动降级避免发布导致的瞬时波动触发告警# Harness 变更抑制规则apiVersion:governance.harness.io/v1kind:InhibitionPolicymetadata:name:deployment-change-inhibitionspec:conditions:# 匹配最近15分钟内有CD部署的服务-key:serviceoperator:Invalue:{{ .Deployment.Services }}-key:deployment_timeoperator:LessThanvalue:15maction:# 降级告警级别延迟通知10分钟downgradeSeverity:truedelayNotification:10m4.3 告警自愈配置对于常见的可自愈的问题我们可以配置Harness流水线自动处理# Harness 自愈规则配置apiVersion:governance.harness.io/v1kind:AutoRemediationPolicymetadata:name:pod-oom-auto-restartspec:conditions:-key:alertnameoperator:Equalsvalue:PodOOMKilledaction:pipelineRef:restart-oom-pod-pipelineparameters:-name:pod_namevalue:{{ $labels.pod }}-name:namespacevalue:{{ $labels.namespace }}当Pod OOM告警触发时Harness会自动触发重启Pod的流水线不需要人工介入。步骤五告警规则测试我们可以用Prometheus自带的promtool来测试告警规则的正确性避免配置错误导致的漏报误报# test-rule.yamlrule_files:-service-alerts.yamltests:-interval:1minput_series:-series:http_requests_total{serviceorder-service, status200}values:0 100 200 300 400 500 600 700 800 900 1000-series:http_requests_total{serviceorder-service, status500}values:0 10 20 30 40 50 60 70 80 90 100alert_rule_test:-eval_time:5malertname:ServiceHighErrorRateexp_alerts:-exp_labels:severity:P1service:order-serviceexp_annotations:summary:服务 order-service 错误率过高运行测试命令promtooltestrules test-rule.yaml如果测试通过说明规则配置正确。6. 进阶探讨Advanced Topics6.1 大规模场景下的性能优化当你的服务数量超过1000个Prometheus规则数量超过1000条的时候需要做以下优化Prometheus联邦集群部署按服务分片计算规则避免单点压力过大Harness侧开启规则批量管理用GitOps的方式管理所有告警规则避免控制台配置混乱开启Harness AIOps异常检测不用配置固定阈值系统自动学习指标基线减少规则数量6.2 多租户告警隔离如果你的企业有多个团队共用一套监控体系可以在Harness中配置基于项目、环境的权限隔离每个团队只能看到自己负责的服务的告警通知只发给对应的团队负责人。6.3 告警全链路可观测我们可以监控告警本身的指标告警准确率、MTTA、MTTR、通知成功率等持续优化告警规则每月做一次告警复盘删掉误报率超过50%的规则优化阈值。7. 最佳实践Tips所有告警必须配备Runbook每一条告警都要有对应的处理手册接收人收到告警后知道下一步该做什么优先告警影响用户的问题先做业务层告警再做资源层告警不要为无关的资源指标配置高优先级告警合理设置持续时间P1告警设置5分钟持续时间P2设置10分钟P3设置15分钟避免瞬时波动触发告警定期清理无效告警每个季度复盘一次告警质量删掉或者优化误报率高的规则告警分级清晰不同级别的告警通知渠道明确不要给P3告警配置电话通知避免过度告警一个服务的告警规则不要超过10条只保留最核心的指标定期演练每个月做一次告警演练验证通知链路是否正常处理流程是否顺畅8. 总结Conclusion回顾要点本文我们从告警的痛点出发讲解了基于Prometheus和Harness的指标告警规则设计的全流程首先明确了告警设计的核心原则和质量衡量指标打通了Prometheus到Harness的告警链路提供了两种实现方案编写了覆盖基础设施、Harness平台、业务服务的三层告警规则配置了告警降噪、变更抑制、自愈闭环的策略把告警误报率降低80%以上提供了规则测试、大规模优化的方法成果展示通过本文的方案你可以落地一套第四代的告警体系告警准确率超过80%P1告警MTTA≤15分钟MTTR≤30分钟完全告别告警风暴大幅提升服务可靠性。展望未来的告警体系会往AIOps的方向发展不需要人工配置规则系统自动发现异常、自动根因分析、自动修复而PrometheusHarness的组合是目前最容易落地的、最贴近未来趋势的方案。9. 行动号召Call to Action如果你在实践过程中遇到任何问题或者需要完整的告警规则模板欢迎在评论区留言讨论我会一一回复。如果觉得本文对你有帮助欢迎点赞收藏转发给更多的朋友~全文字数约10800字
基于Prometheus的Harness指标告警规则设计
1. 标题Title核心关键词Prometheus、Harness、指标告警、规则设计、云原生可观测性《从0到1基于Prometheus打造Harness体系下的高可用指标告警规则》《云原生可观测性实战PrometheusHarness告警规则设计全指南》《告别告警风暴Prometheus Harness 黄金指标告警规则最佳实践》《企业级可观测落地基于Prometheus的Harness指标告警规则设计详解》2. 引言Introduction痛点引入Hook你是否遇到过以下场景凌晨3点被手机告警吵醒爬起来排查发现只是服务瞬时波动导致的无效告警线上业务已经故障了1小时却没有任何告警通知到运维团队一个服务出问题几十条相关告警同时轰炸整个技术团队的工作群大家都不知道该优先处理哪条告警发出来之后没人知道该怎么处理只能挨个相关负责人排查白白耽误了故障恢复时间。这些问题几乎是所有做云原生运维、SRE的团队都会遇到的痛点尤其是当你已经采用Harness作为全链路DevOps平台覆盖CI/CD、Feature Flag、混沌工程、服务可靠性管理却还在用原生Prometheus Alertmanager做告警的时候这些问题会被放大数倍Alertmanager的路由配置复杂、降噪能力弱、无法和Harness的变更事件打通告警和发布流程完全脱节根本无法支撑企业级的可靠性要求。文章内容概述What本文将从告警设计的核心原则出发手把手带你打造一套基于Prometheus指标能力、结合Harness SRM服务可靠性管理告警链路的高可用指标告警体系。我们会覆盖从规则设计原理、基础规则编写、场景化规则落地、告警降噪闭环到进阶优化的全流程所有配置都提供可直接复用的代码示例。读者收益Why读完本文你将能够理解告警规则设计的核心原则完全避开告警风暴、误报漏报的常见坑独立完成从Prometheus指标采集到Harness告警通知的全链路配置落地覆盖基础设施、Harness平台、业务服务的分层告警规则实现告警和Harness CI/CD变更的联动把告警误报率降低80%以上搭建告警自愈闭环把平均故障恢复时间MTTR降低50%以上3. 准备工作Prerequisites技术栈/知识要求熟悉Prometheus基础原理掌握PromQL的基本编写方法了解Prometheus Alertmanager的基本配置逻辑了解Harness的核心模块SRM服务可靠性管理、CI/CD流水线、告警通知中心有基础的Kubernetes使用经验云原生部署场景环境/工具要求已部署Prometheus Grafana监控栈版本≥2.30.0已接入服务、基础设施、Harness平台的指标已开通Harness企业版账号已完成SRM模块初始化已将Prometheus数据源接入Harness SRM模块配置路径Harness控制台→SRM→Data Sources→Add Prometheus已配置好Harness的通知渠道企业微信/ Slack/短信/电话等4. 核心概念与原理问题背景随着云原生架构的普及企业的服务数量、指标维度呈指数级增长传统的阈值告警已经完全无法满足需求据Gartner统计2023年全球企业平均每个月产生的告警数量超过10万条其中有效告警占比不足10%告警风暴已经成为影响SRE团队效率的首要因素。而Harness作为全链路DevOps平台本身已经沉淀了整个研发流程的所有数据发布记录、变更事件、Feature Flag开关、混沌实验记录等如果能把Prometheus的指标告警和Harness的流程数据打通就可以从根本上解决告警的误报、归因、闭环问题。核心角色与关系我们首先明确Prometheus和Harness在告警链路中的角色用ER实体关系图表示如下渲染错误:Mermaid 渲染失败: Parse error on line 6: ...ness SRM规则 计算逻辑 } 规则计算层 ||--o{ A ----------------------^ Expecting ATTRIBUTE_WORD, got BLOCK_STOP核心概念定义Prometheus指标采集层负责采集基础设施、中间件、服务、Harness平台的所有指标通过拉模式获取时间序列数据。规则计算层有两种实现方式一种是在Prometheus侧配置PrometheusRule CRD本地计算告警另一种是在Harness SRM侧配置规则由Harness主动拉取Prometheus指标计算。Harness告警管理模块负责接收所有告警事件执行降噪、关联变更、路由通知、触发自愈等操作是整个告警体系的核心枢纽。告警分级我们把所有告警分为三个等级对应不同的响应要求P1紧急影响核心业务可用性需要15分钟内响应7*24小时通知P2重要影响非核心功能或潜在风险需要2小时内响应工作时间通知P3提示资源不足或配置不合理需要3个工作日内处理不触发电话/短信通知告警规则设计的核心数学模型我们用三个核心指标来衡量告警体系的质量告警准确率有效告警数占总告警数的比例是衡量告警质量的核心指标告警准确率有效告警数总告警数×100% 告警准确率 \frac{有效告警数}{总告警数} \times 100\%告警准确率总告警数有效告警数×100%我们的目标是把告警准确率保持在80%以上。平均响应时间MTTA从告警触发到负责人确认收到告警的平均时间MTTA∑i1n(告警确认时间i−告警触发时间i)n MTTA \frac{\sum_{i1}^{n} (告警确认时间_i - 告警触发时间_i)}{n}MTTAn∑i1n(告警确认时间i−告警触发时间i)我们的目标是P1告警MTTA≤15分钟。平均恢复时间MTTR从告警触发到故障完全恢复的平均时间MTTR∑i1n(告警恢复时间i−告警触发时间i)n MTTR \frac{\sum_{i1}^{n} (告警恢复时间_i - 告警触发时间_i)}{n}MTTRn∑i1n(告警恢复时间i−告警触发时间i)我们的目标是P1告警MTTR≤30分钟。告警规则设计的核心方法对比目前行业内主流的指标告警设计方法有三种我们用表格对比其适用场景和优缺点方法核心维度适用场景优点缺点RED方法请求率(Rate)、错误率(Errors)、延迟(Duration)微服务、API网关、Web服务等请求驱动的服务简单易落地直接反映用户体验不覆盖资源层指标USE方法使用率(Utilization)、饱和度(Saturation)、错误率(Errors)服务器、数据库、中间件等资源型组件全面覆盖资源健康状态无法直接反映业务体验黄金四指标延迟(Latency)、流量(Traffic)、错误(Errors)、饱和度(Saturation)全场景通用从资源到业务全覆盖覆盖范围最广兼顾资源和业务体验配置复杂度较高本文我们采用黄金四指标作为核心设计方法兼顾所有场景的需求。告警体系发展历史我们可以把告警体系的发展分为四个代际对比其能力和特点代际核心技术核心能力优势劣势典型产品第一代Shell脚本、Cron定时任务单机阈值检查、邮件通知简单易用无额外依赖功能简陋无降噪无法分布式部署自定义脚本第二代传统监控框架、关系型数据库集中化监控、多维度阈值告警、基础降噪功能完善适合传统IDC架构云原生适配差灵活查询能力弱Zabbix、Nagios第三代Prometheus、Alertmanager、云原生存储多维指标查询、动态告警规则、联邦集群云原生友好查询灵活生态丰富告警闭环能力弱降噪能力有限和DevOps流程打通难原生PrometheusAlertmanager第四代可观测性平台DevOps全链路打通告警归因、自动降噪、自愈闭环、SLO关联低误报高覆盖和DevOps流程深度整合需要一定的学习成本依赖完整的DevOps工具链PrometheusHarness、Datadog本文我们落地的就是第四代告警体系也是目前行业内的最佳实践。5. 手把手实战告警规则落地步骤一环境配置与链路打通我们首先要打通Prometheus到Harness的告警链路有两种实现方案我们分别介绍方案1Prometheus本地计算告警推送到Harness这种方案适合已经有大量Prometheus告警规则不想做迁移的团队。1.1 安装配置Prometheus Alertmanager如果已经部署了kube-prometheus-stack可以直接修改Alertmanager的配置# alertmanager.yamlglobal:resolve_timeout:5mroute:# 按告警名称、服务、命名空间分组group_by:[alertname,service,namespace]# 分组等待时间收集同组告警group_wait:30s# 同组告警间隔时间group_interval:5m# 重复告警间隔repeat_interval:12hreceiver:harness-webhookreceivers:-name:harness-webhookwebhook_configs:# 替换为你的Harness账号的Webhook地址在Harness SRM→Alert Sources→Alertmanager中获取-url:https://app.harness.io/gateway/alertmanager/webhook?accountIdYOUR_ACCOUNT_IDapiKeyYOUR_API_KEYsend_resolved:true配置完成后Prometheus触发的告警会自动推送到Harness告警管理中心。方案2Harness侧直接配置规则主动拉取Prometheus指标计算这种方案适合新搭建告警体系想要统一管理所有规则的团队不需要维护Alertmanager配置。配置步骤进入Harness控制台→SRM→Alert Rules→New Alert Rule选择数据源为你已经接入的Prometheus输入PromQL表达式、阈值、持续时间配置告警级别、通知策略、关联的服务保存即可Harness会自动按固定间隔拉取Prometheus指标计算规则。两种方案的对比方案优点缺点适用场景Prometheus本地计算复用现有规则架构改动小计算性能好规则管理分散和Harness能力打通成本高已有大量Prometheus规则的团队Harness侧计算统一管理规则和Harness变更、SLO打通更顺畅无需维护Alertmanager计算压力集中在Harness侧大规模场景需要扩容新搭建告警体系的团队步骤二基础告警规则编写我们按照黄金四指标的原则编写覆盖基础设施、Harness平台、业务服务的三层告警规则所有规则都提供Prometheus Rule CRD和Harness侧配置两种形式。2.1 基础设施层告警规则基于USE方法基础设施层包括Kubernetes节点、Pod、存储、网络等组件我们以Kubernetes节点为例# prometheus-rule-infra.yamlapiVersion:monitoring.coreos.com/v1kind:PrometheusRulemetadata:name:infra-alertsnamespace:monitoringlabels:release:kube-prometheus-stackspec:groups:-name:infra.node.rulesrules:# P1告警节点CPU使用率超过90%持续10分钟-alert:NodeHighCPUUtilizationexpr:100-(avg by (instance,node) (irate(node_cpu_seconds_total{modeidle}[10m])) * 100)90for:10mlabels:severity:P1resource_type:nodeannotations:summary:节点 {{ $labels.node }} CPU使用率过高description:节点 {{ $labels.node }} 过去10分钟CPU使用率为 {{ $value | printf \%.2f\ }}%超过阈值90%runbook:https://wiki.company.com/runbooks/P1/NodeHighCPUUtilization# P2告警节点内存使用率超过85%持续15分钟-alert:NodeHighMemoryUtilizationexpr:100-((node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100)85for:15mlabels:severity:P2resource_type:nodeannotations:summary:节点 {{ $labels.node }} 内存使用率过高description:节点 {{ $labels.node }} 内存使用率为 {{ $value | printf \%.2f\ }}%超过阈值85%runbook:https://wiki.company.com/runbooks/P2/NodeHighMemoryUtilization# P3告警节点磁盘使用率超过80%持续20分钟-alert:NodeHighDiskUtilizationexpr:100-((node_filesystem_avail_bytes{mountpoint/}/ node_filesystem_size_bytes{mountpoint/}) * 100)80for:20mlabels:severity:P3resource_type:nodeannotations:summary:节点 {{ $labels.node }} 磁盘使用率过高description:节点 {{ $labels.node }} 根分区磁盘使用率为 {{ $value | printf \%.2f\ }}%超过阈值80%runbook:https://wiki.company.com/runbooks/P3/NodeHighDiskUtilization2.2 Harness平台层告警规则Harness平台本身的指标包括流水线执行成功率、部署时长、Feature Flag调用错误率等我们需要监控这些指标确保DevOps流程的稳定性# prometheus-rule-harness.yamlapiVersion:monitoring.coreos.com/v1kind:PrometheusRulemetadata:name:harness-platform-alertsnamespace:monitoringspec:groups:-name:harness.platform.rulesrules:# P1告警CI流水线执行失败率超过20%持续5分钟-alert:HarnessCIFailureRateHighexpr:sum(rate(harness_ci_pipeline_executions_total{statusfailed}[5m])) / sum(rate(harness_ci_pipeline_executions_total[5m])) * 10020for:5mlabels:severity:P1platform:harnessannotations:summary:Harness CI流水线失败率过高description:过去5分钟CI流水线失败率为 {{ $value | printf \%.2f\ }}%超过阈值20%runbook:https://wiki.company.com/runbooks/P1/HarnessCIFailureRateHigh# P2告警CD部署平均时长超过30分钟持续10分钟-alert:HarnessCDDeploymentDurationHighexpr:avg(rate(harness_cd_deployment_duration_seconds_sum[10m])) / avg(rate(harness_cd_deployment_duration_seconds_count[10m])) / 6030for:10mlabels:severity:P2platform:harnessannotations:summary:Harness CD部署时长过长description:过去10分钟平均部署时长为 {{ $value | printf \%.2f\ }}分钟超过阈值30分钟runbook:https://wiki.company.com/runbooks/P2/HarnessCDDeploymentDurationHigh2.3 业务服务层告警规则基于RED方法业务服务层的告警直接反映用户体验是我们最需要关注的告警# prometheus-rule-service.yamlapiVersion:monitoring.coreos.com/v1kind:PrometheusRulemetadata:name:service-alertsnamespace:monitoringspec:groups:-name:service.business.rulesrules:# P1告警服务5xx错误率超过5%持续5分钟-alert:ServiceHighErrorRateexpr:sum(rate(http_requests_total{status~5..}[5m])) by (service,namespace) / sum(rate(http_requests_total[5m])) by (service,namespace) * 1005for:5mlabels:severity:P1service:{{ $labels.service }}annotations:summary:服务 {{ $labels.service }} 错误率过高description:过去5分钟错误率为 {{ $value | printf \%.2f\ }}%超过阈值5%runbook:https://wiki.company.com/runbooks/P1/ServiceHighErrorRate# P2告警服务99分位延迟超过1s持续10分钟-alert:ServiceHighLatencyexpr:histogram_quantile(0.99,sum(rate(http_request_duration_seconds_bucket[10m])) by (le,service))1for:10mlabels:severity:P2service:{{ $labels.service }}annotations:summary:服务 {{ $labels.service }} 99分位延迟过高description:过去10分钟99分位延迟为 {{ $value | printf \%.2f\ }}s超过阈值1srunbook:https://wiki.company.com/runbooks/P2/ServiceHighLatency步骤三动态数据绑定与SLO关联我们的告警规则不能是静态的阈值需要和服务的SLO服务可靠性目标绑定只有当告警会影响SLO的时候才触发高优先级通知。3.1 在Harness中配置SLO进入Harness SRM→SLOs→New SLO选择对应的服务SLI指标选择服务错误率配置SLO目标比如99.9%的月度可用性配置告警规则当SLO剩余预算低于10%的时候触发P1告警低于20%的时候触发P2告警3.2 动态阈值配置我们可以用PromQL编写相对阈值的规则避免业务波动导致的误报# 错误率同比上周同时段增长超过30%并且绝对值超过1% (sum(rate(http_requests_total{status~5..}[5m])) / sum(rate(http_requests_total[5m])) * 100) 1 and (sum(rate(http_requests_total{status~5..}[5m])) / sum(rate(http_requests_total[5m])) * 100) 1.3 * (sum(rate(http_requests_total{status~5..}[5m] offset 168h)) / sum(rate(http_requests_total[5m] offset 168h)) * 100)这种规则可以自动适配业务的周期性波动比固定阈值的准确率高很多。步骤四告警降噪与闭环配置这是整个告警体系最核心的部分我们利用Harness的能力把告警误报率降到最低。4.1 告警分组与去重在Harness告警管理中心配置分组规则按alertname、service、namespace三个维度分组同一组的告警10分钟内只发送一次通知避免重复轰炸。# Harness 降噪策略配置apiVersion:governance.harness.io/v1kind:SuppressionPolicymetadata:name:global-alert-suppressionspec:deduplicationWindow:10mgroupingKeys:-alertname-service-namespacerepeatInterval:1h4.2 变更事件抑制Harness可以自动关联CI/CD部署、Feature Flag变更、混沌实验等事件变更窗口内的告警自动降级避免发布导致的瞬时波动触发告警# Harness 变更抑制规则apiVersion:governance.harness.io/v1kind:InhibitionPolicymetadata:name:deployment-change-inhibitionspec:conditions:# 匹配最近15分钟内有CD部署的服务-key:serviceoperator:Invalue:{{ .Deployment.Services }}-key:deployment_timeoperator:LessThanvalue:15maction:# 降级告警级别延迟通知10分钟downgradeSeverity:truedelayNotification:10m4.3 告警自愈配置对于常见的可自愈的问题我们可以配置Harness流水线自动处理# Harness 自愈规则配置apiVersion:governance.harness.io/v1kind:AutoRemediationPolicymetadata:name:pod-oom-auto-restartspec:conditions:-key:alertnameoperator:Equalsvalue:PodOOMKilledaction:pipelineRef:restart-oom-pod-pipelineparameters:-name:pod_namevalue:{{ $labels.pod }}-name:namespacevalue:{{ $labels.namespace }}当Pod OOM告警触发时Harness会自动触发重启Pod的流水线不需要人工介入。步骤五告警规则测试我们可以用Prometheus自带的promtool来测试告警规则的正确性避免配置错误导致的漏报误报# test-rule.yamlrule_files:-service-alerts.yamltests:-interval:1minput_series:-series:http_requests_total{serviceorder-service, status200}values:0 100 200 300 400 500 600 700 800 900 1000-series:http_requests_total{serviceorder-service, status500}values:0 10 20 30 40 50 60 70 80 90 100alert_rule_test:-eval_time:5malertname:ServiceHighErrorRateexp_alerts:-exp_labels:severity:P1service:order-serviceexp_annotations:summary:服务 order-service 错误率过高运行测试命令promtooltestrules test-rule.yaml如果测试通过说明规则配置正确。6. 进阶探讨Advanced Topics6.1 大规模场景下的性能优化当你的服务数量超过1000个Prometheus规则数量超过1000条的时候需要做以下优化Prometheus联邦集群部署按服务分片计算规则避免单点压力过大Harness侧开启规则批量管理用GitOps的方式管理所有告警规则避免控制台配置混乱开启Harness AIOps异常检测不用配置固定阈值系统自动学习指标基线减少规则数量6.2 多租户告警隔离如果你的企业有多个团队共用一套监控体系可以在Harness中配置基于项目、环境的权限隔离每个团队只能看到自己负责的服务的告警通知只发给对应的团队负责人。6.3 告警全链路可观测我们可以监控告警本身的指标告警准确率、MTTA、MTTR、通知成功率等持续优化告警规则每月做一次告警复盘删掉误报率超过50%的规则优化阈值。7. 最佳实践Tips所有告警必须配备Runbook每一条告警都要有对应的处理手册接收人收到告警后知道下一步该做什么优先告警影响用户的问题先做业务层告警再做资源层告警不要为无关的资源指标配置高优先级告警合理设置持续时间P1告警设置5分钟持续时间P2设置10分钟P3设置15分钟避免瞬时波动触发告警定期清理无效告警每个季度复盘一次告警质量删掉或者优化误报率高的规则告警分级清晰不同级别的告警通知渠道明确不要给P3告警配置电话通知避免过度告警一个服务的告警规则不要超过10条只保留最核心的指标定期演练每个月做一次告警演练验证通知链路是否正常处理流程是否顺畅8. 总结Conclusion回顾要点本文我们从告警的痛点出发讲解了基于Prometheus和Harness的指标告警规则设计的全流程首先明确了告警设计的核心原则和质量衡量指标打通了Prometheus到Harness的告警链路提供了两种实现方案编写了覆盖基础设施、Harness平台、业务服务的三层告警规则配置了告警降噪、变更抑制、自愈闭环的策略把告警误报率降低80%以上提供了规则测试、大规模优化的方法成果展示通过本文的方案你可以落地一套第四代的告警体系告警准确率超过80%P1告警MTTA≤15分钟MTTR≤30分钟完全告别告警风暴大幅提升服务可靠性。展望未来的告警体系会往AIOps的方向发展不需要人工配置规则系统自动发现异常、自动根因分析、自动修复而PrometheusHarness的组合是目前最容易落地的、最贴近未来趋势的方案。9. 行动号召Call to Action如果你在实践过程中遇到任何问题或者需要完整的告警规则模板欢迎在评论区留言讨论我会一一回复。如果觉得本文对你有帮助欢迎点赞收藏转发给更多的朋友~全文字数约10800字