性能排查在數據源方面,通過使用druid提供的慢sql日志記錄以及應用數據源監控來跟蹤,分析,定位應用上的性能問題。
基於druid配置開啟慢sql的例子很多,大部分都是使用log4j,但項目中使用的是logback,所以一下都是基於logback的配置。
1.druid慢日志記錄的開啟配置
1.1 配置Filter
<!-- 慢SQL記錄 --> <bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter"> <!-- 慢sql時間設置,即執行時間大於1000毫秒的都是慢sql --> <property name="slowSqlMillis" value="1000"/> <property name="logSlowSql" value="true"/> </bean> <bean id="log-filter" class="com.alibaba.druid.filter.logging.Slf4jLogFilter"> <property name="dataSourceLogEnabled" value="true" /> <property name="statementExecutableSqlLogEnable" value="true"/> </bean>
1.2 數據源使用Filter
<bean id="ims-druidDataSource-adb" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close" primary="false"> <property name="url" value="${spring.datasource.adb.url}"/> <property name="username" value="${spring.datasource.adb.username}"/> <property name="password" value="${spring.datasource.adb.password}"/> <property name="driverClassName" value="${spring.datasource.adb.driver-class-name}"/> <!--druid數據源使用Filter --> <property name="proxyFilters"> <list> <ref bean="stat-filter"/> <ref bean="log-filter"/> </list> </property>
</bean>
1.3配置logback
<appender name="DruidFILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在記錄的日志文件的路徑及文件名 --> <file>${LOG_HOME}/log_druid_slow_sql.log</file> <!-- 日志記錄器的滾動策略,按日期,按大小記錄 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 歸檔的日志文件的路徑,例如今天是2013-12-21日志,當前寫的日志文件路徑為file節點指定,可以將此文件與file指定文件路徑設置為不同路徑,從而將當前日志文件或歸檔日志文件置不同的目錄。 而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 --> <fileNamePattern>${LOG_HOME}/log-druid_slow_sql-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 除按日志記錄之外,還配置了日志文件不能超過2M,若超過2M,日志文件會以索引0開始, 命名日志文件,例如log-error-2013-12-21.0.log --> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>200MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <!-- 追加方式記錄日志 --> <append>true</append> <!-- 日志文件的格式 --> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern> <charset>utf-8</charset> </encoder> <!-- 此日志文件只記錄級別的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <logger name="com.alibaba.druid.filter.stat.StatFilter" level="ERROR"> <appender-ref ref="DruidFILE" /> </logger>
效果如下:會在日志目錄按天生成日志文件,將慢sql記錄到日志文件中。
2.配置druid內置監控頁面(基於springboot)
直接上代碼:
import com.alibaba.druid.support.http.StatViewServlet; import com.alibaba.druid.support.http.WebStatFilter; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Arrays; import java.util.HashMap; import java.util.Map; /** * <P> * 描述:druidCofig監控 * </p> * * @author lishang Created on 2020/5/8 17:24 * @version 1.0 */ @Configuration public class DruidConfig { //1.配置管理后台的servlet @Bean public ServletRegistrationBean statViewServlet(){ //druid監控頁面的url ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*"); Map<String,String> initParams = new HashMap<>(); initParams.put("loginUsername","druid"); //登陸用戶名 initParams.put("loginPassword","123456"); //密碼 initParams.put("allow",""); //允許哪些ip initParams.put("deny",""); //拒絕ip bean.setInitParameters(initParams); return bean; } //2.配置一個web監控的filter,監控sql @Bean public FilterRegistrationBean webStatFilter(){ FilterRegistrationBean bean = new FilterRegistrationBean(); bean.setFilter(new WebStatFilter()); Map<String,String> initParams = new HashMap<>(); initParams.put("exclusions","*.js,*.css,*.html,/druid/*"); bean.setInitParameters(initParams); bean.setUrlPatterns(Arrays.asList("/*")); return bean; } }
然后, 就可以通過也沒訪問了,如下:
數據源相關信息,一目了然:
不得不承認,durid提供的相關監控使用起來方便,功能也是十分強大。
有了強大的監控支持,慢慢去定位系統的性能瓶頸去吧,希望通過我們的努力可以給客戶更好用戶體驗。