1. 程式人生 > >Spring Boot應用中監控tomcat,druid連線池狀態

Spring Boot應用中監控tomcat,druid連線池狀態

這篇文章記錄一下如何在spring boot中監控tomcat,druid連線池狀態,之前我寫過一篇文章介紹過類似的,具體背景和監控資料的收集部分這裡就不贅述,可以參考在SPRING BOOT應用監控執行緒池的狀態

背景

隨著流量的增大,我們急需監控各個微服務部署的tomcat和資料庫連線池狀態,以此來了解線上連線池配置是否滿足要求,不存在效能上的問題。

資料收集

JMX

再介紹怎麼監控連線池狀態之前,先來了解一下JMX, JMX在Java程式語言中定義了應用程式以及網路管理和監控的體系結構、設計模式、應用程式介面以及服務。通常使用JMX來監控系統的執行狀態或管理系統的某些方面,比如清空快取、重新載入配置檔案等。

tomcat和druid在啟動後都會在JMX中註冊自己的Mbean, 其中Mbean有關於連線池狀態的屬性,因此只需要定時讀取Mbean中的這部分屬性就能做到對執行緒池的監控。

怎麼試著檢視JMX呢?最簡單的辦法就是通過jvisualvm,開啟已經啟動的spring boot專案,當然前提是要在jvisualvm中提前安裝好mbeans的外掛,之後我們能發現有一個Mbeans標籤,點選它就能看到所有註冊到JMX的Mbean, 其中就有Tomcat和Druid的Mbean,順著它們的樹狀結構檢視它們支援的所有屬性值,這些屬性值就是正在執行的spring boot程式的當前狀態,挑出我們最關心的屬性繼續往下看。

還是和之前一樣利用spring boot actuator, 它能和statsd整合,並定時將/metrics中的監控資料傳送出去,因此我們只需要實現PublicMetrics介面,而在metrics方法中讀取tomcat和druid的Mbean資料,具體可以參考下面的程式碼:

監控Tomcat連線池

@Component
public class TomcatPublishMetrics implements PublicMetrics {

    public static final Logger LOG = LoggerFactory.getLogger(TomcatPublishMetrics.class);

    @Autowired
    private MBeanServer mbeanServer;

    @Override
    public Collection<Metric<?>> metrics() {
        try {
            Set<ObjectName> objectNames = mbeanServer.queryNames(new ObjectName("Tomcat:type=ThreadPool,*"), null);
            Collection<Metric<?>> result = new ArrayList<>();
            if (objectNames != null && objectNames.size() == 1) {
                for (ObjectName objectName : objectNames) {
                    int maxThreads = (Integer) mbeanServer.getAttribute(objectName, "maxThreads");
                    int currentThreadCount = (Integer) mbeanServer.getAttribute(objectName, "currentThreadCount");
                    int currentThreadsBusy = (Integer) mbeanServer.getAttribute(objectName, "currentThreadsBusy");
                    long connectionCount = (Long) mbeanServer.getAttribute(objectName, "connectionCount");
                    int maxConnections = (Integer) mbeanServer.getAttribute(objectName, "maxConnections");
                    result.add(new Metric<Number>("tomcat.thread.busy", currentThreadsBusy, new Date()));
                    result.add(new Metric<Number>("tomcat.thread.max", maxThreads, new Date()));
                    result.add(new Metric<Number>("tomcat.thread.current", currentThreadCount, new Date()));
                    result.add(new Metric<Number>("tomcat.thread.connectionCount", connectionCount, new Date()));
                    result.add(new Metric<Number>("tomcat.thread.maxConnections", maxConnections, new Date()));
                }
            } else {
                LOG.warn("Tomcat thread pool monitor failed");
            }
            return result;
        } catch (Exception e) {
            LOG.error("Tomcat thread pool monitor exception", e);
        }
        return Collections.emptyList();
    }
}

監控Druid連線池

@Component
public class DruidPoolPublishMetrics implements PublicMetrics {

    public static final Logger LOG = LoggerFactory.getLogger(DruidPoolPublishMetrics.class);

    @Autowired
    private MBeanServer mbeanServer;

