性能监控之 Java Metrics 度量包

简介: 【6月更文挑战10天】标题性能监控之 Java Metrics 度量包

一、前言

前几天因为需要,折腾了一下 Java Metrics。发现之前的文章中并没有写过这个。

本着要把所有看到的性能相关的话题都要涉及的目的,在这里也要写一下。

二、简介

Metrics的官网首页简单的很,里面只有这么段描述:

Metrics is a Java library which gives you unparalleled insight into what your code does in production.
Metrics provides a powerful toolkit of ways to measure the behavior of critical components in your production environment.With modules for common libraries like Jetty, Logback, Log4j, Apache HttpClient, Ehcache, JDBI, Jersey and reporting backends like Graphite, Metrics provides you with full-stack visibility.

也就是说这个工具包可以让你在生产环境中产生度量的一些数据,并且支持不同的输出方式。

它可以度量代码中关键组件,响应时间、计数器等都可以采集,也可以取操作系统信息。

它的基本类型有如下几种:

在这里插入图片描述

看下官网的文档结构,就知道它能干多少事了,英文不错的,可以看下 https://metrics.dropwizard.io/4.0.0/

三、举例说明

来看一个 Meter 的例子:

/**
    * Meter
    * 作用:度量速率(例如,tps)
    * Meters会统计最近1分钟(m1),5分钟(m5),15分钟(m15),还有全部时间的速率(速率就是平均值)。
    */

public class TestMeter {
   
    public static void main(String[] args) throws InterruptedException {
   

        /**
        * 实例化一个MetricRegistry,是一个metrics的容器,维护一个MAP
        */

        final MetricRegistry registry = new MetricRegistry();  //因为该类的一个属性final ConcurrentMap<String, Metric> metrics,在实际使用中做成单例就好

        /**
            * 实例化ConsoleReporter,输出
        */

        ConsoleReporter reporter = ConsoleReporter.forRegistry(registry)
                .convertRatesTo(TimeUnit.SECONDS)
                .convertDurationsTo(TimeUnit.MILLISECONDS)
                .build();
        reporter.start(3, TimeUnit.SECONDS);   //从启动后的3s后开始(所以通常第一个计数都是不准的,从第二个开始会越来越准),每隔3秒从MetricRegistry钟poll一次数据

        //实例化一个Meter并注册到容器中去
        Meter meterTps = registry.meter(MetricRegistry.name(TestMeter.class, "request", "tps"));  //将该Meter类型的指定name的metric加入到MetricsRegistry中去
        System.out.println("执行与业务逻辑");

        //模拟数据
        while (true) {
   
            meterTps.mark();   //总数以及m1,m5,m15的数据都+1
            Thread.sleep(500);
        }
    }
}

上面完整的示例代码都有注释,就不一一解释了。输出如下:

-- Meters ----------------------------------------------------------------------
com.zee.metrics.zeemetrics.TestMeter.request.tps
                count = 12
            mean rate = 2.00 events/second
        1-minute rate = 2.00 events/second
        5-minute rate = 2.00 events/second
    15-minute rate = 2.00 events/second

这就可以统计这个请求在这段时间内访问了多少次,也就是 TPS。但是也不能老在 console 里看呀。

还是放到图形化的界面中看比较好,这里用的是 influxDB+Grafana,在 influxDB 中创建一个 database。

[gaolou@7dgroup2 ~]$ influx
Connected to http://localhost:8086 version 1.6.0
InfluxDB shell version: 1.6.0
> create database mydb;
> use mydb;
Using database mydb
> show MEASUREMENTS
>

其中的 MEASUREMENTS 是空的。

把数据输出进去。

@Bean
public Meter requestMeter(MetricRegistry metrics) {
   
    return metrics.meter("request");
}

@Bean(name = "influxdbReporter")
public ScheduledReporter influxdbReporter(MetricRegistry metrics) throws Exception {
   
    return InfluxdbReporter.forRegistry(metrics)
            .protocol(InfluxdbProtocols.http("1.1.1.1", 8086, "admin", "admin", "mydb"))
            .convertRatesTo(TimeUnit.SECONDS)
            .convertDurationsTo(TimeUnit.MILLISECONDS)
            .filter(MetricFilter.ALL)
            .skipIdleMetrics(false)
            .build();
}

select * from request 就看到产生了如下内容。
image.png

再配置下 grafana 中的 data source
image.png
在 dashboard 中加下 panel,选择 influxdb 数据源,看到列表,选择想要看的数据表,再在 field 中选择想要看的列,保存。
image.png

