diff --git a/.gitignore b/.gitignore index 608628014..8d6d2d3fd 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ target/ packages/ **/dependency-reduced-pom.xml /skywalking-agent/ +/dist/ diff --git a/apm-application-toolkit/apm-toolkit-log4j-1.x/pom.xml b/apm-application-toolkit/apm-toolkit-log4j-1.x/pom.xml index c019fe1a5..5d536b510 100644 --- a/apm-application-toolkit/apm-toolkit-log4j-1.x/pom.xml +++ b/apm-application-toolkit/apm-toolkit-log4j-1.x/pom.xml @@ -59,13 +59,4 @@ - - - - bintray-wu-sheng-sky-walking-repository - wu-sheng-sky-walking-repository - https://api.bintray.com/maven/wu-sheng/skywalking/org.apache.skywalking.apm-toolkit-log4j-1.x/;publish=1 - - - diff --git a/apm-application-toolkit/apm-toolkit-log4j-2.x/pom.xml b/apm-application-toolkit/apm-toolkit-log4j-2.x/pom.xml index a85dff077..02087118a 100644 --- a/apm-application-toolkit/apm-toolkit-log4j-2.x/pom.xml +++ b/apm-application-toolkit/apm-toolkit-log4j-2.x/pom.xml @@ -60,12 +60,4 @@ - - - bintray-wu-sheng-sky-walking-repository - wu-sheng-sky-walking-repository - https://api.bintray.com/maven/wu-sheng/skywalking/org.apache.skywalking.apm-toolkit-log4j-2.x/;publish=1 - - - diff --git a/apm-application-toolkit/apm-toolkit-logback-1.x/pom.xml b/apm-application-toolkit/apm-toolkit-logback-1.x/pom.xml index c0ec486fb..caa88a3ce 100644 --- a/apm-application-toolkit/apm-toolkit-logback-1.x/pom.xml +++ b/apm-application-toolkit/apm-toolkit-logback-1.x/pom.xml @@ -59,13 +59,4 @@ - - - - bintray-wu-sheng-sky-walking-repository - wu-sheng-sky-walking-repository - https://api.bintray.com/maven/wu-sheng/skywalking/org.apache.skywalking.apm-toolkit-logback-1.x/;publish=1 - - - diff --git a/apm-application-toolkit/apm-toolkit-opentracing/pom.xml b/apm-application-toolkit/apm-toolkit-opentracing/pom.xml index b05e70ca0..dee31cb5e 100644 --- a/apm-application-toolkit/apm-toolkit-opentracing/pom.xml +++ b/apm-application-toolkit/apm-toolkit-opentracing/pom.xml @@ -42,12 +42,5 @@ - - - bintray-wu-sheng-sky-walking-repository - wu-sheng-sky-walking-repository - https://api.bintray.com/maven/wu-sheng/skywalking/org.apache.skywalking.apm-toolkit-opentracing/;publish=1 - - - + diff --git a/apm-application-toolkit/apm-toolkit-trace/pom.xml b/apm-application-toolkit/apm-toolkit-trace/pom.xml index 394ccb2a3..fbee8e8e2 100644 --- a/apm-application-toolkit/apm-toolkit-trace/pom.xml +++ b/apm-application-toolkit/apm-toolkit-trace/pom.xml @@ -52,13 +52,4 @@ - - - bintray-wu-sheng-sky-walking-repository - wu-sheng-sky-walking-repository - - https://api.bintray.com/maven/wu-sheng/skywalking/org.apache.skywalking.apm-toolkit-trace/;publish=1 - - - diff --git a/apm-collector/apm-collector-agent/agent-grpc/agent-grpc-provider/src/main/java/org/apache/skywalking/apm/collector/agent/grpc/provider/handler/JVMMetricsServiceHandler.java b/apm-collector/apm-collector-agent/agent-grpc/agent-grpc-provider/src/main/java/org/apache/skywalking/apm/collector/agent/grpc/provider/handler/JVMMetricsServiceHandler.java index 1ff4a7f94..555884224 100644 --- a/apm-collector/apm-collector-agent/agent-grpc/agent-grpc-provider/src/main/java/org/apache/skywalking/apm/collector/agent/grpc/provider/handler/JVMMetricsServiceHandler.java +++ b/apm-collector/apm-collector-agent/agent-grpc/agent-grpc-provider/src/main/java/org/apache/skywalking/apm/collector/agent/grpc/provider/handler/JVMMetricsServiceHandler.java @@ -25,6 +25,8 @@ import org.apache.skywalking.apm.collector.analysis.jvm.define.service.ICpuMetri import org.apache.skywalking.apm.collector.analysis.jvm.define.service.IGCMetricService; import org.apache.skywalking.apm.collector.analysis.jvm.define.service.IMemoryMetricService; import org.apache.skywalking.apm.collector.analysis.jvm.define.service.IMemoryPoolMetricService; +import org.apache.skywalking.apm.collector.analysis.metric.define.AnalysisMetricModule; +import org.apache.skywalking.apm.collector.analysis.metric.define.service.IInstanceHeartBeatService; import org.apache.skywalking.apm.collector.core.module.ModuleManager; import org.apache.skywalking.apm.collector.core.util.TimeBucketUtils; import org.apache.skywalking.apm.collector.server.grpc.GRPCHandler; @@ -49,12 +51,14 @@ public class JVMMetricsServiceHandler extends JVMMetricsServiceGrpc.JVMMetricsSe private final IGCMetricService gcMetricService; private final IMemoryMetricService memoryMetricService; private final IMemoryPoolMetricService memoryPoolMetricService; + private final IInstanceHeartBeatService instanceHeartBeatService; public JVMMetricsServiceHandler(ModuleManager moduleManager) { this.cpuMetricService = moduleManager.find(AnalysisJVMModule.NAME).getService(ICpuMetricService.class); this.gcMetricService = moduleManager.find(AnalysisJVMModule.NAME).getService(IGCMetricService.class); this.memoryMetricService = moduleManager.find(AnalysisJVMModule.NAME).getService(IMemoryMetricService.class); this.memoryPoolMetricService = moduleManager.find(AnalysisJVMModule.NAME).getService(IMemoryPoolMetricService.class); + this.instanceHeartBeatService = moduleManager.find(AnalysisMetricModule.NAME).getService(IInstanceHeartBeatService.class); } @Override public void collect(JVMMetrics request, StreamObserver responseObserver) { @@ -67,6 +71,7 @@ public class JVMMetricsServiceHandler extends JVMMetricsServiceGrpc.JVMMetricsSe sendToMemoryMetricService(instanceId, time, metric.getMemoryList()); sendToMemoryPoolMetricService(instanceId, time, metric.getMemoryPoolList()); sendToGCMetricService(instanceId, time, metric.getGcList()); + sendToInstanceHeartBeatService(instanceId, metric.getTime()); }); responseObserver.onNext(Downstream.newBuilder().build()); @@ -90,4 +95,8 @@ public class JVMMetricsServiceHandler extends JVMMetricsServiceGrpc.JVMMetricsSe private void sendToGCMetricService(int instanceId, long timeBucket, List gcs) { gcs.forEach(gc -> gcMetricService.send(instanceId, timeBucket, gc.getPhraseValue(), gc.getCount(), gc.getTime())); } + + private void sendToInstanceHeartBeatService(int instanceId, long heartBeatTime) { + instanceHeartBeatService.heartBeat(instanceId, heartBeatTime); + } } diff --git a/apm-collector/apm-collector-agent/agent-grpc/agent-grpc-provider/src/main/java/org/apache/skywalking/apm/collector/agent/grpc/provider/handler/ServiceNameDiscoveryServiceHandler.java b/apm-collector/apm-collector-agent/agent-grpc/agent-grpc-provider/src/main/java/org/apache/skywalking/apm/collector/agent/grpc/provider/handler/ServiceNameDiscoveryServiceHandler.java index bd644ebb3..35dedf385 100644 --- a/apm-collector/apm-collector-agent/agent-grpc/agent-grpc-provider/src/main/java/org/apache/skywalking/apm/collector/agent/grpc/provider/handler/ServiceNameDiscoveryServiceHandler.java +++ b/apm-collector/apm-collector-agent/agent-grpc/agent-grpc-provider/src/main/java/org/apache/skywalking/apm/collector/agent/grpc/provider/handler/ServiceNameDiscoveryServiceHandler.java @@ -54,7 +54,7 @@ public class ServiceNameDiscoveryServiceHandler extends ServiceNameDiscoveryServ int applicationId = serviceNameElement.getApplicationId(); String serviceName = serviceNameElement.getServiceName(); int srcSpanType = serviceNameElement.getSrcSpanTypeValue(); - int serviceId = serviceNameService.getOrCreate(applicationId, srcSpanType, serviceName); + int serviceId = serviceNameService.get(applicationId, srcSpanType, serviceName); if (serviceId != 0) { ServiceNameMappingElement.Builder mappingElement = ServiceNameMappingElement.newBuilder(); diff --git a/apm-collector/apm-collector-analysis/analysis-register/register-define/src/main/java/org/apache/skywalking/apm/collector/analysis/register/define/service/IServiceNameService.java b/apm-collector/apm-collector-analysis/analysis-register/register-define/src/main/java/org/apache/skywalking/apm/collector/analysis/register/define/service/IServiceNameService.java index 42656c397..184a397c6 100644 --- a/apm-collector/apm-collector-analysis/analysis-register/register-define/src/main/java/org/apache/skywalking/apm/collector/analysis/register/define/service/IServiceNameService.java +++ b/apm-collector/apm-collector-analysis/analysis-register/register-define/src/main/java/org/apache/skywalking/apm/collector/analysis/register/define/service/IServiceNameService.java @@ -24,5 +24,8 @@ import org.apache.skywalking.apm.collector.core.module.Service; * @author peng-yongsheng */ public interface IServiceNameService extends Service { + int getOrCreate(int applicationId, int srcSpanType, String serviceName); + + int get(int applicationId, int srcSpanType, String serviceName); } diff --git a/apm-collector/apm-collector-analysis/analysis-register/register-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/register/provider/service/ServiceNameService.java b/apm-collector/apm-collector-analysis/analysis-register/register-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/register/provider/service/ServiceNameService.java index 7e0579b2a..ac751bfc4 100644 --- a/apm-collector/apm-collector-analysis/analysis-register/register-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/register/provider/service/ServiceNameService.java +++ b/apm-collector/apm-collector-analysis/analysis-register/register-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/register/provider/service/ServiceNameService.java @@ -74,4 +74,8 @@ public class ServiceNameService implements IServiceNameService { } return serviceId; } + + @Override public int get(int applicationId, int srcSpanType, String serviceName) { + return getServiceIdCacheService().get(applicationId, srcSpanType, serviceName); + } } diff --git a/apm-collector/apm-collector-analysis/analysis-segment-parser/segment-parser-define/src/main/java/org/apache/skywalking/apm/collector/analysis/segment/parser/define/decorator/ReferenceDecorator.java b/apm-collector/apm-collector-analysis/analysis-segment-parser/segment-parser-define/src/main/java/org/apache/skywalking/apm/collector/analysis/segment/parser/define/decorator/ReferenceDecorator.java index 1c005c796..5f21f8229 100644 --- a/apm-collector/apm-collector-analysis/analysis-segment-parser/segment-parser-define/src/main/java/org/apache/skywalking/apm/collector/analysis/segment/parser/define/decorator/ReferenceDecorator.java +++ b/apm-collector/apm-collector-analysis/analysis-segment-parser/segment-parser-define/src/main/java/org/apache/skywalking/apm/collector/analysis/segment/parser/define/decorator/ReferenceDecorator.java @@ -27,6 +27,7 @@ import org.apache.skywalking.apm.network.proto.UniqueId; * @author peng-yongsheng */ public class ReferenceDecorator implements StandardBuilder { + private boolean isOrigin = true; private StandardBuilder standardBuilder; private TraceSegmentReference referenceObject; diff --git a/apm-collector/apm-collector-analysis/analysis-segment-parser/segment-parser-provider/src/test/java/org/apache/skywalking/apm/collector/analysis/segment/parser/provider/service/SegmentBase64Printer.java b/apm-collector/apm-collector-analysis/analysis-segment-parser/segment-parser-provider/src/test/java/org/apache/skywalking/apm/collector/analysis/segment/parser/provider/service/SegmentBase64Printer.java new file mode 100644 index 000000000..c729bf142 --- /dev/null +++ b/apm-collector/apm-collector-analysis/analysis-segment-parser/segment-parser-provider/src/test/java/org/apache/skywalking/apm/collector/analysis/segment/parser/provider/service/SegmentBase64Printer.java @@ -0,0 +1,78 @@ +/* + * 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.analysis.segment.parser.provider.service; + +import com.google.protobuf.InvalidProtocolBufferException; +import java.util.Base64; +import java.util.List; +import org.apache.skywalking.apm.network.proto.SpanObject; +import org.apache.skywalking.apm.network.proto.TraceSegmentObject; +import org.apache.skywalking.apm.network.proto.UniqueId; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author peng-yongsheng + */ +public class SegmentBase64Printer { + + private static final Logger LOGGER = LoggerFactory.getLogger(SegmentBase64Printer.class); + + public static void main(String[] args) throws InvalidProtocolBufferException { + String segmentBase64 = "CgwKCgIBsv/x1L2vgBsSggEQ////////////ARirnsP1niwg9Z7D9Z4sOhhIMi9KREJJL0Nvbm5lY3Rpb24vY2xvc2VKDGxvY2FsaG9zdDotMVABWAFgBHoOCgdkYi50eXBlEgNzcWx6GQoLZGIuaW5zdGFuY2USCmRhdGFTb3VyY2V6DgoMZGIuc3RhdGVtZW50GP///////////wEgAg=="; + byte[] binarySegment = Base64.getDecoder().decode(segmentBase64); + TraceSegmentObject segmentObject = TraceSegmentObject.parseFrom(binarySegment); + + UniqueId segmentId = segmentObject.getTraceSegmentId(); + StringBuilder segmentIdBuilder = new StringBuilder(); + for (int i = 0; i < segmentId.getIdPartsList().size(); i++) { + if (i == 0) { + segmentIdBuilder.append(segmentId.getIdPartsList().get(i)); + } else { + segmentIdBuilder.append(".").append(segmentId.getIdPartsList().get(i)); + } + } + LOGGER.info("SegmentId: {}", segmentIdBuilder.toString()); + LOGGER.info("ApplicationId: {}", segmentObject.getApplicationId()); + LOGGER.info("ApplicationInstanceId: {}", segmentObject.getApplicationInstanceId()); + List spansList = segmentObject.getSpansList(); + LOGGER.info("Spans:"); + spansList.forEach(span -> { + LOGGER.info(" Span:"); + LOGGER.info(" SpanId: {}", span.getSpanId()); + LOGGER.info(" ParentSpanId: {}", span.getParentSpanId()); + LOGGER.info(" SpanLayer: {}", span.getSpanLayer()); + LOGGER.info(" SpanType: {}", span.getSpanType()); + LOGGER.info(" StartTime: {}", span.getStartTime()); + LOGGER.info(" EndTime: {}", span.getEndTime()); + LOGGER.info(" ComponentId: {}", span.getComponentId()); + LOGGER.info(" Component: {}", span.getComponent()); + LOGGER.info(" OperationNameId: {}", span.getOperationNameId()); + LOGGER.info(" OperationName: {}", span.getOperationName()); + LOGGER.info(" PeerId: {}", span.getPeerId()); + LOGGER.info(" Peer: {}", span.getPeer()); + LOGGER.info(" IsError: {}", span.getIsError()); + + LOGGER.info(" reference:"); + span.getRefsList().forEach(reference -> { + LOGGER.info(" EntryApplicationInstanceId: {}", reference.getEntryApplicationInstanceId()); + }); + }); + } +} diff --git a/apm-collector/apm-collector-analysis/analysis-segment-parser/segment-parser-provider/src/test/resources/log4j2.xml b/apm-collector/apm-collector-analysis/analysis-segment-parser/segment-parser-provider/src/test/resources/log4j2.xml new file mode 100644 index 000000000..6697ebf27 --- /dev/null +++ b/apm-collector/apm-collector-analysis/analysis-segment-parser/segment-parser-provider/src/test/resources/log4j2.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ui/MemoryMetricEsUIDAO.java b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ui/MemoryMetricEsUIDAO.java index 66f2290d4..6e5e891d4 100644 --- a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ui/MemoryMetricEsUIDAO.java +++ b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ui/MemoryMetricEsUIDAO.java @@ -66,8 +66,14 @@ public class MemoryMetricEsUIDAO extends EsDAO implements IMemoryMetricUIDAO { long max = ((Number)response.getResponse().getSource().get(MemoryMetricTable.COLUMN_MAX)).longValue(); long used = ((Number)response.getResponse().getSource().get(MemoryMetricTable.COLUMN_USED)).longValue(); long times = ((Number)response.getResponse().getSource().get(MemoryMetricTable.COLUMN_TIMES)).longValue(); + trend.getMetrics().add((int)(used / times)); - trend.getMaxMetrics().add((int)(max / times)); + + if (max < 0) { + trend.getMaxMetrics().add((int)(used / times)); + } else { + trend.getMaxMetrics().add((int)(max / times)); + } } else { trend.getMetrics().add(0); trend.getMaxMetrics().add(0); diff --git a/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/ui/MemoryMetricH2UIDAO.java b/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/ui/MemoryMetricH2UIDAO.java index bc84318cf..87c733d83 100644 --- a/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/ui/MemoryMetricH2UIDAO.java +++ b/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/ui/MemoryMetricH2UIDAO.java @@ -71,7 +71,12 @@ public class MemoryMetricH2UIDAO extends H2DAO implements IMemoryMetricUIDAO { long used = rs.getLong(MemoryMetricTable.COLUMN_USED); long times = rs.getLong(MemoryMetricTable.COLUMN_TIMES); trend.getMetrics().add((int)(used / times)); - trend.getMaxMetrics().add((int)(max / times)); + + if (max < 0) { + trend.getMaxMetrics().add((int)(used / times)); + } else { + trend.getMaxMetrics().add((int)(max / times)); + } } else { trend.getMetrics().add(0); trend.getMaxMetrics().add(0); 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 678ab69d7..c56ae44a3 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 @@ -58,11 +58,11 @@ public class AlarmQuery implements Query { switch (alarmType) { case APPLICATION: - return getAlarmService().loadApplicationAlarmList(keyword, startTimeBucket, endTimeBucket, page.getLimit(), page.getFrom()); + return getAlarmService().loadApplicationAlarmList(keyword, duration.getStep(), startTimeBucket, endTimeBucket, page.getLimit(), page.getFrom()); case SERVER: - return getAlarmService().loadInstanceAlarmList(keyword, startTimeBucket, endTimeBucket, page.getLimit(), page.getFrom()); + return getAlarmService().loadInstanceAlarmList(keyword, duration.getStep(), startTimeBucket, endTimeBucket, page.getLimit(), page.getFrom()); case SERVICE: - return getAlarmService().loadServiceAlarmList(keyword, startTimeBucket, endTimeBucket, page.getLimit(), page.getFrom()); + return getAlarmService().loadServiceAlarmList(keyword, duration.getStep(), startTimeBucket, endTimeBucket, 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/query/TraceQuery.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/query/TraceQuery.java index 74c002e9b..a39c1cf0d 100644 --- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/query/TraceQuery.java +++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/query/TraceQuery.java @@ -31,6 +31,7 @@ import org.apache.skywalking.apm.collector.ui.graphql.Query; import org.apache.skywalking.apm.collector.ui.service.SegmentTopService; import org.apache.skywalking.apm.collector.ui.service.TraceStackService; import org.apache.skywalking.apm.collector.ui.utils.DurationUtils; +import org.apache.skywalking.apm.collector.ui.utils.PaginationUtils; /** * @author peng-yongsheng @@ -64,11 +65,11 @@ public class TraceQuery implements Query { long endSecondTimeBucket = 0; String traceId = Const.EMPTY_STRING; - if (ObjectUtils.isNotEmpty(condition.getQueryDuration())) { + if (StringUtils.isNotEmpty(condition.getTraceId())) { + traceId = condition.getTraceId(); + } else if (ObjectUtils.isNotEmpty(condition.getQueryDuration())) { startSecondTimeBucket = DurationUtils.INSTANCE.durationToSecondTimeBucket(condition.getQueryDuration().getStep(), condition.getQueryDuration().getStart()); endSecondTimeBucket = DurationUtils.INSTANCE.durationToSecondTimeBucket(condition.getQueryDuration().getStep(), condition.getQueryDuration().getEnd()); - } else if (StringUtils.isNotEmpty(condition.getTraceId())) { - traceId = condition.getTraceId(); } else { throw new UnexpectedException("The condition must contains either queryDuration or traceId."); } @@ -77,10 +78,9 @@ public class TraceQuery implements Query { long maxDuration = condition.getMaxTraceDuration(); String operationName = condition.getOperationName(); int applicationId = condition.getApplicationId(); - int limit = condition.getPaging().getPageSize(); - int from = condition.getPaging().getPageSize() * condition.getPaging().getPageNum(); - return getSegmentTopService().loadTop(startSecondTimeBucket, endSecondTimeBucket, minDuration, maxDuration, operationName, traceId, applicationId, limit, from); + PaginationUtils.Page page = PaginationUtils.INSTANCE.exchange(condition.getPaging()); + return getSegmentTopService().loadTop(startSecondTimeBucket, endSecondTimeBucket, minDuration, maxDuration, operationName, traceId, applicationId, page.getLimit(), page.getFrom()); } public Trace queryTrace(String traceId) { 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 62bd60bfa..f9080794f 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 @@ -32,6 +32,7 @@ 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.IApplicationMappingUIDAO; 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; @@ -56,6 +57,7 @@ public class AlarmService { private final Gson gson = new Gson(); private final IInstanceUIDAO instanceDAO; private final IApplicationAlarmUIDAO applicationAlarmUIDAO; + private final IApplicationMappingUIDAO applicationMappingUIDAO; private final IInstanceAlarmUIDAO instanceAlarmUIDAO; private final IServiceAlarmUIDAO serviceAlarmUIDAO; private final IApplicationAlarmListUIDAO applicationAlarmListUIDAO; @@ -67,6 +69,7 @@ public class AlarmService { public AlarmService(ModuleManager moduleManager) { this.instanceDAO = moduleManager.find(StorageModule.NAME).getService(IInstanceUIDAO.class); this.applicationAlarmUIDAO = moduleManager.find(StorageModule.NAME).getService(IApplicationAlarmUIDAO.class); + this.applicationMappingUIDAO = moduleManager.find(StorageModule.NAME).getService(IApplicationMappingUIDAO.class); 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); @@ -74,12 +77,16 @@ public class AlarmService { this.serviceNameCacheService = moduleManager.find(CacheModule.NAME).getService(ServiceNameCacheService.class); } - public Alarm loadApplicationAlarmList(String keyword, long startTimeBucket, long endTimeBucket, + public Alarm loadApplicationAlarmList(String keyword, Step step, long startTimeBucket, long endTimeBucket, int limit, int from) throws ParseException { logger.debug("keyword: {}, startTimeBucket: {}, endTimeBucket: {}, limit: {}, from: {}", keyword, startTimeBucket, endTimeBucket, limit, from); Alarm alarm = applicationAlarmUIDAO.loadAlarmList(keyword, startTimeBucket, endTimeBucket, limit, from); + List applicationMappings = applicationMappingUIDAO.load(step, startTimeBucket, endTimeBucket); + Map mappings = new HashMap<>(); + applicationMappings.forEach(applicationMapping -> mappings.put(applicationMapping.getMappingApplicationId(), applicationMapping.getApplicationId())); + alarm.getItems().forEach(item -> { - String applicationCode = applicationCacheService.getApplicationById(item.getId()).getApplicationCode(); + String applicationCode = applicationCacheService.getApplicationById(mappings.getOrDefault(item.getId(), item.getId())).getApplicationCode(); switch (item.getCauseType()) { case SLOW_RESPONSE: item.setTitle("Application " + applicationCode + RESPONSE_TIME_ALARM); @@ -92,13 +99,18 @@ public class AlarmService { return alarm; } - public Alarm loadInstanceAlarmList(String keyword, long startTimeBucket, long endTimeBucket, + public Alarm loadInstanceAlarmList(String keyword, Step step, long startTimeBucket, long endTimeBucket, int limit, int from) throws ParseException { logger.debug("keyword: {}, startTimeBucket: {}, endTimeBucket: {}, limit: {}, from: {}", keyword, startTimeBucket, endTimeBucket, limit, from); Alarm alarm = instanceAlarmUIDAO.loadAlarmList(keyword, startTimeBucket, endTimeBucket, limit, from); + + List applicationMappings = applicationMappingUIDAO.load(step, startTimeBucket, endTimeBucket); + Map mappings = new HashMap<>(); + applicationMappings.forEach(applicationMapping -> mappings.put(applicationMapping.getMappingApplicationId(), applicationMapping.getApplicationId())); + alarm.getItems().forEach(item -> { Instance instance = instanceDAO.getInstance(item.getId()); - String applicationCode = applicationCacheService.getApplicationById(instance.getApplicationId()).getApplicationCode(); + String applicationCode = applicationCacheService.getApplicationById(mappings.getOrDefault(instance.getApplicationId(), instance.getApplicationId())).getApplicationCode(); String serverName = buildServerName(instance.getOsInfo()); switch (item.getCauseType()) { case SLOW_RESPONSE: @@ -113,13 +125,18 @@ public class AlarmService { return alarm; } - public Alarm loadServiceAlarmList(String keyword, long startTimeBucket, long endTimeBucket, + public Alarm loadServiceAlarmList(String keyword, Step step, long startTimeBucket, long endTimeBucket, int limit, int from) throws ParseException { logger.debug("keyword: {}, startTimeBucket: {}, endTimeBucket: {}, limit: {}, from: {}", keyword, startTimeBucket, endTimeBucket, limit, from); Alarm alarm = serviceAlarmUIDAO.loadAlarmList(keyword, startTimeBucket, endTimeBucket, limit, from); + + List applicationMappings = applicationMappingUIDAO.load(step, startTimeBucket, endTimeBucket); + Map mappings = new HashMap<>(); + applicationMappings.forEach(applicationMapping -> mappings.put(applicationMapping.getMappingApplicationId(), applicationMapping.getApplicationId())); + alarm.getItems().forEach(item -> { ServiceName serviceName = serviceNameCacheService.get(item.getId()); - String applicationCode = applicationCacheService.getApplicationById(serviceName.getApplicationId()).getApplicationCode(); + String applicationCode = applicationCacheService.getApplicationById(mappings.getOrDefault(serviceName.getApplicationId(), serviceName.getApplicationId())).getApplicationCode(); switch (item.getCauseType()) { case SLOW_RESPONSE: item.setTitle("Service " + serviceName.getServiceName() + " of Application " + applicationCode + RESPONSE_TIME_ALARM); @@ -146,7 +163,11 @@ public class AlarmService { AlarmTrend alarmTrend = new AlarmTrend(); durationPoints.forEach(durationPoint -> { - alarmTrend.getNumOfAlarmRate().add((trendsMap.getOrDefault(durationPoint.getPoint(), 0) * 10000) / (applications.size())); + if (applications.size() == 0) { + alarmTrend.getNumOfAlarmRate().add(0); + } else { + alarmTrend.getNumOfAlarmRate().add((trendsMap.getOrDefault(durationPoint.getPoint(), 0) * 10000) / (applications.size())); + } }); return alarmTrend; } 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 4493781c6..bb69d9b3c 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 @@ -72,11 +72,12 @@ public class ApplicationService { int... applicationIds) { List applications = instanceDAO.getApplications(startSecondTimeBucket, endSecondTimeBucket, applicationIds); - applications.forEach(application -> { + for (int i = applications.size() - 1; i >= 0; i--) { + Application application = applications.get(i); if (application.getId() == Const.NONE_APPLICATION_ID) { - applications.remove(application); + applications.remove(i); } - }); + } applications.forEach(application -> { String applicationCode = applicationCacheService.getApplicationById(application.getId()).getApplicationCode(); @@ -112,11 +113,12 @@ public class ApplicationService { return applicationThroughput; } - public ConjecturalAppBrief getConjecturalApps(Step step, long startSecondTimeBucket, long endSecondTimeBucket) 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()); - conjecturalApp.setName(name); + String serverType = ServerTypeDefine.getInstance().getServerType(conjecturalApp.getId()); + conjecturalApp.setName(serverType); }); ConjecturalAppBrief conjecturalAppBrief = new ConjecturalAppBrief(); 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 7d4fe4180..d50b431b8 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 @@ -82,6 +82,6 @@ public class ApplicationTopologyService { TopologyBuilder builder = new TopologyBuilder(moduleManager); - return builder.build(applicationComponents, applicationMappings, applicationMetrics, callerReferenceMetric, calleeReferenceMetric, startTimeBucket, endTimeBucket, startSecondTimeBucket, endSecondTimeBucket); + return builder.build(applicationComponents, applicationMappings, applicationMetrics, callerReferenceMetric, calleeReferenceMetric, step, 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 8e1609c72..fe9fa09bf 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, startTimeBucket, endTimeBucket, startSecondTimeBucket, endSecondTimeBucket); + return builder.build(applicationComponents, applicationMappings, applicationMetrics, callerReferenceMetric, calleeReferenceMetric, step, 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/SecondBetweenService.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/SecondBetweenService.java index f4db0a00a..63de26189 100644 --- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/SecondBetweenService.java +++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/SecondBetweenService.java @@ -53,6 +53,10 @@ class SecondBetweenService { Date startDate = new SimpleDateFormat("yyyyMMddHHmmss").parse(String.valueOf(startSecondTimeBucket)); Date endDate = new SimpleDateFormat("yyyyMMddHHmmss").parse(String.valueOf(endSecondTimeBucket)); - return Seconds.secondsBetween(new DateTime(startDate), new DateTime(endDate)).getSeconds(); + int seconds = Seconds.secondsBetween(new DateTime(startDate), new DateTime(endDate)).getSeconds(); + if (seconds == 0) { + seconds = 1; + } + return seconds; } } 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 93528977a..dd5f3ca05 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 @@ -59,8 +59,8 @@ public class ServerService { private final ICpuMetricUIDAO cpuMetricUIDAO; private final IGCMetricUIDAO gcMetricUIDAO; private final IMemoryMetricUIDAO memoryMetricUIDAO; - private final InstanceCacheService instanceCacheService; private final ApplicationCacheService applicationCacheService; + private final InstanceCacheService instanceCacheService; private final SecondBetweenService secondBetweenService; public ServerService(ModuleManager moduleManager) { @@ -69,18 +69,19 @@ public class ServerService { this.cpuMetricUIDAO = moduleManager.find(StorageModule.NAME).getService(ICpuMetricUIDAO.class); this.gcMetricUIDAO = moduleManager.find(StorageModule.NAME).getService(IGCMetricUIDAO.class); this.memoryMetricUIDAO = moduleManager.find(StorageModule.NAME).getService(IMemoryMetricUIDAO.class); - this.instanceCacheService = moduleManager.find(CacheModule.NAME).getService(InstanceCacheService.class); this.applicationCacheService = moduleManager.find(CacheModule.NAME).getService(ApplicationCacheService.class); + this.instanceCacheService = moduleManager.find(CacheModule.NAME).getService(InstanceCacheService.class); this.secondBetweenService = new SecondBetweenService(moduleManager); } public List searchServer(String keyword, long startSecondTimeBucket, long endSecondTimeBucket) { List serverInfos = instanceUIDAO.searchServer(keyword, startSecondTimeBucket, endSecondTimeBucket); - serverInfos.forEach(serverInfo -> { - if (serverInfo.getId() == Const.NONE_INSTANCE_ID) { - serverInfos.remove(serverInfo); + + for (int i = serverInfos.size() - 1; i >= 0; i--) { + if (serverInfos.get(i).getId() == Const.NONE_INSTANCE_ID) { + serverInfos.remove(i); } - }); + } buildAppServerInfo(serverInfos); return serverInfos; @@ -107,7 +108,8 @@ public class ServerService { List serverThroughput = instanceMetricUIDAO.getServerThroughput(applicationId, step, startTimeBucket, endTimeBucket, secondBetween, topN, MetricSource.Callee); serverThroughput.forEach(appServerInfo -> { - String applicationCode = applicationCacheService.getApplicationById(applicationId).getApplicationCode(); + appServerInfo.setApplicationId(instanceCacheService.getApplicationId(appServerInfo.getId())); + String applicationCode = applicationCacheService.getApplicationById(appServerInfo.getApplicationId()).getApplicationCode(); appServerInfo.setApplicationCode(applicationCode); Instance instance = instanceUIDAO.getInstance(appServerInfo.getId()); appServerInfo.setOsInfo(instance.getOsInfo()); @@ -164,6 +166,8 @@ public class ServerService { private void buildAppServerInfo(List serverInfos) { serverInfos.forEach(serverInfo -> { serverInfo.setApplicationCode(applicationCacheService.getApplicationById(serverInfo.getApplicationId()).getApplicationCode()); + StringBuilder nameBuilder = new StringBuilder(); + nameBuilder.append(serverInfo.getApplicationCode()); if (StringUtils.isNotEmpty(serverInfo.getOsInfo())) { JsonObject osInfoJson = gson.fromJson(serverInfo.getOsInfo(), JsonObject.class); if (osInfoJson.has("osName")) { @@ -180,10 +184,14 @@ public class ServerService { JsonArray ipv4Array = osInfoJson.get("ipv4s").getAsJsonArray(); List ipv4s = new LinkedList<>(); - ipv4Array.forEach(ipv4 -> ipv4s.add(ipv4.getAsString())); + ipv4Array.forEach(ipv4 -> { + ipv4s.add(ipv4.getAsString()); + nameBuilder.append(Const.ID_SPLIT).append(ipv4.getAsString()); + }); serverInfo.setIpv4(ipv4s); } } + serverInfo.setName(nameBuilder.toString()); }); } } 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 c8f54712b..1eb54b359 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 @@ -73,8 +73,8 @@ public class ServiceTopologyService { Map components = new HashMap<>(); applicationComponents.forEach(component -> components.put(component.getApplicationId(), ComponentsDefine.getInstance().getComponentName(component.getComponentId()))); - List referenceMetrics = serviceReferenceMetricUIDAO.getFrontServices(step, startTimeBucket, endTimeBucket, MetricSource.Callee, serviceId); - referenceMetrics.addAll(serviceReferenceMetricUIDAO.getBehindServices(step, startTimeBucket, endTimeBucket, MetricSource.Caller, serviceId)); + List referenceMetrics = serviceReferenceMetricUIDAO.getFrontServices(step, startTimeBucket, endTimeBucket, MetricSource.Caller, serviceId); + referenceMetrics.addAll(serviceReferenceMetricUIDAO.getBehindServices(step, startTimeBucket, endTimeBucket, MetricSource.Callee, serviceId)); Set nodeIds = new HashSet<>(); 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 cbd013e2d..5e7f699d4 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 @@ -20,9 +20,11 @@ package org.apache.skywalking.apm.collector.ui.service; import java.text.ParseException; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Set; import org.apache.skywalking.apm.collector.cache.CacheModule; import org.apache.skywalking.apm.collector.cache.service.ApplicationCacheService; import org.apache.skywalking.apm.collector.core.module.ModuleManager; @@ -38,6 +40,7 @@ import org.apache.skywalking.apm.collector.storage.ui.application.ApplicationNod import org.apache.skywalking.apm.collector.storage.ui.application.ConjecturalNode; import org.apache.skywalking.apm.collector.storage.ui.common.Call; import org.apache.skywalking.apm.collector.storage.ui.common.Node; +import org.apache.skywalking.apm.collector.storage.ui.common.Step; import org.apache.skywalking.apm.collector.storage.ui.common.Topology; import org.apache.skywalking.apm.collector.storage.ui.common.VisualUserNode; import org.apache.skywalking.apm.collector.ui.utils.ApdexCalculator; @@ -70,7 +73,7 @@ class TopologyBuilder { List applicationMetrics, List callerReferenceMetric, List calleeReferenceMetric, - long startTimeBucket, long endTimeBucket, long startSecondTimeBucket, long endSecondTimeBucket) { + Step step, long startTimeBucket, long endTimeBucket, long startSecondTimeBucket, long endSecondTimeBucket) { Map components = changeNodeComp2Map(applicationComponents); Map mappings = changeMapping2Map(applicationMappings); @@ -95,7 +98,7 @@ class TopologyBuilder { 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); + Alarm alarm = alarmService.loadApplicationAlarmList(Const.EMPTY_STRING, step, startTimeBucket, endTimeBucket, 1, 0); if (alarm.getItems().size() > 0) { applicationNode.setAlarm(true); } @@ -105,14 +108,14 @@ class TopologyBuilder { applicationNode.setNumOfServer(serverService.getAllServer(applicationId, startSecondTimeBucket, endSecondTimeBucket).size()); try { - Alarm alarm = alarmService.loadInstanceAlarmList(Const.EMPTY_STRING, startTimeBucket, endTimeBucket, 1000, 0); + Alarm alarm = alarmService.loadInstanceAlarmList(Const.EMPTY_STRING, step, 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); + Alarm alarm = alarmService.loadServiceAlarmList(Const.EMPTY_STRING, step, startTimeBucket, endTimeBucket, 1000, 0); applicationNode.setNumOfServiceAlarm(alarm.getItems().size()); } catch (ParseException e) { logger.error(e.getMessage(), e); @@ -133,6 +136,17 @@ class TopologyBuilder { nodes.add(conjecturalNode); } + Set nodeIds = buildNodeIds(nodes); + if (!nodeIds.contains(source.getApplicationId())) { + ApplicationNode applicationNode = new ApplicationNode(); + applicationNode.setId(source.getApplicationId()); + applicationNode.setName(source.getApplicationCode()); + applicationNode.setType(components.getOrDefault(source.getApplicationId(), Const.UNKNOWN)); + applicationNode.setApdex(100); + applicationNode.setSla(100); + nodes.add(applicationNode); + } + Call call = new Call(); call.setSource(source.getApplicationId()); call.setSourceName(source.getApplicationCode()); @@ -198,6 +212,12 @@ class TopologyBuilder { return topology; } + private Set buildNodeIds(List nodes) { + Set nodeIds = new HashSet<>(); + nodes.forEach(node -> nodeIds.add(node.getId())); + return nodeIds; + } + private List calleeReferenceMetricFilter( List calleeReferenceMetric) { List filteredMetrics = new LinkedList<>(); diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/utils/ApdexCalculator.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/utils/ApdexCalculator.java index 126e0dea2..33e9cf059 100644 --- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/utils/ApdexCalculator.java +++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/utils/ApdexCalculator.java @@ -25,6 +25,10 @@ public enum ApdexCalculator { INSTANCE; public int calculate(long satisfiedCount, long toleratingCount, long frustratedCount) { - return (int)(((satisfiedCount + toleratingCount / 2) * 100) / (satisfiedCount + toleratingCount + frustratedCount)); + if (satisfiedCount + toleratingCount + frustratedCount == 0) { + return 100; + } else { + return (int)(((satisfiedCount + toleratingCount / 2) * 100) / (satisfiedCount + toleratingCount + frustratedCount)); + } } } diff --git a/apm-dist/pom.xml b/apm-dist/pom.xml index 115592c26..7729c53da 100644 --- a/apm-dist/pom.xml +++ b/apm-dist/pom.xml @@ -9,7 +9,7 @@ 4.0.0 - apm-backend-dist + apm-dist pom diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/dictionary/OperationNameDictionary.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/dictionary/OperationNameDictionary.java index 7075f2860..ed4832f32 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/dictionary/OperationNameDictionary.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/dictionary/OperationNameDictionary.java @@ -74,6 +74,7 @@ public enum OperationNameDictionary { ServiceNameElement serviceNameElement = ServiceNameElement.newBuilder() .setApplicationId(operationNameKey.getApplicationId()) .setServiceName(operationNameKey.getOperationName()) + .setSrcSpanType(operationNameKey.getSpanType()) .build(); builder.addElements(serviceNameElement); } @@ -122,9 +123,14 @@ public enum OperationNameDictionary { OperationNameKey key = (OperationNameKey)o; - if (applicationId != key.applicationId) - return false; - return operationName.equals(key.operationName); + boolean isApplicationMatch = false; + if (applicationId == key.applicationId) { + isApplicationMatch = true; + } else if (operationName.equals(key.operationName)) { + isApplicationMatch = true; + } + return isApplicationMatch && isEntry == key.isEntry + && isExit == key.isExit; } @Override public int hashCode() { @@ -140,5 +146,15 @@ public enum OperationNameDictionary { boolean isExit() { return isExit; } + + SpanType getSpanType() { + if (isEntry) { + return SpanType.Entry; + } else if (isExit) { + return SpanType.Exit; + } else { + return SpanType.Local; + } + } } } diff --git a/apm-sniffer/config/agent.config b/apm-sniffer/config/agent.config index 8616a4b04..4600bbc92 100644 --- a/apm-sniffer/config/agent.config +++ b/apm-sniffer/config/agent.config @@ -17,7 +17,7 @@ agent.application_code=Your_ApplicationName # agent.is_open_debugging_class = true # Server addresses. -# Mapping to `agent_server/jetty/port` in `config/application.yml` of Collector. +# Mapping to `naming/jetty/ip:port` in `config/application.yml` of Collector. # Examples: # Single collector:SERVERS="127.0.0.1:8080" # Collector cluster:SERVERS="10.2.45.126:8080,10.2.45.127:7600" diff --git a/docs/README_ZH.md b/docs/README_ZH.md index db6bbb2db..ea7fed228 100644 --- a/docs/README_ZH.md +++ b/docs/README_ZH.md @@ -10,7 +10,7 @@ * [OpenTracing中文版](https://github.com/opentracing-contrib/opentracing-specification-zh) * Application Toolkit,应用程序工具包 * [概述](cn/Application-toolkit-CN.md) - * [OpenTracing Tracer](cn/skywalking-opentracing-CN.md) + * [OpenTracing Tracer](cn/Opentracing-CN.md) * 日志组件 * [log4j组件](cn/Application-toolkit-log4j-1.x-CN.md) * [log4j2组件](cn/Application-toolkit-log4j-2.x-CN.md) diff --git a/docs/cn/Deploy-collector-in-cluster-mode-CN.md b/docs/cn/Deploy-backend-in-cluster-mode-CN.md similarity index 90% rename from docs/cn/Deploy-collector-in-cluster-mode-CN.md rename to docs/cn/Deploy-backend-in-cluster-mode-CN.md index e73f3fd96..b892eac8c 100644 --- a/docs/cn/Deploy-collector-in-cluster-mode-CN.md +++ b/docs/cn/Deploy-backend-in-cluster-mode-CN.md @@ -78,3 +78,6 @@ storage: 3. 运行`bin/startup.sh`启动。windows用户为.bat文件。 + +- **注意:startup.sh将会启动collector和UI两个进程,UI通过127.0.0.1:10800访问本地collector,无需额外配置。 +如需保证UI负载均衡,推荐使用类nginx的HTTP代理服务。** \ No newline at end of file diff --git a/docs/cn/Deploy-collector-in-standalone-mode-CN.md b/docs/cn/Deploy-backend-in-standalone-mode-CN.md similarity index 83% rename from docs/cn/Deploy-collector-in-standalone-mode-CN.md rename to docs/cn/Deploy-backend-in-standalone-mode-CN.md index 86351b574..fb0166d80 100644 --- a/docs/cn/Deploy-collector-in-standalone-mode-CN.md +++ b/docs/cn/Deploy-backend-in-standalone-mode-CN.md @@ -1,5 +1,9 @@ # 用途说明 -单机模式默认使用本地H2数据库,不支持集群部署。主要用于:预览、功能测试、演示和低压力系统。如果使用单机collector用于非演示环境,你可选择使用Elasticsearch作为存储实现。 +单机模式默认使用本地H2数据库,不支持集群部署。主要用于:预览、功能测试、演示和低压力系统。 + +如果使用单机collector用于非演示环境,你可选择使用Elasticsearch作为存储实现。 + +**在5.0.0-alpha版本中,暂不提供H2实现** ## 所需的第三方软件 - JDK8+ @@ -14,6 +18,8 @@ Collector单机模拟启动简单,提供和集群模式相同的功能,单 1. 解压安装包`tar -xvf skywalking-collector.tar.gz`,windows用户可以选择zip包 1. 运行`bin/startup.sh`启动。windows用户为.bat文件。 +- **注意:startup.sh将会启动collector和UI两个进程,UI通过127.0.0.1:10800访问本地collector,无需额外配置。** + ## 使用Elastic Search代替H2存储 - 在单机模式下除了支持内置的H2数据库运行,也支持其他的存储(当前已支持的ElasticSearch 5.3),取消Storage相关配置节的注释,并修改配置。 ```yaml diff --git a/docs/cn/skywalking-opentracing-CN.md b/docs/cn/Opentracing-CN.md similarity index 65% rename from docs/cn/skywalking-opentracing-CN.md rename to docs/cn/Opentracing-CN.md index 588641915..3bb3d2a37 100644 --- a/docs/cn/skywalking-opentracing-CN.md +++ b/docs/cn/Opentracing-CN.md @@ -7,8 +7,6 @@ ``` -   [ ![Download](https://api.bintray.com/packages/wu-sheng/skywalking/org.apache.skywalking.apm-toolkit-opentracing/images/download.svg) ](https://bintray.com/wu-sheng/skywalking/org.apache.skywalking.apm-toolkit-opentracing/_latestVersion) - * 使用OpenTracing的标准API和桥接器,使用手动埋点 ```java Tracer tracer = new org.apache.skywalking.apm.toolkit.opentracing.SkywalkingTracer(); diff --git a/docs/cn/Quick-start-CN.md b/docs/cn/Quick-start-CN.md index 21c2b6799..211982c25 100644 --- a/docs/cn/Quick-start-CN.md +++ b/docs/cn/Quick-start-CN.md @@ -1,7 +1,7 @@ # 部署步骤 -1. 部署 Collector - 1. [单机模式](Deploy-collector-in-standalone-mode-CN.md) - 1. [集群模式](Deploy-collector-in-cluster-mode-CN.md) -1. 部署 webui server, [doc](https://github.com/apache/incubator-skywalking-ui#quickstart) +1. 在Maven Central中下载 `org.apache.skywalking.apm-dist`. 或者本地编译程序,在`dist`目录中找到`skywalking-dist.tar.gz/.zip`. +1. 部署 Backend + 1. [单机模式](Deploy-backend-in-standalone-mode-CN.md) + 1. [集群模式](Deploy-backend-in-cluster-mode-CN.md) 1. 部署 Java Agent,[doc](Deploy-skywalking-agent-CN.md) 1. 重启并访问系统功能,查看UI即可。 \ No newline at end of file diff --git a/docs/en/Deploy-collector-in-cluster-mode.md b/docs/en/Deploy-backend-in-cluster-mode.md similarity index 82% rename from docs/en/Deploy-collector-in-cluster-mode.md rename to docs/en/Deploy-backend-in-cluster-mode.md index 2cc58795e..29025b9b3 100644 --- a/docs/en/Deploy-collector-in-cluster-mode.md +++ b/docs/en/Deploy-backend-in-cluster-mode.md @@ -25,7 +25,8 @@ thread_pool.bulk.queue_size: 1000 1. Run `tar -xvf skywalking-collector.tar.gz` 2. Config collector in cluster mode. -Cluster mode depends on Zookeeper register and application discovery capabilities. So, you just need to adjust the IP config items in `config/application.yml`. Change IP and port configs of agent_server, agent_stream, ui, collector_inside, replace them to the real ip or hostname which you want to use for cluster. +Cluster mode depends on Zookeeper register and application discovery capabilities. So, you just need to adjust the IP config items in `config/application.yml`. Change IP and port configs of naming, remote, agent_gRPC, agent_jetty and ui, +replace them to the real ip or hostname which you want to use for cluster. - `config/application.yml` ``` @@ -76,3 +77,6 @@ storage: 3. Run `bin/startup.sh` + +- NOTICE: **In 5.0.0-alpha, startup.sh will start two processes, collector and UI, and UI uses 127.0.0.1:10800 as default. +Recommend use http proxy to access UI in product, otherwise, access any UI.** diff --git a/docs/en/Deploy-collector-in-standalone-mode.md b/docs/en/Deploy-backend-in-standalone-mode.md similarity index 76% rename from docs/en/Deploy-collector-in-standalone-mode.md rename to docs/en/Deploy-backend-in-standalone-mode.md index 7e3292d00..56b1cdaf4 100644 --- a/docs/en/Deploy-collector-in-standalone-mode.md +++ b/docs/en/Deploy-backend-in-standalone-mode.md @@ -1,7 +1,9 @@ # Usage scenario Default standalong mode collector means don't support cluster. It uses H2 as storage layer implementation, suggest that use only for preview, test, demonstration, low throughputs and small scale system. -If you are using skywalking in a low throughputs monitoring scenario, and don't want to deploy cluster, at least, swith the storage implementation from H2 to Elasticsearch. +If you are using skywalking in a low throughputs monitoring scenario, and don't want to deploy cluster, at least, switch the storage implementation from H2 to Elasticsearch. + +**H2 storage implementation is not provided in 5.0.0-alpha, so you must deploy ElasticSearch before try to start backend** ## Requirements * JDK 8+ @@ -17,6 +19,8 @@ You can simplely tar/unzip and startup if ports 10800, 11800, 12800 are free. You should keep the `config/application.yml` as default. +- NOTICE: **In 5.0.0-alpha, startup.sh will start two processes, collector and UI, and UI uses 127.0.0.1:10800 as default.** + ## Use Elastic Search instead of H2 as storage layer implementation Even in standalone mode, collector can run with Elastic Search as storage. If so, uncomment the `storage` section in `application.yml`, set the config right. The default configs fit for collector and Elasticsearch both running in same machine, and not cluster. @@ -24,7 +28,7 @@ Even in standalone mode, collector can run with Elastic Search as storage. If so - Modify `elasticsearch.yml` - Set `cluster.name: CollectorDBCluster` - Set `node.name: anyname`, this name can be any, it based on Elasticsearch. - - Add the following configurations to + - Add the following configurations ``` # The ip used for listening diff --git a/docs/en/Deploy-skywalking-agent.md b/docs/en/Deploy-skywalking-agent.md index c42ee3b51..900c39f9c 100644 --- a/docs/en/Deploy-skywalking-agent.md +++ b/docs/en/Deploy-skywalking-agent.md @@ -42,5 +42,5 @@ CATALINA_OPTS="$CATALINA_OPTS -javaagent:/path/to/skywalking-agent/skywalking-ag - Tomcat 8 Change the first line of `tomcat/bin/catalina.sh`. ```shell -set "CATALINA_OPTS=-javaagent:E:\apache-tomcat-8.5.20\skywalking-agent\skywalking-agent.jar -Dconfig=\skywalking\config\dir" +set "CATALINA_OPTS=-javaagent:E:\apache-tomcat-8.5.20\skywalking-agent\skywalking-agent.jar" ``` \ No newline at end of file diff --git a/docs/en/Opentracing.md b/docs/en/Opentracing.md index ce270c6e8..e6215f1e9 100644 --- a/docs/en/Opentracing.md +++ b/docs/en/Opentracing.md @@ -7,7 +7,6 @@ ``` -   [ ![Download](https://api.bintray.com/packages/wu-sheng/skywalking/org.apache.skywalking.apm-toolkit-opentracing/images/download.svg) ](https://bintray.com/wu-sheng/skywalking/org.apache.skywalking.apm-toolkit-opentracing/_latestVersion) * Use our OpenTracing tracer implementation ```java diff --git a/docs/en/Quick-start.md b/docs/en/Quick-start.md index 9e604336d..398ac04c1 100644 --- a/docs/en/Quick-start.md +++ b/docs/en/Quick-start.md @@ -1,7 +1,7 @@ # Quick start -1. Deploy Collector - 1. [Standalone Mode](Deploy-collector-in-standalone-mode.md) - 1. [Cluster Mode](Deploy-collector-in-cluster-mode.md) -1. Deploy webui server, [doc](https://github.com/apache/incubator-skywalking-ui#quickstart) -1. Doploy Java Agent,[doc](Deploy-skywalking-agent.md) +1. Download `org.apache.skywalking.apm-dist` in maven central. Or find `skywalking-dist.tar.gz/.zip` in `dist` folder after `mvn clean package`. +1. Deploy Backend + - [Standalone Mode](Deploy-backend-in-standalone-mode.md) + - [Cluster Mode](Deploy-backend-in-cluster-mode.md) +1. Deploy Java Agent,[doc](Deploy-skywalking-agent.md) 1. Reboot your applications, and open UI. \ No newline at end of file