Support entry service id or entry service name argument to query service tree.
This commit is contained in:
parent
8abad65f6b
commit
4582e9d9fa
|
|
@ -58,11 +58,7 @@ public class ServiceEntrySpanListener implements RefsListener, FirstSpanListener
|
|||
StreamModuleContext context = (StreamModuleContext)CollectorContextHelper.INSTANCE.getContext(StreamModuleGroupDefine.GROUP_NAME);
|
||||
if (!hasReference && hasEntry) {
|
||||
ServiceEntryDataDefine.ServiceEntry serviceEntry = new ServiceEntryDataDefine.ServiceEntry();
|
||||
if (entryServiceId == 0) {
|
||||
serviceEntry.setId(applicationId + Const.ID_SPLIT + entryServiceName);
|
||||
} else {
|
||||
serviceEntry.setId(applicationId + Const.ID_SPLIT + entryServiceId);
|
||||
}
|
||||
serviceEntry.setId(applicationId + Const.ID_SPLIT + entryServiceName);
|
||||
serviceEntry.setApplicationId(applicationId);
|
||||
serviceEntry.setEntryServiceId(entryServiceId);
|
||||
serviceEntry.setEntryServiceName(entryServiceName);
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ public class ServiceEntryDataDefine extends DataDefine {
|
|||
@Override protected void attributeDefine() {
|
||||
addAttribute(0, new Attribute(ServiceEntryTable.COLUMN_ID, AttributeType.STRING, new NonOperation()));
|
||||
addAttribute(1, new Attribute(ServiceEntryTable.COLUMN_APPLICATION_ID, AttributeType.INTEGER, new NonOperation()));
|
||||
addAttribute(2, new Attribute(ServiceEntryTable.COLUMN_ENTRY_SERVICE_ID, AttributeType.INTEGER, new NonOperation()));
|
||||
addAttribute(2, new Attribute(ServiceEntryTable.COLUMN_ENTRY_SERVICE_ID, AttributeType.INTEGER, new CoverOperation()));
|
||||
addAttribute(3, new Attribute(ServiceEntryTable.COLUMN_ENTRY_SERVICE_NAME, AttributeType.STRING, new NonOperation()));
|
||||
addAttribute(4, new Attribute(ServiceEntryTable.COLUMN_REGISTER_TIME, AttributeType.LONG, new NonOperation()));
|
||||
addAttribute(5, new Attribute(ServiceEntryTable.COLUMN_NEWEST_TIME, AttributeType.LONG, new CoverOperation()));
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ import org.skywalking.apm.collector.ui.dao.IServiceNameDAO;
|
|||
public class ServiceNameCache {
|
||||
|
||||
//TODO size configuration
|
||||
private static Cache<Integer, String> CACHE = CacheBuilder.newBuilder().maximumSize(1000).build();
|
||||
private static Cache<Integer, String> CACHE = CacheBuilder.newBuilder().maximumSize(10000).build();
|
||||
|
||||
public static String get(int serviceId) {
|
||||
try {
|
||||
|
|
|
|||
|
|
@ -7,4 +7,6 @@ import com.google.gson.JsonArray;
|
|||
*/
|
||||
public interface IServiceReferenceDAO {
|
||||
JsonArray load(int entryServiceId, long startTime, long endTime);
|
||||
|
||||
JsonArray load(String entryServiceName, int entryApplicationId, long startTime, long endTime);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,7 +22,9 @@ public class ServiceNameEsDAO extends EsDAO implements IServiceNameDAO {
|
|||
|
||||
GetResponse getResponse = getRequestBuilder.get();
|
||||
if (getResponse.isExists()) {
|
||||
return (String)getResponse.getSource().get(ServiceNameTable.COLUMN_SERVICE_NAME);
|
||||
String serviceName = (String)getResponse.getSource().get(ServiceNameTable.COLUMN_SERVICE_NAME);
|
||||
int applicationId = ((Number)getResponse.getSource().get(ServiceNameTable.COLUMN_APPLICATION_ID)).intValue();
|
||||
return applicationId + Const.ID_SPLIT + serviceName;
|
||||
}
|
||||
return Const.UNKNOWN;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,18 +27,51 @@ public class ServiceReferenceEsDAO extends EsDAO implements IServiceReferenceDAO
|
|||
|
||||
private final Logger logger = LoggerFactory.getLogger(ServiceReferenceEsDAO.class);
|
||||
|
||||
@Override public JsonArray load(String entryServiceName, int entryApplicationId, long startTime, long endTime) {
|
||||
SearchRequestBuilder searchRequestBuilder = getClient().prepareSearch(ServiceReferenceTable.TABLE);
|
||||
searchRequestBuilder.setTypes(ServiceReferenceTable.TABLE_TYPE);
|
||||
searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH);
|
||||
|
||||
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
|
||||
boolQuery.must().add(QueryBuilders.rangeQuery(ServiceReferenceTable.COLUMN_TIME_BUCKET).gte(startTime).lte(endTime));
|
||||
boolQuery.must().add(QueryBuilders.rangeQuery(ServiceReferenceTable.COLUMN_TIME_BUCKET).gte(startTime).lte(endTime));
|
||||
|
||||
int entryServiceId = ServiceIdCache.get(entryApplicationId, entryServiceName);
|
||||
BoolQueryBuilder entryBoolQuery = QueryBuilders.boolQuery();
|
||||
if (entryServiceId != 0) {
|
||||
entryBoolQuery.should().add(QueryBuilders.matchQuery(ServiceReferenceTable.COLUMN_ENTRY_SERVICE_ID, entryServiceId));
|
||||
}
|
||||
entryBoolQuery.should().add(QueryBuilders.matchQuery(ServiceReferenceTable.COLUMN_ENTRY_SERVICE_NAME, entryApplicationId + Const.ID_SPLIT + entryServiceName));
|
||||
boolQuery.must(entryBoolQuery);
|
||||
|
||||
searchRequestBuilder.setQuery(boolQuery);
|
||||
searchRequestBuilder.setSize(0);
|
||||
|
||||
return load(searchRequestBuilder);
|
||||
}
|
||||
|
||||
@Override public JsonArray load(int entryServiceId, long startTime, long endTime) {
|
||||
SearchRequestBuilder searchRequestBuilder = getClient().prepareSearch(ServiceReferenceTable.TABLE);
|
||||
searchRequestBuilder.setTypes(ServiceReferenceTable.TABLE_TYPE);
|
||||
searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH);
|
||||
|
||||
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
|
||||
boolQuery.should().add(QueryBuilders.matchQuery(ServiceReferenceTable.COLUMN_ENTRY_SERVICE_ID, entryServiceId));
|
||||
boolQuery.should().add(QueryBuilders.matchQuery(ServiceReferenceTable.COLUMN_ENTRY_SERVICE_NAME, ServiceNameCache.getForUI(entryServiceId)));
|
||||
boolQuery.must().add(QueryBuilders.rangeQuery(ServiceReferenceTable.COLUMN_TIME_BUCKET).gte(startTime).lte(endTime));
|
||||
boolQuery.must().add(QueryBuilders.rangeQuery(ServiceReferenceTable.COLUMN_TIME_BUCKET).gte(startTime).lte(endTime));
|
||||
|
||||
String entryServiceName = ServiceNameCache.get(entryServiceId);
|
||||
BoolQueryBuilder entryBoolQuery = QueryBuilders.boolQuery();
|
||||
entryBoolQuery.should().add(QueryBuilders.matchQuery(ServiceReferenceTable.COLUMN_ENTRY_SERVICE_ID, entryServiceId));
|
||||
entryBoolQuery.should().add(QueryBuilders.matchQuery(ServiceReferenceTable.COLUMN_ENTRY_SERVICE_NAME, entryServiceName));
|
||||
boolQuery.must(entryBoolQuery);
|
||||
|
||||
searchRequestBuilder.setQuery(boolQuery);
|
||||
searchRequestBuilder.setSize(0);
|
||||
|
||||
return load(searchRequestBuilder);
|
||||
}
|
||||
|
||||
private JsonArray load(SearchRequestBuilder searchRequestBuilder) {
|
||||
searchRequestBuilder.addAggregation(AggregationBuilders.terms(ServiceReferenceTable.COLUMN_FRONT_SERVICE_ID).field(ServiceReferenceTable.COLUMN_FRONT_SERVICE_ID).size(100)
|
||||
.subAggregation(AggregationBuilders.terms(ServiceReferenceTable.COLUMN_BEHIND_SERVICE_ID).field(ServiceReferenceTable.COLUMN_BEHIND_SERVICE_ID).size(100)
|
||||
.subAggregation(AggregationBuilders.sum(ServiceReferenceTable.COLUMN_S1_LTE).field(ServiceReferenceTable.COLUMN_S1_LTE))
|
||||
|
|
@ -112,7 +145,13 @@ public class ServiceReferenceEsDAO extends EsDAO implements IServiceReferenceDAO
|
|||
Sum costSum = behindServiceIdBucket.getAggregations().get(ServiceReferenceTable.COLUMN_COST_SUMMARY);
|
||||
|
||||
String frontServiceName = ServiceNameCache.getForUI(frontServiceId);
|
||||
if (StringUtils.isNotEmpty(frontServiceName)) {
|
||||
frontServiceName = frontServiceName.split(Const.ID_SPLIT)[1];
|
||||
}
|
||||
String behindServiceName = ServiceNameCache.getForUI(behindServiceId);
|
||||
if (StringUtils.isNotEmpty(frontServiceName)) {
|
||||
behindServiceName = behindServiceName.split(Const.ID_SPLIT)[1];
|
||||
}
|
||||
|
||||
JsonObject serviceReference = new JsonObject();
|
||||
serviceReference.addProperty(ColumnNameUtils.INSTANCE.rename(ServiceReferenceTable.COLUMN_FRONT_SERVICE_ID), frontServiceId);
|
||||
|
|
|
|||
|
|
@ -11,4 +11,8 @@ public class ServiceReferenceH2DAO extends H2DAO implements IServiceReferenceDAO
|
|||
@Override public JsonArray load(int entryServiceId, long startTime, long endTime) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override public JsonArray load(String entryServiceName, int entryApplicationId, long startTime, long endTime) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,7 +21,8 @@ import org.skywalking.apm.collector.ui.jetty.handler.instancemetric.InstanceMetr
|
|||
import org.skywalking.apm.collector.ui.jetty.handler.instancemetric.InstanceMetricGetRangeTimeBucketHandler;
|
||||
import org.skywalking.apm.collector.ui.jetty.handler.instancemetric.InstanceOsInfoGetHandler;
|
||||
import org.skywalking.apm.collector.ui.jetty.handler.servicetree.EntryServiceGetHandler;
|
||||
import org.skywalking.apm.collector.ui.jetty.handler.servicetree.ServiceTreeGetHandler;
|
||||
import org.skywalking.apm.collector.ui.jetty.handler.servicetree.ServiceTreeGetByIdHandler;
|
||||
import org.skywalking.apm.collector.ui.jetty.handler.servicetree.ServiceTreeGetByNameHandler;
|
||||
import org.skywalking.apm.collector.ui.jetty.handler.time.AllInstanceLastTimeGetHandler;
|
||||
import org.skywalking.apm.collector.ui.jetty.handler.time.OneInstanceLastTimeGetHandler;
|
||||
|
||||
|
|
@ -71,7 +72,8 @@ public class UIJettyModuleDefine extends UIModuleDefine {
|
|||
handlers.add(new InstanceMetricGetOneTimeBucketHandler());
|
||||
handlers.add(new InstanceMetricGetRangeTimeBucketHandler());
|
||||
handlers.add(new EntryServiceGetHandler());
|
||||
handlers.add(new ServiceTreeGetHandler());
|
||||
handlers.add(new ServiceTreeGetByIdHandler());
|
||||
handlers.add(new ServiceTreeGetByNameHandler());
|
||||
return handlers;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,12 +11,12 @@ import org.slf4j.LoggerFactory;
|
|||
/**
|
||||
* @author pengys5
|
||||
*/
|
||||
public class ServiceTreeGetHandler extends JettyHandler {
|
||||
public class ServiceTreeGetByIdHandler extends JettyHandler {
|
||||
|
||||
private final Logger logger = LoggerFactory.getLogger(ServiceTreeGetHandler.class);
|
||||
private final Logger logger = LoggerFactory.getLogger(ServiceTreeGetByIdHandler.class);
|
||||
|
||||
@Override public String pathSpec() {
|
||||
return "/service/tree";
|
||||
return "/service/tree/entryServiceId";
|
||||
}
|
||||
|
||||
private ServiceTreeService service = new ServiceTreeService();
|
||||
|
|
@ -0,0 +1,62 @@
|
|||
package org.skywalking.apm.collector.ui.jetty.handler.servicetree;
|
||||
|
||||
import com.google.gson.JsonElement;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import org.skywalking.apm.collector.server.jetty.ArgumentsParseException;
|
||||
import org.skywalking.apm.collector.server.jetty.JettyHandler;
|
||||
import org.skywalking.apm.collector.ui.service.ServiceTreeService;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* @author pengys5
|
||||
*/
|
||||
public class ServiceTreeGetByNameHandler extends JettyHandler {
|
||||
|
||||
private final Logger logger = LoggerFactory.getLogger(ServiceTreeGetByNameHandler.class);
|
||||
|
||||
@Override public String pathSpec() {
|
||||
return "/service/tree/entryServiceName";
|
||||
}
|
||||
|
||||
private ServiceTreeService service = new ServiceTreeService();
|
||||
|
||||
@Override protected JsonElement doGet(HttpServletRequest req) throws ArgumentsParseException {
|
||||
if (!req.getParameterMap().containsKey("entryServiceName") || !req.getParameterMap().containsKey("entryApplicationId") || !req.getParameterMap().containsKey("startTime") || !req.getParameterMap().containsKey("endTime")) {
|
||||
throw new ArgumentsParseException("must contains parameters: entryServiceName, entryApplicationId, startTime, endTime");
|
||||
}
|
||||
|
||||
String entryServiceName = req.getParameter("entryServiceName");
|
||||
String entryApplicationIdStr = req.getParameter("entryApplicationId");
|
||||
String startTimeStr = req.getParameter("startTime");
|
||||
String endTimeStr = req.getParameter("endTime");
|
||||
logger.debug("service entry get entryServiceName: {}, startTime: {}, endTime: {}", entryServiceName, startTimeStr, endTimeStr);
|
||||
|
||||
int entryApplicationId;
|
||||
try {
|
||||
entryApplicationId = Integer.parseInt(entryApplicationIdStr);
|
||||
} catch (NumberFormatException e) {
|
||||
throw new ArgumentsParseException("entry application id must be integer");
|
||||
}
|
||||
|
||||
long startTime;
|
||||
try {
|
||||
startTime = Long.parseLong(startTimeStr);
|
||||
} catch (NumberFormatException e) {
|
||||
throw new ArgumentsParseException("start time must be long");
|
||||
}
|
||||
|
||||
long endTime;
|
||||
try {
|
||||
endTime = Long.parseLong(endTimeStr);
|
||||
} catch (NumberFormatException e) {
|
||||
throw new ArgumentsParseException("end time must be long");
|
||||
}
|
||||
|
||||
return service.loadServiceTree(entryServiceName, entryApplicationId, startTime, endTime);
|
||||
}
|
||||
|
||||
@Override protected JsonElement doPost(HttpServletRequest req) throws ArgumentsParseException {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}
|
||||
|
|
@ -21,4 +21,9 @@ public class ServiceTreeService {
|
|||
IServiceReferenceDAO serviceReferenceDAO = (IServiceReferenceDAO)DAOContainer.INSTANCE.get(IServiceReferenceDAO.class.getName());
|
||||
return serviceReferenceDAO.load(entryServiceId, startTime, endTime);
|
||||
}
|
||||
|
||||
public JsonArray loadServiceTree(String entryServiceName, int entryApplicationId, long startTime, long endTime) {
|
||||
IServiceReferenceDAO serviceReferenceDAO = (IServiceReferenceDAO)DAOContainer.INSTANCE.get(IServiceReferenceDAO.class.getName());
|
||||
return serviceReferenceDAO.load(entryServiceName, entryApplicationId, startTime, endTime);
|
||||
}
|
||||
}
|
||||
|
|
@ -3,6 +3,8 @@ package org.skywalking.apm.collector.ui.service;
|
|||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonObject;
|
||||
import java.util.List;
|
||||
import org.skywalking.apm.collector.core.util.Const;
|
||||
import org.skywalking.apm.collector.core.util.StringUtils;
|
||||
import org.skywalking.apm.collector.storage.dao.DAOContainer;
|
||||
import org.skywalking.apm.collector.ui.cache.ServiceNameCache;
|
||||
import org.skywalking.apm.collector.ui.dao.ISegmentDAO;
|
||||
|
|
@ -26,7 +28,12 @@ public class SpanService {
|
|||
if (spanId == spanObject.getSpanId()) {
|
||||
String operationName = spanObject.getOperationName();
|
||||
if (spanObject.getOperationNameId() != 0) {
|
||||
operationName = ServiceNameCache.get(spanObject.getOperationNameId());
|
||||
String serviceName = ServiceNameCache.get(spanObject.getOperationNameId());
|
||||
if (StringUtils.isNotEmpty(serviceName)) {
|
||||
operationName = serviceName.split(Const.ID_SPLIT)[1];
|
||||
} else {
|
||||
operationName = Const.EMPTY_STRING;
|
||||
}
|
||||
}
|
||||
spanJson.addProperty("operationName", operationName);
|
||||
spanJson.addProperty("startTime", spanObject.getStartTime());
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ import java.util.List;
|
|||
import org.skywalking.apm.collector.core.util.CollectionUtils;
|
||||
import org.skywalking.apm.collector.core.util.Const;
|
||||
import org.skywalking.apm.collector.core.util.ObjectUtils;
|
||||
import org.skywalking.apm.collector.core.util.StringUtils;
|
||||
import org.skywalking.apm.collector.storage.dao.DAOContainer;
|
||||
import org.skywalking.apm.collector.ui.cache.ApplicationCache;
|
||||
import org.skywalking.apm.collector.ui.cache.ServiceNameCache;
|
||||
|
|
@ -98,7 +99,12 @@ public class TraceStackService {
|
|||
|
||||
String operationName = spanObject.getOperationName();
|
||||
if (spanObject.getOperationNameId() != 0) {
|
||||
operationName = ServiceNameCache.get(spanObject.getOperationNameId());
|
||||
String serviceName = ServiceNameCache.get(spanObject.getOperationNameId());
|
||||
if (StringUtils.isNotEmpty(serviceName)) {
|
||||
operationName = serviceName.split(Const.ID_SPLIT)[1];
|
||||
} else {
|
||||
operationName = Const.EMPTY_STRING;
|
||||
}
|
||||
}
|
||||
String applicationCode = ApplicationCache.get(segment.getApplicationId());
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue