Tomcat扩展——监控
(转过来,源地址: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扩展——监控的更多相关文章
- Jmeter-----图形扩展监控
Jmeter----图形扩展监控 监听器中插件安装成功如下图: 安装步骤: 1. 下载JMeterPlugins-Extras与JMeterPlugins-Standard,解压缩后在他们各自的\l ...
- zabbix实现对tomcat的监控
zabbix实现对tomcat的监控 工作原理 比如:当Zabbix-Server需要知道java应用程序的某项性能的时候,会启动自身的一个Zabbix-JavaPollers进程去连接Zabbix- ...
- Windows下tomcat进程监控批处理程序
在Windows下tomcat进程监控批处理程序脚本如下: @echo off ::tomcat安装目录 set _tomcatDir=E:\myFiles\apache-tomcat-8.5.31 ...
- php使用inotify扩展监控文件或目录,如果发生改变,就执行指定命令
通过inotify扩展监控文件或目录的变化,如果发生变化,就执行命令. 可以应用于 swoole 中,如果文件发生变化,就执行 kill -USR1 进程PID 来实现热更新. <?php cl ...
- Tomcat zabbix监控、jmx监控、zabbix_java_gateway
几种方式监控tomcat,如标题. 下面就是参考的网上的连接.自己可以试一下. 由于牵扯到jvm的很多东西, 在这里就只是粘贴处连接参考. http://www.cnblogs.com/chrisDu ...
- abbix通过JMX监控Tomcat(被监控端安装Tomat的服务器防火墙策略iptables配置)
原文地址:http://jaychang.iteye.com/blog/2214830 一.目前的环境 被监控端192.168.153.191 /usr/local/tomcat 下载了catalin ...
- Tomcat性能监控之Probe
目前采用java进行开发的系统居多,这些系统运行在java容器中,通过对容器的监控可以了解到java进程的运行状况,分析java程序问题.目前市面上流行的中间件有很多(Tomcat.jetty.jbo ...
- Tomcat性能监控
Tomcat性能监控工具很多,这里介绍两种1.JMeter 2.probe,使用这两种工具都需要在tomcat的安装目录/conf/tomcat-users.xml添加 <tomcat-user ...
- Tomcat 性能监控及调优
1.性能监控 方式1: /usr/local/tomcat7/conf/tomcat-users.xml 添加如下: <role rolename="manager-gui" ...
随机推荐
- Java中jspf文件的作用
转自:https://blog.csdn.net/xzmeasy/article/details/75103431 为什么要用jspf文件 写jsp页面时,是不是:css和js引用特别多,而且有些页面 ...
- Genuitec
- PCB WCF Web接口增减参数后,在客户端不更新的情况,是否影响客户端,评估测试
1.目的:由于接口众多,服务端变更接口,会造成服务停用更新,造成客户端不能使用或报错, 在此评估[Web中心]此服务端,接口接口参数增加或减少,是否对客户端造成影响 2.评估内容:服务端增加单值参数, ...
- Python 39 数据库的数据类型
一:整型 为什么需要 数据分类? 1.为了描述事物更加准确 2.描述起来更方便 3.节省内存空间 例:1 a 你 utf8 下 5个字节 1 a b c unicode 6个字节 mysq ...
- 【LuoguP2210 USACO】 Haywire
这种答案跟序列排列顺序有关的,n比较小的(稍微大一点的也可以),求最优解的,一般都可以随机化过 随机化不一定是模拟退火或是什么遗传蚁群 哪怕只是直接随机化一个序列,只要你随机的次数够多,它都能找到正解 ...
- netty 引用计数对象(reference counted objects)
[Netty官方文档翻译]引用计数对象(reference counted objects) http://damacheng009.iteye.com/blog/2013657
- 5.23Java各种对象(PO,BO,VO,DTO,POJO,DAO,Entity,JavaBean,JavaBeans)的区分
作者:https://www.cnblogs.com/lyjin/p/6389349.html PO:持久对象(persistent object):---po就是在Object/Relation M ...
- 利用MediaSession发送信息到蓝牙音箱
1.利用MediaSession发送信息到蓝牙音箱,如:播放音乐时接收的歌曲信息,但是每一首歌连续播放时,再次发送的重复信息会被丢弃.则利用MediaSession发现信息时,要保证信息的不重复性. ...
- [原创]Linux(CentOS)下安装nodejs+express
网上找了很多步骤,各种问题,自己总结下吧 1.下载 wget --no-check-certificate https://nodejs.org/dist/v6.10.1/node-v6.10.1-l ...
- 关于VirtualBox与锐捷冲突导致锐捷不断掉线的问题的解决办法
和VM一样,virtualBox也是和锐捷冲突,网上有一些方法是禁用虚拟网卡,但是还是会导致锐捷客户端掉线,除非使用wifi 第一个解决办法: 偶然看到一个解决办法是,在锐捷客户端登陆之后,打开任务管 ...