Dubbo 可观测性实践之 Metrics 功能解析

本文涉及的产品
应用实时监控服务-应用监控,每月50GB免费额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: 目前 Dubbo 3 的可观测性正在建设中,本文主要介绍 Metrics 模块基础知识与进度。

作者:姚辉


在 2018 年,Observability(即可观测性)首次被引入 IT 领域,并逐渐取代只关注系统整体可用性的传统监控。随着云原生技术的不断发展,企业从单体架构发展到分布式架构,使用容器部署拆分出来的一众微服务、与业务联系紧密,传统的监控仅适合报告系统的整体运行情况无法进行高度细化的分析与关联,于是需要将研发视角融入监控,发展具有比原有监控更广泛、更主动、更细粒度的能力,这种能力就是可观测性。


Dubbo 3 的建设规划有上云,可观测性是上云必不可少的能力,集群间根据实例可用性负载均衡、Kubernetes 弹性伸缩、建立实例健康模型等等运用场景都需要可观测性。


目前 Dubbo 3 的可观测性正在建设中,本文主要介绍 Metrics 模块基础知识与进度。


零-APM 介绍


APM全称是 application performance management,翻译过来就是应用的性能管理,主要是用来管理和监控软件系统的性能和可用性。可以保障线上服务的质量,是一个重要的服务治理工具。


如果从系统职能上分的话,APM 系统的话可以可以分为三个子系统,分别是 Metrics、Tracing 和 Logging。


Metrics 也叫指标监控,主要是负责处理一些结构化的可以聚合的一些指标数据。


Tracing 又叫链路追踪,主要是围绕单次请求进行信息处理,然后所有的数据都被绑定到系统的单个请求或者说单个事务上。


Logging 是日志监控,主要梳理一些非结构化的事件。


1.png


Metrics 结构与类型


2.png


一个 Metrics 由四部分组成,第一个是指标名称;第二个是 labels 或者说 tags 也就是标签,是一些维度数据,这些维度数据可以用来做一些过滤或者聚合查询;第三个是时间戳,就是它的时间字段;第四个就是具体的指标的一个值。


除了上述四个部分之外,还有一个非常重要的字段没有体现在数据模型里,就是这条数据的指标类型。不同的指标类型的话它是会用在不同的监控场景,同时它的一些查询和可视化的一些方式,也会有一些区别。


下面简单介绍一些常用的指标类型。


3.png


第一个是 Gague,这个类型的特点就是他是可增可减的。比如说 CPU 负载、活跃线程数、内存使用率、磁盘使用率,这些数它都是会随着时间进行波动的。它存储和展示的都是一个瞬时值。


第二个指标类型 Counter,这个类型的特点是只增不减,比如说接口请求总量,对于这个类型,一般会有几个衍生的处理,一个是可以比较两个时间点前后的一个差值,这样可以计算出这个单位时间内的请求的一个波动量。第二个就是对时间进行求导之后,就得到 QPS 这种类型的一个字段。


第三个指标类型是 Summary,主要做的是一个汇总统计,比如说平均值,分位数这样的一些指标。然后这个指标类型的话主要用于接口响应延迟这样的一个场景。因为我们平时在看接口响应延迟这个指标的时候,一般除了看它的平均值,可能还会看一些那种分位数指标。


第四个指标类型是 Historgram,它是一个柱状统计,一般是会先对指标进行一个分桶,分桶之后再去统计它的一些值。比如说我们的还是以那个接口响应延迟为例的话,它会比如说有一些那种可视化展示的话,展示它的那个柱状图。


指标收集


4.png


Dubbo 的指标体系,总共涉及三个模块,分别是指标收集、本地聚合、指标推送。


  • 指标收集:将 Dubbo 内部需要监控的指标推送至统一的 collector 中进行存储。
  • 本地聚合:指标收集获取的均为基础指标,而一些分位数指标则需通过本地聚合计算得出。
  • 指标推送:而获取指标的话有两种方式,第一种是直接访问 Dubbo 暴露的接口就可以获得 Dubbo 内部统计的指标,第二种是接入第三方服务器进行指标推送,Dubbo 会将收集和聚合后的指标通过 pull 或者push的方式推送至第三方服务器,目前只涉及 Prometheus,其中 pull 或者 push 由用户选择。 


指标收集

5.png


指标收集的目的是为了存储微服务的运行状态,相当于给微服务拍了一个快照,以及为进一步的分析(比如指标聚合)提供基础数据。


上图为 Dubbo 的架构图,本方案中指标收集的埋点位置或者说切入位置是在 provider 中通过 SPI 的方式添加一个 Filter。


这里贴了部分代码,展示了其中一部分指标收集的逻辑。


6.png


我们是通过 interfaceName、methodName、group、version 四个维度的信息作为 map 存储结构的 key ,当然这四个维度的信息最后在指标导出的时候都会转换成前面 metrics 存储结构的 labels 或者说 tags。


接下来给大家展示一个的是我们一个默认存储器的成员变量。


7.png


运用分段锁结构的 ConcurrentHashMap 来保证并发度,其中的 MethodMetric 就是前文说的四个维度信息组成的一个 class。


有一个比较重要的结构是一个 MetricsListener 的 list ,这里其实是一种生产者消费者的模式,因为默认收集器是我们默认接入的,但是如果需要收集其他指标则需要继续在此添加监听,让其他收集器监听默认收集器的状态,当默认收集器收集到了值就向监听列表推送一个事件,这样其他收集器就能收集到元信息再进一步加工处理。这里也是本地聚合实现的一个逻辑,具体细节不展示了,有兴趣的同学可以去看看 Dubbo 3.1 的代码。


本地聚合-滑动窗口与 TDigest



8.png


本地聚合主要使用滑动窗口与 TDigest,滑动窗口原理如图,假设我们初始有 6 个 bucket,每个窗口时间(即一个 bucket 在 current 指针下的停留时间)设置为2分钟,每次写入指标数据时,会将数据分别写入 6 个 bucket 内,也就是一条数据写六遍,我们会每隔两分钟移动一个 bucket 并且清除原来 bucket 内的数据,读取指标时,会读取当前 current 指向的 bucket 内的指标数据,以达到滑动窗口的效果。


滑动窗口的作用是为了能够对近期的数据做一个聚合,使得我们每次指向的 bucket 里面存储的都是从当前时间到过去一个 bucket 生命周期(即 [ now - bucketLiveTime * bucketNum, now ] 这样一个时间区间)的指标数据。其中 bucket 的生命周期受窗口时间和 bucket 数量控制,这个支持用户自定义配置。


9.png


接下来是介绍 Dubbo 分位数指标的处理,我们常说的 p99,p95 这样的指标就是分位数指标,p99 是指在 100 个请求里面,响应时延排名第 99 位的值,可以较好的反应一个服务的可用性,被称为黄金指标。


Dubbo 在计算分位数指标的时候使用了 TDigest 算法,TDigest 是一个简单,快速,精确度高,可并行化的近似百分位算法。


TDigest 使用的思想是近似算法常用的 Sketch,也就是素描,用一部分数据来刻画整体数据集的特征,就像我们日常的素描画一样,虽然和实物有差距,但是却看着和实物很像,能够展现实物的特征。


10.png


下面是 TDigest 的原理。假如有 500 个 -30 ~ 30 间的数字,可以使用概率密度函数也就是 PDF 函数表示这一数据集


11.png


该函数上的某一点的 y 值就是其 x 值在整体数据集中的出现概率,整个函数的面积相加就正好为 1 ,可以说它刻画了数据在数据集中的分布态势,也就是大家熟悉的正态分布。


有了数据集对应的 PDF 函数,数据集的百分位数也能用 PDF 函数的面积表示。如下图所示,百分位数 P75 就是面积占了 75% 时对应的 x 坐标。


12.png


PDF 函数曲线中的点都对应着数据集中的数据,当数据量较少时,我们可以使用数据集的所有点来计算该函数,但是当数据量较大时,只有通过少量数据来代替数据集的所有数据。


