diff --git a/apm-collector/apm-collector-analysis/analysis-alarm/alarm-provider/pom.xml b/apm-collector/apm-collector-analysis/analysis-alarm/alarm-provider/pom.xml index 1b2babe5e035cfd255ef201fb03d6b3e2db0fec7..22d24a16ad680f5127b22daf9a1530df3470ed12 100644 --- a/apm-collector/apm-collector-analysis/analysis-alarm/alarm-provider/pom.xml +++ b/apm-collector/apm-collector-analysis/analysis-alarm/alarm-provider/pom.xml @@ -51,6 +51,11 @@ collector-storage-define ${project.version} + + org.apache.skywalking + collector-cache-define + ${project.version} + org.apache.skywalking analysis-worker-model diff --git a/apm-collector/apm-collector-analysis/analysis-alarm/alarm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/alarm/provider/worker/AlarmAssertWorker.java b/apm-collector/apm-collector-analysis/analysis-alarm/alarm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/alarm/provider/worker/AlarmAssertWorker.java index 0aeabca1b9afedd65c6868123b852d953523a2b8..244d2ad869fab3b076254cd7d9354f4edf4c5c19 100644 --- a/apm-collector/apm-collector-analysis/analysis-alarm/alarm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/alarm/provider/worker/AlarmAssertWorker.java +++ b/apm-collector/apm-collector-analysis/analysis-alarm/alarm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/alarm/provider/worker/AlarmAssertWorker.java @@ -49,6 +49,8 @@ public abstract class AlarmAssertWorker { 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 { + 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(); } diff --git a/apm-collector/apm-collector-analysis/analysis-alarm/alarm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/alarm/provider/worker/instance/InstanceMetricAlarmAssertWorker.java b/apm-collector/apm-collector-analysis/analysis-alarm/alarm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/alarm/provider/worker/instance/InstanceMetricAlarmAssertWorker.java index 2b02dd7df7451e62977213b721e1446056224fa7..a0e9ad1c2973364cf292bf4f377863c402f43338 100644 --- a/apm-collector/apm-collector-analysis/analysis-alarm/alarm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/alarm/provider/worker/instance/InstanceMetricAlarmAssertWorker.java +++ b/apm-collector/apm-collector-analysis/analysis-alarm/alarm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/alarm/provider/worker/instance/InstanceMetricAlarmAssertWorker.java @@ -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 { + 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 { + 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(); } diff --git a/apm-collector/apm-collector-analysis/analysis-alarm/alarm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/alarm/provider/worker/service/ServiceMetricAlarmAssertWorker.java b/apm-collector/apm-collector-analysis/analysis-alarm/alarm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/alarm/provider/worker/service/ServiceMetricAlarmAssertWorker.java index e7a8242cc5c5733849d367c072eb337e049c048c..e5680d9647c3e7f74b4ebc384b2b0c6dc87ead84 100644 --- a/apm-collector/apm-collector-analysis/analysis-alarm/alarm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/alarm/provider/worker/service/ServiceMetricAlarmAssertWorker.java +++ b/apm-collector/apm-collector-analysis/analysis-alarm/alarm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/alarm/provider/worker/service/ServiceMetricAlarmAssertWorker.java @@ -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 { + 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 { - 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 getTopNSlowService(Duration duration, int topN) throws ParseException { diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/AlarmService.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/AlarmService.java index 22a8be095895a6e3564b72213d476ff2c42af5a2..62bd60bfa06a33831ca5fb1f9d5553d97894a950 100644 --- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/AlarmService.java +++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/AlarmService.java @@ -18,17 +18,25 @@ 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; @@ -45,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); @@ -57,24 +70,66 @@ 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, @@ -95,4 +150,13 @@ public class AlarmService { }); 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; + } } diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ApplicationService.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ApplicationService.java index 3080af6feb5a438c3136a64b6fccb9db88fdcb97..4493781c693726ab75c86812eddc039255122e62 100644 --- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ApplicationService.java +++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ApplicationService.java @@ -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 conjecturalApps = networkAddressUIDAO.getConjecturalApps(); conjecturalApps.forEach(conjecturalApp -> { String name = ServerTypeDefine.getInstance().getServerType(conjecturalApp.getId()); diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ServerService.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ServerService.java index f3e7d85cf105f3a654d7ddb0a8bf418fd36bb224..81a1c66b73772f8c2e02708f8befc1091ec48a1a 100644 --- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ServerService.java +++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ServerService.java @@ -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 durationPoints = DurationUtils.INSTANCE.getDurationPoints(step, startTimeBucket, endTimeBucket); IMemoryMetricUIDAO.Trend heapMemoryTrend = memoryMetricUIDAO.getHeapMemoryTrend(instanceId, step, durationPoints);