HikariCP 可观测性最佳实践

HikariCP 介绍

HikariCP 是一个高性能、轻量级的 JDBC 连接池,由 Brett Wooldridge 开发。它以"光"命名,象征快速高效。它支持多种数据库,配置简单,通过字节码优化和智能管理,实现低延迟和高并发处理。它还具备自动维护、故障恢复和监控功能。HikariCP 是 Spring Boot 2.x 的默认连接池,适用于各种规模的 Java 应用,尤其在高并发场景下表现出色。

在可观测场景中,通常会接入 APM 调用链路和数据库的监控指标, 在 APM 中我们可以看到 SQL 的执行时间,在数据库可观测中可以看到审计日志中的慢 SQL 以及数据库的一些性能指标,如连接数、cpu 、内存等。 但应用到数据库之间的的执行过程是由连接池完成的,连接池可能会出现连接数配置不合理导致 SQL 执行排队、连接池设置过大导致数据库性能瓶颈等, 因此,对连接池的可观测变得非常重要。

观测云

观测云是一款专为 IT 工程师打造的全链路可观测产品,它集成了基础设施监控、应用程序性能监控和日志管理,为整个技术栈提供实时可观察性。这款产品能够帮助工程师全面了解端到端的用户体验追踪,了解应用内函数的每一次调用,以及全面监控云时代的基础设施。此外,观测云还具备快速发现系统安全风险的能力,为数字化时代提供安全保障。

部署 DataKit

DataKit 是一个开源的、跨平台的数据收集和监控工具,由观测云开发并维护。它旨在帮助用户收集、处理和分析各种数据源,如日志、指标和事件,以便进行有效的监控和故障排查。DataKit 支持多种数据输入和输出格式,可以轻松集成到现有的监控系统中。

登录观测云控制台,在「集成」 - 「DataKit」选择对应安装方式,当前采用 Linux 主机部署 DataKit。

采集器配置

DataKit 配置

DataKit 安装完成后,可以自定义开启采集器,本集成需要开启如下两个采集器。

  • 开启 StatsD 采集器

    开启采集器

    cp /usr/local/datakit/conf.d/statsd/statsd.conf.sample /usr/local/datakit/conf.d/statsd/statsd.conf

    重启 Datakit

    datakit service -R

  • 开启链路采集

    开启采集器

    cp /usr/local/datakit/conf.d/ddtrace/ddtrace.conf.sample /usr/local/datakit/conf.d/ddtrace/ddtrace.conf

    重启 Datakit

    datakit service -R

客户端配置

以 Java Demo 应用为例,采集调用链路和 Druid 连接池指标。

Demo 项目中连接池配置如下:

复制代码
spring.datasource.url=jdbc:mysql://xx.xxx.xx.xxx:3306/test?useSSL=false&useLegacyDatetimeCode=false&allowPublicKeyRetrieval=true
spring.datasource.username=***
spring.datasource.password=*****
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=300000
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.pool-name=HikariCP
spring.datasource.hikari.register-mbeans=true

接入 APM ,配置采集 jmx ,应用启动增加如下参数,启动命令如下:

复制代码
java \
-javaagent:/xxx/dd-java-agent.jar \
-Ddd.agent.port=9529 \
-Ddd.service=demo \
-Ddd.jmxfetch.check-period=1000 \
-Ddd.jmxfetch.enabled=true \
-Ddd.jmxfetch.config.dir=/xxx/ \
-Ddd.jmxfetch.config=hikaricp.yaml \
-jar xxxx.jar 

dd-java-agent.jar Guance 版下载地址:

复制代码
wget -O dd-java-agent.jar 'https://static.guance.com/dd-image/dd-java-agent.jar'

其中 -Ddd.jmxfetch.config.dir 和 -Ddd.jmxfetch.config=hikaricp.yaml 需要把 hikaricp.yaml 放到 Java 启动可以读取到的地址。

hikaricp.yaml 内容如下,无需修改。

复制代码
init_config:

