团队暂时没有条件部署 SkyWalking

简介: 本文详解APM链路追踪核心实践:先定位慢在哪一跳。通过SkyWalking开箱即用方案(Java零侵入Agent接入)或自研轻量方案(MDC+AOP日志埋点),快速生成耗时瀑布图,将3.2秒慢请求精准定位至2.35秒SQL,大幅提升性能排查效率。(239字)

重点一:APM 链路追踪 —— 先确定慢在哪一跳
1.1 排查思路
一个请求的典型链路是:

网关 → 服务A(业务逻辑) → 服务B(RPC调用) → MySQL → Redis
慢接口排查的第一步不是看日志,而是把整条链路的耗时拆解出来。链路追踪(Distributed Tracing)就是为这件事而生的:每个请求携带一个全局 TraceId,每经过一个节点产生一个 Span,记录该节点的开始时间和耗时。

1.2 接入 SkyWalking(开箱即用方案)
SkyWalking 是 Apache 开源的 APM 工具,Java 服务接入只需加一个 Agent 参数,零代码侵入:

启动命令中挂载 agent

java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar \
-Dskywalking.agent.service_name=order-service \
-Dskywalking.collector.backend_service=127.0.0.1:11800 \
-jar order-service.jar
接入后在 UI 的 Trace 页面可以看到这样的耗时瀑布图:

/order/detail 3200ms ├──────────────────────────────┤
├─ OrderService.detail 180ms ├──┤
├─ UserRPC.getUser 2400ms ├───────────────────┤
│ └─ MySQL.select 2350ms ├────────────────┤ ← 慢在这里
└─ Redis.get 12ms ├┤
一眼就能看出:总耗时 3.2 秒,其中 2.4 秒花在一次 RPC 调用上,而 RPC 内部又有 2.35 秒是一条 SQL。排查范围瞬间从"整个系统"缩小到"一条 SQL"。

1.3 没有 APM 时的自建轻量方案
如果团队暂时没有条件部署 SkyWalking,可以用 MDC + AOP 自建一个简化版,把每个环节的耗时打到日志里:

/**

  • 基于 AOP 的链路耗时埋点:在关键方法上标注 @TraceSpan 即可记录耗时
    */
    @Aspect
    @Component
    @Slf4j
    public class TraceSpanAspect {
@Around("@annotation(traceSpan)")
public Object around(ProceedingJoinPoint pjp, TraceSpan traceSpan) throws Throwable {

    String spanName = traceSpan.value();
    String traceId = MDC.get("traceId");  // 由网关过滤器统一塞入
    long start = System.currentTimeMillis();

    try {

        return pjp.proceed();
    } finally {

        long cost = System.currentTimeMillis() - start;
        // 统一格式输出,方便用 ELK 做聚合分析
        log.info("SPAN|{}|{}|{}ms", traceId, spanName, cost);
    }
}

}

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TraceSpan {

String value();

}
在业务方法上使用:

@Service
public class OrderService {

@TraceSpan("OrderService.detail")
public OrderDetailVO detail(Long orderId) {

    UserDTO user = userRpcClient.getUser(orderId);   // RPC 调用
    OrderDO order = orderMapper.selectById(orderId); // DB 查询
    return assemble(user, order);
}

}
同时在网关层加一个过滤器生成 TraceId:

@Component
public class TraceIdFilter implements Filter {

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
        throws IOException, ServletException {

    String traceId = UUID.randomUUID().toString().replace("-", "").substring(0, 16);
    MDC.put("traceId", traceId);
    try {

        chain.doFilter(req, res);
    } finally {

        MDC.remove("traceId");  // 防止线程复用导致 traceId 串号
    }
}

}
这样用 grep "SPAN|abc123" app.log 就能还原一次请求各环节的耗时分布。

本阶段结论:链路追踪解决的是"定位"问题。找到耗时占比最高的那一跳之后,才进入下一阶段。






相关文章
|
1月前
|
人工智能 自然语言处理 数据挖掘
Data Agent 落地的下半场:让企业学会与 AI 协作
Data Agent 落地的上半场,是建设 AI-Ready Data;下半场,是建设 Agent-Ready Organization。上半场决定 Agent 能不能进入企业,下半场决定 Agent 能不能真正融入工作、形成规模,并持续创造价值。
|
1月前
|
SQL JSON 运维
一条SQL同时处理结构化条件和非结构化语义匹配。
本文对比智能客服场景下向量检索的两种架构:独立向量库 vs 内置向量的关系型数据库。结合5万知识库、日增数百条、QPS 20+的实际需求,剖析二者在数据一致性、运维成本、查询性能与扩展性上的真实差异,指出多数创业团队无需“为技术而技术”,关系库向量化已足够成熟可靠。(239字)
128 0
|
1月前
|
人工智能 搜索推荐 知识图谱
2026 GEO实战指南:让AI搜索引擎正确引用你的技术文章
GEO(生成式引擎优化)是面向LLM检索-推理-生成链路的信息组织工程,聚焦语义分块、结构化数据(Schema)、引用可信度与实体关系构建,提升内容在AI搜索引擎中的召回率与引用率,非SEO替代品,而是机器可读性的新基础设施。
274 1
|
1月前
|
人工智能 数据挖掘 数据安全/隐私保护
不会写提示词?用 4 个要素把 AI 用进日常办公
以会议纪要、周报和邮件为例,介绍用“对象、材料、要求、输出格式”四个要素编写办公提示词,并提供可复用模板与数据安全核对清单。
|
1月前
|
人工智能 分布式计算 DataWorks
阿里云大数据 AI 产品月刊-2026年6月
阿里云大数据& AI 产品技术月刊【2026 年 6 月】,涵盖 6 月技术速递、产品和功能发布、市场和客户应用实践等内容,帮助您快速了解阿里云大数据& AI 方面最新动态。
人工智能 JavaScript 前端开发
251 4
|
5月前
|
SQL Java API
Agent 越用越聪明?AgentScope Java 在线训练插件来了!
使用AgentScope Java + Trinity-RFT 在线训练优化你的Agent,让你的Agent边运行边进化。
1546 44
人工智能 数据可视化 API
225 1
|
22天前
|
人工智能 JSON 物联网
8G 显存可用|ComfyUI+Qwen AI 漫剧全流程自动化搭建教程(含工作流 & 源码)
本文提出基于Qwen大模型与ComfyUI的本地全链路AI漫剧自动化流水线,专为8GB显存笔记本优化:FP8量化、显存调度、IP-Adapter角色锁定,实现“脚本生成→分镜渲染→动态化→成片合成”全流程本地部署,配套完整工程资源与落地指南。(239字)
|
1月前
|
存储
Tushare接口文档:交易日历(trade_cal)
本文旨在对Tushare的交易日历trade_cal数据接口进行介绍,提供更多参考示例和使用说明。交易日历可以用来作为获取其他数据的关键(迭代)参数,也可以进行其他的应用。本文还基于交易日介绍了如何获取每周及每月最后一个交易日。
484 1
Tushare接口文档:交易日历(trade_cal)

热门文章

最新文章