JMX

Wesley13
• 阅读 757

最近在看flume的监控源码,发现flume的监控metrics是存放在MBean中,再由web服务暴露到其他监控系统中。这次又get到了一个新知识点,今天给大家分享一下。

什么是JMX和MBean?

    JMX(Java管理扩展)提供了一种简单的、基础的方法,用来管理诸如应用、设备和服务等资源。由于JMX技术是动态的,你可以使用JMX技术来监控和管理处于创建、安装和运行态的资源。你甚至可以使用JMX技术监控和管理Java虚拟机。我们通过一些监控程序获取到当前JVM的一些状态值,就是通过mbean暴露。下面的内存统计可以查看实时的堆内存使用量。

JMX

    MBean是一个被管理的Java对象,它遵从JMX规范。MBean可以表示设备、应用或者任何需要被管理的资源。

MBeans暴露如下管理接口:

  • 一组可读或者可写属性,通过可写属性可以从外部操作JVM里面的行为,例如执行GC。
  • 一组调用方法。
  • 自我描述。

例如下面的mbean,可以操作JVM 的GC

JMX

如何使用MBean

下面通过一个实例,介绍怎么向JMX注册MBean。

按照约定,MBean接口的名称由其实现类名+MBean后缀组成。根据JMX规范,MBean接口由属性(可读getter方法或者可写setter方法)和操作(暴露的方法)组成。

下面代码将定义一个channel的指标MBean,获取启动时间、结束时间、连接数

public interface ChannelMetricsMBean {
    long getStartTime();

    long getStopTime();

    long getConnectionCount();
}

public class ChannelMetrics implements ChannelMetricsMBean {

    private AtomicLong counter = new AtomicLong(0);

    private long startTime = 0;
    private long stopTime = 0;

    public void start() {
        // to do init
        startTime = System.currentTimeMillis();
    }

    public void stop() {
        stopTime = System.currentTimeMillis();
    }

    public void addConnectionCount() {
        counter.incrementAndGet();
    }

    @Override
    public long getStartTime() {
        return startTime;
    }

    @Override
    public long getStopTime() {
        return stopTime;
    }

    @Override
    public long getConnectionCount() {
        return counter.get();
    }
}

将mbean注册到 JMX

public class MBeanMain {
    public static void main(String[] args) throws MalformedObjectNameException, NotCompliantMBeanException, InstanceAlreadyExistsException, MBeanRegistrationException {

        MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();

        // 注册被管理的对象
        ObjectName objectName = new ObjectName("test.mbean.channel:type=test1");
        ChannelMetrics channelMetrics = new ChannelMetrics();
        mBeanServer.registerMBean(channelMetrics, objectName);

        runMonitor(channelMetrics);

        try {
            Thread.sleep(1000000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private static void runMonitor(ChannelMetrics channelMetrics) {
        channelMetrics.start();

        //每10秒添加一个连接
        ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
        executorService.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                System.out.println("add one connection");
                channelMetrics.addConnectionCount();
            }
        }, 1, 10, TimeUnit.SECONDS);

    }
}

我们可以通过jconsole看下效果

JMX

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
JMX04
通过客户端连接进行远程访问连接:1.声明一个JMX服务地址;2.创建一个JMX连接器;3.通过JMX连接器连接JMX服务地址,获得一个与MBeanServer的连接。!(https://oscimg.oschina.net/oscnet/upd53396535b9a6e0a0efe34b6308bac4ed4f.png)
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
JMX01
JMX(JavaManagementExtensions)是一个为应用程序植入管理功能的框架。JMX是一套标准的代理和服务,用户可以在任何Java应用程序中使用这些代理和服务实现对应用程序的管理。这是官方文档上的定义。中间件软件WebLogic的管理页面就是基于JMX开发的,而JBoss则整个系统都基于JMX构架。我看过很多次也无法很好的理解。我个人
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Spring Boot 监控和管理生产环境
springbootactuator模块提供了一个监控和管理生产环境的模块,可以使用http、jmx、ssh、telnet等拉管理和监控应用。审计(Auditing)、健康(health)、数据采集(metricsgathering)会自动加入到应用里面。首先,写一个最基本的springboot项目。基于Maven的项目添加‘starte
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这