当前位置: 首页 > news >正文

Spring Cloud系列—SkyWalking链路追踪

上篇文章:

Spring Cloud系列—Seata分布式事务解决方案TCC模式和Saga模式https://blog.csdn.net/sniper_fandc/article/details/149947829?fromshare=blogdetail&sharetype=blogdetail&sharerId=149947829&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link

目录

1 链路追踪

1.1 概念

1.2 作用

2 常见组件对比

3 SkyWalking安装部署

3.1 下载APM和Agent

3.2 选择存储数据库

3.3 启动SkyWalking

4 Spring Cloud集成SkyWalking

4.1 集成SkyWalking

4.2 指标介绍

4.2.1 服务总览

4.2.2 具体服务

4.2.3 链路追踪Trace

4.2.4 数据库

5 SkyWalking自定义追踪

5.1 引入依赖

5.2 注解@Trace

5.3 注解@Tag和@Tags

6 SkyWalking性能剖析

7 SkyWalking日志上传

7.1 引入依赖

7.2 添加日志配置


1 链路追踪

1.1 概念

        链路追踪是分布式系统对请求路径的流程追踪,通过记录请求在多个服务间的通信路径、耗时、状态等信息,形成完整的调用链视图。每个请求主要是通过唯一标识(TraceID),类似快递单号;串联跨服务的调用单元(Span),类似快递中转站;并借助上下文传递(Context)实现链路连续性。

1.2 作用

        (1)保障系统可用性与稳定性:链路追踪可以及时采集CPU、内存和请求成功率等信息,在达到阈值时警告开发人员,及时发现服务问题,从而将故障服务还未扩散或被用户感知时就排查掉。

        (2)优化性能与资源利用率:请求的完整调用链可以观察哪个节点处理最慢,从而针对该节点进行性能优化。

        (3)提升故障排查效率:链路追踪工具为每个请求分配唯一的Trace ID,将跨服务的日志、错误信息等关联为统一视图,帮助快速定位故障节点。比如识别数据库慢查询或第三方接口调用异常)

        (4)理解服务依赖关系和拓扑:复杂的微服务系统各服务之间调用关系复杂,利用链路追踪可以生成服务拓扑图,帮助理清服务依赖关系,从而便于优化系统架构。

2 常见组件对比

Zipkin

CAT

SkyWalking

接入复杂度

轻量级,集成Spring Cloud Sleuth

需要代码埋点

通过Java agent启动,代码无侵入

数据粒度

接口级

代码级

方法级(RPC、HTTP)

支持语言

JavaC#PythonNodejsGolangRubyScala等

JavaC/C++PythonNodejsGolang等

JavaPythonNodejsPHPGolangRuby等

调用链可视化

聚合报表

非常丰富

较丰富

服务依赖图

简单

简单

告警支持

支持

支持

存储机制

内存、ES、MySQL等

mysql(报表),本地件/HDFS(调链)

ESMySQLbanyandbPostgreSQL等(最新版本已移除H2存储)

社区支持

文档丰富,但是国外主流、功能迭代较慢

社区活跃低,文档一般,国内大厂用

社区活跃更新频繁

优点

轻量部署简单适合SpringCloud微服务快速集成

功能全(日志采集报警业务报表)适合大厂综合监控

入,Apache 背书社区活跃

缺点

报表能力弱,功能单一

代码侵入高,社区不活跃

插件开发门槛高

3 SkyWalking安装部署

        SkyWalking是个人(吴晟)开源的应用性能监控(APM)系统,其涉及到几个常用的概念:

        APM(Application Performance Monitor):应用性能监控,通过收集、分析和可视化应用运行时的数据,帮助运维及时分析系统性能和优化系统。CAT和SkyWalking就是APM,而Zipkin不是APM。

        OAP(Observability Analysis Platform):观察分析平台,SkyWalking由Agent(探针)、UI(前端)、Backend(后端)组成,OAP就是后端的重要组成部分,通过接收、处理和存储来自Agent(探针)的数据,然后生成聚合指标。

        Agent:探针,轻量级数据采集组件,通过字节码植入技术(Bytecode Instrumentation,直接修改字节码,无需添加代码)无侵入式收集应用数据。

        UI:可视化界面,也就是前端,通过RESTful来远程从OAP获取数据并可视化渲染到页面上,支持图表等多种方式,提供Web控制台,展示服务拓扑、调用链路、实时指标、告警信息等。

        Metrics:指标,比如请求响应时间、成功率等。

        Endpoint:服务实例中用于接收和处理外部请求的具体入口点,是比service更细粒度的监控单元,用于描述服务内部的接口或方法级别的访问路径。可以简单理解为接口。

3.1 下载APM和Agent

        从SkyWalking后,APM和Agent下载就分开了,这里分别下载10.2.0的APM和9.4.0的Agent:

https://skywalking.apache.org/downloads/

        下载完后解压到本地:

        为了便于管理,可以在apm目录下创建agent目录,并把下载的agent复制到agent目录下:

