io.micronaut.configuration.kafka.metrics.AbstractKafkaMetricsReporter Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of micronaut-kafka Show documentation
Show all versions of micronaut-kafka Show documentation
Integration between Micronaut and Kafka Messaging
/*
* Copyright 2017-2020 original authors
*
* Licensed 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
*
* https://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 io.micronaut.configuration.kafka.metrics;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Tag;
import io.micrometer.core.instrument.binder.MeterBinder;
import io.micrometer.core.lang.NonNull;
import io.micronaut.configuration.kafka.metrics.builder.KafkaMetricMeterTypeBuilder;
import io.micronaut.core.annotation.Internal;
import jakarta.annotation.PreDestroy;
import org.apache.kafka.common.MetricName;
import org.apache.kafka.common.metrics.KafkaMetric;
import org.apache.kafka.common.metrics.MetricsReporter;
import java.io.Closeable;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.function.Function;
/**
* A {@link MetricsReporter} that binds metrics to micrometer.
*/
@Internal
public abstract class AbstractKafkaMetricsReporter implements MetricsReporter, MeterBinder, Closeable {
public static final String CLIENT_ID_TAG = "client-id";
public static final String TOPIC_TAG = "topic";
public static final String NODE_ID_TAG = "node-id";
private final Collection meterRegistries = new ConcurrentLinkedQueue<>();
private List metrics;
@Override
public void bindTo(@NonNull MeterRegistry registry) {
if (!meterRegistries.contains(registry)) {
meterRegistries.add(registry);
}
}
@Override
public void init(List metrics) {
this.metrics = metrics;
for (MeterRegistry meterRegistry : meterRegistries) {
for (KafkaMetric metric : metrics) {
registerMetric(meterRegistry, metric);
}
}
}
@Override
public void metricChange(KafkaMetric metric) {
for (MeterRegistry meterRegistry : meterRegistries) {
registerMetric(meterRegistry, metric);
}
}
@Override
public void metricRemoval(KafkaMetric metric) {
// no-op (Micrometer doesn't support removal)
}
@Override
public void configure(Map configs) {
Object meterRegistry = configs.get("meter.registry");
if (meterRegistry != null) {
meterRegistries.add((MeterRegistry) meterRegistry);
}
}
@PreDestroy
@Override
public void close() {
if (metrics != null) {
metrics.clear();
metrics = null;
}
meterRegistries.clear();
}
private void registerMetric(MeterRegistry meterRegistry, KafkaMetric metric) {
KafkaMetricMeterTypeBuilder.newBuilder()
.prefix(getMetricPrefix())
.metric(metric)
.tagFunction(getTagFunction())
.registry(meterRegistry)
.build();
}
private Function> getTagFunction() {
return metricName -> metricName
.tags()
.entrySet()
.stream()
.filter(entry -> getIncludedTags().contains(entry.getKey()))
.map(entry -> Tag.of(entry.getKey(), entry.getValue()))
.toList();
}
/**
* The tags to include in the gauge. Defaults to just the client-id.
*
* @return The tags to include
*/
protected Set getIncludedTags() {
HashSet tags = new HashSet<>();
tags.add(CLIENT_ID_TAG);
tags.add(TOPIC_TAG);
tags.add(NODE_ID_TAG);
return tags;
}
/**
* Abstract method to implement with the metric prefix for the reporter.
*
* @return prefix name
*/
protected abstract String getMetricPrefix();
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy