链路追踪组件学习
目录
- 1. 为啥需要链路追踪
- 2. 常见的链路追踪组件
- 3. 使用过的链路追踪组件
- 3.1. Spring Cloud Sleuth
- 3.2. Zipkin
- 3.3. Apache SkyWalking
- 4. 集成Spring Cloud Sleuth框架
- 4.1. 流程步骤
- 4.2 sleuth工作流程
- 5. 集成zipKin
- 5.1 添加 Zipkin 相关依赖
- 5.2 安装zipkin服务
- 5.3 配置 Zipkin 地址
- 5.4 访问 Zipkin UI
- 6. 集成SkyWalking
- 6.1 安装skyWalking UI
- 6.2 Maven 依赖
- 6.3.配置 SkyWalking Agent
- 6.4 链路查看
- 6.5 skywalking 原理
1. 为啥需要链路追踪
在分布式系统中,链路追踪是非常重要的工具,主要原因如下:
- 解决微服务间的调用追踪问题
- 在传统的单体应用中,所有的逻辑和请求都发生在一个进程内,系统的行为相对简单,问题的定位也相对直接。
- 然而,随着系统架构变为分布式(尤其是微服务架构),请求通常会在多个服务间流转,这使得问题的定位变得更加困难。链路追踪可以帮助开发者跟踪每个请求在各个微服务之间的传播,确保在分布式环境中也能全面了解请求的路径。
- 提高故障定位和排查效率
- 在分布式系统中,服务间的调用链条往往非常复杂,可能会涉及多个服务、数据库和其他资源。在出现问题时(如延迟、错误、服务不可用等),开发者很难知道问题发生在哪一层级。
- 链路追踪通过记录请求从一个服务到另一个服务的全过程,包括服务的响应时间、调用关系、错误信息等,使得开发者可以快速定位到问题所在的具体服务和操作。
- 性能瓶颈分析
- 分布式系统中的请求通常跨多个服务和机器,性能瓶颈可能出现在某个具体服务或接口上。链路追踪能够显示每个请求的时间分布,帮助开发者找到响应时间长的服务,从而优化性能。
- 通过链路追踪,可以清晰看到各个微服务之间的调用时间、排队时间以及响应时间,快速发现系统瓶颈。
- 监控和可视化
- 现代分布式系统需要持续的监控和分析。链路追踪不仅能够收集服务的调用数据,还能够将这些数据通过可视化工具(如 Zipkin、skyWalking 等)展示出来,帮助开发者或运维人员更直观地了解系统的健康状况。
- 通过图形化的方式查看服务之间的调用关系和依赖关系,有助于理解系统的架构,并发现潜在的问题和优化空间。
2. 常见的链路追踪组件
在进行链路追踪工具的选型时,需要考虑多个方面,以确保所选方案能够有效满足系统的需求。以下是一些关键考量因素:
维度 | Spring Cloud Sleuth | Zipkin | Jaeger | OpenTelemetry | Elastic APM | Prometheus + Grafana | Apache SkyWalking | DataDog APM |
---|---|---|---|---|---|---|---|---|
技术栈兼容性 | 高(Spring 系列) | 高(Java、Spring) | 高(多语言支持) | 高(多语言支持) | 高(多语言支持) | 中(主要为度量工具,链路追踪需要集成) | 高(多语言支持) | 高(多语言支持) |
功能特性 | 自动化追踪,日志集成 | 分布式追踪,存储查询 | 分布式追踪,高性能监控 | 跨语言支持,综合追踪 | 性能监控,事务追踪 | 度量监控,需配合链路追踪 | 高(分布式追踪、APM) | 性能监控,事务追踪 |
存储与查询能力 | 依赖 Zipkin 存储 | 支持内存和其他存储后端 | 分布式存储,查询强大 | 灵活,支持多种后端 | 支持 Elastic Stack | Prometheus 存储,Grafana 可视化 | 内建存储与查询功能 | 高效存储与查询能力 |
扩展性与可伸缩性 | 较好(基于 Spring) | 良好(支持分布式) | 非常高(分布式、水平扩展) | 高(分布式支持,水平扩展) | 高(Elastic Stack 扩展) | 适合大规模数据收集与可视化 | 高(支持大规模分布式监控) | 非常高(云原生支持) |
易用性和学习曲线 | 简单,Spring 生态集成 | 简单,配套工具丰富 | 学习曲线较陡,复杂配置 | 中等,跨语言学习曲线 | 简单,Elastic Stack 熟悉度高 | 需要结合配置使用,复杂度较高 | 中等,较为复杂 | 简单,界面友好 |
社区和支持 | 强大,Spring 生态 | 强大,活跃社区 | 强大,广泛应用 | 开源,社区活跃 | 强大,Elastic 社区 | 强大,开源社区 | 强大,社区活跃 | 强大,付费支持 |
成本 | 免费(开源) | 免费(开源) | 免费(开源) | 免费(开源) | 商业化(Elastic 订阅费用) | 免费(开源) | 免费(开源) | 商业化(按需计费) |
安全性 | 基于 Spring 安全集成 | 可配置加密 | 支持加密与认证 | 支持加密与认证 | 强(Elastic Stack 支持) | 可结合 Prometheus 加密配置 | 支持加密和认证 | 高(商业化方案提供安全性) |
集成能力 | 与 Spring 生态集成 | 与多种工具集成 | 强(支持多种后端) | 强(与多种系统兼容) | 与 Elastic Stack 集成 | 集成 Prometheus 等监控工具 | 强(支持多种后端) | 强(与多种工具兼容) |
合规性与隐私 | 需要自行管理 | 需要自行管理 | 支持隐私控制 | 支持隐私控制 | 支持(符合 GDPR 等) | 需要自行配置 | 支持(符合 GDPR 等) | 高(提供合规工具) |
结论:
- Spring Cloud Sleuth: 适合已经使用 Spring 生态的项目,简单易用,适合小到中型应用。
- Zipkin: 适用于需要独立的分布式链路追踪系统的场景,社区活跃。
- Jaeger: 高性能,适用于需要处理大规模数据的场景,支持水平扩展。
- OpenTelemetry: 跨语言支持强,适用于多种系统集成,适合对灵活性有高要求的项目。
- Elastic APM: 适用于已经在使用 Elastic Stack 的团队,集成简便,提供实时监控。
- Prometheus + Grafana: 适合需要度量监控与可视化的系统,虽然主要用于监控,但可扩展到链路追踪。
- Apache SkyWalking: 开源且功能全面,适用于大规模分布式系统,支持多种语言和后端。
- DataDog APM: 商业化服务,提供全面的监控与分析,适合对支持与安全性有较高要求的企业级应用。
3. 使用过的链路追踪组件
根据您的需求(中型项目,基于 Spring Cloud 框架,且偏向开源项目),我推荐以下三种链路追踪框架:
3.1. Spring Cloud Sleuth
- 技术栈兼容性: 作为 Spring 生态的一部分,Spring Cloud Sleuth 完美集成于 Spring Cloud 中,支持 Spring Boot 等项目,减少了手动配置的复杂度。
- 功能特性: 支持自动化追踪,能够与日志框架(如 Logback、Log4j)集成,非常适合 Spring 系统。
- 存储与查询能力: 依赖于 Zipkin 等后端进行数据存储和查询,支持多种存储选项,灵活配置。
- 扩展性与可伸缩性: 基于 Spring Cloud,支持微服务架构的扩展和伸缩。
- 易用性和学习曲线: 对 Spring 开发者非常友好,易于上手。
- 成本: 开源免费,适合中型项目。
- 集成能力: 与 Spring 生态系统集成紧密,适合使用 Spring Cloud 的项目。
3.2. Zipkin
- 技术栈兼容性: 与多种技术栈兼容,尤其适合 Java 系统,Spring Cloud Sleuth 默认使用 Zipkin 存储链路追踪数据。
- 功能特性: 提供分布式追踪,支持存储和查询链路信息,功能完善。
- 存储与查询能力: 支持多种存储后端(如 Elasticsearch、MySQL 等),且查询功能强大。
- 扩展性与可伸缩性: 适合分布式系统,支持水平扩展,能应对中型系统的需求。
- 易用性和学习曲线: 易于部署和配置,但需要根据实际需求选择合适的存储后端。
- 成本: 完全开源,适合预算有限的中型项目。
- 集成能力: 与其他监控和日志系统(如 Prometheus、Elasticsearch)集成良好。
3.3. Apache SkyWalking
- 技术栈兼容性: 支持多种技术栈,包括 Spring、Spring Boot,适用于多语言分布式环境。
- 功能特性: 提供分布式追踪、性能监控和错误分析等功能,适合复杂应用的全面监控。
- 存储与查询能力: 内建存储系统,提供高效的查询能力,适合中型及以上规模的系统。
- 扩展性与可伸缩性: 具有很高的扩展性,支持大规模分布式系统。
- 易用性和学习曲线: 配置相对复杂,但有丰富的文档支持。
- 成本: 开源免费,适合预算有限的中型项目。
- 集成能力: 支持与多种后端系统和监控工具集成,兼容性强。
4. 集成Spring Cloud Sleuth框架
Spring Cloud Sleuth 是一个分布式跟踪框架,旨在为微服务架构中的请求链提供追踪功能。它通过生成唯一的跟踪标识(Trace ID)和跨度标识(Span ID)来帮助追踪跨服务的请求。集成 Spring Cloud Sleuth,可以有效地监控、分析和调试分布式系统中的请求流。
4.1. 流程步骤
下面是如何在 Spring Cloud 项目中集成 Spring Cloud Sleuth 的详细步骤:
- 添加依赖
首先,需要在 pom.xml
中添加 Spring Cloud Sleuth 依赖。如果你使用的是 Spring Boot 2.x 和 Spring Cloud Hoxton 或以上版本,可以通过以下方式引入 Sleuth:
<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId></dependency><!-- 如果使用Spring Cloud Stream或者其他相关模块,还需要添加Spring Cloud Sleuth支持的其他模块 -->
</dependencies>
- 配置 Spring Cloud Sleuth
在 application.properties
或 application.yml
中,添加一些配置项来定制 Spring Cloud Sleuth 的行为。
#yaml
spring:sleuth:enabled: true# trace-id 长度为16trace-id-length: 16sampler:#链路追踪采样率 #采样率 1.0:表示每个请求都会被追踪。#采样率 0.0:表示没有请求会被追踪。#中间值:根据概率来决定是否追踪。probability: 1.0
logging:pattern:level: "%5p [%X{X-B3-TraceId},%X{X-B3-SpanId}] %m%n"
- 自动生成跟踪信息
Spring Cloud Sleuth 会自动在请求处理中为每个 HTTP 请求生成一个 TraceId
和 SpanId
。这些 ID 会传递到下游服务,使得你可以追踪整个请求链。Sleuth 默认会将追踪信息注入到日志中(例如 MDC 中的 X-B3-TraceId
和 X-B3-SpanId
)
Sleuth 通过为每个请求生成唯一的标识符来实现分布式追踪。它使用 TraceId 和 SpanId 来标识和追踪请求的生命周期。其核心概念包括:
- TraceId:一个全局唯一的标识符,代表整个请求的生命周期。每个请求从入口服务到最终服务都有相同的 TraceId。
- SpanId:表示单个操作或请求的执行段,每个 Trace 会包含多个 Span。每个服务中的每个处理请求的操作都会创建一个新的 Span,并与 TraceId 关联。
- Parent SpanId:表示当前 Span 的父 Span,如果一个请求是由另一个请求引发的,它会继承上一个请求的 SpanId 作为 Parent SpanId。
格式 | 说明 |
---|---|
微服务ID | 指明日志是由哪个微服务产生的。 |
TraceId | 轨迹编号。一次完整的业务处理过程被称为轨迹,例如:实现登录功能需要从服务 A 调用服务 B, 服务B再调用服务 C,那这一次登录处理的过程就是一个轨迹,从前端应用发来请求到接收到响应, 每一次完整的业务功能处理过程都对应唯一的 TraceId。 |
SpanId | 步骤编号。刚才要实现登录功能需要从服务 A 到服务 C 涉及 3 个微服务处理,按处理前后顺序, 每一个微服务处理时日志都被赋予不同的 SpanId。一个 TraceId 拥有多个 SpanId, 而 SpanId 只能隶属于某一个 TraceId。 |
导出标识 | 当前这个日志是否被导出,为 true 的时候说明当前轨迹数据允许被其他链路追踪可视化服务收集展现。 |
4.2 sleuth工作流程
Spring Cloud Sleuth 的技术实现
技术实现 | 说明 |
---|---|
AOP(面向切面编程) | Sleuth 使用 AOP 技术在方法调用前后拦截,创建新的 Span,并将其与当前请求的 TraceId 和 SpanId 相关联。 |
MDC(Mapped Diagnostic Context) | MDC 是一个线程局部存储(ThreadLocal),用于在同一线程中保存 TraceId 和 SpanId 等上下文信息。Sleuth 在每个请求的处理过程中将这些信息存储在 MDC 中,从而确保在整个请求处理链中都可以访问这些值。 |
Filter 机制 | Sleuth 使用 Spring 的过滤器机制(如 OncePerRequestFilter )在每个 HTTP 请求的生命周期内进行处理,确保每个请求都有 TraceId 和 SpanId,并将它们传递给下游服务。 |
Spring Cloud Sleuth 的工作流程
流程 | 说明 | 备注 |
---|---|---|
请求进入应用 | 当一个 HTTP 请求进入微服务应用时,Spring Cloud Sleuth 会自动生成一个 TraceId。 如果请求头中包含 X-B3-TraceId (例如,来自另一个微服务的请求)它会使用该 TraceId。如果请求中没有,则 Sleuth 会为其生成一个新的 TraceId。 | 1. TraceId:通常是一个 16 位的长整型数字,用于标识整个请求链路。 2. SpanId:生成一个新的 SpanId,表示请求处理的当前服务操作。 |
生成 Span操作节点 | 每次进入新的操作时(例如,在控制器、服务层方法等),Sleuth 会自动生成一个新的 Span。每个 Span 会关联一个父 SpanId,形成一条追踪链。 | 1. 如果请求已经存在 TraceId,新的 Span 会以该 TraceId 为父,而将新的 SpanId 与请求的操作关联。 2. 如果是第一个操作,则使用生成的 TraceId 和 SpanId。 |
传递 TraceId 和 SpanId | Spring Cloud Sleuth 会通过 HTTP 请求的头部(如 X-B3-TraceId 和 X-B3-SpanId )将 TraceId 和 SpanId 传递到下游服务。 | 1. 每个微服务在接收到请求后,会自动检查请求头部是否包含 X-B3-TraceId ,如果有,则提取并使用。如果没有,Sleuth 会生成一个新的 TraceId。 2. 通过传递 TraceId,服务可以追踪请求在整个微服务链中的流动。 |
日志中输出 TraceId 和 SpanId | 在应用的日志中,Sleuth 会通过 MDC 将 TraceId 和 SpanId 自动放入日志上下文。你可以在日志格式中使用 %X{X-B3-TraceId} 和 %X{X-B3-SpanId} 来输出这些值,帮助你追踪请求的流转过程 | |
服务之间的通信 | 当一个服务调用另一个服务时,Spring Cloud Sleuth 会自动将当前的 TraceId 和 SpanId 传递给下游服务。这个过程是通过修改 HTTP 请求头中的 X-B3-TraceId 和 X-B3-SpanId 来完成的。 | 1. 如果下游服务没有传递 X-B3-TraceId ,它将会新生成一个 TraceId。 2. 下游服务会创建新的 Span,继续与父 SpanId 关联,从而形成一个完整的链条。 |
5. 集成zipKin
Spring Cloud Sleuth 支持与分布式跟踪系统(如 Zipkin 或 OpenTelemetry)集成,从而能够在 UI 上查看整个请求链的情况。
5.1 添加 Zipkin 相关依赖
<!-- 该依赖是spring-cloud-starter-sleuth 和spring-cloud-sleuth-zipkin 组合 不要再重复添加spring-cloud-starter-sleuth 依赖-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
等价于
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
注意如果使用spring-cloud-starter-zipkin依赖 需要去掉 之前配置的sleuth依赖 否则zipkin UI无法获取到链路信息
5.2 安装zipkin服务
zipkin官网官网教程中提供了多种方式安装docker、java运行、下载源码打包运行(需要java版本17以及以上)、homebrew下载
这里使用简单jar下载并运行
下载zipkin jar包
选择自己下载的版本进行下载
#运行zipkin
java -jar zipkin-server-2.9.4-exec.jar#运行zipkin 静默启动
nohup java -jar zipkin-server-2.9.4-exec.jar > zipkin.log 2>&1 &
5.3 配置 Zipkin 地址
spring:zipkin:# Zipkin 后端服务的地址base-url: http://localhost:9411/
5.4 访问 Zipkin UI
只要有http请求配置sleuth和zipkin服务,对应的链路都会被zipkin收集起来,并在zipkin UI上进行查看。
访问 http://localhost:9411/ 就可以使用ui页面进行查看链路了(访问一下服务,才会有数据)。
zipkin UI页面
链路详情
依赖分析
6. 集成SkyWalking
SkyWalking 是一个开源的分布式追踪和性能监控平台,支持应用的分布式追踪、应用性能管理 (APM)、服务监控等。它与 Spring Cloud 的集成可以帮助你实时监控微服务架构中的请求流向、性能瓶颈等。
下面是 Spring Cloud 集成 SkyWalking 的详细步骤。
6.1 安装skyWalking UI
-
从安装skyWalking UI 下载最新版本的二进制包(如
apache-skywalking-apm-x.x.x.tar.gz
)注意:6.x.x版本 可以使用jdk8 更高的版本需要使用jdk11。(我的是jdk8 所以下载的是6.6.0)skywalking-apm-x.x.x.tar.gz
使用默认的存储(例如 H2、RocksDB)。skywalking-apm-es-x.x.x.tar.gz
使用 Elasticsearch 作为存储后端。
-
解压后,进入bin目录,启动 SkyWalking OAP 和 UI 服务:
# 启动 OAP 服务 ./oapService.sh start #SkyWalking OAP started successfully! 启动成功# 启动 UI 服务 ./webappService.sh start #SkyWalking Web Application started successfully! 启动成功
-
默认情况下,SkyWalking UI 访问地址为:
http://localhost:8080
。
skyWalking 目录结构
目录 | 作用 | 内容 |
---|---|---|
bin | 存放启动脚本和工具 | oap-services.sh / oap-services.bat:启动或停止 OAP 服务的脚本。 webapp.sh / webapp.bat:启动或停止 SkyWalking UI 的脚本。 其他工具脚本,如配置生成、日志清理等。 |
config | 存放配置文件 | application.yml:OAP 服务的核心配置文件,包含端口、存储、集群等配置。 agent-config 目录:包含 SkyWalking Agent 的配置文件,如 agent.config。 其他配置文件,如告警规则、日志配置等。 |
logs | 存放日志文件 | oap 目录:OAP 服务的日志文件。 webapp 目录:SkyWalking UI 的日志文件。 其他日志文件,如告警日志、错误日志等。 |
oap-libs | 存放 OAP 服务的依赖库 | 包含 OAP 服务运行所需的所有 JAR 包和依赖库。 |
webapp | 存放 SkyWalking UI 的前端文件 | 包含前端静态资源(如 HTML、CSS、JavaScript)。 配置文件 webapp.yml,用于配置 UI 的访问端口、后端地址等。 |
agent | 存放 SkyWalking Agent 的文件(可选) | 包含 Agent 的核心 JAR 包和插件。 配置文件 agent.config,用于配置 Agent 的采集策略、后端地址等。 |
licenses | 存放许可证文件(可选) | 包含 SkyWalking 的开源许可证文件(如 Apache License 2.0) |
6.2 Maven 依赖
如果你的项目是基于 Maven 的,你需要在 pom.xml
文件中添加如下依赖:
<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-logback-1.x</artifactId><version>9.0.0</version>
</dependency><dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><version>9.0.0</version>
</dependency>
6.3.配置 SkyWalking Agent
SkyWalking 使用 Java Agent 进行自动化的分布式追踪,因此你需要下载并配置 SkyWalking Java Agent。
下载 SkyWalking Agent
- 前往 SkyWalking 官网 下载最新的 SkyWalking Agent。
- 解压下载的文件,你会看到一个名为
agent
的文件夹,里面包含了skywalking-agent.jar
。
上述6.1中安装skyWalking UI下在的tar包里agent
的文件夹,里面包含了 skywalking-agent.jar
。
配置 Java Agent
在 Spring Boot 应用的启动命令中,指定 SkyWalking 的 Java Agent。
java -javaagent:/${path}/skywalking-agent.jar \
-Dskywalking.agent.service_name=${your-service-name} \
-Dskywalking.collector.backend_service=localhost:11800 \
-Dskywalking.agent.namespace=default \
-jar xxxx.jar
-javaagent:/${path}/skywalking-agent.jar
:指定 SkyWalking Agent 的位置。-Dskywalking.agent.service_name=${your-service-name}
:设置应用的服务名称。-Dskywalking.collector.backend_service=localhost:11800
:指定 SkyWalking 后端的地址(默认使用localhost:11800
)。-Dskywalking.agent.namespace=default
:设置命名空间,默认是default
。
确保你将 ${path}
替换为实际的 SkyWalking Agent 路径,${your-service-name}
替换为你的服务名称。
设置采样率
#agent目录下的agent.config 用于配置 Agent 的采集策略、后端地址等。需要打开里面的采样率配置#每3秒采样的追踪(trace)数量
# 1.全量采集(负数或 0)
# 1.部分采集(正整数,数字越大,采样率越高)
agent.sample_n_per_3_secs=${SW_AGENT_SAMPLE:-1}
agent.config
配置项 | 说明 | 默认值 |
---|---|---|
agent.service_name | 应用在 SkyWalking UI 中展示的服务名称,需为每个服务设置唯一名称。 | 无(必须配置) |
collector.backend_service | SkyWalking OAP 后端服务的地址,用于接收探针采集的数据。 | 127.0.0.1:11800 |
agent.namespace | 命名空间,用于隔离跨进程传播的 Header,若配置则 Header 将包含命名空间信息。 | 空字符串 |
agent.sample_n_per_3_secs | 每 3 秒采样 N 条数据,负数或 0 表示不采样(即全量采集)。 | -1 (全量采集) |
agent.instance_name | 服务实例的唯一标识,建议在分布式系统中设置,以便区分不同实例。 | 空字符串(需手动配置) |
agent.authentication | 鉴权配置,取决于后端是否开启鉴权功能,目前仅实现基本鉴权。 | 空字符串 |
agent.span_limit_per_segment | 单个 Segment 中 Span 的最大数量,用于估算应用程序内存开销。 | 150 |
agent.ignore_suffix | 忽略以指定后缀结尾的 Segment,例如 .jpg , .css 等静态资源请求。 | 空字符串 |
logging.level | 日志级别,可选值包括 DEBUG , INFO , WARN , ERROR 。 | DEBUG |
logging.file_name | 日志文件名,默认输出到 skywalking-api.log 。 | skywalking-api.log |
plugin.mongodb.trace_param | 是否记录 MongoDB 访问的参数信息,true 表示记录,false 表示仅记录操作名。 | false |
plugin.elasticsearch.trace_dsl | 是否记录 Elasticsearch 的 DSL 查询信息,true 表示记录,false 表示不记录。 | false |
6.4 链路查看
微服务 customer-server、order-server两个为服务:拓扑关系如下:
访问http请求,查看日志是否有链路数据,同时skywalking 收集到链路数据
日志数据
skyWalking 收集的日志数据
6.5 skywalking 原理
SkyWalking 的架构
SkyWalking 采用客户端-服务器架构,主要由以下几个核心组件构成:
核心组件 | 说明 |
---|---|
SkyWalking Agent | 在应用程序中部署,负责收集应用程序的性能数据,并将这些数据发送到 SkyWalking OAP进行处理和存储。 |
SkyWalking OAP | 作为数据处理和分析平台,OAP 负责接收来自 Agent 的数据,对其进行存储、分析, 并提供 API 和 UI 来查看分析结果。OAP 提供了许多功能模块,如 Trace、Metric、Log 等。 |
SkyWalking UI | 提供 Web 界面用于查看和分析监控数据,展示系统健康状态、请求链路、性能瓶颈等信息。 |
数据收集和传输流程
-
数据收集
- 分布式追踪(Distributed Tracing): SkyWalking 通过
agent
在应用程序中集成追踪功能。当请求进入应用时,agent
会为每个请求生成一个唯一的追踪 ID,并记录请求的执行路径,包括服务调用的链路信息(如方法、接口、调用的微服务等)。- Span:每个追踪的过程被称为一个
Span
,例如,调用某个方法、调用一个外部服务等。每个Span
记录了执行的时间、状态、错误等信息。
- Span:每个追踪的过程被称为一个
- 指标收集: 除了追踪信息,SkyWalking 还会收集应用程序的各种性能指标,如 CPU 使用率、内存使用、请求吞吐量等。通过定时上报这些指标,用户可以了解系统的运行状态。
- 日志收集: SkyWalking 还可以收集应用程序的日志,并将日志与 Trace 数据关联起来,便于用户进行问题排查和分析。
- 分布式追踪(Distributed Tracing): SkyWalking 通过
-
数据传输
- gRPC 通道: SkyWalking Agent 将收集到的数据通过 gRPC 协议发送给 SkyWalking OAP。gRPC 是一个高效的远程过程调用框架,适用于微服务环境中的高并发数据传输。
- 数据格式: 数据以特定的格式(如 JSON 或 Protocol Buffers)传输,包含 Trace 数据、指标数据、日志等内容。
-
数据存储与分析
- OAP 处理与存储: 在接收到 Agent 发送的数据后,SkyWalking OAP 会对数据进行处理,存储在内存或数据库中。OAP 提供的分析模块会对数据进行处理,分析应用程序的性能瓶颈、服务依赖关系、错误和异常等。
- 查询和分析: 用户可以通过 SkyWalking 提供的 UI 查询和分析数据,查看应用的整体健康状况、链路追踪、性能瓶颈等信息。
SkyWalking 数据模型
数据模型 | 说明 |
---|---|
Trace | 一个 Trace 代表了一个请求的执行路径,包含了多个 Span。 Span:每个 Span 代表一个操作的时间范围,通常是一个函数调用或一个远程服务的调用。 Segment:一组 Span,通常表示一个微服务的生命周期,包含多个步骤或服务调用。 |
Metrics | 表示系统的性能指标,如吞吐量、响应时间、CPU 使用率等。 |
Logs | 与 Trace 相关联的日志信息,用于帮助分析问题。 |
分布式追踪的工作原理
在分布式系统中,一个请求通常会跨多个服务进行调用,SkyWalking 通过以下方式实现分布式追踪:
- 请求进来时,SkyWalking 会生成一个唯一的 Trace ID,并将其附加到请求的所有后续调用中。
- 每个服务都会生成一个 Span,记录该服务的请求信息,并将它发送到 SkyWalking OAP。
- OAP 会将多个服务的 Span 组合在一起,形成一个完整的 Trace,并通过 UI 显示各服务之间的调用链路。
相关文章:
链路追踪组件学习
目录 1. 为啥需要链路追踪2. 常见的链路追踪组件3. 使用过的链路追踪组件3.1. Spring Cloud Sleuth3.2. Zipkin3.3. Apache SkyWalking 4. 集成Spring Cloud Sleuth框架4.1. 流程步骤4.2 sleuth工作流程 5. 集成zipKin5.1 添加 Zipkin 相关依赖5.2 安装zipkin服务5.3 配置 Zipk…...
# 基于OpenCV与Dlib的人脸融合技术实现
从仿射变换到人脸融合:基于OpenCV和Dlib的图像处理实践 在图像处理领域,仿射变换和人脸融合是两个非常有趣且实用的技术。仿射变换可以用于图像的几何变换,而人脸融合则可以创造出令人惊叹的视觉效果。本文将通过两个具体的代码示例…...
多光谱相机:水环境监测(水体富营养化、黑臭水体、藻类水华)
随着全球水体污染问题日益严峻,水体富营养化、黑臭水体和藻类水华等生态危机对人类健康和水生系统构成重大威胁。传统监测手段(如人工采样、单点传感器)因效率低、覆盖不足、实时性差等局限,难以满足复杂水环境的动态监管需求。多…...
记录一次nginx访问前端首页,一直显示nginx首页问题(实际是nginx访问页面权限问题)
同一台服务器,nginx配置是server { listen 8081; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location /New_mh_other { alias /home/hqu/data/new_mh_other; try…...
windows下命名管道双端通信
实现功能 1、命名管道双端通信(异步) 2、客户端断线重连 PS:多线程版本 PipeWrapper.h #include <windows.h> #include <string> #include <vector> #include "Utils/ThreadObject.h" #include "Utils/T…...
Linux自行实现的一个Shell(15)
文章目录 前言一、头文件和全局变量头文件全局变量 二、辅助函数获取用户名获取主机名获取当前工作目录获取最后一级目录名生成命令行提示符打印命令行提示符 三、命令处理获取用户输入解析命令行执行外部命令 四、内建命令添加环境变量检查和执行内建命令 五、初始化初始化环境…...
powerDesign 逆向 mysql 生成 物理模型,并用VBS脚本整理comment
学习自:https://www.cnblogs.com/xmyjcs/p/8536233.html 文章目录 Reverse Engineer格式化模型执行 VBS 脚本 Reverse Engineer 下面 DBMS 可以通过 ODBC(Open Database Connectivity,开放数据库连接)连接, 需要自己先…...
跨境全域中台:前端独立站群+后端共享云仓的协同作战体系
在全球化浪潮与互联网技术飞速发展的当下,跨境电商已然成为国际贸易领域中最为活跃的力量。据相关数据显示,过去几年跨境电商的年增长率持续保持高位,越来越多的企业投身于这片充满机遇与挑战的蓝海市场。在竞争日益激烈的跨境电商赛道上&…...
国产芯片解析:乐得瑞LDR6500C 超小封装全能芯片,赋能智能设备未来
LDR6500C是乐得瑞科技针对USB-C标准中的Bridge设备而开发的双USB-C DRP接口PD通信芯片,具备切换Data Role功能,支持最高USB PD 100W 充电,并且针对各大品牌设备的 USB-C 兼容性进行了特别优化,非常适合于 USB Type-C 设备快充转接…...
代码随想录-06-二叉树-05.10 二叉树的最小深度
二叉树的最小深度 #模板题 题目描述 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明叶子节点是指没有子节点的节点 具体思路(暴力) 层序遍历;找到cur.left null && cur.ri…...
系统与网络安全------网络通信原理(6)
资料整理于网络资料、书本资料、AI,仅供个人学习参考。 应用层解析 DNS Domain Name System,域名系统 用来完成域名与IP地址之间的映射,便于用户对网站的记忆和访问 端口号为TCP或UDP的53 DNS工作原理 FTP File Transfer Protocol 文件…...
【Vue #2】脚手架 指令
一、脚手架 脚手架:一个保证各项工作顺利开展的平台,方便我们 拿来就用,零配置 1. Vue 代码开发方式 相比直接 script 引入 vue 源码,有没有更好的方式编写vue代码呢? ① 传统开发模式: 基于html文件开发Vue&…...
UE5 后坐力枪口上抬和恢复
文章目录 计算后坐力并让视角上抬后坐力回落 计算后坐力并让视角上抬 在玩家蓝图里,声明一个方法OnShootOnce,在武器每次射击时调用 1检测新的后坐力是否超过了最大后坐力,并选择一个小的 2 如何将角色模型设置为相机的子物体 3 最后记录一下当前的…...
Mysql B+树高度如何计算?
MySQL 的 InnoDB 存储引擎使用 B+树 作为索引结构,其高度增加会直接影响查询性能(每次高度增加意味着多一次磁盘 I/O)。以下是 B+树高度增加的 关键场景 和 优化建议: 1. B+树高度增加的触发条件 (1) 数据量持续增长 根本原因:B+树的层级由数据量(记录数)和每个节点的容…...
UE5 使用贴花创建弹孔
文章目录 使用射线检测击中点在击中点处创建贴花 使用射线检测击中点 和untiy一样,发射一条射线,在命中点处创建弹孔 在武器里定义射击检测方法 以下是对上边使用的方法的展开 GetShootStartPosition:获取射击起点 computeShootEndPosition:…...
程序持续内存泄漏问题定位参考
0 概括 本文用于记录 x86-Linux 应用程序发生持续性内存泄漏问题时的定位方法。主要介绍valgrind工具的应用。 1 原理 对于内存泄漏问题的定位,一种朴素的想法就是对内存申请点进行监控。对于一个内存申请调用点(例如c/c中的malloc函数)&a…...
Lumion 与 Enscape 怎么选?附川翔云电脑适配指南
建筑可视化领域,Lumion 和 Enscape 是两款主流实时渲染器,核心差异体现在操作逻辑、渲染特性及适用场景。结合川翔云电脑平台的硬件支持,可进一步优化使用体验。 一、核心差异:效率、操作与场景适配 1. 操作门槛与实时性 Lumio…...
WebShell详解:原理、分类、攻击与防御
目录 一、WebShell的定义与核心概念 二、WebShell的分类 三、WebShell的攻击原理与常见手法 1. 攻击原理 2. 常见攻击路径 四、WebShell的危害 五、防御与检测策略 六、总结 一、WebShell的定义与核心概念 WebShell是一种以ASP、PHP、JSP等网页脚本形式存在的恶…...
Ubuntu 24.04 中文输入法安装
搜狗输入法,在Ubuntu 24.04上使用失败,安装教程如下 https://shurufa.sogou.com/linux/guide 出现问题的情况,是这个帖子里描述的: https://forum.ubuntu.org.cn/viewtopic.php?t493893 后面通过google拼音输入法解决了&#x…...
数码视讯TR100系列/TR100-G1/TR100-G4/数码视讯F7-国科GK6323V100C芯片-刷机固件包
数码视讯TR100系列/数码视讯TR100-G1/数码视讯TR100-G4/数码视讯F7-国科GK6323V100C芯片-刷机固件包 刷机教程: 里面共有两种方法,一是TTL线刷烧录方法;二是卡刷固件包; 下面以数码视讯TR100-…...
Cloudflare教程:免费优化CDN加速配置,提升网站访问速度 | 域名访问缓存压缩视频图片媒体文件优化配置
1、启用 Tiered Cache 缓存开关:通过选择缓存拓扑,可以控制源服务器与 Cloudflare 数据中心的连接方式,以确保缓存命中率更高、源服务器连接数更少,并且 Internet 延迟更短。 2、增加浏览器缓存时间TTL:在此期间&#…...
24体育NBA足球直播M24模板自适应板源码
源码名称:体育直播赛事扁平自适应M24直播模板源码 开发环境:帝国cms7.5 空间支持:phpmysql 带软件采集,可以挂着自动采集发布,无需人工操作! 演示地址:https://www.52muban.com/shop/184022.h…...
dify+wan2.1搭建文生视频生成工具流
本文介绍在dify中使用阿里开源的Wan2.1 1.3B模型搭建文生视频工作流的方法。 使用的工具如下: 1、dify(官方:https://docs.dify.ai/zh-hans) 2、comfyui 一、comfyui安装 为了简单起见,本文介绍使用autodl完成comfyui的部署。在autodl创建实例,使用的镜像如下图: 大…...
C# js 判断table中tr否存在相同的值
html 中如: 实现:table数据表格中,点击删除按钮时,验证相同子订单号条数是否大于1,大于允许删除。保证数据表格中只有唯一的一条子订单号数据。 <table style"width: 100%; background-color: #fff;" ce…...
HTML5+CSS3小实例:纯CSS绘制七巧板
实例:纯CSS绘制七巧板 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale…...
什么是虚拟线程?与普通线程的区别
引言:线程的演进与挑战 在传统的并发编程中,线程是一种非常重要的概念。我们使用线程来实现任务的并发执行,从而提高程序的执行效率。普通线程(如 Thread 类)是一种重量级的线程,每个线程都对应着操作系统…...
Docker MySQL的主从同步 数据备份 数据同步 配置文件
创建主库 docker run \--namemysql_1 \-e MYSQL_ROOT_PASSWORD123456 \-p 3306:3306 \-v mysql_main_data:/var/lib/mysql \--restart unless-stopped \-d \mysql:8.0进入容器内部 docker exec -it mysql_1 bash查找配置文件 find / -name my.cnf复制出主机 docker cp mysql…...
PowerBI中的DATEDIFF函数
一、语法 DATEDIFF(开始日期,结束日期,日期时间类型),返回两个日期之间的时间差 二、示例 开始日期结束日期度量值计算结果2025/4/1 15:33:202025/4/1 15:33:30计算 DATEDIFF([开始日期],[结束日期],SECOND)102025/4/1 15:332025/4/1 15:3…...
C/C++共有的类型转换与c++特有的四种强制类型转换
前言 C 语言和 C 共有的类型转换: 自动类型转换(隐式类型转换): 编译器在某些情况下会自动进行的类型转换。强制类型转换(显示类型转换): 使用 (type)expression 或 type(expression) 语法进行…...
体验OceanBase的 并行导入功能
在数据库的日常使用中,会经常遇到以下场景: 数据复制:将一个或多个表中的数据复制到目标表中,可能是复制全部数据,也可能仅复制部分数据。数据合并:将数据从一个表转移到另一个表,或者将多…...
CSS的字体
在 CSS 中,字体(font)是网页设计中的一个重要部分,它控制了文本的外观和排版效果。通过设置不同的字体属性,我们可以使网页上的文字更具吸引力和可读性。以下是与字体相关的 CSS 属性及其用法: 1️⃣ font…...
开源模型应用落地-LangChain与MCP协议-集成GPT-4o构建下一代AI智能体的全栈实践(三)
一、前言 在人工智能技术快速迭代的今天,大型语言模型(LLM)如何高效集成外部工具与多模态能力,成为开发者面临的核心挑战。Anthropic推出的模型上下文协议(MCP)通过标准化工具接口,为AI应用提供了“即插即用”的生态基础,而LangChain凭借其模块化设计,正成为连接LLM…...
Qt 5.14.2入门(一)写个Hello Qt!程序
目录 参考链接:一、新建项目二、直接运行三、修改代码增加窗口内容1、Qt 显示一个 QLabel 标签控件窗口2、添加按键 参考链接: Qt5教程(一):Hello World 程序 Qt 编程指南 一、新建项目 1、新建一个项目(…...
FPGA_DDR(二)
在下板的时候遇到问题 1:在写一包数据后再读,再写再读 这时候读无法读出 查看时axi_arready没有拉高 原因 : 由于读地址后没有拉高rready,导致数据没有读出卡死现象。 解决结果...
思科交换机配置
以下是交换机配置的详细步骤指南,适用于Cisco交换机,其他品牌需调整命令: 1. 初始连接与基本配置 连接方式:使用Console线连接交换机,通过终端软件(如PuTTY)登录。波特率:9600&…...
单链表——C语言实现
目录 一.相关指针知识点 二.链表 1.为什么学了顺序表还要学链表 2.优点 三.实现 1.链表的打印 —— 理解链表结构 (2) 物理结构图 2.链表的尾插 —— 入门 错误写法:tail ! NULL 总结: 正确代码物理图解: (2) 尾插整体代码 (思考…...
PostgreSQL插件生态全景解析:赋能数据库的无限可能
PostgreSQL以其开放的扩展生态闻名于世,其插件机制如同瑞士军刀般灵活,能够在不修改核心代码的前提下实现功能无限延伸。本文将基于多年内核开发经验,深度剖析PostgreSQL插件生态体系,为架构师与开发者提供全景式技术选型参考。 一…...
minio提供nfs服务
minio提供nfs服务 挂载minio为本地目录开机自动挂载使用supervisor实现开机自动挂载服务单元实现开机自动挂载minio为本地目录---失败 调试 挂载minio为本地目录 使用 Minio 作为后端存储,并通过 NFS 为客户端提供访问,那么你需要一个中间层来将 Minio …...
QML中的信号与槽机制
QML 中的信号与槽机制是 Qt 框架的核心特性之一,它提供了一种对象间通信的强大方式。与 C 中的信号槽类似,但语法更加简洁。 基本概念 1. 信号 (Signal) 当某个特定事件发生时由对象自动发出的通知 例如:按钮被点击时发出的 clicked 信号 …...
使用 Ktor 构建现代 Android 应用的后端服务
使用 Ktor 构建现代 Android 应用的后端服务 前言 在移动互联网时代,Android 应用对后端服务的实时性与性能要求越来越高,而传统的后端框架在一些场景中存在复杂度高、扩展性不足等问题。Ktor 作为 JetBrains 推出的异步 Web 框架,充分利用…...
leetcode_454. 四数相加 II_java
454. 四数相加 IIhttps://leetcode.cn/problems/4sum-ii/ 1、题目 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] …...
类名与协议名相同,开发中应该避免吗?
在 Objective-C 开发中,协议与实现类之间的命名关系非常重要。虽然语言允许协议名和类名相同,但从可读性和维护性等角度出发,这种做法并不推荐。本文通过一个典型示例展开分析,并提供更合理的命名建议。 一、示例 在某项目中&…...
环信鸿蒙版 UIKit 快速上手指南
环信鸿蒙版 UIKit 是专为 HarmonyOS 开发者设计的 IM UI 组件库,基于环信 IM SDK 开发,可帮助开发者快速集成即时通讯功能。 环信UIKit 的特点 ArkUI 声明式开发范式:采用高效简洁的声明式开发方式状态管理 V2:支持深度观测和精…...
编译freecad
git clone --recurse-submodules https://github.com/FreeCAD/FreeCAD.git freecad-source 手动安装 vscode 扩展安装cmake tool cmake ../ 缺什么装什么 Third Party Libraries - FreeCAD Documentation sudo apt install qt6-base-dev sudo apt install libyaml-cpp-dev …...
安卓Kotlin接入高德定位和地图SDK
前言:高德的定位sdk可以获取设备当前的详细信息,如经纬度,具体地址(省->街道)等, 本文主要使用的是定位sdk和地图sdk中的poi搜索功能(以当前位置半径多少米内的关键词搜索) 目录…...
JavaScript浅拷贝与深拷贝
目录 浅拷贝(Shallow Copy) 一、浅拷贝的定义 二、直接赋值 vs 浅拷贝 1. 直接赋值 2. 浅拷贝 三、数组的浅拷贝方法 1. slice() 2. concat() 3. 扩展运算符(...) 四、对象的浅拷贝方法 1. Object.assign() 2. 扩展运…...
智能生态之城-广东茂名
故事摘要 在中国广东茂名的未来社区,晨光中,垂直果园里发光的荔枝与智能无人机的早餐派送唤醒了城市的生活。在海底透明隧道的图书馆里,孩子们通过声控设备与虚拟生物互动。面对暴雨来临时,市民们积极参与到荔枝蜜饯制作和雨季造林…...
【Android】Android Activity 横屏设置详解及常见异常问题解决方法汇总
在 Android 开发中,我们经常需要控制 Activity 的屏幕方向,例如视频播放、游戏、VR/AR 应用等场景通常希望默认横屏显示。本文将讲解如何通过 Manifest 配置 和 Java/Kotlin 代码 设置横屏显示,并分析常见设置无效的原因与解决方法。 一、通过…...
Android 存储路径
一、内部存储路径(Internal Storage) stats.codeSize(内部代码大小) 路径:/data/app/com.example.test-{随机后缀}/base.apk 说明:APK 安装路径,包含应用代码…...
【12】数据结构之基于线性表的排序算法
目录标题 插入排序直接插入排序折半插入排序希尔排序 交换排序冒泡排序快速排序 归并排序时间复杂度对比最好情况平均情况最坏情况 空间复杂度对比 插入排序 基本思想:将一个元素插入到一个有序序列中,继而得到一个有序的元素个数加一的新序列. 直接插…...