AI运维Agent实战:Ongrid如何用大模型实现告警自动根因定位
聊到AI运维Agent我第一个想到的场景就是凌晨三点的告警电话和永远处理不完的重复工单。传统运维不是不想自动化是自动化脚本天生只会回答“你定义过的问题”一旦遇到没见过的异常整个流程就断在那里了。Ongrid这个开源项目走了一条不一样的路——把大模型的理解能力和推理能力接到监控、日志、执行链路里让Agent像初级运维工程师一样去感知异常、定位原因、给出处理建议甚至在你批准后直接执行修复动作。这篇文章我从项目思路、技术架构、实操部署到踩坑记录一条龙拆给你看希望能给正在做运维平台或者被日常巡检压得喘不过气的团队一些参考。1. 项目概述与核心思路1.1 为什么需要AI运维Agent运维的困局先说说我们自己的痛点。团队维护的微服务数量过了几百个以后监控指标、日志、告警出现指数级增长光告警每天就能刷出几百条。传统的告警规则再精细也逃不过两个魔咒一是告警风暴一个根因故障会连带触发十几个下游告警二是告警疲劳值班同学看多了无效告警真正出大事时反而麻木了。更头疼的是每次故障的处理经验都沉淀在个人脑子里或者散落在聊天记录里人一走经验就断层了。当时我们尝试过几类方案第一类是给监控系统加智能降噪比如把告警做聚合收敛解决一部分问题但根因还是要人去找第二类是写自动化运维脚本把常见的故障场景做成预案但新问题出现时脚本就失效了第三类是引入AIOps平台但商业产品重、定制化成本高而且很多其实还是规则引擎换了个壳。真正让我下定决心转向AI Agent方向的是意识到大语言模型带来了一个关键能力——把“工具调用”和“逻辑推理”结合起来。运维的大部分工作本质上是观察现象、提出假设、验证假设、执行修复这恰恰是Agent擅长的事情。Ongrid正是把这条链路打通了它让Agent能看指标、查日志、跑命令、发审批然后像人一样去判断该做什么。1.2 Ongrid的定位与设计目标Ongrid核心的理念是“把运维动作拆成可编排的技能让大模型做调度器”。它不是一个简单的监控工具也不是一个ChatBot而是一个非常务实的Agent框架底层对接运维体系里已有的数据源和工具链上层暴露自然语言交互入口中间通过Agent推理决定调用哪些工具、按什么顺序调用、结果怎么分析。项目开源时定位就已经很清晰了——做基础设施层和业务层之间的“智能胶水”。这个选择很聪明因为运维领域的数据源、工具链本来就极其碎片化Prometheus、Grafana、ELK、Kubernetes、CMDB、工单系统每一样都有自己独立的交互方式。Ongrid要做的不是替代这些系统而是统一地用Agent去调度它们。这样无论你的环境是虚拟机时代的老架构还是Kubernetes云原生体系都能低成本接入。1.3 适用场景与目标读者如果你满足下面任何一条这个项目就值得关注团队里有大量重复性的巡检、告警确认、日志初步排查工作想释放人力做更有价值的事。已经是微服务架构服务数量上来了故障定位时间越来越长MTTR下不去。有基本的自动化工具链Prometheus、K8s、CI/CD等但缺少一个统一的智能调度层。对数据安全有要求希望把AI运维能力完全私有化部署在内网环境中。Ongrid的设计对运维新手和老手都友好新手可以用自然语言直接提问“帮我看看订单服务的错误率为什么升高”Agent会自己走流程老手则可以下沉去扩展工具库把自己沉淀的排查思路固化成语料和编排模板。项目还没有到能完全替代人的程度但你给它画好边界、给它接上足够的工具它已经能处理相当比例的日常告警处置了。2. 技术拆解与架构设计2.1 总体架构与核心模块从源码的目录结构和运行时的进程模型来看Ongrid整体采用了“数据底座 Agent核心 工具集 交互层”的四层架构逻辑非常清晰。第一层是数据底座负责对接各类可观测性数据源。它不自己做存储而是通过上游连接器统一拉取Prometheus指标、Loki或ES日志、K8s事件以及对接到CMDB里的拓扑关系数据。这层做了一件极其关键的事情——把原来的异构数据抽象成统一的事件模型和上下文模型这样Agent在推理时不用关心数据源之间的格式差异。第二层是Agent核心这是整个系统的大脑。它包含规划器Planner、记忆模块、推理引擎和反思模块。触发方式分两种一种是用户主动提问另一种是被动接收告警回调。接到任务后规划器会把一个复杂目标拆解成多个子任务步骤每一步可能对应一次工具调用或一轮信息检索。过程中推理引擎会结合工具返回的数据做分析如果需要更多信息会动态追加子步骤这个能力与传统的“预制脚本流水线”有本质区别——它是动态规划执行路径而不是固定按预设流程跑。第三层是工具集。Ongrid内置了一些常用工具比如Kubernetes操作工具、PromQL查询工具、日志检索工具、Shell命令执行工具同时暴露出一个标准的工具注册接口。你可以用Python或者Go写一个自定义工具把它注册进去之后Agent就能通过自然语言识别并调用它。第四层是交互层。支持Web UI、命令行界面以及Webhook API三种方式同时也是审批动作的交互入口。当Agent准备执行一个高风险操作时比如删除Pod、修改配置它会生成一个审批请求推送给用户用户确认后才会真正执行。2.2 关键模块的工程化细节几个模块的设计细节值得展开说一下。规划器采用的是类似ReActReason and Act的循环范式但做了一点关键改进每个子任务都有明确的“期望产出描述”。比如拆解出“查询订单服务的P99延迟”这个子任务规划器会同时记录“这一步的产出应该是一个时间序列的指标数据用于后续判断是否存在延迟突增”。这个设计看起来简单却大幅提升了Agent在复杂故障场景中的稳定性因为每一步都有明确的中间产物校验机制。记忆模块分成两层短期记忆是当前任务上下文中的所有数据比如查询到的指标、分析出的中间结论长期记忆则是一个向量库沉淀的是历史故障处理经验。这个向量库很关键它可以把你团队过去一年里沉淀的故障复盘报告、oncall手册、常见问题处理流程喂给模型做RAG。换句话说你团队的经验会越用越值钱这也是Ongrid与传统自动化脚本最大的分水岭。2.3 为什么采用编排而非全自动安全边界的设计取舍我见过不少团队做AI运维时一上来就想全自动让Agent出了问题直接改配置、重启服务。这个想法听起来很美但在生产环境几乎必然出事。大模型的推理能力再强也无法保证100%正确判断。Ongrid在这一点上做得非常克制值得学习。它默认采用“建议优先执行审批”的模式。Agent在诊断阶段可以放开手脚去查数据、跑只读命令但到了执行阶段系统引入了严格的行动分级只读类操作查询指标、搜索日志、查看资源状态允许自动执行。低风险操作增加告警阈值、生成巡检报告、执行健康检查脚本默认自动执行并记录审计日志。高风险操作清理资源、重启服务、修改配置必须经过人工审批并且要求Agent用自然语言解释“为什么这么做、预期效果是什么、回滚方案是什么”。这套分级的本质是把Agent当作一个能力非常强的“建议者”而不是一个全权的“执行者”。人来做最后的判断Agent负责把判断所需的上下文和依据准备好。实际用下来这种方式既提升了效率又不会让人提心吊胆。2.4 数据底座让Agent“看得懂”监控数据很多Agent项目死在了数据接入这一步。不是说连不上数据源而是连上之后模型根本看不懂这些数据。Ongrid在数据底座层做了三件很细腻的事第一指标语义标注。它不会直接把Prometheus的原始指标名丢给大模型而是通过预配置的元数据比如metric名称、标签含义、单位、阈值参考范围对大模型可见让大模型知道http_request_duration_seconds_bucket是什么意思而不仅仅是看到一串变量名。第二日志结构化摘要。日志数据量巨大全量塞进上下文既不现实也没必要。Ongrid会先用规则和轻量模型对日志做预筛选提取出错误级别、异常堆栈摘要、出现频率等结构化信息再交给Agent。这一步的降噪效果直接决定了Agent的推理质量。第三拓扑与指标的关联。故障定位不能只看单点数据。Ongrid会从K8s或CMDB里拉取服务依赖关系把“服务A调用服务B”的拓扑关系合并到Agent的上下文里。这样Agent分析时能自然地想到“服务B延迟升高可能是被服务A的流量打爆了”。实时数据的关联能力让它不只是一堆查询的集合而是一个真正有全局视角的“体检医生”。3. 实操过程与核心场景落地3.1 快速部署与数据源接入Ongrid的部署方式对运维团队足够友好。源码仓库里提供了基于Docker Compose的一键编排包含三个核心容器Agent服务、Worker执行器和向量数据库。我实测下来在64核、128G内存的机器上从拉代码到启动服务20分钟以内可以完成。硬件要求不算高因为推理引擎默认支持对接常见的大模型推理服务生产环境当然建议用私有化部署的模型服务本地测试用兼容的API就行。配置文件里需要注意三个地方数据源连接Prometheus地址、日志查询接口、K8s kubeconfig路径。这几项填好了Agent的基本视野就有了。工具白名单只读工具默认全部开启执行类工具建议按环境逐步放开。审批通道配置审批人的IM通知或者飞书/钉钉机器人Webhook。下面是个简化的配置示例datasources: prometheus: url: http://prometheus:9090 timeout: 10s loki: url: http://loki:3100 query_range: 24h agent: llm_backend: vllm llm_endpoint: http://localhost:8000/v1 model_name: qwen2.5-72b-instruct memory_store: vector_db tools: on_readonly: [promql_query, log_search, k8s_get, shell_read] on_review: [k8s_restart, shell_write] approval: channel: webhook url: http://your-bot-server/hook/xxx这个配置段就是一套标准的“安全边界”声明。我最欣赏的是on_readonly和on_review的分离它把权限模型变得肉眼可审计不用猜Agent到底能干什么。3.2 核心场景实测告警驱动的自动根因定位我在测试环境里模拟过一次完整的故障场景是订单服务P99延迟突增。整个过程让我对Agent的能力边界有了直观认识。当时Prometheus触发了一条告警通过Webhook拉到Ongrid。Agent的处置流程大致是第一步收集信息。Agent并行发起了几个查询订单服务的P99延迟趋势、最近10分钟的QPS变化、相关Pod的CPU和内存使用率、最近5分钟的错误日志数量。这些操作都是只读工具直接自动执行了。第二步初步分析。它发现P99确实在某个时间点出现尖峰同时注意到数据库连接池使用率同步上升。Agent提出了第一个假设可能是慢查询导致数据库连接被占满从而拖慢了上游服务。第三步验证假设。它自动去查了数据库慢查询日志发现有一类新的查询模板的执行时间从20ms飙升到2秒。同时它还对比了最近的发布记录发现慢查询出现的时间点和订单服务新版本上线的时间点重叠。第四步生成报告。Agent把整个推理链条完整输出是什么问题新版本引入了低效的SQL查询、影响的链路数据库连接池耗尽导致下游阻塞、可能的修复方案回滚该版本或优化SQL索引、需要哪个团队介入。全程没有人工操作查询命令从告警触发到报告生成耗时大约3分钟。如果换人工来做光是查完这些指标和日志至少也要十几分钟。最关键的是中间那步“指标和日志综合对比”是最容易被遗漏的而Agent借助拓扑关联能力把数据库层面和应用的关联直接拉出来减少了人判断主观性的偏差。当然是需要强调这个场景里Agent的出色表现前提是我提前把服务拓扑、指标语义这些元数据都配好了。如果在数据没有喂饱的情况下跑Agent的表现会大打折扣。3.3 扩展自定义运维工具如果说内置工具让Agent能跑起来自定义工具则让Agent能真正融入你的体系。Ongrid的工具注册机制是做得很通用的一环整体思路是写一个执行函数再用一段JSON Schema描述这个函数的入参、出参、用途把两者注册进去Agent就会在需要时调用它。我自己写的一个工具是从自研发布系统拉取某个服务的变更历史。正好补上了Ongrid默认视角里没有“最近发布记录”的短板。之后我再跑告警分析时Agent会自动把变更排查拉进推理链路里这个能力非常实用。一个典型的工具配置大概长这样# my_release_tool.py from ongrid import ToolContext def get_recent_releases(service: str, window_hours: int 24): 获取指定服务最近一段时间内的发布记录 releases release_system.query(serviceservice, hourswindow_hours) return [{version: r.version, time: r.time, operator: r.operator} for r in releases] # JSON Schema 描述 TOOL_SCHEMA { name: get_recent_releases, description: 获取服务最近N小时内的发布记录用于故障排查时关联变更因素, parameters: { type: object, properties: { service: {type: string, description: 服务名称}, window_hours: {type: integer, description: 回溯时间窗口单位小时} }, required: [service] } } # 注册到运行环境 ToolContext.register(get_recent_releases, TOOL_SCHEMA)有一个小技巧JSON Schema里的description字段别随便写。Agent没有人类的常识它完全依赖这段描述来决定什么时候调用、传什么参数。描述要写清楚“这个工具在什么场景下用、数据有什么特征和局限”。我的坑是一开始写得太简略Agent在排查K8s问题时频繁调用发布系统工具后来把描述改成“仅用于排查应用层变更、查询实为版本与发布记录”情况就好多了。3.4 效果量化与SLO观测上线一段时间后我给自己的使用效果做了一次量化对比重点看三个维度。第一个维度是告警事件压缩率。接入Ongrid后告警不再是每条都直接打扰人Agent会先做初步判定把相关的告警归并成同一个“事件处理单”。我们这边大概把日均300多条告警归并成了40多个事件单压缩率超过85%。第二个维度是MTTA平均确认时间和MTTR平均恢复时间。MTTA从原来的15分钟降到了4分钟左右因为Agent已经完成了初步排查人只需要看结论。MTTR方面可以自主执行的修复比如重启异常组件、清理磁盘效率提升是非常明显的但从确认到最终恢复还是需要人来决策整体降低大约30%到40%。第三个维度是值班负载。以前每班一个全职值班人员高峰期还要双人值守。现在大部分告警处置变成了“人审阅Agent报告 低频人工介入”值班同学可以腾出精力做容量规划、稳定性项目这是最实实在在的价值。值布局注意没有充分授权的阶段不要为了追求指标而盲目放开自动化执行权限。安全和效率之间先保安全再提效率。4. 常见问题与调试实录4.1 幻觉问题Agent给出错误结论怎么办这是所有LLM类产品都绕不开的话题AI运维Agent尤其危险因为它在处理真实的生产数据一个错误的结论可能引导人做出错误的变更。我遇到的典型案例是某次Agent分析一个偶发超时问题因为日志里有零星几个“Connection reset”的词条它就推断是数据库连接被服务端关闭建议调整连接池参数。但实际上数据库那边各项指标都正常真正原因是客户端有一个异常的Goroutine泄漏导致连接被复用错乱。这种问题怎么解我的经验有三条第一条所有Agent的结论必须附带证据链。Ongrid默认会在报告里展示“我看了哪些数据、哪些数据支持这个结论”这一条很关键。后续版本如果发现推理依据不足应该明确标记为“低置信度”。第二条建立知识库做修正。可以把团队排查过的历史故障处理过程沉淀到RAG里并且记录“曾经什么样的判断是错误的”。这类负面语料的纠错效果有时候比正面的操作手册更好。第三条对于高风险操作强制增加“反向校验”步骤。在执行修复前让Agent先检查“执行修复会不会引入新的风险”。比如调整连接池参数前检查当前连接数是否真的接近上限而不是只看一次错误日志。4.2 工具执行失败与权限边界工具执行失败是家常便饭而且很多情况不是Agent本身的问题而是底层权限配置的问题。我踩过最典型的一个坑是Agent内部用K8s工具查询Pod状态时失败报错信息是“User cannot list resource”一开始以为是Agent的配置有问题排查了半天发现是worker节点的ServiceAccount权限不够。这个问题的隐蔽之处在于Agent会把这个报错当作“查询无结果”继续往下推理导致后续分析全部失真。解决方案是给Agent配置的每个数据处理工具增加显式的错误返回格式必须区分“查询正常但无数据”和“权限不足导致查询失败”这两种情况。权限不足要在Agent上下文中被当作中断信号触发兜底逻辑而不是作为正常结果参与推理。这个经验我写进工具开发规范里了——工具的出错返回也要做到结构化、可解析、不可歧义。另外工具超时也要重点配置。默认超时时间是10秒但对于一些复杂日志查询来说完全不够。建议根据具体工具的耗时特点动态设置超时时间。如果超时设置得过短会导致Agent反复触发重试白白消耗Token和资源。4.3 数据接入的典型坑数据接入是整个项目里最耗时、最容易出问题的部分。我梳理一下自己遇到的几个代表性坑碰到相似的情况可以少走弯路。第一个坑是指标单位不一致。Prometheus里有些指标是秒、有些是毫秒、有些是百分比Agent在没有明确语义标注的情况下可能会把耗时100ms判断为100s进而得出完全错误的结论。务必在指标元数据里显式标注单位这一点再强调一遍都不为过。第二个坑是时区不一致。日志系统、监控系统、K8s事件默认的时区配置可能各有各的时区如果Agent查询时没有做时间对齐会把不同时间段的数据混在一起分析推理出了明显的时序错误还没有上课。这个问题的排查难度很高因为报错压根不报错就是结论出错。第三个坑是日志采样导致的盲区。有些日志系统默认开启采样低流量时段可能只保留了50%的日志。如果Agent不知道这个前提把采样数据当全量数据统计错误率就会偏差很大。在日志类数据源接入时必须把“采样率”这个信息主动暴露给Agent。第四个坑是敏感信息清洗。日志里如果包含用户手机号、身份证号之类的敏感数据直接喂给大模型存在数据合规风险。建议在数据底座层做脱敏过滤在把数据交给Agent之前完成。4.4 Token消耗与上下文优化AI运维Agent背后是大模型在做推理Token消耗是实打实的成本。我一开始粗放使用一个月下来大模型调用费用超出预期不少。后来做了一轮优化成本降了60%左右效果反而更好。核心思路是能不交给大模型处理的数据就不交先把数据在本地处理成更紧凑、更有信息量的摘要。具体措施有三点一是日志预聚合。原始日志先经过规则引擎提取关键信息只把错误级别、异常类型、出现频次这类结构化信息传给Agent而不是把几十万行原始日志灌进去。二是指标采样降维。在传给Agent之前先通过本地算法找出异常突变点只把突变点前后的数据作为特征传给Agent避免全量时间序列进入上下文。三是结果缓存。对于常见的重复问题比如某个服务频繁出现同一种告警把之前处理过的推理链路和结论缓存起来下一次直接复用只做增量验证。这招对高频问题的效果非常明显同时还能让Agent的处理速度更快。大模型不像人人看到的数据越多视野越开阔大模型的输入太长反而容易丢失关键信息在运维这种对精确度要求高的场景里输入精简有时比模型能力更重要。写在最后的一点个人体会从Ongrid这个项目刚开源我就在关注一路实测下来最大的感受是AI运维Agent真正改变的不是“能不能查到数据”而是“从Data到Decision”的路径变短了。以前我们要人肉去看监控图表、翻日志、对时间线现在Agent把这些脏活累活包了把推理链条完整地摆到你面前你做的是最后的判断和决策。这个变化是质变。如果让我给后来者一个建议那就是别一上来就追求大而全先把一个高频场景跑通比如“告警自动分析”或者“每日巡检报告”让团队建立对Agent的信任再逐步扩大它的工具权限和自主范围。任何AI工具只有被团队真的用起来、信任起来价值才会滚动放大。另外记得多给Agent喂你们团队自己的故障处理和复盘经验这才是它越用越聪明、不可替代的地方。