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

pnowojski pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/flink-connector-kafka.git


The following commit(s) were added to refs/heads/main by this push:
     new a88f9a55 [FLINK-39892][metrics] Fix incorrect numBytesOut reported 
delta after producer reset
a88f9a55 is described below

commit a88f9a555cfcd217ed706c057fe3f6af1bd7a29e
Author: Efrat Levitan <[email protected]>
AuthorDate: Tue Jun 9 13:38:27 2026 +0300

    [FLINK-39892][metrics] Fix incorrect numBytesOut reported delta after 
producer reset
    
    The following counters
    
    taskmanager.job.task.numBytesOutPerSecond
    taskmanager.job.task.numBytesOut
    taskmanager.job.task.operator.numBytesOutPerSecond
    taskmanager.job.task.operator.numBytesSend
    
    frequently report a value decrement for exactly once kafka sink.
    This is because KafkaWriter#initKafkaMetrics is called per producer and 
resets byteOutMetric but not latestOutgoingByteTotal
    KafkaWriter#registerMetricSync calculates the delta of 
outgoingBytesUntilNow - latestOutgoingByteTotal so every time a new producer is 
spawned, numBytesOutCounter.inc is called with a negative delta, (0 - 
latestOutgoingByteTotal of the former producer)
---
 .../flink/connector/kafka/sink/KafkaWriter.java      |  1 +
 .../connector/kafka/sink/KafkaWriterITCase.java      | 20 +++++++++++++++-----
 2 files changed, 16 insertions(+), 5 deletions(-)

diff --git 
a/flink-connector-kafka/src/main/java/org/apache/flink/connector/kafka/sink/KafkaWriter.java
 
b/flink-connector-kafka/src/main/java/org/apache/flink/connector/kafka/sink/KafkaWriter.java
index 36bd6697..42729fb6 100644
--- 
a/flink-connector-kafka/src/main/java/org/apache/flink/connector/kafka/sink/KafkaWriter.java
+++ 
b/flink-connector-kafka/src/main/java/org/apache/flink/connector/kafka/sink/KafkaWriter.java
@@ -228,6 +228,7 @@ class KafkaWriter<IN>
         byteOutMetric =
                 MetricUtil.getKafkaMetric(
                         producer.metrics(), KAFKA_PRODUCER_METRICS, 
"outgoing-byte-total");
+        latestOutgoingByteTotal = ((Number) 
byteOutMetric.metricValue()).longValue();
         if (disabledMetrics) {
             return;
         }
diff --git 
a/flink-connector-kafka/src/test/java/org/apache/flink/connector/kafka/sink/KafkaWriterITCase.java
 
b/flink-connector-kafka/src/test/java/org/apache/flink/connector/kafka/sink/KafkaWriterITCase.java
index a8ad1ceb..32608ece 100644
--- 
a/flink-connector-kafka/src/test/java/org/apache/flink/connector/kafka/sink/KafkaWriterITCase.java
+++ 
b/flink-connector-kafka/src/test/java/org/apache/flink/connector/kafka/sink/KafkaWriterITCase.java
@@ -68,14 +68,15 @@ public class KafkaWriterITCase extends KafkaWriterTestBase {
         assertKafkaMetricNotPresent(guarantee, "register.producer.metrics", 
"false");
     }
 
-    @Test
-    public void testIncreasingRecordBasedCounters() throws Exception {
+    @ParameterizedTest
+    @EnumSource(
+            value = DeliveryGuarantee.class,
+            names = {"AT_LEAST_ONCE", "EXACTLY_ONCE"})
+    public void testIncreasingRecordBasedCounters(DeliveryGuarantee guarantee) 
throws Exception {
         final SinkWriterMetricGroup metricGroup = 
createSinkWriterMetricGroup();
 
         try (final KafkaWriter<Integer> writer =
-                createWriter(
-                        DeliveryGuarantee.AT_LEAST_ONCE,
-                        new SinkInitContext(metricGroup, timeService, null))) {
+                createWriter(guarantee, new SinkInitContext(metricGroup, 
timeService, null))) {
             final Counter numBytesOut = 
metricGroup.getIOMetricGroup().getNumBytesOutCounter();
             final Counter numRecordsOut = 
metricGroup.getIOMetricGroup().getNumRecordsOutCounter();
             final Counter numRecordsOutErrors = 
metricGroup.getNumRecordsOutErrorsCounter();
@@ -107,6 +108,15 @@ public class KafkaWriterITCase extends KafkaWriterTestBase 
{
             assertThat(numRecordsOut.getCount()).isEqualTo(2);
             assertThat(numRecordsOutErrors.getCount()).isEqualTo(0);
             assertThat(numRecordsSendErrors.getCount()).isEqualTo(0);
+
+            // numBytesOut doesn't decrease between producers
+            baselineCount = numBytesOut.getCount();
+            writer.prepareCommit();
+            writer.snapshotState(1);
+            timeService.trigger();
+            assertThat(numBytesOut.getCount())
+                    .as("numBytesOut must increment across producers")
+                    .isGreaterThanOrEqualTo(baselineCount);
         }
     }
 

Reply via email to