提交 d3db2d7f 编写于 作者: P pengys5

Service reference finish and test success.

#373
上级 167dc818
......@@ -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());
......
......@@ -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<ApplicationInstanceMapping> 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<Downstream> responseObserver) {
instanceIDService.heartBeat(request.getApplicationInstanceId(), request.getHeartbeatTime());
responseObserver.onNext(Downstream.newBuilder().build());
responseObserver.onCompleted();
}
@Override
public void registerRecover(ApplicationInstanceRecover request, StreamObserver<Downstream> 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();
}
......
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());
......
......@@ -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<String, Integer> CACHE = CacheBuilder.newBuilder().maximumSize(2000).build();
private static Cache<Integer, String> 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;
}
}
}
......@@ -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();
......
......@@ -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();
......
......@@ -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) {
}
......
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());
......
......@@ -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);
}
......
......@@ -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()));
}
}
......@@ -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()));
}
}
......@@ -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;
}
}
}
......@@ -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);
}
......
......@@ -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()));
}
}
......@@ -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()));
}
}
......@@ -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);
......
......@@ -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,
......
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();
}
}
......@@ -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
}
}
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);
}
}
......@@ -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);
}
}
......@@ -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;
}
}
}
......@@ -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";
}
......@@ -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;
}
......
......@@ -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";
}
......@@ -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
}
}
......@@ -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
......
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<String, Integer> 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;
}
}
......@@ -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;
}
}
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<Application> getApplications(long time);
JsonArray getApplications(long startTime, long endTime);
InstanceDataDefine.Instance getInstance(int instanceId);
......
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);
}
......@@ -5,4 +5,6 @@ package org.skywalking.apm.collector.ui.dao;
*/
public interface IServiceNameDAO {
String getServiceName(int serviceId);
int getServiceId(int applicationId, String serviceName);
}
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<Application> 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<Application> 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;
}
......
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<Application> getApplications(long time) {
@Override public JsonArray getApplications(long startTime, long endTime) {
return null;
}
......
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;
}
}
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;
}
}
......@@ -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;
}
}
......@@ -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;
}
}
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);
}
}
}
}
......@@ -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;
}
}
package org.skywalking.apm.collector.ui.jetty.handler.instancehealth;
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.InstanceHealthService;
import org.skywalking.apm.collector.ui.service.ApplicationService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -16,23 +16,35 @@ public class ApplicationsGetHandler extends JettyHandler {
private final Logger logger = LoggerFactory.getLogger(ApplicationsGetHandler.class);
@Override public String pathSpec() {
return "/instance/health/applications";
return "/applications";
}
private InstanceHealthService service = new InstanceHealthService();
private ApplicationService service = new ApplicationService();
@Override protected JsonElement doGet(HttpServletRequest req) throws ArgumentsParseException {
String timestampStr = req.getParameter("timestamp");
logger.debug("instance health applications get time: {}", timestampStr);
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 timestamp;
long endTime;
try {
timestamp = Long.parseLong(timestampStr);
endTime = Long.parseLong(endTimeStr);
} catch (NumberFormatException e) {
throw new ArgumentsParseException("time must be long");
throw new ArgumentsParseException("end time must be long");
}
return service.getApplications(timestamp);
return service.getApplications(startTime, endTime);
}
@Override protected JsonElement doPost(HttpServletRequest req) throws ArgumentsParseException {
......
......@@ -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 {
......
......@@ -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 {
......
......@@ -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;
}
......
......@@ -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;
}
......
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);
}
}
......@@ -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<IInstanceDAO.Application> 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();
......
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
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册