40张图,带你搞懂SkyWalking

5分钟搞懂主流链路追踪工具:Zipkin、Pinpoint、SkyWalking、CAT、Jaeger怎么选? 本文深入比较了主流链路追踪工具Zipkin、Pinpoint、SkyWalking、CAT和Jaeger的核心差异,帮助开发者快速选择适合自己技术栈和业务场景的方案。从技术实现、接入成本、监控能力到数据可视化和社区生态,全面解析各工具优劣,助力提升分布式系统监控效率。 阅读详情

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:码海


前言

在微服务架构中,一次请求往往涉及到多个模块,多个中间件,多台机器的相互协作才能完成。这一系列调用请求中,有些是串行的,有些是并行的,那么如何确定这个请求背后调用了哪些应用,哪些模块,哪些节点及调用的先后顺序?如何定位每个模块的性能问题?本文将为你揭晓答案。

本文将会从以下几个方面来阐述

  • 分布式追踪系统原理及作用

  • SkyWalking的原理及架构设计

  • 我司在分布式调用链上的实践

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

分布式追踪系统的原理及作用

如何衡量一个接口的性能好坏,一般我们至少会关注以下三个指标

  • 接口的 RT 你怎么知道?

  • 是否有异常响应?

  • 主要慢在哪里?

单体架构

在初期,公司刚起步的时候,可能多会采用如下单体架构,对于单体架构我们该用什么方式来计算以上三个指标呢?

a50ee14625084b0d381e3a926b3bfb0f.png

最容易想到的显然是用 AOP

8db3405bb1d009490792b02272ed4b9e.png

使用 AOP 在调用具体的业务逻辑前后分别打印一下时间即可计算出整体的调用时间,使用 AOP 来 catch 住异常也可知道是哪里的调用导致的异常。

微服务架构

在单体架构中由于所有的服务,组件都在一台机器上,所以相对来说这些监控指标比较容易实现,不过随着业务的快速发展,单体架构必然会朝微服务架构发展,如下

f2f8255c862016cee7f93603b2722e0d.png

如图示:一个稍微复杂的微服务架构

如果有用户反馈某个页面很慢,我们知道这个页面的请求调用链是 A ----->  C ----->  B ----->  D,此时如何定位可能是哪个模块引起的问题。每个服务 Service A,B,C,D 都有好几台机器。怎么知道某个请求调用了服务的具体哪台机器呢?

07065ca07d0cf228bc4d64cf926c39d6.png可以明显看到,由于无法准确定位每个请求经过的确切路径,在微服务这种架构下有以下几个痛点

  1. 排查问题难度大,周期长

  2. 特定场景难复现

  3. 系统性能瓶颈分析较难

分布式调用链就是为了解决以上几个问题而生,它主要的作用如下

  • 自动采取数据

  • 分析数据产生完整调用链 :有了请求的完整调用链,问题有很大概率可复现

  • 数据可视化:每个组件的性能可视化,能帮助我们很好地定位系统的瓶颈,及时找出问题所在

通过分布式追踪系统能很好地定位如下请求的每条具体请求链路,从而轻易地实现请求链路追踪,每个模块的性能瓶颈定位与分析。

ab98fe7a8e5d8c76628b2fea2e8513cf.png

分布式调用链标准 - OpenTracing

知道了分布式调用链的作用,那我们来看下如何实现分布式调用链的实现及原理, 首先为了解决不同的分布式追踪系统 API 不兼容的问题,诞生了 OpenTracing 规范,OpenTracing 是一个轻量级的标准化层,它位于应用程序/类库和追踪或日志分析程序之间。

db12cb70a6012a6f7104085c71873f02.png

这样 OpenTracing 通过提供平台无关,厂商无关的 API,使得开发人员能够方便地添加追踪系统的实现。

说到这大家是否想过 Java 中类似的实现?还记得 JDBC 吧,通过提供一套标准的接口让各个厂商去实现,程序员即可面对接口编程,不用关心具体的实现。这里的接口其实就是标准,所以制定一套标准非常重要,可以实现组件的可插拔。

1c7d086fa411f34baa248f8705cc2368.png

接下来我们来看 OpenTracing 的数据模型,主要有以下三个

  • Trace :一个完整请求链路

  • Span :一次调用过程(需要有开始时间和结束时间)

  • SpanContext :Trace 的全局上下文信息, 如里面有traceId

