SpringBoot+HikariCP+Dropwizard-Metrics统计连接池使用情况

背景,HikariCP是Java目前使用最广的连接池工具类,SpringBoot默认也是用这个,现在想获取连接池使用情况。

这里假设SpringBoot已集成HikariCP

1.pom.xml加上Dropwizard-Metrics配置

<dependency>
<groupId>io.dropwizard.metrics</groupId>
<artifactId>metrics-core</artifactId>
</dependency>
<dependency>
<groupId>io.dropwizard.metrics</groupId>
<artifactId>metrics-healthchecks</artifactId>
</dependency>

2在应用启动的时候连接池注册统计接口

import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.Slf4jReporter;
import com.zaxxer.hikari.HikariDataSource; import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Component
public class ApplicationRunner implements ApplicationRunner {
private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationRunner.class);
@Autowired
private DataSource dataSource; @Override
public void run(ApplicationArguments args) throws Exception {
try {
// see detail https://github.com/brettwooldridge/HikariCP/wiki/Dropwizard-Metrics
// 连接池注册统计接口
MetricRegistry metricRegistry = new MetricRegistry();
if(dataSource instanceof HikariDataSource) {
((HikariDataSource) dataSource).setMetricRegistry(metricRegistry);
}
// 定时打印连接池使用情况
Slf4jReporter reporter = Slf4jReporter.forRegistry(metricRegistry).build();
reporter.start(1, TimeUnit.MINUTES); } catch (Exception e) {
String msg = "服务启动异常";
LOGGER.error(msg, e);
throw new IllegalStateException(msg, e);
} }
}

3 提供http请求获取连接池使用情况

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate; /**
* 远程使用的RestTemplatebean,与服务间调用区分开来
*/
@Configuration
public class RestTemplateConfig { @Bean("remoteRestTemplate")
public RestTemplate remoteRestTemplate() {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setReadTimeout(180000);
factory.setConnectTimeout(8000);
return new RestTemplate(factory);
} }
import com.codahale.metrics.*;
import com.netflix.appinfo.InstanceInfo;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.netflix.eureka.EurekaDiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate; import javax.sql.DataSource;
import java.util.List;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap; @RestController
@RequestMapping("hikariCpStatsController")
public class HikariCpStatsController {
private static final String SERVICE_NAME ="xiaoniu";
@Autowired
private DataSource dataSource; @Autowired
private DiscoveryClient discoveryClient; @Qualifier("remoteRestTemplate")
@Autowired
private RestTemplate restTemplate; @GetMapping("poolStatsHa")
public TreeMap<String, Object> poolStatsHa() {
MetricRegistry metricRegistry = null;
if (dataSource instanceof HikariDataSource) {
metricRegistry = (MetricRegistry) ((HikariDataSource) dataSource).getMetricRegistry();
}
if (metricRegistry == null)
return null;
TreeMap<String, Object> dataAll = new TreeMap<>();
// 节点的信息
List<ServiceInstance> instances = discoveryClient.getInstances(SERVICE_NAME);
for (ServiceInstance instance : instances) {
InstanceInfo instanceInfo = ((EurekaDiscoveryClient.EurekaServiceInstance) instance).getInstanceInfo();
TreeMap data = restTemplate.getForObject(instance.getUri().toString() + "/hikariCpStatsController/poolStats", TreeMap.class);
dataAll.put(instanceInfo.getInstanceId(), data);
}
return dataAll;
} @GetMapping("poolStats")
public TreeMap<String, Object> poolStats() {
MetricRegistry metricRegistry = null;
if (dataSource instanceof HikariDataSource) {
metricRegistry = (MetricRegistry) ((HikariDataSource) dataSource).getMetricRegistry();
}
if (metricRegistry == null)
return null; TreeMap<String, Object> data = new TreeMap<>(); SortedMap<String, Gauge> gauges = metricRegistry.getGauges();
for (Map.Entry<String, Gauge> gaugeEntry : gauges.entrySet()) {
String key = gaugeEntry.getKey();
Gauge value = gaugeEntry.getValue();
data.put(key, value.getValue()); }
SortedMap<String, Timer> timers = metricRegistry.getTimers();
for (Map.Entry<String, Timer> timerEntry : timers.entrySet()) {
String key = timerEntry.getKey();
Timer value = timerEntry.getValue();
data.put(key, "获取连接时99%线程等待的纳秒=" + value.getSnapshot().get99thPercentile());
}
SortedMap<String, Meter> meters = metricRegistry.getMeters();
for (Map.Entry<String, Meter> meterEntry : meters.entrySet()) {
String key = meterEntry.getKey();
Meter value = meterEntry.getValue();
data.put(key, "count=" + value.getCount());
}
SortedMap<String, Histogram> histograms = metricRegistry.getHistograms();
for (Map.Entry<String, Histogram> histogramEntry : histograms.entrySet()) {
String key = histogramEntry.getKey();
Histogram value = histogramEntry.getValue();
data.put(key, "99%连接线程使用的毫秒=" + value.getSnapshot().get99thPercentile());
}
return data;
}
}

在此大功告成

参考// see detail https://github.com/brettwooldridge/HikariCP/wiki/Dropwizard-Metrics

SpringBoot+HikariCP+Dropwizard-Metrics统计连接池使用情况的更多相关文章

  1. SpringBoot 整合mongoDB并自定义连接池

    SpringBoot 整合mongoDB并自定义连接池 得力于SpringBoot的特性,整合mongoDB是很容易的,我们整合mongoDB的目的就是想用它给我们提供的mongoTemplate,它 ...

  2. (二)SpringBoot整合常用框架Druid连接池

    一,在Pom.xml文件加入依赖 找到<dependencies></dependencies>标签,在标签中添加Druid依赖 <dependency> < ...

  3. 基于HiKariCP组件,分析连接池原理

    HiKariCP作为SpringBoot2框架的默认连接池,号称是跑的最快的连接池,数据库连接池与之前两篇提到的线程池和对象池,从设计的原理上都是基于池化思想,只是在实现方式上有各自的特点:

  4. SpringBoot整合自定义FTP文件连接池

    说明:通过GenericObjectPool实现的FTP连接池,记录一下以供以后使用环境:JDK版本1.8框架 :springboot2.1文件服务器: Serv-U1.引入依赖 <!--ftp ...

  5. SQL server 数据连接池使用情况检测

    1.依据HOST_NAME请求session_id 查询 select DB_NAME(database_id) dbname,login_name,t1.session_id,t1.request_ ...

  6. SpringBoot入门篇--整合mybatis+generator自动生成代码+druid连接池+PageHelper分页插件

    原文链接 我们这一篇博客讲的是如何整合Springboot和Mybatis框架,然后使用generator自动生成mapper,pojo等文件.然后再使用阿里巴巴提供的开源连接池druid,这个连接池 ...

  7. Java代码生成器加入postgresql数据库、HikariCP连接池、swagger2支持!

    目录 前言 PostgreSql VS MySql HikariCP VS Druid Swagger2 自定义参数配置一览 结语 前言   最近几天又抽时间给代码生成器增加了几个新功能(预计今晚发布 ...

  8. Spring系列之HikariCP连接池

    上两篇文章,我们讲到了Spring中如何配置单数据源和多数据源,配置数据源的时候,连接池有很多选择,在SpringBoot 1.0中使用的是Tomcat的DataSource,在SpringBoot ...

  9. SpringBoot系列之Hikari连接池

    1.springboot 2.0 中默认连接池是Hikari,在引用parents后不用专门再添加依赖 2.application.yml中的配置 # jdbc_config datasource s ...

随机推荐

  1. Oracle学习(十五)PLSQL安装

    PS:由于原来一直用的旧版本的PLSQL客户端,查看执行计划有些数据无法展示,所以今天换一波新版本的使用,记录下安装和使用流程. PLSQL(oracle数据可视化工具) 一.下载 我用的13的版本, ...

  2. 刷题[MRCTF2020]套娃

    解题思路 查看源码,发现注释中存在代码 //1st $query = $_SERVER['QUERY_STRING']; if( substr_count($query, '_') !== 0 || ...

  3. Linux系统编程 —读写锁rwlock

    读写锁是另一种实现线程间同步的方式.与互斥量类似,但读写锁将操作分为读.写两种方式,可以多个线程同时占用读模式的读写锁,这样使得读写锁具有更高的并行性. 读写锁的特性为:写独占,读共享:写锁优先级高. ...

  4. idea模拟前端向后台请求数据输出响应结果

    tools-httpClient-Test restful web service 通过上述步骤之后出现如下图 1 表示通过哪种方式请求:2 请求数据的地址头部:3 请求数据的除了头部之后的地址:4, ...

  5. 基于gis的系统开发,程序运行出现问题 ArcGIS product not specified.You must first bind to an ArcGIS version prior to using any ArcGIS components.

    在之前初始化的时候添加下面的一行代码:ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);还需要添加一个引 ...

  6. python 系统设置

    1. 设置python运行环境为utf-8 import sys #引用sys模块 reload(sys) #重新加载sys sys.setdefaultencoding("utf-8&qu ...

  7. 开源后台系统*mee-admin*

    mee-admin开源后台系统 Preface 这是一个开放的时代,我们不能总是把东西揣在口袋里面自己乐呵. 也正如名言所说的"如果你有两块面包,你当用其中一块去换一朵水仙花" 所 ...

  8. 《C++primerplus》第12章练习题

    做一下倒数两题,都是在队列模拟的程序基础上做点修改测试. 5.找出平均等候时间为1分钟时,每小时到达的客户数为多少(试验时间不少于100小时). 指定队伍最大长度10人,模拟100小时.粗略估计答案在 ...

  9. RHSA-2018:1700-重要: procps-ng 安全更新(存在EXP、本地提权)

    [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 修复命令: 使用root账号登陆She ...

  10. python之多态

    python之多态 一.什么是多态? 同一种事物,有多种形态! class Animal: #同一类事物:动物 def talk(self): pass class Cat(Animal): #动物的 ...