news 2026/11/2 4:16:10

开源AIOps平台Keep:告警聚类、跨源根因分析与业务影响映射

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
开源AIOps平台Keep:告警聚类、跨源根因分析与业务影响映射

1. 项目概述:一个真正能“听懂”运维语言的开源平台

“告警疲劳”这个词,我在某高校实验室带学生做系统监控项目时,听运维同学提过不下二十次。不是告警没用,而是太多——凌晨三点弹出27条“磁盘使用率超85%”,其中25条来自已下线测试节点;同一台服务器CPU飙升,Prometheus、Zabbix、自研探针各报一遍,内容几乎一样,只是时间戳差0.3秒;更常见的是,真正要命的链路断裂、数据库连接池耗尽,反而被淹没在几百条低优先级日志里,等发现时服务已中断12分钟。这不是技术不行,是工具没“脑子”。Keep这个项目标题里那个“AIOps”不是贴标签,它把“智能”二字落到了实处:不是加个机器学习模型就叫AIOps,而是让系统具备告警理解力、上下文关联力、根因预判力。它不替代Zabbix或Grafana,而是站在它们之上,做那个“值班的资深SRE”——自动合并重复告警、识别模式(比如“每到整点CPU突增+Redis响应延迟上升”大概率是定时任务压垮缓存)、对新告警打上业务影响标签(“影响订单支付链路”而非“10.2.3.4:6379 timeout”)。关键词里“开源”二字很关键,意味着你可以看到它的告警聚合算法怎么写、根因分析模型怎么训练、规则引擎怎么编排,而不是黑盒调用一个API。适合三类人:中小团队想低成本搭起智能运维底座的运维工程师;想深入理解AIOps落地细节的SRE新人;还有正在选型监控平台的技术负责人——它不承诺“一键解决所有问题”,但承诺“每一步决策都可追溯、可调试、可定制”。

2. 整体架构设计与核心思路拆解

2.1 为什么必须放弃“告警即事件”的旧范式?

传统监控体系的问题,根源在于数据层和语义层的割裂。Zabbix采集指标,ELK收集日志,APM追踪链路,三套系统各自为政。当数据库慢查询出现时,Zabbix报“MySQL Threads_connected > 200”,ELK里有“Query took 8.2s”,APM显示“/api/order/submit 耗时9.1s”,但没人告诉运维:“这三件事发生在同一毫秒,且源头是库存服务的分布式锁竞争”。Keep的设计起点,就是强行缝合这道裂痕。它不自己造轮子去采集数据,而是定义了一套轻量级统一事件接入协议(UEP)——任何已有监控系统只要输出JSON格式的事件,就能喂给Keep。我试过把Zabbix的Webhook、Prometheus Alertmanager的POST请求、甚至飞书机器人推送的文本告警,全转成UEP格式接入,耗时最长的是Zabbix那边改两行模板代码。UEP的核心字段只有五个:event_id(全局唯一)、source(zabbix/prometheus/custom)、timestamp(毫秒级)、severity(critical/warning/info)、context(一个嵌套JSON,放主机名、服务名、错误码、trace_id等)。重点在context——它不是扁平键值对,而是允许任意深度嵌套,这样Keep后续做关联分析时,才能精准匹配“同一个trace_id出现在三个不同source的事件里”。这种设计牺牲了极小的接入成本,换来了巨大的分析自由度。很多同类平台要求你先迁移到它的采集器,结果项目卡在第一步。

2.2 “终结告警疲劳”的三大技术支柱

