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 采集器
bash 复制代码
# 开启采集器
cp /usr/local/datakit/conf.d/statsd/statsd.conf.sample /usr/local/datakit/conf.d/statsd/statsd.conf
# 重启 Datakit
datakit service -R
  • 开启链路采集
bash 复制代码
# 开启采集器
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 项目中连接池配置如下:

ini 复制代码
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 ,应用启动增加如下参数,启动命令如下:

ini 复制代码
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 版下载地址:

less 复制代码
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 内容如下,无需修改。

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%则触发警告,如下图:

总结

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

相关推荐
故乡dee云2 小时前
AWS 产品太多不会选?按“网站、数据库、文件、日志”4 类需求快速匹配
数据库·云计算·aws
曹牧4 小时前
C#:问号
前端·数据库·c#
奇树谦4 小时前
《现代 Key-Value 数据库原理:从 B+Tree 到 LSM Tree》-第五篇:现代数据库横向对比
数据库·lsm-tree
李白客4 小时前
分布式集群与数据库产业:从单机到集群的架构跃迁与市场重构
数据库·分布式·架构
福大大架构师每日一题5 小时前
Redis 8.10.0 正式发布:紧凑哈希、批量导入、备份恢复、流与时序能力全面升级
数据库·redis·哈希算法
雨晨源码(同名B站)5 小时前
基于深度学习YoloV11农业病害虫害检测系统 智慧农业信息化综合管理平台 (附源码+lw文档+ppt)
数据库·人工智能·深度学习·yolo·信息可视化
DBA小马哥6 小时前
向量数据库入门到进阶:Embedding、ANN算法与RAG落地的关键术语
数据库·算法·embedding
云和数据.ChenGuang6 小时前
fastapi项目拆分实战数据模型
java·服务器·数据库·人工智能·深度学习·fastapi·强化学习
祈禾6 小时前
Redis三大特殊数据类型
运维·服务器·数据库·redis·笔记·缓存
东方护航数据恢复(深圳)6 小时前
MySQL_Oracle数据库崩溃修复全攻略_东方护航数据恢复深圳店
数据库·mysql·oracle