diff --git a/apm-collector/apm-collector-agentjvm/src/main/java/org/skywalking/apm/collector/agentjvm/grpc/handler/JVMMetricsServiceHandler.java b/apm-collector/apm-collector-agentjvm/src/main/java/org/skywalking/apm/collector/agentjvm/grpc/handler/JVMMetricsServiceHandler.java index 3b6f8a4f5..d3bb58800 100644 --- a/apm-collector/apm-collector-agentjvm/src/main/java/org/skywalking/apm/collector/agentjvm/grpc/handler/JVMMetricsServiceHandler.java +++ b/apm-collector/apm-collector-agentjvm/src/main/java/org/skywalking/apm/collector/agentjvm/grpc/handler/JVMMetricsServiceHandler.java @@ -59,7 +59,7 @@ public class JVMMetricsServiceHandler extends JVMMetricsServiceGrpc.JVMMetricsSe long heartBeatTime) { InstanceHeartBeatDataDefine.InstanceHeartBeat heartBeat = new InstanceHeartBeatDataDefine.InstanceHeartBeat(); heartBeat.setId(String.valueOf(applicationInstanceId)); - heartBeat.setHeartBeatTime(heartBeatTime); + heartBeat.setHeartBeatTime(TimeBucketUtils.INSTANCE.getSecondTimeBucket(heartBeatTime)); heartBeat.setInstanceId(applicationInstanceId); try { logger.debug("send to instance heart beat persistence worker, id: {}", heartBeat.getId()); diff --git a/apm-collector/apm-collector-agentregister/src/main/java/org/skywalking/apm/collector/agentregister/grpc/handler/InstanceDiscoveryServiceHandler.java b/apm-collector/apm-collector-agentregister/src/main/java/org/skywalking/apm/collector/agentregister/grpc/handler/InstanceDiscoveryServiceHandler.java index 8c2c8568a..43cd70e01 100644 --- a/apm-collector/apm-collector-agentregister/src/main/java/org/skywalking/apm/collector/agentregister/grpc/handler/InstanceDiscoveryServiceHandler.java +++ b/apm-collector/apm-collector-agentregister/src/main/java/org/skywalking/apm/collector/agentregister/grpc/handler/InstanceDiscoveryServiceHandler.java @@ -4,9 +4,9 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; import io.grpc.stub.StreamObserver; import org.skywalking.apm.collector.agentregister.instance.InstanceIDService; +import org.skywalking.apm.collector.core.util.TimeBucketUtils; import org.skywalking.apm.collector.server.grpc.GRPCHandler; import org.skywalking.apm.network.proto.ApplicationInstance; -import org.skywalking.apm.network.proto.ApplicationInstanceHeartbeat; import org.skywalking.apm.network.proto.ApplicationInstanceMapping; import org.skywalking.apm.network.proto.ApplicationInstanceRecover; import org.skywalking.apm.network.proto.Downstream; @@ -26,7 +26,8 @@ public class InstanceDiscoveryServiceHandler extends InstanceDiscoveryServiceGrp @Override public void register(ApplicationInstance request, StreamObserver responseObserver) { - int instanceId = instanceIDService.getOrCreate(request.getApplicationId(), request.getAgentUUID(), request.getRegisterTime(), buildOsInfo(request.getOsinfo())); + long timeBucket = TimeBucketUtils.INSTANCE.getSecondTimeBucket(request.getRegisterTime()); + int instanceId = instanceIDService.getOrCreate(request.getApplicationId(), request.getAgentUUID(), timeBucket, buildOsInfo(request.getOsinfo())); ApplicationInstanceMapping.Builder builder = ApplicationInstanceMapping.newBuilder(); builder.setApplicationId(request.getApplicationId()); builder.setApplicationInstanceId(instanceId); @@ -34,15 +35,10 @@ public class InstanceDiscoveryServiceHandler extends InstanceDiscoveryServiceGrp responseObserver.onCompleted(); } - @Override public void heartbeat(ApplicationInstanceHeartbeat request, StreamObserver responseObserver) { - instanceIDService.heartBeat(request.getApplicationInstanceId(), request.getHeartbeatTime()); - responseObserver.onNext(Downstream.newBuilder().build()); - responseObserver.onCompleted(); - } - @Override public void registerRecover(ApplicationInstanceRecover request, StreamObserver responseObserver) { - instanceIDService.recover(request.getApplicationInstanceId(), request.getApplicationId(), request.getRegisterTime(), buildOsInfo(request.getOsinfo())); + long timeBucket = TimeBucketUtils.INSTANCE.getSecondTimeBucket(request.getRegisterTime()); + instanceIDService.recover(request.getApplicationInstanceId(), request.getApplicationId(), timeBucket, buildOsInfo(request.getOsinfo())); responseObserver.onNext(Downstream.newBuilder().build()); responseObserver.onCompleted(); } diff --git a/apm-collector/apm-collector-agentregister/src/main/java/org/skywalking/apm/collector/agentregister/instance/InstanceIDService.java b/apm-collector/apm-collector-agentregister/src/main/java/org/skywalking/apm/collector/agentregister/instance/InstanceIDService.java index 0ecb9570f..fa5f5bb22 100644 --- a/apm-collector/apm-collector-agentregister/src/main/java/org/skywalking/apm/collector/agentregister/instance/InstanceIDService.java +++ b/apm-collector/apm-collector-agentregister/src/main/java/org/skywalking/apm/collector/agentregister/instance/InstanceIDService.java @@ -1,10 +1,10 @@ package org.skywalking.apm.collector.agentregister.instance; import org.skywalking.apm.collector.agentstream.worker.register.application.ApplicationRegisterRemoteWorker; -import org.skywalking.apm.collector.storage.define.register.InstanceDataDefine; import org.skywalking.apm.collector.agentstream.worker.register.instance.dao.IInstanceDAO; import org.skywalking.apm.collector.core.framework.CollectorContextHelper; import org.skywalking.apm.collector.storage.dao.DAOContainer; +import org.skywalking.apm.collector.storage.define.register.InstanceDataDefine; import org.skywalking.apm.collector.stream.StreamModuleContext; import org.skywalking.apm.collector.stream.StreamModuleGroupDefine; import org.skywalking.apm.collector.stream.worker.WorkerInvokeException; @@ -36,12 +36,6 @@ public class InstanceIDService { return applicationId; } - public void heartBeat(int instanceId, long heartbeatTime) { - logger.debug("instance heart beat, instance id: {}, heartbeat time: {}", instanceId, heartbeatTime); - IInstanceDAO dao = (IInstanceDAO)DAOContainer.INSTANCE.get(IInstanceDAO.class.getName()); - dao.updateHeartbeatTime(instanceId, heartbeatTime); - } - public void recover(int instanceId, int applicationId, long registerTime, String osInfo) { logger.debug("instance recover, instance id: {}, application id: {}, register time: {}", instanceId, applicationId, registerTime); IInstanceDAO dao = (IInstanceDAO)DAOContainer.INSTANCE.get(IInstanceDAO.class.getName()); diff --git a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/cache/ServiceNameCache.java b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/cache/ServiceCache.java similarity index 60% rename from apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/cache/ServiceNameCache.java rename to apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/cache/ServiceCache.java index cb5795e0a..6d0294bd7 100644 --- a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/cache/ServiceNameCache.java +++ b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/cache/ServiceCache.java @@ -2,25 +2,25 @@ package org.skywalking.apm.collector.agentstream.worker.cache; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; -import org.skywalking.apm.collector.core.util.Const; import org.skywalking.apm.collector.agentstream.worker.register.servicename.dao.IServiceNameDAO; +import org.skywalking.apm.collector.core.util.Const; import org.skywalking.apm.collector.storage.dao.DAOContainer; /** * @author pengys5 */ -public class ServiceNameCache { +public class ServiceCache { - private static Cache CACHE = CacheBuilder.newBuilder().maximumSize(2000).build(); + private static Cache CACHE = CacheBuilder.newBuilder().maximumSize(10000).build(); - public static int get(int applicationId, String serviceName) { + public static String getServiceName(int serviceId) { try { - return CACHE.get(applicationId + Const.ID_SPLIT + serviceName, () -> { + return CACHE.get(serviceId, () -> { IServiceNameDAO dao = (IServiceNameDAO)DAOContainer.INSTANCE.get(IServiceNameDAO.class.getName()); - return dao.getServiceId(applicationId, serviceName); + return dao.getServiceName(serviceId); }); } catch (Throwable e) { - return 0; + return Const.EMPTY_STRING; } } } diff --git a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/register/servicename/dao/IServiceNameDAO.java b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/register/servicename/dao/IServiceNameDAO.java index aa79ec337..b02ddf180 100644 --- a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/register/servicename/dao/IServiceNameDAO.java +++ b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/register/servicename/dao/IServiceNameDAO.java @@ -8,6 +8,8 @@ import org.skywalking.apm.collector.storage.define.register.ServiceNameDataDefin public interface IServiceNameDAO { int getServiceId(int applicationId, String serviceName); + String getServiceName(int serviceId); + int getMaxServiceId(); int getMinServiceId(); diff --git a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/register/servicename/dao/ServiceNameEsDAO.java b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/register/servicename/dao/ServiceNameEsDAO.java index ac40e1cae..150a0b601 100644 --- a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/register/servicename/dao/ServiceNameEsDAO.java +++ b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/register/servicename/dao/ServiceNameEsDAO.java @@ -2,6 +2,7 @@ package org.skywalking.apm.collector.agentstream.worker.register.servicename.dao import java.util.HashMap; import java.util.Map; +import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.action.search.SearchResponse; @@ -10,9 +11,10 @@ import org.elasticsearch.action.support.WriteRequest; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; +import org.skywalking.apm.collector.client.elasticsearch.ElasticSearchClient; +import org.skywalking.apm.collector.core.util.Const; import org.skywalking.apm.collector.storage.define.register.ServiceNameDataDefine; import org.skywalking.apm.collector.storage.define.register.ServiceNameTable; -import org.skywalking.apm.collector.client.elasticsearch.ElasticSearchClient; import org.skywalking.apm.collector.storage.elasticsearch.dao.EsDAO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -53,6 +55,15 @@ public class ServiceNameEsDAO extends EsDAO implements IServiceNameDAO { return getMinId(ServiceNameTable.TABLE, ServiceNameTable.COLUMN_SERVICE_ID); } + @Override public String getServiceName(int serviceId) { + GetResponse response = getClient().prepareGet(ServiceNameTable.TABLE, String.valueOf(serviceId)).get(); + if (response.isExists()) { + return (String)response.getSource().get(ServiceNameTable.COLUMN_SERVICE_NAME); + } else { + return Const.EMPTY_STRING; + } + } + @Override public void save(ServiceNameDataDefine.ServiceName serviceName) { logger.debug("save service name register info, application id: {}, service name: {}", serviceName.getApplicationId(), serviceName.getServiceName()); ElasticSearchClient client = getClient(); diff --git a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/register/servicename/dao/ServiceNameH2DAO.java b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/register/servicename/dao/ServiceNameH2DAO.java index 3a3a288e5..c73b9687f 100644 --- a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/register/servicename/dao/ServiceNameH2DAO.java +++ b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/register/servicename/dao/ServiceNameH2DAO.java @@ -20,6 +20,10 @@ public class ServiceNameH2DAO extends H2DAO implements IServiceNameDAO { return 0; } + @Override public String getServiceName(int serviceId) { + return null; + } + @Override public void save(ServiceNameDataDefine.ServiceName serviceName) { } diff --git a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/service/entry/ServiceEntrySpanListener.java b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/service/entry/ServiceEntrySpanListener.java index 7b03b737c..aa60baa2e 100644 --- a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/service/entry/ServiceEntrySpanListener.java +++ b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/service/entry/ServiceEntrySpanListener.java @@ -1,5 +1,6 @@ package org.skywalking.apm.collector.agentstream.worker.service.entry; +import org.skywalking.apm.collector.agentstream.worker.cache.ServiceCache; import org.skywalking.apm.collector.agentstream.worker.segment.EntrySpanListener; import org.skywalking.apm.collector.agentstream.worker.segment.FirstSpanListener; import org.skywalking.apm.collector.agentstream.worker.segment.RefsListener; @@ -36,7 +37,7 @@ public class ServiceEntrySpanListener implements RefsListener, FirstSpanListener if (spanObject.getOperationNameId() == 0) { this.entryServiceName = spanObject.getOperationName(); } else { - this.entryServiceName = Const.EMPTY_STRING; + this.entryServiceName = ServiceCache.getServiceName(this.entryServiceId); } } @@ -55,15 +56,12 @@ public class ServiceEntrySpanListener implements RefsListener, FirstSpanListener StreamModuleContext context = (StreamModuleContext)CollectorContextHelper.INSTANCE.getContext(StreamModuleGroupDefine.GROUP_NAME); if (!hasReference) { ServiceEntryDataDefine.ServiceEntry serviceEntry = new ServiceEntryDataDefine.ServiceEntry(); - if (entryServiceId == 0) { - serviceEntry.setId(timeBucket + Const.ID_SPLIT + entryServiceName); - } else { - serviceEntry.setId(timeBucket + Const.ID_SPLIT + entryServiceId); - } + serviceEntry.setId(applicationId + Const.ID_SPLIT + entryServiceName); serviceEntry.setApplicationId(applicationId); serviceEntry.setEntryServiceId(entryServiceId); serviceEntry.setEntryServiceName(entryServiceName); - serviceEntry.setTimeBucket(timeBucket); + serviceEntry.setRegisterTime(timeBucket); + serviceEntry.setNewestTime(timeBucket); try { logger.debug("send to service entry aggregation worker, id: {}", serviceEntry.getId()); diff --git a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/service/entry/dao/ServiceEntryEsDAO.java b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/service/entry/dao/ServiceEntryEsDAO.java index 22029dc99..77f5a2283 100644 --- a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/service/entry/dao/ServiceEntryEsDAO.java +++ b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/service/entry/dao/ServiceEntryEsDAO.java @@ -24,7 +24,8 @@ public class ServiceEntryEsDAO extends EsDAO implements IServiceEntryDAO, IPersi data.setDataInteger(0, ((Number)source.get(ServiceEntryTable.COLUMN_APPLICATION_ID)).intValue()); data.setDataInteger(1, ((Number)source.get(ServiceEntryTable.COLUMN_ENTRY_SERVICE_ID)).intValue()); data.setDataString(1, (String)source.get(ServiceEntryTable.COLUMN_ENTRY_SERVICE_NAME)); - data.setDataLong(0, (Long)source.get(ServiceEntryTable.COLUMN_TIME_BUCKET)); + data.setDataLong(0, ((Number)source.get(ServiceEntryTable.COLUMN_REGISTER_TIME)).longValue()); + data.setDataLong(1, ((Number)source.get(ServiceEntryTable.COLUMN_NEWEST_TIME)).longValue()); return data; } else { return null; @@ -36,8 +37,8 @@ public class ServiceEntryEsDAO extends EsDAO implements IServiceEntryDAO, IPersi source.put(ServiceEntryTable.COLUMN_APPLICATION_ID, data.getDataInteger(0)); source.put(ServiceEntryTable.COLUMN_ENTRY_SERVICE_ID, data.getDataInteger(1)); source.put(ServiceEntryTable.COLUMN_ENTRY_SERVICE_NAME, data.getDataString(1)); - source.put(ServiceEntryTable.COLUMN_TIME_BUCKET, data.getDataLong(0)); - + source.put(ServiceEntryTable.COLUMN_REGISTER_TIME, data.getDataLong(0)); + source.put(ServiceEntryTable.COLUMN_NEWEST_TIME, data.getDataLong(1)); return getClient().prepareIndex(ServiceEntryTable.TABLE, data.getDataString(0)).setSource(source); } @@ -46,7 +47,8 @@ public class ServiceEntryEsDAO extends EsDAO implements IServiceEntryDAO, IPersi source.put(ServiceEntryTable.COLUMN_APPLICATION_ID, data.getDataInteger(0)); source.put(ServiceEntryTable.COLUMN_ENTRY_SERVICE_ID, data.getDataInteger(1)); source.put(ServiceEntryTable.COLUMN_ENTRY_SERVICE_NAME, data.getDataString(1)); - source.put(ServiceEntryTable.COLUMN_TIME_BUCKET, data.getDataLong(0)); + source.put(ServiceEntryTable.COLUMN_REGISTER_TIME, data.getDataLong(0)); + source.put(ServiceEntryTable.COLUMN_NEWEST_TIME, data.getDataLong(1)); return getClient().prepareUpdate(ServiceEntryTable.TABLE, data.getDataString(0)).setDoc(source); } diff --git a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/service/entry/define/ServiceEntryEsTableDefine.java b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/service/entry/define/ServiceEntryEsTableDefine.java index 8818fb223..cf2e43608 100644 --- a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/service/entry/define/ServiceEntryEsTableDefine.java +++ b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/service/entry/define/ServiceEntryEsTableDefine.java @@ -26,7 +26,10 @@ public class ServiceEntryEsTableDefine extends ElasticSearchTableDefine { } @Override public void initialize() { - addColumn(new ElasticSearchColumnDefine(ServiceEntryTable.COLUMN_AGG, ElasticSearchColumnDefine.Type.Keyword.name())); - addColumn(new ElasticSearchColumnDefine(ServiceEntryTable.COLUMN_TIME_BUCKET, ElasticSearchColumnDefine.Type.Long.name())); + addColumn(new ElasticSearchColumnDefine(ServiceEntryTable.COLUMN_APPLICATION_ID, ElasticSearchColumnDefine.Type.Integer.name())); + addColumn(new ElasticSearchColumnDefine(ServiceEntryTable.COLUMN_ENTRY_SERVICE_ID, ElasticSearchColumnDefine.Type.Integer.name())); + addColumn(new ElasticSearchColumnDefine(ServiceEntryTable.COLUMN_ENTRY_SERVICE_NAME, ElasticSearchColumnDefine.Type.Text.name())); + addColumn(new ElasticSearchColumnDefine(ServiceEntryTable.COLUMN_REGISTER_TIME, ElasticSearchColumnDefine.Type.Long.name())); + addColumn(new ElasticSearchColumnDefine(ServiceEntryTable.COLUMN_NEWEST_TIME, ElasticSearchColumnDefine.Type.Long.name())); } } diff --git a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/service/entry/define/ServiceEntryH2TableDefine.java b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/service/entry/define/ServiceEntryH2TableDefine.java index bcaa02e27..bd32780e8 100644 --- a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/service/entry/define/ServiceEntryH2TableDefine.java +++ b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/service/entry/define/ServiceEntryH2TableDefine.java @@ -15,7 +15,10 @@ public class ServiceEntryH2TableDefine extends H2TableDefine { @Override public void initialize() { addColumn(new H2ColumnDefine(ServiceEntryTable.COLUMN_ID, H2ColumnDefine.Type.Varchar.name())); - addColumn(new H2ColumnDefine(ServiceEntryTable.COLUMN_AGG, H2ColumnDefine.Type.Varchar.name())); - addColumn(new H2ColumnDefine(ServiceEntryTable.COLUMN_TIME_BUCKET, H2ColumnDefine.Type.Bigint.name())); + addColumn(new H2ColumnDefine(ServiceEntryTable.COLUMN_APPLICATION_ID, H2ColumnDefine.Type.Int.name())); + addColumn(new H2ColumnDefine(ServiceEntryTable.COLUMN_ENTRY_SERVICE_ID, H2ColumnDefine.Type.Int.name())); + addColumn(new H2ColumnDefine(ServiceEntryTable.COLUMN_ENTRY_SERVICE_NAME, H2ColumnDefine.Type.Varchar.name())); + addColumn(new H2ColumnDefine(ServiceEntryTable.COLUMN_REGISTER_TIME, H2ColumnDefine.Type.Bigint.name())); + addColumn(new H2ColumnDefine(ServiceEntryTable.COLUMN_NEWEST_TIME, H2ColumnDefine.Type.Bigint.name())); } } diff --git a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/serviceref/ServiceReferenceSpanListener.java b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/serviceref/ServiceReferenceSpanListener.java index 4280561a2..634fa7589 100644 --- a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/serviceref/ServiceReferenceSpanListener.java +++ b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/serviceref/ServiceReferenceSpanListener.java @@ -2,6 +2,7 @@ package org.skywalking.apm.collector.agentstream.worker.serviceref; import java.util.ArrayList; import java.util.List; +import org.skywalking.apm.collector.agentstream.worker.cache.InstanceCache; import org.skywalking.apm.collector.agentstream.worker.segment.EntrySpanListener; import org.skywalking.apm.collector.agentstream.worker.segment.ExitSpanListener; import org.skywalking.apm.collector.agentstream.worker.segment.FirstSpanListener; @@ -14,6 +15,7 @@ import org.skywalking.apm.collector.stream.StreamModuleContext; import org.skywalking.apm.collector.stream.StreamModuleGroupDefine; import org.skywalking.apm.collector.stream.worker.WorkerInvokeException; import org.skywalking.apm.collector.stream.worker.WorkerNotFoundException; +import org.skywalking.apm.network.proto.SpanLayer; import org.skywalking.apm.network.proto.SpanObject; import org.skywalking.apm.network.proto.TraceSegmentReference; import org.slf4j.Logger; @@ -49,7 +51,7 @@ public class ServiceReferenceSpanListener implements FirstSpanListener, EntrySpa public void parseEntry(SpanObject spanObject, int applicationId, int applicationInstanceId, String segmentId) { serviceId = spanObject.getOperationNameId(); if (spanObject.getOperationNameId() == 0) { - serviceName = spanObject.getOperationName(); + serviceName = String.valueOf(applicationId) + Const.ID_SPLIT + spanObject.getOperationName(); } else { serviceName = Const.EMPTY_STRING; } @@ -60,18 +62,21 @@ public class ServiceReferenceSpanListener implements FirstSpanListener, EntrySpa @Override public void parseExit(SpanObject spanObject, int applicationId, int applicationInstanceId, String segmentId) { - ServiceReferenceDataDefine.ServiceReference serviceReference = new ServiceReferenceDataDefine.ServiceReference(); - serviceReference.setBehindServiceId(spanObject.getOperationNameId()); - if (spanObject.getOperationNameId() == 0) { - serviceReference.setBehindServiceName(spanObject.getOperationName()); - } else { - serviceReference.setBehindServiceName(Const.EMPTY_STRING); + if (spanObject.getSpanLayer().equals(SpanLayer.Database)) { + ServiceReferenceDataDefine.ServiceReference serviceReference = new ServiceReferenceDataDefine.ServiceReference(); + serviceReference.setBehindServiceId(spanObject.getOperationNameId()); + if (spanObject.getOperationNameId() == 0) { + serviceReference.setBehindServiceName(String.valueOf(applicationId) + Const.ID_SPLIT + spanObject.getOperationName()); + } else { + serviceReference.setBehindServiceName(Const.EMPTY_STRING); + } + calculateCost(serviceReference, spanObject.getStartTime(), spanObject.getEndTime(), spanObject.getIsError()); + exitServiceRefs.add(serviceReference); } - calculateCost(serviceReference, spanObject.getStartTime(), spanObject.getEndTime(), spanObject.getIsError()); - exitServiceRefs.add(serviceReference); } - private void calculateCost(ServiceReferenceDataDefine.ServiceReference serviceReference, long startTime, long endTime, + private void calculateCost(ServiceReferenceDataDefine.ServiceReference serviceReference, long startTime, + long endTime, boolean isError) { long cost = endTime - startTime; if (cost <= 1000 && !isError) { @@ -86,6 +91,7 @@ public class ServiceReferenceSpanListener implements FirstSpanListener, EntrySpa serviceReference.setError(1); } serviceReference.setSummary(1); + serviceReference.setCostSummary(cost); } @Override public void build() { @@ -96,10 +102,10 @@ public class ServiceReferenceSpanListener implements FirstSpanListener, EntrySpa referenceServices.forEach(reference -> { ServiceReferenceDataDefine.ServiceReference serviceReference = new ServiceReferenceDataDefine.ServiceReference(); int entryServiceId = reference.getEntryServiceId(); - String entryServiceName = reference.getEntryServiceName(); + String entryServiceName = buildServiceName(reference.getEntryApplicationInstanceId(), reference.getEntryServiceId(), reference.getEntryServiceName()); int frontServiceId = reference.getParentServiceId(); - String frontServiceName = reference.getParentServiceName(); + String frontServiceName = buildServiceName(reference.getParentApplicationInstanceId(), reference.getParentServiceId(), reference.getParentServiceName()); int behindServiceId = serviceId; String behindServiceName = serviceName; @@ -128,10 +134,10 @@ public class ServiceReferenceSpanListener implements FirstSpanListener, EntrySpa if (referenceServices.size() > 0) { referenceServices.forEach(reference -> { int entryServiceId = reference.getEntryServiceId(); - String entryServiceName = reference.getEntryServiceName(); + String entryServiceName = buildServiceName(reference.getEntryApplicationInstanceId(), reference.getEntryServiceId(), reference.getEntryServiceName()); int frontServiceId = reference.getParentServiceId(); - String frontServiceName = reference.getParentServiceName(); + String frontServiceName = buildServiceName(reference.getParentApplicationInstanceId(), reference.getParentServiceId(), reference.getParentServiceName()); int behindServiceId = serviceReference.getBehindServiceId(); String behindServiceName = serviceReference.getBehindServiceName(); @@ -196,4 +202,13 @@ public class ServiceReferenceSpanListener implements FirstSpanListener, EntrySpa logger.error(e.getMessage(), e); } } + + private String buildServiceName(int instanceId, int serviceId, String serviceName) { + if (serviceId == 0) { + int applicationId = InstanceCache.get(instanceId); + return String.valueOf(applicationId) + Const.ID_SPLIT + serviceName; + } else { + return Const.EMPTY_STRING; + } + } } diff --git a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/serviceref/dao/ServiceReferenceEsDAO.java b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/serviceref/dao/ServiceReferenceEsDAO.java index 48d6a4f52..e20910e04 100644 --- a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/serviceref/dao/ServiceReferenceEsDAO.java +++ b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/serviceref/dao/ServiceReferenceEsDAO.java @@ -37,7 +37,8 @@ public class ServiceReferenceEsDAO extends EsDAO implements IServiceReferenceDAO data.setDataLong(3, ((Number)source.get(ServiceReferenceTable.COLUMN_S5_GT)).longValue()); data.setDataLong(4, ((Number)source.get(ServiceReferenceTable.COLUMN_SUMMARY)).longValue()); data.setDataLong(5, ((Number)source.get(ServiceReferenceTable.COLUMN_ERROR)).longValue()); - data.setDataLong(6, ((Number)source.get(ServiceReferenceTable.COLUMN_TIME_BUCKET)).longValue()); + data.setDataLong(6, ((Number)source.get(ServiceReferenceTable.COLUMN_COST_SUMMARY)).longValue()); + data.setDataLong(7, ((Number)source.get(ServiceReferenceTable.COLUMN_TIME_BUCKET)).longValue()); return data; } else { return null; @@ -58,7 +59,8 @@ public class ServiceReferenceEsDAO extends EsDAO implements IServiceReferenceDAO source.put(ServiceReferenceTable.COLUMN_S5_GT, data.getDataLong(3)); source.put(ServiceReferenceTable.COLUMN_SUMMARY, data.getDataLong(4)); source.put(ServiceReferenceTable.COLUMN_ERROR, data.getDataLong(5)); - source.put(ServiceReferenceTable.COLUMN_TIME_BUCKET, data.getDataLong(6)); + source.put(ServiceReferenceTable.COLUMN_COST_SUMMARY, data.getDataLong(6)); + source.put(ServiceReferenceTable.COLUMN_TIME_BUCKET, data.getDataLong(7)); return getClient().prepareIndex(ServiceReferenceTable.TABLE, data.getDataString(0)).setSource(source); } @@ -77,7 +79,8 @@ public class ServiceReferenceEsDAO extends EsDAO implements IServiceReferenceDAO source.put(ServiceReferenceTable.COLUMN_S5_GT, data.getDataLong(3)); source.put(ServiceReferenceTable.COLUMN_SUMMARY, data.getDataLong(4)); source.put(ServiceReferenceTable.COLUMN_ERROR, data.getDataLong(5)); - source.put(ServiceReferenceTable.COLUMN_TIME_BUCKET, data.getDataLong(6)); + source.put(ServiceReferenceTable.COLUMN_COST_SUMMARY, data.getDataLong(6)); + source.put(ServiceReferenceTable.COLUMN_TIME_BUCKET, data.getDataLong(7)); return getClient().prepareUpdate(ServiceReferenceTable.TABLE, data.getDataString(0)).setDoc(source); } diff --git a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/serviceref/define/ServiceReferenceEsTableDefine.java b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/serviceref/define/ServiceReferenceEsTableDefine.java index 4b33c73a4..efbe857c2 100644 --- a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/serviceref/define/ServiceReferenceEsTableDefine.java +++ b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/serviceref/define/ServiceReferenceEsTableDefine.java @@ -39,6 +39,7 @@ public class ServiceReferenceEsTableDefine extends ElasticSearchTableDefine { addColumn(new ElasticSearchColumnDefine(ServiceReferenceTable.COLUMN_S5_GT, ElasticSearchColumnDefine.Type.Long.name())); addColumn(new ElasticSearchColumnDefine(ServiceReferenceTable.COLUMN_SUMMARY, ElasticSearchColumnDefine.Type.Long.name())); addColumn(new ElasticSearchColumnDefine(ServiceReferenceTable.COLUMN_ERROR, ElasticSearchColumnDefine.Type.Long.name())); + addColumn(new ElasticSearchColumnDefine(ServiceReferenceTable.COLUMN_COST_SUMMARY, ElasticSearchColumnDefine.Type.Long.name())); addColumn(new ElasticSearchColumnDefine(ServiceReferenceTable.COLUMN_TIME_BUCKET, ElasticSearchColumnDefine.Type.Long.name())); } } diff --git a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/serviceref/define/ServiceReferenceH2TableDefine.java b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/serviceref/define/ServiceReferenceH2TableDefine.java index 080387fe9..1ab15c020 100644 --- a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/serviceref/define/ServiceReferenceH2TableDefine.java +++ b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/serviceref/define/ServiceReferenceH2TableDefine.java @@ -27,6 +27,7 @@ public class ServiceReferenceH2TableDefine extends H2TableDefine { addColumn(new H2ColumnDefine(ServiceReferenceTable.COLUMN_S5_GT, H2ColumnDefine.Type.Bigint.name())); addColumn(new H2ColumnDefine(ServiceReferenceTable.COLUMN_SUMMARY, H2ColumnDefine.Type.Bigint.name())); addColumn(new H2ColumnDefine(ServiceReferenceTable.COLUMN_ERROR, H2ColumnDefine.Type.Bigint.name())); + addColumn(new H2ColumnDefine(ServiceReferenceTable.COLUMN_COST_SUMMARY, H2ColumnDefine.Type.Bigint.name())); addColumn(new H2ColumnDefine(ServiceReferenceTable.COLUMN_TIME_BUCKET, H2ColumnDefine.Type.Bigint.name())); } } diff --git a/apm-collector/apm-collector-agentstream/src/test/java/org/skywalking/apm/collector/agentstream/mock/SegmentPost.java b/apm-collector/apm-collector-agentstream/src/test/java/org/skywalking/apm/collector/agentstream/mock/SegmentPost.java index f6b877a70..26dd7ce04 100644 --- a/apm-collector/apm-collector-agentstream/src/test/java/org/skywalking/apm/collector/agentstream/mock/SegmentPost.java +++ b/apm-collector/apm-collector-agentstream/src/test/java/org/skywalking/apm/collector/agentstream/mock/SegmentPost.java @@ -7,10 +7,13 @@ import java.io.IOException; import org.skywalking.apm.collector.agentstream.HttpClientTools; import org.skywalking.apm.collector.agentstream.worker.register.application.dao.ApplicationEsDAO; import org.skywalking.apm.collector.agentstream.worker.register.instance.dao.InstanceEsDAO; +import org.skywalking.apm.collector.agentstream.worker.register.servicename.dao.ServiceNameEsDAO; import org.skywalking.apm.collector.client.elasticsearch.ElasticSearchClient; import org.skywalking.apm.collector.core.CollectorException; +import org.skywalking.apm.collector.core.util.TimeBucketUtils; import org.skywalking.apm.collector.storage.define.register.ApplicationDataDefine; import org.skywalking.apm.collector.storage.define.register.InstanceDataDefine; +import org.skywalking.apm.collector.storage.define.register.ServiceNameDataDefine; /** * @author pengys5 @@ -20,13 +23,14 @@ public class SegmentPost { public static void main(String[] args) throws IOException, InterruptedException, CollectorException { ElasticSearchClient client = new ElasticSearchClient("CollectorDBCluster", true, "127.0.0.1:9300"); client.initialize(); + long now = TimeBucketUtils.INSTANCE.getSecondTimeBucket(System.currentTimeMillis()); InstanceEsDAO instanceEsDAO = new InstanceEsDAO(); instanceEsDAO.setClient(client); - InstanceDataDefine.Instance consumerInstance = new InstanceDataDefine.Instance("2", 2, "dubbox-consumer", 1501858094526L, 2, 1501858094526L, ""); + InstanceDataDefine.Instance consumerInstance = new InstanceDataDefine.Instance("2", 2, "dubbox-consumer", now, 2, now, ""); instanceEsDAO.save(consumerInstance); - InstanceDataDefine.Instance providerInstance = new InstanceDataDefine.Instance("3", 3, "dubbox-provider", 1501858094526L, 3, 1501858094526L, ""); + InstanceDataDefine.Instance providerInstance = new InstanceDataDefine.Instance("3", 3, "dubbox-provider", now, 3, now, ""); instanceEsDAO.save(providerInstance); ApplicationEsDAO applicationEsDAO = new ApplicationEsDAO(); @@ -39,6 +43,18 @@ public class SegmentPost { ApplicationDataDefine.Application providerApplication = new ApplicationDataDefine.Application("3", "dubbox-provider", 3); applicationEsDAO.save(providerApplication); + ServiceNameEsDAO serviceNameEsDAO = new ServiceNameEsDAO(); + serviceNameEsDAO.setClient(client); + + ServiceNameDataDefine.ServiceName serviceName_1 = new ServiceNameDataDefine.ServiceName("1", "", 0, 1); + serviceNameEsDAO.save(serviceName_1); + ServiceNameDataDefine.ServiceName serviceName_2 = new ServiceNameDataDefine.ServiceName("2", "org.skywaking.apm.testcase.dubbo.services.GreetService.doBusiness()", 2, 2); + serviceNameEsDAO.save(serviceName_2); + ServiceNameDataDefine.ServiceName serviceName_3 = new ServiceNameDataDefine.ServiceName("3", "/dubbox-case/case/dubbox-rest", 2, 3); + serviceNameEsDAO.save(serviceName_3); + ServiceNameDataDefine.ServiceName serviceName_4 = new ServiceNameDataDefine.ServiceName("4", "org.skywaking.apm.testcase.dubbo.services.GreetService.doBusiness()", 3, 4); + serviceNameEsDAO.save(serviceName_4); + while (true) { JsonElement consumer = JsonFileReader.INSTANCE.read("json/segment/normal/dubbox-consumer.json"); modifyTime(consumer); diff --git a/apm-collector/apm-collector-agentstream/src/test/resources/json/segment/normal/dubbox-provider.json b/apm-collector/apm-collector-agentstream/src/test/resources/json/segment/normal/dubbox-provider.json index 19b69ecaf..6da99d6f7 100644 --- a/apm-collector/apm-collector-agentstream/src/test/resources/json/segment/normal/dubbox-provider.json +++ b/apm-collector/apm-collector-agentstream/src/test/resources/json/segment/normal/dubbox-provider.json @@ -25,7 +25,7 @@ "ai": 2, "si": 1, "vi": 0, - "vn": "org.skywaking.apm.testcase.dubbo.services.GreetService.doBusiness()", + "vn": "/dubbox-case/case/dubbox-rest", "ni": 0, "nn": "172.25.0.4:20880", "ea": 2, @@ -38,7 +38,7 @@ { "si": 0, "tv": 0, - "lv": 1, + "lv": 2, "ps": -1, "st": 1501858094883, "et": 1501858096950, diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/util/ColumnNameUtils.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/util/ColumnNameUtils.java new file mode 100644 index 000000000..9dca8a809 --- /dev/null +++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/util/ColumnNameUtils.java @@ -0,0 +1,26 @@ +package org.skywalking.apm.collector.core.util; + +/** + * @author pengys5 + */ +public enum ColumnNameUtils { + INSTANCE; + + public String rename(String columnName) { + StringBuilder renamedColumnName = new StringBuilder(); + char[] chars = columnName.toLowerCase().toCharArray(); + + boolean findUnderline = false; + for (char character : chars) { + if (character == '_') { + findUnderline = true; + } else if (findUnderline) { + renamedColumnName.append(String.valueOf(character).toUpperCase()); + findUnderline = false; + } else { + renamedColumnName.append(character); + } + } + return renamedColumnName.toString(); + } +} diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/util/TimeBucketUtils.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/util/TimeBucketUtils.java index 7d2728ae5..7178e79ff 100644 --- a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/util/TimeBucketUtils.java +++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/util/TimeBucketUtils.java @@ -3,6 +3,7 @@ package org.skywalking.apm.collector.core.util; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.TimeZone; +import org.skywalking.apm.collector.core.framework.UnexpectedException; /** * @author pengys5 @@ -43,6 +44,29 @@ public enum TimeBucketUtils { return Long.valueOf(timeStr); } + public long changeTimeBucket2TimeStamp(String timeBucketType, long timeBucket) { + if (TimeBucketType.SECOND.name().toLowerCase().equals(timeBucketType.toLowerCase())) { + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.YEAR, Integer.valueOf(String.valueOf(timeBucket).substring(0, 4))); + calendar.set(Calendar.MONTH, Integer.valueOf(String.valueOf(timeBucket).substring(4, 6)) - 1); + calendar.set(Calendar.DAY_OF_MONTH, Integer.valueOf(String.valueOf(timeBucket).substring(6, 8))); + calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(String.valueOf(timeBucket).substring(8, 10))); + calendar.set(Calendar.MINUTE, Integer.valueOf(String.valueOf(timeBucket).substring(10, 12))); + calendar.set(Calendar.SECOND, Integer.valueOf(String.valueOf(timeBucket).substring(12, 14))); + return calendar.getTimeInMillis(); + } else if (TimeBucketType.MINUTE.name().toLowerCase().equals(timeBucketType.toLowerCase())) { + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.YEAR, Integer.valueOf(String.valueOf(timeBucket).substring(0, 4))); + calendar.set(Calendar.MONTH, Integer.valueOf(String.valueOf(timeBucket).substring(4, 6)) - 1); + calendar.set(Calendar.DAY_OF_MONTH, Integer.valueOf(String.valueOf(timeBucket).substring(6, 8))); + calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(String.valueOf(timeBucket).substring(8, 10))); + calendar.set(Calendar.MINUTE, Integer.valueOf(String.valueOf(timeBucket).substring(10, 12))); + return calendar.getTimeInMillis(); + } else { + throw new UnexpectedException("time bucket type must be second or minute"); + } + } + public long getFiveSecondTimeBucket(long secondTimeBucket) { long mantissa = secondTimeBucket % 10; if (mantissa < 5) { @@ -63,4 +87,8 @@ public enum TimeBucketUtils { return timeBucket - 800; } } + + public enum TimeBucketType { + SECOND, MINUTE, HOUR, DAY + } } diff --git a/apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/utils/ColumnNameUtilsTestCase.java b/apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/utils/ColumnNameUtilsTestCase.java new file mode 100644 index 000000000..becc4aecb --- /dev/null +++ b/apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/utils/ColumnNameUtilsTestCase.java @@ -0,0 +1,17 @@ +package org.skywalking.apm.collector.core.utils; + +import org.junit.Assert; +import org.junit.Test; +import org.skywalking.apm.collector.core.util.ColumnNameUtils; + +/** + * @author pengys5 + */ +public class ColumnNameUtilsTestCase { + + @Test + public void testRename() { + String columnName = ColumnNameUtils.INSTANCE.rename("aaa_bbb_ccc"); + Assert.assertEquals("aaaBbbCcc", columnName); + } +} diff --git a/apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/utils/TimeBucketUtilsTestCase.java b/apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/utils/TimeBucketUtilsTestCase.java index 43e7b70dd..a7cc822cd 100644 --- a/apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/utils/TimeBucketUtilsTestCase.java +++ b/apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/utils/TimeBucketUtilsTestCase.java @@ -20,4 +20,11 @@ public class TimeBucketUtilsTestCase { fiveSecondTimeBucket = TimeBucketUtils.INSTANCE.getFiveSecondTimeBucket(20170804224815L); Assert.assertEquals(20170804224815L, fiveSecondTimeBucket); } + + @Test + public void testChangeTimeBucket2TimeStamp() { + long timeStamp = TimeBucketUtils.INSTANCE.changeTimeBucket2TimeStamp(TimeBucketUtils.TimeBucketType.MINUTE.name(), 201708120810L); + long minute = TimeBucketUtils.INSTANCE.getMinuteTimeBucket(timeStamp); + Assert.assertEquals(201708120810L, minute); + } } diff --git a/apm-collector/apm-collector-storage/src/main/java/org/skywalking/apm/collector/storage/define/service/ServiceEntryDataDefine.java b/apm-collector/apm-collector-storage/src/main/java/org/skywalking/apm/collector/storage/define/service/ServiceEntryDataDefine.java index c105a66bf..0ae79d695 100644 --- a/apm-collector/apm-collector-storage/src/main/java/org/skywalking/apm/collector/storage/define/service/ServiceEntryDataDefine.java +++ b/apm-collector/apm-collector-storage/src/main/java/org/skywalking/apm/collector/storage/define/service/ServiceEntryDataDefine.java @@ -15,15 +15,16 @@ import org.skywalking.apm.collector.storage.define.DataDefine; public class ServiceEntryDataDefine extends DataDefine { @Override protected int initialCapacity() { - return 5; + return 6; } @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 CoverOperation())); - addAttribute(3, new Attribute(ServiceEntryTable.COLUMN_ENTRY_SERVICE_NAME, AttributeType.STRING, new CoverOperation())); - addAttribute(4, new Attribute(ServiceEntryTable.COLUMN_TIME_BUCKET, AttributeType.LONG, new CoverOperation())); + addAttribute(2, new Attribute(ServiceEntryTable.COLUMN_ENTRY_SERVICE_ID, AttributeType.INTEGER, new NonOperation())); + 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())); } @Override public Object deserialize(RemoteData remoteData) { @@ -39,15 +40,18 @@ public class ServiceEntryDataDefine extends DataDefine { private int applicationId; private int entryServiceId; private String entryServiceName; - private long timeBucket; + private long registerTime; + private long newestTime; public ServiceEntry(String id, int applicationId, int entryServiceId, String entryServiceName, - long timeBucket) { + long registerTime, + long newestTime) { this.id = id; this.applicationId = applicationId; this.entryServiceId = entryServiceId; this.entryServiceName = entryServiceName; - this.timeBucket = timeBucket; + this.registerTime = registerTime; + this.newestTime = newestTime; } public ServiceEntry() { @@ -60,7 +64,8 @@ public class ServiceEntryDataDefine extends DataDefine { data.setDataInteger(0, this.applicationId); data.setDataInteger(1, this.entryServiceId); data.setDataString(1, this.entryServiceName); - data.setDataLong(0, this.timeBucket); + data.setDataLong(0, this.registerTime); + data.setDataLong(1, this.newestTime); return data; } @@ -69,7 +74,8 @@ public class ServiceEntryDataDefine extends DataDefine { this.applicationId = data.getDataInteger(0); this.entryServiceId = data.getDataInteger(1); this.entryServiceName = data.getDataString(1); - this.timeBucket = data.getDataLong(0); + this.registerTime = data.getDataLong(0); + this.newestTime = data.getDataLong(1); return this; } @@ -97,14 +103,6 @@ public class ServiceEntryDataDefine extends DataDefine { this.entryServiceName = entryServiceName; } - public long getTimeBucket() { - return timeBucket; - } - - public void setTimeBucket(long timeBucket) { - this.timeBucket = timeBucket; - } - public int getApplicationId() { return applicationId; } @@ -112,5 +110,21 @@ public class ServiceEntryDataDefine extends DataDefine { public void setApplicationId(int applicationId) { this.applicationId = applicationId; } + + public long getRegisterTime() { + return registerTime; + } + + public void setRegisterTime(long registerTime) { + this.registerTime = registerTime; + } + + public long getNewestTime() { + return newestTime; + } + + public void setNewestTime(long newestTime) { + this.newestTime = newestTime; + } } } diff --git a/apm-collector/apm-collector-storage/src/main/java/org/skywalking/apm/collector/storage/define/service/ServiceEntryTable.java b/apm-collector/apm-collector-storage/src/main/java/org/skywalking/apm/collector/storage/define/service/ServiceEntryTable.java index db74c887e..e8e6e914b 100644 --- a/apm-collector/apm-collector-storage/src/main/java/org/skywalking/apm/collector/storage/define/service/ServiceEntryTable.java +++ b/apm-collector/apm-collector-storage/src/main/java/org/skywalking/apm/collector/storage/define/service/ServiceEntryTable.java @@ -10,4 +10,6 @@ public class ServiceEntryTable extends CommonTable { public static final String COLUMN_APPLICATION_ID = "application_id"; public static final String COLUMN_ENTRY_SERVICE_ID = "entry_service_id"; public static final String COLUMN_ENTRY_SERVICE_NAME = "entry_service_name"; + public static final String COLUMN_REGISTER_TIME = "register_time"; + public static final String COLUMN_NEWEST_TIME = "newest_time"; } diff --git a/apm-collector/apm-collector-storage/src/main/java/org/skywalking/apm/collector/storage/define/serviceref/ServiceReferenceDataDefine.java b/apm-collector/apm-collector-storage/src/main/java/org/skywalking/apm/collector/storage/define/serviceref/ServiceReferenceDataDefine.java index e67f4c08e..e0ad40e9f 100644 --- a/apm-collector/apm-collector-storage/src/main/java/org/skywalking/apm/collector/storage/define/serviceref/ServiceReferenceDataDefine.java +++ b/apm-collector/apm-collector-storage/src/main/java/org/skywalking/apm/collector/storage/define/serviceref/ServiceReferenceDataDefine.java @@ -15,7 +15,7 @@ import org.skywalking.apm.collector.storage.define.DataDefine; public class ServiceReferenceDataDefine extends DataDefine { @Override protected int initialCapacity() { - return 14; + return 15; } @Override protected void attributeDefine() { @@ -32,7 +32,8 @@ public class ServiceReferenceDataDefine extends DataDefine { addAttribute(10, new Attribute(ServiceReferenceTable.COLUMN_S5_GT, AttributeType.LONG, new AddOperation())); addAttribute(11, new Attribute(ServiceReferenceTable.COLUMN_SUMMARY, AttributeType.LONG, new AddOperation())); addAttribute(12, new Attribute(ServiceReferenceTable.COLUMN_ERROR, AttributeType.LONG, new AddOperation())); - addAttribute(13, new Attribute(ServiceReferenceTable.COLUMN_TIME_BUCKET, AttributeType.LONG, new NonOperation())); + addAttribute(13, new Attribute(ServiceReferenceTable.COLUMN_COST_SUMMARY, AttributeType.LONG, new AddOperation())); + addAttribute(14, new Attribute(ServiceReferenceTable.COLUMN_TIME_BUCKET, AttributeType.LONG, new NonOperation())); } @Override public Object deserialize(RemoteData remoteData) { @@ -49,9 +50,10 @@ public class ServiceReferenceDataDefine extends DataDefine { long s5Gt = remoteData.getDataLongs(3); long summary = remoteData.getDataLongs(4); long error = remoteData.getDataLongs(5); - long timeBucket = remoteData.getDataLongs(6); + long costSummary = remoteData.getDataLongs(6); + long timeBucket = remoteData.getDataLongs(7); return new ServiceReference(id, entryServiceId, entryServiceName, frontServiceId, frontServiceName, - behindServiceId, behindServiceName, s1Lte, s3Lte, s5Lte, s5Gt, summary, error, timeBucket); + behindServiceId, behindServiceName, s1Lte, s3Lte, s5Lte, s5Gt, summary, error, costSummary, timeBucket); } @Override public RemoteData serialize(Object object) { @@ -70,6 +72,7 @@ public class ServiceReferenceDataDefine extends DataDefine { builder.addDataLongs(serviceReference.getS5Gt()); builder.addDataLongs(serviceReference.getSummary()); builder.addDataLongs(serviceReference.getError()); + builder.addDataLongs(serviceReference.getCostSummary()); builder.addDataLongs(serviceReference.getTimeBucket()); return builder.build(); } @@ -88,11 +91,12 @@ public class ServiceReferenceDataDefine extends DataDefine { private long s5Gt; private long summary; private long error; + private long costSummary; private long timeBucket; public ServiceReference(String id, int entryServiceId, String entryServiceName, int frontServiceId, String frontServiceName, int behindServiceId, String behindServiceName, long s1Lte, long s3Lte, long s5Lte, - long s5Gt, long summary, long error, long timeBucket) { + long s5Gt, long summary, long error, long costSummary, long timeBucket) { this.id = id; this.entryServiceId = entryServiceId; this.entryServiceName = entryServiceName; @@ -106,6 +110,7 @@ public class ServiceReferenceDataDefine extends DataDefine { this.s5Gt = s5Gt; this.summary = summary; this.error = error; + this.costSummary = costSummary; this.timeBucket = timeBucket; } @@ -128,7 +133,8 @@ public class ServiceReferenceDataDefine extends DataDefine { data.setDataLong(3, this.s5Gt); data.setDataLong(4, this.summary); data.setDataLong(5, this.error); - data.setDataLong(6, this.timeBucket); + data.setDataLong(6, this.costSummary); + data.setDataLong(7, this.timeBucket); return data; } @@ -146,7 +152,8 @@ public class ServiceReferenceDataDefine extends DataDefine { this.s5Gt = data.getDataLong(3); this.summary = data.getDataLong(4); this.error = data.getDataLong(5); - this.timeBucket = data.getDataLong(6); + this.costSummary = data.getDataLong(6); + this.timeBucket = data.getDataLong(7); return this; } @@ -254,6 +261,14 @@ public class ServiceReferenceDataDefine extends DataDefine { this.error = error; } + public long getCostSummary() { + return costSummary; + } + + public void setCostSummary(long costSummary) { + this.costSummary = costSummary; + } + public long getTimeBucket() { return timeBucket; } diff --git a/apm-collector/apm-collector-storage/src/main/java/org/skywalking/apm/collector/storage/define/serviceref/ServiceReferenceTable.java b/apm-collector/apm-collector-storage/src/main/java/org/skywalking/apm/collector/storage/define/serviceref/ServiceReferenceTable.java index 6c2d3ffb3..4c85cbbf9 100644 --- a/apm-collector/apm-collector-storage/src/main/java/org/skywalking/apm/collector/storage/define/serviceref/ServiceReferenceTable.java +++ b/apm-collector/apm-collector-storage/src/main/java/org/skywalking/apm/collector/storage/define/serviceref/ServiceReferenceTable.java @@ -18,5 +18,6 @@ public class ServiceReferenceTable extends CommonTable { public static final String COLUMN_S5_LTE = "s5_lte"; public static final String COLUMN_S5_GT = "s5_gt"; public static final String COLUMN_SUMMARY = "summary"; + public static final String COLUMN_COST_SUMMARY = "cost_summary"; public static final String COLUMN_ERROR = "error"; } diff --git a/apm-collector/apm-collector-storage/src/main/java/org/skywalking/apm/collector/storage/elasticsearch/define/ElasticSearchColumnDefine.java b/apm-collector/apm-collector-storage/src/main/java/org/skywalking/apm/collector/storage/elasticsearch/define/ElasticSearchColumnDefine.java index 2d7d38595..0a8b880a0 100644 --- a/apm-collector/apm-collector-storage/src/main/java/org/skywalking/apm/collector/storage/elasticsearch/define/ElasticSearchColumnDefine.java +++ b/apm-collector/apm-collector-storage/src/main/java/org/skywalking/apm/collector/storage/elasticsearch/define/ElasticSearchColumnDefine.java @@ -11,6 +11,6 @@ public class ElasticSearchColumnDefine extends ColumnDefine { } public enum Type { - Binary, Boolean, Keyword, Long, Integer, Double + Binary, Boolean, Keyword, Long, Integer, Double, Text } } diff --git a/apm-collector/apm-collector-storage/src/main/java/org/skywalking/apm/collector/storage/elasticsearch/define/ElasticSearchStorageInstaller.java b/apm-collector/apm-collector-storage/src/main/java/org/skywalking/apm/collector/storage/elasticsearch/define/ElasticSearchStorageInstaller.java index 8b2c9f260..040349742 100644 --- a/apm-collector/apm-collector-storage/src/main/java/org/skywalking/apm/collector/storage/elasticsearch/define/ElasticSearchStorageInstaller.java +++ b/apm-collector/apm-collector-storage/src/main/java/org/skywalking/apm/collector/storage/elasticsearch/define/ElasticSearchStorageInstaller.java @@ -63,10 +63,19 @@ public class ElasticSearchStorageInstaller extends StorageInstaller { for (ColumnDefine columnDefine : tableDefine.getColumnDefines()) { ElasticSearchColumnDefine elasticSearchColumnDefine = (ElasticSearchColumnDefine)columnDefine; - mappingBuilder - .startObject(elasticSearchColumnDefine.getName()) - .field("type", elasticSearchColumnDefine.getType().toLowerCase()) - .endObject(); + + if (ElasticSearchColumnDefine.Type.Text.name().toLowerCase().equals(elasticSearchColumnDefine.getType().toLowerCase())) { + mappingBuilder + .startObject(elasticSearchColumnDefine.getName()) + .field("type", elasticSearchColumnDefine.getType().toLowerCase()) + .field("fielddata", true) + .endObject(); + } else { + mappingBuilder + .startObject(elasticSearchColumnDefine.getName()) + .field("type", elasticSearchColumnDefine.getType().toLowerCase()) + .endObject(); + } } mappingBuilder diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/cache/ServiceIdCache.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/cache/ServiceIdCache.java new file mode 100644 index 000000000..8f9a7fb2a --- /dev/null +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/cache/ServiceIdCache.java @@ -0,0 +1,37 @@ +package org.skywalking.apm.collector.ui.cache; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import org.skywalking.apm.collector.core.util.Const; +import org.skywalking.apm.collector.storage.dao.DAOContainer; +import org.skywalking.apm.collector.ui.dao.IServiceNameDAO; + +/** + * @author pengys5 + */ +public class ServiceIdCache { + + //TODO size configuration + private static Cache CACHE = CacheBuilder.newBuilder().maximumSize(1000).build(); + + public static int get(int applicationId, String serviceName) { + try { + return CACHE.get(applicationId + Const.ID_SPLIT + serviceName, () -> { + IServiceNameDAO dao = (IServiceNameDAO)DAOContainer.INSTANCE.get(IServiceNameDAO.class.getName()); + return dao.getServiceId(applicationId, serviceName); + }); + } catch (Throwable e) { + return 0; + } + } + + public static int getForUI(int applicationId, String serviceName) { + int serviceId = get(applicationId, serviceName); + if (serviceId == 0) { + IServiceNameDAO dao = (IServiceNameDAO)DAOContainer.INSTANCE.get(IServiceNameDAO.class.getName()); + serviceId = dao.getServiceId(applicationId, serviceName); + CACHE.put(applicationId + Const.ID_SPLIT + serviceName, serviceId); + } + return serviceId; + } +} diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/cache/ServiceNameCache.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/cache/ServiceNameCache.java index 252c79d20..8235b01a6 100644 --- a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/cache/ServiceNameCache.java +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/cache/ServiceNameCache.java @@ -24,4 +24,14 @@ public class ServiceNameCache { return Const.EXCEPTION; } } + + public static String getForUI(int serviceId) { + String serviceName = get(serviceId); + if (serviceName.equals("Unknown")) { + IServiceNameDAO dao = (IServiceNameDAO)DAOContainer.INSTANCE.get(IServiceNameDAO.class.getName()); + serviceName = dao.getServiceName(serviceId); + CACHE.put(serviceId, serviceName); + } + return serviceName; + } } diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/IInstanceDAO.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/IInstanceDAO.java index c90ab98d9..039a45d95 100644 --- a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/IInstanceDAO.java +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/IInstanceDAO.java @@ -1,6 +1,6 @@ package org.skywalking.apm.collector.ui.dao; -import java.util.List; +import com.google.gson.JsonArray; import org.skywalking.apm.collector.storage.define.register.InstanceDataDefine; /** @@ -11,7 +11,7 @@ public interface IInstanceDAO { Long instanceLastHeartBeatTime(long applicationInstanceId); - List getApplications(long time); + JsonArray getApplications(long startTime, long endTime); InstanceDataDefine.Instance getInstance(int instanceId); diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/IServiceEntryDAO.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/IServiceEntryDAO.java index a67fc41da..d8fcc6114 100644 --- a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/IServiceEntryDAO.java +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/IServiceEntryDAO.java @@ -1,10 +1,10 @@ package org.skywalking.apm.collector.ui.dao; -import com.google.gson.JsonArray; +import com.google.gson.JsonObject; /** * @author pengys5 */ public interface IServiceEntryDAO { - JsonArray load(int applicationId, long startTime, long endTime); + JsonObject load(int applicationId, String entryServiceName, long startTime, long endTime, int from, int size); } diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/IServiceNameDAO.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/IServiceNameDAO.java index 354e875fd..3b385a364 100644 --- a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/IServiceNameDAO.java +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/IServiceNameDAO.java @@ -5,4 +5,6 @@ package org.skywalking.apm.collector.ui.dao; */ public interface IServiceNameDAO { String getServiceName(int serviceId); + + int getServiceId(int applicationId, String serviceName); } diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/InstanceEsDAO.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/InstanceEsDAO.java index 6725798f9..e79a8874a 100644 --- a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/InstanceEsDAO.java +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/InstanceEsDAO.java @@ -1,7 +1,7 @@ package org.skywalking.apm.collector.ui.dao; -import java.util.LinkedList; -import java.util.List; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; import org.elasticsearch.action.get.GetRequestBuilder; import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.action.search.SearchRequestBuilder; @@ -15,11 +15,13 @@ import org.elasticsearch.index.query.RangeQueryBuilder; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.aggregations.AggregationBuilders; import org.elasticsearch.search.aggregations.bucket.terms.Terms; +import org.elasticsearch.search.aggregations.metrics.valuecount.ValueCount; import org.elasticsearch.search.sort.SortBuilders; import org.elasticsearch.search.sort.SortMode; import org.skywalking.apm.collector.storage.define.register.InstanceDataDefine; import org.skywalking.apm.collector.storage.define.register.InstanceTable; import org.skywalking.apm.collector.storage.elasticsearch.dao.EsDAO; +import org.skywalking.apm.collector.ui.cache.ApplicationCache; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -67,32 +69,31 @@ public class InstanceEsDAO extends EsDAO implements IInstanceDAO { return heartBeatTime; } - @Override public List getApplications(long time) { - logger.debug("application list get, time: {}", time); + @Override public JsonArray getApplications(long startTime, long endTime) { + logger.debug("application list get, start time: {}, end time: {}", startTime, endTime); SearchRequestBuilder searchRequestBuilder = getClient().prepareSearch(InstanceTable.TABLE); searchRequestBuilder.setTypes(InstanceTable.TABLE_TYPE); searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH); - - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - RangeQueryBuilder heartBeatRangeQueryBuilder = QueryBuilders.rangeQuery(InstanceTable.COLUMN_HEARTBEAT_TIME).gte(time); - RangeQueryBuilder registerRangeQueryBuilder = QueryBuilders.rangeQuery(InstanceTable.COLUMN_REGISTER_TIME).lte(time); - - boolQueryBuilder.must().add(registerRangeQueryBuilder); - boolQueryBuilder.must().add(heartBeatRangeQueryBuilder); - - searchRequestBuilder.setQuery(boolQueryBuilder); + searchRequestBuilder.setQuery(QueryBuilders.rangeQuery(InstanceTable.COLUMN_HEARTBEAT_TIME).gte(startTime)); searchRequestBuilder.setSize(0); - searchRequestBuilder.addAggregation(AggregationBuilders.terms(InstanceTable.COLUMN_APPLICATION_ID).field(InstanceTable.COLUMN_APPLICATION_ID).size(100)); + searchRequestBuilder.addAggregation(AggregationBuilders.terms(InstanceTable.COLUMN_APPLICATION_ID).field(InstanceTable.COLUMN_APPLICATION_ID).size(100) + .subAggregation(AggregationBuilders.count(InstanceTable.COLUMN_INSTANCE_ID).field(InstanceTable.COLUMN_INSTANCE_ID))); SearchResponse searchResponse = searchRequestBuilder.execute().actionGet(); Terms genders = searchResponse.getAggregations().get(InstanceTable.COLUMN_APPLICATION_ID); - List applications = new LinkedList<>(); - for (Terms.Bucket entry : genders.getBuckets()) { - Integer applicationId = entry.getKeyAsNumber().intValue(); + JsonArray applications = new JsonArray(); + for (Terms.Bucket applicationsBucket : genders.getBuckets()) { + Integer applicationId = applicationsBucket.getKeyAsNumber().intValue(); logger.debug("applicationId: {}", applicationId); - long instanceCount = entry.getDocCount(); - applications.add(new Application(applicationId, instanceCount)); + + ValueCount instanceCount = applicationsBucket.getAggregations().get(InstanceTable.COLUMN_INSTANCE_ID); + + JsonObject application = new JsonObject(); + application.addProperty("applicationId", applicationId); + application.addProperty("applicationCode", ApplicationCache.getForUI(applicationId)); + application.addProperty("instanceCount", instanceCount.getValue()); + applications.add(application); } return applications; } diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/InstanceH2DAO.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/InstanceH2DAO.java index 2a7413de0..10922e752 100644 --- a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/InstanceH2DAO.java +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/InstanceH2DAO.java @@ -1,5 +1,6 @@ package org.skywalking.apm.collector.ui.dao; +import com.google.gson.JsonArray; import java.util.List; import org.skywalking.apm.collector.storage.define.register.InstanceDataDefine; import org.skywalking.apm.collector.storage.h2.dao.H2DAO; @@ -16,7 +17,7 @@ public class InstanceH2DAO extends H2DAO implements IInstanceDAO { return null; } - @Override public List getApplications(long time) { + @Override public JsonArray getApplications(long startTime, long endTime) { return null; } diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceEntryEsDAO.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceEntryEsDAO.java index 2dc130eb7..299c4ae46 100644 --- a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceEntryEsDAO.java +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceEntryEsDAO.java @@ -1,14 +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.BoolQueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.SearchHits; +import org.elasticsearch.search.sort.SortBuilders; +import org.elasticsearch.search.sort.SortOrder; +import org.skywalking.apm.collector.core.util.ColumnNameUtils; +import org.skywalking.apm.collector.core.util.StringUtils; +import org.skywalking.apm.collector.storage.define.service.ServiceEntryTable; import org.skywalking.apm.collector.storage.elasticsearch.dao.EsDAO; +import org.skywalking.apm.collector.ui.cache.ApplicationCache; /** * @author pengys5 */ public class ServiceEntryEsDAO extends EsDAO implements IServiceEntryDAO { - @Override public JsonArray load(int applicationId, long startTime, long endTime) { - return null; + @Override + public JsonObject load(int applicationId, String entryServiceName, long startTime, long endTime, int from, + int size) { + SearchRequestBuilder searchRequestBuilder = getClient().prepareSearch(ServiceEntryTable.TABLE); + searchRequestBuilder.setTypes(ServiceEntryTable.TABLE_TYPE); + searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH); + + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + boolQueryBuilder.must().add(QueryBuilders.rangeQuery(ServiceEntryTable.COLUMN_REGISTER_TIME).lte(endTime)); + boolQueryBuilder.must().add(QueryBuilders.rangeQuery(ServiceEntryTable.COLUMN_NEWEST_TIME).gte(startTime)); + + if (applicationId != 0) { + boolQueryBuilder.must().add(QueryBuilders.matchQuery(ServiceEntryTable.COLUMN_APPLICATION_ID, applicationId)); + } + if (StringUtils.isNotEmpty(entryServiceName)) { + boolQueryBuilder.must().add(QueryBuilders.termQuery(ServiceEntryTable.COLUMN_ENTRY_SERVICE_NAME, entryServiceName)); + } + + searchRequestBuilder.setQuery(boolQueryBuilder); + searchRequestBuilder.setSize(size); + searchRequestBuilder.setFrom(from); + searchRequestBuilder.addSort(SortBuilders.fieldSort(ServiceEntryTable.COLUMN_ENTRY_SERVICE_NAME).order(SortOrder.ASC)); + + SearchResponse searchResponse = searchRequestBuilder.execute().actionGet(); + + return parseResponse(searchResponse); + } + + private JsonObject parseResponse(SearchResponse searchResponse) { + SearchHits searchHits = searchResponse.getHits(); + + JsonArray serviceArray = new JsonArray(); + for (SearchHit searchHit : searchHits.getHits()) { + int applicationId = ((Number)searchHit.getSource().get(ServiceEntryTable.COLUMN_APPLICATION_ID)).intValue(); + int entryServiceId = ((Number)searchHit.getSource().get(ServiceEntryTable.COLUMN_ENTRY_SERVICE_ID)).intValue(); + String applicationCode = ApplicationCache.getForUI(applicationId); + String entryServiceName = (String)searchHit.getSource().get(ServiceEntryTable.COLUMN_ENTRY_SERVICE_NAME); + + JsonObject row = new JsonObject(); + row.addProperty(ColumnNameUtils.INSTANCE.rename(ServiceEntryTable.COLUMN_ENTRY_SERVICE_ID), entryServiceId); + row.addProperty(ColumnNameUtils.INSTANCE.rename(ServiceEntryTable.COLUMN_ENTRY_SERVICE_NAME), entryServiceName); + row.addProperty(ColumnNameUtils.INSTANCE.rename(ServiceEntryTable.COLUMN_APPLICATION_ID), applicationId); + row.addProperty("applicationCode", applicationCode); + serviceArray.add(row); + } + + JsonObject response = new JsonObject(); + response.addProperty("total", searchHits.totalHits); + response.add("array", serviceArray); + + return response; } } diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceEntryH2DAO.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceEntryH2DAO.java index 6fbdd7826..da811365d 100644 --- a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceEntryH2DAO.java +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceEntryH2DAO.java @@ -1,14 +1,14 @@ package org.skywalking.apm.collector.ui.dao; -import com.google.gson.JsonArray; +import com.google.gson.JsonObject; import org.skywalking.apm.collector.storage.h2.dao.H2DAO; /** * @author pengys5 */ public class ServiceEntryH2DAO extends H2DAO implements IServiceEntryDAO { - - @Override public JsonArray load(int applicationId, long startTime, long endTime) { + @Override public JsonObject load(int applicationId, String entryServiceName, long startTime, long endTime, int from, + int size) { return null; } } diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceNameEsDAO.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceNameEsDAO.java index 07a4ca387..f8a177e9d 100644 --- a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceNameEsDAO.java +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceNameEsDAO.java @@ -2,10 +2,15 @@ package org.skywalking.apm.collector.ui.dao; import org.elasticsearch.action.get.GetRequestBuilder; import org.elasticsearch.action.get.GetResponse; -import org.skywalking.apm.collector.client.elasticsearch.ElasticSearchClient; +import org.elasticsearch.action.search.SearchRequestBuilder; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.search.SearchType; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.SearchHit; import org.skywalking.apm.collector.core.util.Const; -import org.skywalking.apm.collector.storage.elasticsearch.dao.EsDAO; import org.skywalking.apm.collector.storage.define.register.ServiceNameTable; +import org.skywalking.apm.collector.storage.elasticsearch.dao.EsDAO; /** * @author pengys5 @@ -13,8 +18,7 @@ import org.skywalking.apm.collector.storage.define.register.ServiceNameTable; public class ServiceNameEsDAO extends EsDAO implements IServiceNameDAO { @Override public String getServiceName(int serviceId) { - ElasticSearchClient client = getClient(); - GetRequestBuilder getRequestBuilder = client.prepareGet(ServiceNameTable.TABLE, String.valueOf(serviceId)); + GetRequestBuilder getRequestBuilder = getClient().prepareGet(ServiceNameTable.TABLE, String.valueOf(serviceId)); GetResponse getResponse = getRequestBuilder.get(); if (getResponse.isExists()) { @@ -22,4 +26,24 @@ public class ServiceNameEsDAO extends EsDAO implements IServiceNameDAO { } return Const.UNKNOWN; } + + @Override public int getServiceId(int applicationId, String serviceName) { + SearchRequestBuilder searchRequestBuilder = getClient().prepareSearch(ServiceNameTable.TABLE); + searchRequestBuilder.setTypes(ServiceNameTable.TABLE_TYPE); + searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH); + + BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); + boolQuery.must().add(QueryBuilders.matchQuery(ServiceNameTable.COLUMN_APPLICATION_ID, applicationId)); + boolQuery.must().add(QueryBuilders.matchQuery(ServiceNameTable.COLUMN_SERVICE_NAME, serviceName)); + searchRequestBuilder.setQuery(boolQuery); + searchRequestBuilder.setSize(1); + + SearchResponse searchResponse = searchRequestBuilder.get(); + if (searchResponse.getHits().totalHits > 0) { + SearchHit searchHit = searchResponse.getHits().iterator().next(); + int serviceId = (int)searchHit.getSource().get(ServiceNameTable.COLUMN_SERVICE_ID); + return serviceId; + } + return 0; + } } diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceNameH2DAO.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceNameH2DAO.java index e96f8adf5..f0f585651 100644 --- a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceNameH2DAO.java +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceNameH2DAO.java @@ -10,4 +10,8 @@ public class ServiceNameH2DAO extends H2DAO implements IServiceNameDAO { @Override public String getServiceName(int serviceId) { return null; } + + @Override public int getServiceId(int applicationId, String serviceName) { + return 0; + } } diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceReferenceEsDAO.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceReferenceEsDAO.java index 782c3955d..695195437 100644 --- a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceReferenceEsDAO.java +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceReferenceEsDAO.java @@ -1,7 +1,22 @@ 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.BoolQueryBuilder; +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.metrics.sum.Sum; +import org.skywalking.apm.collector.core.util.ColumnNameUtils; +import org.skywalking.apm.collector.core.util.Const; +import org.skywalking.apm.collector.core.util.StringUtils; +import org.skywalking.apm.collector.storage.define.serviceref.ServiceReferenceTable; import org.skywalking.apm.collector.storage.elasticsearch.dao.EsDAO; +import org.skywalking.apm.collector.ui.cache.ServiceIdCache; +import org.skywalking.apm.collector.ui.cache.ServiceNameCache; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -13,6 +28,127 @@ public class ServiceReferenceEsDAO extends EsDAO implements IServiceReferenceDAO private final Logger logger = LoggerFactory.getLogger(ServiceReferenceEsDAO.class); @Override public JsonArray load(int entryServiceId, long startTime, long endTime) { - return null; + 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)); + searchRequestBuilder.setQuery(boolQuery); + searchRequestBuilder.setSize(0); + + 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_SUMMARY).field(ServiceReferenceTable.COLUMN_SUMMARY))) + .subAggregation(AggregationBuilders.terms(ServiceReferenceTable.COLUMN_BEHIND_SERVICE_NAME).field(ServiceReferenceTable.COLUMN_BEHIND_SERVICE_NAME).size(100) + .subAggregation(AggregationBuilders.sum(ServiceReferenceTable.COLUMN_S1_LTE).field(ServiceReferenceTable.COLUMN_S1_LTE)) + .subAggregation(AggregationBuilders.sum(ServiceReferenceTable.COLUMN_S3_LTE).field(ServiceReferenceTable.COLUMN_S3_LTE)) + .subAggregation(AggregationBuilders.sum(ServiceReferenceTable.COLUMN_S5_LTE).field(ServiceReferenceTable.COLUMN_S5_LTE)) + .subAggregation(AggregationBuilders.sum(ServiceReferenceTable.COLUMN_S5_GT).field(ServiceReferenceTable.COLUMN_S5_GT)) + .subAggregation(AggregationBuilders.sum(ServiceReferenceTable.COLUMN_ERROR).field(ServiceReferenceTable.COLUMN_ERROR)) + .subAggregation(AggregationBuilders.sum(ServiceReferenceTable.COLUMN_SUMMARY).field(ServiceReferenceTable.COLUMN_SUMMARY)) + .subAggregation(AggregationBuilders.sum(ServiceReferenceTable.COLUMN_COST_SUMMARY).field(ServiceReferenceTable.COLUMN_COST_SUMMARY)))); + + searchRequestBuilder.addAggregation(AggregationBuilders.terms(ServiceReferenceTable.COLUMN_FRONT_SERVICE_NAME).field(ServiceReferenceTable.COLUMN_FRONT_SERVICE_NAME).size(100) + .subAggregation(AggregationBuilders.terms(ServiceReferenceTable.COLUMN_BEHIND_SERVICE_ID).field(ServiceReferenceTable.COLUMN_BEHIND_SERVICE_ID).size(100) + .subAggregation(AggregationBuilders.sum(ServiceReferenceTable.COLUMN_SUMMARY).field(ServiceReferenceTable.COLUMN_SUMMARY))) + .subAggregation(AggregationBuilders.terms(ServiceReferenceTable.COLUMN_BEHIND_SERVICE_NAME).field(ServiceReferenceTable.COLUMN_BEHIND_SERVICE_NAME).size(100) + .subAggregation(AggregationBuilders.sum(ServiceReferenceTable.COLUMN_S1_LTE).field(ServiceReferenceTable.COLUMN_S1_LTE)) + .subAggregation(AggregationBuilders.sum(ServiceReferenceTable.COLUMN_S3_LTE).field(ServiceReferenceTable.COLUMN_S3_LTE)) + .subAggregation(AggregationBuilders.sum(ServiceReferenceTable.COLUMN_S5_LTE).field(ServiceReferenceTable.COLUMN_S5_LTE)) + .subAggregation(AggregationBuilders.sum(ServiceReferenceTable.COLUMN_S5_GT).field(ServiceReferenceTable.COLUMN_S5_GT)) + .subAggregation(AggregationBuilders.sum(ServiceReferenceTable.COLUMN_ERROR).field(ServiceReferenceTable.COLUMN_ERROR)) + .subAggregation(AggregationBuilders.sum(ServiceReferenceTable.COLUMN_SUMMARY).field(ServiceReferenceTable.COLUMN_SUMMARY)) + .subAggregation(AggregationBuilders.sum(ServiceReferenceTable.COLUMN_COST_SUMMARY).field(ServiceReferenceTable.COLUMN_COST_SUMMARY)))); + + JsonArray serviceReferenceArray = new JsonArray(); + SearchResponse searchResponse = searchRequestBuilder.get(); + Terms frontServiceIdTerms = searchResponse.getAggregations().get(ServiceReferenceTable.COLUMN_FRONT_SERVICE_ID); + for (Terms.Bucket frontServiceBucket : frontServiceIdTerms.getBuckets()) { + int frontServiceId = frontServiceBucket.getKeyAsNumber().intValue(); + if (frontServiceId != 0) { + parseSubAggregate(serviceReferenceArray, frontServiceBucket, frontServiceId); + } + } + + Terms frontServiceNameTerms = searchResponse.getAggregations().get(ServiceReferenceTable.COLUMN_FRONT_SERVICE_NAME); + for (Terms.Bucket frontServiceBucket : frontServiceNameTerms.getBuckets()) { + String frontServiceName = frontServiceBucket.getKeyAsString(); + if (StringUtils.isNotEmpty(frontServiceName)) { + String[] serviceNames = frontServiceName.split(Const.ID_SPLIT); + int frontServiceId = ServiceIdCache.getForUI(Integer.parseInt(serviceNames[0]), serviceNames[1]); + parseSubAggregate(serviceReferenceArray, frontServiceBucket, frontServiceId); + } + } + return serviceReferenceArray; + } + + private void parseSubAggregate(JsonArray serviceReferenceArray, Terms.Bucket frontServiceBucket, + int frontServiceId) { + Terms behindServiceIdTerms = frontServiceBucket.getAggregations().get(ServiceReferenceTable.COLUMN_BEHIND_SERVICE_ID); + for (Terms.Bucket behindServiceIdBucket : behindServiceIdTerms.getBuckets()) { + int behindServiceId = behindServiceIdBucket.getKeyAsNumber().intValue(); + if (behindServiceId != 0) { + Sum s1LteSum = behindServiceIdBucket.getAggregations().get(ServiceReferenceTable.COLUMN_S1_LTE); + Sum s3LteSum = behindServiceIdBucket.getAggregations().get(ServiceReferenceTable.COLUMN_S3_LTE); + Sum s5LteSum = behindServiceIdBucket.getAggregations().get(ServiceReferenceTable.COLUMN_S5_LTE); + Sum s5GtSum = behindServiceIdBucket.getAggregations().get(ServiceReferenceTable.COLUMN_S5_GT); + Sum error = behindServiceIdBucket.getAggregations().get(ServiceReferenceTable.COLUMN_ERROR); + Sum summary = behindServiceIdBucket.getAggregations().get(ServiceReferenceTable.COLUMN_SUMMARY); + Sum costSum = behindServiceIdBucket.getAggregations().get(ServiceReferenceTable.COLUMN_COST_SUMMARY); + + String frontServiceName = ServiceNameCache.getForUI(frontServiceId); + String behindServiceName = ServiceNameCache.getForUI(behindServiceId); + + JsonObject serviceReference = new JsonObject(); + serviceReference.addProperty(ColumnNameUtils.INSTANCE.rename(ServiceReferenceTable.COLUMN_FRONT_SERVICE_ID), frontServiceId); + serviceReference.addProperty(ColumnNameUtils.INSTANCE.rename(ServiceReferenceTable.COLUMN_FRONT_SERVICE_NAME), frontServiceName); + serviceReference.addProperty(ColumnNameUtils.INSTANCE.rename(ServiceReferenceTable.COLUMN_BEHIND_SERVICE_ID), behindServiceId); + serviceReference.addProperty(ColumnNameUtils.INSTANCE.rename(ServiceReferenceTable.COLUMN_BEHIND_SERVICE_NAME), behindServiceName); + serviceReference.addProperty(ColumnNameUtils.INSTANCE.rename(ServiceReferenceTable.COLUMN_S1_LTE), (long)s1LteSum.getValue()); + serviceReference.addProperty(ColumnNameUtils.INSTANCE.rename(ServiceReferenceTable.COLUMN_S3_LTE), (long)s3LteSum.getValue()); + serviceReference.addProperty(ColumnNameUtils.INSTANCE.rename(ServiceReferenceTable.COLUMN_S5_LTE), (long)s5LteSum.getValue()); + serviceReference.addProperty(ColumnNameUtils.INSTANCE.rename(ServiceReferenceTable.COLUMN_S5_GT), (long)s5GtSum.getValue()); + serviceReference.addProperty(ColumnNameUtils.INSTANCE.rename(ServiceReferenceTable.COLUMN_ERROR), (long)error.getValue()); + serviceReference.addProperty(ColumnNameUtils.INSTANCE.rename(ServiceReferenceTable.COLUMN_SUMMARY), (long)summary.getValue()); + serviceReference.addProperty(ColumnNameUtils.INSTANCE.rename(ServiceReferenceTable.COLUMN_COST_SUMMARY), (long)costSum.getValue()); + serviceReferenceArray.add(serviceReference); + } + } + + Terms behindServiceNameTerms = frontServiceBucket.getAggregations().get(ServiceReferenceTable.COLUMN_BEHIND_SERVICE_NAME); + for (Terms.Bucket behindServiceNameBucket : behindServiceNameTerms.getBuckets()) { + String behindServiceName = behindServiceNameBucket.getKeyAsString(); + if (StringUtils.isNotEmpty(behindServiceName)) { + Sum s1LteSum = behindServiceNameBucket.getAggregations().get(ServiceReferenceTable.COLUMN_S1_LTE); + Sum s3LteSum = behindServiceNameBucket.getAggregations().get(ServiceReferenceTable.COLUMN_S3_LTE); + Sum s5LteSum = behindServiceNameBucket.getAggregations().get(ServiceReferenceTable.COLUMN_S5_LTE); + Sum s5GtSum = behindServiceNameBucket.getAggregations().get(ServiceReferenceTable.COLUMN_S5_GT); + Sum error = behindServiceNameBucket.getAggregations().get(ServiceReferenceTable.COLUMN_ERROR); + Sum summary = behindServiceNameBucket.getAggregations().get(ServiceReferenceTable.COLUMN_SUMMARY); + Sum costSum = behindServiceNameBucket.getAggregations().get(ServiceReferenceTable.COLUMN_COST_SUMMARY); + + String frontServiceName = ServiceNameCache.getForUI(frontServiceId); + String[] serviceNames = behindServiceName.split(Const.ID_SPLIT); + int behindServiceId = ServiceIdCache.getForUI(Integer.parseInt(serviceNames[0]), serviceNames[1]); + behindServiceName = serviceNames[1]; + + JsonObject serviceReference = new JsonObject(); + serviceReference.addProperty(ColumnNameUtils.INSTANCE.rename(ServiceReferenceTable.COLUMN_FRONT_SERVICE_ID), frontServiceId); + serviceReference.addProperty(ColumnNameUtils.INSTANCE.rename(ServiceReferenceTable.COLUMN_FRONT_SERVICE_NAME), frontServiceName); + serviceReference.addProperty(ColumnNameUtils.INSTANCE.rename(ServiceReferenceTable.COLUMN_BEHIND_SERVICE_ID), behindServiceId); + serviceReference.addProperty(ColumnNameUtils.INSTANCE.rename(ServiceReferenceTable.COLUMN_BEHIND_SERVICE_NAME), behindServiceName); + serviceReference.addProperty(ColumnNameUtils.INSTANCE.rename(ServiceReferenceTable.COLUMN_S1_LTE), (long)s1LteSum.getValue()); + serviceReference.addProperty(ColumnNameUtils.INSTANCE.rename(ServiceReferenceTable.COLUMN_S3_LTE), (long)s3LteSum.getValue()); + serviceReference.addProperty(ColumnNameUtils.INSTANCE.rename(ServiceReferenceTable.COLUMN_S5_LTE), (long)s5LteSum.getValue()); + serviceReference.addProperty(ColumnNameUtils.INSTANCE.rename(ServiceReferenceTable.COLUMN_S5_GT), (long)s5GtSum.getValue()); + serviceReference.addProperty(ColumnNameUtils.INSTANCE.rename(ServiceReferenceTable.COLUMN_ERROR), (long)error.getValue()); + serviceReference.addProperty(ColumnNameUtils.INSTANCE.rename(ServiceReferenceTable.COLUMN_SUMMARY), (long)summary.getValue()); + serviceReference.addProperty(ColumnNameUtils.INSTANCE.rename(ServiceReferenceTable.COLUMN_COST_SUMMARY), (long)costSum.getValue()); + serviceReferenceArray.add(serviceReference); + } + } } } 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 cfad93a70..b78deae2e 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 @@ -15,10 +15,12 @@ import org.skywalking.apm.collector.ui.jetty.handler.SpanGetHandler; import org.skywalking.apm.collector.ui.jetty.handler.TraceDagGetHandler; import org.skywalking.apm.collector.ui.jetty.handler.TraceStackGetHandler; import org.skywalking.apm.collector.ui.jetty.handler.UIJettyServerHandler; -import org.skywalking.apm.collector.ui.jetty.handler.instancehealth.ApplicationsGetHandler; +import org.skywalking.apm.collector.ui.jetty.handler.application.ApplicationsGetHandler; import org.skywalking.apm.collector.ui.jetty.handler.instancehealth.InstanceHealthGetHandler; +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.time.AllInstanceLastTimeGetHandler; -import org.skywalking.apm.collector.ui.jetty.handler.time.InstanceLastTimeGetHandler; +import org.skywalking.apm.collector.ui.jetty.handler.time.OneInstanceLastTimeGetHandler; /** * @author pengys5 @@ -58,10 +60,12 @@ public class UIJettyModuleDefine extends UIModuleDefine { handlers.add(new SegmentTopGetHandler()); handlers.add(new TraceStackGetHandler()); handlers.add(new SpanGetHandler()); - handlers.add(new InstanceLastTimeGetHandler()); + handlers.add(new OneInstanceLastTimeGetHandler()); handlers.add(new AllInstanceLastTimeGetHandler()); - handlers.add(new ApplicationsGetHandler()); handlers.add(new InstanceHealthGetHandler()); + handlers.add(new ApplicationsGetHandler()); + handlers.add(new EntryServiceGetHandler()); + handlers.add(new ServiceTreeGetHandler()); return handlers; } } diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/application/ApplicationsGetHandler.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/application/ApplicationsGetHandler.java new file mode 100644 index 000000000..d9160c4af --- /dev/null +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/application/ApplicationsGetHandler.java @@ -0,0 +1,53 @@ +package org.skywalking.apm.collector.ui.jetty.handler.application; + +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.ApplicationService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author pengys5 + */ +public class ApplicationsGetHandler extends JettyHandler { + + private final Logger logger = LoggerFactory.getLogger(ApplicationsGetHandler.class); + + @Override public String pathSpec() { + return "/applications"; + } + + private ApplicationService service = new ApplicationService(); + + @Override protected JsonElement doGet(HttpServletRequest req) throws ArgumentsParseException { + if (!req.getParameterMap().containsKey("startTime") || !req.getParameterMap().containsKey("endTime")) { + throw new ArgumentsParseException("must contains startTime. endTime parameter"); + } + + String startTimeStr = req.getParameter("startTime"); + String endTimeStr = req.getParameter("endTime"); + logger.debug("applications get start time: {}, end time: {}", startTimeStr, endTimeStr); + + 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.getApplications(startTime, endTime); + } + + @Override protected JsonElement doPost(HttpServletRequest req) throws ArgumentsParseException { + throw new UnsupportedOperationException(); + } +} diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/instancehealth/ApplicationsGetHandler.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/instancehealth/ApplicationsGetHandler.java deleted file mode 100644 index ba50ccccf..000000000 --- a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/instancehealth/ApplicationsGetHandler.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.skywalking.apm.collector.ui.jetty.handler.instancehealth; - -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.InstanceHealthService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @author pengys5 - */ -public class ApplicationsGetHandler extends JettyHandler { - - private final Logger logger = LoggerFactory.getLogger(ApplicationsGetHandler.class); - - @Override public String pathSpec() { - return "/instance/health/applications"; - } - - private InstanceHealthService service = new InstanceHealthService(); - - @Override protected JsonElement doGet(HttpServletRequest req) throws ArgumentsParseException { - String timestampStr = req.getParameter("timestamp"); - logger.debug("instance health applications get time: {}", timestampStr); - - long timestamp; - try { - timestamp = Long.parseLong(timestampStr); - } catch (NumberFormatException e) { - throw new ArgumentsParseException("time must be long"); - } - - return service.getApplications(timestamp); - } - - @Override protected JsonElement doPost(HttpServletRequest req) throws ArgumentsParseException { - throw new UnsupportedOperationException(); - } -} diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/servicetree/EntryServiceGetHandler.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/servicetree/EntryServiceGetHandler.java index 079f8a1f7..92bb80ad9 100644 --- a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/servicetree/EntryServiceGetHandler.java +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/servicetree/EntryServiceGetHandler.java @@ -22,7 +22,56 @@ public class EntryServiceGetHandler extends JettyHandler { private ServiceTreeService service = new ServiceTreeService(); @Override protected JsonElement doGet(HttpServletRequest req) throws ArgumentsParseException { - return null; + if (!req.getParameterMap().containsKey("applicationId") || !req.getParameterMap().containsKey("entryServiceName") + || !req.getParameterMap().containsKey("startTime") || !req.getParameterMap().containsKey("endTime") + || !req.getParameterMap().containsKey("from") || !req.getParameterMap().containsKey("size")) { + throw new ArgumentsParseException("must contains parameters: applicationId, entryServiceName, startTime, endTime, from, size"); + } + + String applicationIdStr = req.getParameter("applicationId"); + String entryServiceName = req.getParameter("entryServiceName"); + String startTimeStr = req.getParameter("startTime"); + String endTimeStr = req.getParameter("endTime"); + String fromStr = req.getParameter("from"); + String sizeStr = req.getParameter("size"); + logger.debug("service entry get applicationId: {}, entryServiceName: {}, startTime: {}, endTime: {}, from: {}, size: {}", applicationIdStr, entryServiceName, startTimeStr, endTimeStr, fromStr, sizeStr); + + int applicationId; + try { + applicationId = Integer.parseInt(applicationIdStr); + } catch (NumberFormatException e) { + throw new ArgumentsParseException("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"); + } + + int from; + try { + from = Integer.parseInt(fromStr); + } catch (NumberFormatException e) { + throw new ArgumentsParseException("from must be integer"); + } + + int size; + try { + size = Integer.parseInt(sizeStr); + } catch (NumberFormatException e) { + throw new ArgumentsParseException("size must be integer"); + } + + return service.loadEntryService(applicationId, entryServiceName, startTime, endTime, from, size); } @Override protected JsonElement doPost(HttpServletRequest req) throws ArgumentsParseException { diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/servicetree/ServiceTreeGetHandler.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/servicetree/ServiceTreeGetHandler.java index 551f15e71..1461b496c 100644 --- a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/servicetree/ServiceTreeGetHandler.java +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/servicetree/ServiceTreeGetHandler.java @@ -22,7 +22,37 @@ public class ServiceTreeGetHandler extends JettyHandler { private ServiceTreeService service = new ServiceTreeService(); @Override protected JsonElement doGet(HttpServletRequest req) throws ArgumentsParseException { - return null; + if (!req.getParameterMap().containsKey("entryServiceId") || !req.getParameterMap().containsKey("startTime") || !req.getParameterMap().containsKey("endTime")) { + throw new ArgumentsParseException("must contains parameters: entryServiceId, startTime, endTime"); + } + + String entryServiceIdStr = req.getParameter("entryServiceId"); + String startTimeStr = req.getParameter("startTime"); + String endTimeStr = req.getParameter("endTime"); + logger.debug("service entry get entryServiceId: {}, startTime: {}, endTime: {}", entryServiceIdStr, startTimeStr, endTimeStr); + + int entryServiceId; + try { + entryServiceId = Integer.parseInt(entryServiceIdStr); + } catch (NumberFormatException e) { + throw new ArgumentsParseException("entry service 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(entryServiceId, startTime, endTime); } @Override protected JsonElement doPost(HttpServletRequest req) throws ArgumentsParseException { diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/time/AllInstanceLastTimeGetHandler.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/time/AllInstanceLastTimeGetHandler.java index 96b56b81c..ed4f43046 100644 --- a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/time/AllInstanceLastTimeGetHandler.java +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/time/AllInstanceLastTimeGetHandler.java @@ -4,6 +4,7 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import java.util.Calendar; import javax.servlet.http.HttpServletRequest; +import org.skywalking.apm.collector.core.util.TimeBucketUtils; import org.skywalking.apm.collector.server.jetty.ArgumentsParseException; import org.skywalking.apm.collector.server.jetty.JettyHandler; import org.skywalking.apm.collector.ui.service.TimeSynchronousService; @@ -24,17 +25,15 @@ public class AllInstanceLastTimeGetHandler extends JettyHandler { private TimeSynchronousService service = new TimeSynchronousService(); @Override protected JsonElement doGet(HttpServletRequest req) throws ArgumentsParseException { - Long time = service.allInstanceLastTime(); - logger.debug("all instance last time: {}", time); - Calendar calendar = Calendar.getInstance(); - calendar.setTimeInMillis(time); + Long timeBucket = service.allInstanceLastTime(); + logger.debug("all instance last time: {}", timeBucket); - int second = calendar.get(Calendar.SECOND); - second = (second % 5) * 5; - calendar.set(Calendar.SECOND, second); + Calendar calendar = Calendar.getInstance(); + calendar.setTimeInMillis(TimeBucketUtils.INSTANCE.changeTimeBucket2TimeStamp(TimeBucketUtils.TimeBucketType.SECOND.name(), timeBucket)); + calendar.add(Calendar.SECOND, -5); JsonObject timeJson = new JsonObject(); - timeJson.addProperty("time", calendar.getTimeInMillis()); + timeJson.addProperty("timeBucket", TimeBucketUtils.INSTANCE.getSecondTimeBucket(calendar.getTimeInMillis())); return timeJson; } diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/time/InstanceLastTimeGetHandler.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/time/OneInstanceLastTimeGetHandler.java similarity index 86% rename from apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/time/InstanceLastTimeGetHandler.java rename to apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/time/OneInstanceLastTimeGetHandler.java index 8e6dcc3db..3e29f4c08 100644 --- a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/time/InstanceLastTimeGetHandler.java +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/time/OneInstanceLastTimeGetHandler.java @@ -12,12 +12,12 @@ import org.slf4j.LoggerFactory; /** * @author pengys5 */ -public class InstanceLastTimeGetHandler extends JettyHandler { +public class OneInstanceLastTimeGetHandler extends JettyHandler { - private final Logger logger = LoggerFactory.getLogger(InstanceLastTimeGetHandler.class); + private final Logger logger = LoggerFactory.getLogger(OneInstanceLastTimeGetHandler.class); @Override public String pathSpec() { - return "/time/instanceId"; + return "/time/oneInstance"; } private TimeSynchronousService service = new TimeSynchronousService(); @@ -36,7 +36,7 @@ public class InstanceLastTimeGetHandler extends JettyHandler { Long time = service.instanceLastTime(applicationInstanceId); logger.debug("application instance id: {}, instance last time: {}", applicationInstanceId, time); JsonObject timeJson = new JsonObject(); - timeJson.addProperty("time", time); + timeJson.addProperty("timeBucket", time); return timeJson; } diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/service/ApplicationService.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/service/ApplicationService.java new file mode 100644 index 000000000..3ca96e4fe --- /dev/null +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/service/ApplicationService.java @@ -0,0 +1,16 @@ +package org.skywalking.apm.collector.ui.service; + +import com.google.gson.JsonArray; +import org.skywalking.apm.collector.storage.dao.DAOContainer; +import org.skywalking.apm.collector.ui.dao.IInstanceDAO; + +/** + * @author pengys5 + */ +public class ApplicationService { + + public JsonArray getApplications(long startTime, long endTime) { + IInstanceDAO instanceDAO = (IInstanceDAO)DAOContainer.INSTANCE.get(IInstanceDAO.class.getName()); + return instanceDAO.getApplications(startTime, endTime); + } +} diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/service/InstanceHealthService.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/service/InstanceHealthService.java index 73321386a..2b380df53 100644 --- a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/service/InstanceHealthService.java +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/service/InstanceHealthService.java @@ -8,7 +8,6 @@ import org.skywalking.apm.collector.storage.dao.DAOContainer; import org.skywalking.apm.collector.ui.cache.ApplicationCache; import org.skywalking.apm.collector.ui.dao.IGCMetricDAO; import org.skywalking.apm.collector.ui.dao.IInstPerformanceDAO; -import org.skywalking.apm.collector.ui.dao.IInstanceDAO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -19,28 +18,6 @@ public class InstanceHealthService { private final Logger logger = LoggerFactory.getLogger(InstanceHealthService.class); - public JsonObject getApplications(long timeBucket) { - IInstanceDAO instanceDAO = (IInstanceDAO)DAOContainer.INSTANCE.get(IInstanceDAO.class.getName()); - List applications = instanceDAO.getApplications(timeBucket); - - JsonObject response = new JsonObject(); - JsonArray applicationArray = new JsonArray(); - - response.addProperty("timeBucket", timeBucket); - response.add("applicationList", applicationArray); - - applications.forEach(application -> { - JsonObject applicationJson = new JsonObject(); - String applicationCode = ApplicationCache.get(application.getApplicationId()); - applicationJson.addProperty("applicationId", application.getApplicationId()); - applicationJson.addProperty("applicationCode", applicationCode); - applicationJson.addProperty("instanceCount", application.getCount()); - applicationArray.add(applicationJson); - }); - - return response; - } - public JsonObject getInstances(long timestamp, int applicationId) { JsonObject response = new JsonObject(); diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/service/ServiceTreeService.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/service/ServiceTreeService.java index 86a0a3dfe..0d133fc0d 100644 --- a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/service/ServiceTreeService.java +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/service/ServiceTreeService.java @@ -1,17 +1,24 @@ 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.IServiceEntryDAO; +import org.skywalking.apm.collector.ui.dao.IServiceReferenceDAO; /** * @author pengys5 */ public class ServiceTreeService { - public JsonArray loadEntryService(int applicationId, long startTime, long endTime) { - return null; + public JsonObject loadEntryService(int applicationId, String entryServiceName, long startTime, long endTime, + int from, int size) { + IServiceEntryDAO serviceEntryDAO = (IServiceEntryDAO)DAOContainer.INSTANCE.get(IServiceEntryDAO.class.getName()); + return serviceEntryDAO.load(applicationId, entryServiceName, startTime, endTime, from, size); } public JsonArray loadServiceTree(int entryServiceId, long startTime, long endTime) { - return null; + IServiceReferenceDAO serviceReferenceDAO = (IServiceReferenceDAO)DAOContainer.INSTANCE.get(IServiceReferenceDAO.class.getName()); + return serviceReferenceDAO.load(entryServiceId, startTime, endTime); } } \ No newline at end of file