2222import org .opensearch .dataprepper .plugins .source .source_crawler .coordination .state .TokenPaginationCrawlerLeaderProgressState ;
2323import org .opensearch .dataprepper .plugins .source .source_crawler .model .ItemInfo ;
2424import org .opensearch .dataprepper .plugins .source .source_crawler .model .TestItemInfo ;
25+ import io .micrometer .core .instrument .Timer ;
26+ import io .micrometer .core .instrument .Counter ;
2527
2628import java .time .Duration ;
2729import java .time .Instant ;
4244import static org .mockito .Mockito .doThrow ;
4345import static org .mockito .Mockito .never ;
4446import static org .mockito .Mockito .doAnswer ;
47+ import static org .mockito .Mockito .mock ;
48+ import static org .mockito .Mockito .reset ;
49+ import static org .mockito .Mockito .doNothing ;
4550import static org .mockito .internal .verification .VerificationModeFactory .times ;
4651
4752@ ExtendWith (MockitoExtension .class )
@@ -62,6 +67,8 @@ class LeaderOnlyTokenCrawlerTest {
6267 private AcknowledgementSet acknowledgementSet ;
6368 @ Mock
6469 private Buffer <Record <Event >> buffer ;
70+ @ Mock
71+ private PaginationCrawlerWorkerProgressState workerState ;
6572
6673 private LeaderOnlyTokenCrawler crawler ;
6774 private final PluginMetrics pluginMetrics = PluginMetrics .fromNames ("CrawlerTest" , "crawler" );
@@ -241,6 +248,50 @@ void testAcknowledgmentTimeout() {
241248 verify (coordinator ).createPartition (any ());
242249 }
243250
251+ @ Test
252+ public void testExecutePartitionMetrics () {
253+ reset (leaderPartition );
254+
255+ // mock timers and counters
256+ Timer mockCrawlingTimer = mock (Timer .class );
257+ Timer partitionWaitTimeTimer = mock (Timer .class );
258+ Timer partitionProcessLatencyTimer = mock (Timer .class );
259+ Timer mockBufferWriteTimer = mock (Timer .class );
260+ Counter mockBatchesFailedCounter = mock (Counter .class );
261+ Counter mockAcknowledgementSetSuccesses = mock (Counter .class );
262+ Counter mockAcknowledgementSetFailures = mock (Counter .class );
263+
264+ // setup mock plugin metrics
265+ PluginMetrics mockPluginMetrics = mock (PluginMetrics .class );
266+ when (mockPluginMetrics .timer ("crawlingTime" )).thenReturn (mockCrawlingTimer );
267+ when (mockPluginMetrics .timer ("WorkerPartitionWaitTime" )).thenReturn (partitionWaitTimeTimer );
268+ when (mockPluginMetrics .timer ("WorkerPartitionProcessLatency" )).thenReturn (partitionProcessLatencyTimer );
269+ when (mockPluginMetrics .timer ("bufferWriteTime" )).thenReturn (mockBufferWriteTimer );
270+ when (mockPluginMetrics .counter ("batchesFailed" )).thenReturn (mockBatchesFailedCounter );
271+ when (mockPluginMetrics .counter ("acknowledgementSetSuccesses" )).thenReturn (mockAcknowledgementSetSuccesses );
272+ when (mockPluginMetrics .counter ("acknowledgementSetFailures" )).thenReturn (mockAcknowledgementSetFailures );
273+
274+ LeaderOnlyTokenCrawler testCrawler = new LeaderOnlyTokenCrawler (client , mockPluginMetrics );
275+
276+ // test executePartition with metrics
277+ when (workerState .getExportStartTime ()).thenReturn (Instant .now ().minusSeconds (1 ));
278+
279+ // make latency timer execute the runnable so client.executePartition() gets called
280+ doAnswer (invocation -> {
281+ Runnable runnable = invocation .getArgument (0 );
282+ runnable .run ();
283+ return null ;
284+ }).when (partitionProcessLatencyTimer ).record (any (Runnable .class ));
285+
286+ doNothing ().when (partitionWaitTimeTimer ).record (any (Duration .class ));
287+
288+ testCrawler .executePartition (workerState , buffer , acknowledgementSet );
289+
290+ // verify metrics are recorded
291+ verify (partitionProcessLatencyTimer ).record (any (Runnable .class ));
292+ verify (partitionWaitTimeTimer ).record (any (Duration .class ));
293+ verify (client ).executePartition (workerState , buffer , acknowledgementSet );
294+ }
244295
245296 private List <ItemInfo > createTestItems (int count ) {
246297 List <ItemInfo > items = new ArrayList <>();
@@ -249,4 +300,4 @@ private List<ItemInfo> createTestItems(int count) {
249300 }
250301 return items ;
251302 }
252- }
303+ }
0 commit comments