【深入浅出Java性能调优】「底层技术原理体系」详细分析探索Java服务器性能监控Metrics框架的实现原理分析(Dropwizard度量基础案例指南)

深入探索Java服务器性能监控Metrics框架的实现原理分析

  • 前提介绍
  • Dropwizard Metrics
    • Dropwizard的特点
    • Dropwizard的开发案例
    • 需要引入Maven依赖
    • 常用度量类型
      • Meter(每秒请求数为单位测量请求率)
        • 定义度量核心MetricRegistry
        • 构建对应的Meter指标对象
        • 请求标记采样
        • 业务方法控制
      • 报告器
        • 报告器的作用
          • ConsoleReporter报告器
          • 定义输出控制组件
        • 实际案例
      • Gauge(计量器)用于提供自定义度量
        • 创建Gauge指标对象
          • 命名空间来生成一个唯一的名称
          • 案例说明
          • 实现开发步骤
            • 创建一个LinkedBlockingQueue
            • 建立对应的业务方法存储队列元素以及拉取元素
            • 采样两个线程分别进行存储和拉取数据
          • 数据结果
      • Counter(计数器)
        • 计数器功能
          • 初始化MetricRegistry和ConsoleReporter的报告期
          • Counter建议的开发案例
            • 1. 创建Counter度量对象模型
            • 2. 建立度量新增和递减的业务操作埋点
            • 3. 采样两个线程分别进行不同速度下进行操作
            • 结果显示
      • Histograms(直方图)
        • 初始化Histogram对象模型
        • 执行耗时业务方法
        • 实际案例调用效果
        • 结果信息
      • Timers(计时器)
        • 计时器提供的特性
          • 创建计时器Timer对象
        • 结果
    • 总结介绍
    • 参考资料

前提介绍

在应用在线上运行时,经常需要处理大量的数据。在业务代码中,我们通常会非常关注某些方法的调用次数和响应时间等信息。这种场景通常需要使用metrics统计来实现。为了实现这样的功能,我们可以使用现有的度量工具库,而不必自己编写度量插件。其中,一个常用的度量工具库是Dropwizard Metrics。

Dropwizard Metrics

Dropwizard Metrics是一个用于度量、聚合和报告应用程序性能指标的开源库。它提供了一组简单而强大的API,用于收集各种指标数据,并且支持将这些数据进行聚合和报告。

使用Dropwizard Metrics可以轻松地在业务代码中添加度量统计,从而了解方法的调用次数、响应时间等关键指标,并通过定制的报告机制进行监控和分析。

Dropwizard的特点

在这里插入图片描述

  • 多种度量类型:Dropwizard Metrics提供了多种度量类型,包括计数器(Counter)、计时器(Timer)、直方图(Histogram)和仪表盘(Gauge)。这些度量类型可以用来统计方法的调用次数、响应时间、数据分布等。

  • 可插拔的报告:Dropwizard Metrics支持将统计数据以不同的方式进行报告,包括控制台输出、日志文件、JMX,以及集成到其他监控系统(如Graphite、InfluxDB等)。

  • 线程安全性:Dropwizard Metrics的API设计考虑了多线程环境下的并发访问,确保在统计数据收集过程中的线程安全性。

  • 可扩展性:Dropwizard Metrics提供了插件机制,可以自定义度量器、报告器和过滤器,以满足特定的需求。

注意:在使用度量统计工具时,需要权衡好度量的粒度和对性能的影响,避免过度统计和监控导致性能问题。同时,也要注意保护用户隐私和数据安全,避免统计敏感信息
.

Dropwizard的开发案例

Metrics是一个Java类库,提供了服务性能检测工具。它包含了功能强大的性能指标工具库,用于度量生产环境中各个关键组件的性能。

通过本篇文章将介绍Metrics提供的各种测量工具,以及如何使用这些工具以及它们何时派上用场的详细信息。

需要引入Maven依赖

为了使用Metrics库,您需要添加metrics-core库的依赖。

<!-- https://mvnrepository.com/artifact/io.dropwizard.metrics/metrics-core -->
<dependency><groupId>io.dropwizard.metrics</groupId><artifactId>metrics-core</artifactId><version>4.2.25</version>
</dependency>

常用度量类型

以下是一些常用的度量指标类型:

