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

news2024/11/16 21:53:50

深入探索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.coloradmin.cn/o/1430272.html

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

相关文章

【C++入门到精通】C++的IO流(输入输出流) [ C++入门 ]

阅读导航 引言一、C语言的输入与输出二、流是什么三、CIO流1. C标准IO流&#xff08;1&#xff09;istream&#xff08;2&#xff09;ostream&#xff08;3&#xff09;iostream&#xff08;4&#xff09;cin 和 cout 2. C文件IO流&#xff08;1&#xff09;ifstream&#xff0…

WPF简介

WPF早期名称为Avalon&#xff0c;是微软的一个项目&#xff0c;目的是构建统一的平面展示平台 WPF是一个与分辨率无关的UI框架&#xff0c;是一种基于矢量的呈现引擎技术&#xff1b;所用的语言为XAML(全称Extensible Application MarkupLanguage)&#xff0c;它的基本度量单位…

02 使用jdk运行第一个java程序:HelloWorld

使用jdk运行第一个java程序 1 HelloWorld小案例1.1 编写流程1.2 错误示例 首先在CMD命令行里面&#xff0c;使用javac xxxx.java&#xff0c; 进行编译&#xff0c;其中会有报错&#xff1b; 然后生成xxxx.class 文件&#xff0c;然后使用java xxxx.class 进行运行。 1 HelloWo…

回归预测 | Matlab实现POA-CNN-LSTM-Attention鹈鹕算法优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制)

回归预测 | Matlab实现POA-CNN-LSTM-Attention鹈鹕算法优化卷积长短期记忆网络注意力多变量回归预测&#xff08;SE注意力机制&#xff09; 目录 回归预测 | Matlab实现POA-CNN-LSTM-Attention鹈鹕算法优化卷积长短期记忆网络注意力多变量回归预测&#xff08;SE注意力机制&…

五大浏览器内核及代表浏览器,一文讲透!

Hi,我是贝格前端工场&#xff0c;在进行web前端开发的时候&#xff0c;浏览器兼容性一直是让所有前端工程师头疼的问题&#xff0c;其根源在于不同的浏览器应用了不同的内核&#xff0c;其对html、css、js的解析规则也是不一样的&#xff0c;作为前端开发的你&#xff0c;如果不…

2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模

上一篇已经对赛题进行详细分析了&#xff0c;而且大方向和基本的模型已经确定完毕&#xff0c;数据集都已经找到了&#xff0c;现在最重要的就是要分析风暴数据集以及建立时序预测模型&#xff0c;使用气候模型预测的数据&#xff0c;评估气候变化对未来极端天气事件频率和强度…

全面认识DOS系统

目录 一、DOS系统的功能 1.执行命令和程序&#xff08;处理器管理&#xff09; 2.内存管理 3.设备管理 4.文件管理 5.作业管理 二、文件与目录 三、文件类型与属性 1.系统属性&#xff08;S&#xff09; 2.隐含属性&#xff08;H&#xff09; 3.只读属性&#xff08…

深度学习手写字符识别:训练模型

说明 本篇博客主要是跟着B站中国计量大学杨老师的视频实战深度学习手写字符识别。 第一个深度学习实例手写字符识别 深度学习环境配置 可以参考下篇博客&#xff0c;网上也有很多教程&#xff0c;很容易搭建好深度学习的环境。 Windows11搭建GPU版本PyTorch环境详细过程 数…

华为机考入门python3--(6)牛客6-质数因子

分类&#xff1a;质数、素数 知识点&#xff1a; 取余符号% 5%3 2 取整符号// 5//3 1 list中int元素转str map(str, list) 题目来自【牛客】 def prime_factors(n): """ 输入一个正整数n&#xff0c;输出它的所有质因子&#xff08;重复的也…

python pygame实现倒计时

