Dubbo metrics学习总结

1 简介

metrics为微服务的监控提供数据基础;是一个标准度量库,对监控对象的数据采集进行了统一封装。

2 特性与功能

3 实现原理

4 Metric注册与定义


监控数据采集逻辑的实现取决于具体的指标类型

4.1 支持的指标类型

4.1.1 操作系统

支持Linux/Windows/Mac,包含cpu, load, disk, nettraffic, tcp。
对应的实现模块:metrics-os

4.1.2 Jvm

支持classload, gc次数和时间, 文件句柄,young/old区占用,线程状态, 堆外内存,编译时间,部分指标支持自动差值计算
实现模块:metrics-jvm

4.1.3 中间件

4.1.3.1 Tomcat

请求数,失败次数,处理时间,发送接收字节数,线程池活跃线程数等。
实现模块:metrics-tomcat

4.1.3.2 Druid

sql执行次数,错误数,执行时间,影响行数等;
实现模块:metrics-druid.

4.1.3.3 Nginx

接受,活跃连接数,读,写请求数,排队数,请求qps,平均rt等;
实现模块:metrics-nginx.

4.1.4 应用层

需要使用相关api去应用层埋点实现;如qps等。

4.2 度量器

用于指标的统计,监控数据的结构和特征会有所不同,所以根据不同的需求会对应一种度量器

4.2.1 Counter


counter统计基于时间滑动窗口算法实现。
Bucket类提供分桶计数功能,统计一定时间间隔内的计数
BucketDeque类可以理解为一个时间窗口,用于保存最近N个时间间隔内的计数
统计值的修改逻辑,如下:

/*** update the counter to the given bucket*/
public void update(long n) {if (updateTotalCount) {totalCount.inc(n);}// align current timestamplong curTs = TimeUnit.MILLISECONDS.toSeconds(clock.getTime()) / interval * interval;Bucket oldBucket = latestBucket.get();if (curTs > latestBucket.get().timestamp) {// create a new bucket and evict the oldest oneBucket newBucket = new Bucket();newBucket.timestamp = curTs;if (latestBucket.compareAndSet(oldBucket, newBucket)) {// this is a single thread operationbuckets.addLast(newBucket);oldBucket = newBucket;} else {oldBucket = latestBucket.get();}}// reduce the call to latestBucket.get() to avoid cache line invalidation// because internally latestBucket is a volatile objectoldBucket.count.add(n);
}

获取整个时间窗口的统计值实现,如下:

/*** Return the bucket count, keyed by timestamp* @return the bucket count, keyed by timestamp*/
public Map<Long, Long> getBucketCounts(long startTime) {Map<Long, Long> counts = new LinkedHashMap<Long, Long>();long curTs = calculateCurrentTimestamp(clock.getTime());for (Bucket bucket: buckets.getBucketList()) {if (1000L * bucket.timestamp >= startTime && bucket.timestamp <= curTs) {counts.put(1000L * bucket.timestamp, bucket.count.sum());}}return counts;
}

备注:至于其它度量器的底层实现大多是基于BucketCounter。可以理解为也是通过时间滑动窗口算法实现的。

4.2.2 Meter(吞吐率度量器)

EWMA类是对指数加权移动平均值算法的实现,指数移动加权平均较传统的平均法来说,一是不需要保存过去所有的数值;二是计算量显著减小。

EWMA 的表达式如下:
    vt=βθt +(1−β)vt−1
  上式中 θt
为时刻 t 的实际温度;系数 β 表示加权下降的速率,其值越小下降的越快;vt 为 t
时刻 EWMA 的值。
  在上图中有两条不同颜色的线,分别对应着不同的 β
值。
β值为0<β<1区间;
当β=0.9,是最接近实际数据的;
β的取值可以指定一个常量,也可以受其它因素的影响来取值,比如时间范围,β=aT,T为1分钟、5分钟等。

4.3 metric命名规则

metric的名字抽象为MetricName,它由两部分组成,key和tag。

4.3.1 Key

key是一个由.分隔的字符串, 它描述了这个metric的基本含义.

4.3.2 Tag

引入tag是为了实现多维度统计数据。tag由两部分组成, tagKey和tagValue, 形式为{tagKey=tagValue}

  • key和tag只支持:[a-z][A-Z][0-9][-_./], 不能有空格, 大小写敏感, key原则上不包含大写。
  • 格式为app_name.category[.sub_category]*,category和sub_category里面如果有多个单词,用下划线’_‘连接, 不要用’.'连接
  • 需要动态聚合的维度, 放在tag里面, 同时在tagKey也在key中体现。 不需要聚合的维度, 放在key里面。
  • 不要使用太多的tag, 一般而言4-5个已经足够

4.3.3 规则解析

MetricName对象的创建方式有:new MetricName()、MetricName.build()、MetricName.join()
key的解析原理,如下:

Tag的解析原理,如下:

举例说明:
Key为dubbo.service.qps;
Tag 为 service=demoService,host=demo

实现方式有多种:

  • 方式一
MetricName name = new
MetricName("dubbo.service.qps").tagged("service", "demoService");
name = name.tagged("host", "demo");
  • 方式二
  MetricName name = MetricName.build("dubbo").resolve("service.qps").tagged("service", "demoService","host", "demo");

还有其它的方式

5 单机metric数据落盘

数据如果完全存在内存里面,可能会出现因为拉取失败,或者应用本身抖动,导致数据丢失的可能。
为了解决该问题,metrics引入了数据落盘的模块,提供了日志方式和二进制方式两种方式的落盘。
日志方式默认通过JSON方式进行输出,可以通过日志组件进行拉取和聚合,文件的可读性也比较强,但是无法查询历史数据。
二进制方式则提供了一种更加紧凑的存储,同时支持了对历史数据进行查询。

6 metric数据暴露

外部可以通过什么方式查询相关数据,如指标信息、指标实时统计数据等
指标信息:默认的指标、动态新增的指标
代码实现模块:metrics-rest

6.1 HTTP Server实现原理

基于Jersey+ sun Http server的简单实现

6.2 http查询接口

目前查询的是本地内存的数据
详细的接口说明见:https://github.com/dubbo/metrics/wiki/query-from-http

7 metric数据上报

供外部收集数据
代码实现模块:metrics-reporter

7.1 上报类型

7.1.1 SLF4J上报:Slf4jReporter

7.1.1.1 实现原理

7.1.2 OpenTsdb上报:OpenTsdbReporter

7.1.2.1 实现原理

7.1.3 jmx上报:JmxReporter

7.1.3.1 实现原理

备注:待完善

7.1.4 控制台上报:ConsoleReporter

7.1.4.1 实现原理

备注:待完善

7.1.5 Csv文件上报:CsvReporter

7.1.5.1 实现原理

备注:待完善

8使用方式

8.1 埋点

定义或注册metric

  • 定义metric

指定指标类型、统计维度、级别、度量器。如下:

Counter hello = MetricManager.getCounter("test", MetricName.build("test.my.counter"));
hello.inc();
  • 注册metric

例如:tomcat、druid、nginx等

MetricsIntegrateUtils.registerAllMetrics();

8.2 metric数据上报

首先根据需要选择你要上报的类型,例如用ConsoleReporter上报到控制台,则:

private final ConsoleReporter reporter = ConsoleReporter.forRegistry(registry).outputTo(output).formattedFor(Locale.US).withClock(clock).formattedFor(TimeZone.getTimeZone("PST")).convertRatesTo(TimeUnit.SECONDS).convertDurationsTo(TimeUnit.MILLISECONDS).filter(MetricFilter.ALL).build();
reporter.report(this.<Gauge>map(),map("test.counter", counter),this.<Histogram>map(),this.<Meter>map(),this.<Timer>map());

8.3 Rest http server 启动

metricsHttpServer = new MetricsHttpServer();
metricsHttpServer.start();