然后在 dashboard 里就可以看到数据了。

image.png

四、总结

这个逻辑,在操作中并不困难。但是,从我自己的行业经验上来看。在研发时就让他们把要看到的数据做好监控的规划,最后运维时能如此清晰地展示出来,并最终对判断生产问题有用,这个过程的沟通成功会非常的高。

主要是看公司的组织结构是什么样,如果是全栈的结构会比较容易

如果是研发运维是分开的团队,并且相互配合的不好,会相当的痛苦。

在之前的项目中,有运维问我怎么才能监控到业务性能,我想了下那个公司的背景之后,沉吟良久说了声:难。

性能可做的东西并不少,前提是看格局有多大。

目录
相关文章
|
3月前
|
安全 Java API
JAVA并发编程JUC包之CAS原理
在JDK 1.5之后,Java API引入了`java.util.concurrent`包(简称JUC包),提供了多种并发工具类,如原子类`AtomicXX`、线程池`Executors`、信号量`Semaphore`、阻塞队列等。这些工具类简化了并发编程的复杂度。原子类`Atomic`尤其重要,它提供了线程安全的变量更新方法,支持整型、长整型、布尔型、数组及对象属性的原子修改。结合`volatile`关键字,可以实现多线程环境下共享变量的安全修改。
|
4月前
|
安全 Java 调度
解锁Java并发编程高阶技能:深入剖析无锁CAS机制、揭秘魔法类Unsafe、精通原子包Atomic,打造高效并发应用
【8月更文挑战第4天】在Java并发编程中,无锁编程以高性能和低延迟应对高并发挑战。核心在于无锁CAS(Compare-And-Swap)机制,它基于硬件支持,确保原子性更新;Unsafe类提供底层内存操作,实现CAS;原子包java.util.concurrent.atomic封装了CAS操作,简化并发编程。通过`AtomicInteger`示例,展现了线程安全的自增操作,突显了这些技术在构建高效并发程序中的关键作用。
77 1
|
1月前
|
Java Android开发
Eclipse 创建 Java 包
Eclipse 创建 Java 包
33 1
|
2月前
|
Java Apache Maven
Java/Spring项目的包开头为什么是com?
本文介绍了 Maven 项目的初始结构,并详细解释了 Java 包命名惯例中的域名反转规则。通过域名反转(如 `com.example`),可以确保包名的唯一性,避免命名冲突,提高代码的可读性和逻辑分层。文章还讨论了域名反转的好处,包括避免命名冲突、全球唯一性、提高代码可读性和逻辑分层。最后,作者提出了一个关于包名的问题,引发读者思考。
Java/Spring项目的包开头为什么是com?
|
3月前
|
Java API 数据处理
Java 包(package)的作用详解
在 Java 中,包(package)用于组织和管理类与接口,具有多项关键作用:1)系统化组织代码,便于理解和维护;2)提供命名空间,避免类名冲突;3)支持访问控制,如 public、protected、默认和 private,增强封装性;4)提升代码可维护性,实现模块化开发;5)简化导入机制,使代码更简洁;6)促进模块化编程,提高代码重用率;7)管理第三方库,避免命名冲突;8)支持 API 设计,便于功能调用;9)配合自动化构建工具,优化项目管理;10)促进团队协作,明确模块归属。合理运用包能显著提升代码质量和开发效率。
230 4
|
3月前
|
Java 数据安全/隐私保护
Java 包(package)的使用详解
Java中的包(`package`)用于组织类和接口,避免类名冲突并控制访问权限,提升代码的可维护性和可重用性。通过`package`关键字定义包,创建相应目录结构即可实现。包可通过`import`语句导入,支持导入具体类或整个包。Java提供多种访问权限修饰符(`public`、`protected`、`default`、`private`),以及丰富的标准库包(如`java.lang`、`java.util`等)。合理的包命名和使用对大型项目的开发至关重要。
195 2
|
4月前
|
JavaScript Java API
Java日志通关(二) - Slf4j+Logback 整合及排包
作者日常在与其他同学合作时,经常发现不合理的日志配置以及五花八门的日志记录方式,后续作者打算在团队内做一次Java日志的分享,本文是整理出的系列文章第二篇。
|
4月前
|
Java Maven 数据库
|
4月前
|
Java
Java应用结构规范问题之在biz层的convert包实现转换的问题如何解决
Java应用结构规范问题之在biz层的convert包实现转换的问题如何解决
|
4月前
|
Java
Java 基础语法-面试题(54-63道)(数组+类+包)
Java 基础语法-面试题(54-63道)(数组+类+包)
49 16