深入解析 Spring AI 系列:分析 Spring AI 可观测性
今天我们将讨论之前略过的可观测性部分的代码。在这里,我想简单说明一下,当时这部分代码属于必须编写的固定模板,因此在最初的讨论中我们直接跳过了它。虽然这部分代码乍看之下可能显得比较复杂,但实际上它的核心功能只是链路追踪的实现而已。既然如此,接下来我们就不再赘述,直接来看一下这部分关键代码,如图所示:

我们今天的目的也很明确,那就是不必过于纠结于其底层源码是如何运转和注入解析的。我们更关注的是这段代码在Spring AI框架中所发挥的实际作用。
micrometer
如果当时你点击了该引用,你是可以找到与之相关的包依赖信息的。如果你希望获取更多的详细信息,建议访问其官方文档,详细内容请见:https://docs.micrometer.io/micrometer/reference/observation.html
JMX观测
为了更清晰地理解micrometer的具体工作原理,今天我们将通过两个实际的例子带领大家快速了解其运作方式。第一个例子是关于许多Java编程开发者都非常熟悉的工具——jconsole。如果你不熟悉该工具,也不必担心,你可以直接前往jdk的bin目录进行查找,具体位置如图所示。

剩下的就需要在我们的demo聊天示例的项目依赖中添加相关依赖。代码如下:
<groupId>io.micrometer</groupId>
<artifactId>micrometer-observation</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-jmx</artifactId>
</dependency>
剩下的部分我们基本上不需要进行修改了。接下来,只需直接双击启动 jconsole 工具,并连接到我们的本地程序即可。然后,进入 MBean 标签页,我们就可以轻松地查看到相关的配置信息和监控数据。不过,需要注意的是,这些信息简洁明了并不够全面。具体情况可以参见下图所示:

在这里,我们并没有看到源码中所添加的那些特定 key 被纳入观测范围。如下所示:

所以目前,分布式链路追踪在系统监控和性能调优中得到了广泛应用。为了便于演示,我们简单地展示了轻量级的 Zipkin 进行链路追踪观测的基本功能。当然,除了 Zipkin,还可以选择使用其他工具,如 Prometheus 与 Grafana 的组合,或者更为全面的 SkyWalking 等方案
zipkin观测
在这里,我将直接在服务器上使用 Docker 容器进行运行。请确保在启动容器时,暴露出相关的端口,以便我们的 demo 程序能够通过这些端口与容器进行通信并上传信息。以下是具体的命令:
docker run --name zipkin -d -p 9411:9411 openzipkin/zipkin
然后需要添加部分依赖,如下所示:
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-observation</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing-bridge-brave</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.reporter2</groupId>
<artifactId>zipkin-reporter-brave</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
由于 Zipkin 在使用过程中需要配置一些关键的项目信息,例如指定我们的 Zipkin 服务器地址,以及其他相关的服务端点和连接参数,因此需要在配置文件中加入这些必要的信息。具体的项目信息配置如下:
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
management.zipkin.tracing.endpoint=http://ip:9411/api/v2/spans
management.tracing.sampling.probability=1.0
在正常启动我们的项目之后,可以执行一次接口调用,并直接访问 Zipkin 以查看当时的接口调用情况。通过这种方式,你将能够清晰地观察到与该接口调用相关的可观测性信息,包括所有的 key 和 value。具体的结果如图所示:

