Skip to content

Commit 496230d

Browse files
committed
KCL metrics management through config
1.Added "metrics" config to disable/enable sending KCL metrics to cloudwatch 2.Default value is false. Signed-off-by: RashmiRam <ras.xena@gmail.com>
1 parent 1f3c152 commit 496230d

5 files changed

Lines changed: 76 additions & 1 deletion

File tree

data-prepper-plugins/kinesis-source/src/main/java/org/opensearch/dataprepper/plugins/kinesis/source/KinesisService.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@
4242
import software.amazon.kinesis.coordinator.Scheduler;
4343
import software.amazon.kinesis.exceptions.KinesisClientLibDependencyException;
4444
import software.amazon.kinesis.exceptions.ThrottlingException;
45+
import software.amazon.kinesis.metrics.MetricsConfig;
46+
import software.amazon.kinesis.metrics.NullMetricsFactory;
4547
import software.amazon.kinesis.processor.ShardRecordProcessorFactory;
4648
import software.amazon.kinesis.retrieval.RetrievalConfig;
4749
import software.amazon.kinesis.retrieval.polling.PollingConfig;
@@ -198,14 +200,18 @@ public Scheduler createScheduler(final Buffer<Record<Event>> buffer) {
198200
kinesisSourceConfig.getPollingConfig().getIdleTimeBetweenReads().toMillis()));
199201
}
200202

203+
MetricsConfig metricsConfig = kinesisSourceConfig.isMetrics()
204+
? configsBuilder.metricsConfig()
205+
: configsBuilder.metricsConfig().metricsFactory(new NullMetricsFactory());
206+
201207
return new Scheduler(
202208
configsBuilder.checkpointConfig(),
203209
configsBuilder.coordinatorConfig()
204210
.schedulerInitializationBackoffTimeMillis(kinesisSourceConfig.getInitializationBackoffTime().toMillis())
205211
.maxInitializationAttempts(kinesisSourceConfig.getMaxInitializationAttempts()),
206212
configsBuilder.leaseManagementConfig().billingMode(BillingMode.PAY_PER_REQUEST),
207213
configsBuilder.lifecycleConfig(),
208-
configsBuilder.metricsConfig(),
214+
metricsConfig,
209215
configsBuilder.processorConfig(),
210216
retrievalConfig
211217
);

data-prepper-plugins/kinesis-source/src/main/java/org/opensearch/dataprepper/plugins/kinesis/source/configuration/KinesisSourceConfig.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ public Duration getShardAcknowledgmentTimeout() {
7979
@Getter
8080
@JsonProperty("initialization_backoff_time")
8181
private Duration initializationBackoffTime = DEFAULT_INITIALIZATION_BACKOFF_TIME;
82+
83+
@Getter
84+
@JsonProperty("metrics")
85+
private boolean metrics = false;
8286
}
8387

8488

data-prepper-plugins/kinesis-source/src/test/java/org/opensearch/dataprepper/plugins/kinesis/source/KinesisServiceTest.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@
4141
import software.amazon.awssdk.services.kinesis.model.StreamDescriptionSummary;
4242
import software.amazon.kinesis.common.InitialPositionInStream;
4343
import software.amazon.kinesis.coordinator.Scheduler;
44+
import software.amazon.kinesis.metrics.CloudWatchMetricsFactory;
4445
import software.amazon.kinesis.metrics.MetricsLevel;
46+
import software.amazon.kinesis.metrics.NullMetricsFactory;
4547
import software.amazon.kinesis.retrieval.polling.PollingConfig;
4648

4749
import java.time.Duration;
@@ -58,6 +60,7 @@
5860

5961
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
6062
import static org.junit.jupiter.api.Assertions.assertEquals;
63+
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
6164
import static org.junit.jupiter.api.Assertions.assertNotEquals;
6265
import static org.junit.jupiter.api.Assertions.assertNotNull;
6366
import static org.junit.jupiter.api.Assertions.assertSame;
@@ -257,6 +260,30 @@ void testCreateScheduler() {
257260
verify(workerIdentifierGenerator, times(1)).generate();
258261
}
259262