这里,需要将数据集进行分组,相邻的数据分为一组,用平均数和来代替这一组数。这两个数合称为质心数,然后用这个质心数来计算 PDF,这就是 TDigest 算法的核心思想。


如下图所示,质心数的平均值作为x值,个数作为 y 值,可以通过这组质心数大致绘制出这个数据集的 PDF 函数:


13.png


对应的,计算百分位数也只需要从这些质心数中找到对应的位置的质心数,它的平均值就是百分位数值。


很明显,质心数的个数值越大,表达它代表的数据越多,丢失的信息越大,也就越不精准。如这张图所示,太大的质心数丢失精准度太多,太小的质心数则有消耗内存等资源较大,达不到近似算法实时性高的效果。


14.png


所以,TDigest 在压缩比率的基础上,按照百分位数来控制各个质心数代表的数据的多少,在两侧的质心数较小,精准度更高,而在中间的质心数则较大,以此达到 P1 或 P99 的值要比 P20 更准确的效果。


指标推送之 Prometheus


指标推送的作用是为了将目前 Dubbo 提供的指标进行进一步的存储、运算和可视化,目前第三方服务器只支持 Prometheus。Prometheus 是 CNCF 开源的一个应用于应用监控的系统。主要有三个模块组成,分别是获取数据,存储数据,数据查询。


获取数据有 Pull 和 Push 两种方式,也是 Dubbo 接入的方式;存储数据 Prometheus 是用的时序数据库这里就不展开讲了;数据查询是其自定义的一套查询 IDL,可以接入 Grafana 这一类报警系统,当监控指标异常时候可以使用邮件报警或者电话报警。


15.png


目前的设计:


指标推送只有用户在设置了配置且配置 protocol 参数后才开启,若只开启指标聚合,则默认不推送指标。


  • Promehteus Pull ServiceDiscovery:启动时根据配置将本机 IP、Port、MetricsURL 推送地址信息至中间层,暴露 HTTP ServiceDiscovery 供 Prometheus 读取,配置方式如 ,其中在 Pull 模式下 address 为可选参数,若不填则需用户手动在 Prometheus 配置文件中配置地址。 


  • Prometheus Push Pushgateway:用户直接在 Dubbo 配置文件中配置 Prometheus Pushgateway 的地址即可


其中 interval 代表推送间隔


相关 Dubbo Metrics 功能我们预计会在 3.1.2 / 3.1.3 版本中正式 release 发布。


服务治理与商业化


Dubbo 3 的可观测性建设是 Dubbo 3 上云必不可少的一个环节。在 Dubbo 3 对标的商业化产品微服务引擎 MSE 中,针对 Dubbo 3 做了全方面的增强,以一种无侵入的方式增强 Dubbo 3 服务,使其具备完整的微服务治理能力。


在建设 Dubbo 可观测性的同时,我们也在结合 OpenSergo 标准构建 Dubbo 3 的完整的服务治理体系。


16.png


OpenSergo 在联合各个社区进行进一步的合作,希望通过社区来一起讨论与定义统一的服务治理标准。当前社区也在联合 bilibili、CloudWeGo 等企业、社区一起共建标准,也欢迎感兴趣的开发者、社区与企业一起加入到 OpenSergo 服务治理标准共建中。欢迎大家加入 OpenSergo 社区交流群(钉钉群)进行讨论:34826335