理解这三个概念非常重要,为了让大家更好地理解这三个概念,我特意画了一张图bda61042e65b9751ffd209214c6c7f83.png

如图示,一次下单的完整请求 完整就是一个 Trace, 显然对于这个请求来说,必须要有一个全局标识来标识这一个请求,每一次调用就称为一个 Span,每一次调用都要带上全局的 TraceId, 这样才可把全局 TraceId 与每个调用关联起来,这个 TraceId 就是通过 SpanContext 传输的,既然要传输显然都要遵循协议来调用。如图示,我们把传输协议比作车,把 SpanContext 比作货,把 Span 比作路应该会更好理解一些。

理解了这三个概念,接下来我看看分布式追踪系统如何采集统一图中的微服务调用链

da91dc5a0e6a9a1972bc44d4df56830d.png

我们可以看到底层有一个 Collector 一直在默默无闻地收集数据,那么每一次调用 Collector 会收集哪些信息呢。

  1. 全局 trace_id:这是显然的,这样才能把每一个子调用与最初的请求关联起来

  2. span_id: 图中的 0,1,1.1,2,这样就能标识是哪一个调用

  3. parent_span_id:比如 b 调用 d 的  span_id 是 1.1,那么它的 parent_span_id 即为 a 调用 b 的 span_id 即 1,这样才能把两个紧邻的调用 关联起来。

有了这些信息,Collector 收集的每次调用的信息如下

c0a2480ab817fde2e3113c003d0be5d4.png

根据这些图表信息显然可以据此来画出调用链的可视化视图如下

400246d95d183e4473a63790f0f1a427.png

于是一个完整的分布式追踪系统就实现了。

以上实现看起来确实简单,但有以下几个问题需要我们仔细思考一下

  1. 怎么自动 采集 span 数据:自动采集,对业务代码无侵入

  2. 如何跨进程传递 context

  3. traceId 如何保证全局唯一

  4. 请求量这么多采集会不会影响性能

接下我来看看 SkyWalking 是如何解决以上四个问题的

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

SkyWalking的原理及架构设计

怎么自动采集 span 数据

SkyWalking 采用了插件化 + javaagent 的形式来实现了 span 数据的自动采集,这样可以做到对代码的 无侵入性 ,插件化意味着可插拔,扩展性好(后文会介绍如何定义自己的插件)

0ea028b31c0a2792ac0e53c3ab45f9b9.png

如何跨进程传递 context

我们知道数据一般分为 header 和 body, 就像 http 有 header 和 body, RocketMQ 也有 MessageHeader,Message Body, body 一般放着业务数据,所以不宜在 body 中传递 context,应该在 header 中传递 context,如图示

ac8f9fe94d46c2e4e3a9203da00a6a58.pngdubbo 中的 attachment 就相当于 header ,所以我们把 context 放在 attachment 中,这样就解决了 context 的传递问题。

8d1bc3519fe7987e5d2f86d4b7ec2de3.png小提示:这里的传递 context 流程均是在 dubbo plugin 处理的,业务无感知,这个 plugin 是怎么实现的呢,下文会分析

traceId 如何保证全局唯一

要保证全局唯一 ,我们可以采用分布式或者本地生成的 ID,使用分布式话需要有一个发号器,每次请求都要先请求一下发号器,会有一次网络调用的开销,所以 SkyWalking 最终采用了本地生成 ID 的方式,它采用了大名鼎鼎的 snowflow 算法,性能很高。

56fad8f6765d76400f17e6ec097fb484.png
图示: snowflake 算法生成的 id

不过 snowflake 算法有一个众所周知的问题:时间回拨 ,这个问题可能会导致生成的 id 重复。那么 SkyWalking 是如何解决时间回拨问题的呢。

3c4f884bbd73df5d941bfd8e190f980c.png

每生成一个 id,都会记录一下生成 id 的时间(lastTimestamp),如果发现当前时间比上一次生成 id 的时间(lastTimestamp)还小,那说明发生了时间回拨,此时会生成一个随机数来作为 traceId。这里可能就有同学要较真了,可能会觉得生成的这个随机数也会和已生成的全局 id 重复,是否再加一层校验会好点。

这里要说一下系统设计上的方案取舍问题了,首先如果针对产生的这个随机数作唯一性校验无疑会多一层调用,会有一定的性能损耗,但其实时间回拨发生的概率很小(发生之后由于机器时间紊乱,业务会受到很大影响,所以机器时间的调整必然要慎之又慎),再加上生成的随机数重合的概率也很小,综合考虑这里确实没有必要再加一层全局惟一性校验。对于技术方案的选型,一定要避免过度设计,过犹不及。