    @Override
    public Collection<Metric<?>> metrics() {
        try {
            Set<ObjectName> objectNames = mbeanServer.queryNames(new ObjectName("com.alibaba.druid.pool:type=DruidDataSource,*"), null);
            Collection<Metric<?>> result = new ArrayList<>();
            if (objectNames != null && objectNames.size() == 1) {
                for (ObjectName objectName : objectNames) {
                    long errorCount = (Long) mbeanServer.getAttribute(objectName, "ErrorCount");
                    int waitThreadCount = (Integer) mbeanServer.getAttribute(objectName, "WaitThreadCount");
                    long resetCount = (Long) mbeanServer.getAttribute(objectName, "ResetCount");
                    int activeCount = (Integer) mbeanServer.getAttribute(objectName, "ActiveCount");
                    long rollbackCount = (Long) mbeanServer.getAttribute(objectName, "RollbackCount");
                    int maxActive = (Integer) mbeanServer.getAttribute(objectName, "MaxActive");
                    result.add(new Metric<Number>("druid.pool.errorCount", errorCount, new Date()));
                    result.add(new Metric<Number>("druid.pool.waitThreadCount", waitThreadCount, new Date()));
                    result.add(new Metric<Number>("druid.pool.resetCount", resetCount, new Date()));
                    result.add(new Metric<Number>("druid.pool.activeCount", activeCount, new Date()));
                    result.add(new Metric<Number>("druid.pool.rollbackCount", rollbackCount, new Date()));
                    result.add(new Metric<Number>("druid.pool.maxActive", maxActive, new Date()));
                }
            } else {
                LOG.warn("DruidPool monitor failed");
            }
            return result;
        } catch (Exception e) {
            LOG.error("DruidPool monitor exception", e);
        }
        return Collections.emptyList();
    }
}

總結

這篇文章介紹了通過讀取JMX中相應的Mbean的資料進行收集並監控,如果其他的監控指標註冊在JMX中,例如對redis的連線池,也可以採用類似的方法收集。

歡迎關注我的個人的部落格www.zhijianliu.cn, 虛心求教,有錯誤還請指正輕拍,謝謝

相關推薦

Spring Boot應用監控tomcat,druid連線狀態

這篇文章記錄一下如何在spring boot中監控tomcat,druid連線池狀態,之前我寫過一篇文章介紹過類似的,具體背景和監控資料的收集部分這裡就不贅述,可以參考在SPRING BOOT應用監控執行緒池的狀態背景隨著流量的增大,我們急需監控各個微服務部署的tomcat和

Spring Boot (四): Druid 連線密碼加密與監控

在上一篇文章《Spring Boot (三): ORM 框架 JPA 與連線池 Hikari》 我們介紹了 JPA 與連線池 Hikari 的整合使用,在國內使用比較多的連線池還有一個是阿里開源的 Druid 。本篇文章我們就來聊一聊 Druid 的一些使用姿勢。 1. Druid 是什麼? 我們先來

Guava Cache本地快取在 Spring Boot應用的實踐

概述 在如今高併發的網際網路應用中,快取的地位舉足輕重,對提升程式效能幫助不小。而 3.x開始的 Spring也引入了對 Cache的支援,那對於如今發展得如火如荼的 Spring Boot來說自然也是支援快取特性的。當然 Spring Boot預設使用的是 SimpleCacheConfigurati

RabbitMQ入門:在Spring Boot 應用整合RabbitMQ

在上一篇隨筆中我們認識並安裝了RabbitMQ,接下來我們來看下怎麼在Spring Boot 應用中整合RabbitMQ。 先給出最終目錄結構: 搭建步驟如下: 新建maven工程amqp 修改pom檔案,引入spring-boot-starter-amqp和spring-boot-sta

spring boot(六) 加入庫連線(alibaba druid 資料)及分頁外掛

前言 上一遍只是簡單的說明了怎麼加入Mybatis,但這遠遠還是不夠,我們還需要加入資料庫連池來幫助我們來管理資料庫連線。 ##1、加spring boot druid 依賴 <dependency> <groupId>com.alib

Spring boot+Mybatis+druid連線監控資訊配置

