You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2021/10/13 09:15:42 UTC
[skywalking] 01/01: Message Queue performance and consuming latency
monitoring
This is an automated email from the ASF dual-hosted git repository.
wusheng pushed a commit to branch mq
in repository https://gitbox.apache.org/repos/asf/skywalking.git
commit 81bd9ef1fa75152a405028040c0f96cd27898f7a
Author: Wu Sheng <wu...@foxmail.com>
AuthorDate: Wed Oct 13 17:15:22 2021 +0800
Message Queue performance and consuming latency monitoring
---
CHANGES.md | 3 +
README.md | 3 +-
.../listener/MultiScopesAnalysisListener.java | 3 +
.../apache/skywalking/oal/rt/grammar/OALLexer.g4 | 1 +
.../apache/skywalking/oal/rt/grammar/OALParser.g4 | 8 +-
.../skywalking/oal/rt/parser/OALListener.java | 15 ++-
.../skywalking/oap/server/core/source/All.java | 2 +-
.../oap/server/core/source/Endpoint.java | 2 +-
.../oap/server/core/source/RequestType.java | 3 +-
.../skywalking/oap/server/core/source/Service.java | 2 +-
.../oap/server/core/source/ServiceInstance.java | 2 +-
.../server/receiver/trace/mock/ServiceCMock.java | 2 +
.../server-starter/src/main/resources/oal/core.oal | 4 +
.../resources/ui-initialized-templates/apm.yml | 110 +++++++++++++++------
14 files changed, 118 insertions(+), 42 deletions(-)
diff --git a/CHANGES.md b/CHANGES.md
index b23d894..77ac2cb 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -27,6 +27,9 @@ Release Notes.
* Refactor the OAL compiler context to improve readability.
* Fix wrong generated codes of `hashCode` and `remoteHashCode` methods for numeric fields.
* Replace e2e cases to e2e-v2: Nodejs.
+* Support `!= null` in OAL engine.
+* Add `Message Queue Consuming Count` metric for MQ consuming service and endpoint.
+* Add `Message Queue Avg Consuming Latency` metric for MQ consuming service and endpoint.
#### UI
diff --git a/README.md b/README.md
index e53693e..118e387 100644
--- a/README.md
+++ b/README.md
@@ -22,10 +22,11 @@ The core features are following.
- Root cause analysis. Profile the code on the runtime
- Service topology map analysis
- Service, service instance and endpoint dependency analysis
-- Slow services and endpoints detected
+- Slow services and endpoints detecting
- Performance optimization
- Distributed tracing and context propagation
- Database access metrics. Detect slow database access statements(including SQL statements)
+- Message Queue performance and consuming latency monitoring
- Alarm
- Browser performance monitoring
- Infrastructure(VM, network, disk etc.) monitoring
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 927fd0d..dcc3ed0 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
@@ -264,6 +264,9 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA
case Database:
sourceBuilder.setType(RequestType.DATABASE);
break;
+ case MQ:
+ sourceBuilder.setType(RequestType.MQ);
+ break;
default:
sourceBuilder.setType(RequestType.RPC);
break;
diff --git a/oap-server/oal-grammar/src/main/antlr4/org/apache/skywalking/oal/rt/grammar/OALLexer.g4 b/oap-server/oal-grammar/src/main/antlr4/org/apache/skywalking/oal/rt/grammar/OALLexer.g4
index 9f053f4..af0289c 100644
--- a/oap-server/oal-grammar/src/main/antlr4/org/apache/skywalking/oal/rt/grammar/OALLexer.g4
+++ b/oap-server/oal-grammar/src/main/antlr4/org/apache/skywalking/oal/rt/grammar/OALLexer.g4
@@ -78,6 +78,7 @@ CONTAIN: 'contain';
NOT_CONTAIN: 'not contain';
// Literals
+NULL_LITERAL: 'null';
BOOL_LITERAL: 'true'
| 'false'
diff --git a/oap-server/oal-grammar/src/main/antlr4/org/apache/skywalking/oal/rt/grammar/OALParser.g4 b/oap-server/oal-grammar/src/main/antlr4/org/apache/skywalking/oal/rt/grammar/OALParser.g4
index 119b926..09b0844 100644
--- a/oap-server/oal-grammar/src/main/antlr4/org/apache/skywalking/oal/rt/grammar/OALParser.g4
+++ b/oap-server/oal-grammar/src/main/antlr4/org/apache/skywalking/oal/rt/grammar/OALParser.g4
@@ -121,7 +121,7 @@ numberMatch
;
stringMatch
- : conditionAttributeStmt DUALEQUALS (stringConditionValue | enumConditionValue)
+ : conditionAttributeStmt DUALEQUALS (stringConditionValue | enumConditionValue | nullConditionValue)
;
greaterMatch
@@ -145,7 +145,7 @@ booleanNotEqualMatch
;
notEqualMatch
- : conditionAttributeStmt NOT_EQUAL (numberConditionValue | stringConditionValue | enumConditionValue)
+ : conditionAttributeStmt NOT_EQUAL (numberConditionValue | stringConditionValue | enumConditionValue | nullConditionValue)
;
likeMatch
@@ -188,6 +188,10 @@ numberConditionValue
: NUMBER_LITERAL
;
+nullConditionValue
+ : NULL_LITERAL
+ ;
+
sourceAttrCast
: castStmt
;
diff --git a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/OALListener.java b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/OALListener.java
index 3621a06..5b7ef9f 100644
--- a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/OALListener.java
+++ b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/OALListener.java
@@ -202,7 +202,7 @@ public class OALListener extends OALParserBaseListener {
@Override
public void enterEnumConditionValue(OALParser.EnumConditionValueContext ctx) {
- enterConditionValue(ctx.getText());
+ enterEnumConditionValue(ctx.getText());
}
@Override
@@ -212,18 +212,23 @@ public class OALListener extends OALParserBaseListener {
}
@Override
+ public void enterNullConditionValue(OALParser.NullConditionValueContext ctx) {
+ enterConditionValue(ctx.getText());
+ }
+
+ @Override
public void enterExpressionAttrCast(final OALParser.ExpressionAttrCastContext ctx) {
conditionExpression.setCastType(ctx.getText());
}
private void enterConditionValue(String value) {
- if (value.split("\\.").length == 2 && !value.startsWith("\"")) {
- // Value is an enum.
- value = sourcePackage + value;
- }
conditionExpression.addValue(value);
}
+ private void enterEnumConditionValue(String value) {
+ conditionExpression.addValue(sourcePackage + value);
+ }
+
/////////////
// Expression end.
////////////
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/All.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/All.java
index 8af8b69..291283b 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/All.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/All.java
@@ -73,6 +73,6 @@ public class All extends Source {
private Map<String, String> originalTags;
public String getTag(String key) {
- return originalTags.getOrDefault(key, Const.EMPTY_STRING);
+ return originalTags.getOrDefault(key, null);
}
}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Endpoint.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Endpoint.java
index f9c3e20..a7e5b8c 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Endpoint.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Endpoint.java
@@ -100,6 +100,6 @@ public class Endpoint extends Source {
}
public String getTag(String key) {
- return originalTags.getOrDefault(key, Const.EMPTY_STRING);
+ return originalTags.getOrDefault(key, null);
}
}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/RequestType.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/RequestType.java
index 6eea865..fe0b0af 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/RequestType.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/RequestType.java
@@ -30,5 +30,6 @@ public enum RequestType {
* Logic request only.
*/
LOGIC,
- TCP
+ TCP,
+ MQ
}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Service.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Service.java
index a7534f7..87e4f68 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Service.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Service.java
@@ -92,6 +92,6 @@ public class Service extends Source {
private TCPInfo tcpInfo = new TCPInfo();
public String getTag(String key) {
- return originalTags.getOrDefault(key, Const.EMPTY_STRING);
+ return originalTags.getOrDefault(key, null);
}
}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstance.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstance.java
index a00ca22..ca558a4 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstance.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstance.java
@@ -102,6 +102,6 @@ public class ServiceInstance extends Source {
}
public String getTag(String key) {
- return originalTags.getOrDefault(key, Const.EMPTY_STRING);
+ return originalTags.getOrDefault(key, null);
}
}
diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/trace/mock/ServiceCMock.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/trace/mock/ServiceCMock.java
index 7bb7ac9..f984d2a 100644
--- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/trace/mock/ServiceCMock.java
+++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/trace/mock/ServiceCMock.java
@@ -19,6 +19,7 @@
package org.apache.skywalking.oap.server.receiver.trace.mock;
import io.grpc.stub.StreamObserver;
+import org.apache.skywalking.apm.network.common.v3.KeyStringValuePair;
import org.apache.skywalking.apm.network.language.agent.v3.RefType;
import org.apache.skywalking.apm.network.language.agent.v3.SegmentObject;
import org.apache.skywalking.apm.network.language.agent.v3.SegmentReference;
@@ -61,6 +62,7 @@ class ServiceCMock {
span.setIsError(false);
span.addRefs(createReference(traceId, parentSegmentId));
span.setOperationName(ServiceBMock.ROCKET_MQ_ENDPOINT);
+ span.addTags(KeyStringValuePair.newBuilder().setKey("transmission.latency").setValue("100").build());
return span;
}
diff --git a/oap-server/server-starter/src/main/resources/oal/core.oal b/oap-server/server-starter/src/main/resources/oal/core.oal
index 16dc46d..d95af57 100755
--- a/oap-server/server-starter/src/main/resources/oal/core.oal
+++ b/oap-server/server-starter/src/main/resources/oal/core.oal
@@ -29,6 +29,8 @@ service_sla = from(Service.*).percent(status == true);
service_cpm = from(Service.*).cpm();
service_percentile = from(Service.latency).percentile(10); // Multiple values including p50, p75, p90, p95, p99
service_apdex = from(Service.latency).apdex(name, status);
+service_mq_consume_count = from(Service.*).filter(type == RequestType.MQ).count();
+service_mq_consume_latency = from((str->long)Service.tag["transmission.latency"]).filter(type == RequestType.MQ).filter(tag["transmission.latency"] != null).longAvg();
// Service relation scope metrics for topology
service_relation_client_cpm = from(ServiceRelation.*).filter(detectPoint == DetectPoint.CLIENT).cpm();
@@ -60,6 +62,8 @@ endpoint_cpm = from(Endpoint.*).cpm();
endpoint_avg = from(Endpoint.latency).longAvg();
endpoint_sla = from(Endpoint.*).percent(status == true);
endpoint_percentile = from(Endpoint.latency).percentile(10); // Multiple values including p50, p75, p90, p95, p99
+endpoint_mq_consume_count = from(Endpoint.*).filter(type == RequestType.MQ).count();
+endpoint_mq_consume_latency = from((str->long)Endpoint.tag["transmission.latency"]).filter(type == RequestType.MQ).filter(tag["transmission.latency"] != null).longAvg();
// Endpoint relation scope metrics
endpoint_relation_cpm = from(EndpointRelation.*).filter(detectPoint == DetectPoint.SERVER).cpm();
diff --git a/oap-server/server-starter/src/main/resources/ui-initialized-templates/apm.yml b/oap-server/server-starter/src/main/resources/ui-initialized-templates/apm.yml
index 5854c07..9686901 100644
--- a/oap-server/server-starter/src/main/resources/ui-initialized-templates/apm.yml
+++ b/oap-server/server-starter/src/main/resources/ui-initialized-templates/apm.yml
@@ -121,9 +121,9 @@ templates:
"name": "Service",
"children": [
{
- "width": 3,
+ "width": 4,
"title": "Service Apdex",
- "height": "200",
+ "height": "100",
"entityType": "Service",
"independentSelector": false,
"metricType": "REGULAR_VALUE",
@@ -134,21 +134,9 @@ templates:
"aggregationNum": "10000"
},
{
- "width": 3,
- "title": "Service Avg Response Time",
- "height": "200",
- "entityType": "Service",
- "independentSelector": false,
- "metricType": "REGULAR_VALUE",
- "metricName": "service_resp_time",
- "queryMetricType": "readMetricsValues",
- "chartType": "ChartLine",
- "unit": "ms"
- },
- {
- "width": 3,
+ "width": 4,
"title": "Successful Rate",
- "height": "200",
+ "height": "100",
"entityType": "Service",
"independentSelector": false,
"metricType": "REGULAR_VALUE",
@@ -160,9 +148,9 @@ templates:
"aggregationNum": "100"
},
{
- "width": 3,
+ "width": 4,
"title": "Service Load",
- "height": "200",
+ "height": "100",
"entityType": "Service",
"independentSelector": false,
"metricType": "REGULAR_VALUE",
@@ -174,6 +162,18 @@ templates:
},
{
"width": 3,
+ "title": "Service Avg Response Time",
+ "height": "200",
+ "entityType": "Service",
+ "independentSelector": false,
+ "metricType": "REGULAR_VALUE",
+ "metricName": "service_resp_time",
+ "queryMetricType": "readMetricsValues",
+ "chartType": "ChartLine",
+ "unit": "ms"
+ },
+ {
+ "width": 3,
"title": "Service Apdex",
"height": "200",
"entityType": "Service",
@@ -240,7 +240,33 @@ templates:
"tips": "This metrics is only avaible for TCP services"
},
{
- "width": "3",
+ "width": 3,
+ "title": "Message Queue Consuming Count",
+ "height": "200",
+ "entityType": "Service",
+ "independentSelector": false,
+ "metricType": "REGULAR_VALUE",
+ "metricName": "service_mq_consume_count",
+ "queryMetricType": "readMetricsValues",
+ "chartType": "ChartLine",
+ "unit": "",
+ "tips": "The number of consumed messages."
+ },
+ {
+ "width": 3,
+ "title": "Message Queue Avg Consuming Latency",
+ "height": "200",
+ "entityType": "Service",
+ "independentSelector": false,
+ "metricType": "REGULAR_VALUE",
+ "metricName": "service_mq_consume_latency",
+ "queryMetricType": "readMetricsValues",
+ "chartType": "ChartLine",
+ "unit": "ms",
+ "tips": "The avg latency of message consuming. Latency = timestamp(received) - timestamp(producing)"
+ },
+ {
+ "width": "4",
"title": "Service Instances Load",
"height": "280",
"entityType": "ServiceInstance",
@@ -254,7 +280,7 @@ templates:
"tips": "For HTTP 1/2, gRPC, RPC services, this means Calls Per Minute (CPM), for TCP services, this means Packets Per Minute (PPM)"
},
{
- "width": "3",
+ "width": "4",
"title": "Slow Service Instance",
"height": "280",
"entityType": "ServiceInstance",
@@ -267,7 +293,7 @@ templates:
"unit": "ms"
},
{
- "width": "3",
+ "width": "4",
"title": "Service Instance Successful Rate",
"height": "280",
"entityType": "ServiceInstance",
@@ -519,9 +545,9 @@ templates:
"sortOrder": "ASC"
},
{
- "width": 3,
+ "width": 4,
"title": "Endpoint Load",
- "height": 350,
+ "height": 200,
"entityType": "Endpoint",
"independentSelector": false,
"metricType": "REGULAR_VALUE",
@@ -530,9 +556,9 @@ templates:
"chartType": "ChartLine"
},
{
- "width": 3,
+ "width": 4,
"title": "Endpoint Avg Response Time",
- "height": 350,
+ "height": 200,
"entityType": "Endpoint",
"independentSelector": false,
"metricType": "REGULAR_VALUE",
@@ -542,9 +568,9 @@ templates:
"unit": "ms"
},
{
- "width": 3,
+ "width": 4,
"title": "Endpoint Response Time Percentile",
- "height": 350,
+ "height": 200,
"entityType": "Endpoint",
"independentSelector": false,
"metricType": "LABELED_VALUE",
@@ -556,9 +582,9 @@ templates:
"unit": "ms"
},
{
- "width": 3,
+ "width": 4,
"title": "Endpoint Successful Rate",
- "height": 350,
+ "height": 200,
"entityType": "Endpoint",
"independentSelector": false,
"metricType": "REGULAR_VALUE",
@@ -568,6 +594,32 @@ templates:
"unit": "%",
"aggregation": "/",
"aggregationNum": "100"
+ },
+ {
+ "width": 4,
+ "title": "Message Queue Consuming Count",
+ "height": "200",
+ "entityType": "Endpoint",
+ "independentSelector": false,
+ "metricType": "REGULAR_VALUE",
+ "metricName": "endpoint_mq_consume_count",
+ "queryMetricType": "readMetricsValues",
+ "chartType": "ChartLine",
+ "unit": "",
+ "tips": "The number of consumed messages."
+ },
+ {
+ "width": 4,
+ "title": "Message Queue Avg Consuming Latency",
+ "height": "200",
+ "entityType": "Endpoint",
+ "independentSelector": false,
+ "metricType": "REGULAR_VALUE",
+ "metricName": "endpoint_mq_consume_latency",
+ "queryMetricType": "readMetricsValues",
+ "chartType": "ChartLine",
+ "unit": "ms",
+ "tips": "The avg latency of message consuming. Latency = timestamp(received) - timestamp(producing)"
}
]
}