refactor(pigx-monitor): 移除 fastjson 依赖,改用 hutool-json 处理 JSON 序列化与反序列化

This commit is contained in:
PIGCLOUD committed 2026-08-03 08:25:55 +08:00
1 parent 7461394f99
commit 6248d60e62
8 files changed
+379 -299

No files matched your search

+2 -2
View File
@@ -73,8 +73,8 @@
</dependency>
<!--monitor json 操作-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<groupId>cn.hutool</groupId>
<artifactId>hutool-json</artifactId>
</dependency>
</dependencies>
@@ -1,61 +1,68 @@
package com.pig4cloud.pigx.monitor.model.dto;
import com.alibaba.fastjson.annotation.JSONField;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* Druid 数据源活跃连接响应。
* <p>
* JSON 字段名与 Druid 监控接口保持一致。
*
* @author linchtech
* @date 2020-09-21 9:26
**/
@NoArgsConstructor
@Data
@Schema(description = "Druid 数据源活跃连接响应")
public class ConnectionResult {
@JSONField(name = "ResultCode")
@Schema(description = "Druid 原始字段:ResultCode")
private int ResultCode;
@JSONField(name = "Content")
@Schema(description = "Druid 原始字段:Content")
private List<ContentBean> Content;
/** Druid 数据源活跃连接明细。 */
@NoArgsConstructor
@Data
@Schema(description = "Druid 数据源活跃连接明细")
public static class ContentBean {
@JSONField(name = "id")
@Schema(description = "Druid 原始字段:id")
private int id;
@JSONField(name = "connectionId")
@Schema(description = "Druid 原始字段:connectionId")
private int connectionId;
@JSONField(name = "useCount")
@Schema(description = "Druid 原始字段:useCount")
private int useCount;
@JSONField(name = "lastActiveTime")
@Schema(description = "Druid 原始字段:lastActiveTime")
private String lastActiveTime;
@JSONField(name = "connectTime")
@Schema(description = "Druid 原始字段:connectTime")
private String connectTime;
@JSONField(name = "holdability")
@Schema(description = "Druid 原始字段:holdability")
private int holdability;
@JSONField(name = "transactionIsolation")
@Schema(description = "Druid 原始字段:transactionIsolation")
private int transactionIsolation;
@JSONField(name = "autoCommit")
@Schema(description = "Druid 原始字段:autoCommit")
private boolean autoCommit;
@JSONField(name = "readoOnly")
@Schema(description = "Druid 原始字段:readoOnly")
private boolean readoOnly;
@JSONField(name = "keepAliveCheckCount")
@Schema(description = "Druid 原始字段:keepAliveCheckCount")
private int keepAliveCheckCount;
@JSONField(name = "pscache")
@Schema(description = "Druid 原始字段:pscache")
private List<?> pscache;
}
@@ -1,233 +1,241 @@
package com.pig4cloud.pigx.monitor.model.dto;
import com.alibaba.fastjson.annotation.JSONField;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* Druid 数据源统计响应。
* <p>
* JSON 字段名与 Druid 监控接口保持一致。
*
* @author linchtech
* @date 2020-09-16 18:32
**/
@Data
@NoArgsConstructor
@Schema(description = "Druid 数据源统计响应")
public class DataSourceResult {
@JSONField(name = "ResultCode")
@Schema(description = "Druid 原始字段:ResultCode")
private int ResultCode;
@JSONField(name = "Content")
@Schema(description = "Druid 原始字段:Content")
private List<ContentBean> Content;
/** Druid 数据源统计明细。 */
@NoArgsConstructor
@Data
@Schema(description = "Druid 数据源统计明细")
public static class ContentBean {
@Schema(description = "服务实例 ID")
private String serviceId;
@JSONField(name = "Identity")
@Schema(description = "Druid 原始字段:Identity")
private int Identity;
@JSONField(name = "Name")
@Schema(description = "Druid 原始字段:Name")
private String Name;
@JSONField(name = "DbType")
@Schema(description = "Druid 原始字段:DbType")
private String DbType;
@JSONField(name = "DriverClassName")
@Schema(description = "Druid 原始字段:DriverClassName")
private String DriverClassName;
@JSONField(name = "URL")
@Schema(description = "Druid 原始字段:URL")
private String URL;
@JSONField(name = "UserName")
@Schema(description = "Druid 原始字段:UserName")
private String UserName;
@JSONField(name = "WaitThreadCount")
@Schema(description = "Druid 原始字段:WaitThreadCount")
private int WaitThreadCount;
@JSONField(name = "NotEmptyWaitCount")
@Schema(description = "Druid 原始字段:NotEmptyWaitCount")
private int NotEmptyWaitCount;
@JSONField(name = "NotEmptyWaitMillis")
@Schema(description = "Druid 原始字段:NotEmptyWaitMillis")
private int NotEmptyWaitMillis;
@JSONField(name = "PoolingCount")
@Schema(description = "Druid 原始字段:PoolingCount")
private int PoolingCount;
@JSONField(name = "PoolingPeak")
@Schema(description = "Druid 原始字段:PoolingPeak")
private int PoolingPeak;
@JSONField(name = "PoolingPeakTime")
@Schema(description = "Druid 原始字段:PoolingPeakTime")
private String PoolingPeakTime;
@JSONField(name = "ActiveCount")
@Schema(description = "Druid 原始字段:ActiveCount")
private int ActiveCount;
@JSONField(name = "ActivePeak")
@Schema(description = "Druid 原始字段:ActivePeak")
private int ActivePeak;
@JSONField(name = "ActivePeakTime")
@Schema(description = "Druid 原始字段:ActivePeakTime")
private String ActivePeakTime;
@JSONField(name = "InitialSize")
@Schema(description = "Druid 原始字段:InitialSize")
private int InitialSize;
@JSONField(name = "MinIdle")
@Schema(description = "Druid 原始字段:MinIdle")
private int MinIdle;
@JSONField(name = "MaxActive")
@Schema(description = "Druid 原始字段:MaxActive")
private int MaxActive;
@JSONField(name = "QueryTimeout")
@Schema(description = "Druid 原始字段:QueryTimeout")
private int QueryTimeout;
@JSONField(name = "TransactionQueryTimeout")
@Schema(description = "Druid 原始字段:TransactionQueryTimeout")
private int TransactionQueryTimeout;
@JSONField(name = "LoginTimeout")
@Schema(description = "Druid 原始字段:LoginTimeout")
private int LoginTimeout;
@JSONField(name = "ValidConnectionCheckerClassName")
@Schema(description = "Druid 原始字段:ValidConnectionCheckerClassName")
private String ValidConnectionCheckerClassName;
@JSONField(name = "ExceptionSorterClassName")
@Schema(description = "Druid 原始字段:ExceptionSorterClassName")
private String ExceptionSorterClassName;
@JSONField(name = "TestOnBorrow")
@Schema(description = "Druid 原始字段:TestOnBorrow")
private boolean TestOnBorrow;
@JSONField(name = "TestOnReturn")
@Schema(description = "Druid 原始字段:TestOnReturn")
private boolean TestOnReturn;
@JSONField(name = "TestWhileIdle")
@Schema(description = "Druid 原始字段:TestWhileIdle")
private boolean TestWhileIdle;
@JSONField(name = "DefaultAutoCommit")
@Schema(description = "Druid 原始字段:DefaultAutoCommit")
private boolean DefaultAutoCommit;
@JSONField(name = "DefaultReadOnly")
@Schema(description = "Druid 原始字段:DefaultReadOnly")
private Object DefaultReadOnly;
@JSONField(name = "DefaultTransactionIsolation")
@Schema(description = "Druid 原始字段:DefaultTransactionIsolation")
private Object DefaultTransactionIsolation;
@JSONField(name = "LogicConnectCount")
@Schema(description = "Druid 原始字段:LogicConnectCount")
private int LogicConnectCount;
@JSONField(name = "LogicCloseCount")
@Schema(description = "Druid 原始字段:LogicCloseCount")
private int LogicCloseCount;
@JSONField(name = "LogicConnectErrorCount")
@Schema(description = "Druid 原始字段:LogicConnectErrorCount")
private int LogicConnectErrorCount;
@JSONField(name = "PhysicalConnectCount")
@Schema(description = "Druid 原始字段:PhysicalConnectCount")
private int PhysicalConnectCount;
@JSONField(name = "PhysicalCloseCount")
@Schema(description = "Druid 原始字段:PhysicalCloseCount")
private int PhysicalCloseCount;
@JSONField(name = "PhysicalConnectErrorCount")
@Schema(description = "Druid 原始字段:PhysicalConnectErrorCount")
private int PhysicalConnectErrorCount;
@JSONField(name = "ExecuteCount")
@Schema(description = "Druid 原始字段:ExecuteCount")
private int ExecuteCount;
@JSONField(name = "ExecuteUpdateCount")
@Schema(description = "Druid 原始字段:ExecuteUpdateCount")
private int ExecuteUpdateCount;
@JSONField(name = "ExecuteQueryCount")
@Schema(description = "Druid 原始字段:ExecuteQueryCount")
private int ExecuteQueryCount;
@JSONField(name = "ExecuteBatchCount")
@Schema(description = "Druid 原始字段:ExecuteBatchCount")
private int ExecuteBatchCount;
@JSONField(name = "ErrorCount")
@Schema(description = "Druid 原始字段:ErrorCount")
private int ErrorCount;
@JSONField(name = "CommitCount")
@Schema(description = "Druid 原始字段:CommitCount")
private int CommitCount;
@JSONField(name = "RollbackCount")
@Schema(description = "Druid 原始字段:RollbackCount")
private int RollbackCount;
@JSONField(name = "PSCacheAccessCount")
@Schema(description = "Druid 原始字段:PSCacheAccessCount")
private int PSCacheAccessCount;
@JSONField(name = "PSCacheHitCount")
@Schema(description = "Druid 原始字段:PSCacheHitCount")
private int PSCacheHitCount;
@JSONField(name = "PSCacheMissCount")
@Schema(description = "Druid 原始字段:PSCacheMissCount")
private int PSCacheMissCount;
@JSONField(name = "StartTransactionCount")
@Schema(description = "Druid 原始字段:StartTransactionCount")
private int StartTransactionCount;
@JSONField(name = "RemoveAbandoned")
@Schema(description = "Druid 原始字段:RemoveAbandoned")
private boolean RemoveAbandoned;
@JSONField(name = "ClobOpenCount")
@Schema(description = "Druid 原始字段:ClobOpenCount")
private int ClobOpenCount;
@JSONField(name = "BlobOpenCount")
@Schema(description = "Druid 原始字段:BlobOpenCount")
private int BlobOpenCount;
@JSONField(name = "KeepAliveCheckCount")
@Schema(description = "Druid 原始字段:KeepAliveCheckCount")
private int KeepAliveCheckCount;
@JSONField(name = "KeepAlive")
@Schema(description = "Druid 原始字段:KeepAlive")
private boolean KeepAlive;
@JSONField(name = "FailFast")
@Schema(description = "Druid 原始字段:FailFast")
private boolean FailFast;
@JSONField(name = "MaxWait")
@Schema(description = "Druid 原始字段:MaxWait")
private int MaxWait;
@JSONField(name = "MaxWaitThreadCount")
@Schema(description = "Druid 原始字段:MaxWaitThreadCount")
private int MaxWaitThreadCount;
@JSONField(name = "PoolPreparedStatements")
@Schema(description = "Druid 原始字段:PoolPreparedStatements")
private boolean PoolPreparedStatements;
@JSONField(name = "MaxPoolPreparedStatementPerConnectionSize")
@Schema(description = "Druid 原始字段:MaxPoolPreparedStatementPerConnectionSize")
private int MaxPoolPreparedStatementPerConnectionSize;
@JSONField(name = "MinEvictableIdleTimeMillis")
@Schema(description = "Druid 原始字段:MinEvictableIdleTimeMillis")
private int MinEvictableIdleTimeMillis;
@JSONField(name = "MaxEvictableIdleTimeMillis")
@Schema(description = "Druid 原始字段:MaxEvictableIdleTimeMillis")
private int MaxEvictableIdleTimeMillis;
@JSONField(name = "LogDifferentThread")
@Schema(description = "Druid 原始字段:LogDifferentThread")
private boolean LogDifferentThread;
@JSONField(name = "RecycleErrorCount")
@Schema(description = "Druid 原始字段:RecycleErrorCount")
private int RecycleErrorCount;
@JSONField(name = "PreparedStatementOpenCount")
@Schema(description = "Druid 原始字段:PreparedStatementOpenCount")
private int PreparedStatementOpenCount;
@JSONField(name = "PreparedStatementClosedCount")
@Schema(description = "Druid 原始字段:PreparedStatementClosedCount")
private int PreparedStatementClosedCount;
@JSONField(name = "UseUnfairLock")
@Schema(description = "Druid 原始字段:UseUnfairLock")
private boolean UseUnfairLock;
@JSONField(name = "InitGlobalVariants")
@Schema(description = "Druid 原始字段:InitGlobalVariants")
private boolean InitGlobalVariants;
@JSONField(name = "InitVariants")
@Schema(description = "Druid 原始字段:InitVariants")
private boolean InitVariants;
@JSONField(name = "FilterClassNames")
@Schema(description = "Druid 原始字段:FilterClassNames")
private List<String> FilterClassNames;
@JSONField(name = "TransactionHistogram")
@Schema(description = "Druid 原始字段:TransactionHistogram")
private List<Integer> TransactionHistogram;
@JSONField(name = "ConnectionHoldTimeHistogram")
@Schema(description = "Druid 原始字段:ConnectionHoldTimeHistogram")
private List<Integer> ConnectionHoldTimeHistogram;
}
@@ -1,168 +1,175 @@
package com.pig4cloud.pigx.monitor.model.dto;
import com.alibaba.fastjson.annotation.JSONField;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* Druid SQL 监控详情响应。
* <p>
* JSON 字段名与 Druid 监控接口保持一致。
*
* @author linchtech
* @date 2020-09-16 16:18
**/
@NoArgsConstructor
@Data
@Schema(description = "Druid SQL 监控详情响应")
public class SqlDetailResult {
@JSONField(name = "ResultCode")
@Schema(description = "Druid 原始字段:ResultCode")
private int ResultCode;
@JSONField(name = "Content")
@Schema(description = "Druid 原始字段:Content")
private ContentBean Content;
/** Druid SQL 监控详情。 */
@NoArgsConstructor
@Data
@Schema(description = "Druid SQL 监控详情")
public static class ContentBean {
@JSONField(name = "ExecuteAndResultSetHoldTime")
@Schema(description = "Druid 原始字段:ExecuteAndResultSetHoldTime")
private int ExecuteAndResultSetHoldTime;
@JSONField(name = "LastErrorMessage")
@Schema(description = "Druid 原始字段:LastErrorMessage")
private Object LastErrorMessage;
@JSONField(name = "InputStreamOpenCount")
@Schema(description = "Druid 原始字段:InputStreamOpenCount")
private int InputStreamOpenCount;
@JSONField(name = "BatchSizeTotal")
@Schema(description = "Druid 原始字段:BatchSizeTotal")
private int BatchSizeTotal;
@JSONField(name = "FetchRowCountMax")
@Schema(description = "Druid 原始字段:FetchRowCountMax")
private int FetchRowCountMax;
@JSONField(name = "ErrorCount")
@Schema(description = "Druid 原始字段:ErrorCount")
private int ErrorCount;
@JSONField(name = "BatchSizeMax")
@Schema(description = "Druid 原始字段:BatchSizeMax")
private int BatchSizeMax;
@JSONField(name = "URL")
@Schema(description = "Druid 原始字段:URL")
private Object URL;
@JSONField(name = "Name")
@Schema(description = "Druid 原始字段:Name")
private Object Name;
@JSONField(name = "LastErrorTime")
@Schema(description = "Druid 原始字段:LastErrorTime")
private Object LastErrorTime;
@JSONField(name = "ReaderOpenCount")
@Schema(description = "Druid 原始字段:ReaderOpenCount")
private int ReaderOpenCount;
@JSONField(name = "parsedRelationships")
@Schema(description = "Druid 原始字段:parsedRelationships")
private String parsedRelationships;
@JSONField(name = "EffectedRowCountMax")
@Schema(description = "Druid 原始字段:EffectedRowCountMax")
private int EffectedRowCountMax;
@JSONField(name = "LastErrorClass")
@Schema(description = "Druid 原始字段:LastErrorClass")
private Object LastErrorClass;
@JSONField(name = "InTransactionCount")
@Schema(description = "Druid 原始字段:InTransactionCount")
private int InTransactionCount;
@JSONField(name = "LastErrorStackTrace")
@Schema(description = "Druid 原始字段:LastErrorStackTrace")
private Object LastErrorStackTrace;
@JSONField(name = "ResultSetHoldTime")
@Schema(description = "Druid 原始字段:ResultSetHoldTime")
private int ResultSetHoldTime;
@JSONField(name = "TotalTime")
@Schema(description = "Druid 原始字段:TotalTime")
private int TotalTime;
@JSONField(name = "ID")
@Schema(description = "Druid 原始字段:ID")
private int ID;
@JSONField(name = "ConcurrentMax")
@Schema(description = "Druid 原始字段:ConcurrentMax")
private int ConcurrentMax;
@JSONField(name = "RunningCount")
@Schema(description = "Druid 原始字段:RunningCount")
private int RunningCount;
@JSONField(name = "FetchRowCount")
@Schema(description = "Druid 原始字段:FetchRowCount")
private int FetchRowCount;
@JSONField(name = "parsedFields")
@Schema(description = "Druid 原始字段:parsedFields")
private String parsedFields;
@JSONField(name = "MaxTimespanOccurTime")
@Schema(description = "Druid 原始字段:MaxTimespanOccurTime")
private String MaxTimespanOccurTime;
@JSONField(name = "LastSlowParameters")
@Schema(description = "Druid 原始字段:LastSlowParameters")
private Object LastSlowParameters;
@JSONField(name = "ReadBytesLength")
@Schema(description = "Druid 原始字段:ReadBytesLength")
private int ReadBytesLength;
@JSONField(name = "formattedSql")
@Schema(description = "Druid 原始字段:formattedSql")
private String formattedSql;
@JSONField(name = "DbType")
@Schema(description = "Druid 原始字段:DbType")
private String DbType;
@JSONField(name = "DataSource")
@Schema(description = "Druid 原始字段:DataSource")
private Object DataSource;
@JSONField(name = "SQL")
@Schema(description = "Druid 原始字段:SQL")
private String SQL;
@JSONField(name = "HASH")
@Schema(description = "Druid 原始字段:HASH")
private long HASH;
@JSONField(name = "LastError")
@Schema(description = "Druid 原始字段:LastError")
private Object LastError;
@JSONField(name = "MaxTimespan")
@Schema(description = "Druid 原始字段:MaxTimespan")
private int MaxTimespan;
@JSONField(name = "parsedTable")
@Schema(description = "Druid 原始字段:parsedTable")
private String parsedTable;
@JSONField(name = "parsedOrderbycolumns")
@Schema(description = "Druid 原始字段:parsedOrderbycolumns")
private String parsedOrderbycolumns;
@JSONField(name = "BlobOpenCount")
@Schema(description = "Druid 原始字段:BlobOpenCount")
private int BlobOpenCount;
@JSONField(name = "ExecuteCount")
@Schema(description = "Druid 原始字段:ExecuteCount")
private int ExecuteCount;
@JSONField(name = "EffectedRowCount")
@Schema(description = "Druid 原始字段:EffectedRowCount")
private int EffectedRowCount;
@JSONField(name = "ReadStringLength")
@Schema(description = "Druid 原始字段:ReadStringLength")
private int ReadStringLength;
@JSONField(name = "File")
@Schema(description = "Druid 原始字段:File")
private Object File;
@JSONField(name = "ClobOpenCount")
@Schema(description = "Druid 原始字段:ClobOpenCount")
private int ClobOpenCount;
@JSONField(name = "LastTime")
@Schema(description = "Druid 原始字段:LastTime")
private String LastTime;
@JSONField(name = "parsedConditions")
@Schema(description = "Druid 原始字段:parsedConditions")
private String parsedConditions;
@JSONField(name = "EffectedRowCountHistogram")
@Schema(description = "Druid 原始字段:EffectedRowCountHistogram")
private List<Integer> EffectedRowCountHistogram;
@JSONField(name = "Histogram")
@Schema(description = "Druid 原始字段:Histogram")
private List<Integer> Histogram;
@JSONField(name = "ExecuteAndResultHoldTimeHistogram")
@Schema(description = "Druid 原始字段:ExecuteAndResultHoldTimeHistogram")
private List<Integer> ExecuteAndResultHoldTimeHistogram;
@JSONField(name = "FetchRowCountHistogram")
@Schema(description = "Druid 原始字段:FetchRowCountHistogram")
private List<Integer> FetchRowCountHistogram;
}
@@ -1,156 +1,166 @@
package com.pig4cloud.pigx.monitor.model.dto;
import com.alibaba.fastjson.annotation.JSONField;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* Druid SQL 监控列表响应。
* <p>
* JSON 字段名与 Druid 监控接口保持一致。
*
* @author linchtech
* @date 2020-09-16 14:37
**/
@NoArgsConstructor
@Data
@Schema(description = "Druid SQL 监控列表响应")
public class SqlListResult {
@JSONField(name = "ResultCode")
@Schema(description = "Druid 原始字段:ResultCode")
private int ResultCode;
@JSONField(name = "Content")
@Schema(description = "Druid 原始字段:Content")
private List<ContentBean> Content;
/** Druid SQL 监控列表明细。 */
@NoArgsConstructor
@Data
@Schema(description = "Druid SQL 监控列表明细")
public static class ContentBean {
@Schema(description = "服务实例 ID")
private String serviceId;
@Schema(description = "服务实例地址")
private String address;
@Schema(description = "服务实例端口")
private Integer port;
@JSONField(name = "ExecuteAndResultSetHoldTime")
@Schema(description = "Druid 原始字段:ExecuteAndResultSetHoldTime")
private int ExecuteAndResultSetHoldTime;
@JSONField(name = "LastErrorMessage")
@Schema(description = "Druid 原始字段:LastErrorMessage")
private Object LastErrorMessage;
@JSONField(name = "InputStreamOpenCount")
@Schema(description = "Druid 原始字段:InputStreamOpenCount")
private int InputStreamOpenCount;
@JSONField(name = "BatchSizeTotal")
@Schema(description = "Druid 原始字段:BatchSizeTotal")
private int BatchSizeTotal;
@JSONField(name = "FetchRowCountMax")
@Schema(description = "Druid 原始字段:FetchRowCountMax")
private int FetchRowCountMax;
@JSONField(name = "ErrorCount")
@Schema(description = "Druid 原始字段:ErrorCount")
private int ErrorCount;
@JSONField(name = "BatchSizeMax")
@Schema(description = "Druid 原始字段:BatchSizeMax")
private int BatchSizeMax;
@JSONField(name = "URL")
@Schema(description = "Druid 原始字段:URL")
private Object URL;
@JSONField(name = "Name")
@Schema(description = "Druid 原始字段:Name")
private Object Name;
@JSONField(name = "LastErrorTime")
@Schema(description = "Druid 原始字段:LastErrorTime")
private Object LastErrorTime;
@JSONField(name = "ReaderOpenCount")
@Schema(description = "Druid 原始字段:ReaderOpenCount")
private int ReaderOpenCount;
@JSONField(name = "EffectedRowCountMax")
@Schema(description = "Druid 原始字段:EffectedRowCountMax")
private int EffectedRowCountMax;
@JSONField(name = "LastErrorClass")
@Schema(description = "Druid 原始字段:LastErrorClass")
private Object LastErrorClass;
@JSONField(name = "InTransactionCount")
@Schema(description = "Druid 原始字段:InTransactionCount")
private int InTransactionCount;
@JSONField(name = "LastErrorStackTrace")
@Schema(description = "Druid 原始字段:LastErrorStackTrace")
private Object LastErrorStackTrace;
@JSONField(name = "ResultSetHoldTime")
@Schema(description = "Druid 原始字段:ResultSetHoldTime")
private int ResultSetHoldTime;
@JSONField(name = "TotalTime")
@Schema(description = "Druid 原始字段:TotalTime")
private int TotalTime;
@JSONField(name = "ID")
@Schema(description = "Druid 原始字段:ID")
private int ID;
@JSONField(name = "ConcurrentMax")
@Schema(description = "Druid 原始字段:ConcurrentMax")
private int ConcurrentMax;
@JSONField(name = "RunningCount")
@Schema(description = "Druid 原始字段:RunningCount")
private int RunningCount;
@JSONField(name = "FetchRowCount")
@Schema(description = "Druid 原始字段:FetchRowCount")
private int FetchRowCount;
@JSONField(name = "MaxTimespanOccurTime")
@Schema(description = "Druid 原始字段:MaxTimespanOccurTime")
private String MaxTimespanOccurTime;
@JSONField(name = "LastSlowParameters")
@Schema(description = "Druid 原始字段:LastSlowParameters")
private Object LastSlowParameters;
@JSONField(name = "ReadBytesLength")
@Schema(description = "Druid 原始字段:ReadBytesLength")
private int ReadBytesLength;
@JSONField(name = "DbType")
@Schema(description = "Druid 原始字段:DbType")
private String DbType;
@JSONField(name = "DataSource")
@Schema(description = "Druid 原始字段:DataSource")
private Object DataSource;
@JSONField(name = "SQL")
@Schema(description = "Druid 原始字段:SQL")
private String SQL;
@JSONField(name = "HASH")
@Schema(description = "Druid 原始字段:HASH")
private long HASH;
@JSONField(name = "LastError")
@Schema(description = "Druid 原始字段:LastError")
private Object LastError;
@JSONField(name = "MaxTimespan")
@Schema(description = "Druid 原始字段:MaxTimespan")
private int MaxTimespan;
@JSONField(name = "BlobOpenCount")
@Schema(description = "Druid 原始字段:BlobOpenCount")
private int BlobOpenCount;
@JSONField(name = "ExecuteCount")
@Schema(description = "Druid 原始字段:ExecuteCount")
private int ExecuteCount;
@JSONField(name = "EffectedRowCount")
@Schema(description = "Druid 原始字段:EffectedRowCount")
private int EffectedRowCount;
@JSONField(name = "ReadStringLength")
@Schema(description = "Druid 原始字段:ReadStringLength")
private int ReadStringLength;
@JSONField(name = "File")
@Schema(description = "Druid 原始字段:File")
private Object File;
@JSONField(name = "ClobOpenCount")
@Schema(description = "Druid 原始字段:ClobOpenCount")
private int ClobOpenCount;
@JSONField(name = "LastTime")
@Schema(description = "Druid 原始字段:LastTime")
private String LastTime;
@JSONField(name = "EffectedRowCountHistogram")
@Schema(description = "Druid 原始字段:EffectedRowCountHistogram")
private List<Integer> EffectedRowCountHistogram;
@JSONField(name = "Histogram")
@Schema(description = "Druid 原始字段:Histogram")
private List<Integer> Histogram;
@JSONField(name = "ExecuteAndResultHoldTimeHistogram")
@Schema(description = "Druid 原始字段:ExecuteAndResultHoldTimeHistogram")
private List<Integer> ExecuteAndResultHoldTimeHistogram;
@JSONField(name = "FetchRowCountHistogram")
@Schema(description = "Druid 原始字段:FetchRowCountHistogram")
private List<Integer> FetchRowCountHistogram;
}
@@ -1,6 +1,6 @@
package com.pig4cloud.pigx.monitor.model.dto;
import com.alibaba.fastjson.annotation.JSONField;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.NoArgsConstructor;
@@ -9,106 +9,119 @@ import java.util.Collections;
import java.util.List;
/**
* Druid SQL 防火墙统计响应。
* <p>
* JSON 字段名与 Druid 监控接口保持一致。
*
* @author linchtech
* @date 2020-09-17 18:18
**/
@Data
@NoArgsConstructor
@Schema(description = "Druid SQL 防火墙统计响应")
public class WallResult {
@JSONField(name = "ResultCode")
@Schema(description = "Druid 原始字段:ResultCode")
private int ResultCode;
@JSONField(name = "Content")
@Schema(description = "Druid 原始字段:Content")
private ContentBean Content = new ContentBean();
/** Druid SQL 防火墙统计内容。 */
@NoArgsConstructor
@Data
@Schema(description = "Druid SQL 防火墙统计内容")
public static class ContentBean {
@JSONField(name = "checkCount")
@Schema(description = "Druid 原始字段:checkCount")
private int checkCount;
@JSONField(name = "hardCheckCount")
@Schema(description = "Druid 原始字段:hardCheckCount")
private int hardCheckCount;
@JSONField(name = "violationCount")
@Schema(description = "Druid 原始字段:violationCount")
private int violationCount;
@JSONField(name = "violationEffectRowCount")
@Schema(description = "Druid 原始字段:violationEffectRowCount")
private int violationEffectRowCount;
@JSONField(name = "blackListHitCount")
@Schema(description = "Druid 原始字段:blackListHitCount")
private int blackListHitCount;
@JSONField(name = "blackListSize")
@Schema(description = "Druid 原始字段:blackListSize")
private int blackListSize;
@JSONField(name = "whiteListHitCount")
@Schema(description = "Druid 原始字段:whiteListHitCount")
private int whiteListHitCount;
@JSONField(name = "whiteListSize")
@Schema(description = "Druid 原始字段:whiteListSize")
private int whiteListSize;
@JSONField(name = "syntaxErrorCount")
@Schema(description = "Druid 原始字段:syntaxErrorCount")
private int syntaxErrorCount;
@JSONField(name = "tables")
@Schema(description = "Druid 原始字段:tables")
private List<TablesBean> tables = new ArrayList<>();
@JSONField(name = "functions")
@Schema(description = "Druid 原始字段:functions")
private List<FunctionsBean> functions = new ArrayList<>();
@JSONField(name = "blackList")
@Schema(description = "Druid 原始字段:blackList")
private List<Object> blackList = new ArrayList<>();
@JSONField(name = "whiteList")
@Schema(description = "Druid 原始字段:whiteList")
private List<WhiteListBean> whiteList = new ArrayList<>();
/** Druid SQL 防火墙表统计。 */
@NoArgsConstructor
@Data
@Schema(description = "Druid SQL 防火墙表统计")
public static class TablesBean {
@JSONField(name = "name")
@Schema(description = "Druid 原始字段:name")
private String name;
@JSONField(name = "selectCount")
@Schema(description = "Druid 原始字段:selectCount")
private int selectCount;
@JSONField(name = "fetchRowCount")
@Schema(description = "Druid 原始字段:fetchRowCount")
private int fetchRowCount;
@JSONField(name = "fetchRowCountHistogram")
@Schema(description = "Druid 原始字段:fetchRowCountHistogram")
private List<Integer> fetchRowCountHistogram;
}
/** Druid SQL 防火墙函数统计。 */
@NoArgsConstructor
@Data
@Schema(description = "Druid SQL 防火墙函数统计")
public static class FunctionsBean {
@JSONField(name = "name")
@Schema(description = "Druid 原始字段:name")
private String name;
@JSONField(name = "invokeCount")
@Schema(description = "Druid 原始字段:invokeCount")
private int invokeCount;
}
/** Druid SQL 防火墙白名单统计。 */
@NoArgsConstructor
@Data
@Schema(description = "Druid SQL 防火墙白名单统计")
public static class WhiteListBean {
@JSONField(name = "sql")
@Schema(description = "Druid 原始字段:sql")
private String sql;
@JSONField(name = "sample")
@Schema(description = "Druid 原始字段:sample")
private String sample;
@JSONField(name = "executeCount")
@Schema(description = "Druid 原始字段:executeCount")
private int executeCount;
@JSONField(name = "fetchRowCount")
@Schema(description = "Druid 原始字段:fetchRowCount")
private int fetchRowCount;
}
@@ -116,11 +129,17 @@ public class WallResult {
}
/**
* 累加结果
* @param wallResult 需要累加的对象
* @param sumResult 累加后的对象
* 将单个节点的 SQL 防火墙统计累加到汇总结果中。
* <p>
* {@code wallResult}、{@code sumResult} 或其 {@code Content} 为空时直接返回,不修改汇总结果。
* @param wallResult 待累加的节点统计;为 {@code null} 时忽略
* @param sumResult 累加目标;为 {@code null} 时忽略
*/
public void sum(WallResult wallResult, WallResult sumResult) {
if (wallResult == null || sumResult == null || wallResult.getContent() == null
|| sumResult.getContent() == null) {
return;
}
sumResult.getContent()
.setCheckCount(sumResult.getContent().getCheckCount() + wallResult.getContent().getCheckCount());
sumResult.getContent()
@@ -1,102 +1,109 @@
package com.pig4cloud.pigx.monitor.model.dto;
import com.alibaba.fastjson.annotation.JSONField;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* Druid Web URI 统计响应。
* <p>
* JSON 字段名与 Druid 监控接口保持一致。
*
* @author linchtech
* @date 2020-09-17 18:27
**/
@NoArgsConstructor
@Data
@Schema(description = "Druid Web URI 统计响应")
public class WebResult {
@JSONField(name = "ResultCode")
@Schema(description = "Druid 原始字段:ResultCode")
private int ResultCode;
@JSONField(name = "Content")
@Schema(description = "Druid 原始字段:Content")
private List<ContentBean> Content;
/** Druid Web URI 统计明细。 */
@NoArgsConstructor
@Data
@Schema(description = "Druid Web URI 统计明细")
public static class ContentBean {
@JSONField(name = "URI")
@Schema(description = "Druid 原始字段:URI")
private String URI;
@JSONField(name = "RunningCount")
@Schema(description = "Druid 原始字段:RunningCount")
private int RunningCount;
@JSONField(name = "ConcurrentMax")
@Schema(description = "Druid 原始字段:ConcurrentMax")
private int ConcurrentMax;
@JSONField(name = "RequestCount")
@Schema(description = "Druid 原始字段:RequestCount")
private int RequestCount;
@JSONField(name = "RequestTimeMillis")
@Schema(description = "Druid 原始字段:RequestTimeMillis")
private int RequestTimeMillis;
@JSONField(name = "ErrorCount")
@Schema(description = "Druid 原始字段:ErrorCount")
private int ErrorCount;
@JSONField(name = "LastAccessTime")
@Schema(description = "Druid 原始字段:LastAccessTime")
private String LastAccessTime;
@JSONField(name = "JdbcCommitCount")
@Schema(description = "Druid 原始字段:JdbcCommitCount")
private int JdbcCommitCount;
@JSONField(name = "JdbcRollbackCount")
@Schema(description = "Druid 原始字段:JdbcRollbackCount")
private int JdbcRollbackCount;
@JSONField(name = "JdbcExecuteCount")
@Schema(description = "Druid 原始字段:JdbcExecuteCount")
private int JdbcExecuteCount;
@JSONField(name = "JdbcExecuteErrorCount")
@Schema(description = "Druid 原始字段:JdbcExecuteErrorCount")
private int JdbcExecuteErrorCount;
@JSONField(name = "JdbcExecutePeak")
@Schema(description = "Druid 原始字段:JdbcExecutePeak")
private int JdbcExecutePeak;
@JSONField(name = "JdbcExecuteTimeMillis")
@Schema(description = "Druid 原始字段:JdbcExecuteTimeMillis")
private int JdbcExecuteTimeMillis;
@JSONField(name = "JdbcFetchRowCount")
@Schema(description = "Druid 原始字段:JdbcFetchRowCount")
private int JdbcFetchRowCount;
@JSONField(name = "JdbcFetchRowPeak")
@Schema(description = "Druid 原始字段:JdbcFetchRowPeak")
private int JdbcFetchRowPeak;
@JSONField(name = "JdbcUpdateCount")
@Schema(description = "Druid 原始字段:JdbcUpdateCount")
private int JdbcUpdateCount;
@JSONField(name = "JdbcUpdatePeak")
@Schema(description = "Druid 原始字段:JdbcUpdatePeak")
private int JdbcUpdatePeak;
@JSONField(name = "JdbcPoolConnectionOpenCount")
@Schema(description = "Druid 原始字段:JdbcPoolConnectionOpenCount")
private int JdbcPoolConnectionOpenCount;
@JSONField(name = "JdbcPoolConnectionCloseCount")
@Schema(description = "Druid 原始字段:JdbcPoolConnectionCloseCount")
private int JdbcPoolConnectionCloseCount;
@JSONField(name = "JdbcResultSetOpenCount")
@Schema(description = "Druid 原始字段:JdbcResultSetOpenCount")
private int JdbcResultSetOpenCount;
@JSONField(name = "JdbcResultSetCloseCount")
@Schema(description = "Druid 原始字段:JdbcResultSetCloseCount")
private int JdbcResultSetCloseCount;
@JSONField(name = "RequestTimeMillisMax")
@Schema(description = "Druid 原始字段:RequestTimeMillisMax")
private int RequestTimeMillisMax;
@JSONField(name = "RequestTimeMillisMaxOccurTime")
@Schema(description = "Druid 原始字段:RequestTimeMillisMaxOccurTime")
private String RequestTimeMillisMaxOccurTime;
@JSONField(name = "Histogram")
@Schema(description = "Druid 原始字段:Histogram")
private List<Integer> Histogram;
@JSONField(name = "Profiles")
@Schema(description = "Druid 原始字段:Profiles")
private List<?> Profiles;
}
@@ -1,15 +1,14 @@
package com.pig4cloud.pigx.monitor.service.impl;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONConfig;
import cn.hutool.json.JSONUtil;
import com.alibaba.druid.stat.DruidStatServiceMBean;
import com.alibaba.druid.support.http.stat.WebAppStatManager;
import com.alibaba.druid.support.json.JSONUtils;
import com.alibaba.druid.support.spring.stat.SpringStatManager;
import com.alibaba.druid.util.MapComparator;
import com.alibaba.druid.util.StringUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.pig4cloud.pigx.monitor.config.DruidMonitorConfigurer;
import com.pig4cloud.pigx.monitor.model.ServiceNode;
import com.pig4cloud.pigx.monitor.model.dto.*;
@@ -24,7 +23,9 @@ import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 分布式环境下 druid 监控数据采集,copy from https://u.nu/8-shl
* 分布式 Druid 监控数据聚合服务。
* <p>
* 负责从注册中心发现被监控实例,采集各实例的 Druid 数据并保持 Druid 控制台要求的 JSON 字段与数值类型。
*
* @author linchtech
* @date 2020-09-16 11:12
@@ -33,8 +34,10 @@ import java.util.stream.Collectors;
@Component
public class MonitorStatService implements DruidStatServiceMBean {
/** Druid 请求处理成功状态码。 */
public final static int RESULT_CODE_SUCCESS = 1;
/** Druid 请求处理失败状态码。 */
public final static int RESULT_CODE_ERROR = -1;
private final static int DEFAULT_PAGE = 1;
@@ -50,7 +53,7 @@ public class MonitorStatService implements DruidStatServiceMBean {
private static final String DEFAULT_ORDERBY = "SQL";
/**
* 以consul注册的服务的id为key,value为某个微服务节点
* 以注册中心服务实例 ID 为键,保存对应的微服务节点。
*/
public static Map<String, ServiceNode> serviceIdMap = new HashMap<>();
@@ -61,8 +64,8 @@ public class MonitorStatService implements DruidStatServiceMBean {
private DruidMonitorConfigurer.MonitorProperties monitorProperties;
/**
* 获取所有服务信息
* @return
* 获取配置范围内的全部服务节点。
* @return 以服务名、地址和端口组合值为键的服务节点映射
*/
public Map<String, ServiceNode> getAllServiceNodeMap() {
List<String> services = discoveryClient.getServices();
@@ -92,9 +95,9 @@ public class MonitorStatService implements DruidStatServiceMBean {
}
/**
* 获取指定服务名的所有节点
* @param parameters
* @return
* 获取指定服务名的全部节点。
* @param parameters Druid 请求参数,必须包含 {@code serviceName}
* @return 以服务名、地址和端口组合值为键的服务节点映射
*/
public Map<String, ServiceNode> getServiceAllNodeMap(Map<String, String> parameters) {
String requestServiceName = parameters.get("serviceName");
@@ -125,11 +128,12 @@ public class MonitorStatService implements DruidStatServiceMBean {
Function.identity(), (v1, v2) -> v2));
}
/** {@inheritDoc} */
@Override
public String service(String url) {
Map<String, String> parameters = getParameters(url);
if (url.endsWith("serviceList.json")) {
return JSON.toJSONString(monitorProperties.getApplications());
return JSONUtil.toJsonStr(monitorProperties.getApplications());
}
if (url.equals("/datasource.json")) {
@@ -203,20 +207,35 @@ public class MonitorStatService implements DruidStatServiceMBean {
return returnJSONResult(RESULT_CODE_ERROR, "Do not support this request, please contact with administrator.");
}
/**
* 将 Druid 本地监控结果包装成标准响应。
* @param resultCode Druid 响应状态码
* @param content 响应内容
* @return Druid 标准 JSON 响应
*/
public static String returnJSONResult(int resultCode, Object content) {
Map<String, Object> dataMap = new LinkedHashMap<String, Object>();
dataMap.put("ResultCode", resultCode);
dataMap.put("Content", content);
return JSONUtils.toJSONString(dataMap);
return JSONUtil.createObj(JSONConfig.create().setIgnoreNullValue(false))
.set("ResultCode", resultCode)
.set("Content", content)
.toString();
}
/**
* 聚合指定服务全部节点的 SQL 防火墙统计。
* @param parameters Druid 请求参数
* @return 聚合后的 Druid JSON 响应
*/
public String getWallStatMap(Map<String, String> parameters) {
Map<String, ServiceNode> allNodeMap = getServiceAllNodeMap(parameters);
List<WallResult> countResult = new ArrayList<>();
for (String nodeKey : allNodeMap.keySet()) {
ServiceNode serviceNode = allNodeMap.get(nodeKey);
String url = getRequestUrl(parameters, serviceNode, "/druid/wall.json");
WallResult wallResult = JSONObject.parseObject(HttpUtil.get(url), WallResult.class);
WallResult wallResult = readJson(HttpUtil.get(url), WallResult.class);
// 节点无响应或 JSON 为空时 readJson 返回 null,跳过避免聚合 NPE
if (wallResult == null) {
continue;
}
countResult.add(wallResult);
}
WallResult lastCount = new WallResult();
@@ -224,7 +243,7 @@ public class MonitorStatService implements DruidStatServiceMBean {
for (WallResult wallResult : countResult) {
lastCount.sum(wallResult, lastCount);
}
return JSON.toJSONString(lastCount);
return JSONUtil.toJsonStr(lastCount);
}
private List<Map<String, Object>> getSpringStatDataList(Map<String, String> parameters) {
@@ -232,32 +251,25 @@ public class MonitorStatService implements DruidStatServiceMBean {
return comparatorOrderBy(array, parameters);
}
@SuppressWarnings("unchecked")
private String getWebURIStatDataList(Map<String, String> parameters) {
Map<String, ServiceNode> allNodeMap = getServiceAllNodeMap(parameters);
List<Map<String, Object>> arrayMap = new ArrayList<>();
for (String nodeKey : allNodeMap.keySet()) {
ServiceNode serviceNode = allNodeMap.get(nodeKey);
String url = getRequestUrl(parameters, serviceNode, "/druid/weburi.json");
WebResult dataSourceResult = JSONObject.parseObject(HttpUtil.get(url), WebResult.class);
WebResult dataSourceResult = readJson(HttpUtil.get(url), WebResult.class);
if (dataSourceResult != null) {
List<WebResult.ContentBean> nodeContent = dataSourceResult.getContent();
if (nodeContent != null) {
for (WebResult.ContentBean contentBean : nodeContent) {
Map<String, Object> map = JSONObject.parseObject(JSONObject.toJSONString(contentBean),
Map.class);
Map<String, Object> map = JSONUtil.parseObj(contentBean);
arrayMap.add(map);
}
}
}
}
List<Map<String, Object>> maps = comparatorOrderBy(arrayMap, parameters);
String jsonString = JSON.toJSONString(maps);
JSONArray objects = JSON.parseArray(jsonString);
JSONObject jsonObject = new JSONObject();
jsonObject.put("ResultCode", RESULT_CODE_SUCCESS);
jsonObject.put("Content", objects);
return jsonObject.toJSONString();
return JSONUtil.createObj().set("ResultCode", RESULT_CODE_SUCCESS).set("Content", maps).toString();
}
private Map<String, Object> getWebURIStatData(String uri) {
@@ -283,34 +295,39 @@ public class MonitorStatService implements DruidStatServiceMBean {
}
/**
* 获取sql详情
* @param id
* @param serviceId consul获取的服务id
* @return
* 获取指定服务节点的 SQL 详情。
* @param id Druid SQL 记录 ID
* @param serviceId 注册中心服务实例 ID
* @return Druid SQL 详情 JSON
*/
private String getSqlStat(Integer id, String serviceId) {
log.info("serviceId:{}", serviceId);
ServiceNode serviceNode = serviceIdMap.get(serviceId);
String url = "http://" + serviceNode.getAddress() + ":" + serviceNode.getPort() + "/druid/sql-" + id + ".json";
SqlDetailResult sqlDetailResult = JSONObject.parseObject(HttpUtil.get(url), SqlDetailResult.class);
return JSON.toJSONString(sqlDetailResult);
SqlDetailResult sqlDetailResult = readJson(HttpUtil.get(url), SqlDetailResult.class);
return JSONUtil.toJsonStr(sqlDetailResult);
}
/**
* 获取指定数据源的活跃连接信息。
* @param id Druid 数据源 ID
* @param serviceId 注册中心服务实例 ID
* @return Druid 活跃连接信息 JSON
*/
public String getPoolingConnectionInfoByDataSourceId(Integer id, String serviceId) {
getAllServiceNodeMap();
ServiceNode serviceNode = serviceIdMap.get(serviceId);
String url = "http://" + serviceNode.getAddress() + ":" + serviceNode.getPort() + "/druid/connectionInfo-" + id
+ ".json";
ConnectionResult connectionResult = JSONObject.parseObject(HttpUtil.get(url), ConnectionResult.class);
return JSON.toJSONString(connectionResult);
ConnectionResult connectionResult = readJson(HttpUtil.get(url), ConnectionResult.class);
return JSONUtil.toJsonStr(connectionResult);
}
/**
* SQL监控列表
* @param parameters
* @return
* 聚合指定服务全部节点的 SQL 监控列表。
* @param parameters Druid 请求参数
* @return Druid SQL 监控列表 JSON
*/
@SuppressWarnings("unchecked")
public String getSqlStatDataList(Map<String, String> parameters) {
Map<String, ServiceNode> serviceAllNodeMap = getServiceAllNodeMap(parameters);
List<Map<String, Object>> arrayMap = new ArrayList<>();
@@ -319,7 +336,7 @@ public class MonitorStatService implements DruidStatServiceMBean {
String serviceName = serviceNode.getServiceName();
String url = getRequestUrl(parameters, serviceNode, "/druid/sql.json");
SqlListResult sqlListResult = JSONObject.parseObject(HttpUtil.get(url), SqlListResult.class);
SqlListResult sqlListResult = readJson(HttpUtil.get(url), SqlListResult.class);
if (sqlListResult != null) {
List<SqlListResult.ContentBean> nodeContent = sqlListResult.getContent();
if (nodeContent != null) {
@@ -328,25 +345,19 @@ public class MonitorStatService implements DruidStatServiceMBean {
contentBean.setAddress(serviceNode.getAddress());
contentBean.setPort(serviceNode.getPort());
contentBean.setServiceId(serviceNode.getId());
Map map = JSONObject.parseObject(JSONObject.toJSONString(contentBean), Map.class);
Map<String, Object> map = JSONUtil.parseObj(contentBean);
arrayMap.add(map);
}
}
}
}
List<Map<String, Object>> maps = comparatorOrderBy(arrayMap, parameters);
String jsonString = JSON.toJSONString(maps);
JSONArray objects = JSON.parseArray(jsonString);
JSONObject jsonObject = new JSONObject();
jsonObject.put("ResultCode", RESULT_CODE_SUCCESS);
jsonObject.put("Content", objects);
return jsonObject.toJSONString();
return JSONUtil.createObj().set("ResultCode", RESULT_CODE_SUCCESS).set("Content", maps).toString();
}
/**
* 数据源监控
* @param
* @return
* 聚合配置范围内全部节点的数据源监控信息。
* @return Druid 数据源监控 JSON
*/
public String getDataSourceStatData() {
Map<String, ServiceNode> allNodeMap = getAllServiceNodeMap();
@@ -358,7 +369,7 @@ public class MonitorStatService implements DruidStatServiceMBean {
String serviceName = serviceNode.getServiceName();
String url = "http://" + serviceNode.getAddress() + ":" + serviceNode.getPort() + "/druid/datasource.json";
DataSourceResult dataSourceResult = JSONObject.parseObject(HttpUtil.get(url), DataSourceResult.class);
DataSourceResult dataSourceResult = readJson(HttpUtil.get(url), DataSourceResult.class);
if (dataSourceResult != null) {
List<DataSourceResult.ContentBean> nodeContent = dataSourceResult.getContent();
@@ -372,15 +383,26 @@ public class MonitorStatService implements DruidStatServiceMBean {
}
}
lastResult.setContent(contentBeans);
return JSON.toJSONString(lastResult);
return JSONUtil.toJsonStr(lastResult);
}
/**
* 拼接url
* @param parameters
* @param serviceNode
* @param prefix
* @return
* 将 Druid JSON 解析为指定类型。
* @param content Druid JSON 文本
* @param valueType 目标类型
* @param <T> 目标类型
* @return 解析结果;输入为空时返回 {@code null}
*/
private <T> T readJson(String content, Class<T> valueType) {
return StrUtil.isBlank(content) ? null : JSONUtil.toBean(content, valueType);
}
/**
* 拼接远端 Druid 请求地址。
* @param parameters Druid 请求参数
* @param serviceNode 目标服务节点
* @param prefix Druid 接口路径
* @return 远端 Druid 请求地址
*/
private String getRequestUrl(Map<String, String> parameters, ServiceNode serviceNode, String prefix) {
StringBuilder stringBuilder = new StringBuilder("http://");
@@ -401,9 +423,9 @@ public class MonitorStatService implements DruidStatServiceMBean {
}
/**
* 处理请求参数
* @param url
* @return
* 解析 Druid 请求查询参数。
* @param url Druid 请求地址
* @return 查询参数映射;请求地址为空时返回空映射
*/
public static Map<String, String> getParameters(String url) {
if (url == null || (url = url.trim()).length() == 0) {