前言
本文我们来解析MetricsEndpoint(之前没有讲述的)
解析
MetricsEndpoint继承自AbstractEndpoint.
字段,构造器如下:
// 获得PublicMetrics中所有类型的PublicMetrics,由构造器注入 private final List<PublicMetrics> publicMetrics; public MetricsEndpoint(PublicMetrics publicMetrics) { this(Collections.singleton(publicMetrics)); } public MetricsEndpoint(Collection<PublicMetrics> publicMetrics) { super("metrics"); Assert.notNull(publicMetrics, "PublicMetrics must not be null"); this.publicMetrics = new ArrayList<PublicMetrics>(publicMetrics); AnnotationAwareOrderComparator.sort(this.publicMetrics); }
PublicMetrics相关的内容可以查阅之前的文章,如下:
- spring boot 源码解析35-CacheStatisticsProvider,CacheStatistics,CachePublicMetrics
- spring boot 源码解析32-PublicMetrics详解
- spring boot 源码解析47-Metric(RichGauge)ReaderPublicMetrics
其声明了3个方法,如下:
registerPublicMetrics–> 向MetricsEndpoint进行注册.代码如下:
public void registerPublicMetrics(PublicMetrics metrics) { this.publicMetrics.add(metrics); AnnotationAwareOrderComparator.sort(this.publicMetrics); }
unregisterPublicMetrics–>从MetricsEndpoint注销.代码如下:
public void unregisterPublicMetrics(PublicMetrics metrics) { this.publicMetrics.remove(metrics); }
invoke,实现如下:
public Map<String, Object> invoke() { Map<String, Object> result = new LinkedHashMap<String, Object>(); // 1. 遍历publicMetrics依次进行处理, List<PublicMetrics> metrics = new ArrayList<PublicMetrics>(this.publicMetrics); for (PublicMetrics publicMetric : metrics) { try { // 2. 依次添加PublicMetrics对应的Metric到result中 for (Metric<?> metric : publicMetric.metrics()) { result.put(metric.getName(), metric.getValue()); } } catch (Exception ex) { // Could not evaluate metrics } } return result; }
- 遍历publicMetrics依次进行处理
- 依次添加PublicMetrics对应的Metric到result中
属性配置:
由于该类声明了@ConfigurationProperties(prefix = “endpoints.metrics”)注解,因此可以通过如下属性配置:
endpoints.metrics.enabled= # Enable the endpoint. endpoints.metrics.id= # Endpoint identifier. endpoints.metrics.sensitive= # Mark if the endpoint exposes sensitive information.
自动装配:
声明在EndpointAutoConfiguration中,代码如下:
@Bean @ConditionalOnMissingBean public MetricsEndpoint metricsEndpoint() { List<PublicMetrics> publicMetrics = new ArrayList<PublicMetrics>(); if (this.publicMetrics != null) { publicMetrics.addAll(this.publicMetrics); } Collections.sort(publicMetrics, AnnotationAwareOrderComparator.INSTANCE); return new MetricsEndpoint(publicMetrics); }
当BeanFactory中不存在MetricsEndpoint类型的bean时生效.
默认情况下,会持有如下几个PublicMetrics:
- MetricReaderPublicMetrics–> 在PublicMetricsAutoConfiguration中进行的声明
- SystemPublicMetrics–> 默认装配
- TomcatPublicMetrics–> 加入spring-boot-starter-web之后自动装配
- DataSourcePublicMetrics–> 加入jdbc,orm相关的依赖后自动装配
- CachePublicMetrics–> 加入spring-boot-starter-cache之后自动装配
- MetricReaderPublicMetrics–>加入了liquibase-core的依赖后,MetricsDropwizardAutoConfiguration中自动装配
- MetricReaderPublicMetrics–>加入了spring-boot-starter-integration之后,IntegrationMetricsConfiguration中进行自动装配
- ….