文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-09-20 13:47

关注

文章目录

非SpringBoot环境

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

添加依赖

    <dependency>      <groupId>com.zaxxergroupId>      <artifactId>HikariCPartifactId>      <version>4.0.3version>    dependency>    <dependency>       <groupId>mysqlgroupId>       <artifactId>mysql-connector-javaartifactId>    dependency>    <dependency>      <groupId>io.micrometergroupId>      <artifactId>micrometer-coreartifactId>      <version>1.9.4version>    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=4hikaricp.connections.active{pool=laker_poolName} value=1hikaricp.connections.idle{pool=laker_poolName} value=3hikaricp.connections.max{pool=laker_poolName} value=10hikaricp.connections.min{pool=laker_poolName} value=3hikaricp.connections.pending{pool=laker_poolName} value=0hikaricp.connections.acquire{pool=laker_poolName} throughput=0.1/s mean=0.0000581s max=0.0000581shikaricp.connections.creation{pool=laker_poolName} throughput=0.3/s mean=0.006666666s max=0.007shikaricp.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环境

手动

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

@Configurationpublic 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.bootgroupId>     <artifactId>spring-boot-starter-actuatorartifactId>  dependency>

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

关于Sql日志记录和慢日志

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

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

注意:

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

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

来源地址:https://blog.csdn.net/abu935009066/article/details/127155653

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