Skip to content

Commit a066fec

Browse files
committed
[flink] Expose the tiering reader waiting ratio
1 parent b25ba46 commit a066fec

5 files changed

Lines changed: 61 additions & 5 deletions

File tree

‎fluss-common/src/main/java/org/apache/fluss/metrics/MetricNames.java‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,4 +373,7 @@ public class MetricNames {
373373
// for lake tiering metrics - operator level
374374
public static final String TIERING_SERVICE_READ_BYTES = "readBytes";
375375
public static final String TIERING_SERVICE_READ_BYTES_RATE = "readBytesPerSecond";
376+
377+
// for lake tiering metrics - enumerator level
378+
public static final String TIERING_SERVICE_WAITING_READERS_RATIO = "waitingReadersRatio";
376379
}

‎fluss-flink/fluss-flink-common/src/main/java/org/apache/fluss/flink/tiering/source/enumerator/TieringSourceEnumerator.java‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.apache.fluss.flink.tiering.event.FailedTieringEvent;
3232
import org.apache.fluss.flink.tiering.event.FinishedTieringEvent;
3333
import org.apache.fluss.flink.tiering.event.TieringReachMaxDurationEvent;
34+
import org.apache.fluss.flink.tiering.source.metrics.TieringMetrics;
3435
import org.apache.fluss.flink.tiering.source.split.FlinkTieringSplit;
3536
import org.apache.fluss.flink.tiering.source.state.TieringSourceEnumeratorState;
3637
import org.apache.fluss.lake.committer.TieringStats;
@@ -189,6 +190,9 @@ public TieringSourceEnumerator(
189190
this.finishedTables = new ConcurrentHashMap<>();
190191
this.failedTableEpochs = new ConcurrentHashMap<>();
191192
this.tieringReachMaxDurationsTables = Collections.synchronizedSet(new TreeSet<>());
193+
TieringMetrics.registerWaitingReadersRatio(
194+
enumeratorMetricGroup,
195+
() -> (double) readersAwaitingSplit.size() / context.currentParallelism());
192196
}
193197

194198
@Override

‎fluss-flink/fluss-flink-common/src/main/java/org/apache/fluss/flink/tiering/source/metrics/TieringMetrics.java‎

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,18 @@
2121
import org.apache.fluss.metrics.MetricNames;
2222

2323
import org.apache.flink.metrics.Counter;
24+
import org.apache.flink.metrics.Gauge;
2425
import org.apache.flink.metrics.MeterView;
2526
import org.apache.flink.metrics.MetricGroup;
2627
import org.apache.flink.metrics.groups.SourceReaderMetricGroup;
28+
import org.apache.flink.metrics.groups.SplitEnumeratorMetricGroup;
2729

2830
/**
29-
* A collection class for handling metrics in Tiering source reader.
31+
* Metrics for the Flink-based tiering source.
3032
*
31-
* <p>All metrics are registered under group "fluss.tieringService", which is a child group of
32-
* {@link org.apache.flink.metrics.groups.OperatorMetricGroup}.
33+
* <p>All metrics are registered under group "fluss.tieringService", as a child of {@link
34+
* SourceReaderMetricGroup} for reader metrics or {@link SplitEnumeratorMetricGroup} for enumerator
35+
* metrics.
3336
*
3437
* <p>The following metrics are available:
3538
*
@@ -38,6 +41,8 @@
3841
* since the job started (actual Fluss records size).
3942
* <li>{@code fluss.tieringService.readBytesPerSecond} - Meter: bytes-per-second rate derived from
4043
* the counter using a 60-second sliding window.
44+
* <li>{@code fluss.tieringService.waitingReadersRatio} - Gauge: fraction of source readers
45+
* waiting for splits, reported by the enumerator.
4146
* </ul>
4247
*/
4348
@Internal
@@ -64,4 +69,13 @@ public TieringMetrics(SourceReaderMetricGroup sourceReaderMetricGroup) {
6469
public void recordBytesRead(long bytes) {
6570
readBytesCounter.inc(bytes);
6671
}
72+
73+
/** Registers the proportion of source readers waiting for splits. */
74+
public static void registerWaitingReadersRatio(
75+
SplitEnumeratorMetricGroup metricGroup, Gauge<Double> waitingReadersRatio) {
76+
metricGroup
77+
.addGroup(FLUSS_METRIC_GROUP)
78+
.addGroup(TIERING_SERVICE_GROUP)
79+
.gauge(MetricNames.TIERING_SERVICE_WAITING_READERS_RATIO, waitingReadersRatio);
80+
}
6781
}

‎fluss-flink/fluss-flink-common/src/test/java/org/apache/fluss/flink/tiering/source/enumerator/TieringSourceEnumeratorSchedulingTest.java‎

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,23 @@
2323
import org.apache.fluss.client.tiering.TieringSplitGenerator;
2424
import org.apache.fluss.config.Configuration;
2525
import org.apache.fluss.flink.tiering.TestingLakeTieringFactory;
26+
import org.apache.fluss.flink.tiering.source.metrics.TieringMetrics;
2627
import org.apache.fluss.flink.tiering.source.split.FlinkTieringSplit;
2728
import org.apache.fluss.metadata.Schema;
2829
import org.apache.fluss.metadata.TableBucket;
2930
import org.apache.fluss.metadata.TableDescriptor;
3031
import org.apache.fluss.metadata.TableInfo;
3132
import org.apache.fluss.metadata.TablePath;
33+
import org.apache.fluss.metrics.MetricNames;
3234
import org.apache.fluss.rpc.gateway.CoordinatorGateway;
3335
import org.apache.fluss.rpc.messages.LakeTieringHeartbeatRequest;
3436
import org.apache.fluss.rpc.messages.LakeTieringHeartbeatResponse;
3537
import org.apache.fluss.testutils.common.ManuallyTriggeredScheduledExecutorService;
3638
import org.apache.fluss.types.DataTypes;
3739

40+
import org.apache.flink.metrics.groups.SplitEnumeratorMetricGroup;
41+
import org.apache.flink.metrics.testutils.MetricListener;
42+
import org.apache.flink.runtime.metrics.groups.InternalSplitEnumeratorMetricGroup;
3843
import org.junit.jupiter.api.Test;
3944