Dubbo metrics学习总结相关推荐

  1. Dubbo -- 系统学习 笔记 -- 示例 -- 参数验证

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 参数验证 参数验证功能是基于JSR303实现的,用户只需标识JSR303标准的验证 ...

  2. dubbo入门学习笔记之入门demo(基于普通maven项目)

    注:本笔记接dubbo入门学习笔记之环境准备继续记录; (四)开发服务提供者和消费者并让他们在启动时分别向注册中心注册和订阅服务 需求:订单服务中初始化订单功能需要调用用户服务的获取用户信息的接口(订 ...

  3. Dubbo -- 系统学习 笔记 -- 示例 -- 服务分组

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 服务分组 当一个接口有多种实现时,可以用group区分. <dubbo:se ...

  4. java mongo分组统计_探秘 Dubbo 的度量统计基础设施 - Dubbo Metrics

    对服务进行实时监控,了解服务当前的运行指标和健康状态,是微服务体系中不可或缺的环节.Metrics 作为微服务的重要组件,为服务的监控提供了全面的数据基础.近日,Dubbo Metrics 发布了2. ...

  5. 探秘 Dubbo 的度量统计基础设施 - Dubbo Metrics

    对服务进行实时监控,了解服务当前的运行指标和健康状态,是微服务体系中不可或缺的环节.Metrics 作为微服务的重要组件,为服务的监控提供了全面的数据基础.近日,Dubbo Metrics 发布了2. ...

  6. Dubbo Metrics 发布新版本 2.0.1 | Dubbo 的度量统计基础设施

    对服务进行实时监控,了解服务当前的运行指标和健康状态,是微服务体系中不可或缺的环节.Metrics 作为微服务的重要组件,为服务的监控提供了全面的数据基础.近日,Dubbo Metrics 发布了2. ...

  7. Dubbo -- 系统学习 笔记 -- 示例 -- 只订阅

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 只订阅 问题 为方便开发测试,经常会在线下共用一个所有服务可用的注册中心,这时,如 ...

  8. dubbo + zookeeper学习

    title: dubbo + zookeeper学习 基础知识 什么是分布式 分布式系统是若干独立计算机的集合: 对用户来说像单个系统. 系统垂直拆分面临的问题 (1)界面,业务逻辑实现分离 (2)应 ...

  9. dubbo 使用学习五(dubbo开发中使用到的一些服务配置方式)

    通过之前的学习了解了dubbo的常规的使用,下面我们看看特殊情况或者说真实环境下使用dubbo的一些配置实例. 一.一个接口有多个实现时可以使用group来区分 1.服务提供者配置 <?xml ...

  10. dubbo高级学习日记

    学习内容 1.序列化: 2.地址缓存 3.超时 4.重试: 5.多版本 6.负载均衡 7 集群容错: 服务降级 1.序列化: dubbo 内部已经将序列化和反序列化的过程内部封装了 我们只需要在定义p ...

最新文章

  1. Dapper+SqlServerCe部署
  2. xp java配置_WinXP系统Java配置环境变量的方法
  3. h5页面保存img_一文彻底解决HTML5页面中长按保存图片功能
  4. php查询MySQL结果转化为数组_PHP如何将SQL查询结果转为多维数组,并按查询行输出...
  5. Win7(x64)升级到Win10
  6. MATLAB基础教程
  7. laravel 语言包
  8. 一名优秀的测试工程师,应具备那些能力
  9. DWZ 富文本编辑器 IE下失去焦点
  10. 【90】RootPort的completion timeout为什么不能阻止CPU发生MCE
  11. keras进行时间序列预测
  12. AI基础:卷积神经网络
  13. py: pip3老,导致安装 flask avatar 依赖的 pillow 安装不上
  14. 华擎主板bios设置图解_华擎主板BIOS设置程序手册.pdf
  15. 【Database】数据库常见面试题【转】
  16. MySQL之DML常用命令
  17. java版tp指令,VAG TP 2.0完整的AT命令列表
  18. EXCEL中的POWER QUERY功能简介
  19. 安装程序配置服务器失败。参考服务器错误日志和 C:/WINDOWS/sqlstp.log 了解更多信息。
  20. 如何使你的项目有国际范

热门文章

  1. 一个学习C语言的好网站,推荐给大家
  2. 2022“美亚杯”第八届中国电子数据取证大赛-个人赛题目
  3. 想成为CSS大师,你倒是学啊 -30个资源大推荐
  4. python中集合类型的四种操作符_Python集合类型和操作,及
  5. python-基础杂集
  6. WSJ在隐私是否真的那么可怕
  7. 为什么硬件工程师招聘如此之难?
  8. 黄河金岸诗词赋联大赛获奖名单
  9. Day9-Python文本数据(DataWhale)
  10. linux命令(3) 链接ln和搜索locate,find, whereis, which, grep命令