263+
@Test
264+
void testCreateSchedulerUsesNullMetricsFactoryWhenMetricsDisabled() {
265+
when(kinesisSourceConfig.isMetrics()).thenReturn(false);
266+
KinesisService kinesisService = new KinesisService(kinesisSourceConfig, kinesisClientFactory, pluginMetrics, pluginFactory,
267+
pipelineDescription, acknowledgementSetManager, kinesisLeaseConfigSupplier, workerIdentifierGenerator);
268+
Scheduler schedulerObjectUnderTest = kinesisService.createScheduler(buffer);
269+
270+
assertNotNull(schedulerObjectUnderTest);
271+
assertNotNull(schedulerObjectUnderTest.metricsConfig());
272+
assertInstanceOf(NullMetricsFactory.class, schedulerObjectUnderTest.metricsConfig().metricsFactory());
273+
}
274+
275+
@Test
276+
void testCreateSchedulerUsesCloudWatchMetricsFactoryWhenMetricsEnabled() {
277+
when(kinesisSourceConfig.isMetrics()).thenReturn(true);
278+
KinesisService kinesisService = new KinesisService(kinesisSourceConfig, kinesisClientFactory, pluginMetrics, pluginFactory,
279+
pipelineDescription, acknowledgementSetManager, kinesisLeaseConfigSupplier, workerIdentifierGenerator);
280+
Scheduler schedulerObjectUnderTest = kinesisService.createScheduler(buffer);
281+
282+
assertNotNull(schedulerObjectUnderTest);
283+
assertNotNull(schedulerObjectUnderTest.metricsConfig());
284+
assertInstanceOf(CloudWatchMetricsFactory.class, schedulerObjectUnderTest.metricsConfig().metricsFactory());
285+
}
286+
260287
@Test
261288
void testCreateSchedulerWithPollingStrategy() {
262289
when(kinesisSourceConfig.getConsumerStrategy()).thenReturn(ConsumerStrategy.POLLING);

data-prepper-plugins/kinesis-source/src/test/java/org/opensearch/dataprepper/plugins/kinesis/source/configuration/KinesisSourceConfigTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ public class KinesisSourceConfigTest {
4646
private static final String PIPELINE_CONFIG_CHECKPOINT_ENABLED = "pipeline_with_checkpoint_enabled.yaml";
4747
private static final String PIPELINE_CONFIG_STREAM_ARN_ENABLED = "pipeline_with_stream_arn_config.yaml";
4848
private static final String PIPELINE_CONFIG_STREAM_ARN_CONSUMER_ARN_ENABLED = "pipeline_with_stream_arn_consumer_arn_config.yaml";
49+
private static final String PIPELINE_CONFIG_WITH_METRICS_ENABLED = "pipeline_with_metrics_enabled.yaml";
4950
private static final Duration MINIMAL_CHECKPOINT_INTERVAL = Duration.ofMillis(2 * 60 * 1000); // 2 minute
5051

5152
KinesisSourceConfig kinesisSourceConfig;
@@ -81,6 +82,7 @@ void testSourceConfig() {
8182
assertEquals(KinesisSourceConfig.DEFAULT_MAX_INITIALIZATION_ATTEMPTS, kinesisSourceConfig.getMaxInitializationAttempts());
8283
assertEquals(KinesisSourceConfig.DEFAULT_INITIALIZATION_BACKOFF_TIME, kinesisSourceConfig.getInitializationBackoffTime());
8384
assertTrue(kinesisSourceConfig.isAcknowledgments());
85+
assertFalse(kinesisSourceConfig.isMetrics());
8486
assertEquals(KinesisSourceConfig.DEFAULT_SHARD_ACKNOWLEDGEMENT_TIMEOUT, kinesisSourceConfig.getShardAcknowledgmentTimeout());
8587
assertThat(kinesisSourceConfig.getAwsAuthenticationConfig(), notNullValue());
8688
assertEquals(kinesisSourceConfig.getAwsAuthenticationConfig().getAwsRegion(), Region.US_EAST_1);
@@ -114,6 +116,7 @@ void testSourceConfigWithStreamCodec() {
114116
assertEquals(KinesisSourceConfig.DEFAULT_MAX_INITIALIZATION_ATTEMPTS, kinesisSourceConfig.getMaxInitializationAttempts());
115117
assertEquals(KinesisSourceConfig.DEFAULT_INITIALIZATION_BACKOFF_TIME, kinesisSourceConfig.getInitializationBackoffTime());
116118
assertFalse(kinesisSourceConfig.isAcknowledgments());
119+
assertFalse(kinesisSourceConfig.isMetrics());
117120
assertEquals(KinesisSourceConfig.DEFAULT_SHARD_ACKNOWLEDGEMENT_TIMEOUT, kinesisSourceConfig.getShardAcknowledgmentTimeout());
118121
assertThat(kinesisSourceConfig.getAwsAuthenticationConfig(), notNullValue());
119122
assertEquals(kinesisSourceConfig.getAwsAuthenticationConfig().getAwsRegion(), Region.US_EAST_1);
@@ -234,4 +237,26 @@ void testSourceConfigWithStreamArnConsumerArn() {
234237
assertEquals(kinesisStreamConfig.getCheckPointInterval(), MINIMAL_CHECKPOINT_INTERVAL);
235238
}
236239
}
240+
241+
@Test
242+
@Tag(PIPELINE_CONFIG_WITH_METRICS_ENABLED)
243+
void testSourceConfigWithMetricsEnabled() {
244+
245+
assertThat(kinesisSourceConfig, notNullValue());
246+
assertTrue(kinesisSourceConfig.isMetrics());
247+
assertEquals(KinesisSourceConfig.DEFAULT_NUMBER_OF_RECORDS_TO_ACCUMULATE, kinesisSourceConfig.getNumberOfRecordsToAccumulate());
248+
assertEquals(KinesisSourceConfig.DEFAULT_TIME_OUT_IN_MILLIS, kinesisSourceConfig.getBufferTimeout());
249+
assertFalse(kinesisSourceConfig.isAcknowledgments());
250+
assertThat(kinesisSourceConfig.getAwsAuthenticationConfig(), notNullValue());
251+
assertEquals(kinesisSourceConfig.getAwsAuthenticationConfig().getAwsRegion(), Region.US_EAST_1);
252+
assertEquals(kinesisSourceConfig.getAwsAuthenticationConfig().getAwsStsRoleArn(), "arn:aws:iam::123456789012:role/OSI-PipelineRole");
253+
254+
List<KinesisStreamConfig> streamConfigs = kinesisSourceConfig.getStreams();
255+
assertNotNull(kinesisSourceConfig.getCodec());
256+
assertEquals(streamConfigs.size(), 3);
257+
258+
for (KinesisStreamConfig kinesisStreamConfig: streamConfigs) {
259+
assertTrue(kinesisStreamConfig.getName().contains("stream"));
260+
}
261+
}
237262
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
source:
2+
kinesis:
3+
streams:
4+
- stream_name: "stream-1"
5+
- stream_name: "stream-2"
6+
- stream_name: "stream-3"
7+
codec:
8+
ndjson:
9+
aws:
10+
sts_role_arn: "arn:aws:iam::123456789012:role/OSI-PipelineRole"
11+
region: "us-east-1"
12+
metrics: true
13+

0 commit comments

Comments
 (0)