This is an automated email from the ASF dual-hosted git repository.

fpaul pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/flink.git


The following commit(s) were added to refs/heads/master by this push:
     new 0d32cbd3f4d [FLINK-27487][kafka] Only forward measurable Kafka metrics 
and ignore others
0d32cbd3f4d is described below

commit 0d32cbd3f4d4c41b0a8e54b2d2872f0a360efd0d
Author: Fabian Paul <[email protected]>
AuthorDate: Thu May 5 09:32:48 2022 +0200

    [FLINK-27487][kafka] Only forward measurable Kafka metrics and ignore others
---
 .../metrics/KafkaMetricMutableWrapper.java         |  7 +-
 .../metrics/KafkaMetricMutableWrapperTest.java     | 90 ++++++++++++++++++++++
 2 files changed, 96 insertions(+), 1 deletion(-)

diff --git 
a/flink-connectors/flink-connector-kafka/src/main/java/org/apache/flink/streaming/connectors/kafka/internals/metrics/KafkaMetricMutableWrapper.java
 
b/flink-connectors/flink-connector-kafka/src/main/java/org/apache/flink/streaming/connectors/kafka/internals/metrics/KafkaMetricMutableWrapper.java
index cb04ed24c28..b5d19ace0c2 100644
--- 
a/flink-connectors/flink-connector-kafka/src/main/java/org/apache/flink/streaming/connectors/kafka/internals/metrics/KafkaMetricMutableWrapper.java
+++ 
b/flink-connectors/flink-connector-kafka/src/main/java/org/apache/flink/streaming/connectors/kafka/internals/metrics/KafkaMetricMutableWrapper.java
@@ -34,7 +34,12 @@ public class KafkaMetricMutableWrapper implements 
Gauge<Double> {
 
     @Override
     public Double getValue() {
-        return (Double) kafkaMetric.metricValue();
+        final Object metricValue = kafkaMetric.metricValue();
+        // Previously KafkaMetric supported KafkaMetric#value that always 
returned a Double value.
+        // Since this method has been deprecated and is removed in future 
releases we have to
+        // manually check if the returned value is Double. Internally, 
KafkaMetric#value also
+        // returned 0.0 for all not "measurable" values, so we restored the 
original behavior.
+        return metricValue instanceof Double ? (Double) metricValue : 0.0;
     }
 
     public void setKafkaMetric(Metric kafkaMetric) {
diff --git 
a/flink-connectors/flink-connector-kafka/src/test/java/org/apache/flink/streaming/connectors/kafka/internals/metrics/KafkaMetricMutableWrapperTest.java
 
b/flink-connectors/flink-connector-kafka/src/test/java/org/apache/flink/streaming/connectors/kafka/internals/metrics/KafkaMetricMutableWrapperTest.java
new file mode 100644
index 00000000000..818794ef6fa
--- /dev/null
+++ 
b/flink-connectors/flink-connector-kafka/src/test/java/org/apache/flink/streaming/connectors/kafka/internals/metrics/KafkaMetricMutableWrapperTest.java
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.flink.streaming.connectors.kafka.internals.metrics;
+
+import org.apache.flink.util.TestLoggerExtension;
+
+import org.apache.kafka.clients.consumer.KafkaConsumer;
+import org.apache.kafka.clients.producer.KafkaProducer;
+import org.apache.kafka.common.serialization.ByteArrayDeserializer;
+import org.apache.kafka.common.serialization.ByteArraySerializer;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testcontainers.containers.KafkaContainer;
+import org.testcontainers.containers.Network;
+import org.testcontainers.junit.jupiter.Container;
+import org.testcontainers.junit.jupiter.Testcontainers;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Properties;
+import java.util.UUID;
+
+import static 
org.apache.flink.connector.kafka.testutils.KafkaUtil.createKafkaContainer;
+import static org.apache.flink.util.DockerImageVersions.KAFKA;
+
+@Testcontainers
+@ExtendWith(TestLoggerExtension.class)
+class KafkaMetricMutableWrapperTest {
+
+    private static final Logger LOG = 
LoggerFactory.getLogger(KafkaMetricMutableWrapperTest.class);
+    private static final String INTER_CONTAINER_KAFKA_ALIAS = "kafka";
+    private static final Network NETWORK = Network.newNetwork();
+
+    @Container
+    public static final KafkaContainer KAFKA_CONTAINER =
+            createKafkaContainer(KAFKA, LOG)
+                    .withEmbeddedZookeeper()
+                    .withNetwork(NETWORK)
+                    .withNetworkAliases(INTER_CONTAINER_KAFKA_ALIAS);
+
+    @Test
+    void testOnlyMeasurableMetricsAreRegistered() {
+        final Collection<KafkaMetricMutableWrapper> metricWrappers = new 
ArrayList<>();
+        final KafkaConsumer<?, ?> consumer = new 
KafkaConsumer<>(getKafkaClientConfiguration());
+        final KafkaProducer<?, ?> producer = new 
KafkaProducer<>(getKafkaClientConfiguration());
+        consumer.metrics()
+                .forEach(
+                        (name, metric) ->
+                                metricWrappers.add(new 
KafkaMetricMutableWrapper(metric)));
+        producer.metrics()
+                .forEach(
+                        (name, metric) ->
+                                metricWrappers.add(new 
KafkaMetricMutableWrapper(metric)));
+
+        // Ensure that all values are accessible and return valid double values
+        metricWrappers.forEach(KafkaMetricMutableWrapper::getValue);
+    }
+
+    private static Properties getKafkaClientConfiguration() {
+        final Properties standardProps = new Properties();
+        standardProps.put("bootstrap.servers", 
KAFKA_CONTAINER.getBootstrapServers());
+        standardProps.put("group.id", UUID.randomUUID().toString());
+        standardProps.put("enable.auto.commit", false);
+        standardProps.put("key.deserializer", 
ByteArrayDeserializer.class.getName());
+        standardProps.put("value.deserializer", 
ByteArrayDeserializer.class.getName());
+        standardProps.put("key.serializer", 
ByteArraySerializer.class.getName());
+        standardProps.put("value.serializer", 
ByteArraySerializer.class.getName());
+        standardProps.put("auto.offset.reset", "earliest");
+        standardProps.put("max.partition.fetch.bytes", 256);
+        return standardProps;
+    }
+}

Reply via email to