Apache Dubbo 云原生可观测性的探索与实践
作者:宋小生 - 平安壹钱包中间件资深工程师
Dubbo3 可观测能力速览
Apache Dubbo3 在云原生可观测性方面完成重磅升级,使用 Dubbo3 最新版本,你只需要引入 dubbo-spring-boot-observability-starter 依赖,微服务集群即原生具备以下能力:
能力一:可视化查看集群、单机流量指标与健康状态
Dubbo 3.2 最新版本支持以应用、单机、单条服务等多种不同粒度观测运行状态,包括 qps、rt、线程池、错误分类统计等。

能力二:全链路追踪
Dubbo 3.2 最新版本通过内置链路过滤器在 RPC 请求中对链路数据进行采集,采集之后通过导出器将链路数据导出到各大厂商。

https://cn.dubbo.apache.org/zh-cn/overview/tasks/observability/
云原生可观测性的探索
云原生升级的挑战
高质量交付的前一部分有 DevOps 保证开发与测试的质量与效率,后有云原生保证运维部署效率与质量,但是大规模快速迭代意味着频繁变更,变更与系统运行带来的稳定性问题不能被忽视,比如宕机,网络与系统异常等,很多未知的问题难以避免,借助可观测系统来及时感知问题、高效分析异常、快速恢复系统,提前规避已知问题,深度挖掘未知问题,高效提升运维质量,可以看到建设一个完善的可观测平台对于发现已知和未知异常,提升系统的稳定性是非常必要的。

Dubbo 可观测建设目标
Dubbo 作为微服务 RPC 基础框架直接建设大而全的可观测系统与定位不符合也不是很现实,但是可以从自身出发提供更多的基础监控数据来为企业建立可观测系统提供助力,可观测性与传统单维度监控不同,更关注的是数据的关联性,通过单维度和多维度角度整体观测和分析问题,首先从流行的三大支柱指标出发,在此基础之上,Dubbo 提供多维度聚合与非聚合指标帮助用户快速发现问题与诊断问题,多维指标中进而可以通过应用、主机等标签信息关联到链路系统,链路系统提供了服务请求级别的链路性能与异常问题分析功能,Dubbo 通过提供链路门面对接各大全链路厂商,链路分析之后可以通过链路数据例如:TraceId,SpanId 自定义数据等来追踪到详细日志,详情日志中 Dubbo 侧提供了丰富的专家建议与错误码供开发与运维同学快速诊断与定位问题。

Dubbo 多维度指标体系
Dubbo 多维度指标体系建设中从纵向和横向两个角度来看,纵向 Dubbo 侧提供简易接入的门面外观,然后将系统中采集到的指标存储在内存指标容器中,接着根据指标类型决定是否进行聚合计算,最后将指标导出到不同的指标系统。从横向角度来看采集维度也覆盖到容易出问题的 RPC 请求链路,三大中心交互与线程资源使用情况等场景。

Dubbo 多维度指标体系采集哪些指标?
前面介绍了大面上的指标采集,但是 Dubbo 应该采集哪些详细的指标呢?接下来可以看到 Dubob 采集指标时参考的一些方法论。
根据谷歌 SRE 书:Google 针对大量分布式监控的经验总结提出 4 个黄金指标(延迟、流量、错误以及饱和度)可以在服务级别帮助衡量终端用户体验、服务中断、业务影响等层面的问题。

RED 方法(来自 Tom Wilkie),RED 方法则关注请求、实际工作以及外部视角(即来自服务消费方的视角)包含:速率、错误与持续时间。

USE 方法(来自 Brendan Gregg):USE 方法主要着眼于资源内部,包含:利用率、饱和度与错误。

Dubbo 多维度指标体系接入-导出到 QOS
多维度指标体系在 3.2 之后的版本已经发布与持续迭代中,对用户来说只需要引入一个依赖即可:
<dependency><groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-observability-starter</artifactId> <version>3.2.x</version>
</dependency>
依赖引入之后默认情况下一些关键指标会默认被打开,只需要在命令行访问当前服务 22222 服务端口和 metrics 路径即可获取到指标数据,其中 22222 端口是 Dubbo 提供的服务质量,健康管理端口可以用过 QOS 配置进行修改。

