文档章节

javamelody对Java Application进行监控

langke
 langke
发布于 2016/08/03 17:19
字数 651
阅读 14
收藏 0

前面写过对于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还有一种简单的方法实现监控

详见:http://code.google.com/p/javamelody/wiki/UserGuideAdvanced#Business_facades_(without_EJB3_and_without_Spring_and_without_Gu

 

具体的集成方式,稍后会在我的github发布出来

 https://github.com/langke93/rest-nettyserver

本文转载自:http://www.cnblogs.com/langke93/archive/2012/12/26/2834546.html

langke
粉丝 1
博文 70
码字总数 3645
作品 0
架构师
私信 提问
JavaMelody 1.76.0 发布,Java 应用监控平台

JavaMelody 1.76.0 发布了,JavaMelody 是一个监控系统,目标是在 QA 和生产环境中监控 Java 或 Java EE 应用程序。 更新内容如下: You can now contribute translations for javamelody b...

h4cd
01/31
0
0
JavaMelody v1.56.0 发布,系统监控工具

JavaMelody v1.56.0 发布,此版本现已提供下载: 如果使用 Maven,要在 pom.xml 添加依赖: javamelody-1.56.0.jar javamelody-1.56.0.war javamelody-1.56.0.zip jira-javamelody-1.56.0.j......

oschina
2015/05/03
2.5K
11
应用监控平台 JavaMelody 1.73.0 发布,兼容 JDK 9

JavaMelody 1.73.0 已发布,JavaMelody 的目标是在 QA 和生产环境中监视 Java 或 Java EE 应用程序。 更新亮点: 兼容 JDK 9。请注意:要在 JDK 9 或更高版本中使用内存柱状图,需在 java 命...

王练
2018/06/21
1K
1
JavaMelody的使用说明

JavaMelody :能够在实际运行生产环境监测Java或Java EE应用程序服务器。并以图表的形式显示:Java内存和Java CPU使用情况,用户Session数量,JDBC连接数,和http请求、sql请求、jsp页面与业...

保罗的寓言
2011/06/04
0
1
JavaMelody v1.62.0 发布,系统监控平台

JavaMelody v1.62.0 发布了,主要更新内容如下: 修复 XSS漏洞 (reported by Omar El Mandour) 也可以查看提交记录了解更多。 发布说明: https://github.com/javamelody/javamelody/wiki/Re...

局长
2016/10/02
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

为什么重复的GET请求变慢了?

最近在研究慢请求监控的问题,写了一个简单的测试代码:在网页端(index.html)通过fetch函数向服务端获取数据,然后打印请求耗时。 function requestData() { let start = new Date(); ...

Fundebug
3分钟前
1
0
5年时间,我从开发做到总裁的秘籍--如何提升技术型管理者的领导力

作者:阿里云MVP 肖凯 对于深耕技术的一线开发者而言,大多数都希望把技术工作进行到底,或者一直从事和技术技术相关性更高的工作。但随着年龄和经验的增长,我对管理和技术的思考越来越多、...

阿里云云栖社区
9分钟前
0
0
LeetCode 142:环形链表 II Linked List Cycle II

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 ...

iCodeBugs
9分钟前
0
0
使用Shell脚本程序监控网站URL是否正常

导读 监控网站URL是否正常最常见的方法莫过于wget和curl命令了,这两个命令都是非常强大的,强大到网友查看帮助都无从选择的地步了,今天呢,老男孩老师正好录制Shell编程实战课程。 wget命令...

问题终结者
10分钟前
0
0
教你用Python制作微信好友背景墙

目录: 0 引言 1 环境 2 代码实现 3 后记 0 引言 前段时间,微信朋友圈开始出现了一种晒照片新形式,微信好友墙,即在一张大图片中展示出自己的所有微信好友的头像。 效果如下图,出于隐私考...

上海小胖
18分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部