From 6248d60e6233406022ebde928682df6651cd9694 Mon Sep 17 00:00:00 2001 From: PIGCLOUD Date: Mon, 3 Aug 2026 08:21:16 +0800 Subject: [PATCH] =?UTF-8?q?refactor(pigx-monitor):=20=20=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=20fastjson=20=E4=BE=9D=E8=B5=96=EF=BC=8C=E6=94=B9=E7=94=A8=20h?= =?UTF-8?q?utool-json=20=E5=A4=84=E7=90=86=20JSON=20=E5=BA=8F=E5=88=97?= =?UTF-8?q?=E5=8C=96=E4=B8=8E=E5=8F=8D=E5=BA=8F=E5=88=97=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pigx-visual/pigx-monitor/pom.xml | 4 +- .../monitor/model/dto/ConnectionResult.java | 35 ++-- .../monitor/model/dto/DataSourceResult.java | 150 +++++++++--------- .../monitor/model/dto/SqlDetailResult.java | 107 +++++++------ .../pigx/monitor/model/dto/SqlListResult.java | 98 +++++++----- .../pigx/monitor/model/dto/WallResult.java | 77 +++++---- .../pigx/monitor/model/dto/WebResult.java | 63 ++++---- .../service/impl/MonitorStatService.java | 144 ++++++++++------- 8 files changed, 379 insertions(+), 299 deletions(-) diff --git a/pigx-visual/pigx-monitor/pom.xml b/pigx-visual/pigx-monitor/pom.xml index 7d7f5fd7f..8235eb48a 100644 --- a/pigx-visual/pigx-monitor/pom.xml +++ b/pigx-visual/pigx-monitor/pom.xml @@ -73,8 +73,8 @@ - com.alibaba - fastjson + cn.hutool + hutool-json diff --git a/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/model/dto/ConnectionResult.java b/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/model/dto/ConnectionResult.java index edd677825..4e2049c97 100755 --- a/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/model/dto/ConnectionResult.java +++ b/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/model/dto/ConnectionResult.java @@ -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 数据源活跃连接响应。 + *

+ * 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 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; } diff --git a/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/model/dto/DataSourceResult.java b/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/model/dto/DataSourceResult.java index 83702783e..bc8cfb267 100755 --- a/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/model/dto/DataSourceResult.java +++ b/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/model/dto/DataSourceResult.java @@ -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 数据源统计响应。 + *

+ * 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 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 FilterClassNames; - @JSONField(name = "TransactionHistogram") + @Schema(description = "Druid 原始字段:TransactionHistogram") private List TransactionHistogram; - @JSONField(name = "ConnectionHoldTimeHistogram") + @Schema(description = "Druid 原始字段:ConnectionHoldTimeHistogram") private List ConnectionHoldTimeHistogram; } diff --git a/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/model/dto/SqlDetailResult.java b/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/model/dto/SqlDetailResult.java index 1808dfcef..b7ae7405a 100755 --- a/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/model/dto/SqlDetailResult.java +++ b/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/model/dto/SqlDetailResult.java @@ -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 监控详情响应。 + *

+ * 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 EffectedRowCountHistogram; - @JSONField(name = "Histogram") + @Schema(description = "Druid 原始字段:Histogram") private List Histogram; - @JSONField(name = "ExecuteAndResultHoldTimeHistogram") + @Schema(description = "Druid 原始字段:ExecuteAndResultHoldTimeHistogram") private List ExecuteAndResultHoldTimeHistogram; - @JSONField(name = "FetchRowCountHistogram") + @Schema(description = "Druid 原始字段:FetchRowCountHistogram") private List FetchRowCountHistogram; } diff --git a/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/model/dto/SqlListResult.java b/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/model/dto/SqlListResult.java index 9034e7e23..4013bfd7e 100755 --- a/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/model/dto/SqlListResult.java +++ b/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/model/dto/SqlListResult.java @@ -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 监控列表响应。 + *

