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主要是桌面 ...
随机推荐
- ActiveMQ 笔记(六)ActiveMQ的消息存储和持久化
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.持久化机制 1.Activemq持久化 1.1 什么是持久化: 持久化就是高可用的机制,即使服务器宕 ...
- Java实现 LeetCode 640 求解方程(计算器的加减法计算)
640. 求解方程 求解一个给定的方程,将x以字符串"x=#value"的形式返回.该方程仅包含'+',' - '操作,变量 x 和其对应系数. 如果方程没有解,请返回" ...
- Java实现字母去重
描述 给定一个字符串S,每次操作你可以将其中任意一个字符修改成其他任意字符. 请你计算最少需要多少次操作,才能使得S中不存在两个相邻的相同字符. 输入 只包含小写字母的字符串S. 1 ≤ |S| ≤ ...
- 并发编程之sun.misc.Unsafe类
1.Unsafe知识点整理 2.代码: package com.javabasic.unsafe; import java.lang.reflect.Field; import sun.misc.Un ...
- ASP.NET Core 3.1 WebApi+JWT+Swagger+EntityFrameworkCore构建REST API
一.准备 使用vs2019新建ASP.NET Core Web应用程序,选用api模板: 安装相关的NuGet包: 二.编码 首先编写数据库模型: 用户表 User.cs: public class ...
- ffmpeg m3u8生成 剪辑及格式转换
使用 ffmpeg 工具, 生成 m3u8 文件 ffmpeg -re -i 03.ts -c copy -f hls -hls_base_url /Users/admin/Downloads/dow ...
- 关于GatewayClient 介绍和使用
GatewayClient ## 源码 https://github.com/walkor/GatewayClient 根据GatewayWorker版本,选择合适的GatewayClient版本,请 ...
- MATLAB作图之二
"平滑"二维图像可以通过对图像进行插值实现.那么对于一条有大量"毛刺"的曲线,是不是也可以通过插值来平滑呢?答案是肯定的. "平滑"前 x ...
- Dubbo笔记(一)
一.简介 在编写分布式场景下高并发.高扩展的系统对技能的要求很高,因为这个过程会涉及到序列化/反序列化.多线程.网络编程.设计模式.性能优化等众多专业知识.而Dubbo框架对这些专业知识做了更高层的抽 ...
- 数据湖&数据仓库,别再傻傻分不清了
摘要:什么是数据湖?它有什么作用?今天将由华为云技术专家从理论出发,将问题抽丝剥茧,从技术维度娓娓道来. 什么是数据湖 如果需要给数据湖下一个定义,可以定义为这样:数据湖是一个存储企业的各种各样原始数 ...