请求量这么多,全部采集会不会影响性能?

如果对每个请求调用都采集,那毫无疑问数据量会非常大,但反过来想一下,是否真的有必要对每个请求都采集呢,其实没有必要,我们可以设置采样频率,只采样部分数据,SkyWalking 默认设置了 3 秒采样 3 次,其余请求不采样,如图示

d93b68f9a7d70194c78a1b604c67bc59.png

这样的采样频率其实足够我们分析组件的性能了,按 3 秒采样 3 次这样的频率来采样数据会有啥问题呢。理想情况下,每个服务调用都在同一个时间点(如下图示)这样的话每次都在同一时间点采样确实没问题

97ac4b351ed7a00f087c9781aff2da21.png

但在生产上,每次服务调用基本不可能都在同一时间点调用,因为期间有网络调用延时等,实际调用情况很可能是下图这样

3cfd8f740f9e94e8e5239a92a79741fc.png

这样的话就会导致某些调用在服务 A 上被采样了,在服务 B,C 上不被采样,也就没法分析调用链的性能,那么 SkyWalking 是如何解决的呢。

它是这样解决的:如果上游有携带 Context 过来(说明上游采样了),则下游强制 采集数据。这样可以保证链路完整。

SkyWalking 的基础架构

SkyWalking 的基础如下架构,可以说几乎所有的的分布式调用都是由以下几个组件组成的

c0b9763fae7d87a059e4d9cde893991c.png

首先当然是节点数据的定时采样,采样后将数据定时上报,将其存储到 ES, MySQL 等持久化层,有了数据自然而然可根据数据做可视化分析。

SkyWalking 的性能如何

接下来大家肯定比较关心 SkyWalking 的性能,那我们来看下官方的测评数据

51465310f9e4f127310649672191abc4.png

图中蓝色代表未使用 SkyWalking 的表现,橙色代表使用了 SkyWalking 的表现,以上是在 TPS 为 5000 的情况下测出的数据,可以看出,不论是 CPU,内存,还是响应时间,使用 SkyWalking 带来的性能损耗几乎可以忽略不计。

接下来我们再来看 SkyWalking 与另一款业界比较知名的分布式追踪工具 Zipkin, Pinpoint 的对比(在采样率为 1 秒 1 个,线程数 500,请求总数为 5000 的情况下做的对比),可以看到在关键的响应时间上, Zipkin(117ms),PinPoint(201ms)远逊色 于 SkyWalking(22ms)!28e33a25b2babce9db2370cfd384a2de.png

从性能损耗这个指标上看,SkyWalking 完胜!

再看下另一个指标:对代码的侵入性如何,ZipKin 是需要在应用程序中埋点的,对代码的侵入强,而 SkyWalking 采用 javaagent + 插件化这种修改字节码的方式可以做到对代码无任何侵入 ,除了性能和对代码的侵入性上 SkyWaking 表现不错外,它还有以下优势几个优势

  • 对多语言的支持,组件丰富:目前其支持 Java, .Net Core, PHP, NodeJS, Golang, LUA 语言,组件上也支持dubbo, mysql 等常见组件,大部分能满足我们的需求。

  • 扩展性:对于不满足的插件,我们按照 SkyWalking 的规则手动写一个即可,新实现的插件对代码无入侵。

我司在分布式调用链上的实践

SkyWalking 在我司的应用架构

由上文可知 SkyWalking 有很多优点,那么是不是我们用了它的全部组件了呢,其实不然,来看下其在我司的应用架构

186f8ffe6f85987367def8e057292d08.jpeg

从图中可以看出我们只采用了 SkyWalking 的 agent 来进行采样,放弃了另外的「数据上报及分析」,「数据存储」,「数据可视化」三大组件,那为啥不直接采用 SkyWalking 的整套解决方案呢,因为在接入 SkyWalking 之前我们的 Marvin 监控生态体系已经相对比较完善了,如果把其整个替换成  SkyWalking,一来没有必要,Marvin 在大多数场景下都能满足我们的需求,二来系统替换成本高,三来如果重新接入用户学习成本很高。

这也给我们一个启示:任何产品抢占先机很重要,后续产品的替换成本会很高,抢占先机,也就是抢占了用户的心智,这就像微信虽然 UI,功能上制作精良,但在国外照样干不过 Whatsapp 一样,因为先机已经没了。

