From 7397e92e788a6eb7454e10804df2af8705e537aa Mon Sep 17 00:00:00 2001 From: mrproliu <741550557@qq.com> Date: Sat, 17 May 2025 13:28:40 +0800 Subject: [PATCH 1/4] Added Ztunnel component in the Topology --- docs/en/changes/changes.md | 1 + .../service/K8SServiceCallRelationDispatcher.java | 4 ++-- .../oap/server/core/source/K8SServiceRelation.java | 5 ++++- .../ebpf/provider/handler/AccessLogServiceHandler.java | 8 ++++---- .../src/main/resources/component-libraries.yml | 3 +++ 5 files changed, 14 insertions(+), 7 deletions(-) diff --git a/docs/en/changes/changes.md b/docs/en/changes/changes.md index 8c83afb1b8ab..fca41f465cb1 100644 --- a/docs/en/changes/changes.md +++ b/docs/en/changes/changes.md @@ -17,6 +17,7 @@ * Increase the idle check interval of the message queue to 200ms to reduce CPU usage under low load conditions. * Limit max attempts of DNS resolution of Istio ServiceEntry to 3, and do not wait for first resolution result in case the DNS is not resolvable at all. * Support analysis waypoint metrics in Envoy ALS receiver. +* Add Ztunnel component in the topology. #### UI diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/K8SServiceCallRelationDispatcher.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/K8SServiceCallRelationDispatcher.java index 424c8196fa32..cd08f0bde07a 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/K8SServiceCallRelationDispatcher.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/K8SServiceCallRelationDispatcher.java @@ -42,7 +42,7 @@ private void clientSide(K8SServiceRelation source) { metrics.setSourceServiceId(source.getSourceServiceId()); metrics.setDestServiceId(source.getDestServiceId()); final IntList componentIds = metrics.getComponentIds(); - componentIds.add(source.getComponentId()); + source.getComponentId().forEach(componentIds::add); metrics.setEntityId(source.getEntityId()); MetricsStreamProcessor.getInstance().in(metrics); } @@ -53,7 +53,7 @@ private void serverSide(K8SServiceRelation source) { metrics.setSourceServiceId(source.getSourceServiceId()); metrics.setDestServiceId(source.getDestServiceId()); final IntList componentIds = metrics.getComponentIds(); - componentIds.add(source.getComponentId()); + source.getComponentId().forEach(componentIds::add); metrics.setEntityId(source.getEntityId()); MetricsStreamProcessor.getInstance().in(metrics); } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/K8SServiceRelation.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/K8SServiceRelation.java index e2ccdeda27e5..40e995566fc8 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/K8SServiceRelation.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/K8SServiceRelation.java @@ -23,6 +23,9 @@ import org.apache.skywalking.oap.server.core.analysis.IDManager; import org.apache.skywalking.oap.server.core.analysis.Layer; +import java.util.HashSet; +import java.util.Set; + import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.K8S_SERVICE_RELATION; import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SERVICE_RELATION_CATALOG_NAME; @@ -39,7 +42,7 @@ public class K8SServiceRelation extends K8SMetrics { private Layer sourceLayer; private DetectPoint detectPoint; - private int componentId; + private final Set componentId = new HashSet<>(); private AccessLogConnectionTLSMode tlsMode; private String destServiceId; diff --git a/oap-server/server-receiver-plugin/skywalking-ebpf-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/ebpf/provider/handler/AccessLogServiceHandler.java b/oap-server/server-receiver-plugin/skywalking-ebpf-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/ebpf/provider/handler/AccessLogServiceHandler.java index cd1421678a8a..d4f26df6378e 100644 --- a/oap-server/server-receiver-plugin/skywalking-ebpf-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/ebpf/provider/handler/AccessLogServiceHandler.java +++ b/oap-server/server-receiver-plugin/skywalking-ebpf-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/ebpf/provider/handler/AccessLogServiceHandler.java @@ -533,13 +533,13 @@ protected KubernetesProcessAddress buildRemoteAddress(NodeInfo nodeInfo, ObjectI .build(); } - protected int buildConnectionComponentId(ConnectionInfo connectionInfo) { + protected List buildConnectionComponentId(ConnectionInfo connectionInfo) { final AccessLogConnection originalConnection = connectionInfo.getOriginalConnection(); if (originalConnection.hasAttachment() && originalConnection.getAttachment().hasZTunnel() && ZTunnelAttachmentSecurityPolicy.MTLS.equals(originalConnection.getAttachment().getZTunnel().getSecurityPolicy())) { - return 142; // mTLS + return Arrays.asList(142, 162); // mTLS, ztunnel } - return buildProtocolComponentID(connectionInfo); + return Arrays.asList(buildProtocolComponentID(connectionInfo)); } protected int buildProtocolComponentID(ConnectionInfo connectionInfo) { @@ -653,7 +653,7 @@ public K8SServiceRelation toServiceRelation() { serviceRelation.setSourceLayer(Layer.K8S_SERVICE); serviceRelation.setDetectPoint(parseToSourceRole()); - serviceRelation.setComponentId(buildConnectionComponentId(this)); + serviceRelation.getComponentId().addAll(buildConnectionComponentId(this)); serviceRelation.setTlsMode(tlsMode); serviceRelation.setDestServiceName(destServiceName); diff --git a/oap-server/server-starter/src/main/resources/component-libraries.yml b/oap-server/server-starter/src/main/resources/component-libraries.yml index 49c89938c99c..d6174eaeb85c 100644 --- a/oap-server/server-starter/src/main/resources/component-libraries.yml +++ b/oap-server/server-starter/src/main/resources/component-libraries.yml @@ -535,6 +535,9 @@ Caffeine: ThreadPerTask-executor: id: 161 languages: Java +ztunnel: + id: 162 + languages: ebpf, mesh # .NET/.NET Core components # [3000, 4000) for C#/.NET only From f430a9f47160ceb9c6d1228445cb46f6387987e7 Mon Sep 17 00:00:00 2001 From: mrproliu <741550557@qq.com> Date: Sat, 17 May 2025 15:47:02 +0800 Subject: [PATCH 2/4] add UT about contain OAL method --- .../oal/rt/parser/ScriptParserTest.java | 19 +++++++++++++++++++ .../K8SServiceCallRelationDispatcher.java | 4 ++-- .../metrics/expression/ContainMatch.java | 12 ++++++++++++ .../metrics/expression/NotContainMatch.java | 11 +++++++++++ .../core/source/K8SServiceRelation.java | 6 +++--- .../metrics/expression/ContainMatchTest.java | 2 ++ .../handler/AccessLogServiceHandler.java | 2 +- 7 files changed, 50 insertions(+), 6 deletions(-) diff --git a/oap-server/oal-rt/src/test/java/org/apache/skywalking/oal/rt/parser/ScriptParserTest.java b/oap-server/oal-rt/src/test/java/org/apache/skywalking/oal/rt/parser/ScriptParserTest.java index 5f43e06f13bb..a2bdb7440c25 100644 --- a/oap-server/oal-rt/src/test/java/org/apache/skywalking/oal/rt/parser/ScriptParserTest.java +++ b/oap-server/oal-rt/src/test/java/org/apache/skywalking/oal/rt/parser/ScriptParserTest.java @@ -326,6 +326,25 @@ public void testParse12() throws IOException { Assertions.assertEquals("(str->long)", castExp.getAggregationFuncStmt().getFuncArgs().get(0).getCastType()); } + @Test + public void testParse13() throws IOException { + ScriptParser parser = ScriptParser.createFromScriptText( + "ClientCpm = from(K8SServiceRelation.*).filter(componentIds contain 7).cpm();", TEST_SOURCE_PACKAGE); + List results = parser.parse().getMetricsStmts(); + AnalysisResult clientCpm = results.get(0); + Assertions.assertEquals("ClientCpm", clientCpm.getMetricsName()); + Assertions.assertEquals("K8SServiceRelation", clientCpm.getFrom().getSourceName()); + Assertions.assertEquals("[*]", clientCpm.getFrom().getSourceAttribute().toString()); + final List filterExpressions = clientCpm.getFilters().getFilterExpressions(); + Assertions.assertEquals(1, filterExpressions.size()); + Assertions.assertEquals("source.getComponentIds()", filterExpressions.get(0).getLeft()); + Assertions.assertEquals("7", filterExpressions.get(0).getRight()); + Assertions.assertEquals("cpm", clientCpm.getAggregationFuncStmt().getAggregationFunctionName()); + EntryMethod entryMethod = clientCpm.getEntryMethod(); + List methodArgsExpressions = entryMethod.getArgsExpressions(); + Assertions.assertEquals(1, methodArgsExpressions.size()); + } + @Test public void testParseDecorator() throws IOException { SourceDecoratorManager.DECORATOR_MAP.put("ServiceDecorator", new ISourceDecorator() { diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/K8SServiceCallRelationDispatcher.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/K8SServiceCallRelationDispatcher.java index cd08f0bde07a..e43000dd7ddf 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/K8SServiceCallRelationDispatcher.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/K8SServiceCallRelationDispatcher.java @@ -42,7 +42,7 @@ private void clientSide(K8SServiceRelation source) { metrics.setSourceServiceId(source.getSourceServiceId()); metrics.setDestServiceId(source.getDestServiceId()); final IntList componentIds = metrics.getComponentIds(); - source.getComponentId().forEach(componentIds::add); + source.getComponentIds().forEach(componentIds::add); metrics.setEntityId(source.getEntityId()); MetricsStreamProcessor.getInstance().in(metrics); } @@ -53,7 +53,7 @@ private void serverSide(K8SServiceRelation source) { metrics.setSourceServiceId(source.getSourceServiceId()); metrics.setDestServiceId(source.getDestServiceId()); final IntList componentIds = metrics.getComponentIds(); - source.getComponentId().forEach(componentIds::add); + source.getComponentIds().forEach(componentIds::add); metrics.setEntityId(source.getEntityId()); MetricsStreamProcessor.getInstance().in(metrics); } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/ContainMatch.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/ContainMatch.java index 14898e08e50f..18ce57a5caac 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/ContainMatch.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/ContainMatch.java @@ -33,4 +33,16 @@ public boolean match(List left, String right) { } return left.contains(right); } + + public boolean match(List left, Integer right) { + if (Objects.isNull(left)) { + return false; + } + return left.contains(right); + } + + public boolean match(List left, int right) { + return match(left, Integer.valueOf(right)); + } + } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/NotContainMatch.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/NotContainMatch.java index bac24e5809c2..0c09531a0b3f 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/NotContainMatch.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/NotContainMatch.java @@ -33,4 +33,15 @@ public boolean match(List left, String right) { } return !left.contains(right); } + + public boolean match(List left, Integer right) { + if (Objects.isNull(left)) { + return false; + } + return !left.contains(right); + } + + public boolean match(List left, int right) { + return match(left, Integer.valueOf(right)); + } } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/K8SServiceRelation.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/K8SServiceRelation.java index 40e995566fc8..84cdbd5eeea3 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/K8SServiceRelation.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/K8SServiceRelation.java @@ -23,8 +23,8 @@ import org.apache.skywalking.oap.server.core.analysis.IDManager; import org.apache.skywalking.oap.server.core.analysis.Layer; -import java.util.HashSet; -import java.util.Set; +import java.util.ArrayList; +import java.util.List; import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.K8S_SERVICE_RELATION; import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SERVICE_RELATION_CATALOG_NAME; @@ -42,7 +42,7 @@ public class K8SServiceRelation extends K8SMetrics { private Layer sourceLayer; private DetectPoint detectPoint; - private final Set componentId = new HashSet<>(); + private final List componentIds = new ArrayList<>(3); private AccessLogConnectionTLSMode tlsMode; private String destServiceId; diff --git a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/ContainMatchTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/ContainMatchTest.java index 6237b319474a..2841c134f9ee 100644 --- a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/ContainMatchTest.java +++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/ContainMatchTest.java @@ -33,5 +33,7 @@ public void match() { assertTrue(containMatch.match(Arrays.asList("http.method:GET", "http.method:POST"), "http.method:GET")); assertFalse( containMatch.match(Arrays.asList("http.method:GET", "http.method:POST"), "http.method:PUT")); + assertTrue(containMatch.match(Arrays.asList(1, 2, 3), 2)); + assertFalse(containMatch.match(Arrays.asList(1, 2, 3), 4)); } } diff --git a/oap-server/server-receiver-plugin/skywalking-ebpf-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/ebpf/provider/handler/AccessLogServiceHandler.java b/oap-server/server-receiver-plugin/skywalking-ebpf-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/ebpf/provider/handler/AccessLogServiceHandler.java index d4f26df6378e..9c469b176cac 100644 --- a/oap-server/server-receiver-plugin/skywalking-ebpf-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/ebpf/provider/handler/AccessLogServiceHandler.java +++ b/oap-server/server-receiver-plugin/skywalking-ebpf-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/ebpf/provider/handler/AccessLogServiceHandler.java @@ -653,7 +653,7 @@ public K8SServiceRelation toServiceRelation() { serviceRelation.setSourceLayer(Layer.K8S_SERVICE); serviceRelation.setDetectPoint(parseToSourceRole()); - serviceRelation.getComponentId().addAll(buildConnectionComponentId(this)); + serviceRelation.getComponentIds().addAll(buildConnectionComponentId(this)); serviceRelation.setTlsMode(tlsMode); serviceRelation.setDestServiceName(destServiceName); From 4a15d46bfc428e9e53693e3897514776bec26a18 Mon Sep 17 00:00:00 2001 From: mrproliu <741550557@qq.com> Date: Sat, 17 May 2025 16:23:12 +0800 Subject: [PATCH 3/4] update component ids documentation --- .../concepts-and-designs/scope-definitions.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/en/concepts-and-designs/scope-definitions.md b/docs/en/concepts-and-designs/scope-definitions.md index 020b10731e78..a2f269e7110f 100644 --- a/docs/en/concepts-and-designs/scope-definitions.md +++ b/docs/en/concepts-and-designs/scope-definitions.md @@ -493,15 +493,15 @@ following **package**/**protocol** level metric contents. ##### SCOPE `K8SServiceRelation` -| Name | Remarks | Group Key | Type | -|-------------------|--------------------------------------------------------------------|-----------|--------| -| sourceServiceName | The source service name in kubernetes. | | string | -| sourceLayer | The source layer service in kubernetes. | | string | -| detectPoint | Where the relation is detected. The value may be client or server. | | enum | -| componentId | The ID of component used in this call. | | string | -| tlsMode | The TLS mode of relation. The value may be Plain or TLS. | | enum | -| destServiceName | The dest service name in kubernetes. | | string | -| destLayer | The dest layer service in kubernetes. | | string | +| Name | Remarks | Group Key | Type | +|-------------------|--------------------------------------------------------------------|-----------|--------------| +| sourceServiceName | The source service name in kubernetes. | | string | +| sourceLayer | The source layer service in kubernetes. | | string | +| detectPoint | Where the relation is detected. The value may be client or server. | | enum | +| componentIds | The ID of component used in this call. | | List | +| tlsMode | The TLS mode of relation. The value may be Plain or TLS. | | enum | +| destServiceName | The dest service name in kubernetes. | | string | +| destLayer | The dest layer service in kubernetes. | | string | ##### SCOPE `K8SServiceRelation` From 072f4e6254190d0ab31ae90b2e5d50195b71078d Mon Sep 17 00:00:00 2001 From: mrproliu <741550557@qq.com> Date: Sat, 17 May 2025 16:30:59 +0800 Subject: [PATCH 4/4] add break change --- docs/en/changes/changes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/changes/changes.md b/docs/en/changes/changes.md index fca41f465cb1..b167a8d4e648 100644 --- a/docs/en/changes/changes.md +++ b/docs/en/changes/changes.md @@ -18,6 +18,7 @@ * Limit max attempts of DNS resolution of Istio ServiceEntry to 3, and do not wait for first resolution result in case the DNS is not resolvable at all. * Support analysis waypoint metrics in Envoy ALS receiver. * Add Ztunnel component in the topology. +* [Break Change] Change `compomentId` to `componentIds` in the K8SServiceRelation Scope. #### UI