查询到的 Dubbo 指标以命名:dubbo_type_action_unit_otherfun 的格式进行展现。
当然也会有用户直接使用 SpringBoot 管理端口的情况,针对这种场景 Dubbo 侧已经做了自动适配直接使用 SpringBoot 导出普罗米修斯格式的指标数据即可,如下配置所示:

在访问 SpringBoot 管理端口查询指标数据时就可以看到 SpringBoot 内置的一些指标和 Dubbo 提供的一些指标一起展示给用户了。

Dubbo 多维度指标体系 Prometheus 查询
前面直接通过 curl 命令访问指标服务获取到的只是瞬时的指标数据,对于指标数据我们往往更需要的是时序化的向量数据,这时候就要借助普罗米修斯来进行在外部采集,存储 Dubbo 指标,对于传统应用部署在物理机和虚拟机的服务可以使用静态,基于文件或者基于自有 CMDB 系统建设的指标发现服务,当然后续也可以使用 Dubbo Admin 为指标系统提供的服务发现服务,对于部署在 K8s 中的系统来说可以直接借助 K8s 支持的服务发现,接入 Prometheus 自动采集配置如下:

普罗米修斯中查询指标如下所示:

Dubbo 多维度指标体系 Grafana 展示
普罗米修斯侧重于采集指标和存储指标等场景,在展示指标这里相对简陋,Grafana 提供了丰富的指标面板,使用 Grafana 来建立指标大盘更直观,也更容易,可以看到下面的图片中提供了多维度的筛选如应用级、实例级,接口级等场景对服务数据进行查询。在指标监控大盘中也可以看到基于前面指标方法论的一些维度指标,比如流量、请求数、延迟、错误,饱和度等。另外也可以看到一些应用于实例信息比如 Dubbo 版本分布,实例分布等。

Dubbo 链路追踪门面建设
Agent 用户接入简单,但是动态修改字节码的形式来提供支持,风险较大,一个代理层 agent 只做一个 Dubbo 层的链路功能似乎有点大材小用,Dubbo 定位为微服务 RPC 框架,做通用的链路门面相对更好一些,专业的事情交给专业的人做,Dubbo 通过适配各大全链路系统来让用户接入更简单。

Dubbo 链路追踪门面选型
业界比较通用的 OpenTelemetry 链路追踪门面更倾向于标准统一的规范,支持各大厂商,同时也是与 CNCF 孵化的项目,Micrometer 的优势在于与指标埋点所用依赖来源相同,并且在 SpringBoot3 中也默认集成用户接入更为方便,另外 Micrometer 定位为可观测门面与 Dubbo 链路系统建设的定位相符,其中也可以通过桥接的形式来桥接 OpenTelemetry。

Micrometer + OpenTelemetry Bridge:

Dubbo 链路追踪结构
Dubbo 通过内置链路过滤器在 RPC 请求中对链路数据进行采集,采集之后通过导出器将链路数据导出到各大厂商。

Dubbo 链路追踪接入
Dubob 链路追踪门面已经发布,需要接入链路追踪系统只需要简单的引入对应链路追踪的 starter 集成包然后进行单件的配置即可,更详细的接入手册可以参考文档和案例。 [ 1]

在链路追踪配置中可以配置开关,采样率,导出器等配置。

最后链路追踪系统往往也需要通过链路 id 与日志进行关联来分析更详细的根因,这个时候就需要提前在日志配置中增加日志 MDC 打印的配置了,如下 traceId 和 spanId 的获取。

Dubbo 链路追踪 Zipkin
这里是 Dubbo 接入链路追踪 Zipkin 的展示,可以看到一些接口的性能与元数据。

Dubbo 链路追踪 Skywalking
这里是 Dubbo 接入链路追踪 Skywalking 的展示,通过链路 id 检索到的请求级别的链路分析。

Dubbo 日志管理
Dubbo 日志管理异常
Dubbo 框架发展多年,功能越来越丰富, 其中包含了与三大中心的交互,客户端服务端的交互,这种内外部交互的场景更容易出现一些异常,如果遇到问题通过通过观察日志经常摸不着头脑,最后通过分析代码来定位根因又是相对头疼的事情。

遇到问题不知道原因:

