使用springboot集成druid-Monitor进行sql监控、数据源监控,sql慢查询监控。
一、前言
软件架构:
- springboot框架
- druid地址池
- mybatis
Druid 简介
Druid 是阿里巴巴开源的数据库连接池,提供了优秀的对数据库操作的监控功能。
Druid的好并不止体现在作为一个连接池加快数据访问性能上和连接管理上,他带有一个强大的监控工具:Druid Monitor。 不仅可以监控数据源和慢查询,还可以监控Web应用、URI监控、Session监控、Spring监控。
二、实现过程
1.引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.20</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.20</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
2.配置相关属性
-
配置Druid数据源(连接池): 如同以前 c3p0、dbcp 数据源可以设置数据源连接初始化大小、最大连接数、等待时间、最小连接数 等一样,Druid 数据源同理可以进行设置; -
配置 Druid web 监控 filter(WebStatFilter ): 这个过滤器的作用就是统计 web 应用请求中所有的数据库信息,比如 发出的 sql 语句,sql 执行的时间、请求次数、请求的 url 地址、以及seesion 监控、数据库表的访问次数 等等。 -
配置 Druid 后台管理 Servlet(StatViewServlet ): Druid 数据源具有监控的功能,并提供了一个 web 界面 方便用户查看,类似安装 路由器 时,人家也提供了一个默认的 web 页面;需要设置 Druid 的后台管理页面的属性,比如 登录账号、密码 等 ;
注意:
Druid Spring Boot Starter 配置属性的名称完全遵照 Druid,可以通过 Spring Boot配置文件来配置Druid数据库连接池和监控,如果没有配置则使用默认值。
application.yml配置如下:
spring:
datasource:
name: test
url: jdbc:mysql://localhost:3306/db_user?&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSl=false
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
filters: stat,wall,log4j
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
removeAbandoned: true
removeAbandonedTimeout: 180
logAbandoned: true
druid:
initial-size: 5
min-idle: 5
max-active: 30
max-wait: 60000
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
max-pool-prepared-statement-per-connection-size: 20
pool-prepared-statements: true
validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: false
test-on-return: false
stat-view-servlet:
enabled: true
url-pattern: /druid/*
reset-enable: true
login-username: admin
login-password: admin
allow: 127.0.0.1
deny:
web-stat-filter:
enabled: true
session-stat-enable: true
session-stat-max-count: 1000
url-pattern: /*
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
filter:
stat:
enabled: true
db-type: mysql
log-slow-sql: true
slow-sql-millis: 2000
logPath: D:/logs/
logName: admin
logBusinessLevel: debug
logRootLevel: info
上述配置文件的参数可以在 :com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties 和 org.springframework.boot.autoconfigure.jdbc.DataSourceProperties中找到;
2.1 如何配置 Filter
可以通过 spring.datasource.druid.filters=stat,wall,log4j …的方式来启用相应的内置Filter,不过这些Filter都是默认配置。如果默认配置不能满足需求,可以放弃这种方式,通过配置文件来配置Filter,下面是例子。
3.监控页面
(1)启动项目后,访问 ip:端口号/druid/login.html 来登录页面,输入 配置文件中 设置的 账号和密码 (2)数据源页面 是当前DataSource配置的基本信息,上述配置的Filter可以在里面找到,如果没有配置Filter(一些信息会无法统计,例如“SQL监控”,会无法获取JDBC相关的SQL执行信息) (3)SQL监控页面 SQL监控页面统计了所有SQL语句的执行情况。
没有请求前,数据源和sql监控页面都是空的。 我们生成一个查询请求:http://localhost:8086/user/listAll,然后刷新druid-Monitor中的数据源窗口和sql监控窗口
(4)URL监控页面
URL监控页面统计了所有Controller接口的访问以及执行情况 (5)Spring 监控页面
Spring 监控页面 利用aop 对指定 接口的执行时间,jdbc数进行记录。
4.去除广告图片
package com.example.druiddemo.config;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
import com.alibaba.druid.util.Utils;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.*;
import java.io.IOException;
@Configuration
@ConditionalOnWebApplication
@AutoConfigureAfter(DruidDataSourceAutoConfigure.class)
@ConditionalOnProperty(name = "spring.datasource.druid.stat-view-servlet.enabled", havingValue = "true",
matchIfMissing = true)
public class RemoveDruidAdConfig {
@Bean
public FilterRegistrationBean removeDruidAdfilterRegistrationBean(DruidStatProperties properties){
DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
String pattern = config.getUrlPattern()!=null?config.getUrlPattern():"/druid/*";
String commonJsPattern = pattern.replaceAll("\\*","js/common.js");
final String filePath = "support/http/resources/js/common.js";
Filter filter = new Filter() {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
chain.doFilter(request,response);
//重置缓冲区,响应不会被重置
response.resetBuffer();
//获取common.js
String text = Utils.readFromResource(filePath);
//正则替换banner,除去底部的广告信息
text = text.replaceAll("<a.*?banner\"></a><br/>","");
text = text.replaceAll("powered.*?shrek.wang</a>","");
response.getWriter().write(text);
}
@Override
public void destroy() {
}
};
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setFilter(filter);
registrationBean.addUrlPatterns(commonJsPattern);
return registrationBean;
}
}
重启项目,查看效果,可以看到底部的广告图片没有了:
至此,springboot集成druid-Monitor就完成了。
三、源码下载
可点击此处进行下载
|