从另一方面来看,对架构来说,没有最好的,最有最合适的,结合当前业务场景去平衡折中才是架构设计的本质

我司对 SkyWalking 作了哪些改造和实践

我司主要作了以下改造和实践

  1. 预发环境由于调试需要强制采样

  2. 实现更细粒度的采样?

  3. 日志中嵌入traceId

  4. 自研实现了 SkyWalking 插件

预发环境由于调试需要强制采样

从上文分析可知 Collector 是在后台定时采样的,这不挺好的吗,为啥要实现强制采样呢。还是为了排查定位问题,有时线上出现问题,我们希望在预发上能重现,希望能看到这个请求的完整调用链,所以在预发上实现强制采样很有必要。所以我们对 Skywalking 的 dubbo 插件进行了改造,实现强制采样

我们在请求的 Cookie 上带上一个类似 force_flag = true 这样的键值对来表示我们希望强制采样,在网关收到这个 Cookie 后,就会在 dubbo 的 attachment 里带上force_flag = true 这个键值对,然后 skywalking 的 dubbo 插件就可以据此来判断是否是强制采样了,如果有这个值即强制采样,如果没有这个值,则走正常的定时采样。

59c72156d6b0868677243f1b41d464be.png
实现更细粒度的采样?

哈叫更细粒度的采样。先来看下 skywalking 默认的采样方式 ,即统一采样

69e8b80c18dd13c1b2ab3fc307e2c95e.png我们知道这种方式默认是 3 秒采样前 3 次,其他请求都丢弃,这样的话有个问题,假设在这台机器上在 3 秒内有多个 dubbo,mysql,redis 调用,但在如果前三次都是 dubbo 调用的话,其他像 mysql, redis 等调用就采样不到了,所以我们对 skywalking 进行了改造,实现了分组采样,如下

c552bdba6e0e838b5733f9a0caa1bf72.png

就是说 3 秒内进行 3 次 redis, dubbo, mysql 等的采样,也就避免了此问题

日志中如何嵌入traceId?

输出日志中嵌入 traceId 便于我们排查问题,所以打出出 traceId 非常有必要,该怎么在日志中嵌入 traceId 呢?我们用的是 log4j,这里就要了解一下 log4j 的插件机制了,log4j 允许我们自定义插件来输出日志的格式,首先我们需要定义日志的格式,在自定义的日志格式中嵌入 %traceId, 作为占位符,如下

782c1f9afc29c02e14b221fbb269e65f.png

然后我们再实现一个 log4j 的插件,如下

3be929b9ef7a160c99179df4dd711996.png首先 log4j 的插件要定义一个类,这个类要继承 LogEventPatternConverter 这个类,并且用标准 Plugin 将其自身声明为 Plugin,通过 @ConverterKeys 这个注解指定了要替换的占位符,然后在 format 方法里将其替换掉。这样在日志中就会出现我们想要的 TraceId ,如下

bc298ca8aa8c70ff9dc9e338f3c1e88e.jpeg
我司自研了哪些 skywalking 插件

SkyWalking 实现了很多插件,不过未提供 memcached 和 druid 的插件,所以我们根据其规范自研了这两者的插件

4497514857c60e0748a22aee5016fddb.png

插件如何实现呢,可以看到它主要由三个部分组成

  1. 插件定义类: 指定插件的定义类,最终会根据这里的定义类打包生成 plugin

  2. Instrumentation: 指定切面,切点,要对哪个类的哪个方法进行增强

  3. Interceptor,指定步骤 2 中要在方法的前置,后置还是异常中写增强逻辑

可能大家看了还是不懂,那我们以 dubbo plugin 来简单讲解一下,我们知道在 dubbo 服务中,每个请求从 netty 接收到消息,递交给业务线程池处理开始,到真正调用到业务方法结束,中间经过了十几个 Filter 的处理

2ff8d6b967be08619dd35ca10211ab0b.png

而 MonitorFilter 可以拦截所有客户端发出请求或者服务端处理请求,所以我们可以对 MonitorFilter 作增强,在其调用 invoke 方法前,将全局 traceId  注入到其 Invocation 的 attachment 中,这样就可以确保在请求到达真正的业务逻辑前就已经存在全局 traceId。

所以显然我们需要在插件中指定我们要增强的类(MonitorFilter),对其方法(invoke)做增强,要对这个方法做哪些增强呢,这就是拦截器(Inteceptor)要做的事,来看看 Dubbo 插件中的 instrumentation(DubboInstrumentation)

