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 f8716b49e6 Support to analysis the ztunnel mapped IP address in eBPF
Access Log Receiver (#12620)
f8716b49e6 is described below
commit f8716b49e6325f97685f65769a5f1b03bea43b50
Author: mrproliu <[email protected]>
AuthorDate: Sat Sep 14 14:02:06 2024 +0800
Support to analysis the ztunnel mapped IP address in eBPF Access Log
Receiver (#12620)
---
apm-protocol/apm-network/src/main/proto | 2 +-
docs/en/changes/changes.md | 1 +
.../provider/handler/AccessLogServiceHandler.java | 25 +++++++++++++++-------
3 files changed, 19 insertions(+), 9 deletions(-)
diff --git a/apm-protocol/apm-network/src/main/proto
b/apm-protocol/apm-network/src/main/proto
index b5f6ebe281..4f3b17e1b0 160000
--- a/apm-protocol/apm-network/src/main/proto
+++ b/apm-protocol/apm-network/src/main/proto
@@ -1 +1 @@
-Subproject commit b5f6ebe281b96d89968959f55baa3d9aa1bfecee
+Subproject commit 4f3b17e1b0b3c3dcc0e1ed3da86efaac785ea157
diff --git a/docs/en/changes/changes.md b/docs/en/changes/changes.md
index 3aa3cd7d13..96e4410e41 100644
--- a/docs/en/changes/changes.md
+++ b/docs/en/changes/changes.md
@@ -64,6 +64,7 @@
* Fix query `getGlobalTopology` throw exception when didn't find any services
by the given Layer.
* Fix the previous analysis result missing in the ALS `k8s-mesh` analyzer.
* Fix `findEndpoint` query require `keyword` when using BanyanDB.
+* Support to analysis the ztunnel mapped IP address in eBPF Access Log
Receiver.
#### UI
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 b0467bbf5a..602f68a268 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
@@ -45,6 +45,7 @@ import org.apache.skywalking.apm.network.common.v3.Instant;
import org.apache.skywalking.apm.network.ebpf.accesslog.v3.EBPFTimestamp;
import org.apache.skywalking.apm.network.ebpf.accesslog.v3.IPAddress;
import
org.apache.skywalking.apm.network.ebpf.accesslog.v3.KubernetesProcessAddress;
+import
org.apache.skywalking.apm.network.ebpf.accesslog.v3.ZTunnelAttachmentEnvironment;
import org.apache.skywalking.library.kubernetes.ObjectID;
import org.apache.skywalking.oap.meter.analyzer.k8s.K8sInfoRegistry;
import org.apache.skywalking.oap.server.core.Const;
@@ -485,15 +486,23 @@ public class AccessLogServiceHandler extends
EBPFAccessLogServiceGrpc.EBPFAccess
});
}
- protected KubernetesProcessAddress buildKubernetesAddressByIP(NodeInfo
nodeInfo, IPAddress ipAddress) {
- final ObjectID service =
K8sInfoRegistry.getInstance().findServiceByIP(ipAddress.getHost());
+ protected KubernetesProcessAddress buildKubernetesAddressByIP(NodeInfo
nodeInfo, AccessLogConnection connection, boolean isLocal, IPAddress ipAddress)
{
+ String host = ipAddress.getHost();
+ // if the resolving address is not local, and have attached ztunnel
info, then using the ztunnel mapped host
+ if (!isLocal && connection.hasAttachment() &&
connection.getAttachment().hasZTunnel()) {
+ final ZTunnelAttachmentEnvironment ztunnel =
connection.getAttachment().getZTunnel();
+ host = ztunnel.getRealDestinationIp();
+ log.debug("detected the ztunnel connection, so update the remote
IP address as: {}, detect by: {}", host,
+ ztunnel.getBy());
+ }
+ final ObjectID service =
K8sInfoRegistry.getInstance().findServiceByIP(host);
if (service != ObjectID.EMPTY) {
return buildRemoteAddress(nodeInfo, service, null);
}
- final ObjectID pod =
K8sInfoRegistry.getInstance().findPodByIP(ipAddress.getHost());
+ final ObjectID pod = K8sInfoRegistry.getInstance().findPodByIP(host);
if (pod == ObjectID.EMPTY) {
// if cannot found the address, then return the unknown address
- log.debug("building unknown address by ip: {}:{}",
ipAddress.getHost(), ipAddress.getPort());
+ log.debug("building unknown address by ip: {}:{}", host,
ipAddress.getPort());
return buildUnknownAddress();
}
final ObjectID serviceName =
K8sInfoRegistry.getInstance().findService(pod.namespace(), pod.name());
@@ -536,8 +545,8 @@ public class AccessLogServiceHandler extends
EBPFAccessLogServiceGrpc.EBPFAccess
public ConnectionInfo(NamingControl namingControl, NodeInfo nodeInfo,
AccessLogConnection connection) {
this.originalConnection = connection;
this.namingControl = namingControl;
- this.local = buildAddress(nodeInfo, connection.getLocal());
- this.remote = buildAddress(nodeInfo, connection.getRemote());
+ this.local = buildAddress(nodeInfo, connection, true,
connection.getLocal());
+ this.remote = buildAddress(nodeInfo, connection, false,
connection.getRemote());
this.role = connection.getRole();
this.tlsMode = connection.getTlsMode();
this.nodeInfo = nodeInfo;
@@ -549,12 +558,12 @@ public class AccessLogServiceHandler extends
EBPFAccessLogServiceGrpc.EBPFAccess
}
}
- private KubernetesProcessAddress buildAddress(NodeInfo nodeInfo,
ConnectionAddress address) {
+ private KubernetesProcessAddress buildAddress(NodeInfo nodeInfo,
AccessLogConnection connection, boolean local, ConnectionAddress address) {
switch (address.getAddressCase()) {
case KUBERNETES:
return address.getKubernetes();
case IP:
- return buildKubernetesAddressByIP(nodeInfo,
address.getIp());
+ return buildKubernetesAddressByIP(nodeInfo, connection,
local, address.getIp());
}
return null;
}