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

这篇具有很好参考价值的文章主要介绍了可观测性-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

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

关于Sql日志记录和慢日志

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

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

注意:

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

  • 慢日志可以考虑通过事件类型,发送事件用于告警,关联更多的上下文,在ORM层去做,例如在Mybatis的拦截器做。文章来源地址https://www.toymoban.com/news/detail-460866.html

到了这里,关于可观测性-Metrics-数据库连接池HikariCP监控的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot整合(五)HikariCP、Druid数据库连接池—多数据源配置

    在项目中,数据库连接池基本是必不可少的组件。在目前数据库连接池的选型中,主要是 Druid ,为 监控 而生的数据库连接池。 HikariCP ,号称 性能 最好的数据库连接池。 在Spring Boot 2.X 版本,默认采用 HikariCP 连接池。而阿里大规模采用 Druid 。下面介绍在SpringBoot中使用Hika

    2024年02月17日
    浏览(79)
  • Spring Boot 如何整合高性能数据库连接池HikariCP

    当使用Spring Boot整合HikariCP时,您可以更加详细地配置和优化连接池以获得更好的性能。以下是更详细的步骤和示例代码: 步骤1:创建Spring Boot项目 您可以使用Spring Initializr(https://start.spring.io/)创建一个新的Spring Boot项目。确保选择适合您的需求的依赖项,例如Web和Spring D

    2024年02月05日
    浏览(78)
  • Spring Boot实战 | 如何整合高性能数据库连接池HikariCP

    专栏集锦,大佬们可以收藏以备不时之需 Spring Cloud实战专栏:https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏:https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏:https://blog.csdn.net/superdangbo/category_9271502.html tensorflow专栏:https://blog.csdn.net/superdangbo/category_869

    2024年02月08日
    浏览(55)
  • Oracle 开发篇+Java通过HiKariCP访问Oracle数据库

    标签:HikariCP、数据库连接池、JDBC连接池、 释义:HikariCP 是一个高性能的 JDBC 连接池组件,号称性能最好的后起之秀,是一个基于BoneCP做了不少的改进和优化的高性能JDBC连接池。 ★ Java代码 ※ 如果您觉得文章写的还不错, 别忘了在文末给作者点个赞哦 ~

    2024年02月13日
    浏览(59)
  • HikariCP连接池设置和监控

    SpringBoot 项目默认自动使用 HikariCP, 最近为了进行数据库session控制, 特意调小了缺省的 poolSize, 原本以为会自动生效, 经过压测发现还是使用默认的 poolSize. 原来的代码 DataSource 对象使用的是 Spring DataSource builder创建的, 需要修改为 HikariDataSource 来创建. 我直接使用 https://blog.csd

    2024年02月08日
    浏览(34)
  • 使用 Feature Flags 与可观测工具实现数据库灰度迁移

    很多企业会遇到数据库升级、或数据库迁移的情况,尤其是在自建数据库服务向云数据库服务、自建机房向云机房、旧数据库向新数据库迁移等场景。 然而,我们需要在整个移植过程中保证其稳定性、避免数据遗失、服务宕机等情况,最常见的移植方法之一就是 数据库双写

    2024年02月12日
    浏览(42)
  • 数据库监控与调优【七】—— MySQL数据库诊断命令

    TIPS 本文基于MySQL 8.0,理论支持MySQL 5.0及更高版本。 本文整理了常用的MySQL诊断命令,可以帮助我们了解数据库的运行情况。 作用: SHOW [FULL] PROCESSLIST用于查看当前正在运行的线程。如果执行此命令的用户拥有 PROCESS 权限,则可看到所有线程;否则只能看到自己的线程(即与

    2024年02月11日
    浏览(51)
  • 快速监控 Oracle 数据库

    Oracle 数据库在行业内应用广泛,通常存放的非常重要的数据,监控是必不可少的,本文使用 Cprobe 采集 Oracle 监控数据,极致简单,分享给大家。 安装配置 Oracle 简单起见,我使用 Docker 启动 Oracle,命令如下: 如上命令启动之后,Oracle 的监听端口是 1521,用户名/密码是 syst

    2024年01月20日
    浏览(52)
  • Zabbix监控MySQL数据库实战

    zabbix监控mysql的方式 只是安装agent 启用模板监控 启用自定义脚本的模板监控 使用zabbix模版及结合shell脚本监控mysql 创建mysql的zabbix授权用户 mysql grant all PRIVILEGES on *.* to zabbix@\\\'localhost\\\' identified by \\\'zabbix\\\';  ###创建一个有权限的访问用户lqb密码设置zabbix Query OK, 0 rows affected (0.04 s

    2024年02月12日
    浏览(35)
  • 数据库字段变更监控平台设计开发

      在开发过程中,在值班解决客服问题时,在分析定位别人写的业务代码问题时, 重点是不是自己写的代码 ,只看到了数据库中落库最终数据,并不知道业务逻辑问题发生时数据库表中当时数据情况?如果能知道当时数据情况,就能更准,更快的定位到问题,可能大家对

    2024年02月15日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包