Dropwizard-metric的使用

news2024/11/25 16:31:58

背景

近期在开发中用到了dropwizard-metric作为监控metric的埋点框架,由于是分布式的系统,前期曾经对比过hadoop-metric的实现和dropwizard-metric的实现,因为开发的项目后续会和hadoop的项目有一定的上下游关系,所以考虑排除掉hadoop的引用,防止后续出现循环依赖等问题。所以深度的调研了dropwizard-metric的使用,发现alluxio,ozone,ratis等项目都或多或少的使用了dropwizard-metric框架,所以本文详细的介绍一下dropwizard-metric的使用。


dropwizard-metric介绍

官方的介绍为,它提供了一个强大的组件包,可以用来衡量生产环境中关键组件的行为方法。简化来说就是监控!大家现在普遍接受的架构多半是promethus+grafa,那promethus的数据来源就依赖系统中的埋点,dropwizard-metric就是这样一个框架,它支持埋点并将数据以多种形式report对外暴漏供用户使用。

首先,当然需要引入mvn依赖,注意版本号,当前官方文档最新的release版本为4.2,之前的release已经停止维护了。

<dependencies>
    <dependency>
        <groupId>io.dropwizard.metrics</groupId>
        <artifactId>metrics-core</artifactId>
        <version>${metrics.version}</version>
    </dependency>
</dependencies>

下面介绍dropwizard中的几个常用的埋点类型:

  • Counter :递增的数据,配置告警和监控时需要使用diff

  • Gauge: 使用与瞬时值,比如查看当前队列长度等等

  • Timer: 使用try with resource包含,可以用来查看try包含的操作的执行时间

  • Histograms:用来查看各种延迟信息,95th,99th,最大值,最小值等等

  • Meter:一段时间内发生的请求数,可以用来计算QPM,QPS等等?这个暂时没用到

  • healthCheck:可用于监控某些链接是否正常,状态是否正常等等,如连接数据库,定期check

埋点操作完成后,要进行数据的report, 该框架提供了多种report方法,其中包含:

  • jmxReporter,  report之后可以从VisualVM查看当前的metric值
  • httpReporter,  需要增加引用, 该引用作用是默认认为你的系统中使用jetty等或者其他框架的web框架,可以将metric的数据暴露到http界面中
<dependency>
    <groupId>io.dropwizard.metrics</groupId>
    <artifactId>metrics-servlets</artifactId>
    <version>${metrics.version}</version>
</dependency>
  • ConsoleReporter: 将metric信息打印到控制台,可以设置时间间隔
  • Log4jReporter: 将metric信息通过日志的形式打印
  • 其它的还有CSVReporter, GraphiteReporter 

dropwizard-metric的使用

需要有一个全局的registry负责注册系统中的所有metric,注意healthCheck的使用方式有些不同,后面单独讲解

private final MetricRegistry metrics = new MetricRegistry();

 有了registry就可以之后可以用来注册具体的指标类型使用了。

  • gauge, 其中getValue可以自己定义一个方法,用来获取某一个瞬时值
metrics.register("testGaugeSize", () -> getValue());
  • counter, 注册之后可以调用counter的icr()和dec()等方法
// 注册
private final Counter testCounter = metrics.counter("testCounterNums");

// 使用
testCounter.icr();
testCounter.dec();
  • meter,用来计算QPM或QPS等等,可以放在一个统一的入口位置。
// 注册
private final Meter meterTest = metrics.meter("meterTest");

// 使用
public void handleRequest(Request request, Response response) {
    meterTest.mark();
}
  • timer, 用来计算某一些操作的耗时,可以使用try with resource的形式,或者使用try finally记得要关闭context即可
private final Timer testTimer = metrics.timer("testTimer");

public String handleRequest(Request request, Response response) {
    try(final Timer.Context context = testTimer.time()) {
        // 一些处理逻辑,也就是计算耗时的部分
    } 
}
  • histograms,直方图,顾名思义是一算一些最大值,最小值,平均值,中位数等等
private final Histogram testHistogram = metrics.histogram("testHistogram");

public void handleRequest(Request request, Response response) {
    // etc
    testHistogram.update(response.getContent().length);
}
  • Health_check的使用和以上有一些差别,如下:
// 需要单独注册registry,不和上边的metric类型公用
final HealthCheckRegistry healthChecks = new HealthCheckRegistry();
// 使用方式,需要先继承HealthCheck的类,实现自己的check逻辑
public class DatabaseHealthCheck extends HealthCheck {
    private final Database database;

    public DatabaseHealthCheck(Database database) {
        this.database = database;
    }

