diff --git a/cat-core/src/main/java/com/dianping/cat/config/app/AppDataService.java b/cat-core/src/main/java/com/dianping/cat/config/app/AppDataService.java index 8c2532914b09405c0e06f51540ecaf75eb2884c1..d5d70b3584c89cbd6f01babf791b897acf43a5a5 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/app/AppDataService.java +++ b/cat-core/src/main/java/com/dianping/cat/config/app/AppDataService.java @@ -10,7 +10,6 @@ import java.util.Map.Entry; import org.unidal.dal.jdbc.DalException; import org.unidal.lookup.annotation.Inject; -import org.unidal.tuple.Pair; import com.dianping.cat.Cat; import com.dianping.cat.app.AppDataCommand; @@ -52,20 +51,20 @@ public class AppDataService { if (SUCCESS.equals(type)) { datas = m_dao.findDataByMinuteCode(commandId, period, city, operator, network, appVersion, connnectType, code, platform, AppDataCommandEntity.READSET_SUCCESS_DATA); - Pair>> dataPair = convert2AppDataCommandMap(datas); + AppDataCommandMap convertedData = convert2AppDataCommandMap(datas); - return querySuccessRatio(commandId, dataPair); + return querySuccessRatio(commandId, convertedData); } else if (REQUEST.equals(type)) { datas = m_dao.findDataByMinute(commandId, period, city, operator, network, appVersion, connnectType, code, platform, AppDataCommandEntity.READSET_COUNT_DATA); - Pair>> dataPair = convert2AppDataCommandMap(datas); - return queryRequestCount(dataPair); + AppDataCommandMap convertedData = convert2AppDataCommandMap(datas); + return queryRequestCount(convertedData); } else if (DELAY.equals(type)) { datas = m_dao.findDataByMinute(commandId, period, city, operator, network, appVersion, connnectType, code, platform, AppDataCommandEntity.READSET_AVG_DATA); - Pair>> dataPair = convert2AppDataCommandMap(datas); + AppDataCommandMap dataPair = convert2AppDataCommandMap(datas); return queryDelayAvg(dataPair); } else { throw new RuntimeException("unexpected query type, type:" + type); @@ -76,7 +75,7 @@ public class AppDataService { return null; } - private Pair>> convert2AppDataCommandMap(List fromDatas) { + private AppDataCommandMap convert2AppDataCommandMap(List fromDatas) { Map> dataMap = new LinkedHashMap>(); int max = -1; @@ -95,18 +94,16 @@ public class AppDataService { } data.add(from); } - int n = max / 5; - return new Pair>>(n, dataMap); + return new AppDataCommandMap(n, dataMap); } - public double[] querySuccessRatio(int commandId, Pair>> dataPair) { - double[] value = new double[dataPair.getKey()]; - Map> dataMap = dataPair.getValue(); + public double[] querySuccessRatio(int commandId, AppDataCommandMap convertedData) { + double[] value = new double[convertedData.getMaxSize()]; try { - for (Entry> entry : dataMap.entrySet()) { + for (Entry> entry : convertedData.getAppDataCommands().entrySet()) { int key = entry.getKey(); long success = 0; long sum = 0; @@ -139,10 +136,10 @@ public class AppDataService { return false; } - public double[] queryRequestCount(Pair>> dataPair) { - double[] value = new double[dataPair.getKey()]; + public double[] queryRequestCount(AppDataCommandMap convertedData) { + double[] value = new double[convertedData.getMaxSize()]; - for (Entry> entry : dataPair.getValue().entrySet()) { + for (Entry> entry : convertedData.getAppDataCommands().entrySet()) { for (AppDataCommand data : entry.getValue()) { long count = data.getAccessNumberSum(); @@ -152,10 +149,10 @@ public class AppDataService { return value; } - public double[] queryDelayAvg(Pair>> dataPair) { - double[] value = new double[dataPair.getKey()]; + public double[] queryDelayAvg(AppDataCommandMap convertedData) { + double[] value = new double[convertedData.getMaxSize()]; - for (Entry> entry : dataPair.getValue().entrySet()) { + for (Entry> entry : convertedData.getAppDataCommands().entrySet()) { for (AppDataCommand data : entry.getValue()) { long count = data.getAccessNumberSum(); long sum = data.getResponseSumTimeSum(); @@ -166,5 +163,24 @@ public class AppDataService { } return value; } - + + public class AppDataCommandMap { + private int m_maxSize; + + private Map> m_appDataCommands; + + public int getMaxSize() { + return m_maxSize; + } + + public Map> getAppDataCommands() { + return m_appDataCommands; + } + + public AppDataCommandMap(int maxSize, Map> appDataCommands) { + m_maxSize = maxSize; + m_appDataCommands = appDataCommands; + } + } + } diff --git a/cat-home/pom.xml b/cat-home/pom.xml index 9afd83941869a2b1d08f8f80777fffae3a25f320..b3fc0a289ef1ac9b85d9116fc55ac43fcb972831 100755 --- a/cat-home/pom.xml +++ b/cat-home/pom.xml @@ -161,7 +161,8 @@ ${basedir}/src/main/resources/META-INF/dal/model/monitor-rules-manifest.xml, ${basedir}/src/main/resources/META-INF/dal/model/alertconfig-manifest.xml, ${basedir}/src/main/resources/META-INF/dal/model/alertsummary-manifest.xml, - + ${basedir}/src/main/resources/META-INF/dal/model/thirdParty-manifest.xml, + diff --git a/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java b/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java index d96a8a65f8cf9ab6c78fef644410489ec59921e3..1db9534b0c109b9e37bc95ea6cb41097d64c4ad3 100644 --- a/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java +++ b/cat-home/src/main/java/com/dianping/cat/CatHomeModule.java @@ -18,6 +18,8 @@ import com.dianping.cat.report.task.alert.business.BusinessAlert; import com.dianping.cat.report.task.alert.exception.ExceptionAlert; import com.dianping.cat.report.task.alert.network.NetworkAlert; import com.dianping.cat.report.task.alert.system.SystemAlert; +import com.dianping.cat.report.task.alert.thirdParty.ThirdPartyAlert; +import com.dianping.cat.report.task.alert.thirdParty.ThirdPartyAlertTask; import com.dianping.cat.report.task.product.ProjectUpdateTask; import com.dianping.cat.report.view.DomainNavManager; import com.dianping.cat.system.config.ConfigReloadTask; @@ -48,6 +50,10 @@ public class CatHomeModule extends AbstractModule { Threads.forGroup("Cat").start(domainNavManager); Threads.forGroup("Cat").start(taskConsumer); } + ThirdPartyAlert thirdPartyAlert = ctx.lookup(ThirdPartyAlert.class); + ThirdPartyAlertTask thirdPartyAlertTask = ctx.lookup(ThirdPartyAlertTask.class); + Threads.forGroup("Cat").start(thirdPartyAlert); + Threads.forGroup("Cat").start(thirdPartyAlertTask); if (serverConfigManager.isAlertMachine() && !serverConfigManager.isLocalMode()) { BusinessAlert metricAlert = ctx.lookup(BusinessAlert.class); @@ -55,12 +61,18 @@ public class CatHomeModule extends AbstractModule { SystemAlert systemAlert = ctx.lookup(SystemAlert.class); ExceptionAlert exceptionAlert = ctx.lookup(ExceptionAlert.class); ProjectUpdateTask productUpdateTask = ctx.lookup(ProjectUpdateTask.class); + Threads.forGroup("Cat").start(thirdPartyAlert); + Threads.forGroup("Cat").start(thirdPartyAlertTask); +// ThirdPartyAlert thirdPartyAlert = ctx.lookup(ThirdPartyAlert.class); +// ThirdPartyAlertTask thirdPartyAlertTask = ctx.lookup(ThirdPartyAlertTask.class); Threads.forGroup("Cat").start(networkAlert); Threads.forGroup("Cat").start(systemAlert); Threads.forGroup("Cat").start(metricAlert); Threads.forGroup("Cat").start(exceptionAlert); Threads.forGroup("Cat").start(productUpdateTask); + Threads.forGroup("Cat").start(thirdPartyAlert); + Threads.forGroup("Cat").start(thirdPartyAlertTask); } executeAlarmModule(ctx); } diff --git a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index 1932ec406ac76d12ed7d7c2da9d2df4ec1a74f1c..4b1ceea8801e05cf465e8a1eb609377372a8b3bb 100755 --- a/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -76,6 +76,9 @@ import com.dianping.cat.report.task.alert.summary.AlertSummaryGenerator; import com.dianping.cat.report.task.alert.summary.AlertSummaryManager; import com.dianping.cat.report.task.alert.system.SystemAlert; import com.dianping.cat.report.task.alert.system.SystemAlertConfig; +import com.dianping.cat.report.task.alert.thirdParty.HttpMonitor; +import com.dianping.cat.report.task.alert.thirdParty.ThirdPartyAlert; +import com.dianping.cat.report.task.alert.thirdParty.ThirdPartyAlertTask; import com.dianping.cat.report.task.product.ProjectUpdateTask; import com.dianping.cat.report.view.DomainNavManager; import com.dianping.cat.service.IpService; @@ -89,6 +92,7 @@ import com.dianping.cat.system.config.MetricGroupConfigManager; import com.dianping.cat.system.config.NetGraphConfigManager; import com.dianping.cat.system.config.NetworkRuleConfigManager; import com.dianping.cat.system.config.SystemRuleConfigManager; +import com.dianping.cat.system.config.ThirdPartyConfigManager; import com.dianping.cat.system.tool.DefaultMailImpl; import com.dianping.cat.system.tool.MailSMS; @@ -127,6 +131,12 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator { ExceptionConfigManager.class, AlertExceptionBuilder.class, AlertDao.class).req(ModelService.class, TopAnalyzer.ID)); + all.add(C(ThirdPartyAlert.class).req(ProjectDao.class, MailSender.class)); + + all.add(C(HttpMonitor.class)); + + all.add(C(ThirdPartyAlertTask.class).req(HttpMonitor.class, ThirdPartyAlert.class, ThirdPartyConfigManager.class)); + return all; } @@ -215,6 +225,7 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator { all.add(C(BusinessRuleConfigManager.class).req(ConfigDao.class)); all.add(C(AlertConfigManager.class).req(ConfigDao.class)); all.add(C(NetGraphConfigManager.class).req(ConfigDao.class)); + all.add(C(ThirdPartyConfigManager.class).req(ConfigDao.class)); all.add(C(ConfigReloadTask.class).req(MetricConfigManager.class, ProductLineConfigManager.class)); return all; diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/alert/exception/AlertExceptionBuilder.java b/cat-home/src/main/java/com/dianping/cat/report/task/alert/exception/AlertExceptionBuilder.java index 7d8c1b47225a9cb16766c2b9ae56fbeb19f5fdcd..afee737c0f2f56e1de39aea066b1fe08c8b4b3ad 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/alert/exception/AlertExceptionBuilder.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/alert/exception/AlertExceptionBuilder.java @@ -41,7 +41,7 @@ public class AlertExceptionBuilder { double totalWarnLimit = totalLimitPair.getKey(); double totalErrorLimit = totalLimitPair.getValue(); double totalException = 0; - + for (Entry entry : item.getException().entrySet()) { String exceptionName = entry.getKey(); @@ -127,7 +127,8 @@ public class AlertExceptionBuilder { public String buildMailContent(String exceptions, String domain, String contactInfo) { String content = buildContent(exceptions, domain, contactInfo); - String url = "http://cat.dianpingoa.com/cat/r/p?domain=" + domain; + String date = new SimpleDateFormat("yyyyMMddHH").format(new Date()); + String url = "http://cat.dianpingoa.com/cat/r/p?domain=" + domain + "&date=" + date; String mailContent = content + "
" + " 点击此处查看详情"; return mailContent; diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/alert/exception/ExceptionAlert.java b/cat-home/src/main/java/com/dianping/cat/report/task/alert/exception/ExceptionAlert.java index 92584df70071f2e723b12c8441f9ea8b7e0cace4..e59777b7c02a13027f593db8b02e5a6814eec53c 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/alert/exception/ExceptionAlert.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/alert/exception/ExceptionAlert.java @@ -187,7 +187,7 @@ public class ExceptionAlert implements Task, LogEnabled { try { sendAndStoreAlert(entry.getKey(), entry.getValue()); } catch (Exception e) { - m_logger.error(e.getMessage()); + Cat.logError(e); } } t.setStatus(Transaction.SUCCESS); @@ -235,7 +235,7 @@ public class ExceptionAlert implements Task, LogEnabled { String smsContent = m_alertBuilder.buildContent(errorAndTriggeredExceptions.toString(), domain, contactInfo); m_smsSender.sendAlert(phones, domain, smsContent, smsContent, "error"); Cat.logEvent("ExceptionAlert", domain, Event.SUCCESS, "[短信告警] " + smsContent); - + m_mailSms.sendWeiXin(mailTitle, mailContent, domain, weixins); m_logger.info(mailTitle + " " + mailContent + " " + domain + " " + weixins); Cat.logEvent("WeiXinAlert", domain, Event.SUCCESS, "[微信告警] " + mailTitle + " " + mailContent + " " + domain diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/alert/thirdParty/HttpMonitor.java b/cat-home/src/main/java/com/dianping/cat/report/task/alert/thirdParty/HttpMonitor.java new file mode 100644 index 0000000000000000000000000000000000000000..40c64904f5d68cd8877bdb869762555a341a7ea8 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/report/task/alert/thirdParty/HttpMonitor.java @@ -0,0 +1,106 @@ +package com.dianping.cat.report.task.alert.thirdParty; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.net.HttpURLConnection; +import java.net.URL; + +import org.codehaus.plexus.util.StringUtils; +import org.unidal.helper.Files; + +public class HttpMonitor { + + public String readFromGet(String url) { + HttpURLConnection connection = null; + InputStream in = null; + BufferedReader reader = null; + + try { + URL address_url = new URL(url); + connection = (HttpURLConnection) address_url.openConnection(); + connection.setRequestMethod("GET"); + connection.setConnectTimeout(5000); + connection.setReadTimeout(5000); + int response_code = connection.getResponseCode(); + + if (response_code == HttpURLConnection.HTTP_OK) { + in = connection.getInputStream(); + String result = Files.forIO().readFrom(in, "utf-8"); + + return result; + } + } catch (Exception e) { + throw new RuntimeException(e); + } finally { + if (connection != null) { + connection.disconnect(); + } + try { + if (in != null) { + in.close(); + } + if (reader != null) { + reader.close(); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } + return null; + } + + public String readFromPost(String url, String content) { + HttpURLConnection connection = null; + BufferedReader reader = null; + OutputStreamWriter writer = null; + InputStream in = null; + + try { + URL postUrl = new URL(url); + connection = (HttpURLConnection) postUrl.openConnection(); + connection.setDoOutput(true); + connection.setDoInput(true); + connection.setRequestMethod("POST"); + connection.setUseCaches(false); + connection.setInstanceFollowRedirects(true); + connection.setConnectTimeout(5000); + connection.setReadTimeout(5000); + + if (StringUtils.isNotEmpty(content)) { + writer = new OutputStreamWriter(connection.getOutputStream()); + writer.write(content); + writer.flush(); + } + int response_code = connection.getResponseCode(); + + if (response_code == HttpURLConnection.HTTP_OK) { + in = connection.getInputStream(); + String result = Files.forIO().readFrom(in, "utf-8"); + + return result; + } + } catch (Exception e) { + throw new RuntimeException(e); + } finally { + if (connection != null) { + connection.disconnect(); + } + try { + if (reader != null) { + reader.close(); + } + if (writer != null) { + writer.close(); + } + if (in != null) { + in.close(); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } + return null; + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/alert/thirdParty/ThirdPartyAlert.java b/cat-home/src/main/java/com/dianping/cat/report/task/alert/thirdParty/ThirdPartyAlert.java new file mode 100644 index 0000000000000000000000000000000000000000..942f3dde09d70811f3304bb05e2c33376a3d9c88 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/report/task/alert/thirdParty/ThirdPartyAlert.java @@ -0,0 +1,201 @@ +package com.dianping.cat.report.task.alert.thirdParty; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.TimeUnit; + +import org.codehaus.plexus.logging.LogEnabled; +import org.codehaus.plexus.logging.Logger; +import org.unidal.helper.Threads.Task; +import org.unidal.lookup.annotation.Inject; + +import com.dianping.cat.Cat; +import com.dianping.cat.core.dal.Project; +import com.dianping.cat.core.dal.ProjectDao; +import com.dianping.cat.core.dal.ProjectEntity; +import com.dianping.cat.helper.TimeUtil; +import com.dianping.cat.home.alert.thirdParty.entity.Domain; +import com.dianping.cat.message.Event; +import com.dianping.cat.message.Transaction; +import com.dianping.cat.report.task.alert.sender.MailSender; +import com.site.helper.Splitters; + +public class ThirdPartyAlert implements Task, LogEnabled { + + @Inject + private ProjectDao m_projectDao; + + @Inject + protected MailSender m_mailSender; + + private Logger m_logger; + + private static final long DURATION = TimeUtil.ONE_MINUTE; + + private BlockingQueue m_entities = new ArrayBlockingQueue(5000); + + public boolean put(ThirdPartyAlertEntity entity) { + boolean result = true; + + try { + boolean temp = m_entities.offer(entity, 5, TimeUnit.MILLISECONDS); + + if (!temp) { + result = temp; + } + return result; + } catch (Exception e) { + Cat.logError(e); + } + return false; + } + + @Override + public void run() { + boolean active = true; + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + active = false; + } + while (active) { + long current = System.currentTimeMillis(); + int minute = Calendar.getInstance().get(Calendar.MINUTE); + String minuteStr = String.valueOf(minute); + + if (minute < 10) { + minuteStr = '0' + minuteStr; + } + Transaction t = Cat.newTransaction("ThirdPartyAlert", "M" + minuteStr); + + try { + List alertEntities = new ArrayList(); + + while (m_entities.size() > 0) { + ThirdPartyAlertEntity entity = m_entities.poll(5, TimeUnit.MILLISECONDS); + + alertEntities.add(entity); + } + Map> domain2AlertMap = buildDomain2AlertMap(alertEntities); + + for (Entry> entry : domain2AlertMap.entrySet()) { + sendAlert(entry.getKey(), entry.getValue()); + } + + t.setStatus(Transaction.SUCCESS); + } catch (Exception e) { + t.setStatus(e); + Cat.logError(e); + } finally { + t.complete(); + } + long duration = System.currentTimeMillis() - current; + + try { + if (duration < DURATION) { + Thread.sleep(DURATION - duration); + } + } catch (InterruptedException e) { + active = false; + } + } + } + + private Map> buildDomain2AlertMap(List alertEntities) { + Map> domain2AlertMap = new HashMap>(); + + for (ThirdPartyAlertEntity entity : alertEntities) { + for (Domain domain : entity.getDomains()) { + String domainId = domain.getId(); + List alertList = domain2AlertMap.get(domainId); + + if (alertList == null) { + alertList = new ArrayList(); + + domain2AlertMap.put(domainId, alertList); + } + alertList.add(entity); + } + } + return domain2AlertMap; + } + + private Project queryProjectByDomain(String projectName) { + Project project = null; + try { + project = m_projectDao.findByDomain(projectName, ProjectEntity.READSET_FULL); + } catch (Exception e) { + Cat.logError(e); + } + return project; + } + + public String buildMailContent(String exceptions, String domain) { + StringBuilder sb = new StringBuilder(); + String time = new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date()); + + sb.append("[CAT第三方告警] [项目: ").append(domain).append("] : "); + sb.append(exceptions).append("[时间: ").append(time).append("]"); + + return sb.toString(); + } + + private void sendAlert(String domain, List entities) { + Project project = queryProjectByDomain(domain); + List emails = buildMailReceivers(project); + String mailTitle = buildMailTitle(domain); + String mailContent = buildMailContent(entities.toString(), domain); + + m_mailSender.sendAlert(emails, domain, mailTitle, mailContent, "warning"); + m_logger.info(mailTitle + " " + mailContent + " " + emails); + Cat.logEvent("ExceptionAlert", domain, Event.SUCCESS, "[邮件告警] " + mailTitle + " " + mailContent); + } + + private String buildMailTitle(String domain) { + StringBuilder sb = new StringBuilder(); + + sb.append("[CAT第三方告警] [项目: ").append(domain).append("]"); + return sb.toString(); + } + + private List buildMailReceivers(Project project) { + List mailReceivers = new ArrayList(); + + mailReceivers.addAll(split(project.getEmail())); + + return mailReceivers; + } + + private List split(String str) { + List result = new ArrayList(); + + if (str != null) { + result.addAll(Splitters.by(",").noEmptyItem().split(str)); + } + + return result; + } + + @Override + public void enableLogging(Logger logger) { + m_logger = logger; + } + + @Override + public String getName() { + return "thirdParty-alert"; + } + + @Override + public void shutdown() { + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/alert/thirdParty/ThirdPartyAlertEntity.java b/cat-home/src/main/java/com/dianping/cat/report/task/alert/thirdParty/ThirdPartyAlertEntity.java new file mode 100644 index 0000000000000000000000000000000000000000..a00acb0806e9cae3cc317ca37dbdc01ad140a803 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/report/task/alert/thirdParty/ThirdPartyAlertEntity.java @@ -0,0 +1,47 @@ +package com.dianping.cat.report.task.alert.thirdParty; + +import java.util.List; + +import com.dianping.cat.home.alert.thirdParty.entity.Domain; + +public class ThirdPartyAlertEntity { + + private String m_type; + + private List m_domains; + + private String m_details; + + public String getType() { + return m_type; + } + + public String getDetails() { + return m_details; + } + + public List getDomains() { + return m_domains; + } + + public ThirdPartyAlertEntity setType(String type) { + m_type = type; + return this; + } + + public ThirdPartyAlertEntity setDetails(String details) { + m_details = details; + return this; + } + + public ThirdPartyAlertEntity setDomains(List domains) { + m_domains = domains; + return this; + } + + @Override + public String toString() { + return "[type=" + m_type + ", details=" + m_details + "]"; + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/alert/thirdParty/ThirdPartyAlertTask.java b/cat-home/src/main/java/com/dianping/cat/report/task/alert/thirdParty/ThirdPartyAlertTask.java new file mode 100644 index 0000000000000000000000000000000000000000..e839eda40e5b80da05f3bb6b78ac4eba78174d43 --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/report/task/alert/thirdParty/ThirdPartyAlertTask.java @@ -0,0 +1,172 @@ +package com.dianping.cat.report.task.alert.thirdParty; + +import java.util.List; +import java.util.Timer; +import java.util.TimerTask; + +import org.codehaus.plexus.logging.LogEnabled; +import org.codehaus.plexus.logging.Logger; +import org.codehaus.plexus.util.StringUtils; +import org.unidal.helper.Threads.Task; +import org.unidal.lookup.annotation.Inject; + +import com.dianping.cat.Cat; +import com.dianping.cat.helper.TimeUtil; +import com.dianping.cat.home.alert.thirdParty.entity.Http; +import com.dianping.cat.message.Transaction; +import com.dianping.cat.system.config.ThirdPartyConfigManager; + +public class ThirdPartyAlertTask implements Task, LogEnabled { + + @Inject + private HttpMonitor m_httpMonitor; + + @Inject + private ThirdPartyAlert m_thirdPartyAlert; + + @Inject + private ThirdPartyConfigManager m_configManager; + + private static final long DURATION = TimeUtil.ONE_MINUTE; + + private Logger m_logger; + + @Override + public void run() { + boolean active = true; + + while (active) { + long current = System.currentTimeMillis(); + Transaction t = Cat.newTransaction("Task", "ThirdPartyAlert"); + + try { + buildAlertEntities(current); + t.setStatus(Transaction.SUCCESS); + } catch (Exception e) { + t.setStatus(e); + m_logger.error(e.getMessage(), e); + } finally { + t.complete(); + } + + long duration = System.currentTimeMillis() - current; + + try { + if (duration < DURATION) { + Thread.sleep(DURATION - duration); + } + } catch (InterruptedException e) { + active = false; + } + } + } + + public void putAlertEnity(ThirdPartyAlertEntity entity) { + m_thirdPartyAlert.put(entity); + } + + private String connectHttpUrl(Http http) { + String type = http.getType(); + String result = null; + String paras = http.getPars(); + + if (StringUtils.isNotEmpty(paras)) { + paras = paras.replaceAll("[;]", "&"); + http.setPars(paras); + } + + try { + if ("get".equalsIgnoreCase(type)) { + String url = http.getUrl(); + + if (StringUtils.isNotEmpty(paras)) { + url += "?" + paras; + } + result = m_httpMonitor.readFromGet(url); + } else if ("post".equalsIgnoreCase(type)) { + String url = http.getUrl(); + result = m_httpMonitor.readFromPost(url, paras); + } + } catch (Exception e) { + m_logger.error(e.getMessage(), e); + } + return result; + } + + private void buildAlertEntities(long current) { + List https = m_configManager.queryHttps(); + + for (Http http : https) { + String result = connectHttpUrl(http); + + if (StringUtils.isEmpty(result)) { + new HttpReconnector(this, http, current + DURATION); + } + } + } + + @Override + public String getName() { + return "thirdParty-alert-task"; + } + + @Override + public void enableLogging(Logger logger) { + m_logger = logger; + } + + @Override + public void shutdown() { + } + + public ThirdPartyAlertEntity buildAlertEntity(Http http) { + ThirdPartyAlertEntity entity = new ThirdPartyAlertEntity(); + String url = http.getUrl(); + String type = http.getType(); + String pars = http.getPars(); + String details = "HTTP URL[" + url + "?" + pars + "] " + type.toUpperCase() + "无法访问"; + + entity.setDomains(http.getDomains()).setType(type).setDetails(details); + return entity; + } + + public class HttpReconnector { + private Timer m_timer; + + public HttpReconnector(ThirdPartyAlertTask alertTask, Http http, long deadLine) { + m_timer = new Timer(); + m_timer.schedule(new RemindTask(alertTask, http, deadLine), 0, 5 * 1000); + } + + class RemindTask extends TimerTask { + private int m_reconncetNum = 2; + + private ThirdPartyAlertTask m_alertTask; + + private Http m_http; + + private long m_deadLine; + + public RemindTask(ThirdPartyAlertTask alertTask, Http http, long deadLine) { + m_alertTask = alertTask; + m_http = http; + m_deadLine = deadLine; + } + + public void run() { + if (m_reconncetNum > 0 && System.currentTimeMillis() < m_deadLine) { + m_reconncetNum--; + String result = m_alertTask.connectHttpUrl(m_http); + + if (StringUtils.isNotEmpty(result)) { + m_timer.cancel(); + } + } else { + m_timer.cancel(); + m_alertTask.putAlertEnity(m_alertTask.buildAlertEntity(m_http)); + } + } + } + } + +} diff --git a/cat-home/src/main/java/com/dianping/cat/system/config/ThirdPartyConfigManager.java b/cat-home/src/main/java/com/dianping/cat/system/config/ThirdPartyConfigManager.java new file mode 100644 index 0000000000000000000000000000000000000000..df65f8536e0f6959de594d3d8cd65adf30b736dd --- /dev/null +++ b/cat-home/src/main/java/com/dianping/cat/system/config/ThirdPartyConfigManager.java @@ -0,0 +1,102 @@ +package com.dianping.cat.system.config; + +import java.util.List; + +import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; +import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.unidal.dal.jdbc.DalNotFoundException; +import org.unidal.helper.Files; +import org.unidal.lookup.annotation.Inject; + +import com.dianping.cat.Cat; +import com.dianping.cat.core.config.Config; +import com.dianping.cat.core.config.ConfigDao; +import com.dianping.cat.core.config.ConfigEntity; +import com.dianping.cat.home.alert.thirdParty.entity.Http; +import com.dianping.cat.home.alert.thirdParty.entity.Socket; +import com.dianping.cat.home.alert.thirdParty.entity.ThirdPartyConfig; +import com.dianping.cat.home.alert.thirdParty.transform.DefaultSaxParser; + +public class ThirdPartyConfigManager implements Initializable { + + @Inject + private ConfigDao m_configDao; + + private int m_configId; + + private ThirdPartyConfig m_thirdPartyConfig; + + private static final String CONFIG_NAME = "thirdPartyConfig"; + + public List queryHttps() { + return m_thirdPartyConfig.getHttps(); + } + + public List querSockets() { + return m_thirdPartyConfig.getSockets(); + } + + public ThirdPartyConfig getConfig() { + return m_thirdPartyConfig; + } + + public boolean insert(String xml) { + try { + m_thirdPartyConfig = DefaultSaxParser.parse(xml); + + return storeConfig(); + } catch (Exception e) { + Cat.logError(e); + return false; + } + } + + private boolean storeConfig() { + synchronized (this) { + try { + Config config = m_configDao.createLocal(); + + config.setId(m_configId); + config.setKeyId(m_configId); + config.setName(CONFIG_NAME); + config.setContent(m_thirdPartyConfig.toString()); + m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL); + } catch (Exception e) { + Cat.logError(e); + return false; + } + } + return true; + } + + @Override + public void initialize() throws InitializationException { + try { + Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); + String content = config.getContent(); + + m_thirdPartyConfig = DefaultSaxParser.parse(content); + m_configId = config.getId(); + } catch (DalNotFoundException e) { + try { + String content = Files.forIO().readFrom( + this.getClass().getResourceAsStream("/config/default-thirdParty-config.xml"), "utf-8"); + Config config = m_configDao.createLocal(); + + config.setName(CONFIG_NAME); + config.setContent(content); + m_configDao.insert(config); + + m_thirdPartyConfig = DefaultSaxParser.parse(content); + m_configId = config.getId(); + } catch (Exception ex) { + Cat.logError(ex); + } + } catch (Exception e) { + Cat.logError(e); + } + if (m_thirdPartyConfig == null) { + m_thirdPartyConfig = new ThirdPartyConfig(); + } + } +} diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/Action.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/Action.java index 6ef01d1eaf8edbd55871136bb8f13818d42f3906..0e50176268a784c6fca7cf6f4fbb2b7d6cde2192 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/Action.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/Action.java @@ -95,7 +95,9 @@ public enum Action implements org.unidal.web.mvc.Action { NET_GRAPH_CONFIG_UPDATE("netGraphConfigUpdate"), - APP_CONFIG_UPDATE("appConfigUpdate"); + APP_CONFIG_UPDATE("appConfigUpdate"), + + THIRD_PARTY_CONFIG_UPDATE("thirdPartyConfigUpdate"); private String m_name; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/Handler.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/Handler.java index 2aeb67d200e7a960c048355a385026b8312b6937..45c74ec059c01fc1e5010640c30d0b520e976dfa 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/Handler.java @@ -55,6 +55,7 @@ import com.dianping.cat.system.config.MetricGroupConfigManager; import com.dianping.cat.system.config.NetGraphConfigManager; import com.dianping.cat.system.config.NetworkRuleConfigManager; import com.dianping.cat.system.config.SystemRuleConfigManager; +import com.dianping.cat.system.config.ThirdPartyConfigManager; public class Handler implements PageHandler { @Inject @@ -114,6 +115,9 @@ public class Handler implements PageHandler { @Inject private NetGraphConfigManager m_netGraphConfigManager; + @Inject + private ThirdPartyConfigManager m_thirdPartyConfigManager; + private void deleteAggregationRule(Payload payload) { m_aggreationConfigManager.deleteAggregationRule(payload.getPattern()); } @@ -468,6 +472,13 @@ public class Handler implements PageHandler { } model.setContent(m_appConfigManager.getConfig().toString()); break; + case THIRD_PARTY_CONFIG_UPDATE: + String thirdPartyConfig = payload.getContent(); + if (!StringUtils.isEmpty(thirdPartyConfig)) { + model.setOpState(m_thirdPartyConfigManager.insert(thirdPartyConfig)); + } + model.setContent(m_thirdPartyConfigManager.getConfig().toString()); + break; } m_jspViewer.view(ctx, model); } diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/JspFile.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/JspFile.java index 48ac1310cbf8e33305d08bb64206f0fccc3d718d..8f4f0d492546f42c53b7bcd912d80c06c8f53f39 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/JspFile.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/JspFile.java @@ -61,7 +61,9 @@ public enum JspFile { NET_GRAPH_CONFIG_UPDATE("/jsp/system/netGraphConfig/netGraphConfig.jsp"), - APP_CONFIG_UPDATE("/jsp/system/appConfig/appConfig.jsp"); + APP_CONFIG_UPDATE("/jsp/system/appConfig/appConfig.jsp"), + + THIRD_PARTY_CONFIG_UPDATE("/jsp/system/thirdParty/thirdPartyConfig.jsp"); private String m_path; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/JspViewer.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/JspViewer.java index 778b5bb98b8aea9f97318bafd4bfca508c5b479b..c48c77b13c6083556f4a74708aa1ea33580c0419 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/JspViewer.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/JspViewer.java @@ -108,8 +108,10 @@ public class JspViewer extends BaseJspViewer return JspFile.METRIC_GROUP_CONFIG_UPDATE.getPath(); case APP_CONFIG_UPDATE: return JspFile.APP_CONFIG_UPDATE.getPath(); + case THIRD_PARTY_CONFIG_UPDATE: + return JspFile.THIRD_PARTY_CONFIG_UPDATE.getPath(); } - + throw new RuntimeException("Unknown action: " + action); } } diff --git a/cat-home/src/main/resources/META-INF/dal/model/thirdParty-codegen.xml b/cat-home/src/main/resources/META-INF/dal/model/thirdParty-codegen.xml new file mode 100644 index 0000000000000000000000000000000000000000..f3553dcccd61b46f4f7b829c07215fef99b7e142 --- /dev/null +++ b/cat-home/src/main/resources/META-INF/dal/model/thirdParty-codegen.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/cat-home/src/main/resources/META-INF/dal/model/thirdParty-manifest.xml b/cat-home/src/main/resources/META-INF/dal/model/thirdParty-manifest.xml new file mode 100644 index 0000000000000000000000000000000000000000..5d208c6f61579ad803352178d6d789e65197f191 --- /dev/null +++ b/cat-home/src/main/resources/META-INF/dal/model/thirdParty-manifest.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/cat-home/src/main/resources/META-INF/dal/model/thirdParty-model.xml b/cat-home/src/main/resources/META-INF/dal/model/thirdParty-model.xml new file mode 100644 index 0000000000000000000000000000000000000000..592ba69fe8a2de1eb021369df435d31884e5800c --- /dev/null +++ b/cat-home/src/main/resources/META-INF/dal/model/thirdParty-model.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/cat-home/src/main/resources/META-INF/plexus/components.xml b/cat-home/src/main/resources/META-INF/plexus/components.xml index af03148109e7ccaeaa46955fb0b758a8a676459f..5a46d011abfb8721cab999b026d2c3ec375f9cd3 100755 --- a/cat-home/src/main/resources/META-INF/plexus/components.xml +++ b/cat-home/src/main/resources/META-INF/plexus/components.xml @@ -193,6 +193,15 @@ + + com.dianping.cat.system.config.ThirdPartyConfigManager + com.dianping.cat.system.config.ThirdPartyConfigManager + + + com.dianping.cat.core.config.ConfigDao + + + com.dianping.cat.system.config.ConfigReloadTask com.dianping.cat.system.config.ConfigReloadTask @@ -4164,6 +4173,9 @@ com.dianping.cat.system.config.NetGraphConfigManager + + com.dianping.cat.system.config.ThirdPartyConfigManager + @@ -4232,6 +4244,15 @@ + + com.dianping.cat.system.config.ThirdPartyConfigManager + com.dianping.cat.system.config.ThirdPartyConfigManager + + + com.dianping.cat.core.config.ConfigDao + + + com.dianping.cat.system.page.plugin.Handler com.dianping.cat.system.page.plugin.Handler @@ -4491,6 +4512,37 @@ + + com.dianping.cat.report.task.alert.thirdParty.ThirdPartyAlert + com.dianping.cat.report.task.alert.thirdParty.ThirdPartyAlert + + + com.dianping.cat.core.dal.ProjectDao + + + com.dianping.cat.report.task.alert.sender.MailSender + + + + + com.dianping.cat.report.task.alert.thirdParty.HttpMonitor + com.dianping.cat.report.task.alert.thirdParty.HttpMonitor + + + com.dianping.cat.report.task.alert.thirdParty.ThirdPartyAlertTask + com.dianping.cat.report.task.alert.thirdParty.ThirdPartyAlertTask + + + com.dianping.cat.report.task.alert.thirdParty.HttpMonitor + + + com.dianping.cat.report.task.alert.thirdParty.ThirdPartyAlert + + + com.dianping.cat.system.config.ThirdPartyConfigManager + + + org.unidal.initialization.Module cat-home @@ -7918,6 +7970,9 @@ com.dianping.cat.system.config.NetGraphConfigManager + + com.dianping.cat.system.config.ThirdPartyConfigManager + @@ -7986,6 +8041,15 @@ + + com.dianping.cat.system.config.ThirdPartyConfigManager + com.dianping.cat.system.config.ThirdPartyConfigManager + + + com.dianping.cat.core.config.ConfigDao + + + com.dianping.cat.system.page.plugin.Handler com.dianping.cat.system.page.plugin.Handler diff --git a/cat-home/src/main/resources/META-INF/wizard/model/wizard.xml b/cat-home/src/main/resources/META-INF/wizard/model/wizard.xml index e618f72e3124976183cff0d9b78cbab7267d32d2..e76a57b82d7b5ed19cdfb670632554b625985da1 100644 --- a/cat-home/src/main/resources/META-INF/wizard/model/wizard.xml +++ b/cat-home/src/main/resources/META-INF/wizard/model/wizard.xml @@ -54,4 +54,7 @@ /Users/leon/Desktop/AlertSummary.xml + + src/test/resources/config/thirdParty-config.xml + diff --git a/cat-home/src/main/resources/config/default-thirdParty-config.xml b/cat-home/src/main/resources/config/default-thirdParty-config.xml new file mode 100644 index 0000000000000000000000000000000000000000..8ac27d02ba43778d4ea3623450458bb4afde1ca2 --- /dev/null +++ b/cat-home/src/main/resources/config/default-thirdParty-config.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/cat-home/src/main/webapp/jsp/system/configTree.jsp b/cat-home/src/main/webapp/jsp/system/configTree.jsp index 1699b6a1211a591be92e98033f9f3225a2eb7e26..b0be68789f098e64b7002c4c3b71f97b0209c422 100644 --- a/cat-home/src/main/webapp/jsp/system/configTree.jsp +++ b/cat-home/src/main/webapp/jsp/system/configTree.jsp @@ -12,6 +12,7 @@
  • URL合并规则
  • JS合并规则
  • APP监控配置
  • +
  • 第三方监控配置
  • 业务监控规则
  • 业务指标分组
  • diff --git a/cat-home/src/main/webapp/jsp/system/thirdParty/thirdPartyConfig.jsp b/cat-home/src/main/webapp/jsp/system/thirdParty/thirdPartyConfig.jsp new file mode 100644 index 0000000000000000000000000000000000000000..e03637707790495eb1e2cc999b0a4d7a2ac55dbc --- /dev/null +++ b/cat-home/src/main/webapp/jsp/system/thirdParty/thirdPartyConfig.jsp @@ -0,0 +1,48 @@ +<%@ page contentType="text/html; charset=utf-8" %> +<%@ taglib prefix="a" uri="/WEB-INF/app.tld"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="res" uri="http://www.unidal.org/webres"%> +<%@ taglib prefix="w" uri="http://www.unidal.org/web/core"%> + + + + + + + +
    +
    + <%@include file="../configTree.jsp"%> +
    +
    +
    +

     

    +

    第三方监控配置

    + + + + + + + +
    +
    +
    +
    +
    + \ No newline at end of file diff --git a/cat-home/src/test/resources/config/thirdParty-config.xml b/cat-home/src/test/resources/config/thirdParty-config.xml new file mode 100644 index 0000000000000000000000000000000000000000..81a757cc94a503ffa3defea846c9fea5033439dd --- /dev/null +++ b/cat-home/src/test/resources/config/thirdParty-config.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file