mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
增加http监控支持
This commit is contained in:
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user