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

gian 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 98e8c8ae705 fix: Emit sys metrics from k8s peons. (#19305)
98e8c8ae705 is described below

commit 98e8c8ae705ae58d3e838458869753e3ed6bf503
Author: Gian Merlino <[email protected]>
AuthorDate: Thu Apr 16 09:45:46 2026 -0700

    fix: Emit sys metrics from k8s peons. (#19305)
    
    Currently the SysMonitor and OshiSysMonitor are both skipped for peons,
    on the logic that they are redundant to the MiddleManager (see #12802).
    However, with the Kubernetes runner, we launch peons directly and we
    want them to emit sys metrics.
    
    To make it possible to differentiate these cases, this patch adds a
    property "druid.peon.managed" that informs the MetricsModule that the
    peon is managed by another process and should not emit metrics.
---
 .../druid/indexing/overlord/ForkingTaskRunner.java |  2 ++
 .../apache/druid/server/metrics/MetricsModule.java | 28 ++++++++++++++++++----
 .../druid/server/metrics/MetricsModuleTest.java    |  9 ++++---
 3 files changed, 32 insertions(+), 7 deletions(-)

diff --git 
a/indexing-service/src/main/java/org/apache/druid/indexing/overlord/ForkingTaskRunner.java
 
b/indexing-service/src/main/java/org/apache/druid/indexing/overlord/ForkingTaskRunner.java
index 6485d6d72da..1f7e4218107 100644
--- 
a/indexing-service/src/main/java/org/apache/druid/indexing/overlord/ForkingTaskRunner.java
+++ 
b/indexing-service/src/main/java/org/apache/druid/indexing/overlord/ForkingTaskRunner.java
@@ -62,6 +62,7 @@ import org.apache.druid.java.util.emitter.EmittingLogger;
 import org.apache.druid.query.DruidMetrics;
 import org.apache.druid.server.DruidNode;
 import org.apache.druid.server.log.StartupLoggingConfig;
+import org.apache.druid.server.metrics.MetricsModule;
 import org.apache.druid.server.metrics.MonitorsConfig;
 import org.apache.druid.server.metrics.WorkerTaskCountStatsProvider;
 import org.apache.druid.tasklogs.TaskLogPusher;
@@ -372,6 +373,7 @@ public class ForkingTaskRunner
 
                         
command.addSystemProperty("druid.indexer.task.baseTaskDir", 
storageSlot.getDirectory().getAbsolutePath());
                         
command.addSystemProperty("druid.indexer.task.tmpStorageBytesPerTask", 
storageSlot.getNumBytes());
+                        
command.addSystemProperty(MetricsModule.PROPERTY_PEON_MANAGED, true);
 
                         command.add("org.apache.druid.cli.Main");
                         command.add("internal");
diff --git 
a/server/src/main/java/org/apache/druid/server/metrics/MetricsModule.java 
b/server/src/main/java/org/apache/druid/server/metrics/MetricsModule.java
index c1425b81652..7935c1b0a3e 100644
--- a/server/src/main/java/org/apache/druid/server/metrics/MetricsModule.java
+++ b/server/src/main/java/org/apache/druid/server/metrics/MetricsModule.java
@@ -57,6 +57,7 @@ import org.apache.druid.query.ExecutorServiceMonitor;
 import java.time.Duration;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Properties;
 import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -70,6 +71,14 @@ import java.util.stream.Collectors;
 public class MetricsModule implements Module
 {
   public static final String MONITORING_PROPERTY_PREFIX = "druid.monitoring";
+
+  /**
+   * Property set by {@code ForkingTaskRunner} when launching peons as child 
processes of a MiddleManager.
+   * When this property is "true", the peon is managed by a MiddleManager, and 
system-level monitors
+   * should be skipped because the MiddleManager already emits them.
+   */
+  public static final String PROPERTY_PEON_MANAGED = "druid.peon.managed";
+
   private static final Logger log = new Logger(MetricsModule.class);
 
   public static void register(Binder binder, Class<? extends Monitor> 
monitorClazz)
@@ -163,9 +172,9 @@ public class MetricsModule implements Module
 
   @Provides
   @ManageLifecycle
-  public SysMonitor getSysMonitor(@Self Set<NodeRole> nodeRoles)
+  public SysMonitor getSysMonitor(@Self Set<NodeRole> nodeRoles, Properties 
properties)
   {
-    if (nodeRoles.contains(NodeRole.PEON)) {
+    if (nodeRoles.contains(NodeRole.PEON) && isManagedPeon(properties)) {
       return new NoopSysMonitor();
     } else {
       return new SysMonitor();
@@ -176,16 +185,27 @@ public class MetricsModule implements Module
   @ManageLifecycle
   public OshiSysMonitor getOshiSysMonitor(
       @Self Set<NodeRole> nodeRoles,
-      OshiSysMonitorConfig oshiSysConfig
+      OshiSysMonitorConfig oshiSysConfig,
+      Properties properties
   )
   {
-    if (nodeRoles.contains(NodeRole.PEON)) {
+    if (nodeRoles.contains(NodeRole.PEON) && isManagedPeon(properties)) {
       return new NoopOshiSysMonitor();
     } else {
       return new OshiSysMonitor(oshiSysConfig);
     }
   }
 
+  /**
+   * Returns true if this peon was launched by a MiddleManager (as opposed to 
running standalone,
+   * such as under the Kubernetes task runner). MiddleManager-launched peons 
share the host with
+   * the MiddleManager, so system-level metrics would be redundant.
+   */
+  private static boolean isManagedPeon(Properties properties)
+  {
+    return Boolean.parseBoolean(properties.getProperty(PROPERTY_PEON_MANAGED));
+  }
+
   /**
    * Checks if a monitor needs to be loaded on this service based on its node 
role.
    */
diff --git 
a/server/src/test/java/org/apache/druid/server/metrics/MetricsModuleTest.java 
b/server/src/test/java/org/apache/druid/server/metrics/MetricsModuleTest.java
index 5b54f0d5ccf..5e95a141cd9 100644
--- 
a/server/src/test/java/org/apache/druid/server/metrics/MetricsModuleTest.java
+++ 
b/server/src/test/java/org/apache/druid/server/metrics/MetricsModuleTest.java
@@ -243,7 +243,9 @@ public class MetricsModuleTest
     // Do not run the tests on ARM64. Sigar library has no binaries for ARM64
     Assume.assumeFalse("aarch64".equals(CPU_ARCH));
 
-    final Injector injector = createInjector(new Properties(), 
ImmutableSet.of(NodeRole.PEON));
+    final Properties properties = new Properties();
+    properties.setProperty(MetricsModule.PROPERTY_PEON_MANAGED, "true");
+    final Injector injector = createInjector(properties, 
ImmutableSet.of(NodeRole.PEON));
     final SysMonitor sysMonitor = injector.getInstance(SysMonitor.class);
     final ServiceEmitter emitter = Mockito.mock(ServiceEmitter.class);
     sysMonitor.doMonitor(emitter);
@@ -269,8 +271,9 @@ public class MetricsModuleTest
   @Test
   public void testGetOshiSysMonitorViaInjector()
   {
-
-    final Injector injector = createInjector(new Properties(), 
ImmutableSet.of(NodeRole.PEON));
+    final Properties properties = new Properties();
+    properties.setProperty(MetricsModule.PROPERTY_PEON_MANAGED, "true");
+    final Injector injector = createInjector(properties, 
ImmutableSet.of(NodeRole.PEON));
     final OshiSysMonitor sysMonitor = 
injector.getInstance(OshiSysMonitor.class);
     final ServiceEmitter emitter = Mockito.mock(ServiceEmitter.class);
     sysMonitor.doMonitor(emitter);


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

Reply via email to