增加http监控支持

This commit is contained in:
温少
2012-05-11 20:24:17 +08:00
parent 90f434bca6
commit de80c9ab32
12 changed files with 267 additions and 9407 deletions
+6 -2
View File
@@ -15,9 +15,13 @@
*/
package com.alibaba.druid;
public interface VERSION {
public final class VERSION {
public final static int MajorVersion = 0;
public final static int MinorVersion = 2;
public final static int RevisionVersion = 2;
public final static int RevisionVersion = 3;
public static String getVersionNumber() {
return VERSION.MajorVersion + "." + VERSION.MinorVersion + "." + VERSION.RevisionVersion;
}
}
@@ -0,0 +1,6 @@
package com.alibaba.druid.http;
public class DefaultHandler {
}
@@ -3,15 +3,23 @@ package com.alibaba.druid.http;
import java.io.IOException;
import java.net.BindException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServlet;
import org.mortbay.jetty.Connector;
import org.mortbay.jetty.Handler;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.handler.ContextHandlerCollection;
import org.mortbay.jetty.nio.SelectChannelConnector;
import org.mortbay.jetty.servlet.Context;
import org.mortbay.jetty.servlet.DefaultServlet;
import org.mortbay.jetty.servlet.FilterMapping;
import org.mortbay.jetty.servlet.ServletHandler;
import org.mortbay.jetty.servlet.ServletHolder;
import org.mortbay.jetty.webapp.WebAppContext;
import org.mortbay.thread.QueuedThreadPool;
import org.mortbay.util.MultiException;
@@ -28,9 +36,10 @@ public class HttpServer {
protected final WebAppContext webAppContext;
protected final Map<Context, Boolean> defaultContexts = new HashMap<Context, Boolean>();
protected final List<String> filterNames = new ArrayList<String>();
public HttpServer() throws IOException{
this("stat", "0.0.0.0", 19790);
this("druid", "0.0.0.0", 19790);
}
public HttpServer(String name, String bindAddress, int port) throws IOException{
@@ -51,6 +60,7 @@ public class HttpServer {
webAppContext.setDisplayName("WepAppsContext");
webAppContext.setContextPath("/");
webAppContext.setWar(appDir + "/" + name);
webServer.addHandler(webAppContext);
addDefaultApps(contexts, appDir);
@@ -162,6 +172,53 @@ public class HttpServer {
}
protected void addDefaultServlets() {
addServlet("info", "/info", InfoServlet.class);
}
/**
* Add a servlet in the server.
*
* @param name The name of the servlet (can be passed as null)
* @param pathSpec The path spec for the servlet
* @param clazz The servlet class
*/
public void addServlet(String name, String pathSpec, Class<? extends HttpServlet> clazz) {
addInternalServlet(name, pathSpec, clazz, false);
addFilterPathMapping(pathSpec, webAppContext);
}
/**
* Add an internal servlet in the server, specifying whether or not to protect with Kerberos authentication. Note:
* This method is to be used for adding servlets that facilitate internal communication and not for user facing
* functionality. For servlets added using this method, filters (except internal Kerberized filters) are not
* enabled.
*
* @param name The name of the servlet (can be passed as null)
* @param pathSpec The path spec for the servlet
* @param clazz The servlet class
*/
public void addInternalServlet(String name, String pathSpec, Class<? extends HttpServlet> clazz, boolean requireAuth) {
ServletHolder holder = new ServletHolder(clazz);
if (name != null) {
holder.setName(name);
}
webAppContext.addServlet(holder, pathSpec);
}
/**
* Add the path spec to the filter path mapping.
*
* @param pathSpec The path spec
* @param webAppCtx The WebApplicationContext to add to
*/
protected void addFilterPathMapping(String pathSpec, Context webAppCtx) {
ServletHandler handler = webAppCtx.getServletHandler();
for (String name : filterNames) {
FilterMapping fmap = new FilterMapping();
fmap.setPathSpec(pathSpec);
fmap.setFilterName(name);
fmap.setDispatches(Handler.ALL);
handler.addFilterMapping(fmap);
}
}
}
@@ -0,0 +1,162 @@
package com.alibaba.druid.http;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Driver;
import java.sql.DriverManager;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.alibaba.druid.VERSION;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.stat.DruidDataSourceStatManager;
import com.alibaba.druid.stat.JdbcDataSourceStat;
import com.alibaba.druid.stat.JdbcSqlStat;
public class InfoServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter out = resp.getWriter();
out.println("<html>");
out.println("<body>");
out.println("<table border=\"1\">");
printVersions(out);
printDrivers(out);
printDataSources(out);
out.println("</table>");
printDataSourceDetal(out);
out.println("</body>");
out.println("</html>");
}
private void printVersions(PrintWriter out) {
out.println("<tr><td>Version</td><td>" + VERSION.getVersionNumber() + "</td></tr>");
}
private void printDrivers(PrintWriter out) {
out.print("<tr><td>Drivers</td><td>");
for (Enumeration<Driver> e = DriverManager.getDrivers();e.hasMoreElements();) {
Driver driver = e.nextElement();
out.print(driver.getClass().getName());
out.print("<br/>");
out.println();
}
out.print("</td></tr>");
out.println();
}
private void printDataSources(PrintWriter out) {
out.print("<tr><td>DataSources</td><td>");
for (DruidDataSource dataSource : DruidDataSourceStatManager.getDruidDataSourceInstances()) {
out.println("<a href=\"#" + System.identityHashCode(dataSource) + "\">" + dataSource.getName() + "</a>");
out.print("<br/>");
}
out.print("</td></tr>");
out.println();
}
private void printDataSourceDetal(PrintWriter out) {
for (DruidDataSource dataSource : DruidDataSourceStatManager.getDruidDataSourceInstances()) {
printDataSource(out, dataSource);
}
}
private void printDataSource(PrintWriter out, DruidDataSource dataSource) {
out.println("<a name=\"" + System.identityHashCode(dataSource) + "\"><h1>" + dataSource.getName() + "</h1></a>");
out.println("<table border=\"1\">");
out.println("<tr><td>URL</td><td>" + dataSource.getUrl() + "</td></tr>");
out.println("<tr><td>DbType</td><td>" + dataSource.getDbType() + "</td></tr>");
out.println("<tr><td>UserName</td><td>" + dataSource.getUsername() + "</td></tr>");
out.println("<tr><td>DriverClassName</td><td>" + dataSource.getDriverClassName() + "</td></tr>");
out.println("<tr><td>InitialSize</td><td>" + dataSource.getInitialSize() + "</td></tr>");
out.println("<tr><td>MinIdle</td><td>" + dataSource.getMinIdle() + "</td></tr>");
out.println("<tr><td>MaxActive</td><td>" + dataSource.getMaxActive() + "</td></tr>");
out.println("<tr><td>TestOnBorrow</td><td>" + dataSource.isTestOnBorrow() + "</td></tr>");
out.println("<tr><td>TestWhileIdle</td><td>" + dataSource.isTestWhileIdle() + "</td></tr>");
out.println("<tr><td>LogicConnectCount</td><td>" + dataSource.getConnectCount() + "</td></tr>");
out.println("<tr><td>LogicCloseCount</td><td>" + dataSource.getCloseCount() + "</td></tr>");
out.println("<tr><td>LogicConnectErrorCount</td><td>" + dataSource.getConnectErrorCount() + "</td></tr>");
out.println("<tr><td>PhysicalConnectCount</td><td>" + dataSource.getCreateCount() + "</td></tr>");
out.println("<tr><td>PhysicalCloseCount</td><td>" + dataSource.getDestroyCount() + "</td></tr>");
out.println("<tr><td>PhysicalConnectErrorCount</td><td>" + dataSource.getCreateErrorCount() + "</td></tr>");
out.println("<tr><td>PSCacheAccessCount()</td><td>" + dataSource.getCachedPreparedStatementAccessCount() + "</td></tr>");
out.println("<tr><td>PSCacheHitCount()</td><td>" + dataSource.getCachedPreparedStatementHitCount() + "</td></tr>");
out.println("<tr><td>PSCacheMissCount()</td><td>" + dataSource.getCachedPreparedStatementMissCount() + "</td></tr>");
out.println("</table>");
out.println("<a name=\"" + System.identityHashCode(dataSource) + "\"><h2>" + dataSource.getName() + " SQL </h2></a>");
JdbcDataSourceStat dataSourceStat = dataSource.getDataSourceStat();
out.println("<table border=\"1\">");
out.println("<tr>");
out.println("<td>SQL</td>");
out.println("<td>File</td>");
out.println("<td>Name</td>");
out.println("<td>ExecuteCount</td>");
out.println("<td>ExecuteMillis</td>");
out.println("<td>ExecuteMillisMax</td>");
out.println("<td>InTxnCount</td>");
out.println("<td>ErrorCount</td>");
out.println("<td>EffectedRowCount</td>");
out.println("<td>FetchRowCount</td>");
out.println("<td>RunningCount</td>");
out.println("<td>ConcurrentMax</td>");
out.println("<td>ExecHistogram</td>");
out.println("<td>FetchRowHistogram</td>");
out.println("<td>UpdateCountHistogram</td>");
out.println("<td>ExecAndRsHoldHistogram</td>");
out.println("</tr>");
for (JdbcSqlStat sqlStat : dataSourceStat.getSqlStatMap().values()) {
out.println("<tr>");
out.println("<td>" + sqlStat.getSql() + "</td>");
if (sqlStat.getFile() != null) {
out.println("<td>" + sqlStat.getFile() + "</td>");
} else {
out.println("<td></td>");
}
if (sqlStat.getName() != null) {
out.println("<td>" + sqlStat.getName() + "</td>");
} else {
out.println("<td></td>");
}
out.println("<td>" + sqlStat.getExecuteCount() + "</td>");
out.println("<td>" + sqlStat.getExecuteMillisTotal() + "</td>");
out.println("<td>" + sqlStat.getExecuteMillisMax() + "</td>");
out.println("<td>" + sqlStat.getInTransactionCount() + "</td>");
out.println("<td>" + sqlStat.getErrorCount() + "</td>");
out.println("<td>" + sqlStat.getUpdateCount() + "</td>");
out.println("<td>" + sqlStat.getFetchRowCount() + "</td>");
out.println("<td>" + sqlStat.getRunningCount() + "</td>");
out.println("<td>" + sqlStat.getConcurrentMax() + "</td>");
out.println("<td>" + sqlStat.getHistogram() + "</td>");
out.println("<td>" + sqlStat.getFetchRowCountHistogram() + "</td>");
out.println("<td>" + sqlStat.getUpdateCountHistogram() + "</td>");
out.println("<td>" + sqlStat.getExecuteAndResultHoldTimeHistogram() + "</td>");
out.println("</tr>");
}
out.println("</table>");
}
}
@@ -1376,9 +1376,9 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
@Override
public String getVersion() {
return VERSION.MajorVersion + "." + VERSION.MinorVersion + "." + VERSION.RevisionVersion;
return VERSION.getVersionNumber();
}
@Override
public JdbcDataSourceStat getDataSourceStat() {
return dataSourceStat;
@@ -321,6 +321,6 @@ public class DruidDriver implements Driver, DruidDriverMBean {
@Override
public String getDruidVersion() {
return VERSION.MajorVersion + "." + VERSION.MinorVersion + "." + VERSION.RevisionVersion;
return VERSION.getVersionNumber();
}
}
@@ -583,6 +583,10 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean {
return map;
}
public Histogram getHistogram() {
return this.histogram;
}
public CompositeDataSupport getCompositeData() throws JMException {
return new CompositeDataSupport(getCompositeType(), getData());