性能监控之 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

四、总结

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

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

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

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

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

目录
相关文章
|
24天前
|
druid Java Maven
杨校老师课堂之java_关于如何下载jar包的教程
杨校老师课堂之java_关于如何下载jar包的教程
43 0
|
3天前
|
监控 算法 Java
深入探索Java虚拟机:性能监控与调优实践
在面对日益复杂的企业级应用时,Java虚拟机(JVM)的性能监控和调优显得尤为重要。本文将深入探讨JVM的内部机制,分析常见的性能瓶颈,并提供一系列针对性的调优策略。通过实际案例分析,我们将展示如何运用现代工具对JVM进行监控、诊断及优化,以提升Java应用的性能和稳定性。
|
14天前
|
监控 负载均衡 Java
Java虚拟机调优技巧及性能监控
Java虚拟机调优技巧及性能监控
|
22天前
|
网络协议 Java 程序员
TCP/IP协议栈是网络通信基础,Java的`java.net`包提供工具,使开发者能利用TCP/IP创建网络应用
【6月更文挑战第23天】 **TCP/IP协议栈是网络通信基础,它包含应用层(HTTP, FTP等)、传输层(TCP, UDP)、网络层(IP)、数据链路层(帧, MAC地址)和物理层(硬件信号)。Java的`java.net`包提供工具,使开发者能利用TCP/IP创建网络应用,如Socket和ServerSocket用于客户端和服务器通信。**
31 3
|
29天前
|
Arthas 存储 监控
性能监控之常见 Java Heap Dump 方法
【6月更文挑战8天】性能监控之常见 Java Heap Dump 方法
45 7
|
28天前
|
存储 XML Java
探索Java常用的包:从核心到扩展
探索Java常用的包:从核心到扩展
24 3
|
28天前
|
监控 Java 数据安全/隐私保护
性能监控之 JMX 监控 Docker 容器中的 Java 应用
【6月更文挑战9天】性能监控之 JMX 监控 Docker 容器中的 Java 应用
422 1
|
13天前
|
监控 负载均衡 Java
Java虚拟机调优技巧及性能监控
Java虚拟机调优技巧及性能监控
|
1月前
|
存储 并行计算 Java
Java8中JUC包同步工具类深度解析(Semaphore,CountDownLatch,CyclicBarrier,Phaser)
Java8中JUC包同步工具类深度解析(Semaphore,CountDownLatch,CyclicBarrier,Phaser)
22 2
|
19天前
|
Java Maven
java运行jar包提示 “XXX中没有主清单属性”,配置maven插件
java运行jar包提示 “XXX中没有主清单属性”,配置maven插件
20 0