11cac06636ee7a7e88e91f44c6680862.png

我们再看看下代码中描写的拦截器(Inteceptor)干了什么事,以下列出关键步骤

a65985e880476c92586f0f15729abe00.png

首先 beforeMethod 代表在执行 MonitorFilter 的 invoke 方法前会调用这里的方法,与之对应的是 afterMethod,代表在执行 invoke 方法后作增强逻辑。

其次我们从第 2,3点可以看到,不管是 consumer 还是 provider, 都对其全局 ID 作了相应处理,这样确保到达真正的业务层的时候保证有了此全局 traceid,定义好 Instrumentation 和 Interceptor 后,最后一步就是在 skywalking.def 里指定定义的类

// skywalking-plugin.def 文件
dubbo=org.apache.skywalking.apm.plugin.asf.dubbo.DubboInstrumentation

这样打包出来的插件就会对 MonitorFilter 的  invoke 方法进行增强,在 invoke 方法执行前对期 attachment 作注入全局 traceId 等操作,这一切都是静默的,对代码无侵入 的。

总结

本文由浅入深地介绍了分布式追踪系统的原理,相信大家对其作用及工作机制有了比较深的理解,特别需要注意的是,引入某项技巧,一定要结合现有的技术架构作出最合理的选择,就像 SkyWalking 有四个模块,我司只采用其 agent 采样功能一样,没有最好的技术,只有最合适的技术 ,通过此文,相信大家应该对 SkyWalking 的实现机制有了比较清晰的认识,文中只是介绍了一下 SkyWalking 的插件实现方式,不过其毕竟是工业级软件,要了解其博大精深,还要多读源码哦。



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

8ac7e9e888ebc72c47ca13c054c9a40f.png

已在知识星球更新源码解析如下:

df54bda7b377d81d229839a0f5925cf7.jpeg

ac6bbbf0f277f733da7cbae0a5455c55.jpeg

6a45bed918b15f6a7ed4346437a38c97.jpeg

64efda60a8f4dab6b7901b17db013ff4.jpeg

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
SpringBoot集成Skywalking分布式服务调用链路追踪 阅读详情

相关推荐

专为云原生、微服务架构而设计的链路追踪工具 【SkyWalking介绍及搭建】

服务链路追踪已成为不可或缺的一环skywalking就介绍到这里,本章节仅仅只是入门,简单使用skywalking,实际上里面还有很多功能没有介绍,有兴趣的同学可以按照上面的教程安装部署,然后自己探索一下。在现在微服务架构比较流行的环境下,如果没有一个调用链追踪框架,会导致很难排查线上服务调用的问题。skywalking是目前发展势头最快的技术框架的技术框架,因为对代码是无侵入性的,所以目前很多公司都采用skywalking。httpshttpshttpshttpshttpshttps。...

m0_67402236的博客 1094

企业级监控项目Skywalking详细介绍,来看看呀

一个优秀的项目,除了具有高拓展的架构、高性能的方案、高质量的代码之外,还应该在上线后具备多角度的监控功能。现在企业中的监控服务也有很多,Skywalking除了提供多维度、多粒度的监控之外,也提供了良好的图形化界面以及性能剖析、服务报警等多种功能,备受很多企业的青睐。因此侯哥今天给大家通过一篇文章,来详细地给大家介绍Skywalking。1.1 什么是Skywalking?Skywalking是一款分布式的系统性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。

一一哥 3万+

5分钟搞懂五大链路追踪工具:Zipkin、Pinpoint、SkyWalking、CAT和Jaeger怎么选

本文深入对比了五大分布式追踪工具Zipkin、Pinpoint、SkyWalking、CAT和Jaeger的核心差异与选型逻辑。从架构原理、多语言支持、监控维度、性能影响到场景化选择,帮助开发者在微服务架构中快速定位最适合的链路追踪方案,提升系统可观测性与故障排查效率。

weixin_29228781的博客 330

让我们来一步一步地探索Skywalking

系统拆分微服务后,为了便于监控理解系统的行为,微服务之间的调用链监控是必不可少的。提到调用链监控,Skywalking又是不得不提的,本文是我对Skywalking初步调研后的内容整理,包括Skywalking的系统架构、性能影响、Agent集成部署等内容。希望能够对初次接触Skywalking的同学有所帮助。 1 Skywalking初探 之前写过一篇文章介绍了软件选型的一些内容,对于新技术的调研选型,个人主要关注系统架构、文档完善度、社区活跃度、功能特性是否符合需求及其他一些内容,今天也照着这个步骤来调

