This is an automated email from the ASF dual-hosted git repository.

ayushtkn pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/hadoop.git


The following commit(s) were added to refs/heads/trunk by this push:
     new a0f8f7e6dc3 HDFS-17934. RBF: Add router web address to router web UI 
(#8540). Contributed by Felix N
a0f8f7e6dc3 is described below

commit a0f8f7e6dc34c8fb6eb70723a36cf7c5721b782d
Author: Felix Nguyen <[email protected]>
AuthorDate: Wed Jul 1 02:43:31 2026 +0000

    HDFS-17934. RBF: Add router web address to router web UI (#8540). 
Contributed by Felix N
---
 .../hdfs/server/federation/metrics/RBFMetrics.java | 37 ++++++++++++++++++++++
 .../src/main/webapps/router/federationhealth.html  |  8 ++++-
 2 files changed, 44 insertions(+), 1 deletion(-)

diff --git 
a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/metrics/RBFMetrics.java
 
b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/metrics/RBFMetrics.java
index 3e111b9d6f2..0b5c05b4f1e 100644
--- 
a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/metrics/RBFMetrics.java
+++ 
b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/metrics/RBFMetrics.java
@@ -19,6 +19,7 @@
 
 import static 
org.apache.hadoop.hdfs.server.federation.router.async.utils.AsyncUtil.syncReturn;
 import static org.apache.hadoop.metrics2.impl.MsInfo.ProcessName;
+import static 
org.apache.hadoop.thirdparty.com.google.common.base.Strings.isNullOrEmpty;
 import static org.apache.hadoop.util.Time.now;
 
 import java.io.IOException;
@@ -26,6 +27,7 @@
 import java.math.BigInteger;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
+import java.net.URI;
 import java.net.UnknownHostException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
@@ -53,6 +55,7 @@
 
 import org.apache.commons.math3.stat.descriptive.moment.StandardDeviation;
 import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hdfs.DFSUtil;
 import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
 import org.apache.hadoop.hdfs.protocol.HdfsConstants.DatanodeReportType;
 import 
org.apache.hadoop.hdfs.server.federation.resolver.ActiveNamenodeResolver;
@@ -90,6 +93,7 @@
 import org.apache.hadoop.metrics2.lib.MetricsRegistry;
 import org.apache.hadoop.metrics2.util.MBeans;
 import org.apache.hadoop.metrics2.util.Metrics2Util;
+import org.apache.hadoop.net.NetUtils;
 import org.apache.hadoop.security.UserGroupInformation;
 import org.apache.hadoop.util.StringUtils;
 import org.apache.hadoop.util.VersionInfo;
@@ -343,6 +347,7 @@ public String getRouters() {
     if (routerStore == null) {
       return "{}";
     }
+    Configuration conf = router.getConfig();
     try {
       // Get all the routers in order
       GetRouterRegistrationsRequest request =
@@ -361,6 +366,7 @@ public String getRouters() {
         long dateModified = record.getDateModified();
         long lastHeartbeat = getSecondsSince(dateModified);
         innerInfo.put("lastHeartbeat", lastHeartbeat);
+        innerInfo.put("routerWebAddress", getRouterWebAddress(conf, 
record.getAdminAddress()));
 
         StateStoreVersion stateStoreVersion = record.getStateStoreVersion();
         if (stateStoreVersion == null) {
@@ -379,6 +385,37 @@ public String getRouters() {
     return JSON.toString(info);
   }
 
+  private static String getRouterWebAddress(Configuration conf, String 
adminAddress) {
+    try {
+      if (isNullOrEmpty(adminAddress)) {
+        return "";
+      }
+      String scheme = DFSUtil.getHttpClientScheme(conf);
+      int webPort = getRouterWebAddressPort(conf, scheme);
+      InetSocketAddress adminSocketAddress = 
NetUtils.createSocketAddr(adminAddress.trim());
+      return new URI(scheme, null, adminSocketAddress.getHostString(), 
webPort, null, null,
+          null).toString();
+    } catch (Exception e) {
+      LOG.error("Cannot get router web address", e);
+      return "";
+    }
+  }
+
+  private static int getRouterWebAddressPort(Configuration conf, String 
scheme) {
+    if ("http".equals(scheme)) {
+      return conf.getSocketAddr(
+          RBFConfigKeys.DFS_ROUTER_HTTP_BIND_HOST_KEY,
+          RBFConfigKeys.DFS_ROUTER_HTTP_ADDRESS_KEY,
+          RBFConfigKeys.DFS_ROUTER_HTTP_ADDRESS_DEFAULT,
+          RBFConfigKeys.DFS_ROUTER_HTTP_PORT_DEFAULT).getPort();
+    }
+    return conf.getSocketAddr(
+        RBFConfigKeys.DFS_ROUTER_HTTPS_BIND_HOST_KEY,
+        RBFConfigKeys.DFS_ROUTER_HTTPS_ADDRESS_KEY,
+        RBFConfigKeys.DFS_ROUTER_HTTPS_ADDRESS_DEFAULT,
+        RBFConfigKeys.DFS_ROUTER_HTTPS_PORT_DEFAULT).getPort();
+  }
+
   /**
    * Populate the map with the State Store versions.
    *
diff --git 
a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/webapps/router/federationhealth.html
 
b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/webapps/router/federationhealth.html
index 9367b2e99c1..acdead32ef9 100644
--- 
a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/webapps/router/federationhealth.html
+++ 
b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/webapps/router/federationhealth.html
@@ -303,7 +303,13 @@
     {#Routers}
     <tr>
       <td class="federationhealth-router-icon 
federationhealth-router-{iconState}" title="{title}"></td>
-      <td>{address}</td>
+      <td>
+        {?routerWebAddress}
+        <a href='{routerWebAddress}'>{address}</a>
+        {:else}
+        {address}
+        {/routerWebAddress}
+      </td>
       <td>{status}</td>
       <td>{lastHeartbeat} sec ago</td>
       <td>{lastMembershipUpdate}</td>


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to