4045
import java.io.IOException;
@@ -59,6 +64,7 @@ class TieringSourceEnumeratorSchedulingTest {
5964
@Test
6065
void testPendingSplitsAssignedInOrder() throws Exception {
6166
try (Fixture fixture = new Fixture()) {
67+
assertThat(fixture.waitingReadersRatio()).isEqualTo(1.0);
6268
List<FlinkTieringSplit> splits = new ArrayList<>();
6369
for (int bucket = 0; bucket < 4; bucket++) {
6470
splits.add(
@@ -83,11 +89,13 @@ void testPendingSplitsAssignedInOrder() throws Exception {
8389
.collect(Collectors.toList());
8490
assertThat(assignedSplits).containsExactlyElementsOf(splits);
8591
assertThat(fixture.claims()).isEmpty();
92+
assertThat(fixture.waitingReadersRatio()).isZero();
8693

8794
// Once drained, another request polls for a new table without reassigning old splits.
8895
fixture.requestTable();
8996
assertThat(fixture.claims()).hasSize(1);
9097
assertThat(fixture.context.getSplitsAssignmentSequence()).hasSize(splits.size());
98+
assertThat(fixture.waitingReadersRatio()).isEqualTo(1.0);
9199
}
92100
}
93101

@@ -176,6 +184,7 @@ void testGenerationFailureDoesNotScheduleContinuation() throws Throwable {
176184
.thenThrow(new IOException("metadata unavailable"));
177185

178186
fixture.requestTable();
187+
assertThat(fixture.waitingReadersRatio()).isEqualTo(1.0);
179188

180189
// Failures must not drive immediate retries of a table re-queued by the coordinator.
181190
assertThat(fixture.timer.getActiveNonPeriodicScheduledTask()).isEmpty();
@@ -193,12 +202,15 @@ void testGenerationFailureDoesNotScheduleContinuation() throws Throwable {
193202
@Test
194203
void testFailOverPreventsContinuationClaim() throws Throwable {
195204
try (Fixture fixture = new Fixture(2)) {
205+
assertThat(fixture.waitingReadersRatio()).isEqualTo(0.5);
196206
fixture.registerReader(1, 0);
207+
assertThat(fixture.waitingReadersRatio()).isEqualTo(1.0);
197208
fixture.addTable(1, true);
198209
fixture.requestTable();
199210

200211
// Reader 0 restarts while reader 1 is still on attempt 0, so failover is in progress.
201212
fixture.registerReader(0, 1);
213+
assertThat(fixture.waitingReadersRatio()).isEqualTo(1.0);
202214

203215
// The failover guard must leave the next table to the periodic poll.
204216
fixture.fireContinuation();
@@ -273,6 +285,17 @@ private void registerReader(int subtaskId, int attemptNumber) {
273285
enumerator.addReader(subtaskId);
274286
}
275287

288+
private double waitingReadersRatio() {
289+
return context.metricListener
290+
.<Double>getGauge(
291+
"enumerator",
292+
TieringMetrics.FLUSS_METRIC_GROUP,
293+
TieringMetrics.TIERING_SERVICE_GROUP,
294+
MetricNames.TIERING_SERVICE_WAITING_READERS_RATIO)
295+
.get()
296+
.getValue();
297+
}
298+
276299
private CompletableFuture<LakeTieringHeartbeatResponse> respondToHeartbeat(
277300
LakeTieringHeartbeatRequest request) {
278301
requests.add(request);
@@ -344,11 +367,17 @@ public void close() throws Exception {
344367

345368
private static class TestingContext extends FlussMockSplitEnumeratorContext<FlinkTieringSplit> {
346369
private final Queue<Runnable> coordinatorCalls = new ArrayDeque<>();
370+
private final MetricListener metricListener = new MetricListener();
347371

348372
private TestingContext(int parallelism) {
349373
super(parallelism);
350374
}
351375

376+
@Override
377+
public SplitEnumeratorMetricGroup metricGroup() {
378+
return new InternalSplitEnumeratorMetricGroup(metricListener.getMetricGroup());
379+
}
380+
352381
@Override
353382
public void runInCoordinatorThread(Runnable runnable) {
354383
coordinatorCalls.add(runnable);

‎website/docs/maintenance/observability/monitor-metrics.md‎

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1329,8 +1329,8 @@ How to Use Flink Metrics, you can see [Flink Metrics](https://nightlies.apache.o
13291329

13301330
### Tiering Service Metrics
13311331

1332-
These metrics are exposed by the Flink-based tiering source reader when running the Lake Tiering Service.
1333-
All metrics are registered under the `fluss.tieringService` metric group, which is a child of the Flink `SourceReaderMetricGroup`.
1332+
These metrics are exposed by the Flink-based tiering source when running the Lake Tiering Service.
1333+
All metrics are registered under the `fluss.tieringService` metric group, as a child of the Flink `SourceReaderMetricGroup` for reader metrics or `SplitEnumeratorMetricGroup` for enumerator metrics.
13341334

13351335
<table class="table table-bordered">
13361336
<thead>
@@ -1354,5 +1354,11 @@ All metrics are registered under the `fluss.tieringService` metric group, which
13541354
<td>The read throughput rate in bytes per second, derived from the readBytes counter using a 60-second sliding window.</td>
13551355
<td>Meter</td>
13561356
</tr>
1357+
<tr>
1358+
<td>waitingReadersRatio</td>
1359+
<td>Flink Source Enumerator</td>
1360+
<td>The number of readers tracked by the enumerator as waiting for a split divided by the current source parallelism.</td>
1361+
<td>Gauge</td>
1362+
</tr>
13571363
</tbody>
13581364
</table>

0 commit comments

Comments
 (0)