新建專案我是用的是IDEA,專案選擇如下所示:為專案取一個名字,如下圖所示,然後點選next選擇需要新增的模組,選擇完畢後,會自動將所需的依賴,新增到pom檔案中確認路徑無誤,點選finish即可專案基本結構,IDEA會自動生成,為了測試環境是否可以成功執行,建議建包結構如下

Druid連線監控spring的配置

Druid連線池及監控在Spring配置如下: <beanid="dataSource"class="com.alibaba.druid.pool.DruidDataSource"init

spring boot --部署war到tomcat

linux spring target 默認 inux targe ins bsp 安裝 1.在pom文件中,將默認的jar包打包,改成以war包打包:<!--打包方式--><packaging>war</packaging> 2.將項目

Spring Boot應用監控的實戰教程

事件 oot load 增加 lin keyword 微服務 processor cli 概述 Spring Boot 監控核心是 spring-boot-starter-actuator 依賴,增加依賴後, Spring Boot 會默認配置一些通用的監控,比如 jvm

Spring boot 整合druid連線

前言 Druid是一個關係型資料庫連線池,是阿里巴巴的一個開源專案 地址:https://github.com/alibaba/druid Druid不但提供連線池的功能,還提供監控功能,可以實時檢視資料庫連線池和SQL查詢的工作情況。 配置Druid依賴 <!--web

Spring框架JdbcTemplate類的查表功能演示(基於Druid連線)

    將資料庫行記錄轉為已知類的實現物件的思路,作為一個java後端程式設計師的基本修養,必須掌握,現舉其中一例: 步驟: 1.首先需要配置 Druid(阿里巴巴) 連線池環境,寫好工具類JDBCUtilsDruid,不再贅述; 2.配置Spring框架環

在IDEA建立第一個Spring Boot應用

1.建立springboot專案 Next後邊的步驟都是平時用的,這裡就不再放圖出來了 2.編寫一個簡單程式碼進行測試 在SpringbootApplication.java中: package cn.ysjh.springboot2; import org.springfr

spring-boot專案部署到tomcat容器

把spring-boot專案按照平常的web專案一樣釋出到tomcat容器下 一、修改打包形式 在pom.xml裡設定 <packaging>war</packaging> 二、移除嵌入式tomcat外掛 在pom.xml裡找到spri

Spring boot2.0以上整合Druid連線監控資訊配置

1. Springboot 2.0選擇HikariCP作為預設資料庫連線池 理由參考: 2. 資料庫連線池效能比對(hikari druid c3p0 dbcp jdbc) 本文是整合Druid連線池,資料庫為mysql pom檔案新增druid的依

Spring Boot-2.1.0整合Druid監控資料庫

1.首先匯入依賴 <!--Druid依賴包--> <dependency> <groupId>com.alibaba</groupId> <artifact

Spring boot應用打包成映象放到docker執行

學習docker,需要把專案打包成映象,所以第一步首先得把專案打成war包,這樣才能丟上去。 打包成war 這一步在傳統java web專案中看起來非常簡單一步,但是Spring boot卻有小許不同。 增加SpringBootServletIni

Spring Boot應用的健康監控

在之前的系列文章中我們學習瞭如何進行Spring Boot應用的功能開發,以及如何寫單元測試、整合測試等,然而,在實際的軟體開發中需要做的不僅如此:還包括對應用程式的監控和管理。 正如飛行員不喜歡盲目飛行,程式設計師也需要實時看到自己的應用目前的執行情況。如果給定一個具體的時間,我們希望知道此時CPU的利用

在Docker容器執行Spring Boot應用

Spring Boot簡化了Spring應用的開發過程,遵循約定優先配置的原則提供了各類開箱即用(out-of-the-box)的框架配置。另一方面,Spring Boot還具備將程式碼直接構建為可執行jar包的能力,這個jar包是一個可以獨立執行的部署單元。基於以上特性,現在普

Druid Spring Boot Starter實現監控

在 Spring Boot 專案中加入druid-spring-boot-starter依賴 Maven <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-

Spring Boot使用MongoDB的連線配置

說明 Spring Boot中通過依賴spring-boot-starter-data-mongodb,來實現spring-data-mongodb的自動配置。 但是預設情況下,Spring Boot 中,並沒有像使用MySQL或者Redis一樣,提供了