mongo-java应用监控

来源:互联网 发布:mac管理安卓手机助手 编辑:程序博客网 时间:2024/06/14 22:45

近期项目中需要监控mongo驱动的线程池的信息。
类似mysql中有类型Druid 可以监控数据库的线程池

参考mongo-driver驱动的文档:

http://mongodb.github.io/mongo-java-driver/3.0/driver/reference/management/logging/

http://mongodb.github.io/mongo-java-driver/3.0/driver/reference/management/monitoring/

文档上说明 有通过日志监控 和通过jmx的mbean进行监控
我们这里采用mbean监控

MonitoringThe driver uses JMX to create MXBeans that allow an application or end user to monitor various aspects of the driver.The driver creates MXBean instances of a single type: ConnectionPoolStatisticsMBean. The driver registers one ConnectionPoolStatisticsMBean instance per each server it connects to. For example, in the case of a replica set, the driver creates an instance per each non-hidden member of the replica set.Each MXBean instance is required to be registered with a unique object name, which consists of a domain and a set of named properties. All MXBean instances created by the driver are under the domain "org.mongodb.driver". Instances of ConnectionPoolStatisticsMBean will have the following properties:clusterId: a client-generated unique identifier, required to ensure object name uniqueness in situations where an application has multiple MongoClient instances connected to the same MongoDB server deploymenthost: the host name of the serverport: the port on which the server is listeningminSize: the minimum allowed size of the pool, including idle and in-use membersmaxSize: the maximum allowed size of the pool, including idle and in-use memberssize: the current size of the pool, including idle and and in-use memberswaitQueueSize: the current size of the wait queue for a connection from this poolcheckedOutCount: the current count of connections that are currently in use

谷歌上对应的翻译

监控驱动程序使用JMX创建允许应用程序或最终用户监视驱动程序各个方面的MXBean。驱动程序创建单个类型的MXBean实例:ConnectionPoolStatisticsMBean。驱动程序为每个连接的服务器注册一个ConnectionPoolStatisticsMBean实例。例如,在副本集的情况下,驱动程序为副本集合中的每个非隐藏成员创建一个实例。每个MXBean实例都需要注册一个唯一的对象名称,它由一个域和一组命名的属性组成。由驱动程序创建的所有MXBean实例都位于域“org.mongodb.driver”下。 ConnectionPoolStatisticsMBean的实例将具有以下属性:clusterId:客户端生成的唯一标识符,用于在应用程序将多个MongoClient实例连接到相同的MongoDB服务器部署的情况下确保对象名称唯一性主机:服务器的主机名port:服务器正在侦听的端口minSize:池的最小允许大小,包括空闲和使用中的成员maxSize:池的最大允许大小,包括空闲和正在使用的成员size:池的当前大小,包括空闲和正在使用的成员waitQueueSize:此池连接的等待队列的当前大小checkedOutCount:当前正在使用的连接的当前计数

这里可以需要运用到jconsole 和jmx的知识。

首先创建一个监控日志的核心代码
LogTask.java

package com.test.task;import org.apache.log4j.Logger;import javax.management.AttributeList;import javax.management.MBeanServer;import javax.management.ObjectInstance;import javax.management.ObjectName;import java.lang.management.ManagementFactory;import java.util.Set;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;public class LogTask {    private int initialDelay = 3;    private int period = 3;    private Logger logger = Logger.getLogger(LogTask.class);    private MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();    public void init() {        logger.info("初始化mongo线程池监控日志");        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);        scheduledThreadPool.scheduleAtFixedRate(new Runnable() {            public void run() {                try {                    Set<ObjectInstance> set = mbeanServer.queryMBeans(new ObjectName("org.mongodb.driver:type=ConnectionPool,*"), null);                    for (ObjectInstance oi : set) {                        String className = oi.getClassName();                        if (className.contains("mongo")) {                            ObjectName objectName = oi.getObjectName();                            logger.info(objectName);                            String[] attrs = new String[]{"CheckedOutCount", "Host", "Port",                                    "MinSize", "MaxSize", "Size", "WaitQueueSize"};                            for (String attr : attrs) {                                logger.info(attr + "==" + mbeanServer.getAttribute(objectName, attr));                            }                        }                    }                } catch (Exception e) {                    e.printStackTrace();                    logger.error("执行日志打印失败", e);                }            }        }, initialDelay, period, TimeUnit.SECONDS);    }    public int getInitialDelay() {        return initialDelay;    }    public void setInitialDelay(int initialDelay) {        this.initialDelay = initialDelay;    }    public int getPeriod() {        return period;    }    public void setPeriod(int period) {        this.period = period;    }}

这里参考springMVC的代码
http://download.csdn.net/detail/u010050904/9899194