• Springboot整合Prometheus


    依赖

    // actuator依赖提供指标
    
      org.springframework.boot
      spring-boot-starter-actuator
      2.6.3
    
    
    // 将指标转换成prometheus可使用的格式
    
      io.micrometer
      micrometer-registry-prometheus
      1.8.2
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    SpringBootActuator默认开放指标

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

    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例如将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();
        }
    
    • 1
    • 2
    • 3
    • 4

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

    @Autowired
    private MetricsRestTemplateCustomizer metricsRestTemplateCustomizer;
     
    RestTemplate restTemplate = new RestTemplateBuilder()
                    .additionalCustomizers(metricsRestTemplateCustomizer)
                    .build();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 请求指标(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 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();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    结果:

    在这里插入图片描述

    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 serializer = new Jackson2JsonRedisSerializer<>(Object.class);
            //3.传入 Jackson对象 并获取 RedisSerializationContext对象
            RedisSerializationContext 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
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

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

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    示例(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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 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;
    
    /**
     * 

    * *

    * * @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; }; } } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    import com.alibaba.druid.pool.DruidDataSource;
    import org.springframework.boot.jdbc.metadata.AbstractDataSourcePoolMetadata;
    
    /**
     * 

    * *

    * * @author LuoWenFeng */ public class DruidDataSourcePoolMetadata extends AbstractDataSourcePoolMetadata { /** * 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(); } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    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

  • 相关阅读:
    访问者模式(大话设计模式)C/C++版本
    [C++数据结构](23)哈希:位图,布隆过滤器,哈希切割
    java计算机毕业设计线上竞赛训练系统录屏源程序+mysql+系统+lw文档+远程调试
    谁是卧底线下发牌器微信小程序源码下载,强大的自定义功能
    元宇宙vr工业产品展示空间降低研发成本
    【无标题】
    python四六级英语在线考试系统django337
    人工智能中的文本分类:技术突破与实战指导
    SHELL中sed总结
    自动化实战 - 测试个人博客系统
  • 原文地址:https://blog.csdn.net/qq_41434612/article/details/126760040