(转过来,源地址: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. LeetCode.5-最长回文子串(Longest Palindromic Substring)

    这是悦乐书的第342次更新,第366篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Medium级别的第3题(顺位题号是5).给定一个字符串s,找到s中最长的回文子字符串. 您可以假设s ...

  2. Scala学习1————scala开发环境搭建(windows 10)

    Scala开发环境搭建 先讲几点我学习scala的目的或者原因吧: JVM在企业中的霸主地位,Scala也是JVM上的语言,很有可能未来会从Java过度到Scala也不是不可能. 先进的函数式编程和面 ...

  3. asp.net限制了上传文件大小为..M,解决方法

    asp.net限制了上传文件大小为4M,在:在web.config里加下面一句,加在<System.web></System.web>之间如下:<system.web&g ...

  4. less 安装和webstorm的使用

    1.less 的安装 npm install -g less 2.less安装成功 3.less安装成功后,在webstorm中进行配置.file——>settings:弹出settings框, ...

  5. php基础知识 书写格式

    PHP,是英文超文本预处理语言Hypertext Preprocessor的递归缩写.PHP 是一种 HTML 内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本语言. php嵌入页面的标记有 ...

  6. WEB笔记-让HTML5向下兼容的策略

    //给新标签增加块级元素声明 article,aside,dialog,figure,fotter,header,legend,nav,section{display:block} //添加css兹瓷 ...

  7. VHDL之concurrent之block

    1 Simple BLOCK The simple block represents only a way of partitioning the code. It allows concurrent ...

  8. dubbo之本地调用

    本地调用 本地调用使用了 injvm 协议,是一个伪协议,它不开启端口,不发起远程调用,只在 JVM 内直接关联,但执行 Dubbo 的 Filter 链. 配置 定义 injvm 协议 <du ...

  9. printf 打印较长字符

  10. 怎么从传统的盒子思想转为Flex 布局(css)

    前端进化很快,总是有新的技术出来,开始可能有些人用惯了盒子模型的思想 依赖 display属性 + position属性 + float属性.这三大件.它对于那些特殊布局非常不方便 我们就来看看Fle ...