在这里插入图片描述

  • 【Meter(速率统计器)】:用于统计系统中某一事件的响应速率,例如每秒请求数(TPS)或每秒查询数(QPS)。该指标直接反映系统当前的处理能力。
  • 【Gauge(计量器)】:Gauges用来统计某个指标的瞬时值。
  • 【Counter(计数器)】:本质上是一个java.util.concurrent.atomic.LongAdder,用于计数。
  • 【Histogram(直方图)】:用于收集数据并生成直方图,用于分析数据的分布情况。
  • 【Timer(计时器)】:是Meter和Histogram的结合体,用于统计接口请求速率和响应时长。

Meter(每秒请求数为单位测量请求率)

计量器用于测量事件随时间变化的速率,例如"每秒请求数"。除了平均速率之外,流量计还可以跟踪1分钟、5分钟和15分钟的移动平均值。

以下是使用Meter组件的开发步骤,您可以按照以下步骤逐个进行开发和实现:
在这里插入图片描述

定义度量核心MetricRegistry

Metrics的核心是MetricRegistry类,它是应用程序的所有指标的容器。

首先,我们需要定义并创建一个核心注册组件服务,用于管理和注册Metric度量组件。创建Metric度量组件实例:使用适当的构造函数或工厂方法创建Metric度量组件的实例。

  	/*** 1. 度量核心注册管理组件*/public final MetricRegistry metricRegistry = new MetricRegistry();

您可能希望将其集成到应用程序的生命周期中(也许使用您的依赖项注入框架),但静态字段就可以了。

构建对应的Meter指标对象

为了实现服务应的采样控制机制,我们可以使用Meter对象。

  	/*** 2. 构建对应的Meter指标对象*/private final Meter requests = metricRegistry.meter("demoMeter");
请求标记采样

请求标记采样是一种在服务应用程序中进行采样的技术,用于记录特定类型的请求。

 /*** 3. 请求标记采样* @param requestDelta*/public void requestMark(Long requestDelta){if(Objects.isNull(requestDelta)){requests.mark();}requests.mark(requestDelta);}
业务方法控制

在这里,我们调用了requestMark操作来进行Meter的采样,并使用Thread.sleep方法来模拟业务操作的耗时。
当然,未来我们可以采用框架来处理这些操作,可以结合AOP(面向切面编程)来更方便地控制采样,同时也能减少对业务代码的侵入性。

 /*** 4. 业务方法控制*/public void businessMethod(){System.out.println("business method execute start");try {requestMark(100L);Thread.sleep(300);System.out.println("business method execute stop");} catch (InterruptedException e) {throw new RuntimeException(e);}}

使用AOP可以将采样逻辑与业务逻辑分离,通过在切面中定义采样逻辑,可以更灵活地控制采样的时机和方式。这样可以使代码更加清晰和可维护,并且可以在不修改业务代码的情况下进行采样操作。

报告器

Metric的报告器的作用是将度量指标的数据输出到不同的目标,以便进行监控、分析和可视化。报告器可以将度量指标的数据以不同的形式进行报告,例如输出到控制台、写入日志文件、发送到远程监控系统等。报告器可以根据配置的频率或触发条件定期或实时地生成报告。
在这里插入图片描述

报告器的作用
  • 监控和实时反馈:报告器可以将度量指标的数据输出到控制台或日志文件,使开发人员能够实时监控应用程序的性能和行为。
  • 性能分析和优化:通过将度量指标的数据输出到报告器,可以对应用程序的性能进行分析和优化。开发人员可以根据报告器生成的报告,识别性能瓶颈和优化机会。
  • 可视化和报表:报告器可以将度量指标的数据以图表或报表的形式进行展示,使数据更加直观和易于理解。这有助于团队成员和管理者对应用程序的性能和运行情

当然,您也可以自己实现一个定制化的报告器,以满足特定的需求并实现自定义的可视化效果。在我们接下来的案例中,为了方便演示,我们使用了ConsoleReporter作为示例报告器。ConsoleReporter将度量指标的数据输出到控制台,提供了简单而直观的可视化效果。

ConsoleReporter报告器

ConsoleReporter是Metrics库提供的一个报告器,用于将度量指标输出到控制台。在这个方法中,我们使用forRegistry方法创建一个ConsoleReporter对象。

定义输出控制组件

定义了一个名为consolePrint的方法。该方法的功能是创建一个ConsoleReporter对象,并使用metricRegistry作为其注册表。

   void consolePrint() {ConsoleReporter reporter = ConsoleReporter.forRegistry(metricRegistry).convertRatesTo(TimeUnit.SECONDS).convertDurationsTo(TimeUnit.MILLISECONDS).build();reporter.start(1, TimeUnit.SECONDS);}

