提交 33480e27 编写于 作者: Y yong.you

modify the company productline and fix topology graph

上级 b1f5d1ef
......@@ -193,6 +193,18 @@
${basedir}/src/main/resources/META-INF/dal/jdbc/alarm-manifest.xml,]]></manifest>
</configuration>
</execution>
<execution>
<id>generate dal model files</id>
<phase>generate-sources</phase>
<goals>
<goal>dal-model</goal>
</goals>
<configuration>
<manifest><![CDATA[${basedir}/src/main/resources/META-INF/dal/model/topology-graph-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/topology-graph-config-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/company-manifest.xml,]]></manifest>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
......
......@@ -83,6 +83,7 @@ import com.dianping.cat.report.task.transaction.TransactionGraphCreator;
import com.dianping.cat.report.task.transaction.TransactionMerger;
import com.dianping.cat.report.task.transaction.TransactionReportBuilder;
import com.dianping.cat.report.view.DomainNavManager;
import com.dianping.cat.system.config.ProductLineConfigManager;
public class ComponentsConfigurator extends AbstractResourceConfigurator {
public static void main(String[] args) {
......@@ -163,7 +164,7 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
all.add(C(DependencyReportBuilder.class) //
.req(GraphDao.class, DailygraphDao.class, ReportDao.class, DailyreportDao.class)//
.req(WeeklyreportDao.class, MonthreportDao.class)//
.req(ReportService.class,TopologyGraphBuilder.class,TopologyGraphDao.class));
.req(ReportService.class, TopologyGraphBuilder.class, TopologyGraphDao.class));
all.add(C(TaskProducer.class, TaskProducer.class) //
.req(TaskDao.class, ReportDao.class));
......@@ -176,7 +177,7 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
.req(TransactionReportBuilder.class, EventReportBuilder.class, ProblemReportBuilder.class,//
HeartbeatReportBuilder.class, MatrixReportBuilder.class, CrossReportBuilder.class,//
DatabaseReportBuilder.class, SqlReportBuilder.class, HealthReportBuilder.class,//
StateReportBuilder.class,DependencyReportBuilder.class));
StateReportBuilder.class, DependencyReportBuilder.class));
all.add(C(PayloadNormalizer.class).req(ServerConfigManager.class));
......@@ -219,6 +220,8 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
all.add(C(EventCollectManager.class).req(EventDao.class, ServerConfigManager.class));
all.add(C(ProductLineConfigManager.class).req(ConfigDao.class));
all.add(C(TopologyGraphConfigManager.class).req(ConfigDao.class));
all.add(C(TopologyGraphItemBuilder.class).req(TopologyGraphConfigManager.class));
......@@ -228,8 +231,9 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
// model service
all.addAll(new ServiceComponentConfigurator().defineComponents());
all.add(C(TopologyGraphManager.class).req(TopologyGraphBuilder.class, ServerConfigManager.class)//
.req(TopologyGraphConfigManager.class,TopologyGraphDao.class).req(ModelService.class, "dependency"));
all.add(C(TopologyGraphManager.class).req(TopologyGraphBuilder.class, ServerConfigManager.class) //
.req(ProductLineConfigManager.class, TopologyGraphDao.class)//
.req(ModelService.class, "dependency"));
// database
all.add(C(JdbcDataSourceConfigurationManager.class) //
......
......@@ -30,11 +30,11 @@ import com.dianping.cat.consumer.problem.model.entity.ProblemReport;
import com.dianping.cat.consumer.top.model.entity.TopReport;
import com.dianping.cat.helper.CatString;
import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.home.company.entity.ProductLine;
import com.dianping.cat.home.dal.report.Event;
import com.dianping.cat.home.dependency.config.entity.ProductLine;
import com.dianping.cat.home.dependency.graph.entity.TopologyEdge;
import com.dianping.cat.home.dependency.graph.entity.TopologyNode;
import com.dianping.cat.home.dependency.graph.entity.TopologyGraph;
import com.dianping.cat.home.dependency.graph.entity.TopologyNode;
import com.dianping.cat.home.dependency.graph.transform.DefaultJsonBuilder;
import com.dianping.cat.report.ReportPage;
import com.dianping.cat.report.page.LineChart;
......@@ -43,7 +43,6 @@ import com.dianping.cat.report.page.dependency.dashboard.ProductLineDashboard;
import com.dianping.cat.report.page.dependency.dashboard.ProductLinesDashboard;
import com.dianping.cat.report.page.dependency.graph.GraphConstrant;
import com.dianping.cat.report.page.dependency.graph.LineGraphBuilder;
import com.dianping.cat.report.page.dependency.graph.TopologyGraphConfigManager;
import com.dianping.cat.report.page.dependency.graph.TopologyGraphManager;
import com.dianping.cat.report.page.externalError.EventCollectManager;
import com.dianping.cat.report.page.model.dependency.DependencyReportMerger;
......@@ -52,6 +51,7 @@ import com.dianping.cat.report.page.model.spi.ModelResponse;
import com.dianping.cat.report.page.model.spi.ModelService;
import com.dianping.cat.report.page.top.TopMetric;
import com.dianping.cat.report.service.ReportService;
import com.dianping.cat.system.config.ProductLineConfigManager;
public class Handler implements PageHandler<Context> {
......@@ -63,9 +63,9 @@ public class Handler implements PageHandler<Context> {
@Inject
private TopologyGraphManager m_graphManager;
@Inject
private TopologyGraphConfigManager m_graphConfigManager;
private ProductLineConfigManager m_productLineConfigManger;
@Inject
private ReportService m_reportService;
......@@ -395,7 +395,7 @@ public class Handler implements PageHandler<Context> {
model.setReportStart(new Date(payload.getDate()));
model.setReportEnd(new Date(payload.getDate() + TimeUtil.ONE_HOUR - 1));
model.setProductLineGraph(productLineGraph.toJson());
model.setProductLines(new ArrayList<ProductLine>(m_graphConfigManager.queryProductLines().values()));
model.setProductLines(new ArrayList<ProductLine>(m_productLineConfigManger.queryProductLines().values()));
break;
}
m_jspViewer.view(ctx, model);
......
......@@ -13,8 +13,8 @@ import org.unidal.web.mvc.view.annotation.ModelMeta;
import com.dianping.cat.consumer.dependency.model.entity.DependencyReport;
import com.dianping.cat.consumer.dependency.model.entity.Segment;
import com.dianping.cat.consumer.top.model.entity.TopReport;
import com.dianping.cat.home.company.entity.ProductLine;
import com.dianping.cat.home.dal.report.Event;
import com.dianping.cat.home.dependency.config.entity.ProductLine;
import com.dianping.cat.report.page.AbstractReportModel;
import com.dianping.cat.report.page.dependency.dashboard.ProductLinesDashboard;
import com.dianping.cat.report.page.top.TopMetric;
......
......@@ -16,8 +16,8 @@ import com.dianping.cat.consumer.dependency.model.entity.Segment;
import com.dianping.cat.consumer.dependency.model.transform.BaseVisitor;
import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.home.dependency.graph.entity.TopologyEdge;
import com.dianping.cat.home.dependency.graph.entity.TopologyNode;
import com.dianping.cat.home.dependency.graph.entity.TopologyGraph;
import com.dianping.cat.home.dependency.graph.entity.TopologyNode;
public class TopologyGraphBuilder extends BaseVisitor {
......
......@@ -3,24 +3,13 @@ package com.dianping.cat.report.page.dependency.graph;
import java.io.File;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
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.Threads;
import org.unidal.helper.Threads.Task;
import org.unidal.lookup.annotation.Inject;
import org.unidal.tuple.Pair;
import org.unidal.webres.helper.Files;
......@@ -32,24 +21,18 @@ import com.dianping.cat.consumer.core.config.ConfigEntity;
import com.dianping.cat.consumer.dependency.model.entity.Dependency;
import com.dianping.cat.consumer.dependency.model.entity.Index;
import com.dianping.cat.helper.CatString;
import com.dianping.cat.helper.MapUtils;
import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.home.dependency.config.entity.Domain;
import com.dianping.cat.home.dependency.config.entity.DomainConfig;
import com.dianping.cat.home.dependency.config.entity.EdgeConfig;
import com.dianping.cat.home.dependency.config.entity.NodeConfig;
import com.dianping.cat.home.dependency.config.entity.ProductLine;
import com.dianping.cat.home.dependency.config.entity.TopologyGraphConfig;
import com.dianping.cat.home.dependency.config.transform.DefaultSaxParser;
public class TopologyGraphConfigManager implements Initializable, LogEnabled {
public class TopologyGraphConfigManager implements Initializable {
@Inject
private ConfigDao m_configDao;
private TopologyGraphConfig m_config;
private Map<String, String> m_domainToProductLine = new HashMap<String, String>();
private DecimalFormat m_df = new DecimalFormat("0.0");
private static final String AVG_STR = CatString.RESPONSE_TIME;
......@@ -72,22 +55,17 @@ public class TopologyGraphConfigManager implements Initializable, LogEnabled {
private String m_fileName;
private long m_modifyTime;
private Set<String> m_pigeonCalls = new HashSet<String>(Arrays.asList("Call", "PigeonCall", "PigeonClient"));
private Set<String> m_pigeonServices = new HashSet<String>(Arrays.asList("Service", "PigeonService", "PigeonServer"));
private Logger m_logger;
private String buildDes(String... args) {
StringBuilder sb = new StringBuilder();
int len = args.length;
for (int i = 0; i < len - 1; i++) {
for (int i = 0; i < len; i++) {
sb.append(args[i]).append(GraphConstrant.DELIMITER);
}
sb.append(args[len - 1]).append(GraphConstrant.ENTER);
return sb.toString();
}
......@@ -103,25 +81,25 @@ public class TopologyGraphConfigManager implements Initializable, LogEnabled {
if (config != null) {
double avg = dependency.getAvg();
sb.append(buildDes(type, TOTAL_STR, String.valueOf(dependency.getTotalCount())));
sb.append(buildDes(type, TOTAL_STR, String.valueOf(dependency.getTotalCount()))).append(GraphConstrant.ENTER);
if (avg >= config.getErrorResponseTime()) {
errorCode = ERROR;
sb.append(buildErrorDes(type, AVG_STR, m_df.format(avg), MILLISECOND));
sb.append(buildErrorDes(type, AVG_STR, m_df.format(avg), MILLISECOND)).append(GraphConstrant.ENTER);
} else if (avg >= config.getWarningResponseTime()) {
errorCode = WARN;
sb.append(buildErrorDes(type, AVG_STR, m_df.format(avg), MILLISECOND));
sb.append(buildErrorDes(type, AVG_STR, m_df.format(avg), MILLISECOND)).append(GraphConstrant.ENTER);
} else {
sb.append(buildDes(type, AVG_STR, m_df.format(avg), MILLISECOND));
sb.append(buildDes(type, AVG_STR, m_df.format(avg), MILLISECOND)).append(GraphConstrant.ENTER);
}
if (error >= config.getErrorThreshold()) {
errorCode = ERROR;
sb.append(buildErrorDes(type, ERROR_STR, String.valueOf(error)));
sb.append(buildErrorDes(type, ERROR_STR, String.valueOf(error))).append(GraphConstrant.ENTER);
} else if (error >= config.getWarningThreshold()) {
errorCode = WARN;
sb.append(buildErrorDes(type, ERROR_STR, String.valueOf(error)));
sb.append(buildErrorDes(type, ERROR_STR, String.valueOf(error))).append(GraphConstrant.ENTER);
} else if (error > 0) {
sb.append(buildDes(type, ERROR_STR, String.valueOf(error)));
sb.append(buildDes(type, ERROR_STR, String.valueOf(error))).append(GraphConstrant.ENTER);
}
}
Pair<Integer, String> result = new Pair<Integer, String>();
......@@ -133,12 +111,9 @@ public class TopologyGraphConfigManager implements Initializable, LogEnabled {
private String buildErrorDes(String... args) {
StringBuilder sb = new StringBuilder("<span style='color:red'>");
int len = args.length;
String content = buildDes(args);
for (int i = 0; i < len - 1; i++) {
sb.append(args[i]).append(GraphConstrant.DELIMITER);
}
sb.append(args[len - 1]).append("</span>").append(GraphConstrant.ENTER);
sb.append(content).append("</span>");
return sb.toString();
}
......@@ -152,28 +127,34 @@ public class TopologyGraphConfigManager implements Initializable, LogEnabled {
if (config != null) {
double avg = index.getAvg();
long error = index.getErrorCount();
sb.append(buildDes(type, TOTAL_STR, String.valueOf(index.getTotalCount())));
sb.append(type).append(GraphConstrant.DELIMITER);
if (index.getTotalCount() > 0) {
sb.append(buildDes(TOTAL_STR, String.valueOf(index.getTotalCount())));
}
if (avg >= config.getErrorResponseTime()) {
errorCode = ERROR;
sb.append(buildErrorDes(type, AVG_STR, m_df.format(avg), MILLISECOND));
sb.append(buildErrorDes(AVG_STR, m_df.format(avg), MILLISECOND));
} else if (avg >= config.getWarningResponseTime()) {
errorCode = WARN;
sb.append(buildErrorDes(type, AVG_STR, m_df.format(avg), MILLISECOND));
sb.append(buildErrorDes(AVG_STR, m_df.format(avg), MILLISECOND));
} else {
if (!type.equals("Exception")) {
sb.append(buildDes(type, AVG_STR, m_df.format(avg), MILLISECOND));
if (!type.equalsIgnoreCase("Exception")) {
sb.append(buildDes(AVG_STR, m_df.format(avg), MILLISECOND));
}
}
if (error >= config.getErrorThreshold()) {
errorCode = ERROR;
sb.append(buildErrorDes(type, ERROR_STR, String.valueOf(error)));
sb.append(buildErrorDes(ERROR_STR, String.valueOf(error)));
} else if (error >= config.getWarningThreshold()) {
errorCode = WARN;
sb.append(buildErrorDes(type, ERROR_STR, String.valueOf(error)));
sb.append(buildErrorDes(ERROR_STR, String.valueOf(error)));
} else if (error > 0) {
sb.append(buildDes(type, ERROR_STR, String.valueOf(error)));
sb.append(buildDes(ERROR_STR, String.valueOf(error)));
}
sb.append(GraphConstrant.ENTER);
}
Pair<Integer, String> result = new Pair<Integer, String>();
......@@ -204,16 +185,6 @@ public class TopologyGraphConfigManager implements Initializable, LogEnabled {
return storeConfig();
}
public boolean deleteProductLine(String line) {
m_config.removeProductLine(line);
return storeConfig();
}
@Override
public void enableLogging(Logger logger) {
m_logger = logger;
}
private String formatType(String type) {
String realType = type;
if (type.startsWith("Cache.")) {
......@@ -246,7 +217,6 @@ public class TopologyGraphConfigManager implements Initializable, LogEnabled {
m_config = DefaultSaxParser.parse(content);
m_configId = config.getId();
m_modifyTime = config.getModifyDate().getTime();
} catch (DalNotFoundException e) {
try {
String content = Files.forIO().readFrom(
......@@ -259,7 +229,6 @@ public class TopologyGraphConfigManager implements Initializable, LogEnabled {
m_config = DefaultSaxParser.parse(content);
m_configId = config.getId();
m_modifyTime = config.getModifyDate().getTime();
} catch (Exception ex) {
Cat.logError(ex);
}
......@@ -270,8 +239,6 @@ public class TopologyGraphConfigManager implements Initializable, LogEnabled {
m_config = new TopologyGraphConfig();
}
}
Threads.forGroup("Cat").start(new Reload());
}
public boolean insertDomainConfig(String type, DomainConfig config) {
......@@ -295,16 +262,6 @@ public class TopologyGraphConfigManager implements Initializable, LogEnabled {
return storeConfig();
}
public boolean insertProductLine(ProductLine line, String[] domains) {
m_config.removeProductLine(line.getId());
m_config.addProductLine(line);
for (String domain : domains) {
line.addDomain(new Domain(domain));
}
return storeConfig();
}
public EdgeConfig queryEdgeConfig(String type, String from, String to) {
EdgeConfig edgeConfig = m_config.findEdgeConfig(type + ":" + from + ":" + to);
......@@ -343,38 +300,6 @@ public class TopologyGraphConfigManager implements Initializable, LogEnabled {
return null;
}
public String queryProductLineByDomain(String domain) {
return m_domainToProductLine.get(domain);
}
public List<String> queryProductLineDomains(String productLine) {
List<String> domains = new ArrayList<String>();
ProductLine line = m_config.findProductLine(productLine);
if (line != null) {
for (Domain domain : line.getDomains().values()) {
domains.add(domain.getId());
}
}
return domains;
}
public Map<String, ProductLine> queryProductLines() {
Map<String, ProductLine> productLines = new TreeMap<String, ProductLine>();
for (ProductLine line : m_config.getProductLines().values()) {
productLines.put(line.getId(), line);
}
return MapUtils.sortMap(productLines, new Comparator<Map.Entry<String, ProductLine>>() {
@Override
public int compare(Entry<String, ProductLine> o1, Entry<String, ProductLine> o2) {
return (int) (o2.getValue().getOrder() * 100 - o1.getValue().getOrder() * 100);
}
});
}
public void setFileName(String file) {
m_fileName = file;
}
......@@ -401,58 +326,7 @@ public class TopologyGraphConfigManager implements Initializable, LogEnabled {
}
}
Map<String, ProductLine> productLines = m_config.getProductLines();
Map<String, String> domainToProductLine = new HashMap<String, String>();
for (ProductLine product : productLines.values()) {
for (Domain domain : product.getDomains().values()) {
domainToProductLine.put(domain.getId(), product.getId());
}
}
m_domainToProductLine = domainToProductLine;
return true;
}
public class Reload implements Task {
@Override
public String getName() {
return null;
}
@Override
public void run() {
boolean active = true;
while (active) {
try {
Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL);
long modifyTime = config.getModifyDate().getTime();
if (modifyTime > m_modifyTime) {
String content = config.getContent();
synchronized (m_config) {
m_config = DefaultSaxParser.parse(content);
}
m_modifyTime = modifyTime;
m_logger.info("Topology config refresh done!");
}
} catch (Exception e) {
Cat.logError(e);
}
try {
Thread.sleep(TimeUtil.ONE_MINUTE);
} catch (InterruptedException e) {
active = false;
}
}
}
@Override
public void shutdown() {
}
}
}
......@@ -23,13 +23,13 @@ import com.dianping.cat.Cat;
import com.dianping.cat.configuration.ServerConfigManager;
import com.dianping.cat.consumer.dependency.model.entity.DependencyReport;
import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.home.company.entity.Domain;
import com.dianping.cat.home.company.entity.ProductLine;
import com.dianping.cat.home.dal.report.TopologyGraphDao;
import com.dianping.cat.home.dal.report.TopologyGraphEntity;
import com.dianping.cat.home.dependency.config.entity.Domain;
import com.dianping.cat.home.dependency.config.entity.ProductLine;
import com.dianping.cat.home.dependency.graph.entity.TopologyEdge;
import com.dianping.cat.home.dependency.graph.entity.TopologyNode;
import com.dianping.cat.home.dependency.graph.entity.TopologyGraph;
import com.dianping.cat.home.dependency.graph.entity.TopologyNode;
import com.dianping.cat.home.dependency.graph.transform.DefaultNativeParser;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.Transaction;
......@@ -40,6 +40,7 @@ import com.dianping.cat.report.page.model.spi.ModelRequest;
import com.dianping.cat.report.page.model.spi.ModelResponse;
import com.dianping.cat.report.page.model.spi.ModelService;
import com.dianping.cat.report.view.DomainNavManager;
import com.dianping.cat.system.config.ProductLineConfigManager;
public class TopologyGraphManager implements Initializable, LogEnabled {
......@@ -50,7 +51,7 @@ public class TopologyGraphManager implements Initializable, LogEnabled {
private TopologyGraphBuilder m_graphBuilder;
@Inject
private TopologyGraphConfigManager m_configManger;
private ProductLineConfigManager m_productLineConfigManger;
@Inject
private ServerConfigManager m_manager;
......@@ -70,7 +71,7 @@ public class TopologyGraphManager implements Initializable, LogEnabled {
Set<String> m_allDomains = new HashSet<String>();
if (topologyGraph != null) {
Map<String, ProductLine> groups = m_configManger.queryProductLines();
Map<String, ProductLine> groups = m_productLineConfigManger.queryProductLines();
for (Entry<String, ProductLine> entry : groups.entrySet()) {
String groupName = entry.getKey();
......@@ -102,7 +103,7 @@ public class TopologyGraphManager implements Initializable, LogEnabled {
public ProductLineDashboard buildProductLineGraph(String productLine, long time) {
TopologyGraph topologyGraph = queryGraph(time);
ProductLineDashboard dashboard = new ProductLineDashboard(productLine);
List<String> domains = m_configManger.queryProductLineDomains(productLine);
List<String> domains = m_productLineConfigManger.queryProductLineDomains(productLine);
if (topologyGraph != null) {
for (String domain : domains) {
......@@ -174,9 +175,9 @@ public class TopologyGraphManager implements Initializable, LogEnabled {
@Override
public void initialize() throws InitializationException {
// if(!m_manager.isLocalMode()&&m_manager.isJobMachine()){
Threads.forGroup("Cat").start(new Reload());
// }
// if (!m_manager.isLocalMode() && m_manager.isJobMachine()) {
Threads.forGroup("Cat").start(new Reload());
// }
}
private TopologyGraph queryGraph(long time) {
......
......@@ -33,9 +33,6 @@ public class DomainNavManager implements Initializable {
// key is domain
private static Map<String, Project> m_projects = new ConcurrentHashMap<String, Project>();
// key is product line
private static Map<String, Map<String, Project>> m_productLines = new ConcurrentHashMap<String, Map<String, Project>>();
public static final String DEFAULT = "Default";
public static Collection<String> getDomains() {
......
package com.dianping.cat.system.config;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
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.Threads.Task;
import org.unidal.lookup.annotation.Inject;
import org.unidal.webres.helper.Files;
import com.dianping.cat.Cat;
import com.dianping.cat.consumer.core.config.Config;
import com.dianping.cat.consumer.core.config.ConfigDao;
import com.dianping.cat.consumer.core.config.ConfigEntity;
import com.dianping.cat.helper.MapUtils;
import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.home.company.entity.Company;
import com.dianping.cat.home.company.entity.Domain;
import com.dianping.cat.home.company.entity.ProductLine;
import com.dianping.cat.home.company.transform.DefaultSaxParser;
public class ProductLineConfigManager implements Initializable, LogEnabled {
@Inject
private ConfigDao m_configDao;
private int m_configId;
private Company m_company;
private Map<String, String> m_domainToProductLine = new HashMap<String, String>();
private long m_modifyTime;
private Logger m_logger;
private static final String CONFIG_NAME = "productLineConfig";
public boolean deleteProductLine(String line) {
m_company.removeProductLine(line);
return storeConfig();
}
@Override
public void enableLogging(Logger logger) {
m_logger = logger;
}
public Company getCompany() {
return m_company;
}
@Override
public void initialize() throws InitializationException {
try {
Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL);
String content = config.getContent();
m_company = DefaultSaxParser.parse(content);
m_configId = config.getId();
m_modifyTime = config.getModifyDate().getTime();
} catch (DalNotFoundException e) {
try {
String content = Files.forIO().readFrom(
this.getClass().getResourceAsStream("/config/default-product-line-config.xml"), "utf-8");
Config config = m_configDao.createLocal();
config.setName(CONFIG_NAME);
config.setContent(content);
m_configDao.insert(config);
m_company = DefaultSaxParser.parse(content);
m_configId = config.getId();
m_modifyTime = config.getModifyDate().getTime();
} catch (Exception ex) {
Cat.logError(ex);
}
} catch (Exception e) {
Cat.logError(e);
}
if (m_company == null) {
m_company = new Company();
}
}
public boolean insertProductLine(ProductLine line, String[] domains) {
m_company.removeProductLine(line.getId());
m_company.addProductLine(line);
for (String domain : domains) {
line.addDomain(new Domain(domain));
}
return storeConfig();
}
public String queryProductLineByDomain(String domain) {
String productLine = m_domainToProductLine.get(domain);
return productLine == null ? "Default" : productLine;
}
public List<String> queryProductLineDomains(String productLine) {
List<String> domains = new ArrayList<String>();
ProductLine line = m_company.findProductLine(productLine);
if (line != null) {
for (Domain domain : line.getDomains().values()) {
domains.add(domain.getId());
}
}
return domains;
}
public Map<String, ProductLine> queryProductLines() {
Map<String, ProductLine> productLines = new TreeMap<String, ProductLine>();
for (ProductLine line : m_company.getProductLines().values()) {
productLines.put(line.getId(), line);
}
return MapUtils.sortMap(productLines, new Comparator<Map.Entry<String, ProductLine>>() {
@Override
public int compare(Entry<String, ProductLine> o1, Entry<String, ProductLine> o2) {
return (int) (o2.getValue().getOrder() * 100 - o1.getValue().getOrder() * 100);
}
});
}
private boolean storeConfig() {
try {
Config config = m_configDao.createLocal();
config.setId(m_configId);
config.setKeyId(m_configId);
config.setName(CONFIG_NAME);
config.setContent(m_company.toString());
m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL);
} catch (Exception e) {
Cat.logError(e);
return false;
}
Map<String, ProductLine> productLines = m_company.getProductLines();
Map<String, String> domainToProductLine = new HashMap<String, String>();
for (ProductLine product : productLines.values()) {
for (Domain domain : product.getDomains().values()) {
domainToProductLine.put(domain.getId(), product.getId());
}
}
m_domainToProductLine = domainToProductLine;
return true;
}
public class Reload implements Task {
@Override
public String getName() {
return null;
}
@Override
public void run() {
boolean active = true;
while (active) {
try {
Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL);
long modifyTime = config.getModifyDate().getTime();
if (modifyTime > m_modifyTime) {
String content = config.getContent();
synchronized (m_company) {
m_company = DefaultSaxParser.parse(content);
}
m_modifyTime = modifyTime;
m_logger.info("product line config refresh done!");
}
} catch (Exception e) {
Cat.logError(e);
}
try {
Thread.sleep(TimeUtil.ONE_MINUTE);
} catch (InterruptedException e) {
active = false;
}
}
}
@Override
public void shutdown() {
}
}
}
......@@ -22,15 +22,16 @@ import com.dianping.cat.consumer.core.dal.Project;
import com.dianping.cat.consumer.core.dal.ProjectDao;
import com.dianping.cat.consumer.core.dal.ProjectEntity;
import com.dianping.cat.helper.CatString;
import com.dianping.cat.home.company.entity.ProductLine;
import com.dianping.cat.home.dal.report.AggregationRule;
import com.dianping.cat.home.dal.report.AggregationRuleDao;
import com.dianping.cat.home.dal.report.AggregationRuleEntity;
import com.dianping.cat.home.dependency.config.entity.DomainConfig;
import com.dianping.cat.home.dependency.config.entity.EdgeConfig;
import com.dianping.cat.home.dependency.config.entity.ProductLine;
import com.dianping.cat.report.page.dependency.graph.TopologyGraphConfigManager;
import com.dianping.cat.report.view.DomainNavManager;
import com.dianping.cat.system.SystemPage;
import com.dianping.cat.system.config.ProductLineConfigManager;
public class Handler implements PageHandler<Context> {
@Inject
......@@ -44,6 +45,9 @@ public class Handler implements PageHandler<Context> {
@Inject
private TopologyGraphConfigManager m_topologyConfigManager;
@Inject
private ProductLineConfigManager m_productLineConfigManger;
@Override
@PayloadMeta(Payload.class)
......@@ -125,19 +129,19 @@ public class Handler implements PageHandler<Context> {
break;
case TOPOLOGY_GRAPH_PRODUCT_LINE:
model.setProductLines(m_topologyConfigManager.queryProductLines());
model.setProductLines(m_productLineConfigManger.queryProductLines());
break;
case TOPOLOGY_GRAPH_PRODUCT_LINE_ADD_OR_UPDATE:
graphPruductLineAddOrUpdate(payload, model);
model.setProjects(queryAllProjects());
break;
case TOPOLOGY_GRAPH_PRODUCT_LINE_DELETE:
model.setOpState(m_topologyConfigManager.deleteProductLine(payload.getProductLineName()));
model.setProductLines(m_topologyConfigManager.queryProductLines());
model.setOpState(m_productLineConfigManger.deleteProductLine(payload.getProductLineName()));
model.setProductLines(m_productLineConfigManger.queryProductLines());
break;
case TOPOLOGY_GRAPH_PRODUCT_LINE_ADD_OR_UPDATE_SUBMIT:
model.setOpState(graphProductLineConfigAddOrUpdateSubmit(payload, model));
model.setProductLines(m_topologyConfigManager.queryProductLines());
model.setProductLines(m_productLineConfigManger.queryProductLines());
break;
}
m_jspViewer.view(ctx, model);
......@@ -145,16 +149,16 @@ public class Handler implements PageHandler<Context> {
private boolean graphProductLineConfigAddOrUpdateSubmit(Payload payload, Model model) {
ProductLine line = payload.getProductLine();
String[] domains = payload.getDomains();
String[] domains = payload.getDomains();
return m_topologyConfigManager.insertProductLine(line, domains);
return m_productLineConfigManger.insertProductLine(line, domains);
}
private void graphPruductLineAddOrUpdate(Payload payload, Model model) {
String name = payload.getProductLineName();
if (!StringUtil.isEmpty(name)) {
model.setProductLine(m_topologyConfigManager.getConfig().findProductLine(name));
model.setProductLine(m_productLineConfigManger.getCompany().findProductLine(name));
}
}
......
......@@ -17,9 +17,9 @@ public enum JspFile {
TOPOLOGY_GRAPH_EDGE_CONFIG_LIST("/jsp/system/topology/topologyGraphEdgeConfigs.jsp"),
TOPOLOGY_GRAPH_PRODUCT_LINE("/jsp/system/topology/topologyProductLines.jsp"),
TOPOLOGY_GRAPH_PRODUCT_LINE("/jsp/system/productLine/topologyProductLines.jsp"),
TOPOLOGY_GRAPH_PRODUCT_ADD_OR_UPDATE("/jsp/system/topology/topologyProductLineAdd.jsp"),
TOPOLOGY_GRAPH_PRODUCT_ADD_OR_UPDATE("/jsp/system/productLine/topologyProductLineAdd.jsp"),
;
......
......@@ -10,11 +10,11 @@ import org.unidal.web.mvc.ViewModel;
import com.dianping.cat.consumer.core.dal.Project;
import com.dianping.cat.helper.CatString;
import com.dianping.cat.home.company.entity.ProductLine;
import com.dianping.cat.home.dal.report.AggregationRule;
import com.dianping.cat.home.dependency.config.entity.DomainConfig;
import com.dianping.cat.home.dependency.config.entity.EdgeConfig;
import com.dianping.cat.home.dependency.config.entity.NodeConfig;
import com.dianping.cat.home.dependency.config.entity.ProductLine;
import com.dianping.cat.home.dependency.config.entity.TopologyGraphConfig;
import com.dianping.cat.system.SystemPage;
......
......@@ -6,10 +6,10 @@ import org.unidal.web.mvc.payload.annotation.FieldMeta;
import org.unidal.web.mvc.payload.annotation.ObjectMeta;
import com.dianping.cat.consumer.core.dal.Project;
import com.dianping.cat.home.company.entity.ProductLine;
import com.dianping.cat.home.dal.report.AggregationRule;
import com.dianping.cat.home.dependency.config.entity.DomainConfig;
import com.dianping.cat.home.dependency.config.entity.EdgeConfig;
import com.dianping.cat.home.dependency.config.entity.ProductLine;
import com.dianping.cat.system.SystemPage;
public class Payload implements ActionPayload<SystemPage, Action> {
......
......@@ -6,6 +6,8 @@
</entity>
<entity name="product-line">
<attribute name="id" value-type="String" />
<attribute name="owner" value-type="String" />
<attribute name="email" value-type="String" />
<attribute name="title" value-type="String" />
<attribute name="order" value-type="int" />
<attribute name="dashboard" value-type="boolean" />
......
<?xml version="1.0" encoding="UTF-8"?>
<model model-package="com.dianping.cat.home.company" enable-merger="true" enable-sax-parser="true"
enable-base-visitor="true" >
<entity name="company" root="true">
<attribute name="name" value-type="String" />
<entity-ref name="product-line" type="map" names="product-lines" method-find-or-create="true"/>
</entity>
<entity name="product-line">
<attribute name="id" value-type="String" key="true"/>
<attribute name="title" value-type="String" />
<attribute name="owner" value-type="String" />
<attribute name="email" value-type="String" />
<attribute name="order" value-type="double" primitive="true" />
<attribute name="important" value-type="boolean" primitive="true"/>
<attribute name="title" value-type="String" />
<attribute name="order" value-type="double" primitive="true" />
<attribute name="dashboard" value-type="boolean" primitive="true" />
<entity-ref name="domain" type="map" names="domains" method-find-or-create="true"/>
</entity>
<entity name="domain">
......@@ -15,3 +19,4 @@
</entity>
</model>
......@@ -4,7 +4,6 @@
<entity name="topology-graph-config" root="true">
<entity-ref name="node-config" type="map" names="node-configs" method-find-or-create="true" />
<entity-ref name="edge-config" type="map" names="edge-configs" method-find-or-create="true" />
<entity-ref name="product-line" type="map" names="product-lines" method-find-or-create="true"/>
</entity>
<entity name="node-config">
<attribute name="type" value-type="String" key="true"/>
......@@ -31,13 +30,6 @@
<attribute name="warning-response-time" value-type="double" primitive="true" />
<attribute name="error-response-time" value-type="double" primitive="true" />
</entity>
<entity name="product-line">
<attribute name="id" value-type="String" key="true"/>
<attribute name="title" value-type="String" />
<attribute name="order" value-type="double" primitive="true" />
<attribute name="important" value-type="boolean" primitive="true"/>
<entity-ref name="domain" type="map" names="domains" method-find-or-create="true"/>
</entity>
<entity name="domain">
<attribute name="id" value-type="String" key="true"/>
</entity>
......
......@@ -648,6 +648,15 @@
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.system.config.ProductLineConfigManager</role>
<implementation>com.dianping.cat.system.config.ProductLineConfigManager</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.consumer.core.config.ConfigDao</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.page.dependency.graph.TopologyGraphConfigManager</role>
<implementation>com.dianping.cat.report.page.dependency.graph.TopologyGraphConfigManager</implementation>
......@@ -1273,7 +1282,7 @@
<role>com.dianping.cat.configuration.ServerConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.page.dependency.graph.TopologyGraphConfigManager</role>
<role>com.dianping.cat.system.config.ProductLineConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.home.dal.report.TopologyGraphDao</role>
......@@ -2627,7 +2636,7 @@
<role>com.dianping.cat.report.page.dependency.graph.TopologyGraphManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.page.dependency.graph.TopologyGraphConfigManager</role>
<role>com.dianping.cat.system.config.ProductLineConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.service.ReportService</role>
......@@ -2684,7 +2693,7 @@
<role>com.dianping.cat.report.page.dependency.graph.TopologyGraphBuilder</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.page.dependency.graph.TopologyGraphConfigManager</role>
<role>com.dianping.cat.system.config.ProductLineConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.configuration.ServerConfigManager</role>
......@@ -2699,8 +2708,8 @@
<implementation>com.dianping.cat.report.page.dependency.graph.TopologyGraphBuilder</implementation>
</component>
<component>
<role>com.dianping.cat.report.page.dependency.graph.TopologyGraphConfigManager</role>
<implementation>com.dianping.cat.report.page.dependency.graph.TopologyGraphConfigManager</implementation>
<role>com.dianping.cat.system.config.ProductLineConfigManager</role>
<implementation>com.dianping.cat.system.config.ProductLineConfigManager</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.consumer.core.config.ConfigDao</role>
......@@ -2990,6 +2999,9 @@
<requirement>
<role>com.dianping.cat.report.page.dependency.graph.TopologyGraphConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.system.config.ProductLineConfigManager</role>
</requirement>
</requirements>
</component>
<component>
......@@ -3019,6 +3031,15 @@
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.page.dependency.graph.TopologyGraphConfigManager</role>
<implementation>com.dianping.cat.report.page.dependency.graph.TopologyGraphConfigManager</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.consumer.core.config.ConfigDao</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.system.alarm.AlarmContentBuilder</role>
<implementation>com.dianping.cat.system.alarm.AlarmContentBuilder</implementation>
......
<company>
<product-line id="TuanGou" title="团购" order="1.0" dashbord="true">
<domain id="TuanGou"/>
<domain id="TuanGouEvent"/>
<domain id="TuanGouOperation"/>
<domain id="TuanGouRank"/>
<domain id="TuanGouWebBA"/>
<domain id="tuangou-paygate"/>
<domain id="BCTuangouServer"/>
<domain id="BCTuangouWeb"/>
<domain id="TuanGouWeb"/>
<domain id="TuanGouApiMobile"/>
<domain id="TuanGouMT"/>
<domain id="TuanGouWap"/>
<domain id="TuanGouRemote"/>
<domain id="TuanGouApi"/>
<domain id="TuanGouTracking"/>
</product-line>
</company>
\ No newline at end of file
......@@ -27,23 +27,4 @@
<edge-config key="PigeonCall:ShopSearchWeb:ShopServer" type="PigeonCall" from="ShopSearchWeb" to="ShopServer" warning-threshold="6" error-threshold="11" warning-response-time="50.01" error-response-time="100.01"/>
<edge-config key="PigeonCall:UserWeb:ShopServer" type="PigeonCall" from="UserWeb" to="ShopServer" warning-threshold="1" error-threshold="11" warning-response-time="10.0" error-response-time="104.0"/>
<edge-config key="PigeonCall:Cat:MailServer" type="PigeonCall" from="Cat" to="MailServer" warning-threshold="10" error-threshold="50" warning-response-time="50.0" error-response-time="100.0"/>
<product-line id="123" title="123" order="123.0" important="true">
</product-line>
<product-line id="12344" title="5455" order="5555.0" important="false">
</product-line>
<product-line id="12" title="12" order="12.0" important="true">
</product-line>
<product-line id="Info" title="主站" order="1.0" important="true">
<domain id="TuanGou"/>
<domain id="TuanGouRank"/>
<domain id="TuanGouWebBA"/>
<domain id="MobileApi"/>
</product-line>
<product-line id="TuanGou" title="团购" order="1.0" important="true">
<domain id="Cat0"/>
<domain id="Cat1"/>
<domain id="AdwordsWeb"/>
</product-line>
<product-line id="1234" title="1234" order="6666.0" important="false">
</product-line>
</topology-graph-config>
......@@ -2,13 +2,13 @@
<div class="well sidebar-nav">
<ul class="nav nav-list">
<li class='nav-header'><h4>全局配置</h4></li>
<li id="projectList"><a href="?op=projects"><strong>项目基本信息</strong></a></li>
<li id="projectList"><a href="?op=projects"><strong>项目信息</strong></a></li>
<li id="topologyProductLines"><a href="?op=topologyProductLines"><strong>产品线配置</strong></a></li>
<li class='nav-header'><h4>前端合并配置</h4></li>
<li id="aggregationList"><a href="?op=aggregations"><strong>前端合并规则</strong></a></li>
<li class='nav-header'><h4>拓扑图配置</h4></li>
<li id="topylogyNodeConfigList"><a href="?op=topologyGraphNodeConfigList"><strong>拓扑节点阀值</strong></a></li>
<li id="topylogyEdgeConfigList"><a href="?op=topologyGraphEdgeConfigList"><strong>拓扑依赖阀值</strong></a></li>
<li id="topologyProductLines"><a href="?op=topologyProductLines"><strong>产品线配置</strong></a></li>
<li class='nav-header'><h4>业务监控配置</h4></li>
<li id="bussinessConfigList"><a href="?"><strong>业务监控规则</strong></a></li>
</ul>
......
......@@ -36,16 +36,26 @@
<td><input name="productLine.order"
value="${model.productLine.order}" required /></td>
</tr>
<tr>
<td style="text-align: right" class="text-success">产品线负责人</td>
<td><input name="productLine.owner"
value="${model.productLine.owner}" required /></td>
</tr>
<tr>
<td style="text-align: right" class="text-success">产品线邮件</td>
<td><input name="productLine.email"
value="${model.productLine.email}" required /></td>
</tr>
<tr>
<td style="text-align: right" class="text-success">是否显示到监控大盘</td>
<td><c:choose>
<c:when test="${model.productLine.important}">
<input type="radio" name="productLine.important" value="true" checked />
<input type="radio" name="productLine.important" value="false" />
<c:when test="${model.productLine.dashboard}">
<input type="radio" name="productLine.dashboard" value="true" checked />
<input type="radio" name="productLine.dashboard" value="false" />
</c:when>
<c:otherwise>
<input type="radio" name="productLine.important" value="true" />
<input type="radio" name="productLine.important" value="false" checked />
<input type="radio" name="productLine.dashboard" value="true" />
<input type="radio" name="productLine.dashboard" value="false" checked />
</c:otherwise>
</c:choose></td>
</tr>
......
......@@ -51,13 +51,13 @@
<h4 id="state" class="text-center text-error">&nbsp;</h4>
<table class="table table-striped table-bordered">
<tr class="text-success">
<th>产品线</th><th>显示标题</th><th>顺序</th><th>监控大盘显示</th><th>项目列表</th>
<th>产品线</th><th>标题</th><th>顺序</th><th>监控大盘显示</th><th>项目列表</th>
<th>操作 <a href="?op=topologyProductLineAdd" class='update btn btn-primary btn-small'>新增</a></th>
</tr>
<c:forEach var="entry" items="${model.productLines}" varStatus="status">
<c:set var='item' value='${entry.value}'/>
<tr><td>${item.id}</td><td>${item.title}</td>
<td>${item.order}</td><td>${item.important }</td>
<td>${item.order}</td><td>${item.dashboard }</td>
<td>
<c:forEach var="domain" items="${item.domains}">
${domain.key},
......
<company name="dianping">
<product-line id="TuanGou" owner="youyong" email="youyong" title="TuanGou" order="1" dashboard="true">
<domain id="MobileApi" owner="youyong" email="youyong" member="youyong,youyong"></domain>
<domain id="MobileApi"></domain>
<domain id="MobileApi"></domain>
</product-line>
<product-line></product-line>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册