From f9c241c5a90ae215caa5fe48dd953905ee2137bf Mon Sep 17 00:00:00 2001 From: peng-yongsheng <8082209@qq.com> Date: Fri, 2 Mar 2018 13:31:40 +0800 Subject: [PATCH 1/5] Pagination calculate --- .../apm/collector/ui/query/AlarmQuery.java | 10 ++-- .../collector/ui/utils/PaginationUtils.java | 53 +++++++++++++++++++ .../ui/utils/PaginationUtilsTestCase.java | 48 +++++++++++++++++ 3 files changed, 106 insertions(+), 5 deletions(-) create mode 100644 apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/utils/PaginationUtils.java create mode 100644 apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/utils/PaginationUtilsTestCase.java diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/query/AlarmQuery.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/query/AlarmQuery.java index 6b1df8d77..acbd6fe89 100644 --- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/query/AlarmQuery.java +++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/query/AlarmQuery.java @@ -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 @@ -53,16 +54,15 @@ public class AlarmQuery implements Query { long start = DurationUtils.INSTANCE.durationToSecondTimeBucket(duration.getStep(), duration.getStart()) / 100; long end = 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, start, end, page.getLimit(), page.getFrom()); case SERVER: - return getAlarmService().loadInstanceAlarmList(keyword, start, end, limit, from); + return getAlarmService().loadInstanceAlarmList(keyword, start, end, page.getLimit(), page.getFrom()); case SERVICE: - return getAlarmService().loadServiceAlarmList(keyword, start, end, limit, from); + return getAlarmService().loadServiceAlarmList(keyword, start, end, page.getLimit(), page.getFrom()); default: return new Alarm(); } diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/utils/PaginationUtils.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/utils/PaginationUtils.java new file mode 100644 index 000000000..9250b138a --- /dev/null +++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/utils/PaginationUtils.java @@ -0,0 +1,53 @@ +/* + * 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; + } + } +} diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/utils/PaginationUtilsTestCase.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/utils/PaginationUtilsTestCase.java new file mode 100644 index 000000000..782d5ff1c --- /dev/null +++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/utils/PaginationUtilsTestCase.java @@ -0,0 +1,48 @@ +/* + * 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()); + } +} From 36d0eb5f69d1c1a1d9c9b3e74cbef0e3189f0420 Mon Sep 17 00:00:00 2001 From: peng-yongsheng <8082209@qq.com> Date: Fri, 2 Mar 2018 13:52:42 +0800 Subject: [PATCH 2/5] getAlarmTrend ok. --- .../dao/ui/IApplicationAlarmListUIDAO.java | 23 ++++++++++++++++++- .../dao/ui/ApplicationAlarmListEsUIDAO.java | 15 +++++++----- .../dao/ui/ApplicationAlarmListH2UIDAO.java | 2 +- .../ui/query/OverViewLayerQuery.java | 6 ++--- .../collector/ui/service/AlarmService.java | 23 ++++++++++++++----- 5 files changed, 52 insertions(+), 17 deletions(-) diff --git a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/dao/ui/IApplicationAlarmListUIDAO.java b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/dao/ui/IApplicationAlarmListUIDAO.java index 3cd92773a..4edbef7ef 100644 --- a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/dao/ui/IApplicationAlarmListUIDAO.java +++ b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/dao/ui/IApplicationAlarmListUIDAO.java @@ -27,5 +27,26 @@ import org.apache.skywalking.apm.collector.storage.ui.common.Step; */ public interface IApplicationAlarmListUIDAO extends DAO { - List getAlarmedApplicationNum(Step step, long start, long end); + List 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; + } + } } diff --git a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ui/ApplicationAlarmListEsUIDAO.java b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ui/ApplicationAlarmListEsUIDAO.java index 158bb82a7..fcc205233 100644 --- a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ui/ApplicationAlarmListEsUIDAO.java +++ b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ui/ApplicationAlarmListEsUIDAO.java @@ -42,12 +42,12 @@ public class ApplicationAlarmListEsUIDAO extends EsDAO implements IApplicationAl super(client); } - @Override public List getAlarmedApplicationNum(Step step, long start, long end) { + @Override public List 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 alarmApplicationNum = new LinkedList<>(); + List 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; } } diff --git a/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/ui/ApplicationAlarmListH2UIDAO.java b/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/ui/ApplicationAlarmListH2UIDAO.java index 598144a2a..73eb9408b 100644 --- a/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/ui/ApplicationAlarmListH2UIDAO.java +++ b/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/ui/ApplicationAlarmListH2UIDAO.java @@ -33,7 +33,7 @@ public class ApplicationAlarmListH2UIDAO extends H2DAO implements IApplicationAl super(client); } - @Override public List getAlarmedApplicationNum(Step step, long start, long end) { + @Override public List getAlarmedApplicationNum(Step step, long startTimeBucket, long endTimeBucket) { return null; } } diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/query/OverViewLayerQuery.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/query/OverViewLayerQuery.java index aceb82c0a..916249b92 100644 --- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/query/OverViewLayerQuery.java +++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/query/OverViewLayerQuery.java @@ -115,10 +115,10 @@ 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 { 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 7ecd6f3ec..22a8be095 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 @@ -19,7 +19,9 @@ package org.apache.skywalking.apm.collector.ui.service; import java.text.ParseException; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.apache.skywalking.apm.collector.core.module.ModuleManager; import org.apache.skywalking.apm.collector.storage.StorageModule; import org.apache.skywalking.apm.collector.storage.dao.ui.IApplicationAlarmListUIDAO; @@ -31,6 +33,8 @@ 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; @@ -73,14 +77,21 @@ public class AlarmService { return serviceAlarmUIDAO.loadAlarmList(keyword, start, end, limit, from); } - public AlarmTrend getApplicationAlarmTrend(Step step, long startTimeBucket, long endTimeBucket, long start, - long end) throws ParseException { - List applications = instanceDAO.getApplications(start, end); + public AlarmTrend getApplicationAlarmTrend(Step step, long startTimeBucket, long endTimeBucket, + long startSecondTimeBucket, + long endSecondTimeBucket) throws ParseException { + List applications = instanceDAO.getApplications(startSecondTimeBucket, endSecondTimeBucket); + + List durationPoints = DurationUtils.INSTANCE.getDurationPoints(step, startTimeBucket, endTimeBucket); + + List alarmTrends = applicationAlarmListUIDAO.getAlarmedApplicationNum(step, startTimeBucket, endTimeBucket); + + Map trendsMap = new HashMap<>(); + alarmTrends.forEach(alarmTrend -> trendsMap.put(alarmTrend.getTimeBucket(), alarmTrend.getNumberOfApplication())); - List 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; } From 3863aa71ee0a47d67b27051913715c86ed822a79 Mon Sep 17 00:00:00 2001 From: peng-yongsheng <8082209@qq.com> Date: Fri, 2 Mar 2018 22:32:48 +0800 Subject: [PATCH 3/5] 1. Generate alarm content. 2. loadAlarmList ok. --- .../analysis-alarm/alarm-provider/pom.xml | 5 ++ .../provider/worker/AlarmAssertWorker.java | 10 ++- .../ApplicationMetricAlarmAssertWorker.java | 22 +++++ ...ationReferenceMetricAlarmAssertWorker.java | 22 +++++ .../InstanceMetricAlarmAssertWorker.java | 30 +++++++ ...tanceReferenceMetricAlarmAssertWorker.java | 30 +++++++ .../ServiceMetricAlarmAssertWorker.java | 22 +++++ ...rviceReferenceMetricAlarmAssertWorker.java | 28 +++++-- .../dao/ui/IApplicationAlarmUIDAO.java | 2 +- .../storage/dao/ui/IInstanceAlarmUIDAO.java | 2 +- .../storage/dao/ui/IServiceAlarmUIDAO.java | 2 +- .../collector/storage/ui/alarm/AlarmItem.java | 6 +- .../es/dao/ui/ApplicationAlarmEsUIDAO.java | 8 +- .../es/dao/ui/InstanceAlarmEsUIDAO.java | 7 +- .../es/dao/ui/ServiceAlarmEsUIDAO.java | 7 +- .../h2/dao/ui/ApplicationAlarmH2UIDAO.java | 2 +- .../h2/dao/ui/InstanceAlarmH2UIDAO.java | 2 +- .../h2/dao/ui/ServiceAlarmH2UIDAO.java | 2 +- .../apm/collector/ui/query/AlarmQuery.java | 10 +-- .../ui/query/OverViewLayerQuery.java | 6 +- .../collector/ui/service/AlarmService.java | 82 +++++++++++++++++-- .../ui/service/ApplicationService.java | 2 +- .../collector/ui/service/ServerService.java | 3 +- 23 files changed, 265 insertions(+), 47 deletions(-) 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 1b2babe5e..22d24a16a 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 0aeabca1b..244d2ad86 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 2b02dd7df..a0e9ad1c2 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 e7a8242cc..e5680d964 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 22a8be095..62bd60bfa 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 3080af6fe..4493781c6 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 f3e7d85cf..81a1c66b7 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); From fc5f67f0849b092370829188c022890eca453d61 Mon Sep 17 00:00:00 2001 From: peng-yongsheng <8082209@qq.com> Date: Fri, 2 Mar 2018 22:55:02 +0800 Subject: [PATCH 4/5] Setting the alarm attributes in topology. --- .../service/ApplicationTopologyService.java | 4 +-- .../ui/service/ClusterTopologyService.java | 2 +- .../ui/service/ServiceTopologyService.java | 1 + .../collector/ui/service/TopologyBuilder.java | 33 ++++++++++++++++--- 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ApplicationTopologyService.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ApplicationTopologyService.java index ecb02d2ec..7d4fe4180 100644 --- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ApplicationTopologyService.java +++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ApplicationTopologyService.java @@ -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 applicationComponents = applicationComponentUIDAO.load(step, startTimeBucket, endTimeBucket); List 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); } } diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ClusterTopologyService.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ClusterTopologyService.java index 2b215cd10..8e1609c72 100644 --- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ClusterTopologyService.java +++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ClusterTopologyService.java @@ -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); } } diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ServiceTopologyService.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ServiceTopologyService.java index f932d0969..c8f54712b 100644 --- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ServiceTopologyService.java +++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ServiceTopologyService.java @@ -94,6 +94,7 @@ public class ServiceTopologyService { } catch (ParseException e) { logger.error(e.getMessage(), e); } + call.setAlert(false); calls.add(call); }); diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/TopologyBuilder.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/TopologyBuilder.java index fc4deefba..cbd013e2d 100644 --- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/TopologyBuilder.java +++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/TopologyBuilder.java @@ -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 applicationComponents, @@ -67,7 +70,7 @@ class TopologyBuilder { List applicationMetrics, List callerReferenceMetric, List calleeReferenceMetric, - long startSecondTimeBucket, long endSecondTimeBucket) { + long startTimeBucket, long endTimeBucket, long startSecondTimeBucket, long endSecondTimeBucket) { Map components = changeNodeComp2Map(applicationComponents); Map 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); From 75a9283d241d8de370276df07c243c91197aaa52 Mon Sep 17 00:00:00 2001 From: peng-yongsheng <8082209@qq.com> Date: Sat, 3 Mar 2018 00:15:10 +0800 Subject: [PATCH 5/5] 1. Add application code into instance table. 2. Search server by application code by searchServer method. --- .../register/InstanceRegisterSerialWorker.java | 3 +++ .../register/provider/service/InstanceIDService.java | 12 ++++++++++++ .../collector/storage/table/register/Instance.java | 9 +++++++++ .../storage/table/register/InstanceTable.java | 1 + .../es/dao/register/InstanceRegisterEsDAO.java | 1 + .../collector/storage/es/dao/ui/InstanceEsUIDAO.java | 1 + .../es/define/register/InstanceEsTableDefine.java | 3 ++- .../h2/dao/register/InstanceRegisterH2DAO.java | 1 + .../h2/define/register/InstanceH2TableDefine.java | 1 + .../apm/collector/ui/service/ServerService.java | 4 +--- 10 files changed, 32 insertions(+), 4 deletions(-) diff --git a/apm-collector/apm-collector-analysis/analysis-register/register-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/register/provider/register/InstanceRegisterSerialWorker.java b/apm-collector/apm-collector-analysis/analysis-register/register-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/register/provider/register/InstanceRegisterSerialWorker.java index e51a4cd50..12f8fd7ba 100644 --- a/apm-collector/apm-collector-analysis/analysis-register/register-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/register/provider/register/InstanceRegisterSerialWorker.java +++ b/apm-collector/apm-collector-analysis/analysis-register/register-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/register/provider/register/InstanceRegisterSerialWorker.java @@ -73,6 +73,7 @@ public class InstanceRegisterSerialWorker extends AbstractLocalAsyncWorker 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); diff --git a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/table/register/Instance.java b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/table/register/Instance.java index cc4ce39a8..8efe7dcff 100644 --- a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/table/register/Instance.java +++ b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/table/register/Instance.java @@ -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); } diff --git a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/table/register/InstanceTable.java b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/table/register/InstanceTable.java index 10779e762..fcf4d8cb3 100644 --- a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/table/register/InstanceTable.java +++ b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/table/register/InstanceTable.java @@ -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"; diff --git a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/register/InstanceRegisterEsDAO.java b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/register/InstanceRegisterEsDAO.java index 98bf29c08..074ec584d 100644 --- a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/register/InstanceRegisterEsDAO.java +++ b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/register/InstanceRegisterEsDAO.java @@ -57,6 +57,7 @@ public class InstanceRegisterEsDAO extends EsDAO implements IInstanceRegisterDAO Map 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())); diff --git a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ui/InstanceEsUIDAO.java b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ui/InstanceEsUIDAO.java index 8c0e0c694..8a08047d2 100644 --- a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ui/InstanceEsUIDAO.java +++ b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ui/InstanceEsUIDAO.java @@ -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); } diff --git a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/define/register/InstanceEsTableDefine.java b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/define/register/InstanceEsTableDefine.java index e16d08296..ec545715a 100644 --- a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/define/register/InstanceEsTableDefine.java +++ b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/define/register/InstanceEsTableDefine.java @@ -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())); } diff --git a/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/register/InstanceRegisterH2DAO.java b/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/register/InstanceRegisterH2DAO.java index e1042f5dc..5f35369ac 100644 --- a/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/register/InstanceRegisterH2DAO.java +++ b/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/register/InstanceRegisterH2DAO.java @@ -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())); diff --git a/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/define/register/InstanceH2TableDefine.java b/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/define/register/InstanceH2TableDefine.java index 2b763d17f..54789fa01 100644 --- a/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/define/register/InstanceH2TableDefine.java +++ b/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/define/register/InstanceH2TableDefine.java @@ -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())); 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 81a1c66b7..93528977a 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 @@ -163,9 +163,7 @@ public class ServerService { private void buildAppServerInfo(List 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")) {