未验证 提交 e7a6a246 编写于 作者: wu-sheng's avatar wu-sheng 提交者: GitHub

Merge pull request #863 from peng-yongsheng/feature/appCodeInServer

Feature/app code in server
......@@ -51,6 +51,11 @@
<artifactId>collector-storage-define</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>collector-cache-define</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>analysis-worker-model</artifactId>
......
......@@ -49,6 +49,8 @@ public abstract class AlarmAssertWorker<INPUT extends StreamData & Metric, OUTPU
protected abstract OUTPUT newAlarmObject(String id, INPUT inputMetric);
protected abstract void generateAlarmContent(OUTPUT alarm, double threshold);
protected abstract Double calleeErrorRateThreshold();
protected abstract Double callerErrorRateThreshold();
......@@ -64,7 +66,7 @@ public abstract class AlarmAssertWorker<INPUT extends StreamData & Metric, OUTPU
alarm.setAlarmType(AlarmType.ERROR_RATE.getValue());
alarm.setLastTimeBucket(inputMetric.getTimeBucket());
alarm.setSourceValue(MetricSource.Callee.getValue());
alarm.setAlarmContent("");
generateAlarmContent(alarm, calleeErrorRateThreshold());
onNext(alarm);
}
......@@ -75,7 +77,7 @@ public abstract class AlarmAssertWorker<INPUT extends StreamData & Metric, OUTPU
alarm.setAlarmType(AlarmType.ERROR_RATE.getValue());
alarm.setLastTimeBucket(inputMetric.getTimeBucket());
alarm.setSourceValue(MetricSource.Caller.getValue());
alarm.setAlarmContent("");
generateAlarmContent(alarm, callerErrorRateThreshold());
onNext(alarm);
}
......@@ -100,7 +102,7 @@ public abstract class AlarmAssertWorker<INPUT extends StreamData & Metric, OUTPU
alarm.setAlarmType(AlarmType.SLOW_RTT.getValue());
alarm.setLastTimeBucket(inputMetric.getTimeBucket());
alarm.setSourceValue(MetricSource.Callee.getValue());
alarm.setAlarmContent("");
generateAlarmContent(alarm, calleeAverageResponseTimeThreshold());
onNext(alarm);
}
......@@ -111,7 +113,7 @@ public abstract class AlarmAssertWorker<INPUT extends StreamData & Metric, OUTPU
alarm.setAlarmType(AlarmType.SLOW_RTT.getValue());
alarm.setLastTimeBucket(inputMetric.getTimeBucket());
alarm.setSourceValue(MetricSource.Caller.getValue());
alarm.setAlarmContent("");
generateAlarmContent(alarm, callerAverageResponseTimeThreshold());
onNext(alarm);
}
......
......@@ -21,12 +21,17 @@ package org.apache.skywalking.apm.collector.analysis.alarm.provider.worker.appli
import org.apache.skywalking.apm.collector.analysis.alarm.define.graph.AlarmWorkerIdDefine;
import org.apache.skywalking.apm.collector.analysis.alarm.provider.worker.AlarmAssertWorker;
import org.apache.skywalking.apm.collector.analysis.alarm.provider.worker.AlarmAssertWorkerProvider;
import org.apache.skywalking.apm.collector.cache.CacheModule;
import org.apache.skywalking.apm.collector.cache.service.ApplicationCacheService;
import org.apache.skywalking.apm.collector.configuration.ConfigurationModule;
import org.apache.skywalking.apm.collector.configuration.service.IApplicationAlarmRuleConfig;
import org.apache.skywalking.apm.collector.core.module.ModuleManager;
import org.apache.skywalking.apm.collector.core.util.Const;
import org.apache.skywalking.apm.collector.storage.table.MetricSource;
import org.apache.skywalking.apm.collector.storage.table.alarm.AlarmType;
import org.apache.skywalking.apm.collector.storage.table.alarm.ApplicationAlarm;
import org.apache.skywalking.apm.collector.storage.table.application.ApplicationMetric;
import org.apache.skywalking.apm.collector.storage.table.register.Application;
/**
* @author peng-yongsheng
......@@ -34,10 +39,12 @@ import org.apache.skywalking.apm.collector.storage.table.application.Application
public class ApplicationMetricAlarmAssertWorker extends AlarmAssertWorker<ApplicationMetric, ApplicationAlarm> {
private final IApplicationAlarmRuleConfig applicationAlarmRuleConfig;
private final ApplicationCacheService applicationCacheService;
public ApplicationMetricAlarmAssertWorker(ModuleManager moduleManager) {
super(moduleManager);
this.applicationAlarmRuleConfig = moduleManager.find(ConfigurationModule.NAME).getService(IApplicationAlarmRuleConfig.class);
this.applicationCacheService = moduleManager.find(CacheModule.NAME).getService(ApplicationCacheService.class);
}
@Override public int id() {
......@@ -51,6 +58,21 @@ public class ApplicationMetricAlarmAssertWorker extends AlarmAssertWorker<Applic
return applicationAlarm;
}
@Override protected void generateAlarmContent(ApplicationAlarm alarm, double threshold) {
Application application = applicationCacheService.getApplicationById(alarm.getApplicationId());
String clientOrServer = "server";
if (MetricSource.Caller.getValue() == alarm.getSourceValue()) {
clientOrServer = "client";
}
if (AlarmType.ERROR_RATE.getValue() == alarm.getAlarmType()) {
alarm.setAlarmContent("The success rate of " + application.getApplicationCode() + ", detected from " + clientOrServer + " side, is lower than " + threshold + " rate.");
} else if (AlarmType.SLOW_RTT.getValue() == alarm.getAlarmType()) {
alarm.setAlarmContent("Response time of " + application.getApplicationCode() + ", detected from " + clientOrServer + " side, is slower than " + threshold + " ms.");
}
}
@Override protected Double calleeErrorRateThreshold() {
return applicationAlarmRuleConfig.calleeErrorRateThreshold();
}
......
......@@ -21,22 +21,29 @@ package org.apache.skywalking.apm.collector.analysis.alarm.provider.worker.appli
import org.apache.skywalking.apm.collector.analysis.alarm.define.graph.AlarmWorkerIdDefine;
import org.apache.skywalking.apm.collector.analysis.alarm.provider.worker.AlarmAssertWorker;
import org.apache.skywalking.apm.collector.analysis.alarm.provider.worker.AlarmAssertWorkerProvider;
import org.apache.skywalking.apm.collector.cache.CacheModule;
import org.apache.skywalking.apm.collector.cache.service.ApplicationCacheService;
import org.apache.skywalking.apm.collector.configuration.ConfigurationModule;
import org.apache.skywalking.apm.collector.configuration.service.IApplicationReferenceAlarmRuleConfig;
import org.apache.skywalking.apm.collector.core.module.ModuleManager;
import org.apache.skywalking.apm.collector.core.util.Const;
import org.apache.skywalking.apm.collector.storage.table.MetricSource;
import org.apache.skywalking.apm.collector.storage.table.alarm.AlarmType;
import org.apache.skywalking.apm.collector.storage.table.alarm.ApplicationReferenceAlarm;
import org.apache.skywalking.apm.collector.storage.table.application.ApplicationReferenceMetric;
import org.apache.skywalking.apm.collector.storage.table.register.Application;
/**
* @author peng-yongsheng
*/
public class ApplicationReferenceMetricAlarmAssertWorker extends AlarmAssertWorker<ApplicationReferenceMetric, ApplicationReferenceAlarm> {
private final ApplicationCacheService applicationCacheService;
private final IApplicationReferenceAlarmRuleConfig applicationReferenceAlarmRuleConfig;
public ApplicationReferenceMetricAlarmAssertWorker(ModuleManager moduleManager) {
super(moduleManager);
this.applicationCacheService = moduleManager.find(CacheModule.NAME).getService(ApplicationCacheService.class);
this.applicationReferenceAlarmRuleConfig = moduleManager.find(ConfigurationModule.NAME).getService(IApplicationReferenceAlarmRuleConfig.class);
}
......@@ -52,6 +59,21 @@ public class ApplicationReferenceMetricAlarmAssertWorker extends AlarmAssertWork
return applicationReferenceAlarm;
}
@Override protected void generateAlarmContent(ApplicationReferenceAlarm alarm, double threshold) {
Application application = applicationCacheService.getApplicationById(alarm.getBehindApplicationId());
String clientOrServer = "server";
if (MetricSource.Caller.getValue() == alarm.getSourceValue()) {
clientOrServer = "client";
}
if (AlarmType.ERROR_RATE.getValue() == alarm.getAlarmType()) {
alarm.setAlarmContent("The success rate of " + application.getApplicationCode() + ", detected from " + clientOrServer + " side, is lower than " + threshold + " rate.");
} else if (AlarmType.SLOW_RTT.getValue() == alarm.getAlarmType()) {
alarm.setAlarmContent("Response time of " + application.getApplicationCode() + ", detected from " + clientOrServer + " side, is slower than " + threshold + " ms.");
}
}
@Override protected Double calleeErrorRateThreshold() {
return applicationReferenceAlarmRuleConfig.calleeErrorRateThreshold();
}
......
......@@ -18,6 +18,8 @@
package org.apache.skywalking.apm.collector.analysis.alarm.provider.worker.instance;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import org.apache.skywalking.apm.collector.analysis.alarm.define.graph.AlarmWorkerIdDefine;
import org.apache.skywalking.apm.collector.analysis.alarm.provider.worker.AlarmAssertWorker;
import org.apache.skywalking.apm.collector.analysis.alarm.provider.worker.AlarmAssertWorkerProvider;
......@@ -25,18 +27,26 @@ import org.apache.skywalking.apm.collector.configuration.ConfigurationModule;
import org.apache.skywalking.apm.collector.configuration.service.IInstanceAlarmRuleConfig;
import org.apache.skywalking.apm.collector.core.module.ModuleManager;
import org.apache.skywalking.apm.collector.core.util.Const;
import org.apache.skywalking.apm.collector.storage.StorageModule;
import org.apache.skywalking.apm.collector.storage.dao.ui.IInstanceUIDAO;
import org.apache.skywalking.apm.collector.storage.table.MetricSource;
import org.apache.skywalking.apm.collector.storage.table.alarm.AlarmType;
import org.apache.skywalking.apm.collector.storage.table.alarm.InstanceAlarm;
import org.apache.skywalking.apm.collector.storage.table.instance.InstanceMetric;
import org.apache.skywalking.apm.collector.storage.table.register.Instance;
/**
* @author peng-yongsheng
*/
public class InstanceMetricAlarmAssertWorker extends AlarmAssertWorker<InstanceMetric, InstanceAlarm> {
private final Gson gson = new Gson();
private final IInstanceUIDAO instanceDAO;
private final IInstanceAlarmRuleConfig instanceAlarmRuleConfig;
public InstanceMetricAlarmAssertWorker(ModuleManager moduleManager) {
super(moduleManager);
this.instanceDAO = moduleManager.find(StorageModule.NAME).getService(IInstanceUIDAO.class);
this.instanceAlarmRuleConfig = moduleManager.find(ConfigurationModule.NAME).getService(IInstanceAlarmRuleConfig.class);
}
......@@ -52,6 +62,26 @@ public class InstanceMetricAlarmAssertWorker extends AlarmAssertWorker<InstanceM
return instanceAlarm;
}
@Override protected void generateAlarmContent(InstanceAlarm alarm, double threshold) {
Instance instance = instanceDAO.getInstance(alarm.getInstanceId());
JsonObject osInfo = gson.fromJson(instance.getOsInfo(), JsonObject.class);
String serverName = Const.UNKNOWN;
if (osInfo.has("hostName")) {
serverName = osInfo.get("hostName").getAsString();
}
String clientOrServer = "server";
if (MetricSource.Caller.getValue() == alarm.getSourceValue()) {
clientOrServer = "client";
}
if (AlarmType.ERROR_RATE.getValue() == alarm.getAlarmType()) {
alarm.setAlarmContent("The success rate of " + serverName + ", detected from " + clientOrServer + " side, is lower than " + threshold + " rate.");
} else if (AlarmType.SLOW_RTT.getValue() == alarm.getAlarmType()) {
alarm.setAlarmContent("Response time of " + serverName + ", detected from " + clientOrServer + " side, is slower than " + threshold + " ms.");
}
}
@Override protected Double calleeErrorRateThreshold() {
return instanceAlarmRuleConfig.calleeErrorRateThreshold();
}
......
......@@ -18,6 +18,8 @@
package org.apache.skywalking.apm.collector.analysis.alarm.provider.worker.instance;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import org.apache.skywalking.apm.collector.analysis.alarm.define.graph.AlarmWorkerIdDefine;
import org.apache.skywalking.apm.collector.analysis.alarm.provider.worker.AlarmAssertWorker;
import org.apache.skywalking.apm.collector.analysis.alarm.provider.worker.AlarmAssertWorkerProvider;
......@@ -25,18 +27,26 @@ import org.apache.skywalking.apm.collector.configuration.ConfigurationModule;
import org.apache.skywalking.apm.collector.configuration.service.IInstanceReferenceAlarmRuleConfig;
import org.apache.skywalking.apm.collector.core.module.ModuleManager;
import org.apache.skywalking.apm.collector.core.util.Const;
import org.apache.skywalking.apm.collector.storage.StorageModule;
import org.apache.skywalking.apm.collector.storage.dao.ui.IInstanceUIDAO;
import org.apache.skywalking.apm.collector.storage.table.MetricSource;
import org.apache.skywalking.apm.collector.storage.table.alarm.AlarmType;
import org.apache.skywalking.apm.collector.storage.table.alarm.InstanceReferenceAlarm;
import org.apache.skywalking.apm.collector.storage.table.instance.InstanceReferenceMetric;
import org.apache.skywalking.apm.collector.storage.table.register.Instance;
/**
* @author peng-yongsheng
*/
public class InstanceReferenceMetricAlarmAssertWorker extends AlarmAssertWorker<InstanceReferenceMetric, InstanceReferenceAlarm> {
private Gson gson = new Gson();
private final IInstanceUIDAO instanceDAO;
private final IInstanceReferenceAlarmRuleConfig instanceReferenceAlarmRuleConfig;
public InstanceReferenceMetricAlarmAssertWorker(ModuleManager moduleManager) {
super(moduleManager);
this.instanceDAO = moduleManager.find(StorageModule.NAME).getService(IInstanceUIDAO.class);
this.instanceReferenceAlarmRuleConfig = moduleManager.find(ConfigurationModule.NAME).getService(IInstanceReferenceAlarmRuleConfig.class);
}
......@@ -54,6 +64,26 @@ public class InstanceReferenceMetricAlarmAssertWorker extends AlarmAssertWorker<
return instanceReferenceAlarm;
}
@Override protected void generateAlarmContent(InstanceReferenceAlarm alarm, double threshold) {
Instance instance = instanceDAO.getInstance(alarm.getBehindInstanceId());
JsonObject osInfo = gson.fromJson(instance.getOsInfo(), JsonObject.class);
String serverName = Const.UNKNOWN;
if (osInfo.has("hostName")) {
serverName = osInfo.get("hostName").getAsString();
}
String clientOrServer = "server";
if (MetricSource.Caller.getValue() == alarm.getSourceValue()) {
clientOrServer = "client";
}
if (AlarmType.ERROR_RATE.getValue() == alarm.getAlarmType()) {
alarm.setAlarmContent("The success rate of " + serverName + ", detected from " + clientOrServer + " side, is lower than " + threshold + ".");
} else if (AlarmType.SLOW_RTT.getValue() == alarm.getAlarmType()) {
alarm.setAlarmContent("Response time of " + serverName + ", detected from " + clientOrServer + " side, is slower than " + threshold + ".");
}
}
@Override protected Double calleeErrorRateThreshold() {
return instanceReferenceAlarmRuleConfig.calleeErrorRateThreshold();
}
......
......@@ -21,11 +21,16 @@ package org.apache.skywalking.apm.collector.analysis.alarm.provider.worker.servi
import org.apache.skywalking.apm.collector.analysis.alarm.define.graph.AlarmWorkerIdDefine;
import org.apache.skywalking.apm.collector.analysis.alarm.provider.worker.AlarmAssertWorker;
import org.apache.skywalking.apm.collector.analysis.alarm.provider.worker.AlarmAssertWorkerProvider;
import org.apache.skywalking.apm.collector.cache.CacheModule;
import org.apache.skywalking.apm.collector.cache.service.ServiceNameCacheService;
import org.apache.skywalking.apm.collector.configuration.ConfigurationModule;
import org.apache.skywalking.apm.collector.configuration.service.IServiceAlarmRuleConfig;
import org.apache.skywalking.apm.collector.core.module.ModuleManager;
import org.apache.skywalking.apm.collector.core.util.Const;
import org.apache.skywalking.apm.collector.storage.table.MetricSource;
import org.apache.skywalking.apm.collector.storage.table.alarm.AlarmType;
import org.apache.skywalking.apm.collector.storage.table.alarm.ServiceAlarm;
import org.apache.skywalking.apm.collector.storage.table.register.ServiceName;
import org.apache.skywalking.apm.collector.storage.table.service.ServiceMetric;
/**
......@@ -33,10 +38,12 @@ import org.apache.skywalking.apm.collector.storage.table.service.ServiceMetric;
*/
public class ServiceMetricAlarmAssertWorker extends AlarmAssertWorker<ServiceMetric, ServiceAlarm> {
private final ServiceNameCacheService serviceNameCacheService;
private final IServiceAlarmRuleConfig serviceAlarmRuleConfig;
public ServiceMetricAlarmAssertWorker(ModuleManager moduleManager) {
super(moduleManager);
this.serviceNameCacheService = moduleManager.find(CacheModule.NAME).getService(ServiceNameCacheService.class);
this.serviceAlarmRuleConfig = moduleManager.find(ConfigurationModule.NAME).getService(IServiceAlarmRuleConfig.class);
}
......@@ -53,6 +60,21 @@ public class ServiceMetricAlarmAssertWorker extends AlarmAssertWorker<ServiceMet
return serviceAlarm;
}
@Override protected void generateAlarmContent(ServiceAlarm alarm, double threshold) {
ServiceName serviceName = serviceNameCacheService.get(alarm.getServiceId());
String clientOrServer = "server";
if (MetricSource.Caller.getValue() == alarm.getSourceValue()) {
clientOrServer = "client";
}
if (AlarmType.ERROR_RATE.getValue() == alarm.getAlarmType()) {
alarm.setAlarmContent("The success rate of " + serviceName.getServiceName() + ", detected from " + clientOrServer + " side, is lower than " + threshold + " rate.");
} else if (AlarmType.SLOW_RTT.getValue() == alarm.getAlarmType()) {
alarm.setAlarmContent("Response time of " + serviceName.getServiceName() + ", detected from " + clientOrServer + " side, is slower than " + threshold + " ms.");
}
}
@Override protected Double calleeErrorRateThreshold() {
return serviceAlarmRuleConfig.calleeErrorRateThreshold();
}
......
......@@ -21,26 +21,29 @@ package org.apache.skywalking.apm.collector.analysis.alarm.provider.worker.servi
import org.apache.skywalking.apm.collector.analysis.alarm.define.graph.AlarmWorkerIdDefine;
import org.apache.skywalking.apm.collector.analysis.alarm.provider.worker.AlarmAssertWorker;
import org.apache.skywalking.apm.collector.analysis.alarm.provider.worker.AlarmAssertWorkerProvider;
import org.apache.skywalking.apm.collector.cache.CacheModule;
import org.apache.skywalking.apm.collector.cache.service.ServiceNameCacheService;
import org.apache.skywalking.apm.collector.configuration.ConfigurationModule;
import org.apache.skywalking.apm.collector.configuration.service.IServiceReferenceAlarmRuleConfig;
import org.apache.skywalking.apm.collector.core.module.ModuleManager;
import org.apache.skywalking.apm.collector.core.util.Const;
import org.apache.skywalking.apm.collector.storage.table.MetricSource;
import org.apache.skywalking.apm.collector.storage.table.alarm.AlarmType;
import org.apache.skywalking.apm.collector.storage.table.alarm.ServiceReferenceAlarm;
import org.apache.skywalking.apm.collector.storage.table.register.ServiceName;
import org.apache.skywalking.apm.collector.storage.table.service.ServiceReferenceMetric;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author peng-yongsheng
*/
public class ServiceReferenceMetricAlarmAssertWorker extends AlarmAssertWorker<ServiceReferenceMetric, ServiceReferenceAlarm> {
private final Logger logger = LoggerFactory.getLogger(ServiceReferenceMetricAlarmAssertWorker.class);
private final ServiceNameCacheService serviceNameCacheService;
private final IServiceReferenceAlarmRuleConfig serviceReferenceAlarmRuleConfig;
public ServiceReferenceMetricAlarmAssertWorker(ModuleManager moduleManager) {
ServiceReferenceMetricAlarmAssertWorker(ModuleManager moduleManager) {
super(moduleManager);
this.serviceNameCacheService = moduleManager.find(CacheModule.NAME).getService(ServiceNameCacheService.class);
this.serviceReferenceAlarmRuleConfig = moduleManager.find(ConfigurationModule.NAME).getService(IServiceReferenceAlarmRuleConfig.class);
}
......@@ -60,6 +63,21 @@ public class ServiceReferenceMetricAlarmAssertWorker extends AlarmAssertWorker<S
return serviceReferenceAlarm;
}
@Override protected void generateAlarmContent(ServiceReferenceAlarm alarm, double threshold) {
ServiceName serviceName = serviceNameCacheService.get(alarm.getBehindServiceId());
String clientOrServer = "server";
if (MetricSource.Caller.getValue() == alarm.getSourceValue()) {
clientOrServer = "client";
}
if (AlarmType.ERROR_RATE.getValue() == alarm.getAlarmType()) {
alarm.setAlarmContent("The success rate of " + serviceName.getServiceName() + ", detected from " + clientOrServer + " side, is lower than " + threshold + " rate.");
} else if (AlarmType.SLOW_RTT.getValue() == alarm.getAlarmType()) {
alarm.setAlarmContent("Response time of " + serviceName.getServiceName() + ", detected from " + clientOrServer + " side, is slower than " + threshold + " ms.");
}
}
@Override protected Double calleeErrorRateThreshold() {
return serviceReferenceAlarmRuleConfig.calleeErrorRateThreshold();
}
......
......@@ -73,6 +73,7 @@ public class InstanceRegisterSerialWorker extends AbstractLocalAsyncWorker<Insta
userInstance.setId(String.valueOf(Const.NONE_INSTANCE_ID));
userInstance.setInstanceId(Const.NONE_INSTANCE_ID);
userInstance.setApplicationId(Const.NONE_APPLICATION_ID);
userInstance.setApplicationCode(Const.USER_CODE);
userInstance.setAgentUUID(Const.USER_CODE);
userInstance.setHeartBeatTime(System.currentTimeMillis());
userInstance.setOsInfo(Const.EMPTY_STRING);
......@@ -85,6 +86,7 @@ public class InstanceRegisterSerialWorker extends AbstractLocalAsyncWorker<Insta
newInstance.setId("2");
newInstance.setInstanceId(2);
newInstance.setApplicationId(instance.getApplicationId());
newInstance.setApplicationCode(instance.getApplicationCode());
newInstance.setAgentUUID(instance.getAgentUUID());
newInstance.setHeartBeatTime(instance.getHeartBeatTime());
newInstance.setOsInfo(instance.getOsInfo());
......@@ -96,6 +98,7 @@ public class InstanceRegisterSerialWorker extends AbstractLocalAsyncWorker<Insta
newInstance.setId(String.valueOf(max + 1));
newInstance.setInstanceId(max + 1);
newInstance.setApplicationId(instance.getApplicationId());
newInstance.setApplicationCode(instance.getApplicationCode());
newInstance.setAgentUUID(instance.getAgentUUID());
newInstance.setHeartBeatTime(instance.getHeartBeatTime());
newInstance.setOsInfo(instance.getOsInfo());
......
......@@ -21,6 +21,7 @@ package org.apache.skywalking.apm.collector.analysis.register.provider.service;
import org.apache.skywalking.apm.collector.analysis.register.define.graph.GraphIdDefine;
import org.apache.skywalking.apm.collector.analysis.register.define.service.IInstanceIDService;
import org.apache.skywalking.apm.collector.cache.CacheModule;
import org.apache.skywalking.apm.collector.cache.service.ApplicationCacheService;
import org.apache.skywalking.apm.collector.cache.service.InstanceCacheService;
import org.apache.skywalking.apm.collector.core.graph.Graph;
import org.apache.skywalking.apm.collector.core.graph.GraphManager;
......@@ -45,6 +46,7 @@ public class InstanceIDService implements IInstanceIDService {
private InstanceCacheService instanceCacheService;
private Graph<Instance> instanceRegisterGraph;
private IInstanceRegisterDAO instanceRegisterDAO;
private ApplicationCacheService applicationCacheService;
public InstanceIDService(ModuleManager moduleManager) {
this.moduleManager = moduleManager;
......@@ -71,6 +73,13 @@ public class InstanceIDService implements IInstanceIDService {
return instanceRegisterDAO;
}
private ApplicationCacheService getApplicationCacheService() {
if (ObjectUtils.isEmpty(applicationCacheService)) {
this.applicationCacheService = moduleManager.find(CacheModule.NAME).getService(ApplicationCacheService.class);
}
return applicationCacheService;
}
@Override public int getOrCreateByAgentUUID(int applicationId, String agentUUID, long registerTime, String osInfo) {
logger.debug("get or getOrCreate instance id by agent UUID, application id: {}, agentUUID: {}, registerTime: {}, osInfo: {}", applicationId, agentUUID, registerTime, osInfo);
int instanceId = getInstanceCacheService().getInstanceIdByAgentUUID(applicationId, agentUUID);
......@@ -79,6 +88,7 @@ public class InstanceIDService implements IInstanceIDService {
Instance instance = new Instance();
instance.setId("0");
instance.setApplicationId(applicationId);
instance.setApplicationCode(getApplicationCacheService().getApplicationById(applicationId).getApplicationCode());
instance.setAgentUUID(agentUUID);
instance.setRegisterTime(registerTime);
instance.setHeartBeatTime(registerTime);
......@@ -100,6 +110,7 @@ public class InstanceIDService implements IInstanceIDService {
Instance instance = new Instance();
instance.setId("0");
instance.setApplicationId(applicationId);
instance.setApplicationCode(getApplicationCacheService().getApplicationById(applicationId).getApplicationCode());
instance.setAgentUUID(Const.EMPTY_STRING);
instance.setRegisterTime(registerTime);
instance.setHeartBeatTime(registerTime);
......@@ -118,6 +129,7 @@ public class InstanceIDService implements IInstanceIDService {
Instance instance = new Instance();
instance.setId(String.valueOf(instanceId));
instance.setApplicationId(applicationId);
instance.setApplicationCode(getApplicationCacheService().getApplicationById(applicationId).getApplicationCode());
instance.setAgentUUID("");
instance.setRegisterTime(registerTime);
instance.setHeartBeatTime(registerTime);
......
......@@ -27,5 +27,26 @@ import org.apache.skywalking.apm.collector.storage.ui.common.Step;
*/
public interface IApplicationAlarmListUIDAO extends DAO {
List<Integer> getAlarmedApplicationNum(Step step, long start, long end);
List<AlarmTrend> getAlarmedApplicationNum(Step step, long startTimeBucket, long endTimeBucket);
class AlarmTrend {
private long timeBucket;
private int numberOfApplication;
public long getTimeBucket() {
return timeBucket;
}
public void setTimeBucket(long timeBucket) {
this.timeBucket = timeBucket;
}
public int getNumberOfApplication() {
return numberOfApplication;
}
public void setNumberOfApplication(int numberOfApplication) {
this.numberOfApplication = numberOfApplication;
}
}
}
......@@ -27,5 +27,5 @@ import org.apache.skywalking.apm.collector.storage.ui.alarm.Alarm;
*/
public interface IApplicationAlarmUIDAO extends DAO {
Alarm loadAlarmList(String keyword, long start, long end, int limit, int from) throws ParseException;
Alarm loadAlarmList(String keyword, long startTimeBucket, long endTimeBucket, int limit, int from) throws ParseException;
}
......@@ -27,5 +27,5 @@ import org.apache.skywalking.apm.collector.storage.ui.alarm.Alarm;
*/
public interface IInstanceAlarmUIDAO extends DAO {
Alarm loadAlarmList(String keyword, long start, long end, int limit, int from) throws ParseException;
Alarm loadAlarmList(String keyword, long startTimeBucket, long endTimeBucket, int limit, int from) throws ParseException;
}
......@@ -27,5 +27,5 @@ import org.apache.skywalking.apm.collector.storage.ui.alarm.Alarm;
*/
public interface IServiceAlarmUIDAO extends DAO {
Alarm loadAlarmList(String keyword, long start, long end, int limit, int from) throws ParseException;
Alarm loadAlarmList(String keyword, long startTimeBucket, long endTimeBucket, int limit, int from) throws ParseException;
}
......@@ -32,6 +32,7 @@ public class Instance extends StreamData {
new Column(InstanceTable.COLUMN_ID, new NonOperation()),
new Column(InstanceTable.COLUMN_AGENT_UUID, new CoverOperation()),
new Column(InstanceTable.COLUMN_OS_INFO, new CoverOperation()),
new Column(InstanceTable.COLUMN_APPLICATION_CODE, new CoverOperation()),
};
private static final Column[] LONG_COLUMNS = {
......@@ -118,6 +119,14 @@ public class Instance extends StreamData {
setDataString(2, osInfo);
}
public String getApplicationCode() {
return getDataString(3);
}
public void setApplicationCode(String applicationCode) {
setDataString(3, applicationCode);
}
public int getAddressId() {
return getDataInteger(2);
}
......
......@@ -26,6 +26,7 @@ import org.apache.skywalking.apm.collector.core.data.CommonTable;
public class InstanceTable extends CommonTable {
public static final String TABLE = "instance";
public static final String COLUMN_APPLICATION_ID = "application_id";
public static final String COLUMN_APPLICATION_CODE = "application_code";
public static final String COLUMN_AGENT_UUID = "agent_uuid";
public static final String COLUMN_REGISTER_TIME = "register_time";
public static final String COLUMN_INSTANCE_ID = "instance_id";
......
......@@ -22,18 +22,18 @@ package org.apache.skywalking.apm.collector.storage.ui.alarm;
* @author peng-yongsheng
*/
public class AlarmItem {
private String id;
private int id;
private String title;
private String content;
private String startTime;
private AlarmType alarmType;
private CauseType causeType;
public String getId() {
public int getId() {
return id;
}
public void setId(String id) {
public void setId(int id) {
this.id = id;
}
......
......@@ -57,6 +57,7 @@ public class InstanceRegisterEsDAO extends EsDAO implements IInstanceRegisterDAO
Map<String, Object> source = new HashMap<>();
source.put(InstanceTable.COLUMN_INSTANCE_ID, instance.getInstanceId());
source.put(InstanceTable.COLUMN_APPLICATION_ID, instance.getApplicationId());
source.put(InstanceTable.COLUMN_APPLICATION_CODE, instance.getApplicationCode());
source.put(InstanceTable.COLUMN_AGENT_UUID, instance.getAgentUUID());
source.put(InstanceTable.COLUMN_REGISTER_TIME, TimeBucketUtils.INSTANCE.getSecondTimeBucket(instance.getRegisterTime()));
source.put(InstanceTable.COLUMN_HEARTBEAT_TIME, TimeBucketUtils.INSTANCE.getSecondTimeBucket(instance.getHeartBeatTime()));
......
......@@ -46,13 +46,14 @@ public class ApplicationAlarmEsUIDAO extends EsDAO implements IApplicationAlarmU
}
@Override
public Alarm loadAlarmList(String keyword, long start, long end, int limit, int from) throws ParseException {
public Alarm loadAlarmList(String keyword, long startTimeBucket, long endTimeBucket, int limit,
int from) throws ParseException {
SearchRequestBuilder searchRequestBuilder = getClient().prepareSearch(ApplicationAlarmTable.TABLE);
searchRequestBuilder.setTypes(ApplicationAlarmTable.TABLE_TYPE);
searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH);
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must().add(QueryBuilders.rangeQuery(ApplicationAlarmTable.COLUMN_LAST_TIME_BUCKET).gte(start).lte(end));
boolQueryBuilder.must().add(QueryBuilders.rangeQuery(ApplicationAlarmTable.COLUMN_LAST_TIME_BUCKET).gte(startTimeBucket).lte(endTimeBucket));
if (StringUtils.isNotEmpty(keyword)) {
boolQueryBuilder.must().add(QueryBuilders.matchQuery(ApplicationAlarmTable.COLUMN_ALARM_CONTENT, keyword));
}
......@@ -68,8 +69,7 @@ public class ApplicationAlarmEsUIDAO extends EsDAO implements IApplicationAlarmU
alarm.setTotal((int)searchResponse.getHits().getTotalHits());
for (SearchHit searchHit : searchHits) {
AlarmItem alarmItem = new AlarmItem();
alarmItem.setId(searchHit.getId());
alarmItem.setTitle((String)searchHit.getSource().get(ApplicationAlarmTable.COLUMN_ALARM_CONTENT));
alarmItem.setId(((Number)searchHit.getSource().get(ApplicationAlarmTable.COLUMN_APPLICATION_ID)).intValue());
alarmItem.setContent((String)searchHit.getSource().get(ApplicationAlarmTable.COLUMN_ALARM_CONTENT));
long lastTimeBucket = ((Number)searchHit.getSource().get(ApplicationAlarmTable.COLUMN_LAST_TIME_BUCKET)).longValue();
......
......@@ -42,12 +42,12 @@ public class ApplicationAlarmListEsUIDAO extends EsDAO implements IApplicationAl
super(client);
}
@Override public List<Integer> getAlarmedApplicationNum(Step step, long start, long end) {
@Override public List<AlarmTrend> getAlarmedApplicationNum(Step step, long startTimeBucket, long endTimeBucket) {
String tableName = TimePyramidTableNameBuilder.build(step, ApplicationAlarmListTable.TABLE);
SearchRequestBuilder searchRequestBuilder = getClient().prepareSearch(tableName);
searchRequestBuilder.setTypes(ApplicationAlarmListTable.TABLE_TYPE);
searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH);
searchRequestBuilder.setQuery(QueryBuilders.rangeQuery(ApplicationAlarmListTable.COLUMN_TIME_BUCKET).gte(start).lte(end));
searchRequestBuilder.setQuery(QueryBuilders.rangeQuery(ApplicationAlarmListTable.COLUMN_TIME_BUCKET).gte(startTimeBucket).lte(endTimeBucket));
searchRequestBuilder.setSize(0);
searchRequestBuilder.addAggregation(AggregationBuilders.terms(ApplicationAlarmListTable.COLUMN_TIME_BUCKET).field(ApplicationAlarmListTable.COLUMN_TIME_BUCKET).size(100)
......@@ -57,13 +57,16 @@ public class ApplicationAlarmListEsUIDAO extends EsDAO implements IApplicationAl
Terms timeBucketTerms = searchResponse.getAggregations().get(ApplicationAlarmListTable.COLUMN_TIME_BUCKET);
List<Integer> alarmApplicationNum = new LinkedList<>();
List<AlarmTrend> alarmTrends = new LinkedList<>();
for (Terms.Bucket timeBucketBucket : timeBucketTerms.getBuckets()) {
Terms applicationBucketTerms = timeBucketBucket.getAggregations().get(ApplicationAlarmListTable.COLUMN_APPLICATION_ID);
int num = applicationBucketTerms.getBuckets().size();
alarmApplicationNum.add(num);
AlarmTrend alarmTrend = new AlarmTrend();
alarmTrend.setNumberOfApplication(applicationBucketTerms.getBuckets().size());
alarmTrend.setTimeBucket(timeBucketBucket.getKeyAsNumber().longValue());
alarmTrends.add(alarmTrend);
}
return alarmApplicationNum;
return alarmTrends;
}
}
......@@ -46,13 +46,14 @@ public class InstanceAlarmEsUIDAO extends EsDAO implements IInstanceAlarmUIDAO {
}
@Override
public Alarm loadAlarmList(String keyword, long start, long end, int limit, int from) throws ParseException {
public Alarm loadAlarmList(String keyword, long startTimeBucket, long endTimeBucket, int limit,
int from) throws ParseException {
SearchRequestBuilder searchRequestBuilder = getClient().prepareSearch(InstanceAlarmTable.TABLE);
searchRequestBuilder.setTypes(InstanceAlarmTable.TABLE_TYPE);
searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH);
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must().add(QueryBuilders.rangeQuery(InstanceAlarmTable.COLUMN_LAST_TIME_BUCKET).gte(start).lte(end));
boolQueryBuilder.must().add(QueryBuilders.rangeQuery(InstanceAlarmTable.COLUMN_LAST_TIME_BUCKET).gte(startTimeBucket).lte(endTimeBucket));
if (StringUtils.isNotEmpty(keyword)) {
boolQueryBuilder.must().add(QueryBuilders.matchQuery(InstanceAlarmTable.COLUMN_ALARM_CONTENT, keyword));
}
......@@ -68,7 +69,7 @@ public class InstanceAlarmEsUIDAO extends EsDAO implements IInstanceAlarmUIDAO {
alarm.setTotal((int)searchResponse.getHits().getTotalHits());
for (SearchHit searchHit : searchHits) {
AlarmItem alarmItem = new AlarmItem();
alarmItem.setId(searchHit.getId());
alarmItem.setId(((Number)searchHit.getSource().get(InstanceAlarmTable.COLUMN_INSTANCE_ID)).intValue());
alarmItem.setTitle((String)searchHit.getSource().get(InstanceAlarmTable.COLUMN_ALARM_CONTENT));
alarmItem.setContent((String)searchHit.getSource().get(InstanceAlarmTable.COLUMN_ALARM_CONTENT));
......
......@@ -249,6 +249,7 @@ public class InstanceEsUIDAO extends EsDAO implements IInstanceUIDAO {
for (SearchHit searchHit : searchHits) {
AppServerInfo appServerInfo = new AppServerInfo();
appServerInfo.setId(((Number)searchHit.getSource().get(InstanceTable.COLUMN_INSTANCE_ID)).intValue());
appServerInfo.setApplicationId(((Number)searchHit.getSource().get(InstanceTable.COLUMN_APPLICATION_ID)).intValue());
appServerInfo.setOsInfo((String)searchHit.getSource().get(InstanceTable.COLUMN_OS_INFO));
appServerInfos.add(appServerInfo);
}
......
......@@ -46,13 +46,14 @@ public class ServiceAlarmEsUIDAO extends EsDAO implements IServiceAlarmUIDAO {
}
@Override
public Alarm loadAlarmList(String keyword, long start, long end, int limit, int from) throws ParseException {
public Alarm loadAlarmList(String keyword, long startTimeBucket, long endTimeBucket, int limit,
int from) throws ParseException {
SearchRequestBuilder searchRequestBuilder = getClient().prepareSearch(ServiceAlarmTable.TABLE);
searchRequestBuilder.setTypes(ServiceAlarmTable.TABLE_TYPE);
searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH);
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must().add(QueryBuilders.rangeQuery(ServiceAlarmTable.COLUMN_LAST_TIME_BUCKET).gte(start).lte(end));
boolQueryBuilder.must().add(QueryBuilders.rangeQuery(ServiceAlarmTable.COLUMN_LAST_TIME_BUCKET).gte(startTimeBucket).lte(endTimeBucket));
if (StringUtils.isNotEmpty(keyword)) {
boolQueryBuilder.must().add(QueryBuilders.matchQuery(ServiceAlarmTable.COLUMN_ALARM_CONTENT, keyword));
}
......@@ -68,7 +69,7 @@ public class ServiceAlarmEsUIDAO extends EsDAO implements IServiceAlarmUIDAO {
alarm.setTotal((int)searchResponse.getHits().getTotalHits());
for (SearchHit searchHit : searchHits) {
AlarmItem alarmItem = new AlarmItem();
alarmItem.setId(searchHit.getId());
alarmItem.setId(((Number)searchHit.getSource().get(ServiceAlarmTable.COLUMN_SERVICE_ID)).intValue());
alarmItem.setTitle((String)searchHit.getSource().get(ServiceAlarmTable.COLUMN_ALARM_CONTENT));
alarmItem.setContent((String)searchHit.getSource().get(ServiceAlarmTable.COLUMN_ALARM_CONTENT));
......
......@@ -37,11 +37,12 @@ public class InstanceEsTableDefine extends ElasticSearchTableDefine {
@Override public void initialize() {
addColumn(new ElasticSearchColumnDefine(InstanceTable.COLUMN_APPLICATION_ID, ElasticSearchColumnDefine.Type.Integer.name()));
addColumn(new ElasticSearchColumnDefine(InstanceTable.COLUMN_APPLICATION_CODE, ElasticSearchColumnDefine.Type.Text.name()));
addColumn(new ElasticSearchColumnDefine(InstanceTable.COLUMN_AGENT_UUID, ElasticSearchColumnDefine.Type.Keyword.name()));
addColumn(new ElasticSearchColumnDefine(InstanceTable.COLUMN_REGISTER_TIME, ElasticSearchColumnDefine.Type.Long.name()));
addColumn(new ElasticSearchColumnDefine(InstanceTable.COLUMN_INSTANCE_ID, ElasticSearchColumnDefine.Type.Integer.name()));
addColumn(new ElasticSearchColumnDefine(InstanceTable.COLUMN_HEARTBEAT_TIME, ElasticSearchColumnDefine.Type.Long.name()));
addColumn(new ElasticSearchColumnDefine(InstanceTable.COLUMN_OS_INFO, ElasticSearchColumnDefine.Type.Keyword.name()));
addColumn(new ElasticSearchColumnDefine(InstanceTable.COLUMN_OS_INFO, ElasticSearchColumnDefine.Type.Text.name()));
addColumn(new ElasticSearchColumnDefine(InstanceTable.COLUMN_ADDRESS_ID, ElasticSearchColumnDefine.Type.Integer.name()));
addColumn(new ElasticSearchColumnDefine(InstanceTable.COLUMN_IS_ADDRESS, ElasticSearchColumnDefine.Type.Integer.name()));
}
......
......@@ -58,6 +58,7 @@ public class InstanceRegisterH2DAO extends H2DAO implements IInstanceRegisterDAO
source.put(InstanceTable.COLUMN_ID, instance.getId());
source.put(InstanceTable.COLUMN_INSTANCE_ID, instance.getInstanceId());
source.put(InstanceTable.COLUMN_APPLICATION_ID, instance.getApplicationId());
source.put(InstanceTable.COLUMN_APPLICATION_CODE, instance.getApplicationCode());
source.put(InstanceTable.COLUMN_AGENT_UUID, instance.getAgentUUID());
source.put(InstanceTable.COLUMN_REGISTER_TIME, TimeBucketUtils.INSTANCE.getSecondTimeBucket(instance.getRegisterTime()));
source.put(InstanceTable.COLUMN_HEARTBEAT_TIME, TimeBucketUtils.INSTANCE.getSecondTimeBucket(instance.getHeartBeatTime()));
......
......@@ -34,7 +34,7 @@ public class ApplicationAlarmH2UIDAO extends H2DAO implements IApplicationAlarmU
}
@Override
public Alarm loadAlarmList(String keyword, long start, long end, int limit, int from) throws ParseException {
public Alarm loadAlarmList(String keyword, long startTimeBucket, long endTimeBucket, int limit, int from) throws ParseException {
return null;
}
}
......@@ -33,7 +33,7 @@ public class ApplicationAlarmListH2UIDAO extends H2DAO implements IApplicationAl
super(client);
}
@Override public List<Integer> getAlarmedApplicationNum(Step step, long start, long end) {
@Override public List<AlarmTrend> getAlarmedApplicationNum(Step step, long startTimeBucket, long endTimeBucket) {
return null;
}
}
......@@ -32,7 +32,7 @@ public class InstanceAlarmH2UIDAO extends H2DAO implements IInstanceAlarmUIDAO {
super(client);
}
@Override public Alarm loadAlarmList(String keyword, long start, long end, int limit, int from) {
@Override public Alarm loadAlarmList(String keyword, long startTimeBucket, long endTimeBucket, int limit, int from) {
return null;
}
}
......@@ -32,7 +32,7 @@ public class ServiceAlarmH2UIDAO extends H2DAO implements IServiceAlarmUIDAO {
super(client);
}
@Override public Alarm loadAlarmList(String keyword, long start, long end, int limit, int from) {
@Override public Alarm loadAlarmList(String keyword, long startTimeBucket, long endTimeBucket, int limit, int from) {
return null;
}
}
......@@ -34,6 +34,7 @@ public class InstanceH2TableDefine extends H2TableDefine {
@Override public void initialize() {
addColumn(new H2ColumnDefine(InstanceTable.COLUMN_ID, H2ColumnDefine.Type.Varchar.name()));
addColumn(new H2ColumnDefine(InstanceTable.COLUMN_APPLICATION_ID, H2ColumnDefine.Type.Int.name()));
addColumn(new H2ColumnDefine(InstanceTable.COLUMN_APPLICATION_CODE, H2ColumnDefine.Type.Varchar.name()));
addColumn(new H2ColumnDefine(InstanceTable.COLUMN_AGENT_UUID, H2ColumnDefine.Type.Varchar.name()));
addColumn(new H2ColumnDefine(InstanceTable.COLUMN_REGISTER_TIME, H2ColumnDefine.Type.Bigint.name()));
addColumn(new H2ColumnDefine(InstanceTable.COLUMN_INSTANCE_ID, H2ColumnDefine.Type.Int.name()));
......
......@@ -28,6 +28,7 @@ import org.apache.skywalking.apm.collector.storage.ui.common.Pagination;
import org.apache.skywalking.apm.collector.ui.graphql.Query;
import org.apache.skywalking.apm.collector.ui.service.AlarmService;
import org.apache.skywalking.apm.collector.ui.utils.DurationUtils;
import org.apache.skywalking.apm.collector.ui.utils.PaginationUtils;
/**
* @author peng-yongsheng
......@@ -50,19 +51,18 @@ public class AlarmQuery implements Query {
public Alarm loadAlarmList(String keyword, AlarmType alarmType, Duration duration,
Pagination paging) throws ParseException {
long start = DurationUtils.INSTANCE.durationToSecondTimeBucket(duration.getStep(), duration.getStart()) / 100;
long end = DurationUtils.INSTANCE.durationToSecondTimeBucket(duration.getStep(), duration.getEnd()) / 100;
long startTimeBucket = DurationUtils.INSTANCE.durationToSecondTimeBucket(duration.getStep(), duration.getStart()) / 100;
long endTimeBucket = DurationUtils.INSTANCE.durationToSecondTimeBucket(duration.getStep(), duration.getEnd()) / 100;
int limit = paging.getPageSize();
int from = paging.getPageSize() * paging.getPageNum();
PaginationUtils.Page page = PaginationUtils.INSTANCE.exchange(paging);
switch (alarmType) {
case APPLICATION:
return getAlarmService().loadApplicationAlarmList(keyword, start, end, limit, from);
return getAlarmService().loadApplicationAlarmList(keyword, startTimeBucket, endTimeBucket, page.getLimit(), page.getFrom());
case SERVER:
return getAlarmService().loadInstanceAlarmList(keyword, start, end, limit, from);
return getAlarmService().loadInstanceAlarmList(keyword, startTimeBucket, endTimeBucket, page.getLimit(), page.getFrom());
case SERVICE:
return getAlarmService().loadServiceAlarmList(keyword, start, end, limit, from);
return getAlarmService().loadServiceAlarmList(keyword, startTimeBucket, endTimeBucket, page.getLimit(), page.getFrom());
default:
return new Alarm();
}
......
......@@ -115,17 +115,17 @@ public class OverViewLayerQuery implements Query {
long startTimeBucket = DurationUtils.INSTANCE.exchangeToTimeBucket(duration.getStart());
long endTimeBucket = DurationUtils.INSTANCE.exchangeToTimeBucket(duration.getEnd());
long start = DurationUtils.INSTANCE.durationToSecondTimeBucket(duration.getStep(), duration.getStart());
long end = DurationUtils.INSTANCE.durationToSecondTimeBucket(duration.getStep(), duration.getEnd());
long startSecondTimeBucket = DurationUtils.INSTANCE.durationToSecondTimeBucket(duration.getStep(), duration.getStart());
long endSecondTimeBucket = DurationUtils.INSTANCE.durationToSecondTimeBucket(duration.getStep(), duration.getEnd());
return getAlarmService().getApplicationAlarmTrend(duration.getStep(), startTimeBucket, endTimeBucket, start, end);
return getAlarmService().getApplicationAlarmTrend(duration.getStep(), startTimeBucket, endTimeBucket, startSecondTimeBucket, endSecondTimeBucket);
}
public ConjecturalAppBrief getConjecturalApps(Duration duration) throws ParseException {
long start = DurationUtils.INSTANCE.durationToSecondTimeBucket(duration.getStep(), duration.getStart());
long end = DurationUtils.INSTANCE.durationToSecondTimeBucket(duration.getStep(), duration.getEnd());
long startSecondTimeBucket = DurationUtils.INSTANCE.durationToSecondTimeBucket(duration.getStep(), duration.getStart());
long endSecondTimeBucket = DurationUtils.INSTANCE.durationToSecondTimeBucket(duration.getStep(), duration.getEnd());
return getApplicationService().getConjecturalApps(duration.getStep(), start, end);
return getApplicationService().getConjecturalApps(duration.getStep(), startSecondTimeBucket, endSecondTimeBucket);
}
public List<ServiceMetric> getTopNSlowService(Duration duration, int topN) throws ParseException {
......
......@@ -18,19 +18,31 @@
package org.apache.skywalking.apm.collector.ui.service;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import java.text.ParseException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.skywalking.apm.collector.cache.CacheModule;
import org.apache.skywalking.apm.collector.cache.service.ApplicationCacheService;
import org.apache.skywalking.apm.collector.cache.service.ServiceNameCacheService;
import org.apache.skywalking.apm.collector.core.module.ModuleManager;
import org.apache.skywalking.apm.collector.core.util.Const;
import org.apache.skywalking.apm.collector.storage.StorageModule;
import org.apache.skywalking.apm.collector.storage.dao.ui.IApplicationAlarmListUIDAO;
import org.apache.skywalking.apm.collector.storage.dao.ui.IApplicationAlarmUIDAO;
import org.apache.skywalking.apm.collector.storage.dao.ui.IInstanceAlarmUIDAO;
import org.apache.skywalking.apm.collector.storage.dao.ui.IInstanceUIDAO;
import org.apache.skywalking.apm.collector.storage.dao.ui.IServiceAlarmUIDAO;
import org.apache.skywalking.apm.collector.storage.table.register.Instance;
import org.apache.skywalking.apm.collector.storage.table.register.ServiceName;
import org.apache.skywalking.apm.collector.storage.ui.alarm.Alarm;
import org.apache.skywalking.apm.collector.storage.ui.application.Application;
import org.apache.skywalking.apm.collector.storage.ui.common.Step;
import org.apache.skywalking.apm.collector.storage.ui.overview.AlarmTrend;
import org.apache.skywalking.apm.collector.storage.utils.DurationPoint;
import org.apache.skywalking.apm.collector.ui.utils.DurationUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -41,11 +53,16 @@ public class AlarmService {
private final Logger logger = LoggerFactory.getLogger(AlarmService.class);
private final Gson gson = new Gson();
private final IInstanceUIDAO instanceDAO;
private final IApplicationAlarmUIDAO applicationAlarmUIDAO;
private final IInstanceAlarmUIDAO instanceAlarmUIDAO;
private final IServiceAlarmUIDAO serviceAlarmUIDAO;
private final IApplicationAlarmListUIDAO applicationAlarmListUIDAO;
private final ApplicationCacheService applicationCacheService;
private final ServiceNameCacheService serviceNameCacheService;
private static final String RESPONSE_TIME_ALARM = " response time alarm.";
private static final String SUCCESS_RATE_ALARM = " success rate alarm.";
public AlarmService(ModuleManager moduleManager) {
this.instanceDAO = moduleManager.find(StorageModule.NAME).getService(IInstanceUIDAO.class);
......@@ -53,35 +70,93 @@ public class AlarmService {
this.instanceAlarmUIDAO = moduleManager.find(StorageModule.NAME).getService(IInstanceAlarmUIDAO.class);
this.serviceAlarmUIDAO = moduleManager.find(StorageModule.NAME).getService(IServiceAlarmUIDAO.class);
this.applicationAlarmListUIDAO = moduleManager.find(StorageModule.NAME).getService(IApplicationAlarmListUIDAO.class);
this.applicationCacheService = moduleManager.find(CacheModule.NAME).getService(ApplicationCacheService.class);
this.serviceNameCacheService = moduleManager.find(CacheModule.NAME).getService(ServiceNameCacheService.class);
}
public Alarm loadApplicationAlarmList(String keyword, long start, long end,
public Alarm loadApplicationAlarmList(String keyword, long startTimeBucket, long endTimeBucket,
int limit, int from) throws ParseException {
logger.debug("keyword: {}, start: {}, end: {}, limit: {}, from: {}", keyword, start, end, limit, from);
return applicationAlarmUIDAO.loadAlarmList(keyword, start, end, limit, from);
logger.debug("keyword: {}, startTimeBucket: {}, endTimeBucket: {}, limit: {}, from: {}", keyword, startTimeBucket, endTimeBucket, limit, from);
Alarm alarm = applicationAlarmUIDAO.loadAlarmList(keyword, startTimeBucket, endTimeBucket, limit, from);
alarm.getItems().forEach(item -> {
String applicationCode = applicationCacheService.getApplicationById(item.getId()).getApplicationCode();
switch (item.getCauseType()) {
case SLOW_RESPONSE:
item.setTitle("Application " + applicationCode + RESPONSE_TIME_ALARM);
break;
case LOW_SUCCESS_RATE:
item.setTitle("Application " + applicationCode + SUCCESS_RATE_ALARM);
break;
}
});
return alarm;
}
public Alarm loadInstanceAlarmList(String keyword, long start, long end,
public Alarm loadInstanceAlarmList(String keyword, long startTimeBucket, long endTimeBucket,
int limit, int from) throws ParseException {
logger.debug("keyword: {}, start: {}, end: {}, limit: {}, from: {}", keyword, start, end, limit, from);
return instanceAlarmUIDAO.loadAlarmList(keyword, start, end, limit, from);
logger.debug("keyword: {}, startTimeBucket: {}, endTimeBucket: {}, limit: {}, from: {}", keyword, startTimeBucket, endTimeBucket, limit, from);
Alarm alarm = instanceAlarmUIDAO.loadAlarmList(keyword, startTimeBucket, endTimeBucket, limit, from);
alarm.getItems().forEach(item -> {
Instance instance = instanceDAO.getInstance(item.getId());
String applicationCode = applicationCacheService.getApplicationById(instance.getApplicationId()).getApplicationCode();
String serverName = buildServerName(instance.getOsInfo());
switch (item.getCauseType()) {
case SLOW_RESPONSE:
item.setTitle("Server " + serverName + " of Application " + applicationCode + RESPONSE_TIME_ALARM);
break;
case LOW_SUCCESS_RATE:
item.setTitle("Server " + serverName + " of Application " + applicationCode + SUCCESS_RATE_ALARM);
break;
}
});
return alarm;
}
public Alarm loadServiceAlarmList(String keyword, long start, long end,
public Alarm loadServiceAlarmList(String keyword, long startTimeBucket, long endTimeBucket,
int limit, int from) throws ParseException {
logger.debug("keyword: {}, start: {}, end: {}, limit: {}, from: {}", keyword, start, end, limit, from);
return serviceAlarmUIDAO.loadAlarmList(keyword, start, end, limit, from);
logger.debug("keyword: {}, startTimeBucket: {}, endTimeBucket: {}, limit: {}, from: {}", keyword, startTimeBucket, endTimeBucket, limit, from);
Alarm alarm = serviceAlarmUIDAO.loadAlarmList(keyword, startTimeBucket, endTimeBucket, limit, from);
alarm.getItems().forEach(item -> {
ServiceName serviceName = serviceNameCacheService.get(item.getId());
String applicationCode = applicationCacheService.getApplicationById(serviceName.getApplicationId()).getApplicationCode();
switch (item.getCauseType()) {
case SLOW_RESPONSE:
item.setTitle("Service " + serviceName.getServiceName() + " of Application " + applicationCode + RESPONSE_TIME_ALARM);
break;
case LOW_SUCCESS_RATE:
item.setTitle("Service " + serviceName.getServiceName() + " of Application " + applicationCode + SUCCESS_RATE_ALARM);
break;
}
});
return alarm;
}
public AlarmTrend getApplicationAlarmTrend(Step step, long startTimeBucket, long endTimeBucket, long start,
long end) throws ParseException {
List<Application> applications = instanceDAO.getApplications(start, end);
public AlarmTrend getApplicationAlarmTrend(Step step, long startTimeBucket, long endTimeBucket,
long startSecondTimeBucket,
long endSecondTimeBucket) throws ParseException {
List<Application> applications = instanceDAO.getApplications(startSecondTimeBucket, endSecondTimeBucket);
List<DurationPoint> durationPoints = DurationUtils.INSTANCE.getDurationPoints(step, startTimeBucket, endTimeBucket);
List<IApplicationAlarmListUIDAO.AlarmTrend> alarmTrends = applicationAlarmListUIDAO.getAlarmedApplicationNum(step, startTimeBucket, endTimeBucket);
Map<Long, Integer> trendsMap = new HashMap<>();
alarmTrends.forEach(alarmTrend -> trendsMap.put(alarmTrend.getTimeBucket(), alarmTrend.getNumberOfApplication()));
List<Integer> applicationNum = applicationAlarmListUIDAO.getAlarmedApplicationNum(step, startTimeBucket, endTimeBucket);
AlarmTrend alarmTrend = new AlarmTrend();
applicationNum.forEach(num -> {
alarmTrend.getNumOfAlarmRate().add((num * 10000) / (applications.size()));
durationPoints.forEach(durationPoint -> {
alarmTrend.getNumOfAlarmRate().add((trendsMap.getOrDefault(durationPoint.getPoint(), 0) * 10000) / (applications.size()));
});
return alarmTrend;
}
private String buildServerName(String osInfoJson) {
JsonObject osInfo = gson.fromJson(osInfoJson, JsonObject.class);
String serverName = Const.UNKNOWN;
if (osInfo.has("hostName")) {
serverName = osInfo.get("hostName").getAsString();
}
return serverName;
}
}
......@@ -112,7 +112,7 @@ public class ApplicationService {
return applicationThroughput;
}
public ConjecturalAppBrief getConjecturalApps(Step step, long start, long end) throws ParseException {
public ConjecturalAppBrief getConjecturalApps(Step step, long startSecondTimeBucket, long endSecondTimeBucket) throws ParseException {
List<ConjecturalApp> conjecturalApps = networkAddressUIDAO.getConjecturalApps();
conjecturalApps.forEach(conjecturalApp -> {
String name = ServerTypeDefine.getInstance().getServerType(conjecturalApp.getId());
......
......@@ -60,7 +60,7 @@ public class ApplicationTopologyService {
public Topology getApplicationTopology(Step step, int applicationId, long startTimeBucket,
long endTimeBucket, long startSecondTimeBucket, long endSecondTimeBucket) throws ParseException {
logger.debug("startTime: {}, endTime: {}", startTimeBucket, endTimeBucket);
logger.debug("startTimeBucket: {}, endTimeBucket: {}", startTimeBucket, endTimeBucket);
List<IApplicationComponentUIDAO.ApplicationComponent> applicationComponents = applicationComponentUIDAO.load(step, startTimeBucket, endTimeBucket);
List<IApplicationMappingUIDAO.ApplicationMapping> applicationMappings = applicationMappingUIDAO.load(step, startTimeBucket, endTimeBucket);
......@@ -82,6 +82,6 @@ public class ApplicationTopologyService {
TopologyBuilder builder = new TopologyBuilder(moduleManager);
return builder.build(applicationComponents, applicationMappings, applicationMetrics, callerReferenceMetric, calleeReferenceMetric, startSecondTimeBucket, endSecondTimeBucket);
return builder.build(applicationComponents, applicationMappings, applicationMetrics, callerReferenceMetric, calleeReferenceMetric, startTimeBucket, endTimeBucket, startSecondTimeBucket, endSecondTimeBucket);
}
}
......@@ -72,6 +72,6 @@ public class ClusterTopologyService {
TopologyBuilder builder = new TopologyBuilder(moduleManager);
return builder.build(applicationComponents, applicationMappings, applicationMetrics, callerReferenceMetric, calleeReferenceMetric, startSecondTimeBucket, endSecondTimeBucket);
return builder.build(applicationComponents, applicationMappings, applicationMetrics, callerReferenceMetric, calleeReferenceMetric, startTimeBucket, endTimeBucket, startSecondTimeBucket, endSecondTimeBucket);
}
}
......@@ -146,7 +146,8 @@ public class ServerService {
return gcTrend;
}
public MemoryTrend getMemoryTrend(int instanceId, Step step, long startTimeBucket, long endTimeBucket) throws ParseException {
public MemoryTrend getMemoryTrend(int instanceId, Step step, long startTimeBucket,
long endTimeBucket) throws ParseException {
MemoryTrend memoryTrend = new MemoryTrend();
List<DurationPoint> durationPoints = DurationUtils.INSTANCE.getDurationPoints(step, startTimeBucket, endTimeBucket);
IMemoryMetricUIDAO.Trend heapMemoryTrend = memoryMetricUIDAO.getHeapMemoryTrend(instanceId, step, durationPoints);
......@@ -162,9 +163,7 @@ public class ServerService {
private void buildAppServerInfo(List<AppServerInfo> serverInfos) {
serverInfos.forEach(serverInfo -> {
int applicationId = instanceCacheService.getApplicationId(serverInfo.getId());
serverInfo.setApplicationId(applicationId);
serverInfo.setApplicationCode(applicationCacheService.getApplicationById(applicationId).getApplicationCode());
serverInfo.setApplicationCode(applicationCacheService.getApplicationById(serverInfo.getApplicationId()).getApplicationCode());
if (StringUtils.isNotEmpty(serverInfo.getOsInfo())) {
JsonObject osInfoJson = gson.fromJson(serverInfo.getOsInfo(), JsonObject.class);
if (osInfoJson.has("osName")) {
......
......@@ -94,6 +94,7 @@ public class ServiceTopologyService {
} catch (ParseException e) {
logger.error(e.getMessage(), e);
}
call.setAlert(false);
calls.add(call);
});
......
......@@ -33,6 +33,7 @@ import org.apache.skywalking.apm.collector.storage.dao.ui.IApplicationMappingUID
import org.apache.skywalking.apm.collector.storage.dao.ui.IApplicationMetricUIDAO;
import org.apache.skywalking.apm.collector.storage.dao.ui.IApplicationReferenceMetricUIDAO;
import org.apache.skywalking.apm.collector.storage.table.register.Application;
import org.apache.skywalking.apm.collector.storage.ui.alarm.Alarm;
import org.apache.skywalking.apm.collector.storage.ui.application.ApplicationNode;
import org.apache.skywalking.apm.collector.storage.ui.application.ConjecturalNode;
import org.apache.skywalking.apm.collector.storage.ui.common.Call;
......@@ -55,11 +56,13 @@ class TopologyBuilder {
private final ApplicationCacheService applicationCacheService;
private final ServerService serverService;
private final SecondBetweenService secondBetweenService;
private final AlarmService alarmService;
TopologyBuilder(ModuleManager moduleManager) {
this.applicationCacheService = moduleManager.find(CacheModule.NAME).getService(ApplicationCacheService.class);
this.serverService = new ServerService(moduleManager);
this.secondBetweenService = new SecondBetweenService(moduleManager);
this.alarmService = new AlarmService(moduleManager);
}
Topology build(List<IApplicationComponentUIDAO.ApplicationComponent> applicationComponents,
......@@ -67,7 +70,7 @@ class TopologyBuilder {
List<IApplicationMetricUIDAO.ApplicationMetric> applicationMetrics,
List<IApplicationReferenceMetricUIDAO.ApplicationReferenceMetric> callerReferenceMetric,
List<IApplicationReferenceMetricUIDAO.ApplicationReferenceMetric> calleeReferenceMetric,
long startSecondTimeBucket, long endSecondTimeBucket) {
long startTimeBucket, long endTimeBucket, long startSecondTimeBucket, long endSecondTimeBucket) {
Map<Integer, String> components = changeNodeComp2Map(applicationComponents);
Map<Integer, Integer> mappings = changeMapping2Map(applicationMappings);
......@@ -91,9 +94,29 @@ class TopologyBuilder {
applicationNode.setAvgResponseTime((applicationMetric.getDurations() - applicationMetric.getErrorDurations()) / (applicationMetric.getCalls() - applicationMetric.getErrorCalls()));
applicationNode.setApdex(ApdexCalculator.INSTANCE.calculate(applicationMetric.getSatisfiedCount(), applicationMetric.getToleratingCount(), applicationMetric.getFrustratedCount()));
applicationNode.setAlarm(false);
try {
Alarm alarm = alarmService.loadApplicationAlarmList(Const.EMPTY_STRING, startTimeBucket, endTimeBucket, 1, 0);
if (alarm.getItems().size() > 0) {
applicationNode.setAlarm(true);
}
} catch (ParseException e) {
logger.error(e.getMessage(), e);
}
applicationNode.setNumOfServer(serverService.getAllServer(applicationId, startSecondTimeBucket, endSecondTimeBucket).size());
applicationNode.setNumOfServerAlarm(1);
applicationNode.setNumOfServiceAlarm(1);
try {
Alarm alarm = alarmService.loadInstanceAlarmList(Const.EMPTY_STRING, startTimeBucket, endTimeBucket, 1000, 0);
applicationNode.setNumOfServerAlarm(alarm.getItems().size());
} catch (ParseException e) {
logger.error(e.getMessage(), e);
}
try {
Alarm alarm = alarmService.loadServiceAlarmList(Const.EMPTY_STRING, startTimeBucket, endTimeBucket, 1000, 0);
applicationNode.setNumOfServiceAlarm(alarm.getItems().size());
} catch (ParseException e) {
logger.error(e.getMessage(), e);
}
nodes.add(applicationNode);
});
......@@ -117,7 +140,7 @@ class TopologyBuilder {
int actualTargetId = mappings.getOrDefault(target.getApplicationId(), target.getApplicationId());
call.setTarget(actualTargetId);
call.setTargetName(applicationCacheService.getApplicationById(actualTargetId).getApplicationCode());
call.setAlert(true);
call.setAlert(false);
call.setCallType(components.get(referenceMetric.getTarget()));
try {
call.setCallsPerSec(referenceMetric.getCalls() / secondBetweenService.calculate(source.getApplicationId(), startSecondTimeBucket, endSecondTimeBucket));
......@@ -153,7 +176,7 @@ class TopologyBuilder {
call.setSourceName(source.getApplicationCode());
call.setTarget(target.getApplicationId());
call.setTargetName(target.getApplicationCode());
call.setAlert(true);
call.setAlert(false);
if (source.getApplicationId() == Const.NONE_APPLICATION_ID) {
call.setCallType(Const.EMPTY_STRING);
......
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.skywalking.apm.collector.ui.utils;
import org.apache.skywalking.apm.collector.storage.ui.common.Pagination;
/**
* @author peng-yongsheng
*/
public enum PaginationUtils {
INSTANCE;
public Page exchange(Pagination paging) {
int limit = paging.getPageSize();
int from = paging.getPageSize() * (paging.getPageNum() - 1);
return new Page(from, limit);
}
public class Page {
private int from;
private int limit;
Page(int from, int limit) {
this.from = from;
this.limit = limit;
}
public int getFrom() {
return from;
}
public int getLimit() {
return limit;
}
}
}
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.skywalking.apm.collector.ui.utils;
import org.apache.skywalking.apm.collector.storage.ui.common.Pagination;
import org.junit.Assert;
import org.junit.Test;
/**
* @author peng-yongsheng
*/
public class PaginationUtilsTestCase {
@Test
public void test() {
Pagination pagination = new Pagination();
pagination.setPageSize(10);
pagination.setPageNum(1);
PaginationUtils.Page page = PaginationUtils.INSTANCE.exchange(pagination);
Assert.assertEquals(0, page.getFrom());
Assert.assertEquals(10, page.getLimit());
pagination = new Pagination();
pagination.setPageSize(10);
pagination.setPageNum(2);
page = PaginationUtils.INSTANCE.exchange(pagination);
Assert.assertEquals(10, page.getFrom());
Assert.assertEquals(10, page.getLimit());
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册