sslulu520的博客 725

G1 GC核心原理与生产环境调优实战指南

垃圾回收(GC)是Java虚拟机(JVM)内存管理的核心机制,其核心目标是在自动回收无用对象内存的同时,尽量减少对应用线程的停顿影响。G1(Garbage-First)垃圾回收器作为JDK 9及以后的默认回收器,其设计原理在于将堆内存划分为多个独立区域(Region),并优先回收垃圾最多的区域,从而实现对停顿时间的可预测控制。这项技术的核心价值在于能够更好地平衡高吞吐量与低延迟需求,尤其适用于大内存、多核处理器的现代应用场景,如微服务、大数据处理等。理解其关键机制,如并发标记、混合回收(Mixed GC)以

weixin_30394981的博客 413

JMeter吞吐量控制器:精准模拟用户行为比例的性能测试实战

在性能测试与压力测试中,精准模拟真实用户行为比例是构建有效测试场景的核心。JMeter作为广泛使用的负载测试工具,其吞吐量控制器组件正是实现这一目标的关键。它通过权重分配机制,允许测试工程师定义不同业务操作(如浏览、搜索、下单)在并发流量中的执行概率,从而构建出贴近生产环境的用户行为模型。理解其百分比模式与总吞吐量模式的工作原理,并结合定时器、事务控制器等元件,能够设计出既符合业务逻辑又安全的混合流量场景。本文以电商系统为例,深入解析如何配置吞吐量控制器来模拟浏览、搜索、加购、支付等典型用户行为的精确比例,

蓝色妖姬 346

搞懂SkyWalking(40张图)

从图中可以看出我们只采用了 SkyWalking 的 agent 来进行采样,放弃了另外的「数据上报及分析」,「数据存储」,「数据可视化」三大组件,那为啥不直接采用 SkyWalking 的整套解决方案呢,因为在接入 SkyWalking 之前我们的 Marvin 监控生态体系已经相对比较完善了,如果把其整个替换成 SkyWalking,一来没有必要,Marvin 在大多数场景下都能满足我们的需求,二来系统替换成本高,三来如果重新接入用户学习成本很高。对于技术方案的选型,一定要避免过度设计,过犹不及。

zhangjunli的博客 3117

初创公司云迁移的三大障碍:技术、组织与战略断层

云迁移对初创企业而言,远不止是基础设施替换,而是涉及架构演进、成本治理与组织协同的系统性工程。其核心在于理解云原生的本质——以自动化、可观测性与按需弹性为特征的新型交付范式。当团队陷入Kubernetes学习困境、IAM权限僵局或云账单失控时,问题往往不在工具本身,而在于缺乏基础设施即代码(IaC)、成本可视化与架构决策记录(ADR)等基础能力。这些能力共同构成云健康度的底层支撑,直接影响MVP上线效率、故障响应速度与融资阶段的技术可信度。本文聚焦startup在cloud journey中高频遭遇的obs

weixin_34337381的博客 424

这40 张图帮你搞懂分布式追踪

这40 张图帮你搞懂分布式追踪

770

【微服务】分布式如何利用Skywalking实现链路追踪与监控?

整个分布式追踪的目的是什么?是为了让我们最终在页面上、UI上、和数据上能够复现这个过程。我们要拿到整个完整的链路,包括精确的响应时间,访问的方法、访问的 circle,访问的 Redis 的 key等,这些是我们在做分布式追踪的时候需要展现的一个完整的信息。

热爱技术,享受生活 1799

Unity与IOS交互,调用IOS系统相机和相册

与IOS的交互,在步骤上要比android简单许多,不会产生因为系统版本,或者包名导致的许多问题。过程中最头疼的一个问题是IOS回调Unity,很简单的一个问题,搞了半天。

Hello Mingo 1万+

40 张图搞懂分布式日志追踪,强大的traceId

???? 这是一个或许对你有用的社群???? 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料:《项目实战(视频)》:从书中学,往事上“练”《互联网高频面试题》:面朝简历学习,春暖花开《架构 x 系统设计》:摧枯拉朽,掌控面试高频场景题《精进 Java 学习指南》:系统学习,互联网主流技术栈《必读 Java 源码专栏》:知其然,知其所以然????这是一个或许...

芋艿V 629

零成本矩阵玩法:1人运营5个账号的自动化工具链配置(2025全平台实战)

通过“AI内容生产+工具链分发+自动化变现”的组合拳,即使是新手也能实现1人运营5个账号的规模化收益。关键在于选对工具与设计标准化流程。未来,矩阵运营的竞争将聚焦于工具使用效率与数据洞察深度,快人一步者方能抢占先机!

TuFuir的博客 3790

传递给系统调用的数据区域太小怎么解决_分布式追踪系统不懂?没事,搞懂这40张图,便懂了~...

哈喽,各位新来的小伙伴们,大家好!由于公众号做了改版,为了保证公众号的资源能准时推送到你手里,大家记得将咱们的公众号加星标置顶,在此真诚的表示感谢~正文如下:# 前言在微服务架构中,一次请求往往涉及到多个模块,多个中间件,多台机器的相互协作才能完成。这一系列调用请求中,有些是串行的,有些是并行的,那么如何确定这个请求背后调用了哪些应用,哪些模块,哪些节点及调用的先后顺序?如何定位每个...

weixin_39762348的博客 576

嵌入式定点PID控制器:mrm-pid极简实现与实时控制实践

PID控制器是自动控制领域的基础算法,其核心在于比例、积分、微分三环节的协同调节。在资源受限的嵌入式系统中,传统浮点PID易受时序抖动、内存分配不确定性及FPU依赖影响,难以满足毫秒级确定性响应需求。定点PID通过整数运算替代浮点计算,显著提升执行周期稳定性与跨平台兼容性,成为电机控制、传感器补偿等实时场景的关键技术路径。mrm-pid库以位置式结构、int32_t增益参数、int64_t积分累加器和无动态内存设计,实现了超低开销(12–28 CPU周期)与完全可审计的闭环内核,天然适配Cortex-M系列

weixin_31659095的博客 572

PAT|中国大学MOOC-浙江大学翁恺-C语言程序设计习题集(更新中)

##2-0. 整数四则运算 时间限制:400 ms 内存限制:65536 kB 代码长度限制:8000 B 判题程序:Standard 作者:乔林(清华大学) 本题要求编写程序,计算2个正整数的和、差、积、商并输出。题目保证输入和输出全部在整型范围内。 输入格式: 输入在一行中给出2个正整数A和B。 输出格式: 在4行中按照格式“A 运算符 B = 结果”顺序输出和、差、积、商。 输入样例: 3 ...

小鱼波波波 6万+

【微服务架构】链路追踪Skywalking入门与实践

https://www.jianshu.com/p/ffa7ddcda4ab博客 | Apache SkyWalkingGitHub - apache/skywalking: APM, Application Performance Monitoring System1、SkyWalking技术理论之全链路监控系统分析(Zipkin,Pinpoint,SkyWalking,CAT)_清云逸仙的博客-优快云博客_数据全链分析2、SkyWalking部署-Windows环境(SkyWalking Window

后端研发工程师Marion的博客 907

UNet改进(54):当医学图像分割遇上频域学习与自监督

本文提出了一种改进U-Net的方法,通过频域增强模块和代理任务模块提升医学图像分割性能。频域增强模块在傅里叶空间对特征图进行可学习的频率调制,重点增强高频细节特征;代理任务模块通过图像重建约束编码器保留关键信息。两个模块协同工作,在仅增加5%参数量的情况下,形成空间域、频域和重建约束三条互补的信息路径。该方法特别适用于需要精细边缘分割的医学图像任务,预期能提升5%-10%的边缘分割精度,在小样本场景效果更显著。部署时可移除代理任务模块,不影响推理效率。未来可探索空间自适应频域调制和更丰富的代理任务设计。

2501_91516851的博客 228

Java后端工程师求职指南:从技术栈梳理到简历优化与面试突破

最近几年,“Java已死”的论调时不时就会冒出来,尤其是在一些新兴语言快速发展的背景下。但现实是,Java后端开发岗位依然海量,薪资天花板也足够高。问题往往不在于语言本身,而在于求职者自身的技术栈与市场需求的错配。很多技术不错的开发者,简历投出去却石沉大海,面试屡屡碰壁,核心原因可能不是你的技术差,而是简历上缺少了那个能让面试官眼前一亮的“关键项”。 这篇文章不聊虚的,直接聚焦Java后端工程师在跳槽、涨薪、求职面试中最核心的竞争力是什么。我们会拆解从初级到高级,再到架构师,每个阶段简历上必须体现的关键技术

