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

abhishekrb 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 9a7079732e3 feat: Emit build revision dimension and add it to to 
sys.servers table (#19123)
9a7079732e3 is described below

commit 9a7079732e3f39f8f1cf170923ecf39dcfb08b64
Author: Razin Bouzar <[email protected]>
AuthorDate: Mon Mar 30 11:08:07 2026 -0400

    feat: Emit build revision dimension and add it to to sys.servers table 
(#19123)
    
    This patch exposes the build revision (git commit SHA) of the JAR running 
on each node:
    
    - buildRevision metric dimension — emitted on every metric so you can 
confirm all nodes in a cluster are running the intended revision during rolling 
deployments. Empty string when
    running outside a packaged JAR (e.g., during mvn test).
    - build_revision column in sys.servers — query it directly with SELECT 
server, version, build_revision FROM sys.servers. For more information, see 
SERVERS table.
---
 docs/operations/metrics.md                         |  2 +
 docs/querying/sql-metadata-tables.md               |  1 +
 .../java/org/apache/druid/server/BuildInfo.java    | 73 ++++++++++++++++++++++
 .../java/org/apache/druid/server/DruidNode.java    |  9 +++
 .../apache/druid/server/emitter/EmitterModule.java | 13 ++++
 .../org/apache/druid/server/BuildInfoTest.java     | 54 ++++++++++++++++
 .../druid/server/emitter/EmitterModuleTest.java    | 70 +++++++++++++++++++++
 .../druid/sql/calcite/schema/SystemSchema.java     |  4 ++
 .../druid/sql/calcite/schema/SystemSchemaTest.java | 22 ++++++-
 .../__snapshots__/services-view.spec.tsx.snap      | 13 ++++
 .../src/views/services-view/services-view.tsx      | 13 ++++
 website/.spelling                                  |  1 +
 12 files changed, 274 insertions(+), 1 deletion(-)

diff --git a/docs/operations/metrics.md b/docs/operations/metrics.md
index e5715e821ae..5b99f1be5b0 100644
--- a/docs/operations/metrics.md
+++ b/docs/operations/metrics.md
@@ -31,6 +31,8 @@ All Druid metrics share a common set of fields:
 * `metric`: the name of the metric
 * `service`: the service name that emitted the metric
 * `host`: the host name that emitted the metric
+* `version`: the Druid version of the service that emitted the metric
+* `buildRevision`: the git commit of the build that produced the service 
binary. Useful for verifying that all nodes in a cluster are running the 
intended revision during rolling deployments.
 * `value`: some numeric value associated with the metric
 
 Metrics may have additional dimensions beyond those listed above.
diff --git a/docs/querying/sql-metadata-tables.md 
b/docs/querying/sql-metadata-tables.md
index 802d88c567c..ebf5da39eba 100644
--- a/docs/querying/sql-metadata-tables.md
+++ b/docs/querying/sql-metadata-tables.md
@@ -237,6 +237,7 @@ Servers table lists all discovered servers in the cluster.
 |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|
+|build_revision|VARCHAR|The git commit of the build that produced the server 
binary|
 |labels|VARCHAR|Labels for the server configured using the property 
[`druid.labels`](../configuration/index.md)|
 |available_processors|BIGINT|Total number of CPU processors available to the 
server|
 |total_memory|BIGINT|Total memory in bytes available to the server|
diff --git a/server/src/main/java/org/apache/druid/server/BuildInfo.java 
b/server/src/main/java/org/apache/druid/server/BuildInfo.java
new file mode 100644
index 00000000000..0f794a94272
--- /dev/null
+++ b/server/src/main/java/org/apache/druid/server/BuildInfo.java
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.druid.server;
+
+import org.apache.druid.java.util.common.logger.Logger;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.jar.Manifest;
+
+/**
+ * Utility class for reading build metadata from the JAR manifest.
+ */
+public class BuildInfo
+{
+  private static final Logger log = new Logger(BuildInfo.class);
+
+  private BuildInfo()
+  {
+    // Utility class; do not instantiate.
+  }
+
+  /**
+   * Reads the {@code Build-Revision} attribute from the {@code 
META-INF/MANIFEST.MF} of the JAR
+   * that contains this class. Returns an empty string when running outside a 
packaged JAR
+   * (e.g., during {@code mvn test}).
+   */
+  public static String getBuildRevision()
+  {
+    try {
+      URL classUrl = 
BuildInfo.class.getResource(BuildInfo.class.getSimpleName() + ".class");
+      if (classUrl != null && "jar".equals(classUrl.getProtocol())) {
+        String classPath = classUrl.toString();
+        String manifestPath = classPath.substring(0, 
classPath.lastIndexOf('!') + 1) + "/META-INF/MANIFEST.MF";
+        try (InputStream is = new URL(manifestPath).openStream()) {
+          return readRevisionFromManifest(is);
+        }
+      }
+    }
+    catch (IOException e) {
+      log.warn(e, "Failed to read Build-Revision from JAR manifest");
+    }
+    return "";
+  }
+
+  /**
+   * Reads the {@code Build-Revision} attribute from a manifest {@link 
InputStream}.
+   * Returns an empty string if the attribute is absent.
+   */
+  static String readRevisionFromManifest(InputStream is) throws IOException
+  {
+    String revision = new 
Manifest(is).getMainAttributes().getValue("Build-Revision");
+    return revision != null ? revision : "";
+  }
+}
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 b6032bd0a1d..820d8d32a08 100644
--- a/server/src/main/java/org/apache/druid/server/DruidNode.java
+++ b/server/src/main/java/org/apache/druid/server/DruidNode.java
@@ -92,6 +92,10 @@ public class DruidNode
       UNKNOWN_VERSION
   );
 
+  @JsonProperty
+  @NotNull
+  private final String buildRevision = BuildInfo.getBuildRevision();
+
   @JsonProperty
   private Map<String, String> labels;
 
@@ -266,6 +270,11 @@ public class DruidNode
     return version;
   }
 
