我是靠谱客的博主 正直美女,最近开发中收集的这篇文章主要介绍Springboot整合Prometheus-自动配置指标依赖SpringBootActuator默认开放指标,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

指标-自动配置

  • 依赖
  • SpringBootActuator默认开放指标
    • JVM 指标
    • 系统指标
    • 应用程序启动指标
    • 记录器指标
    • 任务执行和调度指标
    • Spring MVC 指标
    • Spring WebFlux 指标
    • Jersey Server 指标
    • HTTP Client 指标
    • Tomcat 指标
    • 缓存指标
    • Spring GraphQL 指标
    • 数据源指标
    • Hibernate 指标
    • Spring Data Repository 指标
    • RabbitMQ 指标
    • Spring Integration 指标
    • MongoDB 指标
      • MongoDB 命令指标
      • MongoDB 连接池指标
    • Jetty 指标
    • Redis 指标

依赖

// actuator依赖提供指标
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
  <version>2.6.3</version>
</dependency>

// 将指标转换成prometheus可使用的格式
<dependency>
  <groupId>io.micrometer</groupId>
  <artifactId>micrometer-registry-prometheus</artifactId>
  <version>1.8.2</version>
</dependency>

SpringBootActuator默认开放指标

1、以下指标名称都为prometheus接收的指标名称
2、http://ip:port/actuator/prometheus 此为prometheus默认开放接口,输出prometheus格式
3、http://localhost:11130/actuator/metrics 此为actuator的指标接口,输出当前开放的指标

JVM 指标

自动配置通过使用核心 Micrometer 类启用 JVM Metrics。JVM 指标以jvm.计量名称发布。

提供了以下 JVM 指标:

  • 各种内存和缓冲池细节( jvm_buffer开头 )
  • 垃圾回收相关统计( jvm_gc开头 )
  • 线程利用率( jvm_threads开头 )
  • 加载和卸载的类数( jvm_classes开头 )

系统指标

自动配置通过使用核心 Micrometer 类启用系统指标。

提供了以下系统指标:

  • CPU 指标( system_cpu开头 )
  • 文件描述符指标
  • 正常运行时间指标( process开头 )
  • 可用磁盘空间( disk_开头 )

应用程序启动指标

自动配置公开应用程序启动时间指标:

  • 启动应用程序所用的时间 ( application_started_time_seconds )
  • 应用程序准备好为请求提供服务所需的时间 ( application_ready_time_seconds )

记录器指标

自动配置公开 LogbackLog4J2 启用事件指标。

  • log4j2_events开头
  • logback_events开头

任务执行和调度指标

自动配置识别公开 ThreadPoolTaskExecutorThreadPoolTaskScheduler beans执行。指标包含执行者的名称标记,该名称来自 bean 名称。

  • executor开头

Spring MVC 指标

自动配置启用对 Spring MVC 控制器和功能处理程序处理的所有请求的检测。

  • 请求指标( http_server_requests开头)

可以通过management.metrics.web.server.request.metric-name属性来自定义指标开头。

@Timed注解可以标注在@Controller类和@RequestMapping方法上,如果你不想记录所有 Spring MVC 请求的指标,则可以设置management.metrics.web.server.request.autotime.enabled=false然后单独使用@Timed标注需要开放的请求

默认情况下,与 Spring MVC 相关的指标标记有以下信息:

标签描述
exception处理请求时引发的任何异常的简单类名。
method请求的方法(例如,GET或POST)
outcome请求的结果,基于响应的状态代码。1xx 是信息性状态码 2xx 是成功状态码 3xx 是重定向状态码 4xx 是客户端异常状态码 5xx 是服务端异常状态码
status响应的 HTTP 状态代码(例如,200或500)
uri参数替换之前的请求 URI 模板(例如,/api/person/{id})

如果要添加默认标签,请提供一个或多个@Bean实现WebMvcTagsContributor
如果要替换默认标签,请提供一个@Bean实现WebMvcTagsProvider
如果要处理所有请求,可以自定义过滤器,添加一个@Bean实现FilterRegistrationBean<WebMvcMetricsFilter>例如将4xx和5xx异常类型归为同一类

Spring WebFlux 指标

自动配置启用对 Spring WebFlux 控制器和功能处理程序处理的所有请求的检测。

  • 请求指标( http_server_requests开头)

可以通过management.metrics.web.server.request.metric-name属性来自定义指标开头。

