Skip to content

Commit 0ec1bf5

Browse files
Emit DimensionalTimeSliceCrawler worker partition process latency metrics (#6091)
**What?** This commit emits two additional metrics for DimensionalTimeSliceCrawler metric WorkerPartitionWaitTime measures the wait time before a worker partition starts being processed after creation. metric WorkerPartitionProcessLatency measures the duration between pulling data from source to writing to buffer in a worker partition. **Why?** These two metrics will provide visibility how long it takes to process a partition after being created. Signed-off-by: Wenjie Yao <wjyao@amazon.com> Co-authored-by: Wenjie Yao <wjyao@amazon.com>
1 parent 899014b commit 0ec1bf5

4 files changed

Lines changed: 37 additions & 1 deletion

File tree

data-prepper-plugins/saas-source-plugins/source-crawler/src/main/java/org/opensearch/dataprepper/plugins/source/source_crawler/base/DimensionalTimeSliceCrawler.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.opensearch.dataprepper.plugins.source.source_crawler.base;
22

33
import io.micrometer.core.instrument.Counter;
4+
import io.micrometer.core.instrument.Timer;
45
import org.opensearch.dataprepper.metrics.PluginMetrics;
56
import org.opensearch.dataprepper.model.acknowledgements.AcknowledgementSet;
67
import org.opensearch.dataprepper.model.buffer.Buffer;
@@ -36,17 +37,23 @@
3637
public class DimensionalTimeSliceCrawler implements Crawler<DimensionalTimeSliceWorkerProgressState> {
3738
private static final Logger log = LoggerFactory.getLogger(DimensionalTimeSliceCrawler.class);
3839
private static final String DIMENSIONAL_TIME_SLICE_WORKER_PARTITIONS_CREATED = "DimensionalTimeSliceWorkerPartitionsCreated";
40+
private static final String WORKER_PARTITION_WAIT_TIME = "WorkerPartitionWaitTime";
41+
private static final String WORKER_PARTITION_PROCESS_LATENCY = "WorkerPartitionProcessLatency";
3942
private static final Duration HOUR_DURATION = Duration.ofHours(1);
4043

4144
private final CrawlerClient client;
4245
private final Counter partitionsCreatedCounter;
46+
private final Timer partitionWaitTimeTimer;
47+
private final Timer partitionProcessLatencyTimer;
4348
private List<String> dimensionTypes;
4449
private static final String LAST_UPDATED_KEY = "last_updated|";
4550

4651
public DimensionalTimeSliceCrawler(CrawlerClient client,
4752
PluginMetrics pluginMetrics) {
4853
this.client = client;
4954
this.partitionsCreatedCounter = pluginMetrics.counter(DIMENSIONAL_TIME_SLICE_WORKER_PARTITIONS_CREATED);
55+
this.partitionWaitTimeTimer = pluginMetrics.timer(WORKER_PARTITION_WAIT_TIME);
56+
this.partitionProcessLatencyTimer = pluginMetrics.timer(WORKER_PARTITION_PROCESS_LATENCY);
5057
}
5158

5259
/**
@@ -78,7 +85,8 @@ public Instant crawl(LeaderPartition leaderPartition, EnhancedSourceCoordinator
7885

7986
@Override
8087
public void executePartition(DimensionalTimeSliceWorkerProgressState state, Buffer<Record<Event>> buffer, AcknowledgementSet acknowledgementSet) {
81-
client.executePartition(state, buffer, acknowledgementSet);
88+
partitionWaitTimeTimer.record(Duration.between(state.getPartitionCreationTime(), Instant.now()));
89+
partitionProcessLatencyTimer.record(() -> client.executePartition(state, buffer, acknowledgementSet));
8290
}
8391

8492
private void createPartitionsForDimensionTypes(LeaderPartition leaderPartition,
@@ -149,6 +157,7 @@ private void createPartitionForIncrementalSync(LeaderPartition leaderPartition,
149157
void createWorkerPartition(Instant startTime, Instant endTime,
150158
String dimensionType, EnhancedSourceCoordinator coordinator) {
151159
DimensionalTimeSliceWorkerProgressState workerState = new DimensionalTimeSliceWorkerProgressState();
160+
workerState.setPartitionCreationTime(Instant.now());
152161
workerState.setStartTime(startTime);
153162
workerState.setEndTime(endTime);
154163
workerState.setDimensionType(dimensionType);

data-prepper-plugins/saas-source-plugins/source-crawler/src/main/java/org/opensearch/dataprepper/plugins/source/source_crawler/coordination/state/DimensionalTimeSliceWorkerProgressState.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,7 @@ public class DimensionalTimeSliceWorkerProgressState implements SaasWorkerProgre
1717

1818
@JsonProperty("dimensionType")
1919
private String dimensionType;
20+
21+
@JsonProperty("partitionCreationTime")
22+
private Instant partitionCreationTime;
2023
}

data-prepper-plugins/saas-source-plugins/source-crawler/src/test/java/org/opensearch/dataprepper/plugins/source/source_crawler/base/DimensionalTimeSliceCrawlerTest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.opensearch.dataprepper.plugins.source.source_crawler.base;
22

33
import io.micrometer.core.instrument.Counter;
4+
import io.micrometer.core.instrument.Timer;
45
import org.junit.jupiter.api.BeforeEach;
56
import org.junit.jupiter.api.Test;
67
import org.junit.jupiter.api.extension.ExtendWith;
@@ -37,6 +38,8 @@
3738
import static org.mockito.Mockito.times;
3839
import static org.mockito.Mockito.verify;
3940
import static org.mockito.Mockito.when;
41+
import static org.mockito.Mockito.doAnswer;
42+
import static org.mockito.Mockito.doNothing;
4043

4144
@ExtendWith(MockitoExtension.class)
4245
public class DimensionalTimeSliceCrawlerTest {
@@ -50,6 +53,12 @@ public class DimensionalTimeSliceCrawlerTest {
5053
@Mock
5154
private Counter partitionsCreatedCounter;
5255

56+
@Mock
57+
private Timer partitionWaitTimeTimer;
58+
59+
@Mock
60+
private Timer partitionProcessLatencyTimer;
61+
5362
@Mock
5463
private EnhancedSourceCoordinator coordinator;
5564

@@ -64,6 +73,8 @@ public class DimensionalTimeSliceCrawlerTest {
6473
@BeforeEach
6574
void setUp() {
6675
when(pluginMetrics.counter(anyString())).thenReturn(partitionsCreatedCounter);
76+
when(pluginMetrics.timer("WorkerPartitionWaitTime")).thenReturn(partitionWaitTimeTimer);
77+
when(pluginMetrics.timer("WorkerPartitionProcessLatency")).thenReturn(partitionProcessLatencyTimer);
6778
crawler = new DimensionalTimeSliceCrawler(client, pluginMetrics);
6879
crawler.initialize(LOG_TYPES);
6980
}
@@ -144,12 +155,22 @@ void testCreateWorkerPartition() {
144155
@Test
145156
void testExecutePartition() {
146157
DimensionalTimeSliceWorkerProgressState state = new DimensionalTimeSliceWorkerProgressState();
158+
state.setPartitionCreationTime(Instant.now().minusSeconds(1));
147159
Buffer<Record<Event>> buffer = mock(Buffer.class);
148160
AcknowledgementSet ackSet = mock(AcknowledgementSet.class);
149161

162+
doAnswer(invocation -> {
163+
Runnable runnable = invocation.getArgument(0);
164+
runnable.run();
165+
return null;
166+
}).when(partitionProcessLatencyTimer).record(any(Runnable.class));
167+
doNothing().when(partitionWaitTimeTimer).record(any(Duration.class));
168+
150169
crawler.executePartition(state, buffer, ackSet);
151170

152171
verify(client).executePartition(eq(state), eq(buffer), eq(ackSet));
172+
verify(partitionProcessLatencyTimer).record(any(Runnable.class));
173+
verify(partitionWaitTimeTimer).record(any(Duration.class));
153174
}
154175

155176
@Test

data-prepper-plugins/saas-source-plugins/source-crawler/src/test/java/org/opensearch/dataprepper/plugins/source/source_crawler/coordination/state/DimensionalTimeSliceWorkerProgressStateTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ void testDefaultValues() throws JsonProcessingException {
3232
assertNull(state.getStartTime());
3333
assertNull(state.getEndTime());
3434
assertNull(state.getDimensionType());
35+
assertNull(state.getPartitionCreationTime());
3536
}
3637

3738
@Test
@@ -40,12 +41,14 @@ void testDeserializeDimensionalTimeSliceWorkerProgressState_withTypeInfo() throw
4041
" \"@class\": \"org.opensearch.dataprepper.plugins.source.source_crawler.coordination.state.DimensionalTimeSliceWorkerProgressState\",\n" +
4142
" \"startTime\": \"2024-10-20T02:27:15.717Z\",\n" +
4243
" \"endTime\": \"2024-10-20T03:27:15.717Z\",\n" +
44+
" \"partitionCreationTime\": \"2024-11-21T04:29:15.719Z\",\n" +
4345
" \"dimensionType\": \"Exchange\"\n" +
4446
"}";
4547

4648
DimensionalTimeSliceWorkerProgressState state = objectMapper.readValue(json, DimensionalTimeSliceWorkerProgressState.class);
4749
assertEquals(Instant.parse("2024-10-20T02:27:15.717Z"), state.getStartTime());
4850
assertEquals(Instant.parse("2024-10-20T03:27:15.717Z"), state.getEndTime());
51+
assertEquals(Instant.parse("2024-11-21T04:29:15.719Z"), state.getPartitionCreationTime());
4952
assertEquals("Exchange", state.getDimensionType());
5053
}
5154
}

0 commit comments

Comments
 (0)