3.2 选择存储数据库

        可选的数据库有如下类型:

        (1)H2:2025年以前的SkyWalking的默认存储,基于内存。但是H2内存模式在运行20分钟以上就会数据丢失且无告警,因此官方在2025年以后永久移除了该存储选项。

        (2)MySQL:对于中小规模的数据友好,部署和运维成本低,适合已有MySQL基础设施的团队或小规模数据环境。但是分库分表复杂度高,无法适应千亿级数据的分布式存储需求,但对时间序列数据的聚合查询效率远低于ES,复杂查询易成为瓶颈。

        (3)Elasticsearch:ES基于倒排索引和分片机制,擅长处理海量时序数据的查询与聚合分析,可通过集群分片应对PB级数据存储需求,并且社区支持广泛,但是ES的运维成本较高,需要独立部署ES集群,对资源消耗大,使得ES的性价比不是很高。

        (4)BanyanDB:主要应用就是APM领域,专为处理Metrics(指标)、Tracing(追踪)、Logging(日志)三类可观测性数据设计。BanyanDB专为云原生架构设计,能够处理更大的工作负载,无需担心数据丢失,而且设置非常简单,降低了新用户的使用门槛。作为SkyWalking的原生数据库,BanyanDB目前还处于高速研发的阶段,随着BanyanDB子项目的不断发展,SkyWalking官方宣布,BanyanDB 0.8已经完全生产可用,是生产环境的理想选择。

        这里选择MySQL作为存储。首先需要创建数据库,然后在SkyWalking的配置文件中修改存储配置:

CREATE DATABASE skywalking;

        并且,需要引入MySQL的连接依赖,该依赖可以通过以往项目中引入的MySQL依赖在Maven本地仓库找到,将jar包复制到apache-skywalking-apm-bin\oap-libs:

        修改配置文件,路径apache-skywalking-apm-bin\config下的application.yml文件,需要修改存储为mysql配置:

        然后注意修改JDBC连接的数据库名、user、password信息:

3.3 启动SkyWalking

        由于SkyWalking的默认端口号是8080,在JavaWeb开发时通常会和Tomcat的端口号冲突,因此启动前需要修改端口号。在apm安装路径的apache-skywalking-apm-bin\webapp下打开application.yml文件修改:

        在apache-skywalking-apm-bin\bin找到启动命令startup.bat双击启动即可:

        访问http://127.0.0.1:8999/marketplace:

4 Spring Cloud集成SkyWalking

4.1 集成SkyWalking

        在启动服务时,添加启动参数VM options:

-javaagent:D:\javaee_study\apache-skywalking-apm-10.2.0\apache-skywalking-apm-bin\agent\skywalking-agent.jar -Dskywalking.agent.service_name=order-service -Dskywalking.collector.backend_service=127.0.0.1:11800

        -javaagent:后面跟Java agent的安装路径,即移动到apm中的agent。

        -Dskywalking.agent.service_name:后面跟服务名称。

        -Dskywalking.collector.backend_service:后面跟skywalking启动的apm服务。

        启动服务后在UI界面可以观察到请求的路径和链路拓扑结构:

4.2 指标介绍

4.2.1 服务总览

        Service Apdex:当前服务的评分,量化用户对服务性能满意度的标准化指标,反映用户体验的质量。

        Service Success Rate:服务请求成功率。

        Service Avg Response Time (ms):服务平均响应延时(ms)。

        Service Load (calls / min):分钟请求数。

        Endpoint Success Rate:当前端点的成功率。

        Endpoint Avg Response Time (ms):端点的平均响应时长。

        Endpoint Load (calls / min):每个端点(URL)的请求次数。

        Service Avg Response Time (ms):服务平均响应延时(ms)。

4.2.2 具体服务

        Service Apdex:当前服务评分。

        Service Response Time Percentile (ms):服务响应时间百分比,通过分位数(如P99、P95、P90、P75、P50)反映不同比例请求的延迟情况。比如P99=300ms表示99%的请求延迟低于300ms。

        Service Load (calls / min):分钟请求数。

        Success Rate (%):分钟请求成功百分比。

        Message Queue Consuming Count:消息队列消耗计数。

        Message Queue Avg Consuming Latency (ms):消息队列平均消耗延迟(ms)。

        Service Instances Load (calls / min):服务节点每分钟请求次数。

        Slow Service Instance (ms):服务节点的最大延时。

        Service Instance Success Rate (%):每个服务实例的请求成功率。

        Endpoint Load in Current Service (calls / min):每个端点(URL)的请求次数。

        Slow Endpoints in Current Service (ms):当前端点(URL)的慢响应时间。

        Endpoint Success Rate in Current Service (%):当前端点(URL)的成功响应请求占比。

4.2.3 链路追踪Trace

4.2.4 数据库

        Database Avg Response Time (ms):数据库平均响应时间。

        Database Access Successful Rate (%):数据库访问成功率。

        Database Traffic (calls / min):数据库流量(每分钟的请求次数)。

        Database Access Latency Percentile (ms):数据库访问延迟(百分位数)。

        Slow Statements (ms) :慢SQL列表。对于慢SQL,可以使用jmeter模拟,比如接口采用/order/slowSql?time=${__Random(1,5)}进行请求,表示随机[1,5]范围内时间(ms)进行请求,select sleep(time)。

