Skip to content
This repository was archived by the owner on Apr 1, 2024. It is now read-only.

Commit 392549c

Browse files
[improve][pip] PIP-339: Introducing the --log-topic Option for Pulsar Sinks and Sources (apache#22185)
1 parent 46c9ce9 commit 392549c

File tree

8 files changed

+77
-0
lines changed

8 files changed

+77
-0
lines changed

pulsar-client-admin-api/src/main/java/org/apache/pulsar/common/io/SinkConfig.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,4 +94,5 @@ public class SinkConfig {
9494
private String transformFunction;
9595
private String transformFunctionClassName;
9696
private String transformFunctionConfig;
97+
private String logTopic;
9798
}

pulsar-client-admin-api/src/main/java/org/apache/pulsar/common/io/SourceConfig.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,5 @@ public class SourceConfig {
7272
private BatchSourceConfig batchSourceConfig;
7373
// batchBuilder provides two types of batch construction methods, DEFAULT and KEY_BASED
7474
private String batchBuilder;
75+
private String logTopic;
7576
}

pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdSinks.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,8 @@ abstract class SinkDetailsCommand extends BaseCommand {
410410
@Parameter(names = "--transform-function-config", description = "Configuration of the transform function "
411411
+ "applied before the Sink")
412412
protected String transformFunctionConfig;
413+
@Parameter(names = "--log-topic", description = "The topic to which the logs of a Pulsar Sink are produced")
414+
protected String logTopic;
413415

414416
protected SinkConfig sinkConfig;
415417

@@ -605,6 +607,9 @@ void processArguments() throws Exception {
605607
if (transformFunctionConfig != null) {
606608
sinkConfig.setTransformFunctionConfig(transformFunctionConfig);
607609
}
610+
if (null != logTopic) {
611+
sinkConfig.setLogTopic(logTopic);
612+
}
608613

609614
// check if configs are valid
610615
validateSinkConfigs(sinkConfig);

pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdSources.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,8 @@ abstract class SourceDetailsCommand extends BaseCommand {
365365
@Parameter(names = "--secrets", description = "The map of secretName to an object that encapsulates "
366366
+ "how the secret is fetched by the underlying secrets provider")
367367
protected String secretsString;
368+
@Parameter(names = "--log-topic", description = "The topic to which the logs of a Pulsar Sink are produced")
369+
protected String logTopic;
368370

369371
protected SourceConfig sourceConfig;
370372

@@ -500,6 +502,9 @@ void processArguments() throws Exception {
500502
}
501503
sourceConfig.setSecrets(secretsMap);
502504
}
505+
if (null != logTopic) {
506+
sourceConfig.setLogTopic(logTopic);
507+
}
503508

504509
// check if source configs are valid
505510
validateSourceConfigs(sourceConfig);

pulsar-functions/utils/src/main/java/org/apache/pulsar/functions/utils/SinkConfigUtils.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,9 @@ public static FunctionDetails convert(SinkConfig sinkConfig, ExtractedSinkDetail
8787
if (sinkConfig.getName() != null) {
8888
functionDetailsBuilder.setName(sinkConfig.getName());
8989
}
90+
if (sinkConfig.getLogTopic() != null) {
91+
functionDetailsBuilder.setLogTopic(sinkConfig.getLogTopic());
92+
}
9093
functionDetailsBuilder.setRuntime(FunctionDetails.Runtime.JAVA);
9194
if (sinkConfig.getParallelism() != null) {
9295
functionDetailsBuilder.setParallelism(sinkConfig.getParallelism());
@@ -321,6 +324,9 @@ public static SinkConfig convertFromDetails(FunctionDetails functionDetails) {
321324
sinkConfig.setRetainOrdering(false);
322325
sinkConfig.setRetainKeyOrdering(false);
323326
}
327+
if (!isEmpty(functionDetails.getLogTopic())) {
328+
sinkConfig.setLogTopic(functionDetails.getLogTopic());
329+
}
324330

325331
sinkConfig.setProcessingGuarantees(convertProcessingGuarantee(functionDetails.getProcessingGuarantees()));
326332

@@ -426,6 +432,12 @@ public static ExtractedSinkDetails validateAndExtractDetails(SinkConfig sinkConf
426432
throw new IllegalArgumentException(String.format("Input topic %s is invalid", topic));
427433
}
428434
}
435+
if (!isEmpty(sinkConfig.getLogTopic())) {
436+
if (!TopicName.isValid(sinkConfig.getLogTopic())) {
437+
throw new IllegalArgumentException(
438+
String.format("LogTopic topic %s is invalid", sinkConfig.getLogTopic()));
439+
}
440+
}
429441

430442
if (sinkConfig.getParallelism() != null && sinkConfig.getParallelism() <= 0) {
431443
throw new IllegalArgumentException("Sink parallelism must be a positive number");
@@ -613,6 +625,9 @@ public static SinkConfig validateUpdate(SinkConfig existingConfig, SinkConfig ne
613625
if (mergedConfig.getInputSpecs() == null) {
614626
mergedConfig.setInputSpecs(new HashMap<>());
615627
}
628+
if (!StringUtils.isEmpty(newConfig.getLogTopic())) {
629+
mergedConfig.setLogTopic(newConfig.getLogTopic());
630+
}
616631

617632
if (newConfig.getInputs() != null) {
618633
newConfig.getInputs().forEach((topicName -> {

pulsar-functions/utils/src/main/java/org/apache/pulsar/functions/utils/SourceConfigUtils.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ public static FunctionDetails convert(SourceConfig sourceConfig, ExtractedSource
8181
if (sourceConfig.getName() != null) {
8282
functionDetailsBuilder.setName(sourceConfig.getName());
8383
}
84+
if (sourceConfig.getLogTopic() != null) {
85+
functionDetailsBuilder.setLogTopic(sourceConfig.getLogTopic());
86+
}
8487
functionDetailsBuilder.setRuntime(FunctionDetails.Runtime.JAVA);
8588
if (sourceConfig.getParallelism() != null) {
8689
functionDetailsBuilder.setParallelism(sourceConfig.getParallelism());
@@ -274,6 +277,9 @@ public static SourceConfig convertFromDetails(FunctionDetails functionDetails) {
274277
producerConfig.setCompressionType(convertFromFunctionDetailsCompressionType(spec.getCompressionType()));
275278
sourceConfig.setProducerConfig(producerConfig);
276279
}
280+
if (!isEmpty(functionDetails.getLogTopic())) {
281+
sourceConfig.setLogTopic(functionDetails.getLogTopic());
282+
}
277283
if (functionDetails.hasResources()) {
278284
Resources resources = new Resources();
279285
resources.setCpu(functionDetails.getResources().getCpu());
@@ -308,6 +314,12 @@ public static ExtractedSourceDetails validateAndExtractDetails(SourceConfig sour
308314
if (!isEmpty(sourceConfig.getTopicName()) && !TopicName.isValid(sourceConfig.getTopicName())) {
309315
throw new IllegalArgumentException("Topic name is invalid");
310316
}
317+
if (!isEmpty(sourceConfig.getLogTopic())) {
318+
if (!TopicName.isValid(sourceConfig.getLogTopic())) {
319+
throw new IllegalArgumentException(
320+
String.format("LogTopic topic %s is invalid", sourceConfig.getLogTopic()));
321+
}
322+
}
311323
if (sourceConfig.getParallelism() != null && sourceConfig.getParallelism() <= 0) {
312324
throw new IllegalArgumentException("Source parallelism must be a positive number");
313325
}
@@ -434,6 +446,9 @@ public static SourceConfig validateUpdate(SourceConfig existingConfig, SourceCon
434446
if (newConfig.getSecrets() != null) {
435447
mergedConfig.setSecrets(newConfig.getSecrets());
436448
}
449+
if (!StringUtils.isEmpty(newConfig.getLogTopic())) {
450+
mergedConfig.setLogTopic(newConfig.getLogTopic());
451+
}
437452
if (newConfig.getProcessingGuarantees() != null && !newConfig.getProcessingGuarantees()
438453
.equals(existingConfig.getProcessingGuarantees())) {
439454
throw new IllegalArgumentException("Processing Guarantees cannot be altered");

pulsar-functions/utils/src/test/java/org/apache/pulsar/functions/utils/SinkConfigUtilsTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ public void testConvertBackFidelity() throws IOException {
136136

137137
sinkConfig.setTransformFunction("builtin://transform");
138138
sinkConfig.setTransformFunctionConfig("{\"key\": \"value\"}");
139+
sinkConfig.setLogTopic("log-topic");
139140

140141
Function.FunctionDetails functionDetails = SinkConfigUtils.convert(sinkConfig, new SinkConfigUtils.ExtractedSinkDetails(null, null, null));
141142
assertEquals(Function.SubscriptionType.SHARED, functionDetails.getSource().getSubscriptionType());
@@ -522,6 +523,22 @@ public void testMergeDifferentTransformFunctionConfig() {
522523
);
523524
}
524525

526+
@Test
527+
public void testMergeDifferentLogTopic() {
528+
SinkConfig sinkConfig = createSinkConfig();
529+
SinkConfig newSinkConfig = createUpdatedSinkConfig("logTopic", "Different");
530+
SinkConfig mergedConfig = SinkConfigUtils.validateUpdate(sinkConfig, newSinkConfig);
531+
assertEquals(
532+
mergedConfig.getLogTopic(),
533+
"Different"
534+
);
535+
mergedConfig.setLogTopic(sinkConfig.getLogTopic());
536+
assertEquals(
537+
new Gson().toJson(sinkConfig),
538+
new Gson().toJson(mergedConfig)
539+
);
540+
}
541+
525542
@Test
526543
public void testValidateConfig() {
527544
SinkConfig sinkConfig = createSinkConfig();
@@ -559,6 +576,7 @@ private SinkConfig createSinkConfig() {
559576
sinkConfig.setTransformFunction("builtin://transform");
560577
sinkConfig.setTransformFunctionClassName("Transform");
561578
sinkConfig.setTransformFunctionConfig("{\"key\": \"value\"}");
579+
sinkConfig.setLogTopic("log-topic");
562580
return sinkConfig;
563581
}
564582

pulsar-functions/utils/src/test/java/org/apache/pulsar/functions/utils/SourceConfigUtilsTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,22 @@ public void testMergeDifferentProducerConfig() {
309309
);
310310
}
311311

312+
@Test
313+
public void testMergeDifferentLogTopic() {
314+
SourceConfig sourceConfig = createSourceConfig();
315+
SourceConfig newSourceConfig = createUpdatedSourceConfig("logTopic", "Different");
316+
SourceConfig mergedConfig = SourceConfigUtils.validateUpdate(sourceConfig, newSourceConfig);
317+
assertEquals(
318+
mergedConfig.getLogTopic(),
319+
"Different"
320+
);
321+
mergedConfig.setLogTopic(sourceConfig.getLogTopic());
322+
assertEquals(
323+
new Gson().toJson(sourceConfig),
324+
new Gson().toJson(mergedConfig)
325+
);
326+
}
327+
312328
@Test
313329
public void testValidateConfig() {
314330
SourceConfig sourceConfig = createSourceConfig();
@@ -399,6 +415,7 @@ private SourceConfig createSourceConfig() {
399415
sourceConfig.setProducerConfig(producerConfig);
400416

401417
sourceConfig.setConfigs(configs);
418+
sourceConfig.setLogTopic("log-topic");
402419
return sourceConfig;
403420
}
404421

0 commit comments

Comments
 (0)