weixin_33924220的博客 360

【RT-DETR涨点改进】损失函数改进篇 | RT-DETR引入SlideLoss损失函数,适合目标检测中面临的尺度变化、遮挡以及难易样本不平衡等复杂场景下的检测任务,含详细使用步骤

本文提出在RT-DETR目标检测模型中引入SlideLoss损失函数,以解决尺度变化、遮挡和难易样本不平衡等问题。SlideLoss通过自适应阈值划分正负样本,并对难样本赋予更高权重,使模型更关注分类边界样本。文章详细展示了SlideLoss的核心代码实现,并逐步指导如何在RT-DETR框架中集成该损失函数。实验表明,该方法能有效提升模型性能,特别适用于复杂场景下的目标检测任务。

Ai缝合怪、助力小伙伴高效发论文 265

【信息系统项目管理师】第18章:项目绩效域详解

(3)度量绩效域与规划绩效域、项目工作绩效域和交付绩效域的相互作用:1规划构成了 交付和规划比较的基础;项目绩效域共同构成了一个统一的整体,作为一个完整系统,在项目生命周期过程中运行,系统内的每个绩效域相互作用、相互关联和相互依赖,并协调一致、共同运作,支撑项目目标和价值 的实现。(5)开发方法和生命周期绩效域与其他绩效域的相互作用:开发方法和生命周期绩效域与干系人绩效域、规划绩效域、不确定性绩效域、交付绩效域、项目工作绩效域和团队绩效域相互作用。(2)项目工作绩效域的绩效要点包括:项目过程;

数据知道的博客 7806

AI时代程序员不可替代的四大核心价值

在生成式AI深度融入软件开发流程的当下,'程序员是否会被取代'已让位于更本质的问题:哪些能力是AI无法模拟、不可替代的系统性能力?这涉及从模糊需求中精准定义问题的本质能力,对技术方案进行跨维度权衡的架构判断力,穿透多层耦合现象定位根因的系统归因能力,以及在效率与公平、功能与合规之间设置理性边界的伦理守护力。这些能力共同构成现代软件工程师的‘决策中枢’——不依赖语法记忆或代码生成速度,而根植于业务理解、系统思维与人文责任感。本文聚焦程序员在AI协同范式下的价值锚点,解析问题定义、架构权衡、故障归因与技术伦理四

culiao6493的博客 537

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

程序员成长路线图:5大层级20+核心能力

编程是一场马拉松,不是短跑。保持好奇心,持续学习,享受解决问题的过程。

热爱技术与前沿创新,深耕科技领域,在科创中精进自我;探索技术乐趣,分享技术干货与成长心得,以技术为伴,热爱生活,在科创与生活中双向成长。 304

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Ai-Agent学习历程—— 阶段3——RAG 与记忆机制

基于学习大纲我们有了一个简单的地图,从官网的资料进行对应,主要是以下三部分过程中可以进行参考官方文档,但有一些可能会基于目前最新的资料进行适当的更改,让我们愉快的开始吧!这里为您梳理第一节:ETL 数据智能清洗与高阶分块的学习地图。本节将带您攻克数据进入向量数据库之前的“清洗、结构化解析、智能切分与父子文档关联”全流程,彻底打牢 RAG 的数据地基。以现在大模型的发展来说,200K的上下文甚至接近300K的都有,几本书是不成问题的,那切片的意义又在哪?核心原因有三个:在 RAG 系统中,用户提问后,我们不能

蓝桉 861

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

链路追踪工具 skywalking

链路追踪工具 skywalking 一、关于应用性能监控 APM(Application Performance Monitor) 对于单体应用,性能分析相对简单,不同的语言都提供了工具,在代码层面埋点,然后跑一个压力测试,最后以图形化的方式看到每个调用的耗时,以此来分析性能。 对于微服务系统,在解决了单个服务的性能之后,各个服务之间的调用链的性能分析就变的错综复杂,于是需要有链路追踪系统。 常见apm参考对比及工具选型 SkyWalking:中国人吴晟(华为)开源的一款分布式追踪,分析,告警的工具,现在是

猛犸象 2002
上一篇: 麻了!不要再动不动就用BeanUtil.copyProperties了!!
下一篇: 公司新入职一位大佬,把SpringBoot项目启动时间从7分钟降到了40秒!
公众号-芋道源码
博客等级 码龄10年 1636粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值