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)追踪对应的链路信息,点击左侧蓝色标识也可快速追踪。

下篇文章:

Spring Cloud系列—SkyWalking告警和飞书接入https://blog.csdn.net/sniper_fandc/article/details/149948716?fromshare=blogdetail&sharetype=blogdetail&sharerId=149948716&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/919993.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/919993.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器人领域的算法研发

研究生期间学习大模型&#xff0c;可投递机器人领域的算法研发、技术支持等相关岗位&#xff0c;以下是具体推荐&#xff1a; AI算法工程师&#xff08;大模型方向-机器人应用&#xff09;&#xff1a;主要负责大模型开发与优化&#xff0c;如模型预训练、调优及训练效率提升等…

深度学习入门:神经网络

文章目录一、深度学习基础认知二、神经网络核心构造解析2.1 神经元的基本原理2.2 感知器&#xff1a;最简单的神经网络2.3 多层感知器&#xff1a;引入隐藏层解决非线性问题2.3.1 多层感知器的结构特点2.3.2 偏置节点的作用2.3.3 多层感知器的计算过程三、神经网络训练核心方法…

mysql的索引有哪些?

1. 主键索引&#xff08;PRIMARY KEY&#xff09;主键索引通常在创建表时定义&#xff0c;确保字段唯一且非空&#xff1a;-- 建表时直接定义主键 CREATE TABLE users (id INT NOT NULL,name VARCHAR(50),PRIMARY KEY (id) -- 单字段主键 );-- 复合主键&#xff08;多字段组合…

【计算机视觉与深度学习实战】08基于DCT、DFT和DWT的图像变换处理系统设计与实现(有完整代码python3.13可直接粘贴使用)

1. 引言 数字图像处理作为计算机视觉和信号处理领域的重要分支,在过去几十年中得到了快速发展。图像变换技术作为数字图像处理的核心技术之一,为图像压缩、特征提取、去噪和增强等应用提供了强有力的数学工具。离散余弦变换(Discrete Cosine Transform, DCT)、离散傅里叶变…

使用Python实现DLT645-2007智能电表协议

文章目录&#x1f334;通讯支持&#x1f334; 功能完成情况服务端架构设计一、核心模块划分二、数据层定义三、协议解析层四、通信业务层&#xff08;以DLT645服务端为例&#xff09;五、通信层&#xff08;以TCP为例&#xff09;使用例子&#x1f334;通讯支持 功能状态TCP客…

未来已来:基于IPv6单栈隔离架构的安全互联实践报告

未来已来&#xff1a;基于IPv6单栈隔离架构的安全互联实践报告 报告摘要 随着IPv4地址资源彻底枯竭&#xff0c;全球网络基础设施正加速向IPv6单栈&#xff08;IPv6-Only&#xff09;演进。传统“IPv4为主、IPv6为辅”的双栈模式已无法满足数字化转型对海量地址、端到端连接与原…

Ubuntu24.04 安装 Zabbix

Ubuntu24.04 安装 Zabbix 环境&#xff1a; 软件版本Ubuntu24.04.3Nginx1.24.0MySQL8.4.6PHP8.3.6phpMyAdmin5.2.2Zabbix7.4.1 LNMP 1. 更新本地软件包索引并升级已安装软件 更新可用软件包列表 把已安装的软件升级到最新版 安装常用工具 sudo apt update && sud…

【动手学深度学习】6.2. 图像卷积

目录6.2. 图像卷积1&#xff09;互相关运算2&#xff09;卷积层3&#xff09;图像中目标的边缘检测4&#xff09;学习卷积核5&#xff09;互相关与卷积6&#xff09;特征映射和感受野7&#xff09;小结. 6.2. 图像卷积 卷积神经网络的设计是用于探索图像数据&#xff0c;本节…

游戏引擎中的Billboard技术

一.视觉公告板为解决场景中Mesh网格面数过多问题,使用2D平面Mesh替换为3D平面Mesh的技术即为Billboard技术.常用于场景中植被,树叶,粒子系统等对面数有要求的场景.二.Billboard着色器实现着色器输入参数:摄像机坐标,网格坐标,摄像机观察方向着色器输出:实际2D平面随视角不变

vue-admin-template权限管理

