可观测性-Metrics-数据库连接池HikariCP监控

非SpringBoot环境

HikariCP其内部提供了setMetricRegistry()方法,让我们可以注入MetricRegistry来实现对连接池指标的收集。这样我们可以较为方便的监控连接池的运行状态。

添加依赖

    <dependency>
      <groupId>com.zaxxer</groupId>
      <artifactId>HikariCP</artifactId>
      <version>4.0.3</version>
    </dependency>
    <dependency>
       <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
      <groupId>io.micrometer</groupId>
      <artifactId>micrometer-core</artifactId>
      <version>1.9.4</version>
    </dependency>

示例

		// hikari配置       
		HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setJdbcUrl("jdbc:mysql://localhost:3306/laker?serverTimezone=GMT%2B8&characterEncoding=utf8&useSSL=false");
        hikariConfig.setUsername("root");
        hikariConfig.setPassword("123456");
        hikariConfig.setDriverClassName("com.mysql.jdbc.Driver");
        hikariConfig.setAutoCommit(true);
        hikariConfig.setPoolName("laker_poolName");
        hikariConfig.setMaximumPoolSize(10);
        hikariConfig.setMinimumIdle(3);
        // 创建HikariDataSource
        HikariDataSource dataSource = new HikariDataSource(hikariConfig);
        // 设置metric注册器 每10秒打印一次
        LoggingMeterRegistry loggingMeterRegistry = new LoggingMeterRegistry(new LoggingRegistryConfig() {
            @Override
            public String get(String key) {
                return null;
            }
            @Override
            public Duration step() {
                return Duration.ofSeconds(10);
            }
        }, Clock.SYSTEM);
        dataSource.setMetricRegistry(loggingMeterRegistry);

        // 测试 持有3秒连接后才释放
        Connection connection = dataSource.getConnection();
        TimeUnit.SECONDS.sleep(3);
        connection.close();

结果:

hikaricp.connections{pool=laker_poolName} value=4
hikaricp.connections.active{pool=laker_poolName} value=1
hikaricp.connections.idle{pool=laker_poolName} value=3
hikaricp.connections.max{pool=laker_poolName} value=10
hikaricp.connections.min{pool=laker_poolName} value=3
hikaricp.connections.pending{pool=laker_poolName} value=0
hikaricp.connections.acquire{pool=laker_poolName} throughput=0.1/s mean=0.0000581s max=0.0000581s
hikaricp.connections.creation{pool=laker_poolName} throughput=0.3/s mean=0.006666666s max=0.007s
hikaricp.connections.usage{pool=laker_poolName} throughput=0.1/s mean=3.017s max=3.017s

指标详解

对应的指标在com.zaxxer.hikari.metrics.PoolStats中。

指标详解
hikaricp.connections当前总连接数,包括空闲的连接和使用中的连接。(4 = 3 + 1)对应上面日志;
Connections = activeConnection + idleConnections,会随着连接使用情况变化。
hikaricp.connections.active正在使用中活跃连接数 (1),会随着连接使用情况变化。
hikaricp.connections.idle空闲连接数 (3) ,会随着连接使用情况变化。
hikaricp.connections.max最大连接数 (10),初始配置。
hikaricp.connections.min最小连接数 (3),初始配置。
hikaricp.connections.pending正在等待连接的线程数量(0)。重点一般来说,这里应该都是0,如果存在这个数据并且时间较长要触发告警,视情况加大最大连接数
hikaricp.connections.acquire获取每个连接需要时间,单位为ns
hikaricp.connections.creation连接创建时间,单位为ms
hikaricp.connections.timeout创建连接超时次数。
hikaricp.connections.usage连接从池中取出到返回的时间,单位为ms。即连接被业务占用时间(3.017s)。重点:这个时间长的话,
可能是慢SQL或者长事务导致连接被占用问题

Spring Boot环境

手动

还是添加上面的依赖组件。

@Configuration
public class DatasourceConfiguration {
    @Bean
    public DataSource primaryDataSource(MetricRegistry metricRegistry) {
		HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setJdbcUrl("jdbc:mysql://localhost:3306/laker?serverTimezone=GMT%2B8&characterEncoding=utf8&useSSL=false");
        hikariConfig.setUsername("root");
        hikariConfig.setPassword("123456");
        hikariConfig.setDriverClassName("com.mysql.jdbc.Driver");
        hikariConfig.setAutoCommit(true);
        hikariConfig.setPoolName("laker_poolName");
        hikariConfig.setMaximumPoolSize(10);
        hikariConfig.setMinimumIdle(3);
        // 创建HikariDataSource
        HikariDataSource dataSource = new HikariDataSource(hikariConfig);
        dataSource.setMetricRegistry(loggingMeterRegistry);
        return dataSource;
    }
}

自动

只需要添加如下依赖,内部会自动加上HikariCPmicrometer-core依赖,并自动配置注册器。

  <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-actuator</artifactId>
  </dependency>

原理,我们可以看这个类DataSourcePoolMetricsAutoConfiguration.java

关于Sql日志记录和慢日志

可以看这个Issue:https://github.com/brettwooldridge/HikariCP/issues/57#issuecomment-354647631

作者是不愿意在连接池层去做这种监控的事情的,应为会大大降低其性能。

注意:

  • Sql记录功能会导致性能下降,所以建议仅能用于开发、测试环境。

  • 慢日志可以考虑通过事件类型,发送事件用于告警,关联更多的上下文,在ORM层去做,例如在Mybatis的拦截器做。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
kube-state-metrics是一个开源的Kubernetes组件,用于将Kubernetes资源信息转换为指标(metrics)并暴露给Prometheus。YAML是Kubernetes中常用的声明式配置文件格式。kube-state-metrics也需要通过YAML配置文件进行部署和管理。下面来详细介绍kube-state-metrics YAML的几个方面。 首先,kube-state-metrics YAML需要配置Kubernetes API Server的地址、证书等信息,以便通过API Server获取资源信息。其次,kube-state-metrics需要指定需要收集的资源类型,比如Pod、Deployment等。这些资源类型通过Kubernetes API定义,kube-state-metrics会通过API Server获取这些资源的详细信息,并将其转换为指标。此外,kube-state-metrics YAML还需要指定需要暴露给Prometheus的指标端口等信息,以便Prometheus可以通过这些指标监控Kubernetes集群各种资源的使用情况。 在kube-state-metrics的配置中,还需要指定各个资源指标的定义方式,例如当Pod或Deployment出现异常时,kube-state-metrics需要如何定义这些指标?以及在Prometheus中如何查询这些指标。因此,可以在kube-state-metrics的YAML文件中定义各个指标的名称,以及在Prometheus中的查询方式。这里的细节需要参考kube-state-metrics的文档。 总之,kube-state-metrics YAML是配置kube-state-metrics组件的一种方法,通过对该文件进行配置,可以定制化kube-state-metrics组件的行为,并将它整合到Kubernetes集群中。而kube-state-metrics的指标可以用于Kubernetes集群的监控和自动化管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lakernote

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值