这部分看下即可,不做重要解析。
总结
通过今天的讨论,我们简单探讨了可观测性部分的代码及其在 Spring AI 框架中的实际作用。尽管底层实现可能显得复杂,但其核心功能无非是链路追踪的实现,帮助我们更好地理解和优化系统性能。通过实际示例,我们演示了如何利用工具如 jconsole 和 Zipkin 来观察系统的行为及性能指标。这些工具的使用能够提供清晰的监控数据,帮助开发者更有效地进行系统诊断和性能调优。在未来的工作中,合理运用这些工具将极大提升我们的可观测性实践。
我是努力的小雨,一个正经的 Java 东北服务端开发,整天琢磨着 AI 技术这块儿的奥秘。特爱跟人交流技术,喜欢把自己的心得和大家分享。还当上了腾讯云创作之星,阿里云专家博主,华为云云享专家,掘金优秀作者。各种征文、开源比赛的牌子也拿了。
想把我在技术路上走过的弯路和经验全都分享出来,给你们的学习和成长带来点启发,帮一把。
欢迎关注努力的小雨,咱一块儿进步!
深入解析 Spring AI 系列:分析 Spring AI 可观测性的更多相关文章
- Spring框架系列(2) - Spring简单例子引入Spring要点
上文中我们简单介绍了Spring和Spring Framework的组件,那么这些Spring Framework组件是如何配合工作的呢?本文主要承接上文,向你展示Spring Framework组件 ...
- Spring框架系列(6) - Spring IOC实现原理详解之IOC体系结构设计
在对IoC有了初步的认知后,我们开始对IOC的实现原理进行深入理解.本文将帮助你站在设计者的角度去看IOC最顶层的结构设计.@pdai Spring框架系列(6) - Spring IOC实现原理详解 ...
- Spring框架系列(7) - Spring IOC实现原理详解之IOC初始化流程
上文,我们看了IOC设计要点和设计结构:紧接着这篇,我们可以看下源码的实现了:Spring如何实现将资源配置(以xml配置为例)通过加载,解析,生成BeanDefination并注册到IoC容器中的. ...
- Spring框架系列(8) - Spring IOC实现原理详解之Bean实例化(生命周期,循环依赖等)
上文,我们看了IOC设计要点和设计结构:以及Spring如何实现将资源配置(以xml配置为例)通过加载,解析,生成BeanDefination并注册到IoC容器中的:容器中存放的是Bean的定义即Be ...
- Spring框架系列(9) - Spring AOP实现原理详解之AOP切面的实现
前文,我们分析了Spring IOC的初始化过程和Bean的生命周期等,而Spring AOP也是基于IOC的Bean加载来实现的.本文主要介绍Spring AOP原理解析的切面实现过程(将切面类的所 ...
- Spring框架系列(10) - Spring AOP实现原理详解之AOP代理的创建
上文我们介绍了Spring AOP原理解析的切面实现过程(将切面类的所有切面方法根据使用的注解生成对应Advice,并将Advice连同切入点匹配器和切面类等信息一并封装到Advisor).本文在此基 ...
- Spring框架系列(11) - Spring AOP实现原理详解之Cglib代理实现
我们在前文中已经介绍了SpringAOP的切面实现和创建动态代理的过程,那么动态代理是如何工作的呢?本文主要介绍Cglib动态代理的案例和SpringAOP实现的原理.@pdai Spring框架系列 ...
- Spring框架系列(12) - Spring AOP实现原理详解之JDK代理实现
上文我们学习了SpringAOP Cglib动态代理的实现,本文主要是SpringAOP JDK动态代理的案例和实现部分.@pdai Spring框架系列(12) - Spring AOP实现原理详解 ...
- 【spring boot 系列】spring data jpa 全面解析(实践 + 源码分析)
前言 本文将从示例.原理.应用3个方面介绍spring data jpa. 以下分析基于spring boot 2.0 + spring 5.0.4版本源码 概述 JPA是什么? JPA (Java ...
- Spring Boot系列(一) Spring Boot准备知识
本文是学习 Spring Boot 的一些准备知识. Spring Web MVC Spring Web MVC 的两个Context 如下图所示, 基于 Servlet 的 Spring Web M ...
随机推荐
- 内网 BitTorrent 下载环境搭建——基于 Transmission
背景 前段时间为公司的产品增加了磁力链.种子下载的能力,测试时发现网上搜到的热门种子,有时好用,有时不好用,不好用主要表现在:没速度.速度慢.速度不稳定.下载一部分后没速度等,严重拖累了测试工作.为此 ...
- 我对Java内存模型的理解
所有的编程语言中都有内存模型这个概念,区别于微架构的内存模型,高级语言的内存模型包括了编译器和微架构两部分.我试图了解了Java.C#和Go语言的内存模型,发现内容基本大同小异,只是这些语言在具体实现 ...
- golang之sync包
介绍sync包中常用的方法, - sync:提供基本的同步原语(比如Mutex.RWMutex.Locker)和 工具类(Once.WaitGroup.Cond.Pool.Map) - sync/at ...
- Ubuntu下xrdp登陆故障解决方案
故障描述: Ubuntu使用xrdp远程桌面运行一段时间后,出现登陆错误: xrdp_mm_process_login_response: login failed 原因分析: 远程桌面没有正确关闭所 ...
- DevEco Studio:状态管理与事件处理
DevEco Studio:状态管理与事件处理 引言 在现代前端开发中,状态管理和事件处理是构建交互式应用的核心.DevEco Studio,作为华为推出的开发环境,支持开发者使用TypeScript ...
- uni-app小程序(快手、抖音)getCurrentPages使用坑位记录
前情 uni-app是我比较喜欢的跨平台框架,它能开发小程序/H5/APP(安卓/iOS),重要的是对前端开发友好,自带的IDE让开发体验也挺棒的,公司项目就是主推uni-app. 坑位 最近在做一个 ...
- 硬盘空间消失之谜:Linux 服务器存储排查与优化全过程
前言 最近线上服务经常出现一些奇奇怪怪的问题,比如网页上的静态资源加载不出来,或者请求后端莫名报错,又或者 Redis 报错- 当我 SSH 登录到服务器上时,更不对劲了,敲个命令都卡顿- 如果是以前 ...
- Jetpack Compose学习(15)——Pager组件的使用(对标ViewPager)
原文地址: Jetpack Compose学习(15)--Pager组件的使用(对标ViewPager)-Stars-One的杂货小窝 从名字可以看出,Pager这个就是ViewPager的替代产物 ...
- 11C++循环结构-for循环(1)——教学
一.for语句 (第27课 老狼老狼几点钟)参考1 引出问题: 当需要重复执行某一语句时,使用for语句.for语句最常用的格式为: for (循环变量赋初值:循环条件:循环变量增值) 语句: 注: ...
- 中电金信鲸视:以AI视觉技术为复杂行业场景装上“火眼金睛”
作为人工智能和计算机视觉的交叉领域,智能视觉通过仿生人类视觉机能,对不同形式的视觉输入进行处理.理解和决策.现今,智能视觉已成为应用广泛.市场覆盖大.形式多样的产业方向,得到了国家政策的大力支持. ...