当前位置: 代码网 > it编程>游戏开发>ar > 可观测性-Metrics-数据库连接池HikariCP监控教程

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

2025年03月28日 ar 我要评论
非springboot环境hikaricp其内部提供了setmetricregistry()方法,让我们可以注入metricregistry来实现对连接池指标的收集。这样我们可以较为方便的监控连接池的

非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的拦截器做。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com