001package io.freefair.spring.okhttp.metrics;
002
003import io.micrometer.core.instrument.MeterRegistry;
004import io.micrometer.core.instrument.Tag;
005import io.micrometer.core.instrument.binder.okhttp3.OkHttpMetricsEventListener;
006import okhttp3.OkHttpClient;
007import org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration;
008import org.springframework.boot.autoconfigure.AutoConfiguration;
009import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
010import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
011import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
012import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
013import org.springframework.boot.context.properties.EnableConfigurationProperties;
014import org.springframework.context.annotation.Bean;
015import org.springframework.util.CollectionUtils;
016
017import java.util.List;
018import java.util.Map;
019import java.util.stream.Collectors;
020
021@AutoConfiguration(after = CompositeMeterRegistryAutoConfiguration.class)
022@ConditionalOnProperty(value = "okhttp.metrics.enabled", matchIfMissing = true, havingValue = "true")
023@ConditionalOnBean(MeterRegistry.class)
024@ConditionalOnClass({MeterRegistry.class, OkHttpMetricsEventListener.class, OkHttpClient.class})
025@EnableConfigurationProperties(OkHttpMetricsProperties.class)
026public class OkHttpMetricsAutoConfiguration {
027
028    @Bean
029    @ConditionalOnMissingBean
030    public OkHttpMetricsEventListener okHttpMetricsEventListener(MeterRegistry meterRegistry, OkHttpMetricsProperties properties) {
031        OkHttpMetricsEventListener.Builder builder = OkHttpMetricsEventListener
032                .builder(meterRegistry, properties.getName())
033                .includeHostTag(properties.isIncludeHostTag());
034
035        List<String> requestTagKeys = properties.getRequestTagKeys();
036        if (!CollectionUtils.isEmpty(requestTagKeys)) {
037            builder = builder.requestTagKeys(requestTagKeys);
038        }
039
040        Map<String, String> tags = properties.getTags();
041        if (!CollectionUtils.isEmpty(tags)) {
042            builder = builder.tags(getTags(tags));
043        }
044
045        return builder.build();
046    }
047
048    private List<Tag> getTags(Map<String, String> tags) {
049        return tags.entrySet()
050                .stream()
051                .map(entry -> Tag.of(entry.getKey(), entry.getValue()))
052                .collect(Collectors.toList());
053    }
054
055}