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}