5 SkyWalking自定义追踪

        默认的追踪是接口级别的,因此如果想要对方法级别进行追踪,就需要自定义追踪。

5.1 引入依赖

        <dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><version>9.4.0</version></dependency>

5.2 注解@Trace

        @Trace注解添加在想要监控的方法上,该注解会为方法添加一个span,并且支持operationName来命名该span:

    @Override@GlobalTransactional@Trace(operationName = "createOrder")public Long create(OrderInfo orderInfo) {try {//插入订单orderMapper.insert(orderInfo);//扣余额accountApi.deduct(orderInfo.getUserId(), orderInfo.getMoney());//扣库存storageApi.deduct(orderInfo.getCommodityCode(), orderInfo.getCount());}catch (Exception e){log.error("下单失败, e: ", e);throw new RuntimeException("下单失败, e:", e);}return orderInfo.getId();}

5.3 注解@Tag和@Tags

        可以直接在方法上添加@Tag注解,能够捕获更细粒度信息,比如方法接收的参数和返回值,arg[n]表示形参列表的第几个参数,returnedObj表示方法返回值。@Tags表示多个@Tag:

    @Override@GlobalTransactional@Trace(operationName = "createOrder")@Tags({@Tag(key = "orderInfo",value = "arg[0]"),@Tag(key = "return",value = "returnedObj")})public Long create(OrderInfo orderInfo)

6 SkyWalking性能剖析

        当发现某个方法执行较慢时,如果想要定位到具体哪行代码较慢,就需要使用性能剖析。点击某个具体的服务,然后点击Trace Profilling,新建任务:

        当监控采样到请求后,就可以选中某个链路,点击分析,出现相关线程栈信息,根据栈信息就可以定位执行时间最长的代码:

7 SkyWalking日志上传

        SkyWalking支持日志上传,通过Trace ID实现日志和链路的关联:

7.1 引入依赖

        <dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-logback-1.x</artifactId><version>9.4.0</version></dependency>

7.2 添加日志配置

        SpringBoot底层默认支持logback日志组件,要上传日志就需要配置logback.xml文件(适用非SpringBoot应用)。SpringBoot推荐和优先加载logback-spring.xml文件,因此配置该文件内容如下:

<?xml version="1.0" encoding="UTF-8"?><configuration scan="true" scanPeriod="60 seconds" debug="false"><!-- 日志格式化, 配置 %tid 占位符 --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout"><Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n</Pattern></layout></encoder></appender><!-- 通过grpc把日志上报到SkyWalking--><appender name="grpc-log"class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender"><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout"><Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern></layout></encoder></appender><root level="info"><appender-ref ref="STDOUT"/><appender-ref ref="grpc-log"/></root></configuration>

        appender标签是日志输出的核心组件,该标签中的class属性表示输出到哪,GRPCLogClientAppender表示输出到远程SkyWalking客户端,ConsoleAppender表示输出到控制台。重启服务,观察结果:

        还可以通过日志绑定的Trace ID(TID)追踪对应的链路信息,点击左侧蓝色标识也可快速追踪。

下篇文章:

http://www.dtcms.com/a/343288.html

相关文章:

  • IPSec 安全基础
  • Matplotlib数据可视化实战:Matplotlib高级使用技巧与性能优化
  • GitHub Push 认证失败 fatal Authentication failed
  • 数据治理——解读56页 数据治理整体规划汇报【附全文阅读】
  • java-ArrayList的使用
  • 短波红外科研相机:开启科研新视野的利器​
  • LCR 019. 验证回文串 II
  • SpringCloudConfig配置文件本地化部署
  • 第5.1节:awk内置变量
  • MySQL诊断系列(5/6):表结构与元数据查询——快速掌握数据库“DNA”
  • 在pycharmIDE中如何快速掌握一个新模块的使用方法
  • 前端视频流处理从 0 到 “能跑”:可复制 Demo+WebGL/Worker 优化,覆盖会议 / 直播 / 监控场景
  • js来比较两个对象内容有误差异
  • 从源码中学习Java面向对象的多态
  • 通过自定义域名访问内网的web服务和tcp应用:内网ip到局域网外域名访问过程
  • 使用Docker部署Coze Studio开源版
  • (亲测)Centos7升级gcc 9
  • XTDrone——无人机基于2D激光Lidar进行二维运动规划(细节提醒以及相关报错解决)
  • 嵌入式-中断的概念,优先级,编程-Day17
  • 高效研发管理新选择:Codes 一站式平台深度解析
  • 6.Shell脚本修炼手册---grep命令使用指南
  • 定时器(Timer)和延时器
  • 文化遗产数字化对手持SLAM设备有哪些特殊要求?
  • 使用 X11 转发服务器界面
  • linux安装mysql ndb cluster
  • 牛客:链表分割算法详解
  • Java设计模式-享元模式
  • FreeRTOS学习笔记(三)--汇编指令
  • C ++代码学习笔记(一)
  • Layui 中的 iframe 详解与最佳实践