在基于 vue-admin-template 实现权限管理时&#xff0c;通常需要结合角色权限模型和动态路由机制&#xff0c;以满足不同用户角色对页面访问权限的控制需求。分为路由页面权限和按钮权限&#xff1a;下面是具体实现思路的思维导图和具体代码流程&#xff1a;0.实现逻辑思维导图…

微信小程序,事件总线(Event Bus) 实现

1、util.js文件/*** 事件总线*/ function createEventBus() {// 私有事件存储对象&#xff0c;通过闭包保持私有性const events {};return {/*** 监听事件&#xff0c;只执行一次* param {string} eventName - 事件名称* param {Function} callback - 回调函数*/once(eventNam…

OpenCV结构光三维重建类cv::structured_light::GrayCodePattern

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::structured_light::GrayCodePattern 是 OpenCV 库中用于结构光三维重建 的一个类&#xff0c;属于 OpenCV 的 structured_light 模块。 它用于…

变频器实习DAY35 引脚电平测试 退耦电阻

目录变频器实习DAY35一、工作内容1.1 硬性平台RO7测试二、学习内容2.1 退耦电阻核心原理&#xff1a;2大特性抑制干扰四大关键作用选型&#xff1a;4个核心参数典型应用场景四大常见误区附学习参考网址欢迎大家有问题评论交流 (* ^ ω ^)变频器实习DAY35 一、工作内容 1.1 硬性…

C++标准库算法:从零基础到精通

算法库的核心理念与设计哲学 C标准库算法的设计遵循着一个令人称道的哲学&#xff1a;算法与容器的分离。这种设计并非偶然&#xff0c;而是经过深思熟虑的结果。传统的面向对象设计可能会将排序功能绑定到特定的容器类中&#xff0c;但C标准库却选择了一条更加优雅的道路——…

为什么存入数据库的中文会变成乱码

从产生、传输、处理到最终存储的整个生命周期中采用统一且正确的字符集编码。具体原因纷繁复杂&#xff0c;主要归结为&#xff1a;客户端操作系统或应用与数据库服务端字符集编码不一致、Web应用服务器到数据库驱动的连接层编码配置缺失或错误、数据库本身及其表、字段各层级的…

13种常见机器学习算法面试总结(含问题与优质回答)

目录 1. K近邻&#xff08;K-NN&#xff09; 2. 线性回归&#xff08;一元/多元&#xff09; 3. 逻辑回归 4. 决策树 5. 集成学习之随机森林 6. 贝叶斯&#xff08;朴素/高斯&#xff09; 7. SVM&#xff08;支持向量机&#xff09; 8. K-means聚类 9. DBSCAN 10. TF-…

sfc_os!SfcValidateFileSignature函数分析之WINTRUST!SoftpubLoadMessage

第一部分&#xff1a;0: kd> kc# 00 WINTRUST!SoftpubLoadMessage 01 WINTRUST!_VerifyTrust 02 WINTRUST!WinVerifyTrust 03 sfc_os!SfcValidateFileSignature 04 sfc_os!SfcGetValidationData 05 sfc_os!SfcValidateDLL 06 sfc_os!SfcQueueValidationThread 07 kernel32!B…

python写上位机并打包250824

1.python写的串口上位机软件程序 import serial import serial.tools.list_ports import tkinter as tk from tkinter import ttk, scrolledtext, messagebox, filedialog import threading import time from datetime import datetime class SerialPortAssistant: def init(se…

Wagtail CRX 简介

Wagtail CRX&#xff08;前身为 CodeRed CMS&#xff0c;由 CodeRed Corp 开发&#xff09;是一个基于 Wagtail 的 CMS 扩展包&#xff0c;主要用于快速构建营销型网站&#xff0c;提供预置组件和增强功能。最新版本为 5.0.1&#xff08;发布于 2025 年 5 月 9 日&#xff09;。…

docker compose 安装zabbix 7

docker compose 安装zabbix 7 1.环境 # hostnamectlStatic hostname: ky10Icon name: computer-vmChassis: vmMachine ID: f554764e21b74c2fa057d9aaa296af63Boot ID: 4c155f0185c24a14970ab5ea60de34f4Virtualization: vmwareOperating System: Kylin Linux Advanced Server…