+  public String getBuildRevision()
+  {
+    return buildRevision;
+  }
+
   public DruidNode withService(String service)
   {
     return new DruidNode(service, host, bindOnHost, plaintextPort, tlsPort, 
enablePlaintextPort, enableTlsPort);
diff --git 
a/server/src/main/java/org/apache/druid/server/emitter/EmitterModule.java 
b/server/src/main/java/org/apache/druid/server/emitter/EmitterModule.java
index 41312c59208..46955a3fafb 100644
--- a/server/src/main/java/org/apache/druid/server/emitter/EmitterModule.java
+++ b/server/src/main/java/org/apache/druid/server/emitter/EmitterModule.java
@@ -43,6 +43,7 @@ import org.apache.druid.java.util.emitter.EmittingLogger;
 import org.apache.druid.java.util.emitter.core.Emitter;
 import org.apache.druid.java.util.emitter.service.ServiceEmitter;
 import org.apache.druid.java.util.metrics.TaskHolder;
+import org.apache.druid.server.BuildInfo;
 import org.apache.druid.server.DruidNode;
 
 import java.lang.annotation.Annotation;
@@ -92,6 +93,9 @@ public class EmitterModule implements Module
     extraServiceDimensions
         .addBinding("version")
         .toInstance(StringUtils.nullToEmptyNonDruidDataString(version)); // 
Version is null during `mvn test`.
+    extraServiceDimensions
+        .addBinding("buildRevision")
+        .toInstance(getBuildRevision());
   }
 
   @Provides
@@ -177,4 +181,13 @@ public class EmitterModule implements Module
       return emitter;
     }
   }
+
+  /**
+   * Returns the {@code Build-Revision} for the current build, delegating to 
{@link BuildInfo}.
+   * Overridable for testing.
+   */
+  protected String getBuildRevision()
+  {
+    return BuildInfo.getBuildRevision();
+  }
 }
diff --git a/server/src/test/java/org/apache/druid/server/BuildInfoTest.java 
b/server/src/test/java/org/apache/druid/server/BuildInfoTest.java
new file mode 100644
index 00000000000..f6017ea9fc6
--- /dev/null
+++ b/server/src/test/java/org/apache/druid/server/BuildInfoTest.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.druid.server;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+
+public class BuildInfoTest
+{
+  @Test
+  public void testGetBuildRevisionReturnsEmptyStringOutsideJar()
+  {
+    // During mvn test the class loads from the filesystem, not a JAR, so this 
must return "".
+    Assert.assertEquals("", BuildInfo.getBuildRevision());
+  }
+
+  @Test
+  public void testReadRevisionFromManifestWithRevisionPresent() throws 
IOException
+  {
+    String manifest = "Manifest-Version: 1.0\nBuild-Revision: abc123\n\n";
+    InputStream is = new 
ByteArrayInputStream(manifest.getBytes(StandardCharsets.UTF_8));
+    Assert.assertEquals("abc123", BuildInfo.readRevisionFromManifest(is));
+  }
+
+  @Test
+  public void testReadRevisionFromManifestWithRevisionAbsent() throws 
IOException
+  {
+    String manifest = "Manifest-Version: 1.0\n\n";
+    InputStream is = new 
ByteArrayInputStream(manifest.getBytes(StandardCharsets.UTF_8));
+    Assert.assertEquals("", BuildInfo.readRevisionFromManifest(is));
+  }
+}
diff --git 
a/server/src/test/java/org/apache/druid/server/emitter/EmitterModuleTest.java 
b/server/src/test/java/org/apache/druid/server/emitter/EmitterModuleTest.java
index 536ff5c34ce..7e7d0e60d1b 100644
--- 
a/server/src/test/java/org/apache/druid/server/emitter/EmitterModuleTest.java
+++ 
b/server/src/test/java/org/apache/druid/server/emitter/EmitterModuleTest.java
@@ -205,4 +205,74 @@ public class EmitterModuleTest
         )
     );
   }