@Timed注解可以标注在@Controller类和@RequestMapping方法上,如果你不想记录所有 Spring WebFlux 请求的指标,则可以设置management.metrics.web.server.request.autotime.enabled=false然后单独使用@Timed标注需要开放的请求

默认情况下,与 Spring WebFlux 相关的指标标记有以下信息:

标签描述
exception处理请求时引发的任何异常的简单类名。
method请求的方法(例如,GET或POST)
outcome请求的结果,基于响应的状态代码。1xx 是信息性状态码 2xx 是成功状态码 3xx 是重定向状态码 4xx 是客户端异常状态码 5xx 是服务端异常状态码
status响应的 HTTP 状态代码(例如,200或500)
uri参数替换之前的请求 URI 模板(例如,/api/person/{id})

如果要添加默认标签,请提供一个或多个@Bean实现WebFluxTagsContributor
如果要替换默认标签,请提供一个@Bean实现WebFluxTagsProvider

Jersey Server 指标

同 Spring MVC 和 Spring WebFlux类似

HTTP Client 指标

1、要让Spring Boot Actuator 管理RestTemplateWebClient指标。必须使用自动配置的构建器构建实例,并注册为bean。(此方式需要将RestTemplate注册为Bean)

  • RestTemplateBuilder可构建RestTemplate
  • WebClient.Builder可构建WebClient
   @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
        return builder.build();
    }

2、也可以构建时手动添加指标检测的定制器,即MetricsRestTemplateCustomizerMetricsWebClientCustomizer。(此方式不需要将RestTemplate注册为Bean,并能对RestTemplate做定制化)

@Autowired
private MetricsRestTemplateCustomizer metricsRestTemplateCustomizer;
 
RestTemplate restTemplate = new RestTemplateBuilder()
                .additionalCustomizers(metricsRestTemplateCustomizer)
                .build();
  • 请求指标(http_client_requests开头)

可以通过设置management.metrics.web.client.request.metric-name属性来自定义名称

默认情况下,与HTTP Client相关的指标标记有以下信息:

标签描述
clientNameURI 的主要部分
method请求的方法(例如,GET或POST)
outcome请求的结果,基于响应的状态代码。1xx 是信息性状态码 2xx 是成功状态码 3xx 是重定向状态码 4xx 是客户端异常状态码 5xx 是服务端异常状态码
status响应的 HTTP 状态代码(例如,200或500)或IO异常(当存在IO情况时)。否则它是客户端异常。
uri参数替换之前的请求 URI 模板(例如,/api/person/{id})

如果要自定义标签,需根据使用的客户端,提供一个@Bean实现RestTemplateExchangeTagsProvider 或者WebClientExchangeTagsProvider。底层使用RestTemplateExchangeTagsWebClientExchangeTags的静态函数设置标签内容。

示例:

@Autowired
private MeterRegistry meterRegistry;

// 此时会覆盖原来的标签
RestTemplateExchangeTagsProvider restTemplateExchangeTagsProvider = new RestTemplateExchangeTagsProvider() {
            @Override
            public Iterable<Tag> getTags(String urlTemplate, HttpRequest request, ClientHttpResponse response) {
                // 此为默认实现
//                Tag uriTag = (StringUtils.hasText(urlTemplate) ? RestTemplateExchangeTags.uri(urlTemplate)
//                        : RestTemplateExchangeTags.uri(request));
//                return Arrays.asList(RestTemplateExchangeTags.method(request), uriTag,
//                        RestTemplateExchangeTags.status(response), RestTemplateExchangeTags.clientName(request),
//                        RestTemplateExchangeTags.outcome(response));
                
                // 指标key不能为中文。如果为中文,会转换成下划线。
                return Arrays.asList(Tag.of("tag1", "指标值"), Tag.of("tag2", "指标值"));
            }
        };

        RestTemplate restTemplate = new RestTemplateBuilder()
                .additionalCustomizers(
                        new MetricsRestTemplateCustomizer( // 自定义指标模板
                        meterRegistry, // 指标注册器
                        restTemplateExchangeTagsProvider, // 自定义标签
                        "http_client_requests12", // 自定义指标名
                        new AutoTimeProperties())) // Timer指标是否开启,null为不开启。此时须开启,因为Http自动配置的指标都为Timer统计的,后续会讲到。
                .build();

结果:

在这里插入图片描述

Tomcat 指标

自动配置仅在启用时检测Tomcat 的MBeanRegistry是否启用。默认情况下,MBeanRegistry是禁用,但您可以通过设置server.tomcat.mbeanregistry.enabled=true启用它。

  • 指标( tomcat开头 )

缓存指标

自动配置缓存在启动时检测所有可用实例的。

  • 指标(cache开头)

缓存的基本指标进行了标准化。此外,还提供了特定缓存的指标。
支持以下缓存库:

  • Cache2k
  • Caffeine
  • EhCache 2
  • Hazelcast
  • Any compliant JCache (JSR-107) implementation(所有基于JCache 规则实现的)
  • Redis

指标名称由缓存的名称和CacheManager从 bean 名称派生的名称进行生成。

只有在启动时配置的缓存才会绑定到注册表。

对于未在启动时定义的缓存,例如动态创建的缓存或在启动阶段后以编程方式创建的缓存,需要显式注册。可以使用 CacheMetricsRegistrar 这个Bean进行便捷注册。

示例:

 	@Bean  //给容器注册一个Bean,返回缓存管理器,这里有redisTemplate容器,所以会自动注入
    public CacheManager MyRedisCacheConfig(RedisTemplate redisTemplate) {
        //1.创建RedisCacheWriter
        /**
         * 非锁方式:nonLockingRedisCacheWriter(RedisConnectionFactory connectionFactory);
         * 有锁方式:lockingRedisCacheWriter(RedisConnectionFactory connectionFactory);
         */
        RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(Objects.requireNonNull(redisTemplate.getConnectionFactory()));
        //2.创建Jackson对象并传入需要序列化的对象
        Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
        //3.传入 Jackson对象 并获取 RedisSerializationContext对象
        RedisSerializationContext<Object, Object> serializationContext = RedisSerializationContext.fromSerializer(serializer);
        //4.配置RedisCacheConfiguration
        /**
         * RedisCacheConfiguration.defaultCacheConfig()
         * 设置 value 的序列化 serializeValuesWit(SerializationPari<?> valueSerializationPari)
         * 设置 key 的序列化 serializeKeysWith(SerializationPari valueSerializationPari)
         */
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(serializationContext.getValueSerializationPair());
        //5.创建RedisCacheManager(RedisCacheWriter redisCacheWriter, RedisCacheConfiguration redisCacheConfiguration)对象并返回
        return new RedisCacheManager(redisCacheWriter, redisCacheConfiguration);
    }

    @Bean
    public String test(CacheManager cacheManager){
        cacheManager.getCache("test").put("key","value");
        return   cacheManager.getCache("test").get("key").get().toString();
    }

结果:
本人自测无效场景:

  1. 运行时添加的缓存
  2. 生成Bean时使用RedisTemplate进行添加
  3. @PostConstruct初始化时使用CacheManager添加
  4. 未注册CacheManager Bean时

初步判断是该功能更多的对@CacheConfig使用的缓存进行自动添加指标

在这里插入图片描述

Spring GraphQL 指标

自动配置启用 GraphQL 查询的检测。

本人暂未测试使用。可查看官网描述

数据源指标

自动配置启用数据源检测。

  • 当前活动连接数( jdbc_connections_active )
  • 当前空闲连接数( jdbc_connections_idle )
  • 最大的空闲的连接数 ( jdbc_connections_min )
  • 最小的空闲的连接数( jdbc_connections_max )

默认情况下,Spring Boot 为所有支持连接的数据源提供默认指标。如果不适配您喜欢的数据源,可通过添加DataSourcePoolMetadataProvider Bean。
此外,Hikari 的指标以hikaricp前缀公开。每个指标都由连接池的名称标记(您可以使用 spring.datasource.name 控制它)。

示例:默认支持

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mysql
    password: root
    username: root
    driver-class-name: com.mysql.cj.jdbc.Driver

示例(Druid):默认不支持

spring:
  datasource:
    druid:
      url: jdbc:mysql://localhost:3306/mysql
      password: root
      username: root
      driver-class-name: com.mysql.cj.jdbc.Driver
      max-wait: 60000
      max-active: 100
      initial-size: 10

调整方式:注册DataSourcePoolMetadataProvider Bean

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.jdbc.DataSourceUnwrapper;
import org.springframework.boot.jdbc.metadata.DataSourcePoolMetadataProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * <p>
 *
 * </p>
 *
 * @author LuoWenFeng
 */
@Configuration
public class DataSourceConfig {

    @Configuration(
            proxyBeanMethods = false
    )
    @ConditionalOnClass({DruidDataSource.class})
    static class DruidDataSourceMetadataProviderConfiguration {
        DruidDataSourceMetadataProviderConfiguration() {
        }

