首页 > 系统相关 >怎样监控java进程?

怎样监控java进程?

时间:2023-02-15 13:57:36浏览次数:37  
标签:jmx java TestMetrics rate metrics second 监控 进程 events

1问题

怎样实现对自己编写的java程序的监控?比如说想知道:

  • 请求的tps
  • jvm的内存信息,线程信息
  • 线程池的使用情况等。
  • 某段代码的执行时间

常用方法就是埋点,通过代理减小业务的侵入性(如是spring下的aop)。这种埋点一般有两种方式,

  • 直接借助第三方组件实现指标监控,如prometheus,聚合类统计指标需要自己管理实现。
  • 另一种方式是直接使用java自带的jmx。

 

2 jmx介绍

JMX 全称为 Java Management Extensions,翻译过来就是 Java 管理扩展,用来管理和监测 Java 程序。最常用到的就是对于 JVM 的监测和管理,比如 JVM 内存、CPU 使用率、线程数、垃圾收集情况等等。另外,还可以用作日志级别的动态修改,比如 log4j 就支持 JMX 方式动态修改线上服务的日志级别。最主要的还是被用来做各种监控工具,比如 Spring Boot Actuator、JConsole、VisualVM 等。更多的jmx介绍可自行搜索。 利用metrics工具包和jmx可以很方便的实现java程序的监控逻辑。   3 java metrics工具包 git:https://github.com/dropwizard/metrics 官网(4.2.0版本):https://metrics.dropwizard.io/4.2.0/   官方介绍如下: 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. 也就是说这个工具包可以让你在生产环境中产生度量的一些数据,并且支持不同的输出方式。   下面示例,通过metric统计程序近1分钟,5分钟,15分钟的tps三个指标 maven pom坐标
        <dependency>
            <groupId>io.dropwizard.metrics</groupId>
            <artifactId>metrics-core</artifactId>
            <version>4.2.16</version>
        </dependency>

测试代码如下

public class TestMetrics {
    final static MetricRegistry register = new MetricRegistry();

    public static void main(String[] args) throws Exception{
        TestMetrics testMetrics = new TestMetrics();
        testMetrics.test();
    }

    public void test() throws Exception{
        ConsoleReporter reporter = ConsoleReporter.forRegistry(register)
                .convertRatesTo(TimeUnit.SECONDS)
                .convertDurationsTo(TimeUnit.MILLISECONDS)
                .build();
        reporter.start(3, TimeUnit.SECONDS);
        Meter meter = register.meter(MetricRegistry.name(TestMetrics.class, "request", "tps"));

        while(true) {
            meter.mark();
            Thread.sleep(500);
        }
    }
}

第一步先初始化一个MetricRegistry,注册器可以全局唯一做成单例

第二步初始化Reporter用于输出指标,可以控制打印频率等。这里定义了ConsoleReporter,也就是说指标将会打到控制台,3秒输出一次。

第三步定义meter类型的指标,用于度量某个时间段的平均处理次数。

最后通过while循环模拟每500ms一个请求。

输出:

23-2-15 12:25:42 ===============================================================

-- Meters ----------------------------------------------------------------------
com.ouym.study.jmx.TestMetrics.request.tps
             count = 6
         mean rate = 1.99 events/second
     1-minute rate = 0.00 events/second
     5-minute rate = 0.00 events/second
    15-minute rate = 0.00 events/second


23-2-15 12:25:45 ===============================================================

-- Meters ----------------------------------------------------------------------
com.ouym.study.jmx.TestMetrics.request.tps
             count = 12
         mean rate = 1.99 events/second
     1-minute rate = 2.00 events/second
     5-minute rate = 2.00 events/second
    15-minute rate = 2.00 events/second


23-2-15 12:25:48 ===============================================================

-- Meters ----------------------------------------------------------------------
com.ouym.study.jmx.TestMetrics.request.tps
             count = 18
         mean rate = 1.99 events/second
     1-minute rate = 2.00 events/second
     5-minute rate = 2.00 events/second
    15-minute rate = 2.00 events/second

3秒打一次,除了第一次不准外,后面都是准确的。