+
+  @Test
+  public void testBuildRevisionDimensionEmitsKnownValue()
+  {
+    // EmitterModule with a known revision verifies that getBuildRevision() is 
wired into the buildRevision dimension.
+    EmitterModule emitterModule = new EmitterModule()
+    {
+      @Override
+      protected String getBuildRevision()
+      {
+        return "abc1234def567890";
+      }
+    };
+    Injector injector = makeInjectorForEmitterModule(emitterModule);
+    ServiceEmitter serviceEmitter = injector.getInstance(ServiceEmitter.class);
+    serviceEmitter.start();
+    serviceEmitter.emit(new ServiceMetricEvent.Builder().setMetric("test", 1));
+
+    StubServiceEmitter stubEmitter = (StubServiceEmitter) 
injector.getInstance(Emitter.class);
+    EventMap map = ((ServiceMetricEvent) 
stubEmitter.getEvents().get(0)).toMap();
+    Assert.assertEquals("abc1234def567890", map.get("buildRevision"));
+  }
+
+  @Test
+  public void testBuildRevisionDimensionFallsBackToEmptyStringWhenUnavailable()
+  {
+    // When getBuildRevision() returns "" (e.g. running outside a packaged 
JAR), buildRevision dimension is an empty string.
+    EmitterModule emitterModule = new EmitterModule()
+    {
+      @Override
+      protected String getBuildRevision()
+      {
+        return "";
+      }
+    };
+    Injector injector = makeInjectorForEmitterModule(emitterModule);
+    ServiceEmitter serviceEmitter = injector.getInstance(ServiceEmitter.class);
+    serviceEmitter.start();
+    serviceEmitter.emit(new ServiceMetricEvent.Builder().setMetric("test", 1));
+
+    StubServiceEmitter stubEmitter = (StubServiceEmitter) 
injector.getInstance(Emitter.class);
+    EventMap map = ((ServiceMetricEvent) 
stubEmitter.getEvents().get(0)).toMap();
+    Assert.assertEquals("", map.get("buildRevision"));
+  }
+
+  private Injector makeInjectorForEmitterModule(EmitterModule emitterModule)
+  {
+    Properties props = new Properties();
+    props.setProperty("druid.emitter", "stub");
+    emitterModule.setProps(props);
+    return Guice.createInjector(
+        new JacksonModule(),
+        new LifecycleModule(),
+        binder -> {
+          JsonConfigProvider.bindInstance(
+              binder,
+              Key.get(DruidNode.class, Self.class),
+              new DruidNode("test-service", "localhost", false, 8080, null, 
true, false)
+          );
+          
binder.bind(Validator.class).toInstance(Validation.buildDefaultValidatorFactory().getValidator());
+          binder.bindScope(LazySingleton.class, Scopes.SINGLETON);
+          binder.bind(Properties.class).toInstance(props);
+          binder.bind(TaskHolder.class).toInstance(new TestTaskHolder("test", 
"id1", "type1", "group1"));
+          
binder.bind(LoadSpecHolder.class).to(DefaultLoadSpecHolder.class).in(LazySingleton.class);
+        },
+        ServerInjectorBuilder.registerNodeRoleModule(ImmutableSet.of()),
+        emitterModule,
+        new StubServiceEmitterModule()
+    );
+  }
 }
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 58e1f0cd1b3..15a54d16ff9 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
@@ -192,6 +192,7 @@ public class SystemSchema extends AbstractSchema
       .add("is_leader", ColumnType.LONG)
       .add("start_time", ColumnType.STRING)
       .add("version", ColumnType.STRING)
+      .add("build_revision", ColumnType.STRING)
       .add("labels", ColumnType.STRING)
       .add("available_processors", ColumnType.LONG)
       .add("total_memory", ColumnType.LONG)
