监控Tomcat解决方案(监控应用服务器系列文章分享)
使用JMX接口开发监控程序
◆ 全部代码需要从零开始,代码量较大
◆ 支持各不同版本比较麻烦,每个版本可能有差异
◆ 可支配性强
◆ 最重要的一个缺点是,配置比较麻烦
Tomcat激活JMX远程配置
① ■ 先修改Tomcat的启动脚本,window下tomcat的bin/catalina.bat(linux为catalina.sh),添加以下内容,8999是jmxremote使用的端口号,第二个false表示不需要鉴权:
set JMX_REMOTE_CONFIG=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=falseset CATALINA_OPTS=%CATALINA_OPTS% %JMX_REMOTE_CONFIG%
可以加在if "%OS%" == "Windows_NT" setlocal 一句后的大段的注释后面。
参考官方说明:
http://tomcat.apache.org/tomcat-6.0-doc/monitoring.html#Enabling_JMX_Remote
② ■ 上面的配置是不需要鉴权的,如果需要鉴权则添加的内容为:
set JMX_REMOTE_CONFIG=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password -Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.accessset CATALINA_OPTS=%CATALINA_OPTS% %JMX_REMOTE_CONFIG%
然后复制并修改授权文件,$JAVA_HOME/jre/lib/management下有jmxremote.access和jmxremote.password的模板文件,将两个文件复制到$CATALINA_BASE/conf目录下
● 修改$CATALINA_BASE/conf/jmxremote.access 添加内容:
monitorRole readonly
controlRole readwrite
● 修改$CATALINA_BASE/conf/jmxremote.password 添加内容:
monitorRole tomcat
controlRole tomcat
注意:如果只做第一步没有问题,进行了第二步Tomcat就启动不了,那么很可能是密码文件的权限问题
需要修改jmxremote.password文件的权限,只有运行Tomcat的用户有访问权限
Windows的NTFS文件系统下,选中文件,点右键 -->“属性”-->“安全”--> 点“高级”--> 点“更改权限”--> 去掉“从父项继承....”--> 弹出窗口中选“删除”,这样就删除了所有访问权限。再选“添加”--> “高级”--> “立即查找”,选中你的用户,例administrator,点“确定",“确定"。来到权限项目窗口,勾选“完全控制”,点“确定”,OK了。
官方的提示:
The password file should be read-only and only accessible by the operating system user Tomcat is running as.
③ ■ 重新启动Tomcat,在Windows命令行输入“netstat -ano”查看配置的端口号是否已打开,如果打开,说明上面的配置成功了。
④ ■ 使用jconsole测试JMX。
运行$JAVA_HOME/bin目录下的jconsole.exe,打开J2SE监视和管理控制台,然后建立连接,如果是本地的Tomcat则直接选择然后点击连接,如果是远程的,则进入远程选项卡,填写地址、端口号、用户名、口令即可连接。Mbean属性页中给出了相应的数据,Catalina中是tomcat的,java.lang是jvm的。对于加粗的黑体属性值,需双击一下才可看内容。
遇到的几个问题:
1.tomcat必须要用命令或者startup.bat启动,jconsole才能连接成功。
2.尽量用第一种方式配置,但是要把密码文件拷贝到tomcat-conf目录下,设置密码和口令。
3.tomcat必须配置环境变量,如有多个tomcat同一台服务器上,则添加一个CATALINA_HOME2,然后把tomcat下面catalina.bat和startup.bat中所有CATALINA_HOME替换为CATALINA_HOME2.
实例代码:
package com.gsww.jup.controller.chatShowController;
import java.lang.management.MemoryUsage;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Formatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.gsww.jup.controller.BaseController;
@Controller
@RequestMapping(value = "/applicationServerMonitoring")
public class ApplicationServerMonitoringController extends BaseController{
@RequestMapping(value = "/serverList",method = RequestMethod.GET)
public String serverList(Model model,ServletRequest request,HttpServletRequest hrequest) {
try{
List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
Map<String,Object> map=getMap("61.178.5.73","8092");
map.put("server", "客户端接口服务1");
Map<String,Object> map1=getMap("10.18.23.218","8088");
map1.put("server", "客户端接口服务2");
Map<String,Object> map2=getMap("127.0.0.1","7999");
map2.put("server", "心跳接口服务");
Map<String,Object> map3=getMap("127.0.0.1","8999");
map3.put("server", "后台服务");
list.add(map);
list.add(map1);
list.add(map2);
list.add(map3);
model.addAttribute("list", list);
}catch(Exception ex){
ex.printStackTrace();
}
return "chatShow/serverMonitor_list";
}
public Map<String, Object> getMap(String ip,String port){
Map<String, Object> serverMap=new HashMap<String, Object>();
try {
String jmxURL = "service:jmx:rmi:///jndi/rmi://"+ip+":"+port+"/jmxrmi";//tomcat jmx url
JMXServiceURL serviceURL = new JMXServiceURL(jmxURL);
Map map = new HashMap();
String[] credentials = new String[] { "monitorRole" , "QED" };
map.put("jmx.remote.credentials", credentials);
JMXConnector connector = JMXConnectorFactory.connect(serviceURL, map);
MBeanServerConnection mbsc = connector.getMBeanServerConnection();
//------------------------ JVM -------------------------
//堆使用率
ObjectName heapObjName = new ObjectName("java.lang:type=Memory");
MemoryUsage heapMemoryUsage = MemoryUsage.from((CompositeDataSupport)mbsc.getAttribute(heapObjName, "HeapMemoryUsage"));
long maxMemory = heapMemoryUsage.getMax();//堆最大
long commitMemory = heapMemoryUsage.getCommitted();//堆当前分配
long usedMemory = heapMemoryUsage.getUsed();
System.out.println("推最大:"+maxMemory);
System.out.println("堆当前分配:"+commitMemory);
System.out.println("堆使用:"+usedMemory);
System.out.println("heap:"+(double)usedMemory*100/commitMemory+"%");//堆使用率
serverMap.put("maxMemory", format((double)maxMemory/1000000)+"M");
serverMap.put("commitMemory", format((double)commitMemory/1000000)+"M");
serverMap.put("usedMemory", format((double)usedMemory/1000000)+"M");
serverMap.put("usedPersent", format((double)usedMemory*100/commitMemory)+"%");
return serverMap;
} catch (Exception e) {
serverMap.put("maxMemory", "--");
serverMap.put("commitMemory", "--");
serverMap.put("usedMemory", "--");
serverMap.put("usedPersent", "100.00%");
return serverMap;
}
}
public String formatTimeSpan(long span){
long minseconds = span % 1000;
span = span /1000;
long seconds = span % 60;
span = span / 60;
long mins = span % 60;
span = span / 60;
long hours = span % 24;
span = span / 24;
long days = span;
return (new Formatter()).format("%1$d天 %2$02d:%3$02d:%4$02d.%5$03d", days,hours,mins,seconds,minseconds).toString();
}
public String format(double s) {
DecimalFormat df = new DecimalFormat("#.##");
return df.format(s);
}
}
转载于:https://www.cnblogs.com/wjwen/p/4829932.html
监控Tomcat解决方案(监控应用服务器系列文章分享)相关推荐
- linux cacti监控tomcat,Cacti监控Tomcat服务器实现过程
1 首先去官网上面下载通用的监控模板 一般使用TomcatStats-0.1.zip 模板居多,下载地址: , 在linux服务器上面使用wget下载,wget,报如下错误: 正在连接 forums. ...
- Xero 系列文章分享-Xero Vs MYOB
Xero Vs MYOB 两家公司都是南半球最好的财务软件公司,都已经on cloud. 来互相伤害一下吧? 其实看线上订购户数就可以看出来,XERO才是会计云平台的王者. MYOB因为比XERO大十 ...
- Jmeter - 从入门到精通高级篇 - jmeter使用监视器结果监控tomcat性能(详解教程)
1.简介 这一篇讲解分享如何使用jmeter的监视器结果监控tomcat性能. 2.准备工作 文章标题中提到jmeter和tomcat,那么只需要准备它们两即可. 2.1 tomcat配置用户名密码及 ...
- Oracle APEX 系列文章3:在阿里云上打造属于你自己的APEX完整开发环境 (安装CentOS, Tomcat, Nginx)
本文是钢哥的Oracle APEX系列文章中的第三篇,完整 Oracle APEX 系列文章如下: - Oracle APEX 系列文章1:Oracle APEX, 让你秒变全栈开发的黑科技 - Or ...
- Oracle APEX 系列文章3:在阿里云上打造属于你自己的APEX完整开发环境 (安装CentOS, Tomcat, Nginx)...
本文是钢哥的Oracle APEX系列文章中的第三篇,完整 Oracle APEX 系列文章如下: Oracle APEX 系列文章1:Oracle APEX, 让你秒变全栈开发的黑科技 Oracle ...
- Oracle APEX 系列文章7:Oracle APEX 18.1 新特性
引言 千呼万唤始出来, Oracle APEX 18.1 新版本终于发布了,还不了解 Oracle APEX 是什么的同学请移步这里: Oracle APEX 系列文章1:Oracle APEX, 让 ...
- Carlosfu技术系列文章总目录
转载请注明出处哈:http://carlosfu.iteye.com/blog/2240426 刚看了一下这个账号是2009年注册的,当时可能是为了下载javaeye的周刊吧,后来12年开始工作时 ...
- Oracle APEX 系列文章2:在阿里云上打造属于你自己的APEX完整开发环境 (准备工作)...
本文是钢哥的Oracle APEX系列文章中的第二篇,完整 Oracle APEX 系列文章如下: Oracle APEX 系列文章1:Oracle APEX, 让你秒变全栈开发的黑科技 Oracle ...
- Oracle APEX 系列文章2:在阿里云上打造属于你自己的APEX完整开发环境 (准备工作)
本文是钢哥的Oracle APEX系列文章中的第二篇,完整 Oracle APEX 系列文章如下: - Oracle APEX 系列文章1:Oracle APEX, 让你秒变全栈开发的黑科技 - Or ...
最新文章
- 【转载】mysql主键的缺少导致备库hang
- MySQL事务控制语句
- java接口经常变动前端怎么办_Java进程故障排查(CPU资源占用高,接口响应超时,功能接口停滞等)...
- VR有五种全局光照渲染引擎和各自的优缺点
- 前端 domparser未定义怎么解决_统一异常处理到底应该怎么做呢?
- iOS 面试题集合
- Gradle 2.0 用户指南翻译——第五十四章. 构建本机二进制文件
- github托管静态网页
- 0704暑假集训前的欢乐大杂烩总结
- 2016理数全国卷 T21
- win10到2008服务器smb协议,如何启用或禁用SMB1文件共享协议在Windows
- 大4女生想做软件测试岗,如何系统性学习测试呢?
- wma格式怎么转换mp3,4种方法超快学
- k8spod控制器概述
- Beautiful Soup 4.4.0 文档 — beautifulsoup 4.4.0q 文档
- 获取有道词典在线翻译结果 及 Windows下配置运行ASP
- 柯莱特CTO谈企业选择CRM的六大目标
- 电视机@2022:降价、焦虑与机遇
- 追踪放“马”贼——从木马中分析放马者手记
- Python超简单零基础树莓派摄像头车牌识别(使用开源openalpr)笔记
热门文章
- win bat 输入参数
- [收集] C++ memset ,memcpy 和strcpy 的区别
- ROS多根adsl叠加负载均衡PCC的做法
- gitlab与jenkins的自动化部署(通过webhook与ansible)
- javascript:void(0)和javascript:;的用法
- MySQL 在 LIMIT 条件后注入
- IOS开发之----异常处理
- js---html元素操作
- 不要活在别人的生活里(摘自开复网)
- Java中的移位操作以及基本数据类型转换成字节数组【收集】