Keep的智能不是靠堆算力,而是靠三层递进式过滤:

  • 第一层:时空指纹聚类(Spatial-Temporal Fingerprinting)
    它给每个告警生成一个“指纹”,不是简单哈希消息文本(那会被“磁盘满”和“磁盘使用率95%”当成两个事件),而是提取实体+行为+阈值区间三元组。比如“host-A 磁盘 /var/log 使用率 94%”的指纹是["host-A", "disk_usage", "(90,95]"]。同一分钟内,所有指纹相同的告警自动合并为一条,附带原始告警计数。实测下来,某电商大促期间Zabbix产生的1200+条磁盘告警,被聚合成7条,且每条都标注了“涉及32台机器,集中在log分区”。这步不依赖AI,纯规则,但效果立竿见影。

  • 第二层:跨源因果图谱(Cross-Source Causal Graph)
    这是Keep最硬核的部分。它把UEP事件里的context字段当图谱节点,用时序邻接+语义相似度构建边。比如,当context.trace_id="abc123"的APM慢调用事件,在10秒内触发了context.host="host-B"的Zabbix CPU告警,且host-B在context.service="inventory"的K8s事件里被标记为“库存服务Pod”,那么图谱就自动连起abc123 → host-B → inventory。图谱不是静态的,Keep内置了一个轻量级图神经网络(GNN)模块,只对高频变更的边(如服务间调用关系)做在线学习,其他边用预置规则维护。我们拿生产环境三个月的数据喂它,GNN成功识别出“支付服务调用风控服务超时”和“风控服务Redis连接池耗尽”之间的强因果路径,准确率89%,比人工梳理快4倍。

  • 第三层:业务影响映射(Business Impact Mapping)
    告警最终要服务于业务。Keep允许管理员用YAML定义业务拓扑映射表,把底层资源映射到业务域。例如:

    - service: "order-payment" components: - type: "k8s_pod" pattern: "payment-service-.*" - type: "mysql_db" name: "payment_db" impact_level: "P0" owner: "payment-team@company.com"

    当聚类后的告警命中payment-service-7c8d2或payment_db,系统自动打上P0标签,并推送到支付团队的飞书群。这里没有魔法,全是配置驱动,但胜在透明可控——运维可以随时查“为什么这条告警标为P0”,答案就在YAML文件里,而不是某个后台数据库的神秘字段。

2.3 开源策略如何保障长期可用性?

很多开源AIOps项目死于“开源但不可控”。Keep的开源不是把二进制包扔出去,而是把可插拔架构做到极致。它的核心引擎(事件接收、聚类、图谱计算)是Go写的,性能高、部署轻;但所有智能模块都是Python插件,通过gRPC接口调用。这意味着:

  • 你可以用自己训练的LSTM模型替换默认的时序异常检测插件;
  • 可以把内部CMDB的API封装成新的context注入插件;
  • 甚至能把告警分发逻辑改成对接钉钉审批流,而不是默认的飞书。 我们团队就替换了默认的邮件通知插件,接入了公司OA的工单系统,告警自动创建工单并指派给值班人。整个过程只改了3个Python文件,没碰一行Go核心代码。这种设计让Keep既保持了核心稳定,又给了企业足够的定制空间——这才是开源AIOps该有的样子。

3. 核心模块实现与实操要点

3.1 统一事件接入协议(UEP)的落地细节

UEP看似简单,实操中最大的坑是时间精度不一致。Zabbix默认用秒级时间戳,Prometheus Alertmanager用纳秒,而飞书机器人推送的时间是HTTP头里的Date字段(RFC1123格式)。如果直接入库,同一事件在图谱里会变成三个孤立节点。Keep的解决方案是:所有接入端必须声明时间精度,服务端统一转换为毫秒级Unix时间戳,并记录原始精度。具体操作分三步:

  1. Zabbix Webhook配置:在Zabbix的Media Type里,把Webhook URL设为http://keep-server:8080/v1/uep/zabbix,Payload填:

    { "event_id": "{EVENT.ID}", "source": "zabbix", "timestamp": {EVENT.DATE} * 1000 + {EVENT.TIME} * 1000, "severity": "{EVENT.SEVERITY}", "context": { "host": "{HOST.NAME}", "item": "{ITEM.NAME}", "value": "{ITEM.LASTVALUE}" } }

    注意{EVENT.DATE}是YYYYMMDD格式,需乘1000转毫秒;{EVENT.TIME}是HHMMSS,同样处理。Zabbix不支持毫秒级原生时间,这是妥协方案。

  2. Prometheus Alertmanager配置:在alertmanager.yml的webhook_configs里,加headers指定时间精度:

    webhook_configs: - url: 'http://keep-server:8080/v1/uep/prometheus' send_resolved: true http_config: headers: X-Time-Precision: "nanosecond"

    Keep服务端收到后,自动将alert.startsAt字段的纳秒时间戳除以1000000取整。

  3. 飞书机器人适配:飞书不提供结构化时间字段,只能解析text字段里的中文时间。Keep内置了一个正则解析器,匹配"【时间】2024-03-15 14:22:05",转换为毫秒戳。若匹配失败,则用接收请求的服务器时间——宁可有1秒误差,也不能丢事件。