@@ -697,6 +698,7 @@ public class SystemSchema extends AbstractSchema
           null,
           toStringOrNull(discoveryDruidNode.getStartTime()),
           node.getVersion(),
+          node.getBuildRevision(),
           node.getLabels() == null ? null : 
JacksonUtils.writeValueAsString(jsonMapper, node.getLabels()),
           (long) discoveryDruidNode.getAvailableProcessors(),
           discoveryDruidNode.getTotalMemory()
@@ -725,6 +727,7 @@ public class SystemSchema extends AbstractSchema
           isLeader ? 1L : 0L,
           toStringOrNull(discoveryDruidNode.getStartTime()),
           node.getVersion(),
+          node.getBuildRevision(),
           node.getLabels() == null ? null : 
JacksonUtils.writeValueAsString(jsonMapper, node.getLabels()),
           (long) discoveryDruidNode.getAvailableProcessors(),
           discoveryDruidNode.getTotalMemory()
@@ -765,6 +768,7 @@ public class SystemSchema extends AbstractSchema
           null,
           toStringOrNull(discoveryDruidNode.getStartTime()),
           node.getVersion(),
+          node.getBuildRevision(),
           node.getLabels() == null ? null : 
JacksonUtils.writeValueAsString(jsonMapper, node.getLabels()),
           (long) discoveryDruidNode.getAvailableProcessors(),
           discoveryDruidNode.getTotalMemory()
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 fab2a0ca438..005191c8b8c 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
@@ -380,6 +380,9 @@ public class SystemSchemaTest extends CalciteTestBase
       DruidNode.UNKNOWN_VERSION
   );
 
+  // buildRevision is empty string outside a packaged JAR (same behaviour as 
the buildRevision metric dimension)
+  private final String buildRevision = "";
+
   private final DiscoveryDruidNode coordinator = new DiscoveryDruidNode(
       new DruidNode("s1", "localhost", false, 8081, null, true, false),
       NodeRole.COORDINATOR,
@@ -585,7 +588,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(15, serverFields.size());
+    Assert.assertEquals(16, serverFields.size());
     Assert.assertEquals("server", serverFields.get(0).getName());
     Assert.assertEquals(SqlTypeName.VARCHAR, 
serverFields.get(0).getType().getSqlTypeName());
 
@@ -894,6 +897,7 @@ public class SystemSchemaTest extends CalciteTestBase
             nonLeader,
             startTimeStr,
             version,
+            buildRevision,
             null,
             availableProcessors,
             totalMemory
@@ -913,6 +917,7 @@ public class SystemSchemaTest extends CalciteTestBase
             nonLeader,
             startTimeStr,
             version,
+            buildRevision,
             null,
             availableProcessors,
             totalMemory
@@ -932,6 +937,7 @@ public class SystemSchemaTest extends CalciteTestBase
             nonLeader,
             startTimeStr,
             version,
+            buildRevision,
             null,
             availableProcessors,
             totalMemory
@@ -951,6 +957,7 @@ public class SystemSchemaTest extends CalciteTestBase
             nonLeader,
             startTimeStr,
             version,
+            buildRevision,
             null,
             availableProcessors,
             totalMemory
@@ -970,6 +977,7 @@ public class SystemSchemaTest extends CalciteTestBase
             nonLeader,
             startTimeStr,
             version,
+            buildRevision,
             null,
             availableProcessors,
             totalMemory
@@ -988,6 +996,7 @@ public class SystemSchemaTest extends CalciteTestBase
         nonLeader,
         startTimeStr,
         version,
+        buildRevision,
         null,
         availableProcessors,
         totalMemory
@@ -1006,6 +1015,7 @@ public class SystemSchemaTest extends CalciteTestBase
             1L,
             startTimeStr,
             version,
+            buildRevision,
             null,
             availableProcessors,
             totalMemory
@@ -1025,6 +1035,7 @@ public class SystemSchemaTest extends CalciteTestBase
             nonLeader,
             startTimeStr,
             version,
+            buildRevision,
             "{\"brokerKey\":\"brokerValue\",\"brokerKey2\":\"brokerValue2\"}",
             availableProcessors,
             totalMemory
@@ -1044,6 +1055,7 @@ public class SystemSchemaTest extends CalciteTestBase
             nonLeader,
             startTimeStr,
             version,
+            buildRevision,
             null,
             availableProcessors,
             totalMemory
@@ -1063,6 +1075,7 @@ public class SystemSchemaTest extends CalciteTestBase
             1L,
             startTimeStr,
             version,
+            buildRevision,
             "{\"overlordKey\":\"overlordValue\"}",
             availableProcessors,
             totalMemory
@@ -1082,6 +1095,7 @@ public class SystemSchemaTest extends CalciteTestBase
             0L,
             startTimeStr,
             version,
+            buildRevision,
             null,
             availableProcessors,
             totalMemory
@@ -1101,6 +1115,7 @@ public class SystemSchemaTest extends CalciteTestBase
             0L,
             startTimeStr,
             version,
+            buildRevision,
             null,
             availableProcessors,
             totalMemory
@@ -1120,6 +1135,7 @@ public class SystemSchemaTest extends CalciteTestBase
             nonLeader,
             startTimeStr,
             version,
+            buildRevision,
             null,
             availableProcessors,
             totalMemory
@@ -1139,6 +1155,7 @@ public class SystemSchemaTest extends CalciteTestBase
             nonLeader,
             startTimeStr,
             version,
+            buildRevision,
             null,
             availableProcessors,
             totalMemory
@@ -1157,6 +1174,7 @@ public class SystemSchemaTest extends CalciteTestBase
         nonLeader,
         startTimeStr,
         version,
+        buildRevision,
         null,
         availableProcessors,
         totalMemory
@@ -1201,6 +1219,7 @@ public class SystemSchemaTest extends CalciteTestBase
       @Nullable Long isLeader,
       String startTime,
       String version,
+      String buildRevision,
       String labels,
       long availableProcessors,
       long totalMemory
@@ -1219,6 +1238,7 @@ public class SystemSchemaTest extends CalciteTestBase
         isLeader,
         startTime,
         version,
+        buildRevision,
         labels,
         availableProcessors,
         totalMemory
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 c4ba4da5fdc..afd053ddc75 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
@@ -59,6 +59,7 @@ exports[`ServicesView renders data 1`] = `
           "Usage",
           "Start time",
           "Version",
+          "Build revision",
           "Available processors",
           "Total memory",
           "Labels",
@@ -222,6 +223,18 @@ exports[`ServicesView renders data 1`] = `
             "show": true,
             "width": 200,
           },