Dubbo 日志管理专家建议
如果仔细观察 Dubbo3.x 新版本打印出的日志就可以看到日志中会打印一个问题帮助手册,当发现问题时候复制此链接在浏览器中打开就可以看到出现异常日志时候的专家建议,比如下图所示的问题原因排查步骤,随着 Dubbo 的发展专家建议也会越来越详细,当让这个过程要建设的更为完善就需要用户、开发者一起参与进来,Dubbo 社区非常 Open,鼓励用户、开发者一起参与进来进行建设。


Dubbo 可观测性-稳定性实践
最后就是围绕整个可观测平台来做稳定性实践了,稳定性实践中通过观测服务健康状况、排查分析系统问题、最后快速恢复系统。其中观测系统异常的情况可以通过值班人员主动观测监控大盘,也可以将异常分析告警,被动接收到告警邮件、IM、短信、电话等来及时发现问题,发现异常时可以借助指标来分析聚合与非聚合的服务信息来定位异常位置,然后通过链路追踪系统找到服务级别的异常进行分析,最后也可以根据链路信息找到详细的日志来分析异常上下文排除根因,排查的过程要借助整个观测平台以快速恢复系统为目标通过流量隔离,服务降级等策略恢复系统减少损失,事后可以借助可观测平台提供的这些持久化的信息来详细分析异常与规律来定位根因。