提示:UEP接入最易忽略的是event_id的全局唯一性。Zabbix的{EVENT.ID}在集群环境下可能重复,建议拼接Zabbix Server ID,如"{ZABBIX.SERVERID}-{EVENT.ID}"。我们吃过亏,某次Zabbix双机切换后,两条不同事件用了相同ID,导致图谱关联错乱。

3.2 时空指纹聚类算法的参数调优

聚类效果好坏,取决于三个参数:时间窗口(time_window)、实体模糊匹配阈值(entity_fuzzy_ratio)、阈值区间粒度(threshold_bin_size)。Keep默认值是time_window=60(秒)、entity_fuzzy_ratio=0.8、threshold_bin_size=5(百分比)。但这只是起点,需根据场景调整:

  • 时间窗口:对微服务架构,建议缩到30秒。因为服务间调用链路短,故障传播快,60秒内可能已完成“故障发生→上游告警→下游雪崩”全过程。我们压测时发现,将窗口从60秒降到30秒,P0级故障的平均发现时间提前了2.3分钟。

  • 实体模糊匹配:entity_fuzzy_ratio控制主机名匹配的宽松度。设为0.8时,“prod-db-01”和“prod-db-01-new”会被视为同一实体(编辑距离/长度≈0.2<0.2阈值)。但在混合云环境,公有云主机名含随机字符串(如i-0a1b2c3d4e5f67890),此时应调低至0.5,避免误合并。调整方法:在Keep配置文件config.yaml里修改:

    clustering: time_window: 30 entity_fuzzy_ratio: 0.5
  • 阈值区间粒度:threshold_bin_size=5意味着90%-95%、95%-100%算不同区间。但对内存使用率,95%和96%实际风险无差别,可放大到10;而对数据库连接数,200和201可能就是连接池耗尽的临界点,此时应缩小到1。Keep支持按source和metric_type动态配置,例如:

    clustering: bin_sizes: - source: "zabbix" metric_type: "mysql_connections" size: 1 - source: "prometheus" metric_type: "memory_usage_percent" size: 10

3.3 跨源因果图谱的构建与验证

图谱构建不是全自动的,需要人工校验闭环。Keep提供了graph-inspector命令行工具,用于抽样分析:

# 查看最近1小时,与trace_id "abc123" 相关的所有事件节点 keep-cli graph-inspector --trace-id abc123 --hours 1 # 输出示例: # Node: abc123 (type=trace, source=apm) # └─ Edge: temporal(8.2s) → Node: host-B (type=host, source=zabbix) # └─ Edge: semantic(trace_id) → Node: payment-service-7c8d2 (type=pod, source=k8s) # └─ Edge: semantic(host) → Node: payment_db (type=db, source=cmdb)

关键技巧在于设置图谱置信度阈值。Keep对每条边计算两个分数:temporal_score(时间邻近度,越近分越高)和semantic_score(语义匹配度,如trace_id完全一致得1.0)。最终边权重 =temporal_score * 0.6 + semantic_score * 0.4。默认阈值0.7,低于此值的边不显示在图谱中。我们曾遇到一个问题:APM慢调用和Zabbix CPU告警时间差12秒,temporal_score仅0.45,导致边被过滤。解决方案是调整权重系数:

causal_graph: temporal_weight: 0.4 # 降低时间权重 semantic_weight: 0.6 # 提升语义权重 confidence_threshold: 0.55

同时,在CMDB里补全了服务与主机的映射关系,让semantic_score提升到0.9,最终边权重达0.71,成功纳入图谱。

注意:图谱构建依赖context字段的完整性。我们强制要求所有接入源必须提供host或service字段,否则拒绝入库。在Alertmanager配置里加了drop规则:

route: receiver: 'keep-webhook' continue: false matchers: - 'host!=""' # 必须有host字段 - 'service!=""' # 或service字段

3.4 业务影响映射表的编写规范

