(转过来,源地址:http://www.jmatrix.org/notes/1067.html)

近期心血来潮。想能否够通过添加一个tomcat的扩展,来持续收集tomcatserver本身的性能信息。如线程池的各项数据,请求数等等,这样能够配合业务方面的监控,能够更方便的分析调整tomcat配置,以提供更好的服务。

这样也不须要每次通过连接jmx去观察数据,并且idc环境要开启jmx。还得涉及各种安全问题…….

Tomcat manager中StatusManagerServlet就是通过JMX提供了Tomcat服务的当前状态信息。我也会“抄袭”这里的代码来收集server数据。

要想定时的收集Tomcat的数据,须要在tomcat启动过程中,启一个定时任务去不停的收集服务信息,之后依据自己的须要,看是通过写日志方式保存。还是上报,抑或其他方式。

要做到不侵入tomcat本身源代码。能够选择通过Listener的方式,实现一个自己定义Listener,监听服务启动事件,启动数据採集任务。定时收集数据,如:

public class ServerInfoMonitorLifecycleListener implementsLifecycleListener {

      private ServerInfoCollection collect = new ServerInfoCollection();

      @Override
public void lifecycleEvent(LifecycleEvent event ) {
Lifecycle lifecycle = event .getLifecycle();
if (Lifecycle.AFTER_START_EVENT .equals(event .getType())
&& lifecycle instanceof Server) {
collect.startMonitor();
}
if (Lifecycle.BEFORE_STOP_EVENT .equals(event .getType())
&& lifecycle instanceof Server) {
collect.stopMonitor();
}
}
}

这里监控的是Server的启动事件,须要注意。假设你想监控其他container,如host。context等。则配置listener的时候须要放到相应的container。大多数情况下。我们还是习惯配置在Server这一级别,确实在Server这一级别是最方便的。

Tomcat本身的个别listener。想监听host,context等的事件是通过监听到Server事件的时候依次对server以下的host,context等加入listener。

有了定时收集tomcat数据的定时任务,以下就是数据的收集了。

首先得先获取须要的Mbean。如:

// Retrieve the MBean server
mBeanServer = Registry.getRegistry( null , null ).getMBeanServer(); try {
// Query Thread Pools
threadPools .clear();
String onStr = "*:type=ThreadPool,*" ;
ObjectName objectName = new ObjectName(onStr );
Set set = mBeanServer .queryMBeans( objectName, null );
Iterator iterator = set .iterator();
while (iterator .hasNext()) {
ObjectInstance oi = iterator.next();
threadPools .addElement(oi .getObjectName());
} // Query Global Request Processors
globalRequestProcessors .clear();
onStr = "*:type=GlobalRequestProcessor,*" ;
objectName = new ObjectName( onStr);
set = mBeanServer .queryMBeans(objectName , null );
iterator = set.iterator();
while (iterator .hasNext()) {
ObjectInstance oi = iterator.next();
globalRequestProcessors .addElement(oi .getObjectName());
} } catch (Exception e ) {
log.error( "init failed." , e );
}

通过Mbean获取tomcat性能数据:

Enumeration enumeration = threadPools .elements();
while (enumeration .hasMoreElements()) {
ObjectName objectName = enumeration .nextElement();
String name = objectName .getKeyProperty("name" ); ServerInfo serverInfo = new ServerInfo();
serverInfo .setMaxThreads((Integer) mBeanServer .getAttribute(
objectName , "maxThreads" ));
serverInfo .setCurrentThreadCount((Integer) mBeanServer
.getAttribute( objectName ,"currentThreadCount" ));
serverInfo .setCurrentThreadsBusy((Integer) mBeanServer
.getAttribute( objectName ,"currentThreadsBusy" ));
try {
Object value = mBeanServer .getAttribute(objectName ,
"keepAliveCount" );
serverInfo .setKeepAliveCount((Integer) value );
} catch (Exception e ) {
// Ignore
} ObjectName grpName = null ;
Enumeration reqEnumer =globalRequestProcessors
.elements();
while (reqEnumer .hasMoreElements()) {
ObjectName reqObjName = reqEnumer .nextElement();
if (name .equals(reqObjName .getKeyProperty( "name"))) {
grpName = reqObjName ;
}
} if (grpName == null) {
return ;
} serverInfo .setMaxTime((Long) mBeanServer .getAttribute(grpName ,
"maxTime" ));
serverInfo .setProcessingTime((Long) mBeanServer .getAttribute(
grpName, "processingTime" ));
serverInfo .setRequestCount((Integer) mBeanServer .getAttribute(
grpName, "requestCount" ));
serverInfo .setErrorCount((Integer) mBeanServer .getAttribute(
grpName, "errorCount" ));
serverInfo .setBytesReceived((Long) mBeanServer .getAttribute(
grpName, "bytesReceived" ));
serverInfo .setBytesSent((Long) mBeanServer .getAttribute(
grpName, "bytesSent" )); store.storeInfo( serverInfo ); }

在server.xml配置好自己定义的listener,启动tomcat,便能够看到收集到的数据。如(这里为了測试。收集到的数据直接写日志):

ServerInfo:maxThreads:200,currentThreadCount:16,busyThreadCount:6,keepAliveCount:0,maxTime:6166,requestCount:57,errorCount:0,processTime:10380,bytesRec:0,bytesSend:238874

当然。还有非常多其他的信息能够收集。看详细须要。

另外。还能够借助Value链条,编写自己的Value来上报请求处理时间,异常情况等等。

基础的代码可在github上看看:https://github.com/jjmatrix/tomcat-extension

相关的内容:

Tomcat源代码走读1:从何開始

Tomcat源代码走读2:启动过程

Tomcat源代码走读5:请求处理

Tomcat源代码走读——内存泄露检測

Tomcat扩展——监控的更多相关文章

  1. Jmeter-----图形扩展监控

    Jmeter----图形扩展监控 监听器中插件安装成功如下图: 安装步骤: 1.  下载JMeterPlugins-Extras与JMeterPlugins-Standard,解压缩后在他们各自的\l ...

  2. zabbix实现对tomcat的监控

    zabbix实现对tomcat的监控 工作原理 比如:当Zabbix-Server需要知道java应用程序的某项性能的时候,会启动自身的一个Zabbix-JavaPollers进程去连接Zabbix- ...

  3. Windows下tomcat进程监控批处理程序

    在Windows下tomcat进程监控批处理程序脚本如下: @echo off ::tomcat安装目录 set _tomcatDir=E:\myFiles\apache-tomcat-8.5.31 ...

  4. php使用inotify扩展监控文件或目录,如果发生改变,就执行指定命令

    通过inotify扩展监控文件或目录的变化,如果发生变化,就执行命令. 可以应用于 swoole 中,如果文件发生变化,就执行 kill -USR1 进程PID 来实现热更新. <?php cl ...

  5. Tomcat zabbix监控、jmx监控、zabbix_java_gateway

    几种方式监控tomcat,如标题. 下面就是参考的网上的连接.自己可以试一下. 由于牵扯到jvm的很多东西, 在这里就只是粘贴处连接参考. http://www.cnblogs.com/chrisDu ...

  6. abbix通过JMX监控Tomcat(被监控端安装Tomat的服务器防火墙策略iptables配置)

    原文地址:http://jaychang.iteye.com/blog/2214830 一.目前的环境 被监控端192.168.153.191 /usr/local/tomcat 下载了catalin ...

  7. Tomcat性能监控之Probe

    目前采用java进行开发的系统居多,这些系统运行在java容器中,通过对容器的监控可以了解到java进程的运行状况,分析java程序问题.目前市面上流行的中间件有很多(Tomcat.jetty.jbo ...

  8. Tomcat性能监控

    Tomcat性能监控工具很多,这里介绍两种1.JMeter 2.probe,使用这两种工具都需要在tomcat的安装目录/conf/tomcat-users.xml添加 <tomcat-user ...

  9. Tomcat 性能监控及调优

    1.性能监控 方式1: /usr/local/tomcat7/conf/tomcat-users.xml 添加如下: <role rolename="manager-gui" ...

随机推荐

  1. IP Address

    http://poj.org/problem?id=2105 #include<stdio.h> #include<string.h> int main() { ]; ] = ...

  2. java Collection接口

    Collection 1——————Set子接口:无序,不允许重复. 2——————List子接口:有序,允许重复. Set和List对比: 1.set:检索元素的效率比较低,删除和插入效率比较高,删 ...

  3. JavaScript表格搜索高亮功能模拟

    在网页表格中模拟excle的搜索高亮显示功能.当在搜索框中输入需要的姓名时,若表格中存在对应的数据,则该表格背景色变为黄色. 下面为表的HTML源码: <!doctype html> &l ...

  4. ROS-URDF-Gazebo

    前言:在gazebo里运行urdf文件 一.安装教程包 cd ~/catkin_test/srcgit clone https://github.com/ros/urdf_sim_tutorial.g ...

  5. web 应用

    一.web应用 web应用程序是一种可以通过web访问的应用程序,程序 的最大好处是用户很容易访问应用程序,用户只需要有浏览器 即可,不需要安装其他团建,用用程序有两种模式C/S.B/S.C/S是客户 ...

  6. 5、scala数组转换

    1.使用yield和函数式编程转换数组 2.算法案例:移除第一个负数之后的所有负数 1.使用yield和函数式编程转换数组 使用yield进行数组转换 结合if守卫,仅转换需要转换的元素 使用函数式编 ...

  7. dubbo之异步调用

    异步调用 基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小. 在 consumer.xml 中配置: <dubbo:reference ...

  8. (转)基于Metronic的Bootstrap开发框架经验总结(3)--下拉列表Select2插件的使用

    http://www.cnblogs.com/wuhuacong/p/4761637.html 在上篇<基于Metronic的Bootstrap开发框架经验总结(2)--列表分页处理和插件JST ...

  9. " \t\r\n\f"是什么意思

    空格字符 \t 制表符 \r 回车符 \n 换行符 \f 换页符

  10. js数组操作find查找特定值结合es6特性

    js数组操作find查找特定值结合es6特性