[1] 文档和案例
https://cn.dubbo.apache.org/zh-cn/overview/tasks/observability/tracing/
相关文章:
Apache Dubbo 云原生可观测性的探索与实践
作者:宋小生 - 平安壹钱包中间件资深工程师 Dubbo3 可观测能力速览 Apache Dubbo3 在云原生可观测性方面完成重磅升级,使用 Dubbo3 最新版本,你只需要引入 dubbo-spring-boot-observability-starter 依赖,微服务集群即原生具备以…...
DaVinci Resolve Studio 18 for Mac 达芬奇调色
DaVinci Resolve Studio 18是一款专业的视频编辑和调色软件,适用于电影、电视节目、广告等各种视觉媒体的制作。它具有完整的后期制作功能,包括剪辑、调色、特效、音频处理等。 以下是DaVinci Resolve Studio 18的主要特点: - 提供了全面的视…...
Excelize Go语言操作 Office Excel文档基础库
Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Microsoft Excel™ 2007 及以上版本创建的电子表格文档。支持 XLAM / XLSM / XLSX / XLTM / XLTX 等多种文档格式…...
SpringBoot、Java 使用 Jsoup 解析 HTML 页面
使用 Jsoup 解析 HTML 页面 什么是 Jsoup? Jsoup 是一个用于处理 HTML 页面的 Java 库,它提供了简单的 API,使得从 HTML 中提取数据变得非常容易。无论是获取特定标签的内容还是遍历整个页面的元素,Jsoup 都能轻松胜任。 如何使…...
C# 随心记
#region 批量保存到数据库 public bool InsertDB(DataTable dt) { bool bResult true; LogInfo.WriteTextToFile("使用Bulk插入的实现方式"); Stopwatch sw new Stopwatch(); using (SqlConnecti…...
华为OD机试-字符串分割
题目描述 给定一个非空字符串S,其被N个‘-’分隔成N1的子串,给定正整数K,要求除第一个子串外,其余的子串每K个字符组成新的子串,并用‘-’分隔。对于新组成的每一个子串,如果它含有的小写字母比大写字母多…...
element-ui的el-dialog,简单的封装。
el-dialog是使用率很高的组件 使用el-dialog很多都是按照文档的例子,用一个变量控制是否显示,再来一个变量控制标题。 如果我这个对话框多个地方使用的话还要创建多个变量,甚至关闭之后还要清空一些变量,应该可以简化一点。我写…...
SpringBoot引入外部jar打包失败解决,SpringBoot手动引入jar打包war后报错问题
前言 使用外部手动添加的jar到项目,打包时出现jar找不到问题解决 处理 例如项目结构如下 引入方式换成这种 <!-- 除了一下这两种引入外部jar,还是可以将外部jar包添加到maven中(百度查)--><!-- pdf转word --><…...
HTTP基础:学习HTTP协议的基本知识,了解请求和响应的过程
HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种用于传输超媒体文档(如HTML)的应用层协议,它是Web中最基本的协议。 HTTP请求和响应都是由客户端和服务器之间进行的。 一个完整的HTTP请求由以下几…...
Spark基础-任务提交相关参数
整理一下用过的spark相关的参数 spark应用提交命令spark-submit的常用参数(使用spark-submit --help可以查看所有参数, 有一些参数在下面的spark配置属性定义了,也没有额外列出) 参数默认值含义--master local[*]spark集群的mast…...
ROS-PyQt小案例
前言:目前还在学习ROS无人机框架中,,, 更多更新文章详见我的个人博客主页【前往】 ROS与PyQt5结合的小demo,用于学习如何设计一个界面,并与ROS中的Service和Topic结合,从而控制多个小乌龟的运动…...
【算法】双指针——leetcode盛最多水的容器、剑指Offer57和为s的两个数字
盛水最多的容器 (1)暴力解法 算法思路:我们枚举出所有的容器大小,取最大值即可。 容器容积的计算方式: 设两指针 i , j ,分别指向水槽板的最左端以及最右端,此时容器的宽度为 j - i 。由于容器…...
idea 使用debug 启动项目的时候 出现 Method breakpoints may dramatically slow down debugging
问题: 1. 写了一段时间的代码,在debug启动项目后提示:Method breakpoints may dramatically slow down debugging 但是正常启动是可以的,debug不行。 2. idea 里面的项目,很多地方都有断点,现在想要取消全部的断点…...
Tomcat的一些配置问题(server.xml/catalina.sh)
在同一机器中运行多个Tomcat时,如果不修改server.xml的端口参数,会出现端口冲突使得Tomcat异常;Tomcat默认配置中,JAVA_OPTS不会设置太大,一般需要在catalina.sh中增加一行配置来加大该参数值。 目录 1.Server.xml配置…...
飞天使-jenkins进行远程linux机器修改某个文件的思路
文章目录 jenkins配置的方式jenkins中执行shell的思路 jenkins配置的方式 jenkins中执行shell的思路 下面的脚本别照抄,只是一个思路 ipall"$ips"# 将文本参数按行输出为变量 while IFS read -r line; doecho "$line" if [[ ! -z $line ]] &…...
Revit SDK 介绍:PanelSchedule 配电盘明细表
前言 这个例子介绍 Revit 的配电盘明细表,PanelSchedule。Revit 的电器专业在国内用的并不是十分广泛,但从功能上来说还是比较完整的。 内容 这个例子里有三个命令: PanelScheduleExport - 导出配电盘明细表InstanceViewCreation - 创建配…...
Java后端实现不用pagehelper。手写分页如何实现?
Java后端实现不用pagehelper。手写分页如何实现? 如果你不使用PageHelper这样的分页插件,你可以手动实现分页逻辑。下面是一个使用Java后端手写分页的示例: 首先,确定每页显示的数据量和当前页码。 int pageSize 10; // 每页显示的数据量…...
spring 缓存
1.spring缓存注解,可以丢在controller,也可以丢在service,也可以丢在mapper。 2.手动操作缓存使用: Autowiredprivate CacheManager cacheManager;3.添加缓存 //添加缓存 Override Cacheable(cacheNames "test", key…...
vue3.0 element-plus 不同版本 el-popover 循环优化
表格内循环el-popover 渲染以后的页面,数据量很大的时候页面会卡,生成的代码: 解决思路:将el-popover提出来,不参与循环,让el-popover只渲染一次 1、以1.1.0-beta.24版为例(低版本)…...
计算机网络实验4:HTTP、DNS协议分析
文章目录 1. 主要教学内容2. HTTP协议3. HTTP分析实验【实验目的】【实验原理】【实验内容】【实验思考】 4. HTTP分析实验可能遇到的问题4.1 捕捉不到http报文4.2 百度是使用HTTPS协议进行传输4.3 Wireshark获得数据太多如何筛选4.4 http报文字段含义不清楚General(…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
高分辨率图像合成归一化流扩展
大家读完觉得有帮助记得关注和点赞!!! 1 摘要 我们提出了STARFlow,一种基于归一化流的可扩展生成模型,它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流(TARFlow&am…...