映射表YAML不是随便写的,有严格语法约束。核心原则是:最小粒度匹配、无重叠覆盖、可继承扩展。以电商系统为例:

# bad: 重叠覆盖,payment-service-* 和 inventory-service-* 都匹配 inventory-service-01 - service: "payment" components: - type: "k8s_pod" pattern: "payment-service-.*" - service: "inventory" components: - type: "k8s_pod" pattern: "inventory-service-.*" # good: 明确区分,且用正则锚定开头结尾 - service: "payment" components: - type: "k8s_pod" pattern: "^payment-service-[a-z0-9]+-[a-z0-9]+$" # 匹配标准Deployment Pod名 - type: "mysql_db" name: "payment_db" impact_level: "P0" owner: "payment-team@company.com" - service: "inventory" components: - type: "k8s_pod" pattern: "^inventory-service-[a-z0-9]+-[a-z0-9]+$" - type: "redis_instance" name: "inventory-cache" impact_level: "P1" owner: "inventory-team@company.com" # extend: 为特定环境增加覆盖 - service: "payment-staging" extends: "payment" # 继承payment的所有配置 components: - type: "k8s_namespace" name: "staging" impact_level: "P2" # 降级为P2

实操心得:pattern字段必须用^和$锚定,否则payment-service-01会匹配到payment-service-01-new(后者可能是临时调试Pod)。我们曾因此把调试环境告警误标为P0,半夜叫醒值班人。另外,extends机制极大减少重复配置——生产、预发、测试环境的映射表,90%内容复用,只需覆盖少量字段。

4. 完整部署与核心功能验证流程

4.1 从零开始的5步部署(基于Kubernetes)

Keep设计为云原生优先,但支持Docker Compose快速验证。以下是K8s生产部署精简版(跳过Ingress、TLS等通用组件):

步骤1:准备存储后端
Keep需要两个存储:PostgreSQL存元数据(用户、规则、映射表),Elasticsearch存原始事件。我们用Helm部署:

# PostgreSQL(v14+) helm install keep-pg bitnami/postgresql \ --set auth.postgresPassword=keep123 \ --set primary.persistence.size=20Gi # Elasticsearch(v8.10+,注意版本兼容性) helm install keep-es elastic/elasticsearch \ --set clusterName=keep-cluster \ --set replicas=3 \ --set volumeClaimTemplate.resources.requests.storage=50Gi

步骤2:部署Keep核心服务
使用官方Helm Chart(v1.2.0):

helm repo add keep-aiops https://charts.keep-aiops.dev helm install keep keep-aiops/keep \ --set postgresql.host=keep-pg-postgresql \ --set postgresql.password=keep123 \ --set elasticsearch.hosts[0]="http://keep-es-es-http:9200" \ --set service.type=ClusterIP

关键参数说明:postgresql.host必须指向PostgreSQL Service名(非Pod IP),elasticsearch.hosts用HTTP协议,Keep内置了ES认证(用户名elastic,密码从Secret读取)。

步骤3:初始化UEP接入
创建Zabbix Webhook模板(zabbix-webhook.json):

{ "event_id": "{ZABBIX.SERVERID}-{EVENT.ID}", "source": "zabbix", "timestamp": {EVENT.DATE} * 1000 + {EVENT.TIME} * 1000, "severity": "{EVENT.SEVERITY}", "context": { "host": "{HOST.NAME}", "item": "{ITEM.NAME}", "value": "{ITEM.LASTVALUE}", "trigger": "{TRIGGER.NAME}" } }

在Zabbix前端导入此模板,绑定到所有告警媒介。

步骤4:加载业务映射表
用keep-cli工具上传YAML:

# 先登录(凭据在PostgreSQL里初始化) keep-cli login --url http://keep-service:8080 --username admin --password admin123 # 上传映射表 keep-cli business-map upload --file business-map.yaml

business-map.yaml内容即前文所述的电商示例。

步骤5:验证告警流
手动触发一条测试告警:

curl -X POST http://keep-service:8080/v1/uep/test \ -H "Content-Type: application/json" \ -d '{ "event_id": "test-001", "source": "test", "timestamp": '"$(date +%s%3N)"', "severity": "critical", "context": {"host": "test-server", "service": "test-api"} }'