    @Override
    public HealthCheck.Result check() throws Exception {
        if (database.isConnected()) {
            return HealthCheck.Result.healthy();
        } else {
            return HealthCheck.Result.unhealthy("Cannot connect to " + database.getUrl());
        }
    }
}
// 注册到全局的healthChecks中
healthChecks.register("testHealthCheck", new DatabaseHealthCheck(database));
  • 可以注册一些dropwizard原生的JVM或者GC相关的数据到registry当中,可以帮助定位JVM的相关问题
  • registry.registerAll(new JvmAttributeGaugeSet());
    registry.registerAll(new GarbageCollectorMetricSet());
    registry.registerAll(new MemoryUsageGaugeSet());
    registry.registerAll(new ClassLoadingGaugeSet());
     

dropwizard-metric的report方式

report的方式有多种,一般常用的可能有jmxReporter, httpReporter在本文中只是简单的举例,大家可以根据自己的用法继续探索挖掘。

  • jmxReporter

需要增加mvn引用

<dependency>
    <groupId>io.dropwizard.metrics</groupId>
    <artifactId>metrics-jmx</artifactId>
    <version>${metrics.version}</version>
</dependency>

使用方式也比较简单:

// registry为上文提到的全局registry
final JmxReporter reporter = JmxReporter.forRegistry(registry).build();
reporter.start();

在以上完成后,可以使用VisualVM查看是否被report到JVM的MBeans中,使用java中自带的即可,但是需要安装Mbeans的插件,安装成功后可以看到如下:

  • HttpReporter, 该reporter的方式为用户可视化的方式看到metric

需要额外的引用

<dependency>
    <groupId>io.dropwizard.metrics</groupId>
    <artifactId>metrics-servlets</artifactId>
    <version>${metrics.version}</version>
</dependency>

使用方式为,项目中的web服务,自定义一个servlet并将它加到你的httpServer中,类似

addServlet("metrics", "/metrics", MetricsServlet.class);

servlet注册成功后,可以从界面上看到如下界面:

其它的reporter的使用方式,在此不再多余的讲解,感兴趣可以直接查看官方文档other-reporting 

其它思考

按照当前的使用方式,每个metric定义的时候都需要使用registry.counter或者.timer或者.meter才能使用这个metric,很样就导致metric的对象实现在项目中特别琐碎,可能放到任何一个你需要监控的类中,在用户使用过程中可以参考hadoop的@Metric的注解,自定义实现一个注解,用来标注metric的类型,name等等,在类加载的过程中将指标register到全局registry中,使用起来更加的方便,其他人在使用时可以直接标注注解即可,不需要学习更多的dropwizard-metric的使用方法即可参与到代码实现中。

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

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

相关文章

JAVA刷题之数组的总结和思路分享

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

荔枝FM语音批量下载

动机 最近想下载一下自己在蜻蜓FM上上传的音频&#xff0c;发现不支持批量下载。于是去找了一些下载器&#xff0c;万万没想到&#xff0c;该下载器只能下载前十条&#xff0c;再下要注册&#xff0c;注册费5元。尼玛&#xff0c;不能忍。本来就不是太难的技术&#xff0c;还搞…

HarmonyOS应用开发——页面

我们将对于多页面以及更多有趣的功能展开叙述&#xff0c;这次我们对于 HarmonyOS 的很多有趣常用组件并引出一些其他概念以及解决方案、页面跳转传值、生命周期、启动模式&#xff08;UiAbility&#xff09;&#xff0c;样式的书写、状态管理以及动画等方面进行探讨 页面之间…

探索Python的神奇力量:详解setattr函数的使用教程

概要&#xff1a; 在Python这个强大而灵活的编程语言中&#xff0c;有许多函数可以帮助开发者实现各种各样的任务。其中一个非常有用且功能强大的函数是setattr函数。setattr函数允许我们在运行时动态地设置对象的属性值&#xff0c;这为我们的代码增加了灵活性和扩展性。本文…

mvc模式test

