This is an automated email from the ASF dual-hosted git repository.
wusheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking.git
The following commit(s) were added to refs/heads/master by this push:
new 825a7cc Make source builder set service name and endpoint name in
right order (#6188)
825a7cc is described below
commit 825a7ccc817a0af30cdd8ffc4eb6dee81b4178aa
Author: Neal Huang <[email protected]>
AuthorDate: Thu Jan 14 20:51:26 2021 +0800
Make source builder set service name and endpoint name in right order
(#6188)
---
CHANGES.md | 1 +
.../listener/DatabaseSlowStatementBuilder.java | 70 ++++++++++++++++++++++
.../listener/MultiScopesAnalysisListener.java | 35 ++++++-----
.../trace/parser/listener/SourceBuilder.java | 52 ++++++----------
.../oap/server/core/config/NamingControl.java | 9 ++-
5 files changed, 114 insertions(+), 53 deletions(-)
diff --git a/CHANGES.md b/CHANGES.md
index 79e8a11..b1b0122 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -61,6 +61,7 @@ Release Notes.
* Fix `timeBucket` not taking effect in EqualsAndHashCode annotation of some
relationship metrics.
* Fix `SharingServerConfig`'s propertie is not correct in the
`application.yml`, contextPath -> restConnextPath.
* Istio control plane: remove redundant metrics and polish panel layout.
+* Fix bug endpoint name grouping not work due to setting service name and
endpoint name out of order.
* Fix receiver analysis error count metrics
* Log collecting and query implementation
diff --git
a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/DatabaseSlowStatementBuilder.java
b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/DatabaseSlowStatementBuilder.java
new file mode 100644
index 0000000..056e9e1
--- /dev/null
+++
b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/DatabaseSlowStatementBuilder.java
@@ -0,0 +1,70 @@
+/*
+ * 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.oap.server.analyzer.provider.trace.parser.listener;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.Setter;
+import org.apache.skywalking.oap.server.core.analysis.IDManager;
+import org.apache.skywalking.oap.server.core.analysis.NodeType;
+import org.apache.skywalking.oap.server.core.config.NamingControl;
+import org.apache.skywalking.oap.server.core.source.DatabaseSlowStatement;
+
+@RequiredArgsConstructor
+public class DatabaseSlowStatementBuilder {
+ private final NamingControl namingControl;
+
+ @Getter
+ @Setter
+ private String id;
+ @Getter
+ @Setter
+ private String traceId;
+ @Getter
+ @Setter
+ private String serviceName;
+ @Getter
+ @Setter
+ private NodeType type = NodeType.Database;
+ @Getter
+ @Setter
+ private String statement;
+ @Getter
+ @Setter
+ private long latency;
+ @Getter
+ @Setter
+ private long timeBucket;
+
+ void prepare() {
+ this.serviceName = namingControl.formatServiceName(serviceName);
+ }
+
+ DatabaseSlowStatement toDatabaseSlowStatement() {
+ DatabaseSlowStatement dbSlowStat = new DatabaseSlowStatement();
+ dbSlowStat.setId(id);
+ dbSlowStat.setTraceId(traceId);
+
dbSlowStat.setDatabaseServiceId(IDManager.ServiceID.buildId(serviceName, type));
+ dbSlowStat.setStatement(statement);
+ dbSlowStat.setLatency(latency);
+ dbSlowStat.setTimeBucket(timeBucket);
+ return dbSlowStat;
+ }
+
+}
diff --git
a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/MultiScopesAnalysisListener.java
b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/MultiScopesAnalysisListener.java
index 2c938d7..207e53f 100644
---
a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/MultiScopesAnalysisListener.java
+++
b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/MultiScopesAnalysisListener.java
@@ -42,7 +42,6 @@ import
org.apache.skywalking.oap.server.core.analysis.TimeBucket;
import
org.apache.skywalking.oap.server.core.analysis.manual.networkalias.NetworkAddressAlias;
import org.apache.skywalking.oap.server.core.cache.NetworkAddressAliasCache;
import org.apache.skywalking.oap.server.core.config.NamingControl;
-import org.apache.skywalking.oap.server.core.source.DatabaseSlowStatement;
import org.apache.skywalking.oap.server.core.source.DetectPoint;
import org.apache.skywalking.oap.server.core.source.EndpointRelation;
import org.apache.skywalking.oap.server.core.source.RequestType;
@@ -62,7 +61,7 @@ import static
org.apache.skywalking.oap.server.analyzer.provider.trace.parser.Sp
public class MultiScopesAnalysisListener implements EntryAnalysisListener,
ExitAnalysisListener, LocalAnalysisListener {
private final List<SourceBuilder> entrySourceBuilders = new
ArrayList<>(10);
private final List<SourceBuilder> exitSourceBuilders = new ArrayList<>(10);
- private final List<DatabaseSlowStatement> slowDatabaseAccesses = new
ArrayList<>(10);
+ private final List<DatabaseSlowStatementBuilder> dbSlowStatementBuilders =
new ArrayList<>(10);
private final List<SourceBuilder> logicEndpointBuilders = new
ArrayList<>(10);
private final Gson gson = new Gson();
private final SourceReceiver sourceReceiver;
@@ -195,26 +194,24 @@ public class MultiScopesAnalysisListener implements
EntryAnalysisListener, ExitA
setPublicAttrs(sourceBuilder, span);
exitSourceBuilders.add(sourceBuilder);
- if (sourceBuilder.getType().equals(RequestType.DATABASE)) {
+ if (RequestType.DATABASE.equals(sourceBuilder.getType())) {
boolean isSlowDBAccess = false;
- DatabaseSlowStatement statement = new DatabaseSlowStatement();
- statement.setId(segmentObject.getTraceSegmentId() + "-" +
span.getSpanId());
- statement.setDatabaseServiceId(
- IDManager.ServiceID.buildId(networkAddress, NodeType.Database)
- );
- statement.setLatency(sourceBuilder.getLatency());
-
statement.setTimeBucket(TimeBucket.getRecordTimeBucket(span.getStartTime()));
- statement.setTraceId(segmentObject.getTraceId());
+ DatabaseSlowStatementBuilder slowStatementBuilder = new
DatabaseSlowStatementBuilder(namingControl);
+ slowStatementBuilder.setServiceName(networkAddress);
+ slowStatementBuilder.setId(segmentObject.getTraceSegmentId() + "-"
+ span.getSpanId());
+ slowStatementBuilder.setLatency(sourceBuilder.getLatency());
+
slowStatementBuilder.setTimeBucket(TimeBucket.getRecordTimeBucket(span.getStartTime()));
+ slowStatementBuilder.setTraceId(segmentObject.getTraceId());
for (KeyStringValuePair tag : span.getTagsList()) {
if (SpanTags.DB_STATEMENT.equals(tag.getKey())) {
String sqlStatement = tag.getValue();
if (StringUtil.isEmpty(sqlStatement)) {
- statement.setStatement("[No statement]/" +
span.getOperationName());
+ slowStatementBuilder.setStatement("[No statement]/" +
span.getOperationName());
} else if (sqlStatement.length() >
config.getMaxSlowSQLLength()) {
- statement.setStatement(sqlStatement.substring(0,
config.getMaxSlowSQLLength()));
+
slowStatementBuilder.setStatement(sqlStatement.substring(0,
config.getMaxSlowSQLLength()));
} else {
- statement.setStatement(sqlStatement);
+ slowStatementBuilder.setStatement(sqlStatement);
}
} else if (SpanTags.DB_TYPE.equals(tag.getKey())) {
String dbType = tag.getValue();
@@ -227,7 +224,7 @@ public class MultiScopesAnalysisListener implements
EntryAnalysisListener, ExitA
}
if (isSlowDBAccess) {
- slowDatabaseAccesses.add(statement);
+ dbSlowStatementBuilders.add(slowStatementBuilder);
}
}
}
@@ -271,6 +268,7 @@ public class MultiScopesAnalysisListener implements
EntryAnalysisListener, ExitA
@Override
public void build() {
entrySourceBuilders.forEach(entrySourceBuilder -> {
+ entrySourceBuilder.prepare();
sourceReceiver.receive(entrySourceBuilder.toAll());
sourceReceiver.receive(entrySourceBuilder.toService());
sourceReceiver.receive(entrySourceBuilder.toServiceInstance());
@@ -292,6 +290,7 @@ public class MultiScopesAnalysisListener implements
EntryAnalysisListener, ExitA
});
exitSourceBuilders.forEach(exitSourceBuilder -> {
+ exitSourceBuilder.prepare();
sourceReceiver.receive(exitSourceBuilder.toServiceRelation());
/*
@@ -307,9 +306,13 @@ public class MultiScopesAnalysisListener implements
EntryAnalysisListener, ExitA
}
});
- slowDatabaseAccesses.forEach(sourceReceiver::receive);
+ dbSlowStatementBuilders.forEach(dbSlowStatBuilder -> {
+ dbSlowStatBuilder.prepare();
+
sourceReceiver.receive(dbSlowStatBuilder.toDatabaseSlowStatement());
+ });
logicEndpointBuilders.forEach(logicEndpointBuilder -> {
+ logicEndpointBuilder.prepare();
sourceReceiver.receive(logicEndpointBuilder.toEndpoint());
});
}
diff --git
a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/SourceBuilder.java
b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/SourceBuilder.java
index 21c878e..c5e243b 100644
---
a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/SourceBuilder.java
+++
b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/SourceBuilder.java
@@ -44,64 +44,36 @@ class SourceBuilder {
private final NamingControl namingControl;
@Getter
+ @Setter
private String sourceServiceName;
-
- public void setSourceServiceName(final String sourceServiceName) {
- this.sourceServiceName =
namingControl.formatServiceName(sourceServiceName);
- }
-
@Getter
@Setter
private NodeType sourceNodeType;
@Getter
+ @Setter
private String sourceServiceInstanceName;
-
- public void setSourceServiceInstanceName(final String
sourceServiceInstanceName) {
- this.sourceServiceInstanceName =
namingControl.formatInstanceName(sourceServiceInstanceName);
- }
-
/**
* Source endpoint could be not owned by {@link #sourceServiceName}, such
as in the MQ or un-instrumented proxy
* cases. This service always comes from the span.ref, so it is always a
normal service.
*/
@Getter
+ @Setter
private String sourceEndpointOwnerServiceName;
-
- public void setSourceEndpointOwnerServiceName(final String
sourceServiceName) {
- this.sourceEndpointOwnerServiceName =
namingControl.formatServiceName(sourceServiceName);
- }
-
@Getter
+ @Setter
private String sourceEndpointName;
-
- public void setSourceEndpointName(final String sourceEndpointName) {
- this.sourceEndpointName =
namingControl.formatEndpointName(sourceServiceName, sourceEndpointName);
- }
-
@Getter
+ @Setter
private String destServiceName;
-
- public void setDestServiceName(final String destServiceName) {
- this.destServiceName =
namingControl.formatServiceName(destServiceName);
- }
-
@Getter
@Setter
private NodeType destNodeType;
@Getter
+ @Setter
private String destServiceInstanceName;
-
- public void setDestServiceInstanceName(final String
destServiceInstanceName) {
- this.destServiceInstanceName =
namingControl.formatServiceName(destServiceInstanceName);
- }
-
@Getter
+ @Setter
private String destEndpointName;
-
- public void setDestEndpointName(final String destEndpointName) {
- this.destEndpointName =
namingControl.formatEndpointName(destServiceName, destEndpointName);
- }
-
@Getter
@Setter
private int componentId;
@@ -126,6 +98,16 @@ class SourceBuilder {
@Getter
private final List<String> tags = new ArrayList<>();
+ void prepare() {
+ this.sourceServiceName =
namingControl.formatServiceName(sourceServiceName);
+ this.sourceEndpointOwnerServiceName =
namingControl.formatServiceName(sourceEndpointOwnerServiceName);
+ this.sourceServiceInstanceName =
namingControl.formatInstanceName(sourceServiceInstanceName);
+ this.sourceEndpointName =
namingControl.formatEndpointName(sourceServiceName, sourceEndpointName);
+ this.destServiceName =
namingControl.formatServiceName(destServiceName);
+ this.destServiceInstanceName =
namingControl.formatInstanceName(destServiceInstanceName);
+ this.destEndpointName =
namingControl.formatEndpointName(destServiceName, destEndpointName);
+ }
+
/**
* The global level metrics source
*/
diff --git
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/NamingControl.java
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/NamingControl.java
index 3474b78..3a678eb 100644
---
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/NamingControl.java
+++
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/NamingControl.java
@@ -20,6 +20,7 @@ package org.apache.skywalking.oap.server.core.config;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.apache.skywalking.apm.util.StringUtil;
import org.apache.skywalking.oap.server.core.config.group.EndpointNameGrouping;
import org.apache.skywalking.oap.server.library.module.Service;
@@ -44,7 +45,7 @@ public class NamingControl implements Service {
* @return the string, which length less than or equals {@link
#serviceNameMaxLength};
*/
public String formatServiceName(String serviceName) {
- if (serviceName.length() > serviceNameMaxLength) {
+ if (serviceName != null && serviceName.length() >
serviceNameMaxLength) {
final String rename = serviceName.substring(0,
serviceNameMaxLength);
if (log.isDebugEnabled()) {
log.debug(
@@ -69,7 +70,7 @@ public class NamingControl implements Service {
* @return the string, which length less than or equals {@link
#instanceNameMaxLength};
*/
public String formatInstanceName(String instanceName) {
- if (instanceName.length() > instanceNameMaxLength) {
+ if (instanceName != null && instanceName.length() >
instanceNameMaxLength) {
final String rename = instanceName.substring(0,
instanceNameMaxLength);
if (log.isDebugEnabled()) {
log.debug(
@@ -95,6 +96,10 @@ public class NamingControl implements Service {
* @return the string, which length less than or equals {@link
#endpointNameMaxLength};
*/
public String formatEndpointName(String serviceName, String endpointName) {
+ if (StringUtil.isEmpty(serviceName) || endpointName == null) {
+ return endpointName;
+ }
+
String lengthControlledName = endpointName;
if (endpointName.length() > endpointNameMaxLength) {
lengthControlledName = endpointName.substring(0,
endpointNameMaxLength);