(转过来,源地址: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. springMVC返回数据的四种方式

    转自:https://blog.csdn.net/itcats_cn/article/details/82119673 springMVC返回数据的四种方式:第一种,通过request.setAttr ...

  2. Ruby类扩张(extension)

    创建: 2017/09/07 更新: 2017/09/16 修改标题字母大小写 ruby ---> Ruby    扩张类  class 类名     扩张的内容  end           ...

  3. Building a Space Station(bfs)

    http://poj.org/problem?id=2031 题意:给出n个球的圆心坐标x,y,z, 半径r,若任意两球不相交,则在两球间建桥.问需建桥的最短距离是多少. 思路:建图,以两球间相差的距 ...

  4. bzoj 1503郁闷的出纳员(splay)

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 11759  Solved: 4163[Submit][Stat ...

  5. poj3233Matrix Power Series(矩阵乘法)

    Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 23187   Accepted: ...

  6. Python 38 初识数据库

    数据库 1.什么是mysql,什么是数据库? 文件处理就可以将数据永久存储 问题 1.管理不方便 2.文件操作效率问题 3.一个程序不太可能仅运行在同一台电脑上 提高计算机性能的方式 1.垂直扩展  ...

  7. windows10+arch linux双系统 uefi启动

    安装前的准备Archlinux 安装ISO镜像,下载:http://mirrors.163.com/archlinux/iso/2013.05.01/U盘一个,最好1G以上,格式化成FAT32.把下载 ...

  8. springboot+webmagic实现java爬虫jdbc及mysql

    前段时间需要爬取网页上的信息,自己对于爬虫没有任何了解,就了解了一下webmagic,写了个简单的爬虫. 一.首先介绍一下webmagic: webmagic采用完全模块化的设计,功能覆盖整个爬虫的生 ...

  9. [BZOJ1821][JSOI2010]部落划分

    感觉学了这么久还是有那么一丢丢进步的...上个学期看到这道题,虽然早就学过并查集和二分了但还是一点思路都没有,现在可以秒切了呢 思路就是二分+并查集,有些人说是生成树,其实它没有变成树,只是运用了生成 ...

  10. windows系统下nodejs安装、环境配置及删除NPM全局配置

    nodejs安装及设置NPM全局路径 删除NPM全局路径配置 一.nodejs安装及设置NPM全局路径 第一步:下载安装文件 下载nodejs,官网:http://nodejs.org/downloa ...