当然,实际项目中我们不可能达到控制台观看,我们一般可以输出到jmx或者http,下面以reporter到jmx为例,需要引入metrics-jmx模块

       <dependency>
            <groupId>io.dropwizard.metrics</groupId>
            <artifactId>metrics-jmx</artifactId>
            <version>4.2.16</version>
        </dependency>

测试代码

public class TestMetrics {
    final static MetricRegistry register = new MetricRegistry();

    public static void main(String[] args) throws Exception{
        TestMetrics testMetrics = new TestMetrics();
        testMetrics.test();
    }

    public void test() throws Exception{
        JmxReporter reporter = JmxReporter.forRegistry(register)
                .convertRatesTo(TimeUnit.SECONDS)
                .convertDurationsTo(TimeUnit.MILLISECONDS)
                .build();
        reporter.start();
        Meter meter = register.meter(MetricRegistry.name(TestMetrics.class, "request", "tps"));

        while(true) {
            meter.mark();
            Thread.sleep(500);
        }
    }
}

打开jconsole可以看到MBean

 

 

 

Metrics工具包提供了4种类型的指标,上述实例使用的是meters类型

Gauge (计量器):统计瞬时状态的数据信息。

Counter(计数器):维护一个计数,每次提交都是往上累加

Meters(度量器):度量某个时间段的平均处理次数(request per second)

Histogram(直方图):统计数据的分布情况,最大值、最小值、平均值、中位数,百分比(75%、90%、95%、98%、99%和99.9%)。

Timers(计时器):统计某一块代码段的执行时间以及其分布情况,基于Histograms和Meters来实现的。

标签:jmx,java,TestMetrics,rate,metrics,second,监控,进程,events
From: https://www.cnblogs.com/ouym/p/17122522.html

相关文章

  • 重学Java-第七章 Java表达式、语句和块
    7.1表达式7.1.1定义 表达式是由数字、运算符、数字分组符号(括号)、自由变量和约束变量等以能求得数值的有意义排列方法所得的组合,约束变量是在表达式中已被指定数值,......
  • 重学Java-第九章 Java循环语句
    为什么要使用循环语句,例如要在控制台打印1到5,那么就是System.out.println("1");System.out.println("2");...这样就会存在以下问题:·不灵活:需求变更就需要逐行修改·......
  • 重学Java-第八章 Java条件语句
    8.1if语句8.1.1语法​ 当需要根据给定条件来决定是否执行一段代码时,就需要用到if语句了。if块仅在布尔表达式(if括号内的表达式)为true时执行。if块的结构如下:if(条......
  • java线程的interrup、tUninterruptibles.sleepUninterruptibly和sleep、wait
    参考:(1)https://blog.csdn.net/qq_36031640/article/details/116696685(2)https://blog.csdn.net/liuxiao723846/article/details/77882011一、线程的interrupted:一个......
  • 进程间通信
    6种方式:管道、消息队列、共享内存、信号量、信号、socket前提知识:每个进程都有自己的用户空间,而内核空间是每个进程共享的。因此进程之间想要进行通信,就需要通过内核来实......
  • javascript放在head和body的区别以及js文件加载带来的阻塞解决
    今天在看到菜鸟教程中的HTML中的Javascript脚本代码必须位于<script>与</script>标签之间。Javascript脚本代码可被放置在HTML页面的<body>和<head>部分中......
  • java File
     CreateTime--2017年10月31日10:14:24Author:Marydonjava操作File类importjava.io.File;1.创建一个文件方式一:语法:Filefile=newFile(absolutePath);说明:只传一个参数,......
  • java 下载网络图片
     java如何下载网络图片CreateTime--2017年9月30日11:18:19Author:Marydon说明:根据网络URL获取该网页上面所有的img标签并下载符合要求的所有图片所需jar包:jsoup.jarimport......
  • JAVA中的Comparable接口和自定义比较器
    Java中的自然排序自然排序定制排序自然排序TreeSet集合在存储数据时有一定的顺序,它会将一些数据进行比较,比较调用的是comparaTo()方法,该方法是在Comparable中定义的,自然排......
  • Java NIO:Buffer、Channel 和 Selector详解
    本来要一起介绍非阻塞IO和JDK7的异步IO的,不过因为之前的文章真的太长了,有点影响读者阅读,所以这里将它们放到另一篇文章中进行介绍。Buffer一个Buffer本质上是内存......