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]