+          {
+            "Aggregated": [Function],
+            "Cell": [Function],
+            "Header": <React.Fragment>
+              Build
+              <br />
+              revision
+            </React.Fragment>,
+            "accessor": "build_revision",
+            "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 adc4fc1ac7c..705a8b6f8f6 100644
--- a/web-console/src/views/services-view/services-view.tsx
+++ b/web-console/src/views/services-view/services-view.tsx
@@ -90,6 +90,7 @@ const TABLE_COLUMNS_BY_MODE: Record<CapabilitiesMode, 
TableColumnSelectorColumn[
     'Usage',
     'Start time',
     'Version',
+    'Build revision',
     'Available processors',
     'Total memory',
     'Labels',
@@ -117,6 +118,7 @@ const TABLE_COLUMNS_BY_MODE: Record<CapabilitiesMode, 
TableColumnSelectorColumn[
     'Usage',
     'Start time',
     'Version',
+    'Build revision',
   ],
 };
 
@@ -159,6 +161,7 @@ interface ServiceResultRow {
   readonly tls_port: number;
   readonly start_time: string;
   readonly version: string;
+  readonly build_revision: string;
   readonly labels: string | null;
   readonly available_processors: number;
   readonly total_memory: number;
@@ -266,6 +269,7 @@ export class ServicesView extends 
React.PureComponent<ServicesViewProps, Service
   "is_leader",
   "start_time",
   "version",
+  "build_revision",
   "labels",
   "available_processors",
   "total_memory"
@@ -325,6 +329,7 @@ ORDER BY
                 start_time: '1970:01:01T00:00:00Z',
                 is_leader: 0,
                 version: '',
+                build_revision: '',
                 labels: null,
                 available_processors: -1,
                 total_memory: -1,
@@ -744,6 +749,14 @@ ORDER BY
           Cell: this.renderFilterableCell('version'),
           Aggregated: () => '',
         },
+        {
+          Header: twoLines('Build', 'revision'),
+          show: visibleColumns.shown('Build revision'),
+          accessor: 'build_revision',
+          width: 200,
+          Cell: this.renderFilterableCell('build_revision'),
+          Aggregated: () => '',
+        },
         {
           Header: twoLines('Available', 'processors'),
           show: visibleColumns.shown('Available processors'),
diff --git a/website/.spelling b/website/.spelling
index 5edf5c33439..0cdf3387644 100644
--- a/website/.spelling
+++ b/website/.spelling
@@ -54,6 +54,7 @@ Base64-encoded
 ByteBuffer
 blocklist
 bottlenecked
+build_revision
 cartesian
 concat
 CIDR


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

Reply via email to