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}