diff --git a/src/main/java/com/alibaba/druid/wall/WallTableStat.java b/src/main/java/com/alibaba/druid/wall/WallTableStat.java index 078c0f3e86..1d6bed3a60 100644 --- a/src/main/java/com/alibaba/druid/wall/WallTableStat.java +++ b/src/main/java/com/alibaba/druid/wall/WallTableStat.java @@ -19,57 +19,118 @@ import static com.alibaba.druid.util.JdbcSqlStatUtils.get; import java.util.LinkedHashMap; import java.util.Map; +import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; import java.util.concurrent.atomic.AtomicLongFieldUpdater; import com.alibaba.druid.support.json.JSONUtils; public class WallTableStat { - private volatile long selectCount; - private volatile long selectIntoCount; - private volatile long insertCount; - private volatile long updateCount; - private volatile long deleteCount; - private volatile long truncateCount; - private volatile long createCount; - private volatile long alterCount; - private volatile long dropCount; - private volatile long replaceCount; - private volatile long deleteDataCount; - private volatile long updateDataCount; - private volatile long insertDataCount; - private volatile long fetchRowCount; + private volatile long selectCount; + private volatile long selectIntoCount; + private volatile long insertCount; + private volatile long updateCount; + private volatile long deleteCount; + private volatile long truncateCount; + private volatile long createCount; + private volatile long alterCount; + private volatile long dropCount; + private volatile long replaceCount; + private volatile long deleteDataCount; + private volatile long updateDataCount; + private volatile long insertDataCount; + private volatile long fetchRowCount; - final static AtomicLongFieldUpdater selectCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, - "selectCount"); - final static AtomicLongFieldUpdater selectIntoCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, - "selectIntoCount"); - final static AtomicLongFieldUpdater insertCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, - "insertCount"); - final static AtomicLongFieldUpdater updateCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, - "updateCount"); - final static AtomicLongFieldUpdater deleteCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, - "deleteCount"); - final static AtomicLongFieldUpdater truncateCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, - "truncateCount"); - final static AtomicLongFieldUpdater createCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, - "createCount"); - final static AtomicLongFieldUpdater alterCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, - "alterCount"); - final static AtomicLongFieldUpdater dropCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, - "dropCount"); - final static AtomicLongFieldUpdater replaceCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, - "replaceCount"); + final static AtomicLongFieldUpdater selectCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, + "selectCount"); + final static AtomicLongFieldUpdater selectIntoCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, + "selectIntoCount"); + final static AtomicLongFieldUpdater insertCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, + "insertCount"); + final static AtomicLongFieldUpdater updateCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, + "updateCount"); + final static AtomicLongFieldUpdater deleteCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, + "deleteCount"); + final static AtomicLongFieldUpdater truncateCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, + "truncateCount"); + final static AtomicLongFieldUpdater createCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, + "createCount"); + final static AtomicLongFieldUpdater alterCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, + "alterCount"); + final static AtomicLongFieldUpdater dropCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, + "dropCount"); + final static AtomicLongFieldUpdater replaceCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, + "replaceCount"); - final static AtomicLongFieldUpdater deleteDataCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, - "deleteDataCount"); - final static AtomicLongFieldUpdater insertDataCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, - "insertDataCount"); - final static AtomicLongFieldUpdater updateDataCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, - "updateDataCount"); + final static AtomicLongFieldUpdater deleteDataCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, + "deleteDataCount"); + final static AtomicLongFieldUpdater insertDataCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, + "insertDataCount"); + final static AtomicLongFieldUpdater updateDataCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, + "updateDataCount"); - final static AtomicLongFieldUpdater fetchRowCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, - "fetchRowCount"); + final static AtomicLongFieldUpdater fetchRowCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, + "fetchRowCount"); + + private volatile long fetchRowCount_0_1; + private volatile long fetchRowCount_1_10; + private volatile long fetchRowCount_10_100; + private volatile int fetchRowCount_100_1000; + private volatile int fetchRowCount_1000_10000; + private volatile int fetchRowCount_10000_more; + + final static AtomicLongFieldUpdater fetchRowCount_0_1_Updater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, + "fetchRowCount_0_1"); + final static AtomicLongFieldUpdater fetchRowCount_1_10_Updater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, + "fetchRowCount_1_10"); + final static AtomicLongFieldUpdater fetchRowCount_10_100_Updater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, + "fetchRowCount_10_100"); + final static AtomicIntegerFieldUpdater fetchRowCount_100_1000_Updater = AtomicIntegerFieldUpdater.newUpdater(WallTableStat.class, + "fetchRowCount_100_1000"); + final static AtomicIntegerFieldUpdater fetchRowCount_1000_10000_Updater = AtomicIntegerFieldUpdater.newUpdater(WallTableStat.class, + "fetchRowCount_1000_10000"); + final static AtomicIntegerFieldUpdater fetchRowCount_10000_more_Updater = AtomicIntegerFieldUpdater.newUpdater(WallTableStat.class, + "fetchRowCount_10000_more"); + + private volatile long updateDataCount_0_1; + private volatile long updateDataCount_1_10; + private volatile long updateDataCount_10_100; + private volatile int updateDataCount_100_1000; + private volatile int updateDataCount_1000_10000; + private volatile int updateDataCount_10000_more; + + final static AtomicLongFieldUpdater updateDataCount_0_1_Updater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, + "updateDataCount_0_1"); + final static AtomicLongFieldUpdater updateDataCount_1_10_Updater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, + "updateDataCount_1_10"); + final static AtomicLongFieldUpdater updateDataCount_10_100_Updater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, + "updateDataCount_10_100"); + final static AtomicIntegerFieldUpdater updateDataCount_100_1000_Updater = AtomicIntegerFieldUpdater.newUpdater(WallTableStat.class, + "updateDataCount_100_1000"); + final static AtomicIntegerFieldUpdater updateDataCount_1000_10000_Updater = AtomicIntegerFieldUpdater.newUpdater(WallTableStat.class, + "updateDataCount_1000_10000"); + final static AtomicIntegerFieldUpdater updateDataCount_10000_more_Updater = AtomicIntegerFieldUpdater.newUpdater(WallTableStat.class, + "updateDataCount_10000_more"); + + private volatile long deleteDataCount_0_1; + private volatile long deleteDataCount_1_10; + private volatile long deleteDataCount_10_100; + private volatile int deleteDataCount_100_1000; + private volatile int deleteDataCount_1000_10000; + private volatile int deleteDataCount_10000_more; + + final static AtomicLongFieldUpdater deleteDataCount_0_1_Updater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, + "deleteDataCount_0_1"); + final static AtomicLongFieldUpdater deleteDataCount_1_10_Updater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, + "deleteDataCount_1_10"); + final static AtomicLongFieldUpdater deleteDataCount_10_100_Updater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, + "deleteDataCount_10_100"); + final static AtomicIntegerFieldUpdater deleteDataCount_100_1000_Updater = AtomicIntegerFieldUpdater.newUpdater(WallTableStat.class, + "deleteDataCount_100_1000"); + final static AtomicIntegerFieldUpdater deleteDataCount_1000_10000_Updater = AtomicIntegerFieldUpdater.newUpdater(WallTableStat.class, + "deleteDataCount_1000_10000"); + final static AtomicIntegerFieldUpdater deleteDataCount_10000_more_Updater = AtomicIntegerFieldUpdater.newUpdater(WallTableStat.class, + "deleteDataCount_10000_more"); public WallTableStat(){ @@ -119,14 +180,52 @@ public class WallTableStat { return this.deleteDataCount; } + public long[] getDeleteDataCountHistogramValues() { + return new long[] { + // + deleteDataCount_0_1, // + deleteDataCount_1_10, // + deleteDataCount_10_100, // + deleteDataCount_100_1000, // + deleteDataCount_1000_10000, // + deleteDataCount_10000_more // + }; + } + public void addDeleteDataCount(long delta) { deleteDataCountUpdater.addAndGet(this, delta); + + if (delta < 1) { + deleteDataCount_0_1_Updater.incrementAndGet(this); + } else if (delta < 10) { + deleteDataCount_1_10_Updater.incrementAndGet(this); + } else if (delta < 100) { + deleteDataCount_10_100_Updater.incrementAndGet(this); + } else if (delta < 1000) { + deleteDataCount_100_1000_Updater.incrementAndGet(this); + } else if (delta < 10000) { + deleteDataCount_1000_10000_Updater.incrementAndGet(this); + } else { + deleteDataCount_10000_more_Updater.incrementAndGet(this); + } } public long getUpdateDataCount() { return this.updateDataCount; } + public long[] getUpdateDataCountHistogramValues() { + return new long[] { + // + updateDataCount_0_1, // + updateDataCount_1_10, // + updateDataCount_10_100, // + updateDataCount_100_1000, // + updateDataCount_1000_10000, // + updateDataCount_10000_more // + }; + } + public long getInsertDataCount() { return this.insertDataCount; } @@ -137,14 +236,54 @@ public class WallTableStat { public void addUpdateDataCount(long delta) { updateDataCountUpdater.addAndGet(this, delta); + + if (delta < 1) { + updateDataCount_0_1_Updater.incrementAndGet(this); + } else if (delta < 10) { + updateDataCount_1_10_Updater.incrementAndGet(this); + } else if (delta < 100) { + updateDataCount_10_100_Updater.incrementAndGet(this); + } else if (delta < 1000) { + updateDataCount_100_1000_Updater.incrementAndGet(this); + } else if (delta < 10000) { + updateDataCount_1000_10000_Updater.incrementAndGet(this); + } else { + updateDataCount_10000_more_Updater.incrementAndGet(this); + } } public long getFetchRowCount() { return fetchRowCount; } + public long[] getFetchRowCountHistogramValues() { + return new long[] { + // + fetchRowCount_0_1, // + fetchRowCount_1_10, // + fetchRowCount_10_100, // + fetchRowCount_100_1000, // + fetchRowCount_1000_10000, // + fetchRowCount_10000_more // + }; + } + public void addFetchRowCount(long delta) { fetchRowCountUpdater.addAndGet(this, delta); + + if (delta < 1) { + fetchRowCount_0_1_Updater.incrementAndGet(this); + } else if (delta < 10) { + fetchRowCount_1_10_Updater.incrementAndGet(this); + } else if (delta < 100) { + fetchRowCount_10_100_Updater.incrementAndGet(this); + } else if (delta < 1000) { + fetchRowCount_100_1000_Updater.incrementAndGet(this); + } else if (delta < 10000) { + fetchRowCount_1000_10000_Updater.incrementAndGet(this); + } else { + fetchRowCount_10000_more_Updater.incrementAndGet(this); + } } public void addSqlTableStat(WallSqlTableStat stat) { @@ -238,6 +377,27 @@ public class WallTableStat { statValue.setFetchRowCount(get(this, fetchRowCountUpdater, reset)); statValue.setUpdateDataCount(get(this, updateDataCountUpdater, reset)); + statValue.fetchRowCount_0_1 = get(this, fetchRowCount_0_1_Updater, reset); + statValue.fetchRowCount_1_10 = get(this, fetchRowCount_1_10_Updater, reset); + statValue.fetchRowCount_10_100 = get(this, fetchRowCount_10_100_Updater, reset); + statValue.fetchRowCount_100_1000 = get(this, fetchRowCount_100_1000_Updater, reset); + statValue.fetchRowCount_1000_10000 = get(this, fetchRowCount_1000_10000_Updater, reset); + statValue.fetchRowCount_10000_more = get(this, fetchRowCount_10000_more_Updater, reset); + + statValue.updateDataCount_0_1 = get(this, updateDataCount_0_1_Updater, reset); + statValue.updateDataCount_1_10 = get(this, updateDataCount_1_10_Updater, reset); + statValue.updateDataCount_10_100 = get(this, updateDataCount_10_100_Updater, reset); + statValue.updateDataCount_100_1000 = get(this, updateDataCount_100_1000_Updater, reset); + statValue.updateDataCount_1000_10000 = get(this, updateDataCount_1000_10000_Updater, reset); + statValue.updateDataCount_10000_more = get(this, updateDataCount_10000_more_Updater, reset); + + statValue.deleteDataCount_0_1 = get(this, deleteDataCount_0_1_Updater, reset); + statValue.deleteDataCount_1_10 = get(this, deleteDataCount_1_10_Updater, reset); + statValue.deleteDataCount_10_100 = get(this, deleteDataCount_10_100_Updater, reset); + statValue.deleteDataCount_100_1000 = get(this, deleteDataCount_100_1000_Updater, reset); + statValue.deleteDataCount_1000_10000 = get(this, deleteDataCount_1000_10000_Updater, reset); + statValue.deleteDataCount_10000_more = get(this, deleteDataCount_10000_more_Updater, reset); + return statValue; } diff --git a/src/main/java/com/alibaba/druid/wall/WallTableStatValue.java b/src/main/java/com/alibaba/druid/wall/WallTableStatValue.java index 2370320f27..ed450495c0 100644 --- a/src/main/java/com/alibaba/druid/wall/WallTableStatValue.java +++ b/src/main/java/com/alibaba/druid/wall/WallTableStatValue.java @@ -70,6 +70,70 @@ public class WallTableStatValue { @MField(aggregate = AggregateType.Sum) private long fetchRowCount; + @MField(name = "f1", aggregate = AggregateType.Sum) + protected long fetchRowCount_0_1; + + @MField(name = "f10", aggregate = AggregateType.Sum) + protected long fetchRowCount_1_10; + + @MField(name = "f100", aggregate = AggregateType.Sum) + protected long fetchRowCount_10_100; + + @MField(name = "f1000", aggregate = AggregateType.Sum) + protected int fetchRowCount_100_1000; + + @MField(name = "f10000", aggregate = AggregateType.Sum) + protected int fetchRowCount_1000_10000; + + @MField(name = "fmore", aggregate = AggregateType.Sum) + protected int fetchRowCount_10000_more; + + @MField(name = "u1", aggregate = AggregateType.Sum) + protected long updateDataCount_0_1; + + @MField(name = "u10", aggregate = AggregateType.Sum) + protected long updateDataCount_1_10; + + @MField(name = "u100", aggregate = AggregateType.Sum) + protected long updateDataCount_10_100; + + @MField(name = "u1000", aggregate = AggregateType.Sum) + protected int updateDataCount_100_1000; + + @MField(name = "u10000", aggregate = AggregateType.Sum) + protected int updateDataCount_1000_10000; + + @MField(name = "umore", aggregate = AggregateType.Sum) + protected int updateDataCount_10000_more; + + @MField(name = "del_1", aggregate = AggregateType.Sum) + protected long deleteDataCount_0_1; + + @MField(name = "del_10", aggregate = AggregateType.Sum) + protected long deleteDataCount_1_10; + + @MField(name = "del_100", aggregate = AggregateType.Sum) + protected long deleteDataCount_10_100; + + @MField(name = "del_1000", aggregate = AggregateType.Sum) + protected int deleteDataCount_100_1000; + + @MField(name = "del_10000", aggregate = AggregateType.Sum) + protected int deleteDataCount_1000_10000; + + @MField(name = "del_more", aggregate = AggregateType.Sum) + protected int deleteDataCount_10000_more; + + public long[] getDeleteDataHistogram() { + return new long[] { deleteDataCount_0_1, // + deleteDataCount_1_10, // + deleteDataCount_10_100, // + deleteDataCount_100_1000, // + deleteDataCount_1000_10000, // + deleteDataCount_10000_more, // + }; + } + public WallTableStatValue(){ this(null); } @@ -78,6 +142,16 @@ public class WallTableStatValue { this.name = name; } + public long[] getFetchRowHistogram() { + return new long[] { fetchRowCount_0_1, // + fetchRowCount_1_10, // + fetchRowCount_10_100, // + fetchRowCount_100_1000, // + fetchRowCount_1000_10000, // + fetchRowCount_10000_more, // + }; + } + public long getTotalExecuteCount() { return selectCount // + selectIntoCount // @@ -190,6 +264,16 @@ public class WallTableStatValue { public long getUpdateDataCount() { return updateDataCount; } + + public long[] getUpdateDataHistogram() { + return new long[] { updateDataCount_0_1, // + updateDataCount_1_10, // + updateDataCount_10_100, // + updateDataCount_100_1000, // + updateDataCount_1000_10000, // + updateDataCount_10000_more, // + }; + } public void setUpdateDataCount(long updateDataCount) { this.updateDataCount = updateDataCount; @@ -249,12 +333,15 @@ public class WallTableStatValue { } if (deleteDataCount > 0) { map.put("deleteDataCount", deleteDataCount); + map.put("deleteDataCountHistogram", getDeleteDataHistogram()); } if (fetchRowCount > 0) { map.put("fetchRowCount", fetchRowCount); + map.put("fetchRowCountHistogram", getFetchRowHistogram()); } if (updateDataCount > 0) { map.put("updateDataCount", updateDataCount); + map.put("updateDataCountHistogram", getUpdateDataHistogram()); } return map; } diff --git a/src/main/resources/support/http/resources/wall.html b/src/main/resources/support/http/resources/wall.html index 8bc76cb505..a61b191489 100644 --- a/src/main/resources/support/http/resources/wall.html +++ b/src/main/resources/support/http/resources/wall.html @@ -77,34 +77,58 @@ TableNumber - TableName - SelectCount - SelectCount - InsertCount - UpdateCount - DeleteCount - TruncateCount - CreateCount - AlterCount - DropCount - ReplaceCount - DeleteDataCount + DeleteDataHisto
[ + - + - + - + - + - + - ] + UpdateDataCount + UpdateDataHisto
[ + - + - + - + - + - + - ] + FetchRowCount + FetchRowHisto
[ + - + - + - + - + - + - ] + @@ -221,12 +245,25 @@ + ""; html += "" + replace(table.replaceCount) + ""; - html += "" - + replace(table.deleteDataCount) + ""; - html += "" - + replace(table.updateDataCount) + ""; - html += "" - + replace(table.fetchRowCount)+ ""; + html += "" + replace(table.deleteDataCount) + ""; + if (table.deleteDataCountHistogram === undefined) { + html += ""; + } else { + html += "" + '[' + table.deleteDataCountHistogram + ']' + ""; + } + html += "" + replace(table.updateDataCount) + ""; + if (table.updateDataCountHistogram === undefined) { + html += ""; + } else { + html += "" + '[' + table.updateDataCountHistogram + ']' + ""; + } + html += "" + replace(table.fetchRowCount)+ ""; + if (table.fetchRowCountHistogram === undefined) { + html += ""; + } else { + html += "" + '[' + table.fetchRowCountHistogram + ']' + ""; + } + html += ""; } $("#dataTable1 tbody").html(html);