javamelody对Java Application进行监控
前面写过对于webapp,用javamelody来监控、分析性能是挺方便的;那要对普通的java应用进行监控,只需要在应用上启动一个嵌入式web容器就可以了。
javamelody里面的war包就用了winstone 作为Servlet容器,可以直接启动;本文是以Jetty为例,在应用中嵌入一个jetty:

import java.util.EventListener;
import java.util.HashMap;
import java.util.Map; import javax.servlet.Filter; import org.mortbay.jetty.Connector;
import org.mortbay.jetty.Handler;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.bio.SocketConnector;
import org.mortbay.jetty.handler.ContextHandlerCollection;
import org.mortbay.jetty.handler.ResourceHandler;
import org.mortbay.jetty.servlet.Context;
import org.mortbay.jetty.servlet.DefaultServlet;
import org.mortbay.jetty.servlet.FilterHolder;
import org.mortbay.thread.QueuedThreadPool;
import org.springframework.web.context.ContextLoaderListener; /**
* 启动一个jetty容器,结合javamelody用于监控应用性能
* @author langke
* 2012-12-21
*/
public class JavaMelodyMonitorServer {
private ESLogger log = Loggers.getLogger(JavaMelodyMonitorServer.class);
Server webServer;
/**
*
* @param serverName 应用名称
* @param host 绑定的IP地址
* @param serverPort 应用端口,jetty启动的端口默认会在此基础上加1000,如果配置文件有配置jetty.listen.port则配置优先
*/
public JavaMelodyMonitorServer(String serverName,String host,int serverPort) {
init(serverName, host, serverPort);
start();
final JavaMelodyMonitorServer server = this;
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
try {
log.info("shutdown mointorServer:{}", server);
server.stop();
} catch (Exception e) {
log.error("run main stop error!", e);
}
} });
} private void init(String serverName,String host,int serverPort){
int defaultValue = serverPort+1000;
int port = Config.get().getInt("jetty.listen.port", defaultValue);
Connector connector = new SocketConnector();
webServer = new Server();
QueuedThreadPool pool = new QueuedThreadPool();
pool.setMinThreads(Config.get().getInt("jetty.pool.MinThread", 3));
pool.setMaxThreads(Config.get().getInt("jetty.pool.MaxThread", 32));
String server = host;
pool.setName(serverName+"-monitor");
pool.setDaemon(true);
webServer.setThreadPool(pool);
connector = new SocketConnector(); connector.setPort(port);
connector.setHost(server);
connector.setMaxIdleTime(60000); // 1 min
webServer.addConnector(connector); ContextHandlerCollection col = new ContextHandlerCollection();
Context context = new Context(col, "/", Context.SESSIONS);
ResourceHandler resourceHandler = new ResourceHandler();
webServer.setHandlers(new Handler[] {col,resourceHandler });
webServer.addHandler(context);
// Set Java Melody storage Directory
System.setProperty("javamelody.storage-directory", "javamelody-"+pool.getName()); //add filter
Filter monitoringFilter = new net.bull.javamelody.MonitoringFilter();
context.addFilter(new FilterHolder(monitoringFilter), "/monitoring", Handler.REQUEST); Map<String,String> initParams = new HashMap<String,String>();
initParams.put("contextConfigLocation", "classpath:net/bull/javamelody/monitoring-spring.xml");
context.setInitParams(initParams); //add listener
EventListener listener = new ContextLoaderListener();
context.addEventListener(listener); context.addServlet(DefaultServlet.class, "/*"); } private void start(){
try{
webServer.join();
webServer.start();
}catch (Exception e){
log.error("Error starting httpserver", e);
}
} private void stop(){
try{
webServer.stop();
webServer.destroy();
}catch (Exception e){
log.error("Error stop httpserver", e);
} }
}

这个jetty加了shutdown hook,应用关闭的时候会自己关闭容器。
然后在你的Application里实例化这个类就行了;
需要的jar依赖名如下:
servlet-api-3.0.jar
org.springframework.web-3.1.0.RELEASE.jar
jrobin-1.5.9.1.jar
jetty-util-6.1.26.jar
jetty-6.1.26.jar
javamelody.jar
com.springsource.net.sf.cglib-2.2.0.jar
如果使用spring框架,监控配置就比较简单,可以对某个包所有类进行监控:

<bean id="facadeMonitoringAdvisor" class="net.bull.javamelody.MonitoringSpringAdvisor">
<property name="pointcut">
<bean class="org.springframework.aop.support.JdkRegexpMethodPointcut">
<property name="pattern" value="org.langke.core.service.*" />
</bean>
</property>
</bean>

监控数据源:
<bean id="springDataSourceBeanPostProcessor" class="net.bull.javamelody.SpringDataSourceBeanPostProcessor">
</bean> <bean id="wrappedDataSource" class="net.bull.javamelody.SpringDataSourceFactoryBean">
<property name="targetName" value="dataSource" />
</bean>
还有一种方式:注解
只需添加注解@net.bull.javamelody.MonitoredWithGuice在你的实现类或者你要监控的方法:使用net.bull.javamelody.MonitoringProxy类代理
详见:http://code.google.com/p/javamelody/wiki/UserGuide#10._Business_facades_(if_Guice)
如果不用Spring也不用Guice还有一种简单的方法实现监控

