This is an automated email from the ASF dual-hosted git repository.
kfaraz 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 ca86554af0e Add server dimension to segment assignment skip metrics
(#18313)
ca86554af0e is described below
commit ca86554af0ef1d626a2966deb1d4c5ae9cb00098
Author: Kashif Faraz <[email protected]>
AuthorDate: Wed Jul 23 19:01:37 2025 +0530
Add server dimension to segment assignment skip metrics (#18313)
Updated metrics:
- `segment/assignSkipped/count`
- `segment/dropSkipped/count`
- `segment/moveSkipped/count`
---
docs/operations/metrics.md | 6 ++---
.../loading/StrategicSegmentAssigner.java | 26 ++++++++++++++--------
.../rules/BroadcastDistributionRuleTest.java | 2 ++
.../coordinator/simulate/SegmentBalancingTest.java | 2 +-
4 files changed, 23 insertions(+), 13 deletions(-)
diff --git a/docs/operations/metrics.md b/docs/operations/metrics.md
index 8fc1cf34164..b1c846449dd 100644
--- a/docs/operations/metrics.md
+++ b/docs/operations/metrics.md
@@ -390,9 +390,9 @@ These metrics are emitted by the Druid Coordinator in every
run of the correspon
|`segment/dropped/count`|Number of segments chosen to be dropped from the
cluster due to being over-replicated.|`dataSource`, `tier`|Varies|
|`segment/deleted/count`|Number of segments marked as unused due to drop
rules.|`dataSource`|Varies|
|`segment/unneeded/count`|Number of segments dropped due to being marked as
unused.|`dataSource`, `tier`|Varies|
-|`segment/assignSkipped/count`|Number of segments that could not be assigned
to any server for loading. This can occur due to replication throttling, no
available disk space, or a full load queue.|`dataSource`, `tier`,
`description`|Varies|
-|`segment/moveSkipped/count`|Number of segments that were chosen for balancing
but could not be moved. This can occur when segments are already optimally
placed.|`dataSource`, `tier`, `description`|Varies|
-|`segment/dropSkipped/count`|Number of segments that could not be dropped from
any server.|`dataSource`, `tier`, `description`|Varies|
+|`segment/assignSkipped/count`|Number of segments that could not be assigned
to any server for loading. This can occur due to replication throttling, no
available disk space, or a full load queue.|`dataSource`, `server`, `tier`,
`description`|Varies|
+|`segment/moveSkipped/count`|Number of segments that were chosen for balancing
but could not be moved. This can occur when segments are already optimally
placed.|`dataSource`, `server`, `tier`, `description`|Varies|
+|`segment/dropSkipped/count`|Number of segments that could not be dropped from
any server.|`dataSource`, `server`, `tier`, `description`|Varies|
|`segment/loadQueue/size`|Size in bytes of segments to load.|`server`|Varies|
|`segment/loadQueue/count`|Number of segments to load.|`server`|Varies|
|`segment/loading/rateKbps`|Current rate of segment loading on a server in
kbps (1000 bits per second). The rate is calculated as a moving average over
the last 10 GiB or more of successful segment loads on that
server.|`server`|Varies|
diff --git
a/server/src/main/java/org/apache/druid/server/coordinator/loading/StrategicSegmentAssigner.java
b/server/src/main/java/org/apache/druid/server/coordinator/loading/StrategicSegmentAssigner.java
index b87e545605c..2b7bbdb49e7 100644
---
a/server/src/main/java/org/apache/druid/server/coordinator/loading/StrategicSegmentAssigner.java
+++
b/server/src/main/java/org/apache/druid/server/coordinator/loading/StrategicSegmentAssigner.java
@@ -146,7 +146,7 @@ public class StrategicSegmentAssigner implements
SegmentActionHandler
.collect(Collectors.toList());
if (eligibleDestinationServers.isEmpty()) {
- incrementSkipStat(Stats.Segments.MOVE_SKIPPED, "No eligible server",
segment, tier);
+ incrementSkipStat(Stats.Segments.MOVE_SKIPPED, "No eligible server",
segment, sourceServer);
return false;
}
@@ -160,13 +160,13 @@ public class StrategicSegmentAssigner implements
SegmentActionHandler
strategy.findDestinationServerToMoveSegment(segment, sourceServer,
eligibleDestinationServers);
if (destination == null ||
destination.getServer().equals(sourceServer.getServer())) {
- incrementSkipStat(Stats.Segments.MOVE_SKIPPED, "Optimally placed",
segment, tier);
+ incrementSkipStat(Stats.Segments.MOVE_SKIPPED, "Optimally placed",
segment, sourceServer);
return false;
} else if (moveSegment(segment, sourceServer, destination)) {
incrementStat(Stats.Segments.MOVED, segment, tier, 1);
return true;
} else {
- incrementSkipStat(Stats.Segments.MOVE_SKIPPED, "Encountered error",
segment, tier);
+ incrementSkipStat(Stats.Segments.MOVE_SKIPPED, "Encountered error",
segment, sourceServer);
return false;
}
}
@@ -393,7 +393,7 @@ public class StrategicSegmentAssigner implements
SegmentActionHandler
skipReason = "Unknown error";
}
- incrementSkipStat(Stats.Segments.ASSIGN_SKIPPED, skipReason, segment,
server.getServer().getTier());
+ incrementSkipStat(Stats.Segments.ASSIGN_SKIPPED, skipReason, segment,
server);
return false;
}
@@ -489,7 +489,7 @@ public class StrategicSegmentAssigner implements
SegmentActionHandler
if (dropped) {
++numDropsQueued;
} else {
- incrementSkipStat(Stats.Segments.DROP_SKIPPED, "Encountered error",
segment, tier);
+ incrementSkipStat(Stats.Segments.DROP_SKIPPED, "Encountered error",
segment, holder);
}
}
@@ -543,11 +543,10 @@ public class StrategicSegmentAssigner implements
SegmentActionHandler
private boolean loadSegment(DataSegment segment, ServerHolder server)
{
- final String tier = server.getServer().getTier();
final boolean assigned = loadQueueManager.loadSegment(segment, server,
SegmentAction.LOAD);
if (!assigned) {
- incrementSkipStat(Stats.Segments.ASSIGN_SKIPPED, "Encountered error",
segment, tier);
+ incrementSkipStat(Stats.Segments.ASSIGN_SKIPPED, "Encountered error",
segment, server);
}
return assigned;
@@ -557,13 +556,13 @@ public class StrategicSegmentAssigner implements
SegmentActionHandler
{
final String tier = server.getServer().getTier();
if (replicationThrottler.isReplicationThrottledForTier(tier)) {
- incrementSkipStat(Stats.Segments.ASSIGN_SKIPPED, "Throttled
replication", segment, tier);
+ incrementSkipStat(Stats.Segments.ASSIGN_SKIPPED, "Throttled
replication", segment, server);
return false;
}
final boolean assigned = loadQueueManager.loadSegment(segment, server,
SegmentAction.REPLICATE);
if (!assigned) {
- incrementSkipStat(Stats.Segments.ASSIGN_SKIPPED, "Encountered error",
segment, tier);
+ incrementSkipStat(Stats.Segments.ASSIGN_SKIPPED, "Encountered error",
segment, server);
} else {
replicationThrottler.incrementAssignedReplicas(tier);
}
@@ -617,6 +616,15 @@ public class StrategicSegmentAssigner implements
SegmentActionHandler
stats.add(stat, key, 1);
}
+ private void incrementSkipStat(CoordinatorStat stat, String reason,
DataSegment segment, ServerHolder server)
+ {
+ final RowKey key = RowKey.with(Dimension.TIER,
server.getServer().getTier())
+ .with(Dimension.DATASOURCE,
segment.getDataSource())
+ .with(Dimension.SERVER,
server.getServer().getName())
+ .and(Dimension.DESCRIPTION, reason);
+ stats.add(stat, key, 1);
+ }
+
private void incrementStat(CoordinatorStat stat, DataSegment segment, String
tier, long value)
{
stats.addToSegmentStat(stat, tier, segment.getDataSource(), value);
diff --git
a/server/src/test/java/org/apache/druid/server/coordinator/rules/BroadcastDistributionRuleTest.java
b/server/src/test/java/org/apache/druid/server/coordinator/rules/BroadcastDistributionRuleTest.java
index 9932af14adf..3e531d27a0e 100644
---
a/server/src/test/java/org/apache/druid/server/coordinator/rules/BroadcastDistributionRuleTest.java
+++
b/server/src/test/java/org/apache/druid/server/coordinator/rules/BroadcastDistributionRuleTest.java
@@ -207,11 +207,13 @@ public class BroadcastDistributionRuleTest
Assert.assertEquals(1L, stats.getSegmentStat(Stats.Segments.ASSIGNED,
TIER_1, TestDataSource.WIKI));
RowKey metricKey = RowKey.with(Dimension.DATASOURCE, TestDataSource.WIKI)
.with(Dimension.TIER, TIER_1)
+ .with(Dimension.SERVER,
serverWithNoDiskSpace.getServer().getName())
.and(Dimension.DESCRIPTION, "Not enough disk
space");
Assert.assertEquals(1L, stats.get(Stats.Segments.ASSIGN_SKIPPED,
metricKey));
metricKey = RowKey.with(Dimension.DATASOURCE, TestDataSource.WIKI)
.with(Dimension.TIER, TIER_1)
+ .with(Dimension.SERVER,
serverWithFullQueue.getServer().getName())
.and(Dimension.DESCRIPTION, "Load queue is full");
Assert.assertEquals(1L, stats.get(Stats.Segments.ASSIGN_SKIPPED,
metricKey));
}
diff --git
a/server/src/test/java/org/apache/druid/server/coordinator/simulate/SegmentBalancingTest.java
b/server/src/test/java/org/apache/druid/server/coordinator/simulate/SegmentBalancingTest.java
index 41e38ab40e2..47573b28b0b 100644
---
a/server/src/test/java/org/apache/druid/server/coordinator/simulate/SegmentBalancingTest.java
+++
b/server/src/test/java/org/apache/druid/server/coordinator/simulate/SegmentBalancingTest.java
@@ -296,7 +296,7 @@ public class SegmentBalancingTest extends
CoordinatorSimulationBaseTest
runCoordinatorCycle();
verifyValue(Metric.ASSIGNED_COUNT, 10_000L);
verifyNotEmitted(Metric.MOVED_COUNT);
- verifyValue(Metric.MOVE_SKIPPED, 100L);
+ verifySum(Metric.MOVE_SKIPPED, 100L);
// Run 2: Add 10 more historicals, some segments are moved to them
for (int i = 11; i <= 20; ++i) {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]