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.AutoConfigureAfter;
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.context.annotation.Configuration;
016import org.springframework.util.CollectionUtils;
017
018import java.util.List;
019import java.util.Map;
020import java.util.stream.Collectors;
021
022@Configuration(proxyBeanMethods = false)
023@AutoConfigureAfter(CompositeMeterRegistryAutoConfiguration.class)
024@ConditionalOnProperty(value = "okhttp.metrics.enabled", matchIfMissing = true, havingValue = "true")
025@ConditionalOnBean(MeterRegistry.class)
026@ConditionalOnClass({MeterRegistry.class, OkHttpMetricsEventListener.class, OkHttpClient.class})
027@EnableConfigurationProperties(OkHttpMetricsProperties.class)
028public class OkHttpMetricsAutoConfiguration {
029
030    @Bean
031    @ConditionalOnMissingBean
032    public OkHttpMetricsEventListener okHttpMetricsEventListener(MeterRegistry meterRegistry, OkHttpMetricsProperties properties) {
033        OkHttpMetricsEventListener.Builder builder = OkHttpMetricsEventListener
034                .builder(meterRegistry, properties.getName())
035                .includeHostTag(properties.isIncludeHostTag());
036
037        List<String> requestTagKeys = properties.getRequestTagKeys();
038        if (!CollectionUtils.isEmpty(requestTagKeys)) {
039            builder = builder.requestTagKeys(requestTagKeys);
040        }
041
042        Map<String, String> tags = properties.getTags();
043        if (!CollectionUtils.isEmpty(tags)) {
044            builder = builder.tags(getTags(tags));
045        }
046
047        return builder.build();
048    }
049
050    private List<Tag> getTags(Map<String, String> tags) {
051        return tags.entrySet()
052                .stream()
053                .map(entry -> Tag.of(entry.getKey(), entry.getValue()))
054                .collect(Collectors.toList());
055    }
056
057}