提交 756dcc38 编写于 作者: J jialinsun

修复exception alert bug,重构代码。忽略Agent部分修改

上级 bfad1677
package com.dianping.cat.agent.system;
package com.dianping.cat.agent;
import java.io.BufferedReader;
import java.io.InputStreamReader;
......
package com.dianping.cat.agent.system;
package com.dianping.cat.agent;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class SystemAgent {
import com.dianping.cat.agent.jvm.jvmTask;
import com.dianping.cat.agent.system.PerformanceTask;
public class Agent {
public static final int THREAD_NUM = 3;
......@@ -17,7 +20,7 @@ public class SystemAgent {
executorService.execute(new PerformanceTask(config));
executorService.execute(new StateTask(config));
executorService.execute(new JVMTask(config));
executorService.execute(new jvmTask(config));
executorService.shutdown();
}
}
package com.dianping.cat.agent.system;
package com.dianping.cat.agent;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
......
package com.dianping.cat.agent.system;
package com.dianping.cat.agent;
import java.net.Inet4Address;
import java.net.InetAddress;
......
package com.dianping.cat.agent.system;
package com.dianping.cat.agent;
import java.io.BufferedReader;
import java.io.File;
......
package com.dianping.cat.agent.system;
package com.dianping.cat.agent.jvm;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class JVMTask extends AbstractTask {
import com.dianping.cat.agent.AbstractTask;
import com.dianping.cat.agent.Configuration;
public JVMTask(Configuration config) {
public class jvmTask extends AbstractTask {
public jvmTask(Configuration config) {
super(config);
m_domain = config.getJvmDomain();
}
......
package com.dianping.cat.agent.nginx;
import com.dianping.cat.agent.AbstractTask;
import com.dianping.cat.agent.Configuration;
public class nginxTask extends AbstractTask {
public nginxTask(Configuration config) {
super(config);
// TODO Auto-generated constructor stub
}
}
......@@ -8,6 +8,9 @@ import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;
import org.hyperic.sigar.Swap;
import com.dianping.cat.agent.AbstractTask;
import com.dianping.cat.agent.Configuration;
public class PerformanceTask extends AbstractTask {
private Sigar m_sigar;
......
......@@ -11,7 +11,6 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
import com.dianping.cat.Cat;
import com.dianping.cat.report.task.alert.AlertInfo;
import com.dianping.cat.consumer.metric.model.entity.MetricItem;
import com.dianping.cat.consumer.metric.model.entity.MetricReport;
import com.dianping.cat.home.nettopo.entity.Anchor;
......
......@@ -20,8 +20,6 @@ import org.unidal.tuple.Pair;
import com.dianping.cat.Cat;
import com.dianping.cat.Constants;
import com.dianping.cat.ServerConfigManager;
import com.dianping.cat.advanced.metric.config.entity.MetricItemConfig;
import com.dianping.cat.consumer.metric.MetricConfigManager;
import com.dianping.cat.consumer.metric.model.entity.MetricReport;
import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.home.nettopo.entity.NetGraph;
......
......@@ -20,7 +20,7 @@ public class Payload extends AbstractReportPayload<Action> {
private String m_domain = "Cat";
@FieldMeta("productLine")
private String m_productLine;
private String m_productLine = "中间件";
@FieldMeta("type")
private String m_type = "system";
......
......@@ -162,6 +162,12 @@ public class TopMetric extends BaseVisitor {
private double m_value;
@Override
public String toString() {
return "Item [m_domain=" + m_domain + ", m_value=" + m_value + ", m_alert=" + m_alert + ", m_configManager="
+ m_configManager + ", m_exceptions=" + m_exceptions + "]";
}
private int m_alert;
private ExceptionConfigManager m_configManager;
......
......@@ -14,6 +14,7 @@ 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 org.unidal.tuple.Pair;
import com.dianping.cat.Cat;
import com.dianping.cat.Constants;
......@@ -78,68 +79,96 @@ public class ExceptionAlert implements Task, LogEnabled {
m_logger = logger;
}
private List<AlertException> findOrCreateDomain(Map<String, List<AlertException>> exceptions, String domain) {
if (exceptions.get(domain) == null) {
List<AlertException> exception = new ArrayList<AlertException>();
private Pair<Double, Double> queryDomainTotalLimit(String domain) {
ExceptionLimit totalExceptionLimit = m_exceptionConfigManager.queryDomainTotalLimit(domain);
Pair<Double, Double> limits = new Pair<Double, Double>();
double totalWarnLimit = -1;
double totalErrorLimit = -1;
exceptions.put(domain, exception);
return exception;
if (totalExceptionLimit != null) {
totalWarnLimit = totalExceptionLimit.getWarning();
totalErrorLimit = totalExceptionLimit.getError();
}
return exceptions.get(domain);
limits.setKey(totalWarnLimit);
limits.setValue(totalErrorLimit);
return limits;
}
private Map<String, List<AlertException>> getAlertExceptions(Collection<List<Item>> items) {
Map<String, List<AlertException>> alertExceptions = new LinkedHashMap<String, List<AlertException>>();
for (List<Item> item : items) {
for (Item i : item) {
String domain = i.getDomain();
ExceptionLimit totalExceptionLimit = m_exceptionConfigManager.queryDomainTotalLimit(domain);
int totalWarnLimit = -1;
int totalErrorLimit = -1;
int totalException = 0;
if (totalExceptionLimit != null) {
totalWarnLimit = totalExceptionLimit.getWarning();
totalErrorLimit = totalExceptionLimit.getError();
}
private Pair<Double, Double> queryDomainExceptionLimit(String domain, String exceptionName) {
ExceptionLimit exceptionLimit = m_exceptionConfigManager.queryDomainExceptionLimit(domain, exceptionName);
Pair<Double, Double> limits = new Pair<Double, Double>();
double warnLimit = -1;
double errorLimit = -1;
for (Entry<String, Double> entry : i.getException().entrySet()) {
String exceptionName = entry.getKey();
ExceptionExclude result = m_exceptionConfigManager.queryDomainExceptionExclude(domain, exceptionName);
if (exceptionLimit != null) {
warnLimit = exceptionLimit.getWarning();
errorLimit = exceptionLimit.getError();
}
limits.setKey(warnLimit);
limits.setValue(errorLimit);
if (result != null) {
continue;
}
return limits;
}
double value = entry.getValue().doubleValue();
double warnLimit = -1;
double errorLimit = -1;
ExceptionLimit exceptionLimit = m_exceptionConfigManager
.queryDomainExceptionLimit(domain, exceptionName);
totalException += entry.getValue();
if (exceptionLimit != null) {
warnLimit = exceptionLimit.getWarning();
errorLimit = exceptionLimit.getError();
if (errorLimit > 0 && value > errorLimit) {
findOrCreateDomain(alertExceptions, domain).add(
new AlertException(exceptionName, ERROR_FLAG, value));
} else if (warnLimit > 0 && value > warnLimit) {
findOrCreateDomain(alertExceptions, domain).add(
new AlertException(exceptionName, WARN_FLAG, value));
}
}
}
private boolean isExcludedException(String domain, String exceptionName) {
ExceptionExclude result = m_exceptionConfigManager.queryDomainExceptionExclude(domain, exceptionName);
if (totalErrorLimit > 0 && totalException > totalErrorLimit) {
findOrCreateDomain(alertExceptions, domain).add(
new AlertException(TOTAL_EXCEPTION_NAME, ERROR_FLAG, totalException));
} else if (totalWarnLimit > 0 && totalException > totalWarnLimit) {
findOrCreateDomain(alertExceptions, domain).add(
new AlertException(TOTAL_EXCEPTION_NAME, WARN_FLAG, totalException));
}
if (result != null) {
return true;
} else {
return false;
}
}
private List<AlertException> buildDomainAlertExceptionList(Item item) {
String domain = item.getDomain();
List<AlertException> alertExceptions = new ArrayList<AlertException>();
Pair<Double, Double> totalLimitPair = queryDomainTotalLimit(domain);
double totalWarnLimit = totalLimitPair.getKey();
double totalErrorLimit = totalLimitPair.getValue();
double totalException = 0;
// different exception -> numbers
for (Entry<String, Double> entry : item.getException().entrySet()) {
String exceptionName = entry.getKey();
if (isExcludedException(domain, exceptionName)) {
continue;
}
double value = entry.getValue().doubleValue();
Pair<Double, Double> limitPair = queryDomainExceptionLimit(domain, exceptionName);
double warnLimit = limitPair.getKey();
double errorLimit = limitPair.getValue();
totalException += value;
if (errorLimit > 0 && value > errorLimit) {
alertExceptions.add(new AlertException(exceptionName, ERROR_FLAG, value));
} else if (warnLimit > 0 && value > warnLimit) {
alertExceptions.add(new AlertException(exceptionName, WARN_FLAG, value));
}
}
if (totalErrorLimit > 0 && totalException > totalErrorLimit) {
alertExceptions.add(new AlertException(TOTAL_EXCEPTION_NAME, ERROR_FLAG, totalException));
} else if (totalWarnLimit > 0 && totalException > totalWarnLimit) {
alertExceptions.add(new AlertException(TOTAL_EXCEPTION_NAME, WARN_FLAG, totalException));
}
return alertExceptions;
}
private Map<String, List<AlertException>> buildAlertExceptions(List<Item> items) {
Map<String, List<AlertException>> alertExceptions = new LinkedHashMap<String, List<AlertException>>();
// different domain -> [excepitons:numbers]
for (Item item : items) {
List<AlertException> domainAlertExceptions = buildDomainAlertExceptionList(item);
if (!domainAlertExceptions.isEmpty()) {
alertExceptions.put(item.getDomain(), domainAlertExceptions);
}
}
return alertExceptions;
......@@ -196,7 +225,8 @@ public class ExceptionAlert implements Task, LogEnabled {
try {
TopMetric topMetric = buildTopMetric(new Date(current - TimeUtil.ONE_MINUTE * 2));
Collection<List<Item>> items = topMetric.getError().getResult().values();
Map<String, List<AlertException>> alertExceptions = getAlertExceptions(items);
List<Item> item = items.iterator().next();
Map<String, List<AlertException>> alertExceptions = buildAlertExceptions(item);
for (Entry<String, List<AlertException>> entry : alertExceptions.entrySet()) {
try {
......
......@@ -34,8 +34,6 @@ public class ExceptionConfigManager implements Initializable {
public static String TOTAL_STRING = "Total";
public static String ALL_STRING = "All";
public boolean deleteExceptionLimit(String domain, String exceptionName) {
DomainConfig domainConfig = m_exceptionConfig.findOrCreateDomainConfig(domain);
domainConfig.removeExceptionLimit(exceptionName);
......@@ -131,20 +129,35 @@ public class ExceptionConfigManager implements Initializable {
return result;
}
private ExceptionExclude queryDefaultExceptionExclude(String exceptionName) {
DomainConfig domainConfig = m_exceptionConfig.getDomainConfigs().get(DEFAULT_STRING);
ExceptionExclude result = null;
if (domainConfig != null) {
result = domainConfig.getExceptionExcludes().get(exceptionName);
}
return result;
}
public ExceptionExclude queryDomainExceptionExclude(String domain, String exceptionName) {
DomainConfig domainConfig = m_exceptionConfig.getDomainConfigs().get(domain);
ExceptionExclude result = null;
// has no this domain config
if (domainConfig == null) {
domainConfig = m_exceptionConfig.getDomainConfigs().get(DEFAULT_STRING);
result = queryDefaultExceptionExclude(exceptionName);
}
if (domainConfig != null) {
result = domainConfig.getExceptionExcludes().get(exceptionName);
// domain config has no exclude for exception, check default exclude config
if (result == null) {
result = domainConfig.getExceptionExcludes().get(ALL_STRING);
result = queryDefaultExceptionExclude(exceptionName);
}
}
if (domain.equalsIgnoreCase("PromoServer") && result == null) {
System.out.println(m_exceptionConfig.getDomainConfigs());
}
return result;
}
......
......@@ -396,7 +396,6 @@ public class Handler implements PageHandler<Context> {
case EXCEPTION_EXCLUDE_ADD:
List<String> exceptionExcludeList = queryExceptionList();
exceptionExcludeList.add(ExceptionConfigManager.ALL_STRING);
model.setExceptionList(exceptionExcludeList);
model.setDomainList(queryDoaminList());
break;
......
......@@ -97,6 +97,8 @@
<div id="${item.id}" class="metricGraph"></div>
</div>
</c:forEach>
</div>
</div>
</div>
</a:body>
</c:otherwise></c:choose>
......
......@@ -95,6 +95,7 @@
</div>
</c:forEach>
</div>
</div>
</div>
</a:body>
</c:otherwise></c:choose>
......@@ -131,6 +132,12 @@
}
</script>
<style type="text/css">
.row-fluid .span2{
width:10%;
}
.row-fluid .span10{
width:87%;
}
.well {
padding: 10px 10px 10px 19p;
}
......
......@@ -155,4 +155,25 @@ function showOpNav() {
</c:choose>
</script>
<style type="text/css">
.row-fluid .span2{
width:10%;
}
.row-fluid .span10{
width:87%;
}
.well {
padding: 10px 10px 10px 19p;
}
.nav-list li a{
padding:2px 15px;
}
.nav li +.nav-header{
margin-top:2px;
}
.nav-header{
padding:5px 3px;
}
</style>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册