mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
Merge pull request #179 from sandzhang/master
push service for druid-monitor
This commit is contained in:
@@ -18,60 +18,191 @@ package com.alibaba.druid.support.monitor;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.ScheduledFuture;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import com.alibaba.druid.stat.DruidStatManagerFacade;
|
||||
import com.alibaba.druid.support.http.stat.WebAppStatManager;
|
||||
import com.alibaba.druid.support.json.JSONUtils;
|
||||
import com.alibaba.druid.support.spring.stat.SpringStatManager;
|
||||
import com.alibaba.druid.util.DaemonThreadFactory;
|
||||
import com.alibaba.druid.util.HttpClientUtils;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 将指定的信息 (includeSql,includeWebApp,includeWebUri,includeWebSession,includeSpring)
|
||||
* 定期 (cycleTime)
|
||||
* post到指定的url (serverUrl) ,请求超时时间(pushTimeOut)
|
||||
* 并进行清零 (autoReset)
|
||||
* </pre>
|
||||
*
|
||||
* @author sandzhang<sandzhangtoo@gmail.com>
|
||||
*/
|
||||
public class PushService {
|
||||
|
||||
private final DruidStatManagerFacade statManagerFacade = DruidStatManagerFacade.getInstance();
|
||||
private final static PushService instance = new PushService();
|
||||
private static final int DEFAULT_CYCLE_TIME = 5 * 60 * 1000;
|
||||
private static final int DEFAULT_PUSH_TIMEOUT = 60 * 1000;
|
||||
|
||||
private final DruidStatManagerFacade statManagerFacade = DruidStatManagerFacade.getInstance();
|
||||
private final WebAppStatManager webAppStatManager = WebAppStatManager.getInstance();
|
||||
private final SpringStatManager springStatManager = SpringStatManager.getInstance();
|
||||
|
||||
private String serverUrl;
|
||||
|
||||
private boolean includeSql = true;
|
||||
private boolean includeSql = true;
|
||||
private boolean includeWebApp = true;
|
||||
private boolean includeWebUri = true;
|
||||
private boolean includeWebSession = true;
|
||||
private boolean includeSpring = true;
|
||||
|
||||
private boolean includeWebApp = true;
|
||||
private boolean includeWebUri = true;
|
||||
private boolean includeWebSession = true;
|
||||
private boolean includeSpring = true;
|
||||
private boolean autoReset = true;
|
||||
|
||||
public void collect() {
|
||||
private long cycleTime = DEFAULT_CYCLE_TIME;
|
||||
private long pushTimeOut = DEFAULT_PUSH_TIMEOUT;
|
||||
|
||||
private ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1,
|
||||
new DaemonThreadFactory(
|
||||
"DruidPullService-Scheduler"));
|
||||
|
||||
private ScheduledFuture<?> executeFuture = null;
|
||||
|
||||
private PushService(){
|
||||
}
|
||||
|
||||
public static PushService getInstance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
public void start() {
|
||||
executeFuture = scheduler.scheduleAtFixedRate(new Runnable() {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
execute();
|
||||
}
|
||||
|
||||
}, 0, cycleTime, TimeUnit.MILLISECONDS);
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
if (executeFuture != null) {
|
||||
if (executeFuture.cancel(true)) {
|
||||
executeFuture = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void execute() {
|
||||
Map<String, Object> data = collectAndReset();
|
||||
String json = JSONUtils.toJSONString(data);
|
||||
push("data=" + json);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected Map<String, Object> collectAndReset() {
|
||||
Map<String, Object> data = new HashMap<String, Object>();
|
||||
|
||||
if (includeSql) {
|
||||
List<Map<String, Object>> dataSources = statManagerFacade.getDataSourceStatDataList(true);
|
||||
|
||||
data.put("DataSources", dataSources);
|
||||
}
|
||||
|
||||
if (includeWebApp) {
|
||||
List<Map<String, Object>> list = WebAppStatManager.getInstance().getWebAppStatData();
|
||||
List<Map<String, Object>> list = webAppStatManager.getWebAppStatData();
|
||||
data.put("WebApp", list);
|
||||
}
|
||||
|
||||
if (includeWebUri) {
|
||||
List<Map<String, Object>> list = WebAppStatManager.getInstance().getURIStatData();
|
||||
|
||||
List<Map<String, Object>> list = webAppStatManager.getURIStatData();
|
||||
data.put("WebURI", list);
|
||||
}
|
||||
|
||||
if (includeWebSession) {
|
||||
List<Map<String, Object>> list = WebAppStatManager.getInstance().getSessionStatData();
|
||||
|
||||
List<Map<String, Object>> list = webAppStatManager.getSessionStatData();
|
||||
data.put("WebSession", list);
|
||||
}
|
||||
|
||||
if (includeSpring) {
|
||||
List<Map<String, Object>> list = SpringStatManager.getInstance().getMethodStatData();
|
||||
|
||||
List<Map<String, Object>> list = springStatManager.getMethodStatData();
|
||||
data.put("Spring", list);
|
||||
}
|
||||
|
||||
if (autoReset) {
|
||||
statManagerFacade.resetAll();
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
protected void push(Map<String, Object> data) {
|
||||
String json = JSONUtils.toJSONString(data);
|
||||
//TODO URL Connection Post
|
||||
protected void push(String data) {
|
||||
HttpClientUtils.post(serverUrl, data, pushTimeOut);
|
||||
}
|
||||
|
||||
public long getCycleTime() {
|
||||
return cycleTime;
|
||||
}
|
||||
|
||||
public void setCycleTime(long cycleTime) {
|
||||
this.cycleTime = cycleTime;
|
||||
}
|
||||
|
||||
public String getServerUrl() {
|
||||
return serverUrl;
|
||||
}
|
||||
|
||||
public void setServerUrl(String serverUrl) {
|
||||
this.serverUrl = serverUrl;
|
||||
}
|
||||
|
||||
public boolean isIncludeSql() {
|
||||
return includeSql;
|
||||
}
|
||||
|
||||
public void setIncludeSql(boolean includeSql) {
|
||||
this.includeSql = includeSql;
|
||||
}
|
||||
|
||||
public boolean isIncludeWebApp() {
|
||||
return includeWebApp;
|
||||
}
|
||||
|
||||
public void setIncludeWebApp(boolean includeWebApp) {
|
||||
this.includeWebApp = includeWebApp;
|
||||
}
|
||||
|
||||
public boolean isIncludeWebUri() {
|
||||
return includeWebUri;
|
||||
}
|
||||
|
||||
public void setIncludeWebUri(boolean includeWebUri) {
|
||||
this.includeWebUri = includeWebUri;
|
||||
}
|
||||
|
||||
public boolean isIncludeWebSession() {
|
||||
return includeWebSession;
|
||||
}
|
||||
|
||||
public void setIncludeWebSession(boolean includeWebSession) {
|
||||
this.includeWebSession = includeWebSession;
|
||||
}
|
||||
|
||||
public boolean isIncludeSpring() {
|
||||
return includeSpring;
|
||||
}
|
||||
|
||||
public void setIncludeSpring(boolean includeSpring) {
|
||||
this.includeSpring = includeSpring;
|
||||
}
|
||||
|
||||
public boolean isAutoReset() {
|
||||
return autoReset;
|
||||
}
|
||||
|
||||
public void setAutoReset(boolean autoReset) {
|
||||
this.autoReset = autoReset;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
package com.alibaba.druid.support.monitor;
|
||||
|
||||
import javax.servlet.ServletContextEvent;
|
||||
import javax.servlet.ServletContextListener;
|
||||
|
||||
import com.alibaba.druid.support.logging.Log;
|
||||
import com.alibaba.druid.support.logging.LogFactory;
|
||||
|
||||
public class PushServiceListener implements ServletContextListener {
|
||||
|
||||
private final static Log LOG = LogFactory.getLog(PushServiceListener.class);
|
||||
|
||||
private final static String MONITOR_SERVER_URL = "monitorServerUrl";
|
||||
|
||||
@Override
|
||||
public void contextInitialized(ServletContextEvent sce) {
|
||||
PushService pushService = PushService.getInstance();
|
||||
String serverUrl = sce.getServletContext().getInitParameter(MONITOR_SERVER_URL);
|
||||
if (serverUrl == null) {
|
||||
LOG.error(MONITOR_SERVER_URL + " can't be null");
|
||||
return;
|
||||
}
|
||||
|
||||
if (LOG.isDebugEnabled()) {
|
||||
LOG.debug(MONITOR_SERVER_URL + "= " + serverUrl);
|
||||
}
|
||||
pushService.setServerUrl(serverUrl);
|
||||
pushService.start();
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void contextDestroyed(ServletContextEvent sce) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
package com.alibaba.druid.util;
|
||||
|
||||
import java.util.concurrent.ThreadFactory;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
/**
|
||||
* @author sandzhang<sandzhangtoo@gmail.com>
|
||||
*/
|
||||
public class DaemonThreadFactory implements ThreadFactory {
|
||||
|
||||
private AtomicInteger threadNo = new AtomicInteger(1);
|
||||
private final String nameStart;
|
||||
private final String nameEnd = "]";
|
||||
|
||||
public DaemonThreadFactory(String poolName){
|
||||
nameStart = "[" + poolName + "-";
|
||||
}
|
||||
|
||||
public Thread newThread(Runnable r) {
|
||||
Thread newThread = new Thread(r, nameStart + threadNo.getAndIncrement() + nameEnd);
|
||||
newThread.setDaemon(true);
|
||||
if (newThread.getPriority() != Thread.NORM_PRIORITY) {
|
||||
newThread.setPriority(Thread.NORM_PRIORITY);
|
||||
}
|
||||
return newThread;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
package com.alibaba.druid.util;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
|
||||
import com.alibaba.druid.support.logging.Log;
|
||||
import com.alibaba.druid.support.logging.LogFactory;
|
||||
|
||||
/**
|
||||
* @author sandzhang<sandzhangtoo@gmail.com>
|
||||
*/
|
||||
public class HttpClientUtils {
|
||||
|
||||
private final static Log LOG = LogFactory.getLog(HttpClientUtils.class);
|
||||
|
||||
public static boolean post(String serverUrl, String data, long timeout) {
|
||||
StringBuilder responseBuilder = null;
|
||||
BufferedReader reader = null;
|
||||
OutputStreamWriter wr = null;
|
||||
|
||||
URL url;
|
||||
try {
|
||||
url = new URL(serverUrl);
|
||||
URLConnection conn = url.openConnection();
|
||||
conn.setDoOutput(true);
|
||||
conn.setConnectTimeout(1000 * 5);
|
||||
wr = new OutputStreamWriter(conn.getOutputStream());
|
||||
|
||||
wr.write(data);
|
||||
wr.flush();
|
||||
|
||||
if (LOG.isDebugEnabled()) {
|
||||
reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
|
||||
responseBuilder = new StringBuilder();
|
||||
String line = null;
|
||||
while ((line = reader.readLine()) != null) {
|
||||
responseBuilder.append(line + "\n");
|
||||
}
|
||||
LOG.debug(responseBuilder.toString());
|
||||
}
|
||||
} catch (IOException e) {
|
||||
LOG.error("", e);
|
||||
} finally {
|
||||
|
||||
if (wr != null) {
|
||||
try {
|
||||
wr.close();
|
||||
} catch (IOException e) {
|
||||
LOG.error("close error", e);
|
||||
}
|
||||
}
|
||||
|
||||
if (reader != null) {
|
||||
try {
|
||||
reader.close();
|
||||
} catch (IOException e) {
|
||||
LOG.error("close error", e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static void main(String args[]) {
|
||||
post("http://www.alibaba.com/trade/search", "fsb=y&IndexArea=product_en&CatId=&SearchText=test", 6000);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user