具体的集成方式,稍后会在我的github发布出来
https://github.com/langke93/rest-nettyserver
javamelody对Java Application进行监控的更多相关文章
- Java 服务端监控方案(四. Java 篇)
http://jerrypeng.me/2014/08/08/server-side-java-monitoring-java/ 这个漫长的系列文章今天要迎来最后一篇了,也是真正与 Java 有关的部 ...
- Java微服务监控及与普罗米集成
一. 背景说明 Java服务级监控用于对每个应用占用的内存.线程池的线程数量.restful调用数量和响应时间.JVM状态.GC信息等进行监控,并可将指标信息同步至普罗米修斯中集中展示和报警.网 ...
- velocity模板引擎学习(4)-在standalone的java application中使用velocity及velocity-tools
通常velocity是配合spring mvc之类的框架在web中使用,但velocity本身其实对运行环境没有过多的限制,在单独的java application中也可以独立使用,下面演示了利用ve ...
- maven: 打包可运行的jar包(java application)及依赖项处理
IDE环境中,可以直接用exec-maven-plugin插件来运行java application,类似下面这样: <plugin> <groupId>org.codehau ...
- How to run a (Tomcat)Java application server on a Azure virtual machine
http://www.windowsazure.com/en-us/documentation/articles/virtual-machines-java-run-tomcat-applicatio ...
- The differences between Java application and Java applet
在Java语言中,能够独立运行的程序称为Java应用程序(Application).Java语言还有另外一种程序--Applet程序.Applet程序(也称Java小程序)是运行于各种网页文件中,用于 ...
- Java Applet与Java Application的区别
转自:http://www.educity.cn/java/500609.html 在Java语言中,能够独立运行的程序称为Java应用程序(Application).Java语言还有另外一种程序-- ...
- How to deploy JAVA Application on Azure Service Fabric
At this moment, Azure Service Fabric does not support JAVA application natively (but it's on the sup ...
- Java Applet与Java Application的特点
java application是应用程序,用于桌面开发,java applet是小应用程序,一般嵌入到网页里运行.applet一般用于B/S页面上作为插件式的开发,而application主要是桌面 ...
随机推荐
- vue-组件化-插槽(slot)
理解 Vue组件化中,当我们在设计一个组件的时候,可能会保留一部分,让使用者自定义的内容,比如: 导航栏组件中,右上角的分享按钮,左上角做菜单按钮 弹出框组件中,弹出框的提示内容等 ... 在这种场景 ...
- Java实现 蓝桥杯VIP 算法提高 前10名
算法提高 前10名 时间限制:1.0s 内存限制:256.0MB 问题描述 数据很多,但我们经常只取前几名,比如奥运只取前3名.现在我们有n个数据,请按从大到小的顺序,输出前10个名数据. 输入格式 ...
- Java实现 LeetCode 83 删除排序链表中的重复元素
83. 删除排序链表中的重复元素 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1-> ...
- Java实现 蓝桥杯 算法训练 景点游览
试题 算法训练 景点游览 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 小明来到一个景区游玩,但是他的时间有限,没办法逛遍所有的景点,所以他从网上下载了每个景点的评分,他希望能够使 ...
- Java实现数字密码发生器
在对银行账户等重要权限设置密码的时候,我们常常遇到这样的烦恼:如果为了好记用生日吧,容易被破解,不安全:如果设置不好记的密码,又担心自己也会忘记:如果写在纸上,担心纸张被别人发现或弄丢了- 这个程序的 ...
- java实现复制网站内容
复制网站内容 复制代码 本程序将网站"www.baidu.com"首页的内容复制保存在文件test.html中.写了如下代码,请完善之: import java.net.*; im ...
- PAT 旧键盘打字
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及坏掉的那些键,打出的结果文字会是怎样? 输入格式: 输入在 2 行中分别给出坏掉的那些键.以及应该输入 ...
- Cacti断图、大量报错故障
一.Cacti日志出现大量错误 最近查看Cacti日志,出现大量红色告警,并且每五分钟出现1次,虽然不影响流量的查看,但是肯定会有问题. 错误日志如下 ERROR: A DB Exec Failed! ...
- 无监督LDA、PCA、k-means三种方法之间的的联系及推导
\(LDA\)是一种比较常见的有监督分类方法,常用于降维和分类任务中:而\(PCA\)是一种无监督降维技术:\(k\)-means则是一种在聚类任务中应用非常广泛的数据预处理方法. 本文的 ...
- 【asp.net core 系列】9 实战之 UnitOfWork以及自定义代码生成
0. 前言 在前一篇中我们创建了一个基于EF的数据查询接口实现基类,这一篇我将带领大家讲一下为这EF补充一些功能,并且提供一个解决避免写大量配置类的方案. 1. SaveChanges的外移 在之前介 ...