通过convertRatesTo和convertDurationsTo方法将度量指标的速率单位设置为秒和间隔时间单位设置为毫秒。
在这里插入图片描述
它的继承关系如下所示:
在这里插入图片描述
此外i,还有其他的继承实现类,例如:Slf4jReporter和CsvReporter,后面我会单独出一篇文章进行分析和介绍说明。

实际案例
public class MeterDemo {/*** 1. 度量核心注册管理组件*/public final MetricRegistry metricRegistry = new MetricRegistry();/*** 2. 构建对应的Meter指标对象*/private final Meter requests = metricRegistry.meter("demoMeter");/*** 3. 请求标记采样* @param requestDelta*/public void requestMark(Long requestDelta){if(Objects.isNull(requestDelta)){requests.mark();}requests.mark(requestDelta);}/*** 4. 业务方法控制*/public void businessMethod(){System.out.println("business method execute start");try {for(int i = 0; i < 10; i++){

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/665762.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chisel 语法

// TODO: find out the new way to have a reset signal class KnightRider(resetSignal: Bool null, frequ: Int)//extends Module(_reset resetSignal) {extends Module {val io IO(new Bundle {val led Output(Bits(6.W))})//定义了一个枚举类型&#xff0c;包含两个状态…

使用Python将Excel数据导入Word并设置字体样式(成功)

在日常办公和数据处理中&#xff0c;我们经常需要将Excel中的数据导入到Word文档中。手动完成这个过程可能既费时又容易出错。本文将介绍如何使用Python自动化这一任务&#xff0c;同时根据数据的不同设置不同的字体样式和大小。 所需工具 Python&#xff1a;一种广泛使用的高…

kafka自定义分区策略详解

文章目录 前言一、kafka是什么&#xff1f;二、kafka的分区策略三、自定义的 Kafka 分区器实现总结 前言 在分布式消息系统中&#xff0c;正确地将消息发送到合适的分区是至关重要的。Kafka 作为一种高性能、可扩展的消息队列系统&#xff0c;在处理海量数据和高并发场景下表现…

三、05 ansible基础命令ansible 常用命令

这里写目录标题 命令介绍ansible 的基础语法实力 使用一个copy 模块 Ansible 模块功能查看工具ansible-doc的全部用法&#xff1a;mysql 实例 命令介绍 /usr/bin/ansible  (常用) Ansibe AD-Hoc 临时命令执行工具&#xff0c;常用于临时命令的执行 /usr/bin/ansible-playbo…

【Linux Day15 TCP网络通讯】

TCP网络通讯 TCP编程流程 接口介绍 socket()方法是用来创建一个套接字&#xff0c;有了套接字就可以通过网络进行数据的收发。创建套接字时要指定使用的服务类型&#xff0c;使用 TCP 协议选择流式服务&#xff08;SOCK_STREAM&#xff09;。 **bind()方法是用来指定套接字使…

Quppy wise 注册教程,轻松通过欧洲银行同名转账绑定个人IBAN账号

Quppy 注册教程,轻松通过欧洲银行同名转账绑定个人IBAN账号 官网下载APP或者去香港区下载APP使用, 按照官方APP里的邮箱注册就行&#xff0c;成功后添加电话和个人信息&#xff1b;需要说明的是&#xff1a;网站所填内容请全部用真实身份填写&#xff1b;名在前&#xff0c;姓…

蓝桥杯每日一题-----数位dp

前言 今天浅谈一下数位dp的板子&#xff0c;我最初接触到数位dp的时候&#xff0c;感觉数位dp老难了&#xff0c;一直不敢写&#xff0c;最近重新看了一些数位dp&#xff0c;发现没有想象中那么难&#xff0c;把板子搞会了&#xff0c;变通也会变的灵活的多&#xff01; 引入…

六、java函数

文章目录 java函数1.1 什么是函数1.2 进一步理解函数1.2.1 参数传递1.2.2 理解返回 java函数 本文为书籍《Java编程的逻辑》1和《剑指Java&#xff1a;核心原理与应用实践》2阅读笔记 在编写代码过程中&#xff0c;如果需要经常做某一种操作&#xff0c;则类似的代码需要重复…

列式数据库、行式数据库简介

列式数据库、行式数据库简介 1、数据准备2、行式数据库3、列式数据库4、行式、列式存储对比 常见的行式数据库有Mysql&#xff0c;DB2&#xff0c;Oracle&#xff0c;Sql-server等&#xff1b;列数据库&#xff08;Column-Based&#xff09;数据存储方式按列存储&#xff0c;常…

2024/1/30 dfs与bfs

想要了解dfs与bfs&#xff0c;就得了解队列和栈。 一、栈与队列 1.栈 栈说白了就是先入后出。把栈类比为一个容器。只有一个口&#xff0c;所以如果我们想要取出最底层也就是最先放入的元素&#xff0c;只能最后取出它。 栈基础操作有如下几种&#xff1a; push 放入pop 拿…

python 爬虫安装http请求库

我的是window环境&#xff0c;安装的python3&#xff0c;如果再linux环境&#xff1a;pip install requests 开始&#xff1a; 上面我们成功发送请求并获取到响应&#xff0c;现在需要解析html或xml获取数据&#xff0c;因此我使用现成的工具库Beautiful Soup

leetcode刷题(剑指offer) 297.二叉树的序列化和反序列化

297.二叉树的序列化与反序列化 序列化是将一个数据结构或者对象转换为连续的比特位的操作&#xff0c;进而可以将转换后的数据存储在一个文件或者内存中&#xff0c;同时也可以通过网络传输到另一个计算机环境&#xff0c;采取相反方式重构得到原数据。 请设计一个算法来实现…

图论练习3

内容&#xff1a;过程中视条件改变边权&#xff0c;利用树状数组区间加处理 卯酉东海道 题目链接 题目大意 个点&#xff0c;条有向边&#xff0c;每条边有颜色和费用总共有种颜色若当前颜色与要走的边颜色相同&#xff0c;则花费为若当前颜色与要走的边颜色不同&#xff0c;…

shell脚本中的变量,运算符

1.脚本格式 我们一般将shell脚本写在xxx.sh文件中&#xff0c;执行的时候bash/sh xxx.sh 注意文件路径 xxx.sh文件中的第一行为 #!/usr/bin/bash 注代表我们使用的是bin文件夹下的bash解释器(此条为注释语句&#xff0c;不写也可以) 2.echo用法 相当与print 示例1&…

ASP.NET Core 自定义解压缩提供程序

写在前面 在了解ASP.NET Core 自定义请求解压缩中间件的应用时&#xff0c;依据官方文档操作下来碰到了几个问题&#xff0c;这边做个记录。 关键点就是配置 Content-Encoding&#xff0c;参数需要和代码中添加的提供程序的Key保持一致&#xff1b; builder.Services.AddRequ…

9、C语言复习

目录 1、位操作 2、define宏定义关键词 3、ifdef条件编译 4、extern变量申明 5、typedef类别别名 6、结构体 7、static关键字 1、位操作 &&#xff1a;按位与 |&#xff1a;按位或 ^&#xff1a;按位异或 ~&#xff1a;取反 <<&#xff1a;左移 >>…

【实战知识】使用Github Action + Nginx实现自动化部署

大家好啊,我是独立开发豆小匠。 先说一下背景~ 我的小程序:豆流便签,目前使用云托管部署后端服务,使用轻量级服务器部署数据库和一些中间件。 因此服务器成本:云托管 + 云服务器 云托管每周花费5元,一个月就是50,一年就是500啊,所以这期准备把云托管优化掉! 1. 需…

x-shell安装、使用以及配置cuda、cudnn和conda

x-shell安装、使用以及安装最新版本conda x-shell安装远程连接服务器conda安装和环境配置 x-shell安装 x-shell是一款终端模拟软件&#xff0c;用于在Windows界面下远程访问和使用不同系统下的服务器。免费版本下载地址&#xff1a; https://www.xshell.com/zh/free-for-home-…

java常用工具类【如spring 常用工具类,IO流常用工具类等】,持续更新

java常用工具类&#xff0c;持续更新 import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; import org.springframework.util.ResourceUtils; import org.springfra…

【QT+QGIS跨平台编译】之二十六:【SpatialIndex+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、SpatialIndex介绍二、文件下载三、文件分析四、pro文件五、编译实践一、SpatialIndex介绍 SpatialIndex是一个用于高效处理空间数据的C++库,基于R树索引结构实现。它提供了一系列的空间操作和查询算法,能够快速地对大规模空间数据进行检索和分析。 SpatialInd…