        @Bean
        DataSourcePoolMetadataProvider DruidDataSourceMetadataProvider() {
            return (dataSource) -> {
                DruidDataSource dbcpDataSource = DataSourceUnwrapper.unwrap(dataSource, DruidDataSource.class);
                return dbcpDataSource != null ? new DruidDataSourcePoolMetadata(dbcpDataSource) : null;
            };
        }
    }
}
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.jdbc.metadata.AbstractDataSourcePoolMetadata;

/**
 * <p>
 *
 * </p>
 *
 * @author LuoWenFeng
 */
public class DruidDataSourcePoolMetadata extends AbstractDataSourcePoolMetadata<DruidDataSource> {
    /**
     * Create an instance with the data source to use.
     *
     * @param dataSource the data source
     */
    protected DruidDataSourcePoolMetadata(DruidDataSource dataSource) {
        super(dataSource);
    }

    @Override
    public Integer getActive() {
        try {
            return getDataSource().getActiveCount();
        } catch (Exception ex) {
            return null;
        }
    }

    @Override
    public Integer getIdle() {
        try {
            return (int) getDataSource().getConnectCount();
        } catch (Exception ex) {
            return null;
        }
    }

    @Override
    public Integer getMax() {
        return getDataSource().getMaxIdle();
    }

    @Override
    public Integer getMin() {
        return getDataSource().getMinIdle();
    }

    @Override
    public String getValidationQuery() {
        return getDataSource().getValidationQuery();
    }

    @Override
    public Boolean getDefaultAutoCommit() {
        return getDataSource().isDefaultAutoCommit();
    }
}

Hibernate 指标

本人暂未测试使用。可查看官网描述

Spring Data Repository 指标

自动配置启用 Spring Data Repository 方法调用的检测。

  • 指标(spring_data_repository_invocations开头 )

可以通过设置management.metrics.data.repository.metric-name属性来自定义名称。

@Timed注解可以标注在@Repository类和方法上,如果你不想记录所有 Repository 调用的指标,则可以设置management.metrics.data.repository.autotime.enabled=false然后单独使用@Timed标注需要开放的请求

默认情况下,与存储库调用相关的指标标记有以下信息:

标签描述
repositoryRepository的简单类名。
methodRepository被调用的方法的名称。
state结果状态(SUCCESS、ERROR、CANCELED或RUNNING)。
exception从调用中引发的任何异常的简单类名。

如果要替换默认标签,请提供一个@Bean实现RepositoryTagsProvider

RabbitMQ 指标

  • 指标(rabbitmq开头 )

Spring Integration 指标

  • 指标(spring_integration开头 )
    本人暂未测试使用。可查看官网描述

MongoDB 指标

MongoDB 命令指标

自动配置会注册MongoMetricsCommandListener到自动配置的MongoClient

  • 指标(mongodb_driver_commands开头 )

默认情况下,每个指标都有以下标记信息:

标签描述
command发出的命令的名称。
cluster_id命令发送到的集群的标识符。
server_address命令发送到的服务器的地址。
status命令的结果(SUCCESS或FAILED)。

如果要替换默认标签,请提供一个@Bean实现MongoCommandTagsProvider
如果要禁用自动配置的命令指标,可以设置management.metrics.mongo.command.enabled=false

MongoDB 连接池指标

自动配置会注册MongoMetricsConnectionPoolListener到自动配置的MongoClient

  • 当前连接池的大小,包括空闲和活跃的成员(mongodb_driver_pool_size)
  • 当前活跃的连接数(mongodb_driver_pool_checkedout)
  • 当前连接池等待队列的大小(mongodb_driver_pool_waitqueuesize)

默认情况下,每个指标都有以下标记信息:

标签描述
cluster_id连接池对应的集群的标识。
server_address连接池对应的服务器地址。

如果要替换默认标签,请提供一个@Bean实现MongoConnectionPoolTagsProvider
如果要禁用自动配置的连接池指标,可以设置management.metrics.mongo.connectionpool.enabled=false

Jetty 指标

server.ssl.enabled=rue时,Micrometer绑定JettySslHandshakeMetrics
本人暂未测试使用。可查看官网描述

Redis 指标

自动配置会注册MicrometerCommandLatencyRecorder到自动配置的LettuceConnectionFactory

最后

以上就是正直美女为你收集整理的Springboot整合Prometheus-自动配置指标依赖SpringBootActuator默认开放指标的全部内容,希望文章能够帮你解决Springboot整合Prometheus-自动配置指标依赖SpringBootActuator默认开放指标所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部