研究Aiops有一段时间了,目前手里有不少可落地的方案了,接下来会把这些方案全部整理到我的[大模型课程]里。同时,欢迎大家把你遇到的场景在评论区留言。我会在能力范围内给你提供思路和建议。
前阵子发过一篇关于[Devops+aiops结合落地的思路文章],其中有一个工作流就是用来做发布前后时序与日志异常检测的,今天这篇文章主要围绕这个主题做一下细化。
一、思路和架构
1. 整体思路
我们可以将整个架构拆解为四个逻辑层次:
1)触发层
核心组件:
Jenkins设计思路: 这是整个自动化流程的“发令枪”。我们选择在CI/CD流程的末端——即部署成功后——作为分析起点。Jenkins通过一个简单的HTTP POST请求,将关键上下文信息(如应用名、版本号、部署时间)传递给下游,完成了从“部署”到“分析”的无缝衔接。
2)编排与数据处理层
核心组件:
n8n设计思路: 这是整个系统的“中央大脑”和“指挥官”。n8n的价值在于其强大的流程编排和连接能力。
- 定义时间窗口: n8n接收到部署时间后,首先进行智能计算,定义出“上线前”和“上线后”两个对比分析的时间窗口。这是进行有效对比分析的基础。
- 并行数据采集: n8n并行地向Loki和Prometheus发起查询。这种并行处理大大提高了数据获取的效率,避免了串行等待。
- 数据聚合与清洗: n8n将从不同系统(Loki的日志、Prometheus的指标)获取的异构数据汇集到一起。通过Code节点,对原始数据进行解析、清洗和格式化,为下一步的智能分析准备好“食材”。
3)智能分析层
核心组件:
AI Agent (Deepseek/GLM)设计思路: 这是系统的“认知核心”,负责将原始数据转化为洞察。
- Prompt Engineering是关键: 我们不是简单地把数据扔给AI,而是通过精心设计的Prompt,为AI赋予了明确的角色(资深SRE分析师)、清晰的任务(对比分析、判断异常、推测根因)、以及期望的输出格式。这确保了AI输出的专业性和结构化。
- 从“查询”到“理解”: AI Agent超越了传统监控系统的“阈值告警”。它不仅能看到错误数量增加了,还能结合日志内容(如NullPointerException)去“理解”错误的性质,从而做出更深层次的根因推测,这是传统规则引擎难以做到的。
4)通知与行动层
- 核心组件:
钉钉 / 邮箱 - 设计思路: 这是分析结果的“最终出口”,旨在将洞察高效地传递给决策者。
- 触达关键人员: 将报告直接推送到开发团队和运维人员日常使用的沟通工具(如钉钉群)或邮箱中,确保信息能被及时看到。
- 结构化呈现: 报告内容被格式化为Markdown或HTML,包含明确的结论、数据对比和行动建议,让相关人员能快速掌握情况并做出决策(如“立即回滚”或“继续观察”)。
2. 架构图
二、N8N工作流细节
假设已经有了如下环境:
- n8n 环境:已部署并可以访问。
- Jenkins:已配置,可以在部署 pipeline 的最后一步执行一个HTTP请求。
- 日志系统:业务日志和Web访问日志已集中收集到Loki。
- 监控系统:Prometheus已配置并抓取了相关指标,如HTTP状态码分布(
http_requests_total)。 - LLM API:拥有一个可用的LLM API Key(如Deepseek, 或本地部署的模型API)。
- 通知渠道:钉钉或者邮箱已经配置好。
节点1:Webhook - 接收Jenkins触发
这是整个工作流的入口。
- 节点类型:
Webhook - 配置:
HTTP Method:
POSTPath:
/deploy-analysis(可以自定义)Response Code:
200(立即告诉Jenkins已接收)Response Body:
{"status": "received"}
- 说明: n8n会生成一个URL,例如
https://your-n8n-instance.com/webhook/deploy-analysis。你需要将这个URL配置到Jenkins的pipeline中。 - Jenkins Pipeline示例:
pipeline { // ... other stages ... stage('Deploy') { steps { // ... your deployment script ... sh 'echo "Deployment finished at $(date)"' } } stage('Trigger Analysis') { steps { script { def payload = """ { "app_name": "my-cool-app", "version": "v1.2.3", "deploy_time": "${new Date().format("yyyy-MM-dd'T'HH:mm:ssZ")}" } """ httpRequest( httpMode: 'POST', url: 'https://your-n8n-instance.com/webhook/deploy-analysis', contentType: 'APPLICATION_JSON', requestBody: payload ) } } } }- 输出: 该节点会输出一个JSON对象,包含
app_name,version,deploy_time。
节点 2: Edit Fields - 设置分析时间窗口
为了进行上线前后的对比,我们需要定义两个时间窗口。
- 节点类型:
Edit Fields 配置:Keep Only Set: 勾选,只保留我们设置的新字段,保持数据干净。Values to Set:
app_name: {{ $json.app_name }}deploy_time: {{ $json.deploy_time }}post_start_time: {{ $json.deploy_time }}post_end_time: {{ new Date(newDate($json.deploy_time).getTime() + 30*60000).toISOString() }} (上线后30分钟)pre_start_time: {{ new Date(new ate($json.deploy_time).getTime() - 60*60000).toISOString() }} (上线前1小时)pre_end_time: {{ $json.deploy_time }}
节点 3: 查询上线前日志
- 节点类型:
HTTP Request - 配置:
Method:
GETURL:
http://your-loki:3100/loki/api/v1/query_rangeQuery Parameters:query: {app_name=“{{ $json.app_name }}”} |= “ERROR”
start: {{ $json.pre_start_time }}
end: {{ $json.pre_end_time }}
limit: 20 (获取20条样例)
Options: Response Format -> String
- 说明: LogQL查询
{app_name="..."} |= "ERROR"会筛选出指定应用包含"ERROR"字符串的日志流。
节点 4: 查询上线后日志
- 节点类型:
HTTP Request(复制节点3并修改) - 配置:
- Query Parameters (修改时间范围):
- query: {app_name=“{{ $json.app_name }}”} |= “ERROR”
- start: {{ $json.post_start_time }}
- end: {{ $json.post_end_time }}
- limit: 20
节点 5: 查询上线前指标
- 节点类型:
HTTP Request - 配置:
- Method: GET
- URL: http://your-prometheus:9090/api/v1/query_range
- Query Parameters:
- query: sum(rate(http_requests_total{job=“{{ $json.app_name }}”,status=~“5…”}[5m])) by (status)
- start: {{ $json.pre_start_time }}
- end: {{ $json.pre_end_time }}
- step: 60
- Options: Response Format -> String
节点 6: 查询上线后指标
- 节点类型:
HTTP Request(复制节点5并修改) - 配置:
- Query Parameters (修改时间范围):
query: sum(rate(http_requests_total{job=“{{ $json.app_name }}”,status=~“5…”}[5m])) by (status)
start: {{ $json.post_start_time }}
end: {{ $json.post_end_time }}
step: 60
节点 7: Code - 数据聚合与Prompt构建
节点类型:
Code(JavaScript)JavaScript 代码
const timeData = items[0].json; const preLogs = JSON.parse(items[1].json.body); const postLogs = JSON.parse(items[2].json.body); const preMetrics = JSON.parse(items[3].json.body); const postMetrics = JSON.parse(items[4].json.body); // --- 适配Loki响应格式 --- // Loki的响应在 data.result 中,是一个数组,每个元素代表一个日志流 const getLogDetails = (lokiResponse) => { if (!lokiResponse.data || !lokiResponse.data.result) { return { count: 0, samples: '无日志数据' }; } const allStreams = lokiResponse.data.result; let count = 0; let samples = []; for (const stream of allStreams) { if (stream.values) { count += stream.values.length; // 提取日志内容 (values是[timestamp, log_line]的数组) samples.push(...stream.values.map(v => v[1])); } } return { count: count, samples: samples.slice(0, 10).join('\n---\n') // 取前10条作为样例 }; }; const preLogDetails = getLogDetails(preLogs); const postLogDetails = getLogDetails(postLogs); // --- 构建给AI Agent的Prompt --- // AI Agent需要明确的角色、任务和期望的输出格式 const systemPrompt = `你是一个专业的DevOps分析AI Agent。你的核心任务是分析应用上线后的健康状况,并与上线前进行对比,以判断是否存在异常。你必须基于提供的日志和指标数据,生成一份结构化的分析报告。`; const userPrompt = ` 任务:分析应用 "{{timeData.app_name}}" 在版本 "{{timeData.version}}" 于 "{{timeData.deploy_time}}" 上线后的健康状况。 分析数据: 1. **业务日志 (ERROR级别)**: - 上线前 ({{timeData.pre_start_time}} 至 {{timeData.pre_end_time}}): - 总数: {{preLogDetails.count}} - 样例: {{preLogDetails.samples}} - 上线后 ({{timeData.post_start_time}} 至 {{timeData.post_end_time}}): - 总数: {{postLogDetails.count}} - 样例: {{postLogDetails.samples}} 2. **Web访问指标 (5xx错误率)**: - 上线前 Prometheus 数据: ${JSON.stringify(preMetrics.data.result, null, 2)} - 上线后 Prometheus 数据: ${JSON.stringify(postMetrics.data.result, null, 2)} 请执行以下分析并输出报告: 1. **数据对比**: 比较上线前后ERROR日志数量的变化趋势,以及5xx错误率的变化。 2. **异常判断**: 明确结论:“系统稳定”或“发现异常”。如果发现异常,详细描述异常现象(例如:ERROR日志数量从平均每小时5次激增到100次,且包含大量'NullPointerException';5xx错误率从0.1%上升到5%)。 3. **根因推测**: 基于日志内容,推测可能的根本原因。 4. **行动建议**: 给出明确的后续建议,如“建议立即回滚”、“联系开发排查XX模块”、“持续观察”。 请用中文输出,格式清晰。 `; // --- 构建请求体 (以Deepseek为例,其API与OpenAI兼容) --- const requestBody = { model: "deepseek-chat", // 或 "glm-4" messages: [ { role: "system", content: systemPrompt }, { role: "user", content: userPrompt } ], temperature: 0.2, stream: false }; return [{ json: requestBody }];节点 8: HTTP Request - 调用LLM API
- 节点类型:
HTTP Request - 配置:
- Method:
POST URL:``https://api.deepseek.com/v1/chat/completions(以Deepseek为例,GLM的URL请查阅官方文档)- Headers:
- Authorization: Bearer YOUR_DEEPSEEK_API_KEY
- Content-Type: application/json
- Body:
{{ JSON.stringify($json) }}(使用上一个节点的输出) - Options:
Response Format->String - 说明: Deepseek和智谱AI的API大多与OpenAI格式兼容,这使得配置相对简单。请务必确认您所用模型的
model参数名称(如deepseek-chat,glm-4)。
节点 9: 发送通知 (钉钉或邮箱)
细节略
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。