实现思路 获取开始时间、当前时间&#xff0c;通过当前时间-开始时间时间差&#xff0c;再通过倒计时的总时长-时间差即可实现&#xff01; 随着时间的流逝&#xff0c;当前时间会变大&#xff0c;也就导致时间差会变大&#xff0c;当使用总时长-时间差的时候&#xff0c;得到…

基于控制台的购书系统(Java 语言实现)

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》|《数据结构与算法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有限&#xff0c;欢…

【Nginx】nginx入门

文章目录 一、Web服务器二、Nginx三、Nginx的作用Web服务器正向代理反向代理 四、CentOS上安装Nginx(以CentOS 7.9为例) 一、Web服务器 Web 服务器&#xff0c;一般是指“网站服务器”&#xff0c;是指驻留于互联网上某种类型计算机的程序。Web 服务器可以向 Web 浏览器等客户…

[开源]基于野火指南者的MQTT框架+FreeRTOS移植(使用板载esp8266模块)

MQTT移植 项目地址 实际使用 基于野火指南者开发板 移植大佬的MQTT框架, 参考韦东山的课程 实际移植的项目: mqttclient 主要实现的是使用开发板上面的ESP8266连接MQTT服务器, 目前使用的是ip地址进行连接(FreeRTOS版本) 测试程序在mqtt/at/at_comment.c文件里面, 需要改…

Vivado MIG IP使用配置

目录 1 MIG 基本配置 1 MIG 基本配置 配置如下图所示 图1 图2 图3 图4 图5 图6 图8 图9 在设立只讲解共同配置&#xff0c;这是所有DDR3中配置通用部分。

2024年【低压电工】复审考试及低压电工作业考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 低压电工复审考试参考答案及低压电工考试试题解析是安全生产模拟考试一点通题库老师及低压电工操作证已考过的学员汇总&#xff0c;相对有效帮助低压电工作业考试题库学员顺利通过考试。 1、【单选题】()是保证电气作…

CSS常用动画网站(纯css echarts等 建议经常阅读 积累素材)

CSS动画代码集合 https://www.webhek.com/post/css3-animation-sniplet-collection/#/ 这个网站中将常见的css动画都进行了集合,并且有详细的代码,可以直接使用 echarts图表 https://www.isqqw.com/ echarts也是前端常用的,虽然官方文档已经给出了很多的案例,但是有时候产品还…

OpenHarmony—Gradle工程适配为Hvigor工程

该适配场景适用于开发者希望将原OpenHarmony API 7的工程升级到OpenHarmony API 9的工程。 原OpenHarmony API 7的工程采用的是Gradle自动化构建工具&#xff0c;而OpenHarmony API 9的工程则采用Hvigor自动化构建工具&#xff0c;由于Gradle构建工具和Hvigor构建工具的配置文…

【PyQt】03-信号与槽

文章目录 前言一、信号与槽二、Demo接收信号代码运行结果 自定义信号【重点】代码运行结果 总结 前言 我认为&#xff0c;信号就是触发&#xff0c;槽就是触发的事件。 一、信号与槽 信号(signal) 其实就是事件&#xff08;按钮点击 、内容发生改变 、窗口的关闭事件&#xf…

无人机在消防领域的应用及其优势

无人机在消防领域的应用及其优势 随着科技的不断发展&#xff0c;无人机正以其独特的优势&#xff0c;逐渐在各个领域得到广泛应用。在消防领域中&#xff0c;无人机的应用也越来越受到关注。无人机在消防工作中具有独特的优势&#xff0c;可以帮助消防人员更好地开展任务&…

背景点击监督的时序动作定位 Background-Click Supervision for Temporal Action Localization

该论文介绍了 BackTAL,这是一种利用背景点击监督进行弱监督时序动作定位的新方法。 它将焦点从动作帧转移到背景帧,通过强调背景错误来改进定位。 BackTAL 包含分数分离模块和亲和力模块,增强了位置和特征建模。 Background-Click的说明 Click 点击级别监督的说明…