spring boot 源码解析48-MetricsEndpoint

前言

本文我们来解析MetricsEndpoint(之前没有讲述的)

解析

MetricsEndpoint继承自AbstractEndpoint.

  1. 字段,构造器如下:

    // 获得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相关的内容可以查阅之前的文章,如下:

    1. spring boot 源码解析35-CacheStatisticsProvider,CacheStatistics,CachePublicMetrics
    2. spring boot 源码解析32-PublicMetrics详解
    3. spring boot 源码解析47-Metric(RichGauge)ReaderPublicMetrics
  2. 其声明了3个方法,如下:

    1. registerPublicMetrics–> 向MetricsEndpoint进行注册.代码如下:

      public void registerPublicMetrics(PublicMetrics metrics) {
          this.publicMetrics.add(metrics);
          AnnotationAwareOrderComparator.sort(this.publicMetrics);
      }
    2. unregisterPublicMetrics–>从MetricsEndpoint注销.代码如下:

      public void unregisterPublicMetrics(PublicMetrics metrics) {
          this.publicMetrics.remove(metrics);
      }
    3. 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;
      }
      1. 遍历publicMetrics依次进行处理
      2. 依次添加PublicMetrics对应的Metric到result中
  3. 属性配置:

    由于该类声明了@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.
  4. 自动装配:

    声明在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:

    1. MetricReaderPublicMetrics–> 在PublicMetricsAutoConfiguration中进行的声明
    2. SystemPublicMetrics–> 默认装配
    3. TomcatPublicMetrics–> 加入spring-boot-starter-web之后自动装配
    4. DataSourcePublicMetrics–> 加入jdbc,orm相关的依赖后自动装配
    5. CachePublicMetrics–> 加入spring-boot-starter-cache之后自动装配
    6. MetricReaderPublicMetrics–>加入了liquibase-core的依赖后,MetricsDropwizardAutoConfiguration中自动装配
    7. MetricReaderPublicMetrics–>加入了spring-boot-starter-integration之后,IntegrationMetricsConfiguration中进行自动装配
    8. ….
    原文作者:Spring Boot
    原文地址: https://blog.csdn.net/qq_26000415/article/details/79214256
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