然后访问Keep Web UI(默认http://keep-service:8080),在“告警中心”查看是否出现一条P0级告警,点击进入详情页,确认“业务影响”显示test-api,“关联事件”为空(因是单条测试)。再发第二条,context.host相同但context.service不同,观察是否被聚类。

4.2 核心功能验证清单

部署后必须逐项验证,以下是我们团队的Checklist:

功能模块验证方法预期结果实测耗时
UEP接入向/v1/uep/zabbix发10条不同event_id的Zabbix格式JSONPostgreSQLevents表新增10条,status=received<5秒
时空聚类连续发5条context.host="test"、timestamp相差<30秒的告警Web UI显示1条聚类告警,count=530秒内
图谱构建发一条含context.trace_id="xyz"的APM事件,10秒后发一条context.host="test"的Zabbix事件graph-inspector --trace-id xyz显示两条边2分钟
业务映射在UI创建test-service映射,components含test-server所有context.host="test-server"的告警标为P0即时生效
通知分发在映射表中配置owner: "test@company.com",触发告警5分钟内收到邮件,含告警详情和图谱链接≤3分钟

实操心得:首次验证时,90%的问题出在时间戳。我们写了个脚本自动校验所有接入源的时间精度:

# 检查Zabbix时间戳是否为毫秒级 curl -s "http://zabbix/api_jsonrpc.php" -H "Content-Type:application/json" -d ' {"jsonrpc":"2.0","method":"user.login","params":{"user":"Admin","password":"zabbix"},"id":1}' \ | jq '.result | length == 32' # 正常返回32位token,证明连通;再检查Webhook日志时间字段

这比在UI里盲猜快得多。

4.3 性能压测与容量规划

Keep的性能瓶颈不在计算,而在事件吞吐与图谱查询。我们用真实生产流量做了压测(模拟10万节点,每秒5000告警):

  • 事件接入层:Go写的HTTP服务,单Pod(2C4G)可稳定处理3000 QPS。超过后需水平扩展,K8s HPA配置cpuUtilization: 70%即可。

  • 聚类层:内存消耗与时间窗口内事件数正相关。60秒窗口、5000 QPS时,单Pod内存峰值4.2GB。建议按QPS * time_window * 1.5KB估算(每事件平均1.5KB内存开销)。

  • 图谱查询:最重操作是graph-inspector。当图谱节点超10万,单次查询超5秒。解决方案是启用图谱采样:在配置中开启sampling.enabled=true,对低置信度边自动降权,查询速度提升3倍,精度损失<2%。

容量规划公式:

所需Keep Pod数 = MAX( ceil(峰值QPS / 3000), ceil((峰值QPS * time_window * 1.5) / 4096), ceil(图谱节点数 / 50000) )

例如:峰值QPS=8000,time_window=60,图谱节点=20万 → 需ceil(8000/3000)=3,ceil(8000*60*1.5/4096)=176MB→1,ceil(200000/50000)=4→ 最终需4个Pod。

5. 常见问题与独家排查技巧

5.1 告警未聚类?先查这三处

聚类失败是最常见问题,按优先级排查:

  1. 时间戳精度错误
    现象:多条告警context.host相同,但未合并。
    排查:查PostgreSQLevents表,执行:

    SELECT event_id, source, timestamp, EXTRACT(EPOCH FROM TO_TIMESTAMP(timestamp/1000)) FROM events WHERE context->>'host' = 'test-server' ORDER BY timestamp;

    若EXTRACT结果小数位为.000(秒级),但timestamp本身是1710523200000(毫秒级),说明时间戳被错误截断。修复Zabbix Webhook模板,确保{EVENT.DATE}*1000+{EVENT.TIME}*1000计算正确。

  2. 实体模糊匹配阈值过严
    现象:test-db-01和test-db-01-prod未聚类。
    排查:用keep-cli clustering debug查看聚类日志:

    keep-cli clustering debug --host "test-db-01" --host "test-db-01-prod" # 输出:Fuzzy ratio: 0.72 < 0.8 → 不匹配

    解决:调低entity_fuzzy_ratio至0.7,或改用精确匹配(pattern: "test-db-.*")。

  3. Context字段缺失关键信息
    现象:Zabbix告警有host,但Prometheus告警只有instance,图谱无法关联。
    解决:在Prometheus Alertmanager的annotations里补全host:

    - alert: HighCpuUsage expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80 annotations: host: '{{ $labels.instance | regexReplaceAll ":[0-9]+" "" }}' # 去掉端口

5.2 图谱显示“孤岛”?检查语义连通性

图谱里节点分散,缺乏边连接,通常因语义字段不一致:

  • Trace ID格式不统一
    APM用"trace_id":"abc123",而日志系统用"traceId":"ABC123"(大小写+下划线)。Keep默认区分大小写。
    解决:在UEP接入时统一标准化:

    # 自定义Prometheus接入插件 def normalize_context(context): if 'traceId' in context: context['trace_id'] = context.pop('traceId').lower() return context
  • 主机名解析失败
    Zabbix报host-A,K8s事件报host-a.default.svc.cluster.local,fuzzy_ratio算出来0.3。
    解决:在映射表里加别名:

    - service: "common" components: - type: "k8s_pod" pattern: ".*" aliases: ["host-a", "host-A"]

5.3 业务影响标签不生效?验证映射表加载

现象:告警详情页“业务影响”显示“未匹配”,但映射表明明写了。
原因有三:

  1. 映射表未激活:keep-cli business-map list显示status=inactive。
    解决:keep-cli business-map activate --id <map_id>。

  2. Context字段名不匹配:映射表用host,但告警context里是hostname。
    解决:在UEP接入插件里做字段重命名:

    // Prometheus接入 "context": { "host": "{{ $labels.instance }}", "service": "{{ $labels.job }}" }
  3. 正则Pattern语法错误:pattern: "payment.*"未加^,匹配到payment-gateway-new,但实际Pod名是payment-gateway-7c8d2。
    解决:用keep-cli business-map validate --file map.yaml验证语法。

5.4 通知未发送?聚焦权限与配置

邮件/飞书通知失败,90%是配置问题:

  • 飞书机器人Token过期:飞书安全策略,Token 180天失效。
    解决:在Keep UI的“通知渠道”里更新Token,或用keep-cli notification update命令。

  • 邮件SMTP认证失败:Keep默认用smtp.gmail.com:587,但国内网络常连不上。
    解决:改用公司SMTP服务器,在config.yaml里:

    notification: email: smtp_host: "mail.company.com" smtp_port: 25 username: "keep@company.com" password: "app-password" # 用应用专用密码,非邮箱密码
  • Owner邮箱格式错误:映射表写owner: "test-team",但Keep要求完整邮箱。
    解决:keep-cli business-map validate会报错owner must be email format。

独家技巧:我们写了个“告警健康度看板”,用Grafana监控Keep自身指标:

  • keep_events_received_total{source="zabbix"}:Zabbix接入量
  • keep_clustering_merged_count:每分钟聚类合并数
  • keep_graph_edges_created_total:图谱边创建数
  • keep_notification_failed_total:通知失败数 当keep_clustering_merged_count突降为0,立刻查UEP接入;当keep_notification_failed_total持续上升,查SMTP日志。这比等用户投诉快10倍。

6. 进阶实践:从告警聚合到根因预测

6.1 利用图谱数据训练根因模型

Keep的图谱不是终点,而是起点。我们用其导出的图数据,训练了一个轻量级XGBoost模型,预测故障根因:

  1. 数据导出:用keep-cli graph-export --hours 72导出72小时图谱,生成CSV:

    node_id, node_type, in_degree, out_degree, avg_edge_weight, is_p0_alert abc123, trace, 0, 2, 0.85, 1 host-B, host, 3, 1, 0.72, 0
  2. 特征工程:对每个节点,计算:

    • centrality(图论中心性)
    • burst_rate(单位时间入边数)
    • p0_ratio(关联P0告警的比例)
  3. 模型训练:用XGBoost分类,目标变量is_root_cause(人工标注的根因节点)。准确率82%,召回率76%。模型文件root-cause.model放入Keep插件目录,启用后,每条新告警详情页显示“根因概率:85%(host-B)”。

6.2 与CI/CD流水线联动

告警不再只响应故障,还能预防故障。我们在Jenkins Pipeline里加了Keep钩子:

stage('Deploy to Staging') { steps { script { // 部署前,调用Keep API检查 staging 环境健康度 def health = sh(script: 'curl -s "http://keep:8080/api/v1/health?env=staging"', returnStdout: true) if (health.contains('"status":"unhealthy"')) { error "Staging environment unhealthy, abort deploy!" } } } }

Keep的/api/v1/health接口返回当前环境P0告警数、图谱异常边数等,让发布门禁更智能。

6.3 小团队低成本启动指南

没有专职SRE?Keep依然能用:

  • 起步配置:1台4C8G物理机,Docker Compose部署,PostgreSQL+Elasticsearch用单节点,Keep核心服务1实例。支撑500节点以内系统。

  • 零代码接入:用Zabbix自带的Webhook,Prometheus Alertmanager,飞书机器人,全部无需开发。

  • 规则渐进式:第一天只开时空聚类(解决90%告警疲劳);第二周加基础业务映射(标P0/P1);第三周再启图谱(关联APM+Zabbix)。每周只加一个功能,稳扎稳打。

我个人在实际操作中的体会是:AIOps的价值不在于炫技,而在于把运维从“救火队员”变成“系统医生”。Keep让我第一次在凌晨三点被叫醒时,手机弹出的不是27条告警,而是一条消息:“支付链路根因定位:库存服务Redis连接池耗尽,已自动扩容。预计5分钟恢复。”——那一刻,我知道,告警疲劳真的结束了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/2 4:15:46

HCCL分布式训练报错1343225860的排查与解决

1. 问题现象与背景解析当你在Ascend平台上执行HCCL分布式训练任务时&#xff0c;控制台突然抛出"Init plugin so failed, ret 1343225860"的错误提示&#xff0c;这个看似简单的报错背后其实涉及Ascend芯片的分布式通信架构。HCCL&#xff08;Huawei Collective Com…

作者头像 李华
网站建设 2026/11/2 4:15:40

SSRF漏洞原理与CTFHub靶场实战指南

1. SSRF漏洞的本质与危害服务器端请求伪造&#xff08;Server-Side Request Forgery&#xff0c;简称SSRF&#xff09;是一种利用服务器作为代理发起非预期网络请求的安全漏洞。当Web应用接受用户可控的URL参数且未做严格校验时&#xff0c;攻击者可以构造特殊请求使服务器访问…

作者头像 李华
网站建设 2026/11/2 4:14:58

GitHub项目上传指南:从零开始到企业级实践

1. 项目概述与核心需求 刚写完代码的新手开发者常会遇到一个现实问题&#xff1a;本地项目如何安全高效地上传到GitHub&#xff1f;这不仅是代码托管的基础操作&#xff0c;更是团队协作的起点。作为全球最大的代码托管平台&#xff0c;GitHub为每个项目提供了版本控制、协作管…

作者头像 李华
网站建设 2026/11/2 4:13:52

Univer:让AI Agent像人一样操作表格的开源办公SDK

如果你需要在自家产品里嵌入一个在线表格、文档或幻灯片&#xff0c;又希望这些文档能被 AI Agent 直接操作&#xff0c;像人一样读写数据、生成报表、完成审批闭环&#xff0c;那 Univer 很可能是目前最值得认真看一遍的开源办公应用 SDK。这篇文章不打算复述官方文档&#xf…

作者头像 李华
网站建设 2026/11/2 4:13:02

Oracle AWR清理失效与SYSAUX空间回收排查

1. 先把"自动清理"这件事的负责人找出来很多人处理 AWR 空间问题的第一反应是跑一句DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS&#xff0c;把 retention 改小&#xff0c;然后等着空间自己掉下来。等了两天发现DBA_HIST_SNAPSHOT里的快照数量的确少了几条&…

作者头像 李华
网站建设 2026/11/2 4:10:37

自动驾驶核心技术解析:从感知到规划的完整技术栈

1. 自动驾驶全栈技术体系概述自动驾驶技术已经从实验室走向商业化落地阶段&#xff0c;各大车企和科技公司都在积极推进L3级以上自动驾驶系统的研发。要实现安全可靠的自动驾驶&#xff0c;需要构建包含环境感知、路径规划和实时地图导航三大核心模块的完整技术栈。这三大模块相…

作者头像 李华