instances:
  - jvm_direct: true
    name: hikari-slick-monitoring
    collect_default_jvm_metrics: false
    collect_default_metrics: false
    refresh_beans: 60
    conf:
      - include:
          bean_regex: "com.zaxxer.hikari:type=Pool \\((.*)\\)"
          tags:
            pool: $1
          attribute:
            ActiveConnections:
              metric_type: gauge
              alias: hikaricp.connections.active
            IdleConnections:
              metric_type: gauge
              alias: hikaricp.connections.idle
            TotalConnections:
              metric_type: gauge
              alias: hikaricp.connections.total
            ThreadsAwaitingConnection:
              metric_type: gauge
              alias: hikaricp.connections.pending
      - include:
          bean_regex: "com.zaxxer.hikari:type=PoolConfig \\((.*)\\)"
          tags:
            pool: $1
          attribute:
            MaximumPoolSize:
              metric_type: gauge
              alias: hikaricp.pool.size.max
            IdleTimeout:
              metric_type: gauge
              alias: hikaricp.idle.timeout
            MaxLifetime:
              metric_type: gauge
              alias: hikaricp.max.lifetime
            MinimumIdle:
              metric_type: gauge
              alias: hikaricp.min.idle
            ConnectionTimeout:
              metric_type: gauge
              alias: hikaricp.connections.timeout
            ValidationTimeout:
              metric_type: gauge
              alias: hikaricp.validation.timeout
            LeakDetectionThreshold:
              metric_type: gauge
              alias: hikaricp.leak.detection.threshold

关键指标

指标集:hikaricp

指标 描述 用途
connections_active 当前活跃的数据库连接数。 表示正在被应用程序使用的连接数量。
connections_idle 当前空闲的数据库连接数。 表示未被使用的、处于空闲状态的连接数量。
connections_pending 当前等待获取连接的请求数量。 如果这个值较高,可能意味着连接池的大小不足以满足当前的并发需求。
connections_total 当前连接池中总的数据库连接数。 包括活跃和空闲连接。
idle_timeout 空闲连接的最大存活时间。 配置项,当一个连接空闲时间超过这个值时,连接池会将其关闭。
leak_detection_threshold 连接泄漏检测阈值。 配置项。如果一个连接被占用的时间超过这个阈值,连接池会认为可能存在连接泄漏,并发出警告。
max_lifetime 连接的最大生命周期。 配置项,一个连接从创建到被关闭的总存活时间不能超过这个值。
min_idle 连接池中最小空闲连接数。 配置项,连接池会保证至少有这么多空闲连接,以便快速响应新的请求。
pool_size_max 连接池中允许的最大连接数。 配置项,这个值限制了连接池的大小,防止过多的连接消耗过多的资源。
validation_timeout 连接验证超时时间。 配置项,在从连接池获取连接时,连接池会验证连接的有效性,如果验证时间超过这个值,则认为验证失败。
connections_timeout 连接超时时间。 配置项,建立连接最大等待时间。

场景视图

登录观测云控制台,点击「场景」 -「新建仪表板」,输入 "HikariCP", 选择 "HikariCP监控视图",点击 "确定" 即可添加视图。

监控器(告警)

HikariCP 服务连接池使用率告警

简要描述:检测指标 connections_active/pool_size_max , 5分钟内最大值超过80%则触发警告,如下图:

总结

这些指标提供了连接池运行状态的全面视图,帮助开发者和运维人员监控和优化数据库连接池的性能。通过合理配置和监控这些指标,可以确保连接池在高并发场景下高效运行,同时避免资源浪费和性能瓶颈。

相关推荐
阿里小阿希4 小时前
Vue3 + Element Plus 项目中日期时间处理的最佳实践与数据库设计规范
数据库·设计规范
白鹭5 小时前
MySQL源码部署(rhel7)
数据库·mysql
666和7775 小时前
Struts2 工作总结
java·数据库
还听珊瑚海吗5 小时前
SpringMVC(一)
数据库
星期天要睡觉7 小时前
MySQL 综合练习
数据库·mysql
Y4090017 小时前
数据库基础知识——聚合函数、分组查询
android·数据库
JosieBook8 小时前
【数据库】MySQL 数据库创建存储过程及使用场景详解
数据库·mysql
处女座_三月8 小时前
改 TDengine 数据库的时间写入限制
数据库·sql·mysql