相关文章
|
4天前
|
人工智能 监控 算法
销售易CRM:功能与优势全解析
销售易CRM是国内领先的客户关系管理(CRM)系统,提供强大的销售管理、全方位客户管理、丰富的营销自动化工具、智能AI赋能及灵活的开放性平台。其功能涵盖线索获取、商机管理、客户画像、营销活动策划、智能预测等,支持企业高效管理客户、优化业务流程、提升销售效率和客户满意度。通过灵活的二次开发和API接口,销售易CRM可无缝集成企业现有系统,助力企业在数字化转型中实现业绩高质量增长。
|
3月前
|
数据可视化 数据挖掘 BI
团队管理者必读:高效看板类协同软件的功能解析
在现代职场中,团队协作的效率直接影响项目成败。看板类协同软件通过可视化界面,帮助团队清晰规划任务、追踪进度,提高协作效率。本文介绍看板类软件的优势,并推荐五款优质工具:板栗看板、Trello、Monday.com、ClickUp 和 Asana,助力团队实现高效管理。
87 2
|
2月前
|
搜索推荐 UED Python
实现一个带有昼夜背景切换的动态时钟:从代码到功能解析
本文介绍了一个使用Python和Tkinter库实现的动态时钟程序,具有昼夜背景切换、指针颜色随机变化及整点和半点报时功能。通过设置不同的背景颜色和随机变换指针颜色,增强视觉吸引力;利用多线程技术确保音频播放不影响主程序运行。该程序结合了Tkinter、Pygame、Pytz等库,提供了一个美观且实用的时间显示工具。欢迎点赞、关注、转发、收藏!
140 94
|
3天前
|
JSON 自然语言处理 前端开发
WebSocket调试工具深度对比:Postman与Apipost功能实测解析
本文深入对比了Postman与Apipost两款WebSocket调试工具。作为实时通讯系统工程师,作者在开发智能客服系统时遇到了传统工具调试复杂、文档管理不便的问题。通过引入Apipost的智能连接池、消息分组管理和自动化文档生成等功能,实现了多环境自动切换、消息分类和接口文档自动生成,极大提升了调试效率和团队协作效果。最终,使用Apipost使接口调试时间减少40%,文档维护成本降低70%,跨团队沟通效率提升50%。
|
3天前
|
人工智能 搜索推荐 数据挖掘
销售易CRM:功能与优势全解析
销售易CRM是国内领先的客户关系管理系统,提供从线索获取到订单成交的完整销售漏斗管理,涵盖销售、客户、营销管理和AI赋能等功能。其强大的销售管理功能包括线索与商机管理、销售预测等;全方位客户管理实现360度客户视图;丰富的营销自动化工具支持多渠道营销活动;智能AI技术提升销售效率和客户满意度;灵活的开放性平台满足定制化需求;现代化界面设计简洁直观,支持多设备访问;移动端功能齐全,协同工具丰富;优质的客户服务确保快速响应和技术支持。销售易CRM助力企业优化业务流程,推动销售增长。
|
8天前
|
JSON 前端开发 安全
WebSocket调试工具深度对比:Postman与Apipost功能实测解析
如果你在寻找既能搞定WebSocket调试,又能完美管理文档的工具,不妨试试Apipos!
25 1
|
18天前
|
人工智能 小程序 API
销售易NeoCRM与纷享销客:功能、体验与价格全解析
销售易NeoCRM和纷享销客是国内知名的CRM解决方案,各有特色。销售易功能全面,涵盖销售、客户、营销管理及AI赋能,适合中大型企业;纷享销客则以强大的连接能力和业务协同见长,用户体验佳,性价比高,更适合中小企业。两者在价格、用户体验和适用场景上有所差异,企业应根据自身需求选择合适的CRM系统。
|
16天前
|
人工智能 自然语言处理 供应链
国产与国外CRM系统:功能与优势全解析
随着企业数字化转型加速,CRM系统成为提升竞争力的关键工具。国产CRM系统如销售易、神州云动、八骏科技等,以高性价比、本地化服务和灵活定制见长;国外CRM系统如Salesforce、Zoho CRM、Microsoft Dynamics 365等,则在功能创新、全球化支持和技术成熟度上表现突出。企业在选择时应综合考虑自身需求,选取最适合的CRM系统,助力业务高质量增长。
|
2月前
|
数据可视化 项目管理
项目计划与进度跟踪:甘特图的强大功能解析
甘特图是现代项目管理中不可或缺的工具,通过时间线和任务条直观展示项目进度,支持任务分解、依赖关系管理和进度跟踪。结合板栗看板,可实现任务可视化与实时协作,提升团队效率。定期更新甘特图并灵活应对变化,确保项目顺利推进。
|
3月前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能

推荐镜像

更多