From f1cbc2a36835ecfab46a071aa17cc1ce07ef833b Mon Sep 17 00:00:00 2001 From: Michael Scott Date: Mon, 25 Aug 2025 13:18:01 +0300 Subject: [PATCH] Spring ID Metric Tag (PAYINP-3419) Add the `spring.id` tag to the kafka client metrics, for created kafka producers, to avoid service startup warnings about registering meters with different tag keys on Spring Boot 3.4+. As prior versions of Spring Boot don't seem to set the tag, this change can in turn cause these same warnings on versions older than 3.4. However, given those versions are now out of OSS support, this trade off seems acceptable. This applies the same change we've made in tw-tasks and wise-kafka-producer. --- CHANGELOG.md | 6 ++++++ gradle.properties | 2 +- .../kafka/tkms/config/TkmsKafkaProducerProvider.java | 12 ++++++++---- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 241013b..aa99fa3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.36.0] - 2025-08-25 + +### Changed +- Add the `spring.id` tag to the kafka client metrics, for created kafka producers, to avoid warnings about registering meters with different tag keys + on Spring Boot 3.4+ + ## [0.35.0] - 2025-06-18 ### Changed diff --git a/gradle.properties b/gradle.properties index b621a5d..48168cb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -version=0.35.0 +version=0.36.0 diff --git a/tw-tkms-starter/src/main/java/com/transferwise/kafka/tkms/config/TkmsKafkaProducerProvider.java b/tw-tkms-starter/src/main/java/com/transferwise/kafka/tkms/config/TkmsKafkaProducerProvider.java index 7072890..d168e2d 100644 --- a/tw-tkms-starter/src/main/java/com/transferwise/kafka/tkms/config/TkmsKafkaProducerProvider.java +++ b/tw-tkms-starter/src/main/java/com/transferwise/kafka/tkms/config/TkmsKafkaProducerProvider.java @@ -3,6 +3,7 @@ import com.transferwise.common.gracefulshutdown.GracefulShutdownStrategy; import com.transferwise.kafka.tkms.api.TkmsShardPartition; import com.transferwise.kafka.tkms.config.TkmsProperties.ShardProperties; +import io.micrometer.core.instrument.ImmutableTag; import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.binder.kafka.KafkaClientMetrics; import java.time.Duration; @@ -66,9 +67,10 @@ public Producer getKafkaProducer(TkmsShardPartition shardPartiti configs.put(ProducerConfig.MAX_BLOCK_MS_CONFIG, "5000"); configs.put(ProducerConfig.REQUEST_TIMEOUT_MS_CONFIG, "5000"); configs.put(ProducerConfig.DELIVERY_TIMEOUT_MS_CONFIG, "10000"); - configs.put(ProducerConfig.CLIENT_ID_CONFIG, - "tw-tkms-" + shardPartition.getShard() + "-" + shardPartition.getPartition() + "-" + useCase.name().toLowerCase() - + "-" + sequence.incrementAndGet()); + + final var clientId = "tw-tkms-" + shardPartition.getShard() + "-" + shardPartition.getPartition() + "-" + useCase.name().toLowerCase() + + "-" + sequence.incrementAndGet(); + configs.put(ProducerConfig.CLIENT_ID_CONFIG, clientId); if (useCase == UseCase.PROXY) { // We use large lingering time, because we are calling the `.flush()` anyway. @@ -92,7 +94,9 @@ public Producer getKafkaProducer(TkmsShardPartition shardPartiti } final var producer = getKafkaProducer(configs); - final var kafkaClientMetrics = new KafkaClientMetrics(producer); + // Spring id is added to be compatible with Spring Boot Actuator's Kafka metrics, which from 3.4 onwards include the spring.id tag. Without + // warnings may be generated on service startup, about registering meters with different sets of tag keys + final var kafkaClientMetrics = new KafkaClientMetrics(producer, List.of(new ImmutableTag("spring.id", clientId))); kafkaClientMetrics.bindTo(meterRegistry); return new ProducerEntry().setProducer(producer).setKafkaClientMetric(kafkaClientMetrics);