From 54d0e0718f70fa9ab48122538b30606ea34329f6 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Wed, 9 Aug 2023 14:48:58 +0300 Subject: [PATCH] Handle kafka METRIC_REPORTER_CLASSES_CONFIG being set to a List (#9155) --- .../kafkaclients/v0_11/KafkaSingletons.java | 24 ++++++++------ .../OpenTelemetryMetricsReporterTest.java | 31 +++++++++++++++++++ 2 files changed, 45 insertions(+), 10 deletions(-) diff --git a/instrumentation/kafka/kafka-clients/kafka-clients-0.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kafkaclients/v0_11/KafkaSingletons.java b/instrumentation/kafka/kafka-clients/kafka-clients-0.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kafkaclients/v0_11/KafkaSingletons.java index 0d79da42c4..ca865d156e 100644 --- a/instrumentation/kafka/kafka-clients/kafka-clients-0.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kafkaclients/v0_11/KafkaSingletons.java +++ b/instrumentation/kafka/kafka-clients/kafka-clients-0.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kafkaclients/v0_11/KafkaSingletons.java @@ -16,8 +16,9 @@ import io.opentelemetry.instrumentation.kafka.internal.OpenTelemetrySupplier; import io.opentelemetry.javaagent.bootstrap.internal.DeprecatedConfigProperties; import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig; +import java.util.ArrayList; +import java.util.List; import java.util.Map; -import java.util.regex.Pattern; import org.apache.kafka.clients.CommonClientConfigs; import org.apache.kafka.clients.producer.RecordMetadata; @@ -34,10 +35,6 @@ public final class KafkaSingletons { InstrumentationConfig.get() .getBoolean("otel.instrumentation.kafka.metric-reporter.enabled", true); - private static final Pattern METRIC_REPORTER_PRESENT_PATTERN = - Pattern.compile( - "(^|,)" + Pattern.quote(OpenTelemetryMetricsReporter.class.getName()) + "($|,)"); - private static final Instrumenter PRODUCER_INSTRUMENTER; private static final Instrumenter CONSUMER_RECEIVE_INSTRUMENTER; private static final Instrumenter CONSUMER_PROCESS_INSTRUMENTER; @@ -72,22 +69,29 @@ public final class KafkaSingletons { return CONSUMER_PROCESS_INSTRUMENTER; } + @SuppressWarnings("unchecked") public static void enhanceConfig(Map config) { - if (!METRICS_ENABLED) { + // skip enhancing configuration when metrics are disabled or when we have already enhanced it + if (!METRICS_ENABLED + || config.get(OpenTelemetryMetricsReporter.CONFIG_KEY_OPENTELEMETRY_INSTRUMENTATION_NAME) + != null) { return; } config.merge( CommonClientConfigs.METRIC_REPORTER_CLASSES_CONFIG, OpenTelemetryMetricsReporter.class.getName(), (class1, class2) -> { - if (class1 instanceof String) { + // class1 is either a class name or List of class names or classes + if (class1 instanceof List) { + List result = new ArrayList<>(); + result.addAll((List) class1); + result.add(class2); + return result; + } else if (class1 instanceof String) { String className1 = (String) class1; if (className1.isEmpty()) { return class2; } - if (METRIC_REPORTER_PRESENT_PATTERN.matcher(className1).find()) { - return class1; - } } return class1 + "," + class2; }); diff --git a/instrumentation/kafka/kafka-clients/kafka-clients-0.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/kafkaclients/v0_11/OpenTelemetryMetricsReporterTest.java b/instrumentation/kafka/kafka-clients/kafka-clients-0.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/kafkaclients/v0_11/OpenTelemetryMetricsReporterTest.java index b8ac69dfcd..21c1d38f01 100644 --- a/instrumentation/kafka/kafka-clients/kafka-clients-0.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/kafkaclients/v0_11/OpenTelemetryMetricsReporterTest.java +++ b/instrumentation/kafka/kafka-clients/kafka-clients-0.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/kafkaclients/v0_11/OpenTelemetryMetricsReporterTest.java @@ -10,6 +10,7 @@ import static java.util.Collections.emptyMap; import io.opentelemetry.instrumentation.kafka.internal.AbstractOpenTelemetryMetricsReporterTest; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import java.util.Collections; import java.util.Map; import org.apache.kafka.clients.CommonClientConfigs; import org.apache.kafka.clients.consumer.KafkaConsumer; @@ -48,4 +49,34 @@ class OpenTelemetryMetricsReporterTest extends AbstractOpenTelemetryMetricsRepor producerConfig.put(CommonClientConfigs.METRIC_REPORTER_CLASSES_CONFIG, ""); new KafkaProducer<>(producerConfig).close(); } + + @Test + void classListMetricsReporter() { + Map consumerConfig = consumerConfig(); + consumerConfig.put( + CommonClientConfigs.METRIC_REPORTER_CLASSES_CONFIG, + Collections.singletonList(TestMetricsReporter.class)); + new KafkaConsumer<>(consumerConfig).close(); + + Map producerConfig = producerConfig(); + producerConfig.put( + CommonClientConfigs.METRIC_REPORTER_CLASSES_CONFIG, + Collections.singletonList(TestMetricsReporter.class)); + new KafkaProducer<>(producerConfig).close(); + } + + @Test + void stringListMetricsReporter() { + Map consumerConfig = consumerConfig(); + consumerConfig.put( + CommonClientConfigs.METRIC_REPORTER_CLASSES_CONFIG, + Collections.singletonList(TestMetricsReporter.class.getName())); + new KafkaConsumer<>(consumerConfig).close(); + + Map producerConfig = producerConfig(); + producerConfig.put( + CommonClientConfigs.METRIC_REPORTER_CLASSES_CONFIG, + Collections.singletonList(TestMetricsReporter.class.getName())); + new KafkaProducer<>(producerConfig).close(); + } }