From fe43f8291727e3d2a5d1b8582ec6f2154146629c Mon Sep 17 00:00:00 2001 From: "Vymazal, Milan" Date: Fri, 27 Feb 2026 10:27:24 +0100 Subject: [PATCH] HBASE-29972 Expose HBase version in metrics --- .../apache/hadoop/hbase/master/MetricsMasterSource.java | 3 +++ .../hadoop/hbase/master/MetricsMasterSourceImpl.java | 4 +++- .../apache/hadoop/hbase/master/MetricsMasterWrapper.java | 5 +++++ .../hbase/regionserver/MetricsRegionServerSource.java | 2 ++ .../hbase/regionserver/MetricsRegionServerSourceImpl.java | 3 ++- .../hbase/regionserver/MetricsRegionServerWrapper.java | 2 ++ .../hadoop/hbase/master/MetricsMasterWrapperImpl.java | 7 +++++++ .../hbase/regionserver/MetricsRegionServerWrapperImpl.java | 6 ++++++ .../org/apache/hadoop/hbase/master/TestMasterMetrics.java | 3 +++ .../hadoop/hbase/master/TestMasterMetricsWrapper.java | 4 ++++ .../hbase/regionserver/MetricsRegionServerWrapperStub.java | 5 +++++ .../hadoop/hbase/regionserver/TestMetricsRegionServer.java | 1 + 12 files changed, 43 insertions(+), 2 deletions(-) diff --git a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterSource.java b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterSource.java index d606ed630881..0812fae4ec9c 100644 --- a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterSource.java +++ b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterSource.java @@ -71,6 +71,8 @@ public interface MetricsMasterSource extends BaseSource { String CLUSTER_READ_REQUESTS_NAME = "clusterReadRequests"; String CLUSTER_WRITE_REQUESTS_NAME = "clusterWriteRequests"; String OLD_WAL_DIR_SIZE_NAME = "oldWALsDirSize"; + String HBASE_VERSION_NAME = "hbaseVersion"; + String MASTER_ACTIVE_TIME_DESC = "Master Active Time"; String MASTER_START_TIME_DESC = "Master Start Time"; String MASTER_FINISHED_INITIALIZATION_TIME_DESC = @@ -93,6 +95,7 @@ public interface MetricsMasterSource extends BaseSource { String SERVER_CRASH_METRIC_PREFIX = "serverCrash"; String OLD_WAL_DIR_SIZE_DESC = "size of old WALs directory in bytes"; + String HBASE_VERSION_DESC = "HBase Version"; /** * Increment the number of requests the cluster has seen. diff --git a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterSourceImpl.java b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterSourceImpl.java index 011e66312aa3..7ebbf63b4fdf 100644 --- a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterSourceImpl.java +++ b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterSourceImpl.java @@ -131,7 +131,9 @@ public void getMetrics(MetricsCollector metricsCollector, boolean all) { .tag(Interns.info(IS_ACTIVE_MASTER_NAME, IS_ACTIVE_MASTER_DESC), String.valueOf(masterWrapper.getIsActiveMaster())) .addGauge(Interns.info(OLD_WAL_DIR_SIZE_NAME, OLD_WAL_DIR_SIZE_DESC), - masterWrapper.getOldWALsDirSize()); + masterWrapper.getOldWALsDirSize()) + .tag(Interns.info(HBASE_VERSION_NAME, HBASE_VERSION_DESC), + masterWrapper.getSoftwareVersion()); } metricsRegistry.snapshot(metricsRecordBuilder, all); diff --git a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapper.java b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapper.java index 83419e2d5501..b67877b7da2a 100644 --- a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapper.java +++ b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapper.java @@ -158,4 +158,9 @@ public interface MetricsMasterWrapper { * Get the size of old WALs directory in bytes. */ long getOldWALsDirSize(); + + /* + * Get the HBase version. + */ + String getSoftwareVersion(); } diff --git a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSource.java b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSource.java index 25dfbbd180db..0db43b4cba8f 100644 --- a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSource.java +++ b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSource.java @@ -673,4 +673,6 @@ public interface MetricsRegionServerSource extends BaseSource, JvmPauseMonitorSo "Count of slow/connect error DataNodes excluded during WAL write operation"; String EXCLUDE_DATA_NODES_DETAILS = "excludedDataNodesDetails"; String EXCLUDE_DATA_NODES_DETAILS_DESC = "Excluded DataNodes info"; + String HBASE_VERSION_NAME = "hbaseVersion"; + String HBASE_VERSION_DESC = "The version of HBase"; } diff --git a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceImpl.java b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceImpl.java index 8c44f80451fe..e23f2b27a50b 100644 --- a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceImpl.java +++ b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceImpl.java @@ -502,7 +502,8 @@ public void getMetrics(MetricsCollector metricsCollector, boolean all) { .tag(Interns.info(ZOOKEEPER_QUORUM_NAME, ZOOKEEPER_QUORUM_DESC), rsWrap.getZookeeperQuorum()) .tag(Interns.info(SERVER_NAME_NAME, SERVER_NAME_DESC), rsWrap.getServerName()) - .tag(Interns.info(CLUSTER_ID_NAME, CLUSTER_ID_DESC), rsWrap.getClusterId()); + .tag(Interns.info(CLUSTER_ID_NAME, CLUSTER_ID_DESC), rsWrap.getClusterId()) + .tag(Interns.info(HBASE_VERSION_NAME, HBASE_VERSION_DESC), rsWrap.getSoftwareVersion()); if (!rsWrap.getWALExcludeDNs().isEmpty()) { metricsRecordBuilder.tag( Interns.info(EXCLUDE_DATA_NODES_DETAILS, EXCLUDE_DATA_NODES_DETAILS_DESC), diff --git a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapper.java b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapper.java index 240c084b6837..426732d49de4 100644 --- a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapper.java +++ b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapper.java @@ -688,4 +688,6 @@ public interface MetricsRegionServerWrapper { long getByteBuffAllocatorUsedBufferCount(); int getActiveScanners(); + + String getSoftwareVersion(); } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapperImpl.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapperImpl.java index ff6f5b8e5df8..1aba9ebdd94f 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapperImpl.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapperImpl.java @@ -32,6 +32,7 @@ import org.apache.hadoop.hbase.quotas.QuotaObserverChore; import org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshot; import org.apache.hadoop.hbase.util.PairOfSameType; +import org.apache.hadoop.hbase.util.VersionInfo; import org.apache.hadoop.hbase.zookeeper.ZKWatcher; import org.apache.yetus.audience.InterfaceAudience; @@ -246,4 +247,10 @@ public long getOldWALsDirSize() { } return master.getMasterWalManager().getOldWALsDirSize(); } + + @Override + public String getSoftwareVersion() { + return VersionInfo.getVersion() + ", r" + VersionInfo.getRevision(); + } + } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperImpl.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperImpl.java index 40a6bdf3dadb..17a9fe89d4ca 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperImpl.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperImpl.java @@ -44,6 +44,7 @@ import org.apache.hadoop.hbase.regionserver.wal.MetricsWALSource; import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; import org.apache.hadoop.hbase.util.FSUtils; +import org.apache.hadoop.hbase.util.VersionInfo; import org.apache.hadoop.hbase.wal.WALProvider; import org.apache.hadoop.hbase.zookeeper.ZKWatcher; import org.apache.hadoop.hdfs.DFSHedgedReadMetrics; @@ -776,6 +777,11 @@ public int getActiveScanners() { return regionServer.getRpcServices().getScannersCount(); } + @Override + public String getSoftwareVersion() { + return VersionInfo.getVersion() + ", r" + VersionInfo.getRevision(); + } + private static final class RegionMetricAggregate { private long numStores = 0; private long numStoreFiles = 0; diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterMetrics.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterMetrics.java index 09618b3d899e..1cdca512b569 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterMetrics.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterMetrics.java @@ -33,6 +33,7 @@ import org.apache.hadoop.hbase.testclassification.MasterTests; import org.apache.hadoop.hbase.testclassification.MediumTests; import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; +import org.apache.hadoop.hbase.util.VersionInfo; import org.apache.zookeeper.KeeperException; import org.junit.AfterClass; import org.junit.BeforeClass; @@ -180,6 +181,8 @@ public void testDefaultMasterMetrics() throws Exception { metricsHelper.assertTag("serverName", master.getServerName().toString(), masterSource); metricsHelper.assertTag("clusterId", master.getClusterId(), masterSource); metricsHelper.assertTag("zookeeperQuorum", master.getZooKeeper().getQuorum(), masterSource); + metricsHelper.assertTag("hbaseVersion", + VersionInfo.getVersion() + ", r" + VersionInfo.getRevision(), masterSource); metricsHelper.assertCounter(MetricsMasterSource.SERVER_CRASH_METRIC_PREFIX + "SubmittedCount", 0, masterSource); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterMetricsWrapper.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterMetricsWrapper.java index d1389ee68e9f..27c0aac3cb3e 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterMetricsWrapper.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterMetricsWrapper.java @@ -40,6 +40,7 @@ import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; import org.apache.hadoop.hbase.util.PairOfSameType; import org.apache.hadoop.hbase.util.Threads; +import org.apache.hadoop.hbase.util.VersionInfo; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.ClassRule; @@ -86,7 +87,10 @@ public void testInfo() throws IOException { assertEquals(master.getServerManager().getOnlineServersList().size(), info.getNumRegionServers()); assertEquals(master.getMasterWalManager().getOldWALsDirSize(), info.getOldWALsDirSize()); + assertEquals(VersionInfo.getVersion() + ", r" + VersionInfo.getRevision(), + info.getSoftwareVersion()); int regionServerCount = NUM_RS; + assertEquals(regionServerCount, info.getNumRegionServers()); String zkServers = info.getZookeeperQuorum(); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperStub.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperStub.java index 093b0f0a3637..4824068464c1 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperStub.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperStub.java @@ -786,4 +786,9 @@ public long getAverageRegionSize() { public long getRpcFullScanRequestsCount() { return 10; } + + @Override + public String getSoftwareVersion() { + return "version"; + } } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionServer.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionServer.java index 8c6b3f04eb6b..6126a822da2e 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionServer.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionServer.java @@ -80,6 +80,7 @@ public void testWrapperSource() { HELPER.assertTag("serverName", "test", serverSource); HELPER.assertTag("clusterId", "tClusterId", serverSource); HELPER.assertTag("zookeeperQuorum", "zk", serverSource); + HELPER.assertTag("hbaseVersion", "version", serverSource); HELPER.assertGauge("regionServerStartTime", 100, serverSource); HELPER.assertGauge("regionCount", 101, serverSource); HELPER.assertGauge("storeCount", 2, serverSource);