From 527f8a55ae3691a1260712b569f45a7aee1e428e Mon Sep 17 00:00:00 2001 From: pengys5 <8082209@qq.com> Date: Sun, 30 Jul 2017 23:06:33 +0800 Subject: [PATCH] trace dag ui seem good --- .../collector/agentstream/worker/Const.java | 1 - .../src/main/resources/application.yml | 2 +- apm-collector/apm-collector-ui/pom.xml | 5 + .../collector/ui/dao/INodeComponentDAO.java | 10 ++ .../apm/collector/ui/dao/INodeMappingDAO.java | 10 ++ .../apm/collector/ui/dao/INodeRefSumDAO.java | 10 ++ .../collector/ui/dao/INodeReferenceDAO.java | 10 ++ .../collector/ui/dao/NodeComponentEsDAO.java | 51 ++++++++ .../collector/ui/dao/NodeComponentH2DAO.java | 14 ++ .../collector/ui/dao/NodeMappingEsDAO.java | 51 ++++++++ .../collector/ui/dao/NodeMappingH2DAO.java | 14 ++ .../apm/collector/ui/dao/NodeRefSumEsDAO.java | 77 +++++++++++ .../apm/collector/ui/dao/NodeRefSumH2DAO.java | 13 ++ .../collector/ui/dao/NodeReferenceEsDAO.java | 52 ++++++++ .../collector/ui/dao/NodeReferenceH2DAO.java | 13 ++ .../ui/jetty/UIJettyModuleDefine.java | 2 + .../ui/jetty/handler/TraceDagGetHandler.java | 18 +++ .../ui/service/TraceDagDataBuilder.java | 121 ++++++++++++++++++ .../collector/ui/service/TraceDagService.java | 39 ++++++ .../resources/META-INF/defines/es_dao.define | 4 + .../resources/META-INF/defines/h2_dao.define | 4 + 21 files changed, 519 insertions(+), 2 deletions(-) create mode 100644 apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/INodeComponentDAO.java create mode 100644 apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/INodeMappingDAO.java create mode 100644 apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/INodeRefSumDAO.java create mode 100644 apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/INodeReferenceDAO.java create mode 100644 apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeComponentEsDAO.java create mode 100644 apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeComponentH2DAO.java create mode 100644 apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeMappingEsDAO.java create mode 100644 apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeMappingH2DAO.java create mode 100644 apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeRefSumEsDAO.java create mode 100644 apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeRefSumH2DAO.java create mode 100644 apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeReferenceEsDAO.java create mode 100644 apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeReferenceH2DAO.java create mode 100644 apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/service/TraceDagDataBuilder.java create mode 100644 apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/service/TraceDagService.java create mode 100644 apm-collector/apm-collector-ui/src/main/resources/META-INF/defines/es_dao.define create mode 100644 apm-collector/apm-collector-ui/src/main/resources/META-INF/defines/h2_dao.define diff --git a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/Const.java b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/Const.java index b112fb0073..76fb7c376d 100644 --- a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/Const.java +++ b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/Const.java @@ -9,5 +9,4 @@ public class Const { public static final String PEERS_FRONT_SPLIT = "["; public static final String PEERS_BEHIND_SPLIT = "]"; public static final String USER_CODE = "User"; - public static final String RESULT = "result"; } diff --git a/apm-collector/apm-collector-boot/src/main/resources/application.yml b/apm-collector/apm-collector-boot/src/main/resources/application.yml index b5619da81e..1a84f5740a 100644 --- a/apm-collector/apm-collector-boot/src/main/resources/application.yml +++ b/apm-collector/apm-collector-boot/src/main/resources/application.yml @@ -20,7 +20,7 @@ ui: jetty: host: localhost port: 12800 - context_path: /ui + context_path: / storage: elasticsearch: cluster_name: CollectorDBCluster diff --git a/apm-collector/apm-collector-ui/pom.xml b/apm-collector/apm-collector-ui/pom.xml index ff4bb505b1..6a434730b6 100644 --- a/apm-collector/apm-collector-ui/pom.xml +++ b/apm-collector/apm-collector-ui/pom.xml @@ -33,5 +33,10 @@ apm-collector-storage ${project.version} + + org.skywalking + apm-collector-agentstream + ${project.version} + \ No newline at end of file diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/INodeComponentDAO.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/INodeComponentDAO.java new file mode 100644 index 0000000000..36dad6d1c4 --- /dev/null +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/INodeComponentDAO.java @@ -0,0 +1,10 @@ +package org.skywalking.apm.collector.ui.dao; + +import com.google.gson.JsonArray; + +/** + * @author pengys5 + */ +public interface INodeComponentDAO { + JsonArray load(long startTime, long endTime); +} diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/INodeMappingDAO.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/INodeMappingDAO.java new file mode 100644 index 0000000000..17c6b266e0 --- /dev/null +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/INodeMappingDAO.java @@ -0,0 +1,10 @@ +package org.skywalking.apm.collector.ui.dao; + +import com.google.gson.JsonArray; + +/** + * @author pengys5 + */ +public interface INodeMappingDAO { + JsonArray load(long startTime, long endTime); +} diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/INodeRefSumDAO.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/INodeRefSumDAO.java new file mode 100644 index 0000000000..26a6e6239f --- /dev/null +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/INodeRefSumDAO.java @@ -0,0 +1,10 @@ +package org.skywalking.apm.collector.ui.dao; + +import com.google.gson.JsonArray; + +/** + * @author pengys5 + */ +public interface INodeRefSumDAO { + JsonArray load(long startTime, long endTime); +} diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/INodeReferenceDAO.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/INodeReferenceDAO.java new file mode 100644 index 0000000000..947efec5e7 --- /dev/null +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/INodeReferenceDAO.java @@ -0,0 +1,10 @@ +package org.skywalking.apm.collector.ui.dao; + +import com.google.gson.JsonArray; + +/** + * @author pengys5 + */ +public interface INodeReferenceDAO { + JsonArray load(long startTime, long endTime); +} diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeComponentEsDAO.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeComponentEsDAO.java new file mode 100644 index 0000000000..3b3a9ecf4d --- /dev/null +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeComponentEsDAO.java @@ -0,0 +1,51 @@ +package org.skywalking.apm.collector.ui.dao; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import org.elasticsearch.action.search.SearchRequestBuilder; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.search.SearchType; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.aggregations.AggregationBuilders; +import org.elasticsearch.search.aggregations.bucket.terms.Terms; +import org.skywalking.apm.collector.agentstream.worker.Const; +import org.skywalking.apm.collector.agentstream.worker.node.component.define.NodeComponentTable; +import org.skywalking.apm.collector.storage.elasticsearch.dao.EsDAO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author pengys5 + */ +public class NodeComponentEsDAO extends EsDAO implements INodeComponentDAO { + + private final Logger logger = LoggerFactory.getLogger(NodeComponentEsDAO.class); + + @Override public JsonArray load(long startTime, long endTime) { + SearchRequestBuilder searchRequestBuilder = getClient().prepareSearch(NodeComponentTable.TABLE); + searchRequestBuilder.setTypes(NodeComponentTable.TABLE_TYPE); + searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH); + searchRequestBuilder.setQuery(QueryBuilders.rangeQuery(NodeComponentTable.COLUMN_TIME_BUCKET).gte(startTime).lte(endTime)); + searchRequestBuilder.setSize(0); + + searchRequestBuilder.addAggregation(AggregationBuilders.terms(NodeComponentTable.COLUMN_AGG).field(NodeComponentTable.COLUMN_AGG).size(100)); + SearchResponse searchResponse = searchRequestBuilder.execute().actionGet(); + + Terms genders = searchResponse.getAggregations().get(NodeComponentTable.COLUMN_AGG); + + JsonArray nodeComponentArray = new JsonArray(); + for (Terms.Bucket entry : genders.getBuckets()) { + String aggId = entry.getKeyAsString(); + String[] aggIds = aggId.split(Const.IDS_SPLIT); + String code = aggIds[0]; + String peers = aggIds[1]; + + JsonObject nodeComponentObj = new JsonObject(); + nodeComponentObj.addProperty("name", code); + nodeComponentObj.addProperty("peers", peers); + nodeComponentArray.add(nodeComponentObj); + } + logger.debug("node component data: {}", nodeComponentArray.toString()); + return nodeComponentArray; + } +} diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeComponentH2DAO.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeComponentH2DAO.java new file mode 100644 index 0000000000..5a73d42cea --- /dev/null +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeComponentH2DAO.java @@ -0,0 +1,14 @@ +package org.skywalking.apm.collector.ui.dao; + +import com.google.gson.JsonArray; +import org.skywalking.apm.collector.storage.h2.dao.H2DAO; + +/** + * @author pengys5 + */ +public class NodeComponentH2DAO extends H2DAO implements INodeComponentDAO { + + @Override public JsonArray load(long startTime, long endTime) { + return null; + } +} diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeMappingEsDAO.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeMappingEsDAO.java new file mode 100644 index 0000000000..f25dd83ad8 --- /dev/null +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeMappingEsDAO.java @@ -0,0 +1,51 @@ +package org.skywalking.apm.collector.ui.dao; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import org.elasticsearch.action.search.SearchRequestBuilder; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.search.SearchType; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.aggregations.AggregationBuilders; +import org.elasticsearch.search.aggregations.bucket.terms.Terms; +import org.skywalking.apm.collector.agentstream.worker.Const; +import org.skywalking.apm.collector.agentstream.worker.node.mapping.define.NodeMappingTable; +import org.skywalking.apm.collector.storage.elasticsearch.dao.EsDAO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author pengys5 + */ +public class NodeMappingEsDAO extends EsDAO implements INodeMappingDAO { + + private final Logger logger = LoggerFactory.getLogger(NodeMappingEsDAO.class); + + @Override public JsonArray load(long startTime, long endTime) { + SearchRequestBuilder searchRequestBuilder = getClient().prepareSearch(NodeMappingTable.TABLE); + searchRequestBuilder.setTypes(NodeMappingTable.TABLE_TYPE); + searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH); + searchRequestBuilder.setQuery(QueryBuilders.rangeQuery(NodeMappingTable.COLUMN_TIME_BUCKET).gte(startTime).lte(endTime)); + searchRequestBuilder.setSize(0); + + searchRequestBuilder.addAggregation(AggregationBuilders.terms(NodeMappingTable.COLUMN_AGG).field(NodeMappingTable.COLUMN_AGG).size(100)); + SearchResponse searchResponse = searchRequestBuilder.execute().actionGet(); + + Terms genders = searchResponse.getAggregations().get(NodeMappingTable.COLUMN_AGG); + + JsonArray nodeMappingArray = new JsonArray(); + for (Terms.Bucket entry : genders.getBuckets()) { + String aggId = entry.getKeyAsString(); + String[] aggIds = aggId.split(Const.IDS_SPLIT); + String code = aggIds[0]; + String peers = aggIds[1]; + + JsonObject nodeMappingObj = new JsonObject(); + nodeMappingObj.addProperty("code", code); + nodeMappingObj.addProperty("peers", peers); + nodeMappingArray.add(nodeMappingObj); + } + logger.debug("node mapping data: {}", nodeMappingArray.toString()); + return nodeMappingArray; + } +} diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeMappingH2DAO.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeMappingH2DAO.java new file mode 100644 index 0000000000..afda330702 --- /dev/null +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeMappingH2DAO.java @@ -0,0 +1,14 @@ +package org.skywalking.apm.collector.ui.dao; + +import com.google.gson.JsonArray; +import org.skywalking.apm.collector.storage.h2.dao.H2DAO; + +/** + * @author pengys5 + */ +public class NodeMappingH2DAO extends H2DAO implements INodeMappingDAO { + + @Override public JsonArray load(long startTime, long endTime) { + return null; + } +} diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeRefSumEsDAO.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeRefSumEsDAO.java new file mode 100644 index 0000000000..8d11dc07d4 --- /dev/null +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeRefSumEsDAO.java @@ -0,0 +1,77 @@ +package org.skywalking.apm.collector.ui.dao; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import org.elasticsearch.action.search.SearchRequestBuilder; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.search.SearchType; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.aggregations.AggregationBuilders; +import org.elasticsearch.search.aggregations.bucket.terms.Terms; +import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder; +import org.elasticsearch.search.aggregations.metrics.sum.Sum; +import org.skywalking.apm.collector.agentstream.worker.Const; +import org.skywalking.apm.collector.agentstream.worker.noderef.summary.define.NodeRefSumTable; +import org.skywalking.apm.collector.storage.elasticsearch.dao.EsDAO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author pengys5 + */ +public class NodeRefSumEsDAO extends EsDAO implements INodeRefSumDAO { + + private final Logger logger = LoggerFactory.getLogger(NodeRefSumEsDAO.class); + + @Override public JsonArray load(long startTime, long endTime) { + SearchRequestBuilder searchRequestBuilder = getClient().prepareSearch(NodeRefSumTable.TABLE); + searchRequestBuilder.setTypes(NodeRefSumTable.TABLE_TYPE); + searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH); + searchRequestBuilder.setQuery(QueryBuilders.rangeQuery(NodeRefSumTable.COLUMN_TIME_BUCKET).gte(startTime).lte(endTime)); + searchRequestBuilder.setSize(0); + + TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms(NodeRefSumTable.COLUMN_AGG).field(NodeRefSumTable.COLUMN_AGG); + aggregationBuilder.subAggregation(AggregationBuilders.sum(NodeRefSumTable.COLUMN_ONE_SECOND_LESS).field(NodeRefSumTable.COLUMN_ONE_SECOND_LESS)); + aggregationBuilder.subAggregation(AggregationBuilders.sum(NodeRefSumTable.COLUMN_THREE_SECOND_LESS).field(NodeRefSumTable.COLUMN_THREE_SECOND_LESS)); + aggregationBuilder.subAggregation(AggregationBuilders.sum(NodeRefSumTable.COLUMN_FIVE_SECOND_LESS).field(NodeRefSumTable.COLUMN_FIVE_SECOND_LESS)); + aggregationBuilder.subAggregation(AggregationBuilders.sum(NodeRefSumTable.COLUMN_FIVE_SECOND_GREATER).field(NodeRefSumTable.COLUMN_FIVE_SECOND_GREATER)); + aggregationBuilder.subAggregation(AggregationBuilders.sum(NodeRefSumTable.COLUMN_ERROR).field(NodeRefSumTable.COLUMN_ERROR)); + aggregationBuilder.subAggregation(AggregationBuilders.sum(NodeRefSumTable.COLUMN_SUMMARY).field(NodeRefSumTable.COLUMN_SUMMARY)); + + searchRequestBuilder.addAggregation(aggregationBuilder); + + SearchResponse searchResponse = searchRequestBuilder.execute().actionGet(); + + JsonArray nodeRefResSumArray = new JsonArray(); + Terms aggTerms = searchResponse.getAggregations().get(NodeRefSumTable.COLUMN_AGG); + for (Terms.Bucket bucket : aggTerms.getBuckets()) { + String aggId = String.valueOf(bucket.getKey()); + Sum oneSecondLess = bucket.getAggregations().get(NodeRefSumTable.COLUMN_ONE_SECOND_LESS); + Sum threeSecondLess = bucket.getAggregations().get(NodeRefSumTable.COLUMN_THREE_SECOND_LESS); + Sum fiveSecondLess = bucket.getAggregations().get(NodeRefSumTable.COLUMN_FIVE_SECOND_LESS); + Sum fiveSecondGreater = bucket.getAggregations().get(NodeRefSumTable.COLUMN_FIVE_SECOND_GREATER); + Sum error = bucket.getAggregations().get(NodeRefSumTable.COLUMN_ERROR); + Sum summary = bucket.getAggregations().get(NodeRefSumTable.COLUMN_SUMMARY); + logger.debug("aggId: {}, oneSecondLess: {}, threeSecondLess: {}, fiveSecondLess: {}, fiveSecondGreater: {}, error: {}, summary: {}", aggId, + oneSecondLess.getValue(), threeSecondLess.getValue(), fiveSecondLess.getValue(), fiveSecondGreater.getValue(), error.getValue(), summary.getValue()); + + JsonObject nodeRefResSumObj = new JsonObject(); + String[] ids = aggId.split(Const.IDS_SPLIT); + String front = ids[0]; + String behind = ids[1]; + + nodeRefResSumObj.addProperty("front", front); + nodeRefResSumObj.addProperty("behind", behind); + + nodeRefResSumObj.addProperty(NodeRefSumTable.COLUMN_ONE_SECOND_LESS, oneSecondLess.getValue()); + nodeRefResSumObj.addProperty(NodeRefSumTable.COLUMN_THREE_SECOND_LESS, threeSecondLess.getValue()); + nodeRefResSumObj.addProperty(NodeRefSumTable.COLUMN_FIVE_SECOND_LESS, fiveSecondLess.getValue()); + nodeRefResSumObj.addProperty(NodeRefSumTable.COLUMN_FIVE_SECOND_GREATER, fiveSecondGreater.getValue()); + nodeRefResSumObj.addProperty(NodeRefSumTable.COLUMN_ERROR, error.getValue()); + nodeRefResSumObj.addProperty(NodeRefSumTable.COLUMN_SUMMARY, summary.getValue()); + nodeRefResSumArray.add(nodeRefResSumObj); + } + + return nodeRefResSumArray; + } +} diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeRefSumH2DAO.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeRefSumH2DAO.java new file mode 100644 index 0000000000..8e4c0fab09 --- /dev/null +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeRefSumH2DAO.java @@ -0,0 +1,13 @@ +package org.skywalking.apm.collector.ui.dao; + +import com.google.gson.JsonArray; +import org.skywalking.apm.collector.storage.h2.dao.H2DAO; + +/** + * @author pengys5 + */ +public class NodeRefSumH2DAO extends H2DAO implements INodeRefSumDAO { + @Override public JsonArray load(long startTime, long endTime) { + return null; + } +} diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeReferenceEsDAO.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeReferenceEsDAO.java new file mode 100644 index 0000000000..936ab1497a --- /dev/null +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeReferenceEsDAO.java @@ -0,0 +1,52 @@ +package org.skywalking.apm.collector.ui.dao; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import org.elasticsearch.action.search.SearchRequestBuilder; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.search.SearchType; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.aggregations.AggregationBuilders; +import org.elasticsearch.search.aggregations.bucket.terms.Terms; +import org.skywalking.apm.collector.agentstream.worker.Const; +import org.skywalking.apm.collector.agentstream.worker.noderef.reference.define.NodeRefTable; +import org.skywalking.apm.collector.storage.elasticsearch.dao.EsDAO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author pengys5 + */ +public class NodeReferenceEsDAO extends EsDAO implements INodeReferenceDAO { + + private final Logger logger = LoggerFactory.getLogger(NodeReferenceEsDAO.class); + + @Override public JsonArray load(long startTime, long endTime) { + SearchRequestBuilder searchRequestBuilder = getClient().prepareSearch(NodeRefTable.TABLE); + searchRequestBuilder.setTypes(NodeRefTable.TABLE_TYPE); + searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH); + searchRequestBuilder.setQuery(QueryBuilders.rangeQuery(NodeRefTable.COLUMN_TIME_BUCKET).gte(startTime).lte(endTime)); + searchRequestBuilder.setSize(0); + + searchRequestBuilder.addAggregation(AggregationBuilders.terms(NodeRefTable.COLUMN_AGG).field(NodeRefTable.COLUMN_AGG).size(100)); + + SearchResponse searchResponse = searchRequestBuilder.execute().actionGet(); + + Terms genders = searchResponse.getAggregations().get(NodeRefTable.COLUMN_AGG); + + JsonArray nodeRefArray = new JsonArray(); + for (Terms.Bucket entry : genders.getBuckets()) { + String aggId = entry.getKeyAsString(); + String[] aggIds = aggId.split(Const.IDS_SPLIT); + String front = aggIds[0]; + String behind = aggIds[1]; + + JsonObject nodeRefObj = new JsonObject(); + nodeRefObj.addProperty("front", front); + nodeRefObj.addProperty("behind", behind); + nodeRefArray.add(nodeRefObj); + } + logger.debug("node ref data: {}", nodeRefArray.toString()); + return nodeRefArray; + } +} diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeReferenceH2DAO.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeReferenceH2DAO.java new file mode 100644 index 0000000000..72c6cd65ec --- /dev/null +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/NodeReferenceH2DAO.java @@ -0,0 +1,13 @@ +package org.skywalking.apm.collector.ui.dao; + +import com.google.gson.JsonArray; +import org.skywalking.apm.collector.storage.h2.dao.H2DAO; + +/** + * @author pengys5 + */ +public class NodeReferenceH2DAO extends H2DAO implements INodeReferenceDAO { + @Override public JsonArray load(long startTime, long endTime) { + return null; + } +} diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/UIJettyModuleDefine.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/UIJettyModuleDefine.java index 69f9bc5c21..a2200cb43f 100644 --- a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/UIJettyModuleDefine.java +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/UIJettyModuleDefine.java @@ -10,6 +10,7 @@ import org.skywalking.apm.collector.core.server.Server; import org.skywalking.apm.collector.server.jetty.JettyServer; import org.skywalking.apm.collector.ui.UIModuleDefine; import org.skywalking.apm.collector.ui.UIModuleGroupDefine; +import org.skywalking.apm.collector.ui.jetty.handler.TraceDagGetHandler; import org.skywalking.apm.collector.ui.jetty.handler.UIJettyServerHandler; /** @@ -46,6 +47,7 @@ public class UIJettyModuleDefine extends UIModuleDefine { @Override public List handlerList() { List handlers = new LinkedList<>(); handlers.add(new UIJettyServerHandler()); + handlers.add(new TraceDagGetHandler()); return handlers; } } diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/TraceDagGetHandler.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/TraceDagGetHandler.java index ca4e1da967..d87c458ff2 100644 --- a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/TraceDagGetHandler.java +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/TraceDagGetHandler.java @@ -1,21 +1,39 @@ package org.skywalking.apm.collector.ui.jetty.handler; +import com.google.gson.JsonObject; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.skywalking.apm.collector.server.jetty.JettyHandler; +import org.skywalking.apm.collector.ui.service.TraceDagService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * @author pengys5 */ public class TraceDagGetHandler extends JettyHandler { + private final Logger logger = LoggerFactory.getLogger(TraceDagGetHandler.class); + @Override public String pathSpec() { return "/traceDag"; } + private TraceDagService service = new TraceDagService(); + @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String startTimeStr = req.getParameter("startTime"); + String endTimeStr = req.getParameter("endTime"); + String timeBucketType = req.getParameter("timeBucketType"); + logger.debug("startTime: {}, endTimeStr: {}, timeBucketType: {}", startTimeStr, endTimeStr, timeBucketType); + + long startTime = Long.valueOf(startTimeStr); + long endTime = Long.valueOf(endTimeStr); + JsonObject traceDagJson = service.load(startTime, endTime, timeBucketType); + + reply(resp, traceDagJson, HttpServletResponse.SC_OK); } } diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/service/TraceDagDataBuilder.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/service/TraceDagDataBuilder.java new file mode 100644 index 0000000000..5ffa44920b --- /dev/null +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/service/TraceDagDataBuilder.java @@ -0,0 +1,121 @@ +package org.skywalking.apm.collector.ui.service; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import java.util.HashMap; +import java.util.Map; +import org.skywalking.apm.collector.agentstream.worker.Const; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author pengys5 + */ +public class TraceDagDataBuilder { + private final Logger logger = LoggerFactory.getLogger(TraceDagDataBuilder.class); + + private Integer nodeId = new Integer(-1); + private Map mappingMap = new HashMap<>(); + private Map nodeCompMap = new HashMap<>(); + private Map resSumMap = new HashMap<>(); + private Map nodeIdMap = new HashMap<>(); + private JsonArray pointArray = new JsonArray(); + private JsonArray lineArray = new JsonArray(); + + public JsonObject build(JsonArray nodeCompArray, JsonArray nodesMappingArray, JsonArray nodeRefsArray, + JsonArray resSumArray) { + changeMapping2Map(nodesMappingArray); + changeNodeComp2Map(nodeCompArray); + resSumMerge(resSumArray); + + for (int i = 0; i < nodeRefsArray.size(); i++) { + JsonObject nodeRefJsonObj = nodeRefsArray.get(i).getAsJsonObject(); + String front = nodeRefJsonObj.get("front").getAsString(); + String behind = nodeRefJsonObj.get("behind").getAsString(); + + String behindCode = findRealCode(behind); + logger.debug("behind: %s, behindCode: {}", behind, behindCode); + + JsonObject lineJsonObj = new JsonObject(); + lineJsonObj.addProperty("from", findOrCreateNode(front)); + lineJsonObj.addProperty("to", findOrCreateNode(behindCode)); + lineJsonObj.addProperty("resSum", resSumMap.get(front + Const.ID_SPLIT + behindCode)); + + lineArray.add(lineJsonObj); + logger.debug("line: {}", lineJsonObj); + } + + JsonObject dagJsonObj = new JsonObject(); + dagJsonObj.add("nodes", pointArray); + dagJsonObj.add("nodeRefs", lineArray); + return dagJsonObj; + } + + private Integer findOrCreateNode(String peers) { + if (nodeIdMap.containsKey(peers) && !peers.equals(Const.USER_CODE)) { + return nodeIdMap.get(peers); + } else { + nodeId++; + JsonObject nodeJsonObj = new JsonObject(); + nodeJsonObj.addProperty("id", nodeId); + nodeJsonObj.addProperty("peer", peers); + if (peers.equals(Const.USER_CODE)) { + nodeJsonObj.addProperty("component", Const.USER_CODE); + } else { + nodeJsonObj.addProperty("component", nodeCompMap.get(peers)); + } + pointArray.add(nodeJsonObj); + + nodeIdMap.put(peers, nodeId); + logger.debug("node: {}", nodeJsonObj); + } + return nodeId; + } + + private void changeMapping2Map(JsonArray nodesMappingArray) { + for (int i = 0; i < nodesMappingArray.size(); i++) { + JsonObject nodesMappingJsonObj = nodesMappingArray.get(i).getAsJsonObject(); + String code = nodesMappingJsonObj.get("code").getAsString(); + String peers = nodesMappingJsonObj.get("peers").getAsString(); + mappingMap.put(peers, code); + } + } + + private void changeNodeComp2Map(JsonArray nodeCompArray) { + for (int i = 0; i < nodeCompArray.size(); i++) { + JsonObject nodesJsonObj = nodeCompArray.get(i).getAsJsonObject(); + logger.debug(nodesJsonObj.toString()); + String component = nodesJsonObj.get("name").getAsString(); + String peers = nodesJsonObj.get("peers").getAsString(); + nodeCompMap.put(peers, component); + } + } + + private String findRealCode(String peers) { + if (mappingMap.containsKey(peers)) { + return mappingMap.get(peers); + } else { + return peers; + } + } + + private void resSumMerge(JsonArray resSumArray) { + for (int i = 0; i < resSumArray.size(); i++) { + JsonObject resSumJsonObj = resSumArray.get(i).getAsJsonObject(); + String front = resSumJsonObj.get("front").getAsString(); + String behind = resSumJsonObj.get("behind").getAsString(); + Long summary = resSumJsonObj.get("summary").getAsLong(); + + if (mappingMap.containsKey(behind)) { + behind = mappingMap.get(behind); + } + + String id = front + Const.ID_SPLIT + behind; + if (resSumMap.containsKey(id)) { + resSumMap.put(id, summary + resSumMap.get(id)); + } else { + resSumMap.put(id, summary); + } + } + } +} diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/service/TraceDagService.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/service/TraceDagService.java new file mode 100644 index 0000000000..1dbc43fff3 --- /dev/null +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/service/TraceDagService.java @@ -0,0 +1,39 @@ +package org.skywalking.apm.collector.ui.service; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import org.skywalking.apm.collector.storage.dao.DAOContainer; +import org.skywalking.apm.collector.ui.dao.INodeComponentDAO; +import org.skywalking.apm.collector.ui.dao.INodeMappingDAO; +import org.skywalking.apm.collector.ui.dao.INodeRefSumDAO; +import org.skywalking.apm.collector.ui.dao.INodeReferenceDAO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author pengys5 + */ +public class TraceDagService { + + private final Logger logger = LoggerFactory.getLogger(TraceDagService.class); + + public JsonObject load(long startTime, long endTime, String timeBucketType) { + logger.debug("startTime: {}, endTime: {}, timeSliceType: {}", startTime, endTime, timeBucketType); + INodeComponentDAO nodeComponentDAO = (INodeComponentDAO)DAOContainer.INSTANCE.get(INodeComponentDAO.class.getName()); + JsonArray nodeComponentArray = nodeComponentDAO.load(startTime, endTime); + + INodeMappingDAO nodeMappingDAO = (INodeMappingDAO)DAOContainer.INSTANCE.get(INodeMappingDAO.class.getName()); + JsonArray nodeMappingArray = nodeMappingDAO.load(startTime, endTime); + + INodeReferenceDAO nodeReferenceDAO = (INodeReferenceDAO)DAOContainer.INSTANCE.get(INodeReferenceDAO.class.getName()); + JsonArray nodeRefArray = nodeReferenceDAO.load(startTime, endTime); + + INodeRefSumDAO nodeRefSumDAO = (INodeRefSumDAO)DAOContainer.INSTANCE.get(INodeRefSumDAO.class.getName()); + JsonArray nodeRefSumArray = nodeRefSumDAO.load(startTime, endTime); + + TraceDagDataBuilder builder = new TraceDagDataBuilder(); + JsonObject traceDag = builder.build(nodeComponentArray, nodeMappingArray, nodeRefArray, nodeRefSumArray); + + return traceDag; + } +} diff --git a/apm-collector/apm-collector-ui/src/main/resources/META-INF/defines/es_dao.define b/apm-collector/apm-collector-ui/src/main/resources/META-INF/defines/es_dao.define new file mode 100644 index 0000000000..352f057086 --- /dev/null +++ b/apm-collector/apm-collector-ui/src/main/resources/META-INF/defines/es_dao.define @@ -0,0 +1,4 @@ +org.skywalking.apm.collector.ui.dao.NodeComponentEsDAO +org.skywalking.apm.collector.ui.dao.NodeMappingEsDAO +org.skywalking.apm.collector.ui.dao.NodeReferenceEsDAO +org.skywalking.apm.collector.ui.dao.NodeRefSumEsDAO \ No newline at end of file diff --git a/apm-collector/apm-collector-ui/src/main/resources/META-INF/defines/h2_dao.define b/apm-collector/apm-collector-ui/src/main/resources/META-INF/defines/h2_dao.define new file mode 100644 index 0000000000..b3cfe6473f --- /dev/null +++ b/apm-collector/apm-collector-ui/src/main/resources/META-INF/defines/h2_dao.define @@ -0,0 +1,4 @@ +org.skywalking.apm.collector.ui.dao.NodeComponentH2DAO +org.skywalking.apm.collector.ui.dao.NodeMappingH2DAO +org.skywalking.apm.collector.ui.dao.NodeReferenceH2DAO +org.skywalking.apm.collector.ui.dao.NodeRefSumH2DAO \ No newline at end of file -- GitLab