封面信息图

大促备战期最折磨技术团队神经的,不是系统宕机,而是群里的“报警风暴(Alert Fatigue)”。

以前压测一旦开拔,运维钉钉群里的机器人就像机关枪一样突突突疯狂刷屏:“【P2】订单服务数据库连接池等待超时”、“【P3】RPC 调用超时错误数达到 300”、“【P2】Slow SQL: 执行耗时 820ms”。几十个监控通道在几分钟内能弹出上千条告警,密密麻麻全是报错堆栈。

在这个信息爆炸的报警沼泽里,值班同学根本分不清哪条是致命的“主震”,哪条是无关痛痒的“余震”。很多时候,真正导致全链路雪崩的致命慢 SQL,就静悄悄地淹没在几百条普通的超时告警底下,等大家人工翻查日志找出来时,数据库 CPU 早已死在 100% 的停跳直线上。

为了彻底终结这种“报警刷屏但无人敢看”的尴尬窘境,今年我们基于 GLM 5.3 搭建了一套**“日志智能模式聚类与根因自动预警流水线”**。它不仅能在几秒内把上千条杂乱日志提炼成一句话诊断,还能自动拉取慢 SQL 的执行计划并给出优化建议。

今天,我就把这套直接部署在双 11 作战一线的实时日志告警架构全景揭秘。


一、从“报警轰炸”到“精准推导”的架构跃迁

传统监控与基于 GLM 5.3 的智能运维流水线之间,最大的区别在于**“信息维度的降维与语义关联”**:

+─────────────────────────────────────────────────────────────+
|               应用层与数据层日志源 (Log Pipeline)              |
|   Spring Boot Logback  |  Druid SlowLog  |  SkyWalking Trace|
+──────────────────────────────┬──────────────────────────────+
                               │ 统一异步投递 (10,000+ 条/秒)
                               ▼
+─────────────────────────────────────────────────────────────+
|                     Kafka 日志高吞吐缓冲缓冲池                 |
+──────────────────────────────┬──────────────────────────────+
                               │ 窗口期微批聚合 (Sliding Window: 5s)
                               ▼
+─────────────────────────────────────────────────────────────+
|               GLM 5.3 智能降维与模式分析引擎                |
|   1. 堆栈指纹化聚类 (MD5 去重)                               |
|   2. 慢 SQL 自动抓取 EXPLAIN 分析                            |
|   3. 异常波及面与业务影响推导                                |
+──────────────────────────────┬──────────────────────────────+
                               │ 仅推送高价值“处方级告警”
                               ▼
+─────────────────────────────────────────────────────────────+
|                   钉钉 / 企微智能运维值班群                  |
|   - 发生时间与影响业务拓扑                                   |
|   - 一句话核心根因定位                                       |
|   - GLM 5.3 生成的即时优化与修复建议 (含索引 DDL)            |
+─────────────────────────────────────────────────────────────+

二、日志聚类与慢 SQL 抓取实战代码

在生产实现中,绝对不能把每一条原始日志都调一次大模型,那样既昂贵又会引发二次排队。我们通过 滑动时间窗口 + 堆栈指纹(Fingerprint) 聚类,将 5 秒内同类的异常合并为单个聚合事件,再交由 GLM 5.3 进行深度解构。

1. 慢 SQL 智能拦截与执行计划采集器

package com.yali.ops.alarm;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

@Component
public class SlowSqlPlanCollector {

    private static final Logger log = LoggerFactory.getLogger(SlowSqlPlanCollector.class);

    private final JdbcTemplate jdbcTemplate;

    public SlowSqlPlanCollector(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    /**
     * 自动对慢 SQL 执行 EXPLAIN 并提取关键执行计划指标
     */
    public String explainSlowSql(String rawSql, Object... params) {
        try {
            // 拼接 EXPLAIN 分析计划
            String explainSql = "EXPLAIN " + rawSql;
            List<Map<String, Object>> planRows = jdbcTemplate.queryForList(explainSql, params);

            StringBuilder planSummary = new StringBuilder();
            for (Map<String, Object> row : planRows) {
                planSummary.append(String.format(
                        "table: %s | type: %s | possible_keys: %s | key: %s | rows: %s | Extra: %s\n",
                        row.get("table"),
                        row.get("type"),
                        row.get("possible_keys"),
                        row.get("key"),
                        row.get("rows"),
                        row.get("Extra")
                ));
            }
            return planSummary.toString();
        } catch (Exception e) {
            log.warn("采集慢 SQL 执行计划失败: [{}]", e.getMessage());
            return "EXPLAIN_FAILED: " + e.getMessage();
        }
    }
}

2. 调度 GLM 5.3 生成“处方级”根因分析

package com.yali.ops.alarm;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.stereotype.Service;

@Service
public class OpsGlmDiagnoseService {

    private final ChatClient chatClient;

    public OpsGlmDiagnoseService(ChatClient.Builder chatClientBuilder) {
        this.chatClient = chatClientBuilder
                .defaultSystem("""
                    你是一名拥有 15 年经验的阿里巴巴级别资深 SRE 兼 DBA 专家。
                    你当前正在双 11 全链路压测现场处理紧急报警。
                    收到聚集后的异常日志和慢 SQL 执行计划后,请严格按以下格式输出高信息密度预警简报:
                    
                    【根因诊断】:一句话说明是哪行代码、哪个表、什么原因引起的;
                    【爆炸半径】:指出会影响哪个上游业务(下单、购物车、退款还是结算);
                    【处方建议】:直接给出具体的 ALTER TABLE 索引建议、代码修复方案或紧急降级手段。
                    
                    话术要求:严谨硬核,直切要害,杜绝任何废话套话。
                    """)
                .build();
    }

    /**
     * 调用 GLM 5.3 进行日志聚合推导
     */
    public String analyzeIncident(String errorClusterSummary, String slowSqlExplain) {
        String prompt = String.format("""
                【异常聚合事件汇总】:
                %s
                
                【MySQL 慢 SQL EXPLAIN 计划】:
                %s
                
                请立即给出战地诊断与修复报告!
                """, errorClusterSummary, slowSqlExplain);

        return chatClient.prompt()
                .user(prompt)
                .call()
                .content();
    }
}

三、双 11 压测现场真刀真枪实测案例

在昨晚的一次全链路压测中,交易下单峰值刚触达 12 万 QPS,Kafka 慢日志通道捕获到了一条单次耗时 1850ms 的 SQL。在短短 5 秒内,该 SQL 在各个微服务节点被调用了上千次,下游数据库行锁等待剧烈增加。

GLM 5.3 在 1.2 秒内完成执行计划解析,并在作战群推送了这条震撼全场的预警报告:

🚨 【双 11 战地预警】GLM 5.3 发现高危慢 SQL 阻断交易主链路

【根因诊断】:
`t_order_settlement` 表在进行 `WHERE user_id = ? AND create_time >= ? ORDER BY id DESC` 查询时,
MySQL 优化器虽然命中了 `idx_user_id`,但在处理范围查询与文件排序(Using filesort)时,
产生单次扫描行数(rows)高达 450,000 行,且在临时表区发生磁盘溢出排序(Using temporary)。

【爆炸半径】:
直接拖垮结算服务连接池(HikariCP-1 挂起请求数 > 120),导致购物车“去结算”按钮出现大面积 504 超时。

【处方建议】:
1. 立即停止使用该 SQL 进行实时对账,若为前台接口,执行以下 DDL 建立最左前缀联合覆盖索引:
   ALTER TABLE t_order_settlement ADD INDEX idx_user_time_id(user_id, create_time, id);
2. 应急降级:通过配置中心下发规则,临时限制 `create_time` 查询跨度不超过最近 3 天。

当值班的年轻开发还在茫然看着 Grafana 上的飙红曲线时,DBA 同学已经按照预警里的 DDL 命令建立了联合索引。命令执行完毕不到 10 秒,数据库的扫描行数由 45 万行瞬间暴跌至 12 行,查询耗时从 1850ms 压到 0.6ms,结算服务全面恢复绿线!


四、老鸭梨的生产避坑心得

把大模型接入运维监控,最忌讳的是把它当成一个“聊天机器人”。想要让它在生产大促中真正成为杀手锏,有三条原则必须坚守:

  1. 绝对禁止无限制调用大模型:
    相同特征指纹的异常,在 5 分钟内最多只允许大模型分析一次。一旦触发过预警,后续重复告警必须走轻量计数器累加,防止运维大模型自己被海量报错日志打到限流;
  2. 敏感数据在投递模型前强制脱敏:
    在把 SQL 和日志扔给大模型前,必须使用正则对 SQL 中的用户手机号、身份证、银行卡号、登录密码等敏感字面量进行强制占位符替换(如统一替换为 ***),这是企业级安全合规不可逾越的底线;
  3. 闭环反馈机制:
    每次 GLM 5.3 给出的索引或代码建议被采纳且解决问题后,系统自动将该案例打上“已解决”标签并回流到本地向量知识库。运维助手会在一次次的大促实战中,真正成长为最懂你们公司历史业务包袱的专属架构老法师。
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