+ * 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 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 EffectedRowCountHistogram; - @JSONField(name = "Histogram") + @Schema(description = "Druid 原始字段:Histogram") private List Histogram; - @JSONField(name = "ExecuteAndResultHoldTimeHistogram") + @Schema(description = "Druid 原始字段:ExecuteAndResultHoldTimeHistogram") private List ExecuteAndResultHoldTimeHistogram; - @JSONField(name = "FetchRowCountHistogram") + @Schema(description = "Druid 原始字段:FetchRowCountHistogram") private List FetchRowCountHistogram; } diff --git a/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/model/dto/WallResult.java b/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/model/dto/WallResult.java index c449c2403..1f18c3a19 100755 --- a/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/model/dto/WallResult.java +++ b/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/model/dto/WallResult.java @@ -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 防火墙统计响应。 + *

+ * 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 tables = new ArrayList<>(); - @JSONField(name = "functions") + @Schema(description = "Druid 原始字段:functions") private List functions = new ArrayList<>(); - @JSONField(name = "blackList") + @Schema(description = "Druid 原始字段:blackList") private List blackList = new ArrayList<>(); - @JSONField(name = "whiteList") + @Schema(description = "Druid 原始字段:whiteList") private List 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 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 防火墙统计累加到汇总结果中。 + *

+ * {@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() diff --git a/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/model/dto/WebResult.java b/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/model/dto/WebResult.java index 0af8b598f..4fde72b64 100755 --- a/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/model/dto/WebResult.java +++ b/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/model/dto/WebResult.java @@ -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 统计响应。 + *

+ * 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 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 Histogram; - @JSONField(name = "Profiles") + @Schema(description = "Druid 原始字段:Profiles") private List Profiles; } diff --git a/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/service/impl/MonitorStatService.java b/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/service/impl/MonitorStatService.java index bde1e7aad..3ec96bef8 100755 --- a/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/service/impl/MonitorStatService.java +++ b/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/service/impl/MonitorStatService.java @@ -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 监控数据聚合服务。 + *

+ * 负责从注册中心发现被监控实例,采集各实例的 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 serviceIdMap = new HashMap<>(); @@ -61,8 +64,8 @@ public class MonitorStatService implements DruidStatServiceMBean { private DruidMonitorConfigurer.MonitorProperties monitorProperties; /** - * 获取所有服务信息 - * @return + * 获取配置范围内的全部服务节点。 + * @return 以服务名、地址和端口组合值为键的服务节点映射 */ public Map getAllServiceNodeMap() { List services = discoveryClient.getServices(); @@ -92,9 +95,9 @@ public class MonitorStatService implements DruidStatServiceMBean { } /** - * 获取指定服务名的所有节点 - * @param parameters - * @return + * 获取指定服务名的全部节点。 + * @param parameters Druid 请求参数,必须包含 {@code serviceName} + * @return 以服务名、地址和端口组合值为键的服务节点映射 */ public Map getServiceAllNodeMap(Map 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 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 dataMap = new LinkedHashMap(); - 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 parameters) { Map allNodeMap = getServiceAllNodeMap(parameters); List 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> getSpringStatDataList(Map parameters) { @@ -232,32 +251,25 @@ public class MonitorStatService implements DruidStatServiceMBean { return comparatorOrderBy(array, parameters); } - @SuppressWarnings("unchecked") private String getWebURIStatDataList(Map parameters) { Map allNodeMap = getServiceAllNodeMap(parameters); List> 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 nodeContent = dataSourceResult.getContent(); if (nodeContent != null) { for (WebResult.ContentBean contentBean : nodeContent) { - Map map = JSONObject.parseObject(JSONObject.toJSONString(contentBean), - Map.class); + Map map = JSONUtil.parseObj(contentBean); arrayMap.add(map); } } } } List> 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 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 parameters) { Map serviceAllNodeMap = getServiceAllNodeMap(parameters); List> 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 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 map = JSONUtil.parseObj(contentBean); arrayMap.add(map); } } } } List> 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 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 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 目标类型 + * @return 解析结果;输入为空时返回 {@code null} + */ + private T readJson(String content, Class 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 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 getParameters(String url) { if (url == null || (url = url.trim()).length() == 0) {