项目结构 Book.java package beans; public class Book {private Integer id;private String name;private double price;public Integer getId() {return id;}public void setId(Integer id) {this.id id;}public String getName() {return name;}public void setName(Strin…

申请SSL证书的步骤

一&#xff1a;首先确定自己所需要的证书类型 1&#xff1a;小微企业以及个人网站选择免费的DV证书是完全够用的。 2&#xff1a;中大型企业尤其是涉及到需要用户填写账户密码的建议OV及以上的证书。 3&#xff1a;根据适配范围确认需要的是单域名&#xff0c;多域名&#xff0…

python安装与配置:在centos上使用shell脚本一键安装

介绍 Python是一种功能强大且广泛使用的编程语言&#xff0c;但在某些情况下&#xff0c;您可能需要安装和配置特定版本的Python。本教程将向您展示如何使用一个Shell脚本自动完成这个过程&#xff0c;以便您可以快速开始使用Python 3。 使用shell自动化安装教程 1. 复制脚本…

java:spring-boot-starter-actuator的使用

简介 Spring Boot Actuator 是 Spring Boot 提供的一个功能强大的模块&#xff0c;用于监控和管理您的应用程序。它为开发人员和运维团队提供了许多有用的端点&#xff0c;用于获取有关应用程序运行时状态的信息。 什么是端点&#xff1f; "端点"是指提供了某种功能…

C++作业6

以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a; 比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&#xff0c;动物园里有一位讲解员&…

关于对Spring事件监听机制相关解析

1、Spring事件监听器使用 Spring事件监听体系包括三个组件&#xff1a;事件、事件监听器&#xff0c;事件广播器 事件&#xff1a;定义事件类型和事件源&#xff0c;需要继承ApplicationEvent import org.springframework.context.ApplicationEvent; public class OrderEvent…

springcloud智慧工地管理平台源码(工程全生命周期管理)

智慧工地采用全新的工程全生命周期管理理念&#xff0c;以物联网技术为核心&#xff0c;利用传感网络、远程视频监控、物联网、云计算等新型技术&#xff0c;依托移动和固定宽带网络&#xff0c;围绕施工过程管理&#xff0c;建造互联协同、智能生产、科学管理的信息化生态圈&a…

Python源码分享10:使用海龟画图turtle画哆啦A梦

turtle模块是一个Python的标准库之一&#xff0c;它提供了一个基于Turtle graphics的绘图库。Turtle graphics是一种流行的绘图方式&#xff0c;它通过控制一个小海龟在屏幕上移动来绘制图形。 turtle模块可以让您轻松地创建和控制海龟图形&#xff0c;从而帮助您学习Python编…

虚拟网络技术:bond技术

网卡bond也称为网卡捆绑&#xff0c;就是将两个或者更多的物理网卡绑定成一个虚拟网卡。 bond的作用&#xff1a; 1.提高网卡的吞吐量 2.增加网络的高可用&#xff0c;实现负载均衡。 一、bond简介 bond技术即bonding&#xff0c;能将多块物理网卡绑定到一块虚拟网卡上&…

AMEYA360--罗姆与Quanmatic公司利用量子技术优化制造工序并完成验证

全球知名半导体制造商罗姆(总部位于日本京都市)于2023年1月起与 Quanmatic Inc.(总部位于日本东京都新宿区&#xff0c;以下简称“Quanmatic”)展开合作&#xff0c;在半导体制造工序之一的EDS工序中测试并引入量子技术&#xff0c;以优化制造工序中的组合。目前&#xff0c;双…

springMVC实验(五)——数据校验

【知识要点】 数据校验的概念 在软件开发过程中&#xff0c;数据校验是非常重要的环节&#xff0c;用于确保数据的有效性和完整性 。数据校验分为客户端验证和服务端验证&#xff0c;客户端验证是确保人机交互过程中用户操作表单过程中的误操作&#xff0c;由JavaScript代码完…

Geoserver发布2000坐标系遇到的问题总结

在Geoserver上发布2000坐标系的服务时&#xff0c;要想正常发布服务&#xff0c;不仅仅是要涉及2000坐标系&#xff0c;还需要在发布的时候选择对坐标系。具体问题描述如下&#xff1a; 1.问题描述&#xff1a; 在发布好2000坐标系的服务后&#xff0c;在超图的平台加载服务时&…

联合基于信息论的安全和隐蔽通信的框架

这个标题很帅 abstractintroductionsystem modelPROPOSED JOINT OPTIMIZATION OF ITS AND COVERT TRANSMISSION RATE信息论安全 &#xff08;ITS&#xff09; Joint Information-Theoretic Secrecy and Covert Communication in the Presence of an Untrusted User and Warden …

根文件系统中文字符测试

一. 简介 本文在之前制作的根文件系统可以正常运行的基础上进行的&#xff0c;继上一篇文章地址如下&#xff1a; 根文件系统初步测试-CSDN博客 本文测试根文件系统的是否可以支持中文字符。 二. 根文件系统中文字符测试 1. 创建中文文件 打开 ubuntu虚拟机&#xff0c;进…

uniapp-hubildx配置

1.配置浏览器 &#xff08;1&#xff09;运行》运行到浏览器配置》配置web服务器 &#xff08;2&#xff09;选择浏览器安装路径 &#xff08;3&#xff09;浏览器安装路径&#xff1a; &#xff08;3.1&#xff09; 右键点击图标》属性 &#xff08;3.2&#xff09;选择目标&…

计算机组成原理-数据寻址-(相对寻址 基址寻址 变址寻址 )

文章目录 指令寻址vs数据寻址总览偏移寻址基址寻址基址寻址的作用变址寻址变址寻址的作用基址&变址复合寻址相对寻址相对寻址的作用 总结硬件如何实现数的比较 指令寻址vs数据寻址 总览 偏移寻址 变址寄存器&#xff1a;IX 基址寄存器&#xff1a;BR 基址寻址 没有基址…