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

frankchen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git


The following commit(s) were added to refs/heads/master by this push:
     new cc3b20534f7 Add version to sys server (#18542)
cc3b20534f7 is described below

commit cc3b20534f7f2e67d820d601bd51de07755652c4
Author: Gabriel Chang <[email protected]>
AuthorDate: Thu Sep 25 10:02:24 2025 +0800

    Add version to sys server (#18542)
    
    * Add version to sys.servers
    
    * Display version in services tab
    
    * Fixing missing version assignment
    
    * Fix format errors
    
    * Add back removed line
    
    * Fix based on comments
    
    * Refactor unknown version string to constant
    
    * Fix missing syntax
    
    * Update tests
    
    * Fix format
    
    * Refactor test to use DruidNode.UNKNOWN_VERSION
---
 docs/querying/sql-metadata-tables.md               |  1 +
 .../security/AbstractAuthConfigurationTest.java    | 13 +++--
 .../results/auth_test_sys_schema_servers.json      |  6 ++-
 .../java/org/apache/druid/server/DruidNode.java    |  4 +-
 .../org/apache/druid/server/DruidNodeTest.java     |  2 +-
 .../druid/sql/calcite/schema/SystemSchema.java     | 10 ++--
 .../druid/sql/calcite/schema/SystemSchemaTest.java | 59 +++++++++++++++-------
 .../__snapshots__/services-view.spec.tsx.snap      |  9 ++++
 .../src/views/services-view/services-view.tsx      | 15 +++++-
 9 files changed, 88 insertions(+), 31 deletions(-)

diff --git a/docs/querying/sql-metadata-tables.md 
b/docs/querying/sql-metadata-tables.md
index cd2db5cf14c..aa1804e29d5 100644
--- a/docs/querying/sql-metadata-tables.md
+++ b/docs/querying/sql-metadata-tables.md
@@ -236,6 +236,7 @@ Servers table lists all discovered servers in the cluster.
 |max_size|BIGINT|Max size in bytes this server recommends to assign to 
segments see 
[druid.server.maxSize](../configuration/index.md#historical-general-configuration).
 Only valid for HISTORICAL type, for other types it's 0|
 |is_leader|BIGINT|1 if the server is currently the 'leader' (for services 
which have the concept of leadership), otherwise 0 if the server is not the 
leader, or null if the server type does not have the concept of leadership|
 |start_time|STRING|Timestamp in ISO8601 format when the server was announced 
in the cluster|
+|version|VARCHAR|Druid version running on the server|
 To retrieve information about all servers, use the query:
 
 ```sql
diff --git 
a/integration-tests/src/test/java/org/apache/druid/tests/security/AbstractAuthConfigurationTest.java
 
b/integration-tests/src/test/java/org/apache/druid/tests/security/AbstractAuthConfigurationTest.java
index c92ae067667..53803b09813 100644
--- 
a/integration-tests/src/test/java/org/apache/druid/tests/security/AbstractAuthConfigurationTest.java
+++ 
b/integration-tests/src/test/java/org/apache/druid/tests/security/AbstractAuthConfigurationTest.java
@@ -284,7 +284,7 @@ public abstract class AbstractAuthConfigurationTest
     verifySystemSchemaServerQuery(
         adminClient,
         SYS_SCHEMA_SERVERS_QUERY,
-        getServersWithoutCurrentSizeAndStartTime(adminServers)
+        getServersWithoutNonConfigurableFields(adminServers)
     );
 
     LOG.info("Checking sys.server_segments query as admin...");
@@ -858,7 +858,7 @@ public abstract class AbstractAuthConfigurationTest
     String content = responseHolder.getContent();
     List<Map<String, Object>> responseMap = jsonMapper.readValue(content, 
SYS_SCHEMA_RESULTS_TYPE_REFERENCE);
     if (isServerQuery) {
-      responseMap = getServersWithoutCurrentSizeAndStartTime(responseMap);
+      responseMap = getServersWithoutNonConfigurableFields(responseMap);
     }
     Assert.assertEquals(responseMap, expectedResults);
   }
@@ -1005,7 +1005,7 @@ public abstract class AbstractAuthConfigurationTest
         SYS_SCHEMA_RESULTS_TYPE_REFERENCE
     );
 
-    adminServers = getServersWithoutCurrentSizeAndStartTime(
+    adminServers = getServersWithoutNonConfigurableFields(
         jsonMapper.readValue(
             fillServersTemplate(
                 config,
@@ -1025,10 +1025,12 @@ public abstract class AbstractAuthConfigurationTest
   }
 
   /**
-   * curr_size on historicals changes because cluster state is not isolated 
across different
+   * curr_size on historicals changes because cluster state is not isolated 
across
+   * different
    * integration tests, zero it out for consistent test results
+   * version and start_time are not configurable therefore we zero them as well
    */
-  protected static List<Map<String, Object>> 
getServersWithoutCurrentSizeAndStartTime(List<Map<String, Object>> servers)
+  protected static List<Map<String, Object>> 
getServersWithoutNonConfigurableFields(List<Map<String, Object>> servers)
   {
     return Lists.transform(
         servers,
@@ -1036,6 +1038,7 @@ public abstract class AbstractAuthConfigurationTest
           Map<String, Object> newServer = new HashMap<>(server);
           newServer.put("curr_size", 0);
           newServer.put("start_time", "0");
+          newServer.put("version", "0.0.0");
           return newServer;
         }
     );
diff --git 
a/integration-tests/src/test/resources/results/auth_test_sys_schema_servers.json
 
b/integration-tests/src/test/resources/results/auth_test_sys_schema_servers.json
index 8c4fb14c520..520fde8ff56 100644
--- 
a/integration-tests/src/test/resources/results/auth_test_sys_schema_servers.json
+++ 
b/integration-tests/src/test/resources/results/auth_test_sys_schema_servers.json
@@ -9,7 +9,8 @@
     "curr_size": 2208932412,
     "max_size": 5000000000,
     "is_leader": null,
-    "start_time": "0"
+    "start_time": "0",
+    "version": "0.0.0"
   },
   {
     "server": "%%BROKER%%:8282",
@@ -21,6 +22,7 @@
     "curr_size": 0,
     "max_size": 1000000000,
     "is_leader": null,
-    "start_time": "0"
+    "start_time": "0",
+    "version": "0.0.0"
   }
 ]
diff --git a/server/src/main/java/org/apache/druid/server/DruidNode.java 
b/server/src/main/java/org/apache/druid/server/DruidNode.java
index 225f054c73e..0e3b3e4b4d0 100644
--- a/server/src/main/java/org/apache/druid/server/DruidNode.java
+++ b/server/src/main/java/org/apache/druid/server/DruidNode.java
@@ -44,6 +44,8 @@ import java.util.Objects;
  */
 public class DruidNode
 {
+  public static final String UNKNOWN_VERSION = "unknown";
+
   @JsonProperty("service")
   @NotNull
   private String serviceName;
@@ -86,7 +88,7 @@ public class DruidNode
   @NotNull
   private final String version = GuavaUtils.firstNonNull(
       DruidNode.class.getPackage().getImplementationVersion(),
-      "unknown"
+      UNKNOWN_VERSION
   );
 
   public DruidNode(
diff --git a/server/src/test/java/org/apache/druid/server/DruidNodeTest.java 
b/server/src/test/java/org/apache/druid/server/DruidNodeTest.java
index f0fde0117ac..77edaaad137 100644
--- a/server/src/test/java/org/apache/druid/server/DruidNodeTest.java
+++ b/server/src/test/java/org/apache/druid/server/DruidNodeTest.java
@@ -53,7 +53,7 @@ public class DruidNodeTest
     // Hosts which report only ipv6 will have getDefaultHost() report 
something like fe80::6e40:8ff:fe93:9230
     // but getHostAndPort() reports [fe80::6e40:8ff:fe93:9230]
     
Assert.assertEquals(HostAndPort.fromString(DruidNode.getDefaultHost()).toString(),
 node.getHostAndPort());
-    Assert.assertEquals("unknown", node.getVersion()); // unknown because not 
compiled with version
+    Assert.assertEquals(DruidNode.UNKNOWN_VERSION, node.getVersion()); // 
unknown because not compiled with version
 
     node = new DruidNode(service, "2001:db8:85a3::8a2e:370:7334", false, -1, 
null, true, false);
     Assert.assertEquals("2001:db8:85a3::8a2e:370:7334", node.getHost());
diff --git 
a/sql/src/main/java/org/apache/druid/sql/calcite/schema/SystemSchema.java 
b/sql/src/main/java/org/apache/druid/sql/calcite/schema/SystemSchema.java
index 76e6f37ab59..932404f21e7 100644
--- a/sql/src/main/java/org/apache/druid/sql/calcite/schema/SystemSchema.java
+++ b/sql/src/main/java/org/apache/druid/sql/calcite/schema/SystemSchema.java
@@ -180,6 +180,7 @@ public class SystemSchema extends AbstractSchema
       .add("max_size", ColumnType.LONG)
       .add("is_leader", ColumnType.LONG)
       .add("start_time", ColumnType.STRING)
+      .add("version", ColumnType.STRING)
       .build();
 
   static final RowSignature SERVER_SEGMENTS_SIGNATURE = RowSignature
@@ -639,7 +640,8 @@ public class SystemSchema extends AbstractSchema
           UNKNOWN_SIZE,
           UNKNOWN_SIZE,
           null,
-          toStringOrNull(discoveryDruidNode.getStartTime())
+          toStringOrNull(discoveryDruidNode.getStartTime()),
+          node.getVersion()
       };
     }
 
@@ -662,7 +664,8 @@ public class SystemSchema extends AbstractSchema
           UNKNOWN_SIZE,
           UNKNOWN_SIZE,
           isLeader ? 1L : 0L,
-          toStringOrNull(discoveryDruidNode.getStartTime())
+          toStringOrNull(discoveryDruidNode.getStartTime()),
+          node.getVersion()
       };
     }
 
@@ -697,7 +700,8 @@ public class SystemSchema extends AbstractSchema
           currentSize,
           druidServerToUse.getMaxSize(),
           null,
-          toStringOrNull(discoveryDruidNode.getStartTime())
+          toStringOrNull(discoveryDruidNode.getStartTime()),
+          node.getVersion()
       };
     }
 
diff --git 
a/sql/src/test/java/org/apache/druid/sql/calcite/schema/SystemSchemaTest.java 
b/sql/src/test/java/org/apache/druid/sql/calcite/schema/SystemSchemaTest.java
index 0fc01c1aa09..d523d970fcc 100644
--- 
a/sql/src/test/java/org/apache/druid/sql/calcite/schema/SystemSchemaTest.java
+++ 
b/sql/src/test/java/org/apache/druid/sql/calcite/schema/SystemSchemaTest.java
@@ -44,6 +44,7 @@ import org.apache.druid.client.InternalQueryConfig;
 import org.apache.druid.client.TimelineServerView;
 import org.apache.druid.client.coordinator.CoordinatorClient;
 import org.apache.druid.client.coordinator.NoopCoordinatorClient;
+import org.apache.druid.common.guava.GuavaUtils;
 import org.apache.druid.data.input.InputRow;
 import org.apache.druid.data.input.impl.DimensionsSpec;
 import org.apache.druid.data.input.impl.StringDimensionSchema;
@@ -381,6 +382,11 @@ public class SystemSchemaTest extends CalciteTestBase
 
   private final DateTime startTime = DateTimes.nowUtc();
 
+  private final String version = GuavaUtils.firstNonNull(
+          SystemSchemaTest.class.getPackage().getImplementationVersion(),
+          DruidNode.UNKNOWN_VERSION
+      );
+
   private final DiscoveryDruidNode coordinator = new DiscoveryDruidNode(
       new DruidNode("s1", "localhost", false, 8081, null, true, false),
       NodeRole.COORDINATOR,
@@ -552,7 +558,7 @@ public class SystemSchemaTest extends CalciteTestBase
     final SystemSchema.ServersTable serversTable = (SystemSchema.ServersTable) 
schema.getTableMap().get("servers");
     final RelDataType serverRowType = serversTable.getRowType(new 
JavaTypeFactoryImpl());
     final List<RelDataTypeField> serverFields = serverRowType.getFieldList();
-    Assert.assertEquals(10, serverFields.size());
+    Assert.assertEquals(11, serverFields.size());
     Assert.assertEquals("server", serverFields.get(0).getName());
     Assert.assertEquals(SqlTypeName.VARCHAR, 
serverFields.get(0).getType().getSqlTypeName());
   }
@@ -851,7 +857,8 @@ public class SystemSchemaTest extends CalciteTestBase
             0L,
             0L,
             nonLeader,
-            startTimeStr
+            startTimeStr,
+            version
         )
     );
     expectedRows.add(
@@ -865,7 +872,8 @@ public class SystemSchemaTest extends CalciteTestBase
             0L,
             1000L,
             nonLeader,
-            startTimeStr
+            startTimeStr,
+            version
         )
     );
     expectedRows.add(
@@ -879,7 +887,8 @@ public class SystemSchemaTest extends CalciteTestBase
             400L,
             1000L,
             nonLeader,
-            startTimeStr
+            startTimeStr,
+            version
         )
     );
     expectedRows.add(
@@ -893,7 +902,8 @@ public class SystemSchemaTest extends CalciteTestBase
             0L,
             1000L,
             nonLeader,
-            startTimeStr
+            startTimeStr,
+            version
         )
     );
     expectedRows.add(
@@ -907,7 +917,8 @@ public class SystemSchemaTest extends CalciteTestBase
             0L,
             1000L,
             nonLeader,
-            startTimeStr
+            startTimeStr,
+            version
         )
     );
     expectedRows.add(createExpectedRow(
@@ -920,7 +931,8 @@ public class SystemSchemaTest extends CalciteTestBase
         0L,
         1000L,
         nonLeader,
-        startTimeStr
+        startTimeStr,
+        version
     ));
     expectedRows.add(
         createExpectedRow(
@@ -933,7 +945,8 @@ public class SystemSchemaTest extends CalciteTestBase
             0L,
             0L,
             1L,
-            startTimeStr
+            startTimeStr,
+            version
         )
     );
     expectedRows.add(
@@ -947,7 +960,8 @@ public class SystemSchemaTest extends CalciteTestBase
             0L,
             0L,
             nonLeader,
-            startTimeStr
+            startTimeStr,
+            version
         )
     );
     expectedRows.add(
@@ -961,7 +975,8 @@ public class SystemSchemaTest extends CalciteTestBase
             200L,
             1000L,
             nonLeader,
-            startTimeStr
+            startTimeStr,
+            version
         )
     );
     expectedRows.add(
@@ -975,7 +990,8 @@ public class SystemSchemaTest extends CalciteTestBase
             0L,
             0L,
             1L,
-            startTimeStr
+            startTimeStr,
+            version
         )
     );
     expectedRows.add(
@@ -989,7 +1005,8 @@ public class SystemSchemaTest extends CalciteTestBase
             0L,
             0L,
             0L,
-            startTimeStr
+            startTimeStr,
+            version
         )
     );
     expectedRows.add(
@@ -1003,7 +1020,8 @@ public class SystemSchemaTest extends CalciteTestBase
             0L,
             0L,
             0L,
-            startTimeStr
+            startTimeStr,
+            version
         )
     );
     expectedRows.add(
@@ -1017,7 +1035,8 @@ public class SystemSchemaTest extends CalciteTestBase
             0L,
             0L,
             nonLeader,
-            startTimeStr
+            startTimeStr,
+            version
         )
     );
     expectedRows.add(
@@ -1031,7 +1050,8 @@ public class SystemSchemaTest extends CalciteTestBase
             0L,
             0L,
             nonLeader,
-            startTimeStr
+            startTimeStr,
+            version
         )
     );
     expectedRows.add(createExpectedRow(
@@ -1044,7 +1064,8 @@ public class SystemSchemaTest extends CalciteTestBase
         0L,
         1000L,
         nonLeader,
-        startTimeStr
+        startTimeStr,
+        version
     ));
     Assert.assertEquals(expectedRows.size(), rows.size());
     for (int i = 0; i < rows.size(); i++) {
@@ -1077,7 +1098,8 @@ public class SystemSchemaTest extends CalciteTestBase
       @Nullable Long currSize,
       @Nullable Long maxSize,
       @Nullable Long isLeader,
-      String startTime
+      String startTime,
+      String version
   )
   {
     return new Object[]{
@@ -1090,7 +1112,8 @@ public class SystemSchemaTest extends CalciteTestBase
         currSize,
         maxSize,
         isLeader,
-        startTime
+        startTime,
+        version
     };
   }
 
diff --git 
a/web-console/src/views/services-view/__snapshots__/services-view.spec.tsx.snap 
b/web-console/src/views/services-view/__snapshots__/services-view.spec.tsx.snap
index 329a7fd3562..b2158116696 100644
--- 
a/web-console/src/views/services-view/__snapshots__/services-view.spec.tsx.snap
+++ 
b/web-console/src/views/services-view/__snapshots__/services-view.spec.tsx.snap
@@ -58,6 +58,7 @@ exports[`ServicesView renders data 1`] = `
           "Max size",
           "Usage",
           "Start time",
+          "Version",
           "Detail",
         ]
       }
@@ -208,6 +209,14 @@ exports[`ServicesView renders data 1`] = `
             "show": true,
             "width": 200,
           },
+          {
+            "Aggregated": [Function],
+            "Cell": [Function],
+            "Header": "Version",
+            "accessor": "version",
+            "show": true,
+            "width": 200,
+          },
           {
             "Aggregated": [Function],
             "Cell": [Function],
diff --git a/web-console/src/views/services-view/services-view.tsx 
b/web-console/src/views/services-view/services-view.tsx
index ea9c5653e9d..1ac4e42c712 100644
--- a/web-console/src/views/services-view/services-view.tsx
+++ b/web-console/src/views/services-view/services-view.tsx
@@ -84,6 +84,7 @@ const TABLE_COLUMNS_BY_MODE: Record<CapabilitiesMode, 
TableColumnSelectorColumn[
     'Max size',
     'Usage',
     'Start time',
+    'Version',
     'Detail',
   ],
   'no-sql': [
@@ -107,6 +108,7 @@ const TABLE_COLUMNS_BY_MODE: Record<CapabilitiesMode, 
TableColumnSelectorColumn[
     'Max size',
     'Usage',
     'Start time',
+    'Version',
   ],
 };
 
@@ -143,6 +145,7 @@ interface ServiceResultRow {
   readonly plaintext_port: number;
   readonly tls_port: number;
   readonly start_time: string;
+  readonly version: string;
 }
 
 interface ServicesWithAuxiliaryInfo {
@@ -238,7 +241,8 @@ export class ServicesView extends 
React.PureComponent<ServicesViewProps, Service
   "curr_size",
   "max_size",
   "is_leader",
-  "start_time"
+  "start_time",
+  "version"
 FROM sys.servers
 ORDER BY
   (
@@ -287,6 +291,7 @@ ORDER BY
                 max_size: s.maxSize,
                 start_time: '1970:01:01T00:00:00Z',
                 is_leader: 0,
+                version: '',
               };
             },
           );
@@ -616,6 +621,14 @@ ORDER BY
           Cell: this.renderFilterableCell('start_time'),
           Aggregated: () => '',
         },
+        {
+          Header: 'Version',
+          show: visibleColumns.shown('Version'),
+          accessor: 'version',
+          width: 200,
+          Cell: this.renderFilterableCell('version'),
+          Aggregated: () => '',
+        },
         {
           Header: 'Detail',
           show: visibleColumns.shown('Detail'),


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

Reply via email to