|
5 | 5 |
|
6 | 6 | package org.opensearch.dataprepper.plugins.kafka.util; |
7 | 7 |
|
| 8 | +import io.micrometer.core.instrument.Counter; |
| 9 | +import io.micrometer.core.instrument.Timer; |
| 10 | +import org.apache.commons.lang3.RandomStringUtils; |
| 11 | +import org.apache.kafka.clients.consumer.KafkaConsumer; |
| 12 | +import org.apache.kafka.common.Metric; |
| 13 | +import org.apache.kafka.common.MetricName; |
8 | 14 | import org.junit.jupiter.api.BeforeEach; |
| 15 | +import org.junit.jupiter.api.Test; |
| 16 | +import org.junit.jupiter.api.extension.ExtendWith; |
9 | 17 | import org.junit.jupiter.params.ParameterizedTest; |
10 | 18 | import org.junit.jupiter.params.provider.ValueSource; |
11 | | -import org.junit.jupiter.api.extension.ExtendWith; |
12 | | -import static org.junit.jupiter.api.Assertions.assertEquals; |
13 | | - |
| 19 | +import org.mockito.ArgumentCaptor; |
14 | 20 | import org.mockito.Mock; |
15 | 21 | import org.mockito.junit.jupiter.MockitoExtension; |
16 | | -import static org.mockito.ArgumentMatchers.any; |
17 | | -import static org.mockito.Mockito.mock; |
18 | | -import static org.mockito.Mockito.when; |
19 | | -import static org.mockito.Mockito.doAnswer; |
20 | 22 | import org.opensearch.dataprepper.metrics.PluginMetrics; |
21 | | -import org.apache.kafka.common.Metric; |
22 | | -import org.apache.kafka.common.MetricName; |
23 | | -import org.apache.kafka.clients.consumer.KafkaConsumer; |
24 | | -import org.apache.commons.lang3.RandomStringUtils; |
25 | | - |
26 | | -import io.micrometer.core.instrument.Counter; |
27 | | -import static org.hamcrest.MatcherAssert.assertThat; |
28 | | -import static org.hamcrest.CoreMatchers.equalTo; |
29 | 23 |
|
30 | | -import java.util.Map; |
31 | 24 | import java.util.HashMap; |
| 25 | +import java.util.Map; |
32 | 26 | import java.util.Random; |
33 | | -import java.util.function.ToDoubleFunction; |
| 27 | +import java.util.concurrent.TimeUnit; |
| 28 | +import java.util.function.ToDoubleFunction; |
| 29 | + |
| 30 | +import static org.hamcrest.CoreMatchers.equalTo; |
| 31 | +import static org.hamcrest.MatcherAssert.assertThat; |
| 32 | +import static org.hamcrest.Matchers.greaterThan; |
| 33 | +import static org.hamcrest.Matchers.lessThan; |
| 34 | +import static org.junit.jupiter.api.Assertions.assertEquals; |
| 35 | +import static org.mockito.ArgumentMatchers.any; |
| 36 | +import static org.mockito.ArgumentMatchers.eq; |
| 37 | +import static org.mockito.Mockito.doAnswer; |
| 38 | +import static org.mockito.Mockito.doNothing; |
| 39 | +import static org.mockito.Mockito.mock; |
| 40 | +import static org.mockito.Mockito.when; |
| 41 | +import static org.opensearch.dataprepper.plugins.kafka.util.KafkaTopicConsumerMetrics.TIME_BETWEEN_POLL_CALLS; |
34 | 42 |
|
35 | 43 | @ExtendWith(MockitoExtension.class) |
36 | 44 | public class KafkaTopicConsumerMetricsTests { |
@@ -79,6 +87,9 @@ public Object metricValue() { |
79 | 87 | @Mock |
80 | 88 | private Counter bytesConsumedCounter; |
81 | 89 |
|
| 90 | + @Mock |
| 91 | + private Timer timeBetweenPolls; |
| 92 | + |
82 | 93 | @Mock |
83 | 94 | private Counter recordsConsumedCounter; |
84 | 95 | private double bytesConsumedCount; |
@@ -122,14 +133,7 @@ void setUp() { |
122 | 133 | return recordsConsumedCounter; |
123 | 134 | } |
124 | 135 | }).when(pluginMetrics).counter(any(String.class)); |
125 | | - doAnswer((i) -> { |
126 | | - bytesConsumedCount += (double)i.getArgument(0); |
127 | | - return null; |
128 | | - }).when(bytesConsumedCounter).increment(any(Double.class)); |
129 | | - doAnswer((i) -> { |
130 | | - recordsConsumedCount += (double)i.getArgument(0); |
131 | | - return null; |
132 | | - }).when(recordsConsumedCounter).increment(any(Double.class)); |
| 136 | + when(pluginMetrics.timer("topic." + topicName + "." + TIME_BETWEEN_POLL_CALLS)).thenReturn(timeBetweenPolls); |
133 | 137 | } |
134 | 138 |
|
135 | 139 | public KafkaTopicConsumerMetrics createObjectUnderTest() { |
@@ -205,6 +209,15 @@ private void populateKafkaMetrics(Map<MetricName, KafkaTestMetric> metrics, doub |
205 | 209 | @ValueSource(ints = {1, 5, 10}) |
206 | 210 | //@ValueSource(ints = {2}) |
207 | 211 | public void KafkaTopicMetricTest_checkMetricUpdates(int numConsumers) { |
| 212 | + doAnswer((i) -> { |
| 213 | + bytesConsumedCount += (double)i.getArgument(0); |
| 214 | + return null; |
| 215 | + }).when(bytesConsumedCounter).increment(any(Double.class)); |
| 216 | + doAnswer((i) -> { |
| 217 | + recordsConsumedCount += (double)i.getArgument(0); |
| 218 | + return null; |
| 219 | + }).when(recordsConsumedCounter).increment(any(Double.class)); |
| 220 | + |
208 | 221 | topicMetrics = createObjectUnderTest(); |
209 | 222 | for (int i = 0; i < numConsumers; i++) { |
210 | 223 | KafkaConsumer kafkaConsumer = mock(KafkaConsumer.class); |
@@ -246,4 +259,22 @@ public void KafkaTopicMetricTest_checkMetricUpdates(int numConsumers) { |
246 | 259 |
|
247 | 260 | } |
248 | 261 |
|
| 262 | + |
| 263 | + @Test |
| 264 | + void recordTimeBetweenPolls_records_metric_correctly() throws InterruptedException { |
| 265 | + topicMetrics = createObjectUnderTest(); |
| 266 | + |
| 267 | + final ArgumentCaptor<Long> recordedTimeCaptor = ArgumentCaptor.forClass(Long.class); |
| 268 | + |
| 269 | + doNothing().when(timeBetweenPolls).record(recordedTimeCaptor.capture(), eq(TimeUnit.MILLISECONDS)); |
| 270 | + |
| 271 | + Thread.sleep(100); |
| 272 | + topicMetrics.recordTimeBetweenPolls(); |
| 273 | + |
| 274 | + final long recordedTime = recordedTimeCaptor.getValue(); |
| 275 | + |
| 276 | + assertThat(recordedTime, greaterThan(0L)); |
| 277 | + assertThat(recordedTime, lessThan(1000L)); |
| 278 | + } |
| 279 | + |
249 | 280 | } |
0 commit comments