From 712cf474b96805948426d7a693d54fab09f98304 Mon Sep 17 00:00:00 2001 From: zhang0125 Date: Wed, 24 Aug 2022 15:42:06 +0800 Subject: [PATCH 01/27] feat(metrics): add miner and proposal metrics info --- .../tron/core/capsule/ProposalCapsule.java | 13 +++++++++++ .../tron/common/prometheus/MetricKeys.java | 2 ++ .../tron/common/prometheus/MetricLabels.java | 2 ++ .../tron/common/prometheus/MetricsGauge.java | 2 ++ .../consensus/dpos/MaintenanceManager.java | 22 +++++++++++++++++++ .../core/consensus/ProposalController.java | 2 ++ 6 files changed, 43 insertions(+) diff --git a/chainbase/src/main/java/org/tron/core/capsule/ProposalCapsule.java b/chainbase/src/main/java/org/tron/core/capsule/ProposalCapsule.java index f665705b7d6..31a483d498b 100644 --- a/chainbase/src/main/java/org/tron/core/capsule/ProposalCapsule.java +++ b/chainbase/src/main/java/org/tron/core/capsule/ProposalCapsule.java @@ -10,6 +10,8 @@ import java.util.Map; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; +import org.tron.common.prometheus.MetricKeys; +import org.tron.common.prometheus.Metrics; import org.tron.common.utils.ByteArray; import org.tron.protos.Protocol.Proposal; import org.tron.protos.Protocol.Proposal.State; @@ -166,4 +168,15 @@ public boolean hasMostApprovals(List activeWitnesses) { } return count >= activeWitnesses.size() * 7 / 10; } + + public void metrics(List activeWitnesses) { + long count = this.proposal.getApprovalsList().stream() + .filter(activeWitnesses::contains).count(); + + // metric for new proposal + proposal.getParametersMap().forEach((param, value) -> { + Metrics.gaugeSet(MetricKeys.Gauge.PROPOSAL, count, + Long.toString(param), "vote"); + }); + } } diff --git a/common/src/main/java/org/tron/common/prometheus/MetricKeys.java b/common/src/main/java/org/tron/common/prometheus/MetricKeys.java index a68f379f394..89fe58737c3 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricKeys.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricKeys.java @@ -33,6 +33,8 @@ public static class Gauge { public static final String DB_SST_LEVEL = "tron:db_sst_level"; public static final String MANAGER_QUEUE = "tron:manager_queue_size"; public static final String TX_CACHE = "tron:tx_cache"; + public static final String MINER = "tron:miner_g"; + public static final String PROPOSAL = "tron:proposal_g"; private Gauge() { throw new IllegalStateException("Gauge"); diff --git a/common/src/main/java/org/tron/common/prometheus/MetricLabels.java b/common/src/main/java/org/tron/common/prometheus/MetricLabels.java index 2aa3c1e3378..34b0afa4a7e 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricLabels.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricLabels.java @@ -22,6 +22,8 @@ public static class Counter { public static final String MINE_SUCCESS = SUCCESS; public static final String MINE_MISS = "miss"; public static final String MINE_DUP = "dup"; + public static final String MINE_NEW = "new"; + public static final String MINE_DEL = "del"; public static final String TXS_SUCCESS = SUCCESS; public static final String TXS_FAIL = FAIL; public static final String TXS_FAIL_ERROR = "error"; diff --git a/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java b/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java index dc1e5447540..d6248837faa 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java @@ -19,6 +19,8 @@ class MetricsGauge { init(MetricKeys.Gauge.DB_SIZE_BYTES, "tron db size .", "type", "db", "level"); init(MetricKeys.Gauge.DB_SST_LEVEL, "tron db files .", "type", "db", "level"); init(MetricKeys.Gauge.TX_CACHE, "tron tx cache info.", "type"); + init(MetricKeys.Gauge.MINER, "tron miner.", "miner", "type"); + init(MetricKeys.Gauge.PROPOSAL, "tron proposal.", "param", "type"); } private MetricsGauge() { diff --git a/consensus/src/main/java/org/tron/consensus/dpos/MaintenanceManager.java b/consensus/src/main/java/org/tron/consensus/dpos/MaintenanceManager.java index 012169bdb87..22ad7e35745 100644 --- a/consensus/src/main/java/org/tron/consensus/dpos/MaintenanceManager.java +++ b/consensus/src/main/java/org/tron/consensus/dpos/MaintenanceManager.java @@ -16,6 +16,10 @@ import org.bouncycastle.util.encoders.Hex; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.tron.common.prometheus.MetricKeys; +import org.tron.common.prometheus.MetricLabels; +import org.tron.common.prometheus.Metrics; +import org.tron.common.utils.StringUtil; import org.tron.consensus.ConsensusDelegate; import org.tron.consensus.pbft.PbftManager; import org.tron.core.capsule.AccountCapsule; @@ -64,6 +68,24 @@ public void applyBlock(BlockCapsule blockCapsule) { beforeMaintenanceTime = nextMaintenanceTime; doMaintenance(); updateWitnessValue(currentWitness); + + // metrics for new Witness + for (ByteString witness : currentWitness) { + if (!beforeWitness.contains(witness)) { + Metrics.counterInc(MetricKeys.Counter.MINER, 1, + StringUtil.createReadableString(witness), MetricLabels.Counter.MINE_NEW); + } + Metrics.gaugeSet(MetricKeys.Gauge.MINER, + consensusDelegate.getWitness(witness.toByteArray()).getVoteCount(), + StringUtil.createReadableString(witness), "vote"); + } + // metrics for delete Witness + for (ByteString witness : beforeWitness) { + if (!currentWitness.contains(witness)) { + Metrics.counterInc(MetricKeys.Counter.MINER, 1, + StringUtil.createReadableString(witness), MetricLabels.Counter.MINE_DEL); + } + } } consensusDelegate.updateNextMaintenanceTime(blockTime); if (blockNum != 1) { diff --git a/framework/src/main/java/org/tron/core/consensus/ProposalController.java b/framework/src/main/java/org/tron/core/consensus/ProposalController.java index 9370291da7f..bb27e05180d 100644 --- a/framework/src/main/java/org/tron/core/consensus/ProposalController.java +++ b/framework/src/main/java/org/tron/core/consensus/ProposalController.java @@ -65,6 +65,8 @@ public void processProposals() { continue; } + proposalCapsule.metrics(this.manager.getWitnessScheduleStore().getActiveWitnesses()); + proposalNum--; logger.info("Proposal has not expired, id:[{}], skip it", proposalCapsule.getID()); } From 6d946aa4e96750c14b324988e26f6a433dfd6838 Mon Sep 17 00:00:00 2001 From: zhang0125 Date: Thu, 25 Aug 2022 15:50:08 +0800 Subject: [PATCH 02/27] fix(metrics): encode miner address --- .../java/org/tron/consensus/dpos/MaintenanceManager.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/consensus/src/main/java/org/tron/consensus/dpos/MaintenanceManager.java b/consensus/src/main/java/org/tron/consensus/dpos/MaintenanceManager.java index 22ad7e35745..168cccf7e28 100644 --- a/consensus/src/main/java/org/tron/consensus/dpos/MaintenanceManager.java +++ b/consensus/src/main/java/org/tron/consensus/dpos/MaintenanceManager.java @@ -73,17 +73,17 @@ public void applyBlock(BlockCapsule blockCapsule) { for (ByteString witness : currentWitness) { if (!beforeWitness.contains(witness)) { Metrics.counterInc(MetricKeys.Counter.MINER, 1, - StringUtil.createReadableString(witness), MetricLabels.Counter.MINE_NEW); + StringUtil.encode58Check(witness.toByteArray()), MetricLabels.Counter.MINE_NEW); } Metrics.gaugeSet(MetricKeys.Gauge.MINER, consensusDelegate.getWitness(witness.toByteArray()).getVoteCount(), - StringUtil.createReadableString(witness), "vote"); + StringUtil.encode58Check(witness.toByteArray()), "vote"); } // metrics for delete Witness for (ByteString witness : beforeWitness) { if (!currentWitness.contains(witness)) { Metrics.counterInc(MetricKeys.Counter.MINER, 1, - StringUtil.createReadableString(witness), MetricLabels.Counter.MINE_DEL); + StringUtil.encode58Check(witness.toByteArray()), MetricLabels.Counter.MINE_DEL); } } } From a724946598618cbcffdaec2faa8fb616ac32091a Mon Sep 17 00:00:00 2001 From: "morgan.peng" Date: Tue, 30 Aug 2022 17:27:38 +0800 Subject: [PATCH 03/27] feat(*): add prometheus metrics 1.add prometheus metrics --- .../leveldb/LevelDbDataSourceImpl.java | 71 +++++++- .../org/tron/core/db2/core/SnapshotImpl.java | 25 ++- .../tron/core/db2/core/SnapshotManager.java | 27 +++ .../core/prometheus/exports/KhaosExports.java | 164 ++++++++++++++++++ .../tron/common/prometheus/MetricKeys.java | 9 + .../tron/common/prometheus/MetricLabels.java | 38 ++++ .../common/prometheus/MetricsCounter.java | 2 + .../tron/common/prometheus/MetricsGauge.java | 2 + .../common/prometheus/MetricsHistogram.java | 8 + .../java/org/tron/common/utils/ByteUtil.java | 8 + .../main/java/org/tron/program/FullNode.java | 17 ++ 11 files changed, 361 insertions(+), 10 deletions(-) create mode 100644 chainbase/src/main/java/org/tron/core/prometheus/exports/KhaosExports.java diff --git a/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java b/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java index 936d089573e..860b0f6be79 100644 --- a/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java +++ b/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java @@ -23,15 +23,8 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; -import java.util.Objects; -import java.util.Set; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.stream.Collectors; @@ -39,6 +32,7 @@ import java.util.stream.StreamSupport; import com.google.common.primitives.Bytes; +import io.prometheus.client.Histogram; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.iq80.leveldb.CompressionType; @@ -49,8 +43,12 @@ import org.iq80.leveldb.WriteBatch; import org.iq80.leveldb.WriteOptions; import org.tron.common.parameter.CommonParameter; +import org.tron.common.prometheus.MetricKeys; +import org.tron.common.prometheus.MetricLabels; +import org.tron.common.prometheus.Metrics; import org.tron.common.storage.WriteOptionsWrapper; import org.tron.common.storage.metric.DbStat; +import org.tron.common.utils.ByteUtil; import org.tron.common.utils.FileUtil; import org.tron.common.utils.StorageUtils; import org.tron.core.db.common.DbSourceInter; @@ -208,31 +206,48 @@ public void setDBName(String name) { @Override public byte[] getData(byte[] key) { + Histogram.Timer requestTimer = Metrics.histogramStartTimer( + MetricKeys.Histogram.DB_SERVICE_LATENCY, + getEngine(), getDBName(), MetricLabels.Histogram.DB_GET); resetDbLock.readLock().lock(); try { - return database.get(key); + byte[] result = database.get(key); + Metrics.counterInc(MetricKeys.Counter.DB_GET, 1, getEngine(),getDBName(), + Objects.isNull(result)?MetricLabels.Counter.DB_GET_MISS:MetricLabels.Counter.DB_GET_SUCCESS); + return result; } finally { resetDbLock.readLock().unlock(); + Metrics.histogramObserve(requestTimer); } } @Override public void putData(byte[] key, byte[] value) { + Histogram.Timer requestTimer = Metrics.histogramStartTimer( + MetricKeys.Histogram.DB_SERVICE_LATENCY, + getEngine(), getDBName(), MetricLabels.Histogram.DB_PUT); resetDbLock.readLock().lock(); try { database.put(key, value, writeOptions); } finally { resetDbLock.readLock().unlock(); + Metrics.histogramObserve(requestTimer); + Metrics.histogramObserve(MetricKeys.Histogram.DB_SERVICE_VALUE_BYTES, ByteUtil.getSize(value), + getEngine(),getDBName()); } } @Override public void deleteData(byte[] key) { + Histogram.Timer requestTimer = Metrics.histogramStartTimer( + MetricKeys.Histogram.DB_SERVICE_LATENCY, + getEngine(), getDBName(), MetricLabels.Histogram.DB_DEL); resetDbLock.readLock().lock(); try { database.delete(key, writeOptions); } finally { resetDbLock.readLock().unlock(); + Metrics.histogramObserve(requestTimer); } } @@ -274,6 +289,9 @@ public Set getlatestValues(long limit) { if (limit <= 0) { return Sets.newHashSet(); } + Histogram.Timer requestTimer = Metrics.histogramStartTimer( + MetricKeys.Histogram.DB_SERVICE_LATENCY, + getEngine(), getDBName(), MetricLabels.Histogram.DB_GET_LATEST_VALUES); resetDbLock.readLock().lock(); try (DBIterator iterator = getDBIterator()) { Set result = Sets.newHashSet(); @@ -291,6 +309,7 @@ public Set getlatestValues(long limit) { throw new RuntimeException(e); } finally { resetDbLock.readLock().unlock(); + Metrics.histogramObserve(requestTimer); } } @@ -298,6 +317,9 @@ public Set getValuesNext(byte[] key, long limit) { if (limit <= 0) { return Sets.newHashSet(); } + Histogram.Timer requestTimer = Metrics.histogramStartTimer( + MetricKeys.Histogram.DB_SERVICE_LATENCY, + getEngine(), getDBName(), MetricLabels.Histogram.DB_GET_VALUES_NEXT); resetDbLock.readLock().lock(); try (DBIterator iterator = getDBIterator()) { Set result = Sets.newHashSet(); @@ -310,6 +332,7 @@ public Set getValuesNext(byte[] key, long limit) { throw new RuntimeException(e); } finally { resetDbLock.readLock().unlock(); + Metrics.histogramObserve(requestTimer); } } @@ -317,6 +340,9 @@ public List getKeysNext(byte[] key, long limit) { if (limit <= 0) { return new ArrayList<>(); } + Histogram.Timer requestTimer = Metrics.histogramStartTimer( + MetricKeys.Histogram.DB_SERVICE_LATENCY, + getEngine(), getDBName(), MetricLabels.Histogram.DB_GET_KEYS_NEXT); resetDbLock.readLock().lock(); try (DBIterator iterator = getDBIterator()) { List result = new ArrayList<>(); @@ -329,6 +355,7 @@ public List getKeysNext(byte[] key, long limit) { throw new RuntimeException(e); } finally { resetDbLock.readLock().unlock(); + Metrics.histogramObserve(requestTimer); } } @@ -336,6 +363,9 @@ public Map getNext(byte[] key, long limit) { if (limit <= 0) { return Collections.emptyMap(); } + Histogram.Timer requestTimer = Metrics.histogramStartTimer( + MetricKeys.Histogram.DB_SERVICE_LATENCY, + getEngine(), getDBName(), MetricLabels.Histogram.DB_NEXT); resetDbLock.readLock().lock(); try (DBIterator iterator = getDBIterator()) { Map result = new HashMap<>(); @@ -349,11 +379,15 @@ public Map getNext(byte[] key, long limit) { throw new RuntimeException(e); } finally { resetDbLock.readLock().unlock(); + Metrics.histogramObserve(requestTimer); } } @Override public Map prefixQuery(byte[] key) { + Histogram.Timer requestTimer = Metrics.histogramStartTimer( + MetricKeys.Histogram.DB_SERVICE_LATENCY, + getEngine(), getDBName(), MetricLabels.Histogram.DB_PREFIX); resetDbLock.readLock().lock(); try (DBIterator iterator = getDBIterator()) { Map result = new HashMap<>(); @@ -370,6 +404,7 @@ public Map prefixQuery(byte[] key) { throw new RuntimeException(e); } finally { resetDbLock.readLock().unlock(); + Metrics.histogramObserve(requestTimer); } } @@ -377,6 +412,9 @@ public Set getValuesPrev(byte[] key, long limit) { if (limit <= 0) { return Sets.newHashSet(); } + Histogram.Timer requestTimer = Metrics.histogramStartTimer( + MetricKeys.Histogram.DB_SERVICE_LATENCY, + getEngine(), getDBName(), MetricLabels.Histogram.DB_GET_VALUES_PREV); resetDbLock.readLock().lock(); try (DBIterator iterator = getDBIterator()) { Set result = Sets.newHashSet(); @@ -394,11 +432,15 @@ public Set getValuesPrev(byte[] key, long limit) { throw new RuntimeException(e); } finally { resetDbLock.readLock().unlock(); + Metrics.histogramObserve(requestTimer); } } @Override public long getTotal() throws RuntimeException { + Histogram.Timer requestTimer = Metrics.histogramStartTimer( + MetricKeys.Histogram.DB_SERVICE_LATENCY, + getEngine(), getDBName(), MetricLabels.Histogram.DB_GET_TOTAL); resetDbLock.readLock().lock(); try (DBIterator iterator = getDBIterator()) { long total = 0; @@ -410,6 +452,7 @@ public long getTotal() throws RuntimeException { throw new RuntimeException(e); } finally { resetDbLock.readLock().unlock(); + Metrics.histogramObserve(requestTimer); } } @@ -433,12 +476,17 @@ private void innerBatchUpdate(Map rows, WriteBatch batch) { batch.delete(key); } else { batch.put(key, value); + Metrics.histogramObserve(MetricKeys.Histogram.DB_SERVICE_VALUE_BYTES, ByteUtil.getSize(value), + getEngine(),getDBName()); } }); } @Override public void updateByBatch(Map rows, WriteOptionsWrapper options) { + Histogram.Timer requestTimer = Metrics.histogramStartTimer( + MetricKeys.Histogram.DB_SERVICE_LATENCY, + getEngine(), getDBName(), MetricLabels.Histogram.DB_UPDATE_BY_BATCH_WITH_OPTIONS); resetDbLock.readLock().lock(); try { updateByBatchInner(rows, options.level); @@ -450,11 +498,15 @@ public void updateByBatch(Map rows, WriteOptionsWrapper options) } } finally { resetDbLock.readLock().unlock(); + Metrics.histogramObserve(requestTimer); } } @Override public void updateByBatch(Map rows) { + Histogram.Timer requestTimer = Metrics.histogramStartTimer( + MetricKeys.Histogram.DB_SERVICE_LATENCY, + getEngine(), getDBName(), MetricLabels.Histogram.DB_UPDATE_BY_BATCH); resetDbLock.readLock().lock(); try { updateByBatchInner(rows); @@ -466,6 +518,7 @@ public void updateByBatch(Map rows) { } } finally { resetDbLock.readLock().unlock(); + Metrics.histogramObserve(requestTimer); } } diff --git a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotImpl.java b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotImpl.java index 83c55c238ea..a4fcef27e40 100644 --- a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotImpl.java +++ b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotImpl.java @@ -11,7 +11,13 @@ import java.util.Map; import java.util.Objects; import java.util.Set; + +import io.prometheus.client.Histogram; import lombok.Getter; +import org.tron.common.prometheus.MetricKeys; +import org.tron.common.prometheus.MetricLabels; +import org.tron.common.prometheus.Metrics; +import org.tron.common.utils.ByteUtil; import org.tron.core.db2.common.HashDB; import org.tron.core.db2.common.Key; import org.tron.core.db2.common.Value; @@ -48,21 +54,36 @@ public byte[] get(byte[] key) { } private byte[] get(Snapshot head, byte[] key) { + Histogram.Timer requestTimer = Metrics.histogramStartTimer( + MetricKeys.Histogram.SNAPSHOT_SERVICE_LATENCY, root.getDbName(), MetricLabels.Histogram.SNAPSHOT_GET); Snapshot snapshot = head; Value value; if (isOptimized) { value = db.get(Key.of(key)); + if(Objects.nonNull(value)){ + Metrics.histogramObserve(requestTimer); + } + Metrics.counterInc(MetricKeys.Counter.SNAPSHOT_GET,1,root.getDbName(), + Objects.isNull(value) ? MetricLabels.Counter.SNAPSHOT_GET_MISS : MetricLabels.Counter.SNAPSHOT_GET_SUCCESS, + MetricLabels.Counter.SNAPSHOT_GET_NOT_REACH_ROOT); return value == null ? null: value.getBytes(); } while (Snapshot.isImpl(snapshot)) { if ((value = ((SnapshotImpl) snapshot).db.get(Key.of(key))) != null) { + Metrics.histogramObserve(requestTimer); + Metrics.counterInc(MetricKeys.Counter.SNAPSHOT_GET,1,root.getDbName(),MetricLabels.Counter.SNAPSHOT_GET_SUCCESS, + MetricLabels.Counter.SNAPSHOT_GET_NOT_REACH_ROOT); return value.getBytes(); } snapshot = snapshot.getPrevious(); } - return snapshot == null ? null : snapshot.get(key); + byte[] result = snapshot == null ? null : snapshot.get(key); + Metrics.counterInc(MetricKeys.Counter.SNAPSHOT_GET,1,root.getDbName(), + Objects.isNull(result)?MetricLabels.Counter.SNAPSHOT_GET_MISS:MetricLabels.Counter.SNAPSHOT_GET_SUCCESS, + MetricLabels.Counter.SNAPSHOT_GET_REACH_ROOT); + return result; } @Override @@ -71,6 +92,8 @@ public void put(byte[] key, byte[] value) { Preconditions.checkNotNull(value, "value in db is not null."); db.put(Key.copyOf(key), Value.copyOf(Value.Operator.PUT, value)); + Metrics.histogramObserve(MetricKeys.Histogram.SNAPSHOT_SERVICE_VALUE_BYTES, ByteUtil.getSize(value), + db.getDbName()); } @Override diff --git a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java index 7e2d8f5074a..aff272baf76 100644 --- a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java +++ b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java @@ -19,12 +19,17 @@ import java.util.concurrent.locks.LockSupport; import java.util.stream.Collectors; import javax.annotation.PostConstruct; + +import io.prometheus.client.Histogram; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.tron.common.error.TronDBException; import org.tron.common.parameter.CommonParameter; +import org.tron.common.prometheus.MetricKeys; +import org.tron.common.prometheus.MetricLabels; +import org.tron.common.prometheus.Metrics; import org.tron.common.storage.WriteOptionsWrapper; import org.tron.core.db.RevokingDatabase; import org.tron.core.db2.ISession; @@ -112,6 +117,7 @@ public synchronized ISession buildSession(boolean forceEnable) { flushCount = flushCount + (size - maxSize.get()); updateSolidity(size - maxSize.get()); size = maxSize.get(); + Metrics.gaugeSet(MetricKeys.Gauge.DB_SNAPSHOT_IMPL_LEVEL, size); flush(); } @@ -141,11 +147,13 @@ public void add(IRevokingDB db) { private void advance() { dbs.forEach(db -> db.setHead(db.getHead().advance())); ++size; + Metrics.gaugeSet(MetricKeys.Gauge.DB_SNAPSHOT_IMPL_LEVEL, size); } private void retreat() { dbs.forEach(db -> db.setHead(db.getHead().retreat())); --size; + Metrics.gaugeSet(MetricKeys.Gauge.DB_SNAPSHOT_IMPL_LEVEL, size); } public void merge() { @@ -282,6 +290,8 @@ private void refreshOne(Chainbase db) { List snapshots = new ArrayList<>(); SnapshotRoot root = (SnapshotRoot) db.getHead().getRoot(); + Histogram.Timer flushTimer = Metrics.histogramStartTimer( + MetricKeys.Histogram.CHECKPOINT_LATENCY,root.getDbName()); Snapshot next = root; for (int i = 0; i < flushCount; ++i) { next = next.getNext(); @@ -297,6 +307,7 @@ private void refreshOne(Chainbase db) { next.getNext().setPrevious(root); root.setNext(next.getNext()); } + Metrics.histogramObserve(flushTimer); } public void flush() { @@ -307,10 +318,26 @@ public void flush() { if (shouldBeRefreshed()) { try { long start = System.currentTimeMillis(); + final Histogram.Timer allTimer = Metrics.histogramStartTimer( + MetricKeys.Histogram.CHECKPOINT_LATENCY, + MetricLabels.Histogram.CHECKPOINT_TOTAL); + Histogram.Timer deleteTimer = Metrics.histogramStartTimer( + MetricKeys.Histogram.CHECKPOINT_LATENCY, + MetricLabels.Histogram.CHECKPOINT_DELETE); deleteCheckpoint(); + Metrics.histogramObserve(deleteTimer); + Histogram.Timer createTimer = Metrics.histogramStartTimer( + MetricKeys.Histogram.CHECKPOINT_LATENCY, + MetricLabels.Histogram.CHECKPOINT_CREATE); createCheckpoint(); + Metrics.histogramObserve(createTimer); long checkPointEnd = System.currentTimeMillis(); + Histogram.Timer flushTimer = Metrics.histogramStartTimer( + MetricKeys.Histogram.CHECKPOINT_LATENCY, + MetricLabels.Histogram.CHECKPOINT_FLUSH); refresh(); + Metrics.histogramObserve(flushTimer); + Metrics.histogramObserve(allTimer); flushCount = 0; logger.info("flush cost:{}, create checkpoint cost:{}, refresh cost:{}", System.currentTimeMillis() - start, diff --git a/chainbase/src/main/java/org/tron/core/prometheus/exports/KhaosExports.java b/chainbase/src/main/java/org/tron/core/prometheus/exports/KhaosExports.java new file mode 100644 index 00000000000..268ad7570af --- /dev/null +++ b/chainbase/src/main/java/org/tron/core/prometheus/exports/KhaosExports.java @@ -0,0 +1,164 @@ +package org.tron.core.prometheus.exports; + +import io.prometheus.client.Collector; +import io.prometheus.client.GaugeMetricFamily; +import io.prometheus.client.Predicate; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.core.capsule.BlockCapsule; +import org.tron.core.db.KhaosDatabase; + +import java.util.*; +import java.util.concurrent.CopyOnWriteArrayList; + +import static io.prometheus.client.SampleNameFilter.ALLOW_ALL; + +@Slf4j(topic = "metrics") +@Component +public class KhaosExports extends Collector { + + private static final String KHAOSDB_MEMORY_USAGE = "khaosdb_memory_usage"; + private static final String KHAOSDB_BLOCK_COUNT = "khaosdb_block_count"; + private static final String KHAOSDB_BRANCH_COUNT = "khaosdb_branch_count"; + + @Autowired + private KhaosDatabase khaosDb; + + @Override + public List collect() { + return collect(null); + } + + @Override + public List collect(Predicate nameFilter) { + List mfs = new ArrayList<>(); + addKhaosdbMetrics(mfs, nameFilter == null ? ALLOW_ALL : nameFilter); + return mfs; + } + + private void addKhaosdbMetrics(List sampleFamilies, Predicate nameFilter) { + if (nameFilter.test(KHAOSDB_MEMORY_USAGE)) { + sampleFamilies.add( + new GaugeMetricFamily( + KHAOSDB_MEMORY_USAGE, + "khaosdb memory usage", + calculateMemoryUse(khaosDb))); + } + + if (nameFilter.test(KHAOSDB_BLOCK_COUNT)) { + sampleFamilies.add( + new GaugeMetricFamily( + KHAOSDB_BLOCK_COUNT, + "khaosdb block count", + calculateBlockCount(khaosDb))); + } + + if (nameFilter.test(KHAOSDB_BRANCH_COUNT)) { + sampleFamilies.add( + new GaugeMetricFamily( + KHAOSDB_BRANCH_COUNT, + "khaosdb branch count", + calculateBranchCount(khaosDb))); + } + } + + private double calculateBranchCount(KhaosDatabase khaosDb) { + if (Objects.isNull(khaosDb)) { + return 0; + } + double branchCount = 0; + try { + branchCount = calculateStoreBranchCount(Optional.ofNullable(khaosDb) + .map(KhaosDatabase::getMiniStore) + .map(KhaosDatabase.KhaosStore::getNumKblkMap).orElse(null)); + return branchCount; + } catch (Exception e) { + logger.warn("calculate branch count error:", e.getMessage()); + return branchCount; + } + } + + private double calculateStoreBranchCount(LinkedHashMap> map) { + if (Objects.isNull(map)) { + return 0; + } + double branchCount = 0; + for (ArrayList list : map.values()) { + branchCount = (Objects.nonNull(list) && list.size() > branchCount) ? list.size() : branchCount; + } + return branchCount; + } + + private double calculateBlockCount(KhaosDatabase khaosDb) { + if (Objects.isNull(khaosDb)) { + return 0; + } + Double blockCount = (double) 0; + try { + blockCount += calculateStoreBlockCount(Optional.ofNullable(khaosDb) + .map(KhaosDatabase::getMiniUnlinkedStore) + .map(KhaosDatabase.KhaosStore::getNumKblkMap).orElse(null)); + blockCount += calculateStoreBlockCount(Optional.ofNullable(khaosDb) + .map(KhaosDatabase::getMiniStore) + .map(KhaosDatabase.KhaosStore::getNumKblkMap).orElse(null)); + return blockCount; + } catch (Exception e) { + logger.warn("calculate khaosdb block count failed:", e.getMessage()); + return blockCount; + } + } + + private double calculateStoreBlockCount(LinkedHashMap> map) { + if (Objects.isNull(map)) { + return 0.0; + } + double blockCount = 0.0; + for (ArrayList list : map.values()) { + new CopyOnWriteArrayList<>(list); + if (Objects.isNull(list) || list.isEmpty()) { + continue; + } + blockCount += list.size(); + } + return blockCount; + } + + private double calculateMemoryUse(KhaosDatabase khaosDb) { + if (Objects.isNull(khaosDb)) { + return 0; + } + Double memoryUse = (double) 0; + try { + memoryUse += calculateBlockMemory(Optional.ofNullable(khaosDb) + .map(KhaosDatabase::getMiniUnlinkedStore) + .map(KhaosDatabase.KhaosStore::getNumKblkMap).orElse(null)); + memoryUse += calculateBlockMemory(Optional.ofNullable(khaosDb) + .map(KhaosDatabase::getMiniStore) + .map(KhaosDatabase.KhaosStore::getNumKblkMap).orElse(null)); + return memoryUse; + } catch (Exception e) { + logger.warn("calculate khaosdb memory use failed:", e.getMessage()); + return memoryUse; + } + } + + private double calculateBlockMemory(LinkedHashMap> map) { + if (Objects.isNull(map)) { + return 0.0; + } + double memoryUse = 0.0; + for (ArrayList list : map.values()) { + if (Objects.isNull(list) || list.isEmpty()) { + continue; + } + for (KhaosDatabase.KhaosBlock block : list) { + byte[] data = Optional.ofNullable(block).map(KhaosDatabase.KhaosBlock::getBlk) + .map(BlockCapsule::getData).orElse(new byte[0]); + memoryUse += data.length; + } + } + return memoryUse; + } +} + diff --git a/common/src/main/java/org/tron/common/prometheus/MetricKeys.java b/common/src/main/java/org/tron/common/prometheus/MetricKeys.java index 89fe58737c3..5276d9a052e 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricKeys.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricKeys.java @@ -17,6 +17,9 @@ public static class Counter { public static final String P2P_ERROR = "tron:p2p_error"; public static final String P2P_DISCONNECT = "tron:p2p_disconnect"; public static final String INTERNAL_SERVICE_FAIL = "tron:internal_service_fail"; + public static final String DB_GET = "tron:db_get"; + public static final String SNAPSHOT_GET = "tron:snapshot_get"; + private Counter() { throw new IllegalStateException("Counter"); @@ -32,6 +35,7 @@ public static class Gauge { public static final String DB_SIZE_BYTES = "tron:db_size_bytes"; public static final String DB_SST_LEVEL = "tron:db_sst_level"; public static final String MANAGER_QUEUE = "tron:manager_queue_size"; + public static final String DB_SNAPSHOT_IMPL_LEVEL = "tron:db_snapshot_impl_level"; public static final String TX_CACHE = "tron:tx_cache"; public static final String MINER = "tron:miner_g"; public static final String PROPOSAL = "tron:proposal_g"; @@ -59,7 +63,12 @@ public static class Histogram { public static final String UDP_BYTES = "tron:udp_bytes"; public static final String TCP_BYTES = "tron:tcp_bytes"; public static final String HTTP_BYTES = "tron:http_bytes"; + public static final String DB_SERVICE_VALUE_BYTES = "tron:db_service_value_bytes"; + public static final String SNAPSHOT_SERVICE_VALUE_BYTES = "tron:snapshot_service_value_bytes"; + public static final String SNAPSHOT_SERVICE_LATENCY = "tron:snapshot_service_latency_seconds"; public static final String INTERNAL_SERVICE_LATENCY = "tron:internal_service_latency_seconds"; + public static final String DB_SERVICE_LATENCY = "tron:db_service_latency_seconds"; + public static final String CHECKPOINT_LATENCY = "tron:checkpoint_latency_seconds"; private Histogram() { throw new IllegalStateException("Histogram"); diff --git a/common/src/main/java/org/tron/common/prometheus/MetricLabels.java b/common/src/main/java/org/tron/common/prometheus/MetricLabels.java index 34b0afa4a7e..d176f6a0a49 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricLabels.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricLabels.java @@ -33,6 +33,13 @@ public static class Counter { public static final String TXS_FAIL_SIG = "sig"; public static final String TXS_FAIL_TAPOS = "tapos"; public static final String TXS_FAIL_DUP = "dup"; + public static final String SNAPSHOT_GET_SUCCESS = SUCCESS; + public static final String SNAPSHOT_GET_MISS = "miss"; + public static final String SNAPSHOT_GET_REACH_ROOT = "reachRoot"; + public static final String SNAPSHOT_GET_NOT_REACH_ROOT = "notReachRoot"; + public static final String DB_GET_MISS = "miss"; + public static final String DB_GET_SUCCESS = SUCCESS; + private Counter() { throw new IllegalStateException("Counter"); @@ -71,6 +78,37 @@ public static class Histogram { public static final String TRAFFIC_IN = "in"; public static final String TRAFFIC_OUT = "out"; + public static final String DB_GET = "get"; + public static final String DB_PUT = "put"; + public static final String DB_DEL = "del"; + public static final String DB_NEXT = "next"; + public static final String DB_BATCH = "batch"; + public static final String DB_PREFIX = "prefix"; + public static final String DB_GET_LATEST_VALUES = "getLatestValues"; + public static final String DB_GET_VALUES_NEXT = "getValuesNext"; + public static final String DB_GET_KEYS_NEXT = "getKeysNext"; + public static final String DB_GET_VALUES_PREV = "getValuesPrev"; + public static final String DB_GET_TOTAL = "getTotal"; + public static final String DB_UPDATE_BY_BATCH_INNER = "updateByBatchInner"; + public static final String DB_UPDATE_BY_BATCH_INNER_WITH_OPTIONS = "updateByBatchInnerWithOptions"; + public static final String DB_INNER_BATCH_UPDATE = "innerBatchUpdate"; + public static final String DB_UPDATE_BY_BATCH_WITH_OPTIONS = "updateByBatchWithOptions"; + public static final String DB_UPDATE_BY_BATCH = "updateByBatch"; + + public static final String SNAPSHOT_GET = "get"; + public static final String SNAPSHOT_PUT = "put"; + + + + + + + + public static final String CHECKPOINT_CREATE = "create"; + public static final String CHECKPOINT_DELETE = "delete"; + public static final String CHECKPOINT_FLUSH = "flush"; + public static final String CHECKPOINT_TOTAL = "total"; + private Histogram() { throw new IllegalStateException("Histogram"); } diff --git a/common/src/main/java/org/tron/common/prometheus/MetricsCounter.java b/common/src/main/java/org/tron/common/prometheus/MetricsCounter.java index 6acdf23b3bc..a626ee68ff2 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricsCounter.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricsCounter.java @@ -18,6 +18,8 @@ class MetricsCounter { init(MetricKeys.Counter.P2P_DISCONNECT, "tron p2p disconnect .", "type"); init(MetricKeys.Counter.INTERNAL_SERVICE_FAIL, "internal Service fail.", "class", "method"); + init(MetricKeys.Counter.DB_GET, "tron db get data.", "type", "db", "result"); + init(MetricKeys.Counter.SNAPSHOT_GET,"tron snapshot get data.","db","result","reachRoot"); } private MetricsCounter() { diff --git a/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java b/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java index d6248837faa..153d77f7221 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java @@ -21,6 +21,8 @@ class MetricsGauge { init(MetricKeys.Gauge.TX_CACHE, "tron tx cache info.", "type"); init(MetricKeys.Gauge.MINER, "tron miner.", "miner", "type"); init(MetricKeys.Gauge.PROPOSAL, "tron proposal.", "param", "type"); + init(MetricKeys.Gauge.DB_SNAPSHOT_IMPL_LEVEL, "tron db snapshotImpl level depth."); + } private MetricsGauge() { diff --git a/common/src/main/java/org/tron/common/prometheus/MetricsHistogram.java b/common/src/main/java/org/tron/common/prometheus/MetricsHistogram.java index 92be90eb65e..76010c491a1 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricsHistogram.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricsHistogram.java @@ -41,6 +41,14 @@ public class MetricsHistogram { "type"); init(MetricKeys.Histogram.HTTP_BYTES, "http_bytes traffic.", "url", "status"); + init(MetricKeys.Histogram.DB_SERVICE_LATENCY, "db service latency.", + "type", "db", "op"); + init(MetricKeys.Histogram.CHECKPOINT_LATENCY, "checkpoint flush latency.", + "type"); + init(MetricKeys.Histogram.DB_SERVICE_VALUE_BYTES, "db service value bytes.", + "type","db"); + init(MetricKeys.Histogram.SNAPSHOT_SERVICE_VALUE_BYTES, "snapshot value bytes.","db"); + init(MetricKeys.Histogram.SNAPSHOT_SERVICE_LATENCY,"snapshot service latency","db","op"); } private MetricsHistogram() { diff --git a/common/src/main/java/org/tron/common/utils/ByteUtil.java b/common/src/main/java/org/tron/common/utils/ByteUtil.java index 54d637d3f01..f2bc5a62c55 100644 --- a/common/src/main/java/org/tron/common/utils/ByteUtil.java +++ b/common/src/main/java/org/tron/common/utils/ByteUtil.java @@ -27,6 +27,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Objects; import java.util.zip.DataFormatException; import java.util.zip.Deflater; import java.util.zip.Inflater; @@ -513,4 +514,11 @@ public static byte[] decompress(byte[] data) throws IOException, DataFormatExcep return output; } + public static int getSize(byte[] data){ + if(Objects.isNull(data)){ + return 0; + } + return data.length; + } + } diff --git a/framework/src/main/java/org/tron/program/FullNode.java b/framework/src/main/java/org/tron/program/FullNode.java index 03a0eef8e72..80aedbfa457 100644 --- a/framework/src/main/java/org/tron/program/FullNode.java +++ b/framework/src/main/java/org/tron/program/FullNode.java @@ -2,6 +2,7 @@ import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.joran.JoranConfigurator; +import io.prometheus.client.CollectorRegistry; import java.io.File; import lombok.extern.slf4j.Slf4j; import org.slf4j.LoggerFactory; @@ -14,6 +15,7 @@ import org.tron.core.Constant; import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; +import org.tron.core.prometheus.exports.KhaosExports; import org.tron.core.services.RpcApiService; import org.tron.core.services.http.FullNodeHttpApiService; import org.tron.core.services.interfaceJsonRpcOnPBFT.JsonRpcServiceOnPBFT; @@ -81,6 +83,9 @@ public static void main(String[] args) { Application appT = ApplicationFactory.create(context); shutdown(appT); + //init prometheus metrics + initPrometheusMetrics(context); + // grpc api server RpcApiService rpcApiService = context.getBean(RpcApiService.class); appT.addService(rpcApiService); @@ -141,6 +146,18 @@ public static void main(String[] args) { rpcApiService.blockUntilShutdown(); } + private static void initPrometheusMetrics(TronApplicationContext context) { + try { + if (!CommonParameter.getInstance().isMetricsPrometheusEnable()) { + return; + } + KhaosExports khaosExports = context.getBean(KhaosExports.class); + khaosExports.register(CollectorRegistry.defaultRegistry); + } catch (Exception e) { + logger.warn("init prometheus failed:", e.getMessage()); + } + } + public static void shutdown(final Application app) { logger.info("********register application shutdown hook********"); Runtime.getRuntime().addShutdownHook(new Thread(app::shutdown)); From 64f2674bd94095996af17cd2ea7013fd6db9623b Mon Sep 17 00:00:00 2001 From: "morgan.peng" Date: Wed, 31 Aug 2022 17:24:49 +0800 Subject: [PATCH 04/27] feat(*): add prometheus metrics 1.add prometheus metrics --- .../storage/leveldb/LevelDbDataSourceImpl.java | 18 +++++++++++++----- .../org/tron/core/db2/core/SnapshotImpl.java | 4 ++-- .../tron/core/db2/core/SnapshotManager.java | 5 ++--- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java b/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java index 860b0f6be79..1a33b256c30 100644 --- a/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java +++ b/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java @@ -23,8 +23,15 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.Map.Entry; +import java.util.Objects; +import java.util.Set; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.stream.Collectors; @@ -212,8 +219,9 @@ public byte[] getData(byte[] key) { resetDbLock.readLock().lock(); try { byte[] result = database.get(key); - Metrics.counterInc(MetricKeys.Counter.DB_GET, 1, getEngine(),getDBName(), - Objects.isNull(result)?MetricLabels.Counter.DB_GET_MISS:MetricLabels.Counter.DB_GET_SUCCESS); + Metrics.counterInc(MetricKeys.Counter.DB_GET, 1, getEngine(), getDBName(), + Objects.isNull(result) ? MetricLabels.Counter.DB_GET_MISS + : MetricLabels.Counter.DB_GET_SUCCESS); return result; } finally { resetDbLock.readLock().unlock(); @@ -233,7 +241,7 @@ public void putData(byte[] key, byte[] value) { resetDbLock.readLock().unlock(); Metrics.histogramObserve(requestTimer); Metrics.histogramObserve(MetricKeys.Histogram.DB_SERVICE_VALUE_BYTES, ByteUtil.getSize(value), - getEngine(),getDBName()); + getEngine(), getDBName()); } } @@ -477,7 +485,7 @@ private void innerBatchUpdate(Map rows, WriteBatch batch) { } else { batch.put(key, value); Metrics.histogramObserve(MetricKeys.Histogram.DB_SERVICE_VALUE_BYTES, ByteUtil.getSize(value), - getEngine(),getDBName()); + getEngine(), getDBName()); } }); } diff --git a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotImpl.java b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotImpl.java index a4fcef27e40..c18d972ed61 100644 --- a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotImpl.java +++ b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotImpl.java @@ -60,10 +60,10 @@ private byte[] get(Snapshot head, byte[] key) { Value value; if (isOptimized) { value = db.get(Key.of(key)); - if(Objects.nonNull(value)){ + if(Objects.nonNull(value)) { Metrics.histogramObserve(requestTimer); } - Metrics.counterInc(MetricKeys.Counter.SNAPSHOT_GET,1,root.getDbName(), + Metrics.counterInc(MetricKeys.Counter.SNAPSHOT_GET, 1, root.getDbName(), Objects.isNull(value) ? MetricLabels.Counter.SNAPSHOT_GET_MISS : MetricLabels.Counter.SNAPSHOT_GET_SUCCESS, MetricLabels.Counter.SNAPSHOT_GET_NOT_REACH_ROOT); return value == null ? null: value.getBytes(); diff --git a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java index aff272baf76..6ab372b7c5b 100644 --- a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java +++ b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java @@ -19,7 +19,6 @@ import java.util.concurrent.locks.LockSupport; import java.util.stream.Collectors; import javax.annotation.PostConstruct; - import io.prometheus.client.Histogram; import lombok.Getter; import lombok.Setter; @@ -290,8 +289,8 @@ private void refreshOne(Chainbase db) { List snapshots = new ArrayList<>(); SnapshotRoot root = (SnapshotRoot) db.getHead().getRoot(); - Histogram.Timer flushTimer = Metrics.histogramStartTimer( - MetricKeys.Histogram.CHECKPOINT_LATENCY,root.getDbName()); + final Histogram.Timer flushTimer = Metrics.histogramStartTimer( + MetricKeys.Histogram.CHECKPOINT_LATENCY, root.getDbName()); Snapshot next = root; for (int i = 0; i < flushCount; ++i) { next = next.getNext(); From bbc44c5a6b8a8ed382134336321c3cc8d1293395 Mon Sep 17 00:00:00 2001 From: zhang0125 Date: Thu, 2 Feb 2023 18:17:45 +0800 Subject: [PATCH 05/27] feat(metrics): add metrics for contract factor --- .../java/org/tron/core/vm/program/Program.java | 18 +++++++++++++++--- .../org/tron/common/prometheus/MetricKeys.java | 3 +++ .../tron/common/prometheus/MetricsGauge.java | 2 ++ .../main/java/org/tron/program/FullNode.java | 3 +-- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/vm/program/Program.java b/actuator/src/main/java/org/tron/core/vm/program/Program.java index 3a0aaf21f70..a7b5e6ce6a1 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/Program.java +++ b/actuator/src/main/java/org/tron/core/vm/program/Program.java @@ -17,7 +17,6 @@ import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; - import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; @@ -28,10 +27,13 @@ import org.bouncycastle.util.encoders.Hex; import org.tron.common.crypto.Hash; import org.tron.common.parameter.CommonParameter; +import org.tron.common.prometheus.MetricKeys; +import org.tron.common.prometheus.Metrics; import org.tron.common.runtime.InternalTransaction; import org.tron.common.runtime.ProgramResult; import org.tron.common.runtime.vm.DataWord; import org.tron.common.utils.BIUtil; +import org.tron.common.utils.Base58; import org.tron.common.utils.ByteUtil; import org.tron.common.utils.FastByteComparisons; import org.tron.common.utils.Utils; @@ -2232,13 +2234,23 @@ public long updateContextContractFactor() { contractState.getDynamicPropertiesStore().getCurrentCycleNumber()); contractState.updateContractState(getContextAddress(), contractStateCapsule); } else { + long oldEnergyFactor = contractStateCapsule.getEnergyFactor(); + String contractAddress = Base58.encode(getContextAddress()); + if (contractStateCapsule.getEnergyUsage() > VMConfig.getDynamicEnergyThreshold() / 10) { + Metrics.gaugeSet(MetricKeys.Gauge.CONTRACT_USAGE, + contractStateCapsule.getEnergyUsage(), contractAddress); + } + if (contractStateCapsule.catchUpToCycle( contractState.getDynamicPropertiesStore().getCurrentCycleNumber(), VMConfig.getDynamicEnergyThreshold(), VMConfig.getDynamicEnergyIncreaseFactor(), VMConfig.getDynamicEnergyMaxFactor())) { - contractState.updateContractState(getContextAddress(), contractStateCapsule - ); + contractState.updateContractState(getContextAddress(), contractStateCapsule); + if (contractStateCapsule.getEnergyFactor() != oldEnergyFactor) { + Metrics.gaugeSet(MetricKeys.Gauge.CONTRACT_FACTOR, + contractStateCapsule.getEnergyFactor(), contractAddress); + } } } contextContractFactor = contractStateCapsule.getEnergyFactor() diff --git a/common/src/main/java/org/tron/common/prometheus/MetricKeys.java b/common/src/main/java/org/tron/common/prometheus/MetricKeys.java index ad5f021a2bd..3916b716719 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricKeys.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricKeys.java @@ -40,6 +40,9 @@ public static class Gauge { public static final String MINER = "tron:miner_g"; public static final String PROPOSAL = "tron:proposal_g"; + public static final String CONTRACT_FACTOR = "tron:contract_factor_g"; + public static final String CONTRACT_USAGE = "tron:contract_usage_g"; + private Gauge() { throw new IllegalStateException("Gauge"); } diff --git a/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java b/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java index 153d77f7221..cbc2e98b938 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java @@ -22,6 +22,8 @@ class MetricsGauge { init(MetricKeys.Gauge.MINER, "tron miner.", "miner", "type"); init(MetricKeys.Gauge.PROPOSAL, "tron proposal.", "param", "type"); init(MetricKeys.Gauge.DB_SNAPSHOT_IMPL_LEVEL, "tron db snapshotImpl level depth."); + init(MetricKeys.Gauge.CONTRACT_FACTOR, "tron contract energy factor.", "contract"); + init(MetricKeys.Gauge.CONTRACT_USAGE, "tron contract energy usage.", "contract"); } diff --git a/framework/src/main/java/org/tron/program/FullNode.java b/framework/src/main/java/org/tron/program/FullNode.java index dedf713ed10..d5c0bfc53f5 100644 --- a/framework/src/main/java/org/tron/program/FullNode.java +++ b/framework/src/main/java/org/tron/program/FullNode.java @@ -2,8 +2,8 @@ import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.joran.JoranConfigurator; -import io.prometheus.client.CollectorRegistry; import com.beust.jcommander.JCommander; +import io.prometheus.client.CollectorRegistry; import java.io.File; import lombok.extern.slf4j.Slf4j; import org.slf4j.LoggerFactory; @@ -16,7 +16,6 @@ import org.tron.core.Constant; import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.net.P2pEventHandlerImpl; import org.tron.core.prometheus.exports.KhaosExports; import org.tron.core.services.RpcApiService; import org.tron.core.services.http.FullNodeHttpApiService; From e743ae398ee6e76eb2d43311434366763012dba6 Mon Sep 17 00:00:00 2001 From: zhang0125 Date: Fri, 3 Feb 2023 11:01:43 +0800 Subject: [PATCH 06/27] Revert "feat(*): add prometheus metrics" This reverts commit 64f2674b --- .../storage/leveldb/LevelDbDataSourceImpl.java | 18 +++++------------- .../tron/core/db2/core/SnapshotManager.java | 4 ++-- 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java b/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java index 24d6a147756..0b81c18a90c 100644 --- a/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java +++ b/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java @@ -23,15 +23,8 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; -import java.util.Objects; -import java.util.Set; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.stream.Collectors; @@ -207,9 +200,8 @@ public byte[] getData(byte[] key) { resetDbLock.readLock().lock(); try { byte[] result = database.get(key); - Metrics.counterInc(MetricKeys.Counter.DB_GET, 1, getEngine(), getDBName(), - Objects.isNull(result) ? MetricLabels.Counter.DB_GET_MISS - : MetricLabels.Counter.DB_GET_SUCCESS); + Metrics.counterInc(MetricKeys.Counter.DB_GET, 1, getEngine(),getDBName(), + Objects.isNull(result)?MetricLabels.Counter.DB_GET_MISS:MetricLabels.Counter.DB_GET_SUCCESS); return result; } finally { resetDbLock.readLock().unlock(); @@ -229,7 +221,7 @@ public void putData(byte[] key, byte[] value) { resetDbLock.readLock().unlock(); Metrics.histogramObserve(requestTimer); Metrics.histogramObserve(MetricKeys.Histogram.DB_SERVICE_VALUE_BYTES, ByteUtil.getSize(value), - getEngine(), getDBName()); + getEngine(),getDBName()); } } @@ -473,7 +465,7 @@ private void innerBatchUpdate(Map rows, WriteBatch batch) { } else { batch.put(key, value); Metrics.histogramObserve(MetricKeys.Histogram.DB_SERVICE_VALUE_BYTES, ByteUtil.getSize(value), - getEngine(), getDBName()); + getEngine(),getDBName()); } }); } diff --git a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java index 919f9746b89..a2b9c1c8005 100644 --- a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java +++ b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java @@ -334,8 +334,8 @@ private void refreshOne(Chainbase db) { List snapshots = new ArrayList<>(); SnapshotRoot root = (SnapshotRoot) db.getHead().getRoot(); - final Histogram.Timer flushTimer = Metrics.histogramStartTimer( - MetricKeys.Histogram.CHECKPOINT_LATENCY, root.getDbName()); + Histogram.Timer flushTimer = Metrics.histogramStartTimer( + MetricKeys.Histogram.CHECKPOINT_LATENCY,root.getDbName()); Snapshot next = root; for (int i = 0; i < flushCount; ++i) { next = next.getNext(); From 5de291332bb18369ce3121e651ca4854d0bdd289 Mon Sep 17 00:00:00 2001 From: zhang0125 Date: Fri, 3 Feb 2023 11:06:05 +0800 Subject: [PATCH 07/27] Revert "feat(*): add prometheus metrics" This reverts commit a7249465 --- .../leveldb/LevelDbDataSourceImpl.java | 95 +--------- .../org/tron/core/db2/core/SnapshotImpl.java | 19 +- .../tron/core/db2/core/SnapshotManager.java | 25 --- .../core/prometheus/exports/KhaosExports.java | 164 ------------------ .../tron/common/prometheus/MetricKeys.java | 9 - .../tron/common/prometheus/MetricLabels.java | 38 ---- .../common/prometheus/MetricsCounter.java | 2 - .../tron/common/prometheus/MetricsGauge.java | 1 - .../common/prometheus/MetricsHistogram.java | 8 - .../java/org/tron/common/utils/ByteUtil.java | 8 - .../main/java/org/tron/program/FullNode.java | 17 -- 11 files changed, 10 insertions(+), 376 deletions(-) delete mode 100644 chainbase/src/main/java/org/tron/core/prometheus/exports/KhaosExports.java diff --git a/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java b/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java index 0b81c18a90c..54df4946297 100644 --- a/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java +++ b/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java @@ -23,8 +23,15 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.Map.Entry; +import java.util.Objects; +import java.util.Set; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.stream.Collectors; @@ -32,7 +39,6 @@ import java.util.stream.StreamSupport; import com.google.common.primitives.Bytes; -import io.prometheus.client.Histogram; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.iq80.leveldb.CompressionType; @@ -45,12 +51,8 @@ import org.iq80.leveldb.WriteOptions; import org.slf4j.LoggerFactory; import org.tron.common.parameter.CommonParameter; -import org.tron.common.prometheus.MetricKeys; -import org.tron.common.prometheus.MetricLabels; -import org.tron.common.prometheus.Metrics; import org.tron.common.storage.WriteOptionsWrapper; import org.tron.common.storage.metric.DbStat; -import org.tron.common.utils.ByteUtil; import org.tron.common.utils.FileUtil; import org.tron.common.utils.StorageUtils; import org.tron.core.db.common.DbSourceInter; @@ -194,48 +196,31 @@ public void setDBName(String name) { @Override public byte[] getData(byte[] key) { - Histogram.Timer requestTimer = Metrics.histogramStartTimer( - MetricKeys.Histogram.DB_SERVICE_LATENCY, - getEngine(), getDBName(), MetricLabels.Histogram.DB_GET); resetDbLock.readLock().lock(); try { - byte[] result = database.get(key); - Metrics.counterInc(MetricKeys.Counter.DB_GET, 1, getEngine(),getDBName(), - Objects.isNull(result)?MetricLabels.Counter.DB_GET_MISS:MetricLabels.Counter.DB_GET_SUCCESS); - return result; + return database.get(key); } finally { resetDbLock.readLock().unlock(); - Metrics.histogramObserve(requestTimer); } } @Override public void putData(byte[] key, byte[] value) { - Histogram.Timer requestTimer = Metrics.histogramStartTimer( - MetricKeys.Histogram.DB_SERVICE_LATENCY, - getEngine(), getDBName(), MetricLabels.Histogram.DB_PUT); resetDbLock.readLock().lock(); try { database.put(key, value, writeOptions); } finally { resetDbLock.readLock().unlock(); - Metrics.histogramObserve(requestTimer); - Metrics.histogramObserve(MetricKeys.Histogram.DB_SERVICE_VALUE_BYTES, ByteUtil.getSize(value), - getEngine(),getDBName()); } } @Override public void deleteData(byte[] key) { - Histogram.Timer requestTimer = Metrics.histogramStartTimer( - MetricKeys.Histogram.DB_SERVICE_LATENCY, - getEngine(), getDBName(), MetricLabels.Histogram.DB_DEL); resetDbLock.readLock().lock(); try { database.delete(key, writeOptions); } finally { resetDbLock.readLock().unlock(); - Metrics.histogramObserve(requestTimer); } } @@ -277,9 +262,6 @@ public Set getlatestValues(long limit) { if (limit <= 0) { return Sets.newHashSet(); } - Histogram.Timer requestTimer = Metrics.histogramStartTimer( - MetricKeys.Histogram.DB_SERVICE_LATENCY, - getEngine(), getDBName(), MetricLabels.Histogram.DB_GET_LATEST_VALUES); resetDbLock.readLock().lock(); try (DBIterator iterator = getDBIterator()) { Set result = Sets.newHashSet(); @@ -297,7 +279,6 @@ public Set getlatestValues(long limit) { throw new RuntimeException(e); } finally { resetDbLock.readLock().unlock(); - Metrics.histogramObserve(requestTimer); } } @@ -305,9 +286,6 @@ public Set getValuesNext(byte[] key, long limit) { if (limit <= 0) { return Sets.newHashSet(); } - Histogram.Timer requestTimer = Metrics.histogramStartTimer( - MetricKeys.Histogram.DB_SERVICE_LATENCY, - getEngine(), getDBName(), MetricLabels.Histogram.DB_GET_VALUES_NEXT); resetDbLock.readLock().lock(); try (DBIterator iterator = getDBIterator()) { Set result = Sets.newHashSet(); @@ -320,7 +298,6 @@ public Set getValuesNext(byte[] key, long limit) { throw new RuntimeException(e); } finally { resetDbLock.readLock().unlock(); - Metrics.histogramObserve(requestTimer); } } @@ -328,9 +305,6 @@ public List getKeysNext(byte[] key, long limit) { if (limit <= 0) { return new ArrayList<>(); } - Histogram.Timer requestTimer = Metrics.histogramStartTimer( - MetricKeys.Histogram.DB_SERVICE_LATENCY, - getEngine(), getDBName(), MetricLabels.Histogram.DB_GET_KEYS_NEXT); resetDbLock.readLock().lock(); try (DBIterator iterator = getDBIterator()) { List result = new ArrayList<>(); @@ -343,7 +317,6 @@ public List getKeysNext(byte[] key, long limit) { throw new RuntimeException(e); } finally { resetDbLock.readLock().unlock(); - Metrics.histogramObserve(requestTimer); } } @@ -351,9 +324,6 @@ public Map getNext(byte[] key, long limit) { if (limit <= 0) { return Collections.emptyMap(); } - Histogram.Timer requestTimer = Metrics.histogramStartTimer( - MetricKeys.Histogram.DB_SERVICE_LATENCY, - getEngine(), getDBName(), MetricLabels.Histogram.DB_NEXT); resetDbLock.readLock().lock(); try (DBIterator iterator = getDBIterator()) { Map result = new HashMap<>(); @@ -367,15 +337,11 @@ public Map getNext(byte[] key, long limit) { throw new RuntimeException(e); } finally { resetDbLock.readLock().unlock(); - Metrics.histogramObserve(requestTimer); } } @Override public Map prefixQuery(byte[] key) { - Histogram.Timer requestTimer = Metrics.histogramStartTimer( - MetricKeys.Histogram.DB_SERVICE_LATENCY, - getEngine(), getDBName(), MetricLabels.Histogram.DB_PREFIX); resetDbLock.readLock().lock(); try (DBIterator iterator = getDBIterator()) { Map result = new HashMap<>(); @@ -392,43 +358,11 @@ public Map prefixQuery(byte[] key) { throw new RuntimeException(e); } finally { resetDbLock.readLock().unlock(); - Metrics.histogramObserve(requestTimer); - } - } - - public Set getValuesPrev(byte[] key, long limit) { - if (limit <= 0) { - return Sets.newHashSet(); - } - Histogram.Timer requestTimer = Metrics.histogramStartTimer( - MetricKeys.Histogram.DB_SERVICE_LATENCY, - getEngine(), getDBName(), MetricLabels.Histogram.DB_GET_VALUES_PREV); - resetDbLock.readLock().lock(); - try (DBIterator iterator = getDBIterator()) { - Set result = Sets.newHashSet(); - long i = 0; - byte[] data = getData(key); - if (Objects.nonNull(data)) { - result.add(data); - i++; - } - for (iterator.seek(key); iterator.hasPrev() && i++ < limit; iterator.prev()) { - result.add(iterator.peekPrev().getValue()); - } - return result; - } catch (IOException e) { - throw new RuntimeException(e); - } finally { - resetDbLock.readLock().unlock(); - Metrics.histogramObserve(requestTimer); } } @Override public long getTotal() throws RuntimeException { - Histogram.Timer requestTimer = Metrics.histogramStartTimer( - MetricKeys.Histogram.DB_SERVICE_LATENCY, - getEngine(), getDBName(), MetricLabels.Histogram.DB_GET_TOTAL); resetDbLock.readLock().lock(); try (DBIterator iterator = getDBIterator()) { long total = 0; @@ -440,7 +374,6 @@ public long getTotal() throws RuntimeException { throw new RuntimeException(e); } finally { resetDbLock.readLock().unlock(); - Metrics.histogramObserve(requestTimer); } } @@ -464,17 +397,12 @@ private void innerBatchUpdate(Map rows, WriteBatch batch) { batch.delete(key); } else { batch.put(key, value); - Metrics.histogramObserve(MetricKeys.Histogram.DB_SERVICE_VALUE_BYTES, ByteUtil.getSize(value), - getEngine(),getDBName()); } }); } @Override public void updateByBatch(Map rows, WriteOptionsWrapper options) { - Histogram.Timer requestTimer = Metrics.histogramStartTimer( - MetricKeys.Histogram.DB_SERVICE_LATENCY, - getEngine(), getDBName(), MetricLabels.Histogram.DB_UPDATE_BY_BATCH_WITH_OPTIONS); resetDbLock.readLock().lock(); try { updateByBatchInner(rows, options.level); @@ -486,15 +414,11 @@ public void updateByBatch(Map rows, WriteOptionsWrapper options) } } finally { resetDbLock.readLock().unlock(); - Metrics.histogramObserve(requestTimer); } } @Override public void updateByBatch(Map rows) { - Histogram.Timer requestTimer = Metrics.histogramStartTimer( - MetricKeys.Histogram.DB_SERVICE_LATENCY, - getEngine(), getDBName(), MetricLabels.Histogram.DB_UPDATE_BY_BATCH); resetDbLock.readLock().lock(); try { updateByBatchInner(rows); @@ -506,7 +430,6 @@ public void updateByBatch(Map rows) { } } finally { resetDbLock.readLock().unlock(); - Metrics.histogramObserve(requestTimer); } } diff --git a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotImpl.java b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotImpl.java index 03b304dfbce..ae8073f668b 100644 --- a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotImpl.java +++ b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotImpl.java @@ -11,13 +11,7 @@ import java.util.Map; import java.util.Objects; import java.util.Set; - -import io.prometheus.client.Histogram; import lombok.Getter; -import org.tron.common.prometheus.MetricKeys; -import org.tron.common.prometheus.MetricLabels; -import org.tron.common.prometheus.Metrics; -import org.tron.common.utils.ByteUtil; import org.tron.core.db2.common.HashDB; import org.tron.core.db2.common.Key; import org.tron.core.db2.common.Value; @@ -44,26 +38,17 @@ public byte[] get(byte[] key) { } private byte[] get(Snapshot head, byte[] key) { - Histogram.Timer requestTimer = Metrics.histogramStartTimer( - MetricKeys.Histogram.SNAPSHOT_SERVICE_LATENCY, root.getDbName(), MetricLabels.Histogram.SNAPSHOT_GET); Snapshot snapshot = head; Value value; while (Snapshot.isImpl(snapshot)) { if ((value = ((SnapshotImpl) snapshot).db.get(Key.of(key))) != null) { - Metrics.histogramObserve(requestTimer); - Metrics.counterInc(MetricKeys.Counter.SNAPSHOT_GET,1,root.getDbName(),MetricLabels.Counter.SNAPSHOT_GET_SUCCESS, - MetricLabels.Counter.SNAPSHOT_GET_NOT_REACH_ROOT); return value.getBytes(); } snapshot = snapshot.getPrevious(); } - byte[] result = snapshot == null ? null : snapshot.get(key); - Metrics.counterInc(MetricKeys.Counter.SNAPSHOT_GET,1,root.getDbName(), - Objects.isNull(result)?MetricLabels.Counter.SNAPSHOT_GET_MISS:MetricLabels.Counter.SNAPSHOT_GET_SUCCESS, - MetricLabels.Counter.SNAPSHOT_GET_REACH_ROOT); - return result; + return snapshot == null ? null : snapshot.get(key); } @Override @@ -72,8 +57,6 @@ public void put(byte[] key, byte[] value) { Preconditions.checkNotNull(value, "value in db is not null."); db.put(Key.copyOf(key), Value.copyOf(Value.Operator.PUT, value)); - Metrics.histogramObserve(MetricKeys.Histogram.SNAPSHOT_SERVICE_VALUE_BYTES, ByteUtil.getSize(value), - db.getDbName()); } @Override diff --git a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java index a2b9c1c8005..2a8113b04f1 100644 --- a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java +++ b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java @@ -32,9 +32,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.tron.common.error.TronDBException; import org.tron.common.parameter.CommonParameter; -import org.tron.common.prometheus.MetricKeys; -import org.tron.common.prometheus.MetricLabels; -import org.tron.common.prometheus.Metrics; import org.tron.common.storage.WriteOptionsWrapper; import org.tron.common.utils.FileUtil; import org.tron.common.utils.StorageUtils; @@ -156,7 +153,6 @@ public synchronized ISession buildSession(boolean forceEnable) { flushCount = flushCount + (size - maxSize.get()); updateSolidity(size - maxSize.get()); size = maxSize.get(); - Metrics.gaugeSet(MetricKeys.Gauge.DB_SNAPSHOT_IMPL_LEVEL, size); flush(); } @@ -186,13 +182,11 @@ public void add(IRevokingDB db) { private void advance() { dbs.forEach(db -> db.setHead(db.getHead().advance())); ++size; - Metrics.gaugeSet(MetricKeys.Gauge.DB_SNAPSHOT_IMPL_LEVEL, size); } private void retreat() { dbs.forEach(db -> db.setHead(db.getHead().retreat())); --size; - Metrics.gaugeSet(MetricKeys.Gauge.DB_SNAPSHOT_IMPL_LEVEL, size); } public void merge() { @@ -334,8 +328,6 @@ private void refreshOne(Chainbase db) { List snapshots = new ArrayList<>(); SnapshotRoot root = (SnapshotRoot) db.getHead().getRoot(); - Histogram.Timer flushTimer = Metrics.histogramStartTimer( - MetricKeys.Histogram.CHECKPOINT_LATENCY,root.getDbName()); Snapshot next = root; for (int i = 0; i < flushCount; ++i) { next = next.getNext(); @@ -351,7 +343,6 @@ private void refreshOne(Chainbase db) { next.getNext().setPrevious(root); root.setNext(next.getNext()); } - Metrics.histogramObserve(flushTimer); } public void flush() { @@ -362,28 +353,12 @@ public void flush() { if (shouldBeRefreshed()) { try { long start = System.currentTimeMillis(); - final Histogram.Timer allTimer = Metrics.histogramStartTimer( - MetricKeys.Histogram.CHECKPOINT_LATENCY, - MetricLabels.Histogram.CHECKPOINT_TOTAL); - Histogram.Timer deleteTimer = Metrics.histogramStartTimer( - MetricKeys.Histogram.CHECKPOINT_LATENCY, - MetricLabels.Histogram.CHECKPOINT_DELETE); if (!isV2Open()) { deleteCheckpoint(); } - Metrics.histogramObserve(deleteTimer); - Histogram.Timer createTimer = Metrics.histogramStartTimer( - MetricKeys.Histogram.CHECKPOINT_LATENCY, - MetricLabels.Histogram.CHECKPOINT_CREATE); createCheckpoint(); - Metrics.histogramObserve(createTimer); long checkPointEnd = System.currentTimeMillis(); - Histogram.Timer flushTimer = Metrics.histogramStartTimer( - MetricKeys.Histogram.CHECKPOINT_LATENCY, - MetricLabels.Histogram.CHECKPOINT_FLUSH); refresh(); - Metrics.histogramObserve(flushTimer); - Metrics.histogramObserve(allTimer); flushCount = 0; logger.info("Flush cost: {} ms, create checkpoint cost: {} ms, refresh cost: {} ms.", System.currentTimeMillis() - start, diff --git a/chainbase/src/main/java/org/tron/core/prometheus/exports/KhaosExports.java b/chainbase/src/main/java/org/tron/core/prometheus/exports/KhaosExports.java deleted file mode 100644 index 268ad7570af..00000000000 --- a/chainbase/src/main/java/org/tron/core/prometheus/exports/KhaosExports.java +++ /dev/null @@ -1,164 +0,0 @@ -package org.tron.core.prometheus.exports; - -import io.prometheus.client.Collector; -import io.prometheus.client.GaugeMetricFamily; -import io.prometheus.client.Predicate; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.tron.core.capsule.BlockCapsule; -import org.tron.core.db.KhaosDatabase; - -import java.util.*; -import java.util.concurrent.CopyOnWriteArrayList; - -import static io.prometheus.client.SampleNameFilter.ALLOW_ALL; - -@Slf4j(topic = "metrics") -@Component -public class KhaosExports extends Collector { - - private static final String KHAOSDB_MEMORY_USAGE = "khaosdb_memory_usage"; - private static final String KHAOSDB_BLOCK_COUNT = "khaosdb_block_count"; - private static final String KHAOSDB_BRANCH_COUNT = "khaosdb_branch_count"; - - @Autowired - private KhaosDatabase khaosDb; - - @Override - public List collect() { - return collect(null); - } - - @Override - public List collect(Predicate nameFilter) { - List mfs = new ArrayList<>(); - addKhaosdbMetrics(mfs, nameFilter == null ? ALLOW_ALL : nameFilter); - return mfs; - } - - private void addKhaosdbMetrics(List sampleFamilies, Predicate nameFilter) { - if (nameFilter.test(KHAOSDB_MEMORY_USAGE)) { - sampleFamilies.add( - new GaugeMetricFamily( - KHAOSDB_MEMORY_USAGE, - "khaosdb memory usage", - calculateMemoryUse(khaosDb))); - } - - if (nameFilter.test(KHAOSDB_BLOCK_COUNT)) { - sampleFamilies.add( - new GaugeMetricFamily( - KHAOSDB_BLOCK_COUNT, - "khaosdb block count", - calculateBlockCount(khaosDb))); - } - - if (nameFilter.test(KHAOSDB_BRANCH_COUNT)) { - sampleFamilies.add( - new GaugeMetricFamily( - KHAOSDB_BRANCH_COUNT, - "khaosdb branch count", - calculateBranchCount(khaosDb))); - } - } - - private double calculateBranchCount(KhaosDatabase khaosDb) { - if (Objects.isNull(khaosDb)) { - return 0; - } - double branchCount = 0; - try { - branchCount = calculateStoreBranchCount(Optional.ofNullable(khaosDb) - .map(KhaosDatabase::getMiniStore) - .map(KhaosDatabase.KhaosStore::getNumKblkMap).orElse(null)); - return branchCount; - } catch (Exception e) { - logger.warn("calculate branch count error:", e.getMessage()); - return branchCount; - } - } - - private double calculateStoreBranchCount(LinkedHashMap> map) { - if (Objects.isNull(map)) { - return 0; - } - double branchCount = 0; - for (ArrayList list : map.values()) { - branchCount = (Objects.nonNull(list) && list.size() > branchCount) ? list.size() : branchCount; - } - return branchCount; - } - - private double calculateBlockCount(KhaosDatabase khaosDb) { - if (Objects.isNull(khaosDb)) { - return 0; - } - Double blockCount = (double) 0; - try { - blockCount += calculateStoreBlockCount(Optional.ofNullable(khaosDb) - .map(KhaosDatabase::getMiniUnlinkedStore) - .map(KhaosDatabase.KhaosStore::getNumKblkMap).orElse(null)); - blockCount += calculateStoreBlockCount(Optional.ofNullable(khaosDb) - .map(KhaosDatabase::getMiniStore) - .map(KhaosDatabase.KhaosStore::getNumKblkMap).orElse(null)); - return blockCount; - } catch (Exception e) { - logger.warn("calculate khaosdb block count failed:", e.getMessage()); - return blockCount; - } - } - - private double calculateStoreBlockCount(LinkedHashMap> map) { - if (Objects.isNull(map)) { - return 0.0; - } - double blockCount = 0.0; - for (ArrayList list : map.values()) { - new CopyOnWriteArrayList<>(list); - if (Objects.isNull(list) || list.isEmpty()) { - continue; - } - blockCount += list.size(); - } - return blockCount; - } - - private double calculateMemoryUse(KhaosDatabase khaosDb) { - if (Objects.isNull(khaosDb)) { - return 0; - } - Double memoryUse = (double) 0; - try { - memoryUse += calculateBlockMemory(Optional.ofNullable(khaosDb) - .map(KhaosDatabase::getMiniUnlinkedStore) - .map(KhaosDatabase.KhaosStore::getNumKblkMap).orElse(null)); - memoryUse += calculateBlockMemory(Optional.ofNullable(khaosDb) - .map(KhaosDatabase::getMiniStore) - .map(KhaosDatabase.KhaosStore::getNumKblkMap).orElse(null)); - return memoryUse; - } catch (Exception e) { - logger.warn("calculate khaosdb memory use failed:", e.getMessage()); - return memoryUse; - } - } - - private double calculateBlockMemory(LinkedHashMap> map) { - if (Objects.isNull(map)) { - return 0.0; - } - double memoryUse = 0.0; - for (ArrayList list : map.values()) { - if (Objects.isNull(list) || list.isEmpty()) { - continue; - } - for (KhaosDatabase.KhaosBlock block : list) { - byte[] data = Optional.ofNullable(block).map(KhaosDatabase.KhaosBlock::getBlk) - .map(BlockCapsule::getData).orElse(new byte[0]); - memoryUse += data.length; - } - } - return memoryUse; - } -} - diff --git a/common/src/main/java/org/tron/common/prometheus/MetricKeys.java b/common/src/main/java/org/tron/common/prometheus/MetricKeys.java index 3916b716719..e98311bcf10 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricKeys.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricKeys.java @@ -17,9 +17,6 @@ public static class Counter { public static final String P2P_ERROR = "tron:p2p_error"; public static final String P2P_DISCONNECT = "tron:p2p_disconnect"; public static final String INTERNAL_SERVICE_FAIL = "tron:internal_service_fail"; - public static final String DB_GET = "tron:db_get"; - public static final String SNAPSHOT_GET = "tron:snapshot_get"; - private Counter() { throw new IllegalStateException("Counter"); @@ -35,7 +32,6 @@ public static class Gauge { public static final String DB_SIZE_BYTES = "tron:db_size_bytes"; public static final String DB_SST_LEVEL = "tron:db_sst_level"; public static final String MANAGER_QUEUE = "tron:manager_queue_size"; - public static final String DB_SNAPSHOT_IMPL_LEVEL = "tron:db_snapshot_impl_level"; public static final String TX_CACHE = "tron:tx_cache"; public static final String MINER = "tron:miner_g"; public static final String PROPOSAL = "tron:proposal_g"; @@ -66,12 +62,7 @@ public static class Histogram { public static final String UDP_BYTES = "tron:udp_bytes"; public static final String TCP_BYTES = "tron:tcp_bytes"; public static final String HTTP_BYTES = "tron:http_bytes"; - public static final String DB_SERVICE_VALUE_BYTES = "tron:db_service_value_bytes"; - public static final String SNAPSHOT_SERVICE_VALUE_BYTES = "tron:snapshot_service_value_bytes"; - public static final String SNAPSHOT_SERVICE_LATENCY = "tron:snapshot_service_latency_seconds"; public static final String INTERNAL_SERVICE_LATENCY = "tron:internal_service_latency_seconds"; - public static final String DB_SERVICE_LATENCY = "tron:db_service_latency_seconds"; - public static final String CHECKPOINT_LATENCY = "tron:checkpoint_latency_seconds"; public static final String MESSAGE_PROCESS_LATENCY = "tron:message_process_latency_seconds"; public static final String BLOCK_FETCH_LATENCY = "tron:block_fetch_latency_seconds"; public static final String BLOCK_RECEIVE_DELAY = "tron:block_receive_delay_seconds"; diff --git a/common/src/main/java/org/tron/common/prometheus/MetricLabels.java b/common/src/main/java/org/tron/common/prometheus/MetricLabels.java index d176f6a0a49..34b0afa4a7e 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricLabels.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricLabels.java @@ -33,13 +33,6 @@ public static class Counter { public static final String TXS_FAIL_SIG = "sig"; public static final String TXS_FAIL_TAPOS = "tapos"; public static final String TXS_FAIL_DUP = "dup"; - public static final String SNAPSHOT_GET_SUCCESS = SUCCESS; - public static final String SNAPSHOT_GET_MISS = "miss"; - public static final String SNAPSHOT_GET_REACH_ROOT = "reachRoot"; - public static final String SNAPSHOT_GET_NOT_REACH_ROOT = "notReachRoot"; - public static final String DB_GET_MISS = "miss"; - public static final String DB_GET_SUCCESS = SUCCESS; - private Counter() { throw new IllegalStateException("Counter"); @@ -78,37 +71,6 @@ public static class Histogram { public static final String TRAFFIC_IN = "in"; public static final String TRAFFIC_OUT = "out"; - public static final String DB_GET = "get"; - public static final String DB_PUT = "put"; - public static final String DB_DEL = "del"; - public static final String DB_NEXT = "next"; - public static final String DB_BATCH = "batch"; - public static final String DB_PREFIX = "prefix"; - public static final String DB_GET_LATEST_VALUES = "getLatestValues"; - public static final String DB_GET_VALUES_NEXT = "getValuesNext"; - public static final String DB_GET_KEYS_NEXT = "getKeysNext"; - public static final String DB_GET_VALUES_PREV = "getValuesPrev"; - public static final String DB_GET_TOTAL = "getTotal"; - public static final String DB_UPDATE_BY_BATCH_INNER = "updateByBatchInner"; - public static final String DB_UPDATE_BY_BATCH_INNER_WITH_OPTIONS = "updateByBatchInnerWithOptions"; - public static final String DB_INNER_BATCH_UPDATE = "innerBatchUpdate"; - public static final String DB_UPDATE_BY_BATCH_WITH_OPTIONS = "updateByBatchWithOptions"; - public static final String DB_UPDATE_BY_BATCH = "updateByBatch"; - - public static final String SNAPSHOT_GET = "get"; - public static final String SNAPSHOT_PUT = "put"; - - - - - - - - public static final String CHECKPOINT_CREATE = "create"; - public static final String CHECKPOINT_DELETE = "delete"; - public static final String CHECKPOINT_FLUSH = "flush"; - public static final String CHECKPOINT_TOTAL = "total"; - private Histogram() { throw new IllegalStateException("Histogram"); } diff --git a/common/src/main/java/org/tron/common/prometheus/MetricsCounter.java b/common/src/main/java/org/tron/common/prometheus/MetricsCounter.java index a626ee68ff2..6acdf23b3bc 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricsCounter.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricsCounter.java @@ -18,8 +18,6 @@ class MetricsCounter { init(MetricKeys.Counter.P2P_DISCONNECT, "tron p2p disconnect .", "type"); init(MetricKeys.Counter.INTERNAL_SERVICE_FAIL, "internal Service fail.", "class", "method"); - init(MetricKeys.Counter.DB_GET, "tron db get data.", "type", "db", "result"); - init(MetricKeys.Counter.SNAPSHOT_GET,"tron snapshot get data.","db","result","reachRoot"); } private MetricsCounter() { diff --git a/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java b/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java index cbc2e98b938..779542fd734 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java @@ -21,7 +21,6 @@ class MetricsGauge { init(MetricKeys.Gauge.TX_CACHE, "tron tx cache info.", "type"); init(MetricKeys.Gauge.MINER, "tron miner.", "miner", "type"); init(MetricKeys.Gauge.PROPOSAL, "tron proposal.", "param", "type"); - init(MetricKeys.Gauge.DB_SNAPSHOT_IMPL_LEVEL, "tron db snapshotImpl level depth."); init(MetricKeys.Gauge.CONTRACT_FACTOR, "tron contract energy factor.", "contract"); init(MetricKeys.Gauge.CONTRACT_USAGE, "tron contract energy usage.", "contract"); diff --git a/common/src/main/java/org/tron/common/prometheus/MetricsHistogram.java b/common/src/main/java/org/tron/common/prometheus/MetricsHistogram.java index 64f31e3438e..10cbf1d2979 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricsHistogram.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricsHistogram.java @@ -41,14 +41,6 @@ public class MetricsHistogram { "type"); init(MetricKeys.Histogram.HTTP_BYTES, "http_bytes traffic.", "url", "status"); - init(MetricKeys.Histogram.DB_SERVICE_LATENCY, "db service latency.", - "type", "db", "op"); - init(MetricKeys.Histogram.CHECKPOINT_LATENCY, "checkpoint flush latency.", - "type"); - init(MetricKeys.Histogram.DB_SERVICE_VALUE_BYTES, "db service value bytes.", - "type","db"); - init(MetricKeys.Histogram.SNAPSHOT_SERVICE_VALUE_BYTES, "snapshot value bytes.","db"); - init(MetricKeys.Histogram.SNAPSHOT_SERVICE_LATENCY,"snapshot service latency","db","op"); init(MetricKeys.Histogram.MESSAGE_PROCESS_LATENCY, "process message latency.", "type"); init(MetricKeys.Histogram.BLOCK_FETCH_LATENCY, "fetch block latency."); diff --git a/common/src/main/java/org/tron/common/utils/ByteUtil.java b/common/src/main/java/org/tron/common/utils/ByteUtil.java index f2bc5a62c55..54d637d3f01 100644 --- a/common/src/main/java/org/tron/common/utils/ByteUtil.java +++ b/common/src/main/java/org/tron/common/utils/ByteUtil.java @@ -27,7 +27,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Objects; import java.util.zip.DataFormatException; import java.util.zip.Deflater; import java.util.zip.Inflater; @@ -514,11 +513,4 @@ public static byte[] decompress(byte[] data) throws IOException, DataFormatExcep return output; } - public static int getSize(byte[] data){ - if(Objects.isNull(data)){ - return 0; - } - return data.length; - } - } diff --git a/framework/src/main/java/org/tron/program/FullNode.java b/framework/src/main/java/org/tron/program/FullNode.java index d5c0bfc53f5..32898f6bb20 100644 --- a/framework/src/main/java/org/tron/program/FullNode.java +++ b/framework/src/main/java/org/tron/program/FullNode.java @@ -3,7 +3,6 @@ import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.joran.JoranConfigurator; import com.beust.jcommander.JCommander; -import io.prometheus.client.CollectorRegistry; import java.io.File; import lombok.extern.slf4j.Slf4j; import org.slf4j.LoggerFactory; @@ -16,7 +15,6 @@ import org.tron.core.Constant; import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.prometheus.exports.KhaosExports; import org.tron.core.services.RpcApiService; import org.tron.core.services.http.FullNodeHttpApiService; import org.tron.core.services.interfaceJsonRpcOnPBFT.JsonRpcServiceOnPBFT; @@ -84,9 +82,6 @@ public static void main(String[] args) { Application appT = ApplicationFactory.create(context); shutdown(appT); - //init prometheus metrics - initPrometheusMetrics(context); - // grpc api server RpcApiService rpcApiService = context.getBean(RpcApiService.class); appT.addService(rpcApiService); @@ -143,18 +138,6 @@ public static void main(String[] args) { rpcApiService.blockUntilShutdown(); } - private static void initPrometheusMetrics(TronApplicationContext context) { - try { - if (!CommonParameter.getInstance().isMetricsPrometheusEnable()) { - return; - } - KhaosExports khaosExports = context.getBean(KhaosExports.class); - khaosExports.register(CollectorRegistry.defaultRegistry); - } catch (Exception e) { - logger.warn("init prometheus failed:", e.getMessage()); - } - } - public static void shutdown(final Application app) { logger.info("********register application shutdown hook********"); Runtime.getRuntime().addShutdownHook(new Thread(app::shutdown)); From 3e7db6572bf209f45dbece4ac18bb7c424cf99fb Mon Sep 17 00:00:00 2001 From: zhang0125 Date: Mon, 6 Feb 2023 11:38:08 +0800 Subject: [PATCH 08/27] fix(metrics): fix contract address error --- actuator/src/main/java/org/tron/core/vm/program/Program.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/actuator/src/main/java/org/tron/core/vm/program/Program.java b/actuator/src/main/java/org/tron/core/vm/program/Program.java index a7b5e6ce6a1..9f6866ca528 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/Program.java +++ b/actuator/src/main/java/org/tron/core/vm/program/Program.java @@ -36,6 +36,7 @@ import org.tron.common.utils.Base58; import org.tron.common.utils.ByteUtil; import org.tron.common.utils.FastByteComparisons; +import org.tron.common.utils.StringUtil; import org.tron.common.utils.Utils; import org.tron.common.utils.WalletUtil; import org.tron.core.ChainBaseManager; @@ -2235,7 +2236,7 @@ public long updateContextContractFactor() { contractState.updateContractState(getContextAddress(), contractStateCapsule); } else { long oldEnergyFactor = contractStateCapsule.getEnergyFactor(); - String contractAddress = Base58.encode(getContextAddress()); + String contractAddress = StringUtil.encode58Check(getContextAddress()); if (contractStateCapsule.getEnergyUsage() > VMConfig.getDynamicEnergyThreshold() / 10) { Metrics.gaugeSet(MetricKeys.Gauge.CONTRACT_USAGE, contractStateCapsule.getEnergyUsage(), contractAddress); From 73f83e3b899016faad6fb6c52fe56c7864b41166 Mon Sep 17 00:00:00 2001 From: zhang0125 Date: Mon, 6 Feb 2023 16:47:10 +0800 Subject: [PATCH 09/27] feat(metrics): add contract actual usage --- .../src/main/java/org/tron/core/vm/VM.java | 1 + .../org/tron/core/vm/program/Program.java | 20 ++++++++++++++++--- .../core/capsule/ContractStateCapsule.java | 12 +++++++++++ .../tron/common/prometheus/MetricsGauge.java | 2 +- .../protos/core/contract/smart_contract.proto | 1 + 5 files changed, 32 insertions(+), 4 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/vm/VM.java b/actuator/src/main/java/org/tron/core/vm/VM.java index 2150df04c64..60d8b183321 100644 --- a/actuator/src/main/java/org/tron/core/vm/VM.java +++ b/actuator/src/main/java/org/tron/core/vm/VM.java @@ -72,6 +72,7 @@ public static void play(Program program, JumpTable jumpTable) { } program.spendEnergyWithPenalty(energy, penalty, opName); + program.addContextContractActualUsage(energy); } else { program.spendEnergy(energy, opName); } diff --git a/actuator/src/main/java/org/tron/core/vm/program/Program.java b/actuator/src/main/java/org/tron/core/vm/program/Program.java index 9f6866ca528..637b1ae856c 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/Program.java +++ b/actuator/src/main/java/org/tron/core/vm/program/Program.java @@ -33,7 +33,6 @@ import org.tron.common.runtime.ProgramResult; import org.tron.common.runtime.vm.DataWord; import org.tron.common.utils.BIUtil; -import org.tron.common.utils.Base58; import org.tron.common.utils.ByteUtil; import org.tron.common.utils.FastByteComparisons; import org.tron.common.utils.StringUtil; @@ -2237,9 +2236,16 @@ public long updateContextContractFactor() { } else { long oldEnergyFactor = contractStateCapsule.getEnergyFactor(); String contractAddress = StringUtil.encode58Check(getContextAddress()); - if (contractStateCapsule.getEnergyUsage() > VMConfig.getDynamicEnergyThreshold() / 10) { + + // Add metrics info + if (contractStateCapsule.getEnergyFactor() > 0) { + Metrics.gaugeSet(MetricKeys.Gauge.CONTRACT_USAGE, + contractStateCapsule.getEnergyUsage(), contractAddress, "energy"); + Metrics.gaugeSet(MetricKeys.Gauge.CONTRACT_USAGE, + contractStateCapsule.getEnergyActualUsage(), contractAddress, "total"); + } else if (contractStateCapsule.getEnergyUsage() > VMConfig.getDynamicEnergyThreshold() / 10) { Metrics.gaugeSet(MetricKeys.Gauge.CONTRACT_USAGE, - contractStateCapsule.getEnergyUsage(), contractAddress); + contractStateCapsule.getEnergyUsage(), contractAddress, "energy"); } if (contractStateCapsule.catchUpToCycle( @@ -2267,6 +2273,14 @@ public void addContextContractUsage(long value) { contractState.updateContractState(getContextAddress(), contractStateCapsule); } + public void addContextContractActualUsage(long value) { + ContractStateCapsule contractStateCapsule = + contractState.getContractState(getContextAddress()); + + contractStateCapsule.addEnergyActualUsage(value); + contractState.updateContractState(getContextAddress(), contractStateCapsule); + } + /** * Denotes problem when executing Ethereum bytecode. From blockchain and peer perspective this is * quite normal situation and doesn't mean exceptional situation in terms of the program diff --git a/chainbase/src/main/java/org/tron/core/capsule/ContractStateCapsule.java b/chainbase/src/main/java/org/tron/core/capsule/ContractStateCapsule.java index 8633534280b..92cc74a8264 100644 --- a/chainbase/src/main/java/org/tron/core/capsule/ContractStateCapsule.java +++ b/chainbase/src/main/java/org/tron/core/capsule/ContractStateCapsule.java @@ -52,6 +52,18 @@ public void addEnergyUsage(long toAdd) { setEnergyUsage(getEnergyUsage() + toAdd); } + public long getEnergyActualUsage() { + return this.contractState.getActualEnergyUsage(); + } + + public void setEnergyActualUsage(long value) { + this.contractState = this.contractState.toBuilder().setActualEnergyUsage(value).build(); + } + + public void addEnergyActualUsage(long toAdd) { + setEnergyActualUsage(getEnergyActualUsage() + toAdd); + } + public long getEnergyFactor() { return this.contractState.getEnergyFactor(); } diff --git a/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java b/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java index 779542fd734..c8b9857f3b1 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java @@ -22,7 +22,7 @@ class MetricsGauge { init(MetricKeys.Gauge.MINER, "tron miner.", "miner", "type"); init(MetricKeys.Gauge.PROPOSAL, "tron proposal.", "param", "type"); init(MetricKeys.Gauge.CONTRACT_FACTOR, "tron contract energy factor.", "contract"); - init(MetricKeys.Gauge.CONTRACT_USAGE, "tron contract energy usage.", "contract"); + init(MetricKeys.Gauge.CONTRACT_USAGE, "tron contract energy usage.", "contract", "type"); } diff --git a/protocol/src/main/protos/core/contract/smart_contract.proto b/protocol/src/main/protos/core/contract/smart_contract.proto index c913f7f7577..9ccc215c50c 100644 --- a/protocol/src/main/protos/core/contract/smart_contract.proto +++ b/protocol/src/main/protos/core/contract/smart_contract.proto @@ -62,6 +62,7 @@ message ContractState { int64 energy_usage = 1; int64 energy_factor = 2; int64 update_cycle = 3; + int64 actual_energy_usage = 10; } message CreateSmartContract { From 5a4c8b9f3d3969113a2516f66e288983721cae59 Mon Sep 17 00:00:00 2001 From: liuxincheng Date: Fri, 10 Feb 2023 13:21:27 +0800 Subject: [PATCH 10/27] feat(metrics): add metrics for stake --- .../actuator/DelegateResourceActuator.java | 9 +++++++ .../core/actuator/FreezeBalanceActuator.java | 9 +++++++ .../actuator/FreezeBalanceV2Actuator.java | 24 ++++++++++++------- .../actuator/UnDelegateResourceActuator.java | 11 +++++++++ .../actuator/UnfreezeBalanceActuator.java | 10 ++++++++ .../actuator/UnfreezeBalanceV2Actuator.java | 8 +++++++ .../org/tron/core/capsule/AccountCapsule.java | 6 +++++ .../core/store/DynamicPropertiesStore.java | 7 ++++++ .../tron/common/prometheus/MetricKeys.java | 7 ++++++ .../tron/common/prometheus/MetricLabels.java | 11 +++++++++ .../common/prometheus/MetricsCounter.java | 10 ++++++-- .../tron/common/prometheus/MetricsGauge.java | 7 ++++++ .../common/prometheus/MetricsHistogram.java | 11 +++++++++ 13 files changed, 120 insertions(+), 10 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java b/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java index f91c147e3ee..4fe631bd60f 100755 --- a/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java @@ -1,5 +1,7 @@ package org.tron.core.actuator; +import static org.tron.common.prometheus.MetricKeys.Counter.STAKE_INCREMENT; +import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_AGGREGATE; import static org.tron.core.actuator.ActuatorConstant.NOT_EXIST_STR; import static org.tron.core.config.Parameter.ChainConstant.DELEGATE_PERIOD; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; @@ -10,6 +12,7 @@ import java.util.Objects; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ArrayUtils; +import org.tron.common.prometheus.Metrics; import org.tron.common.utils.DecodeUtil; import org.tron.common.utils.StringUtil; import org.tron.core.capsule.AccountCapsule; @@ -70,6 +73,9 @@ public boolean execute(Object result) throws ContractExeException { ownerCapsule.addDelegatedFrozenV2BalanceForBandwidth(delegateBalance); ownerCapsule.addFrozenBalanceForBandwidthV2(-delegateBalance); + Metrics.counterInc(STAKE_INCREMENT, delegateBalance, "v2", "delegateResource", "net"); + Metrics.histogramObserve(STAKE_AGGREGATE, delegateBalance, + "v2", "delegateResource", "net"); break; case ENERGY: delegateResource(ownerAddress, receiverAddress, false, @@ -77,6 +83,9 @@ public boolean execute(Object result) throws ContractExeException { ownerCapsule.addDelegatedFrozenV2BalanceForEnergy(delegateBalance); ownerCapsule.addFrozenBalanceForEnergyV2(-delegateBalance); + Metrics.counterInc(STAKE_INCREMENT, delegateBalance, "v2", "delegateResource", "energy"); + Metrics.histogramObserve(STAKE_AGGREGATE, delegateBalance, + "v2", "delegateResource", "energy"); break; default: logger.debug("Resource Code Error."); diff --git a/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceActuator.java b/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceActuator.java index 0cfd981217f..bd988efad16 100755 --- a/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceActuator.java @@ -1,5 +1,8 @@ package org.tron.core.actuator; +import static org.tron.common.prometheus.MetricKeys.Counter.STAKE_INCREMENT; +import static org.tron.common.prometheus.MetricKeys.Gauge.TOTAL_RESOURCE_WEIGHT; +import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_AGGREGATE; import static org.tron.core.actuator.ActuatorConstant.NOT_EXIST_STR; import static org.tron.core.config.Parameter.ChainConstant.FROZEN_PERIOD; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; @@ -16,6 +19,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ArrayUtils; import org.tron.common.parameter.CommonParameter; +import org.tron.common.prometheus.Metrics; import org.tron.common.utils.DecodeUtil; import org.tron.common.utils.StringUtil; import org.tron.core.capsule.AccountCapsule; @@ -72,6 +76,7 @@ public boolean execute(Object result) throws ContractExeException { long newBalance = accountCapsule.getBalance() - freezeBalanceContract.getFrozenBalance(); long frozenBalance = freezeBalanceContract.getFrozenBalance(); + long expireTime = now + duration; byte[] ownerAddress = freezeBalanceContract.getOwnerAddress().toByteArray(); byte[] receiverAddress = freezeBalanceContract.getReceiverAddress().toByteArray(); @@ -92,6 +97,8 @@ public boolean execute(Object result) throws ContractExeException { long newNetWeight = accountCapsule.getFrozenBalance() / TRX_PRECISION; increment = newNetWeight - oldNetWeight; } + Metrics.counterInc(STAKE_INCREMENT, frozenBalance, "v1", "freezeBalance", "net"); + Metrics.histogramObserve(STAKE_AGGREGATE, frozenBalance, "v1", "freezeBalance", "net"); addTotalWeight(BANDWIDTH, dynamicStore, frozenBalance, increment); break; case ENERGY: @@ -108,6 +115,8 @@ public boolean execute(Object result) throws ContractExeException { long newEnergyWeight = accountCapsule.getEnergyFrozenBalance() / TRX_PRECISION; increment = newEnergyWeight - oldEnergyWeight; } + Metrics.counterInc(STAKE_INCREMENT, frozenBalance, "v1", "freezeBalance", "energy"); + Metrics.histogramObserve(STAKE_AGGREGATE, frozenBalance, "v1", "freezeBalance", "energy"); addTotalWeight(ENERGY, dynamicStore, frozenBalance, increment); break; case TRON_POWER: diff --git a/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceV2Actuator.java b/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceV2Actuator.java index 90b03e43e1a..96c125e0059 100755 --- a/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceV2Actuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceV2Actuator.java @@ -1,8 +1,18 @@ package org.tron.core.actuator; +import static org.tron.common.prometheus.MetricKeys.Counter.STAKE_INCREMENT; +import static org.tron.common.prometheus.MetricKeys.Gauge.TOTAL_RESOURCE_WEIGHT; +import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_AGGREGATE; +import static org.tron.core.actuator.ActuatorConstant.NOT_EXIST_STR; +import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; +import static org.tron.protos.contract.Common.ResourceCode.BANDWIDTH; +import static org.tron.protos.contract.Common.ResourceCode.ENERGY; + import com.google.protobuf.ByteString; import com.google.protobuf.InvalidProtocolBufferException; +import java.util.Objects; import lombok.extern.slf4j.Slf4j; +import org.tron.common.prometheus.Metrics; import org.tron.common.utils.DecodeUtil; import org.tron.common.utils.StringUtil; import org.tron.core.capsule.AccountCapsule; @@ -15,13 +25,6 @@ import org.tron.protos.Protocol.Transaction.Result.code; import org.tron.protos.contract.BalanceContract.FreezeBalanceV2Contract; -import java.util.Objects; - -import static org.tron.core.actuator.ActuatorConstant.NOT_EXIST_STR; -import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; -import static org.tron.protos.contract.Common.ResourceCode.BANDWIDTH; -import static org.tron.protos.contract.Common.ResourceCode.ENERGY; - @Slf4j(topic = "actuator") public class FreezeBalanceV2Actuator extends AbstractActuator { @@ -56,19 +59,24 @@ public boolean execute(Object result) throws ContractExeException { long newBalance = accountCapsule.getBalance() - freezeBalanceV2Contract.getFrozenBalance(); long frozenBalance = freezeBalanceV2Contract.getFrozenBalance(); - switch (freezeBalanceV2Contract.getResource()) { case BANDWIDTH: long oldNetWeight = accountCapsule.getFrozenV2BalanceWithDelegated(BANDWIDTH) / TRX_PRECISION; accountCapsule.addFrozenBalanceForBandwidthV2(frozenBalance); long newNetWeight = accountCapsule.getFrozenV2BalanceWithDelegated(BANDWIDTH) / TRX_PRECISION; dynamicStore.addTotalNetWeight(newNetWeight - oldNetWeight); + Metrics.counterInc(STAKE_INCREMENT, frozenBalance, "v2", "freezeBalance", "net"); + Metrics.histogramObserve(STAKE_AGGREGATE, frozenBalance, + "v2", "freezeBalance", "net"); break; case ENERGY: long oldEnergyWeight = accountCapsule.getFrozenV2BalanceWithDelegated(ENERGY) / TRX_PRECISION; accountCapsule.addFrozenBalanceForEnergyV2(frozenBalance); long newEnergyWeight = accountCapsule.getFrozenV2BalanceWithDelegated(ENERGY) / TRX_PRECISION; dynamicStore.addTotalEnergyWeight(newEnergyWeight - oldEnergyWeight); + Metrics.counterInc(STAKE_INCREMENT, frozenBalance, "v2", "freezeBalance", "energy"); + Metrics.histogramObserve(STAKE_AGGREGATE, frozenBalance, + "v2", "freezeBalance", "energy"); break; case TRON_POWER: long oldTPWeight = accountCapsule.getTronPowerFrozenV2Balance() / TRX_PRECISION; diff --git a/actuator/src/main/java/org/tron/core/actuator/UnDelegateResourceActuator.java b/actuator/src/main/java/org/tron/core/actuator/UnDelegateResourceActuator.java index a99d462b61c..29103910495 100755 --- a/actuator/src/main/java/org/tron/core/actuator/UnDelegateResourceActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/UnDelegateResourceActuator.java @@ -1,5 +1,7 @@ package org.tron.core.actuator; +import static org.tron.common.prometheus.MetricKeys.Counter.STAKE_INCREMENT; +import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_AGGREGATE; import static org.tron.core.actuator.ActuatorConstant.ACCOUNT_EXCEPTION_STR; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; import static org.tron.protos.contract.Common.ResourceCode.BANDWIDTH; @@ -11,6 +13,7 @@ import java.util.Objects; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ArrayUtils; +import org.tron.common.prometheus.Metrics; import org.tron.common.utils.DecodeUtil; import org.tron.common.utils.StringUtil; import org.tron.core.capsule.AccountCapsule; @@ -91,6 +94,10 @@ public boolean execute(Object result) throws ContractExeException { long newNetUsage = receiverCapsule.getNetUsage() - transferUsage; receiverCapsule.setNetUsage(newNetUsage); receiverCapsule.setLatestConsumeTime(now); + Metrics.counterInc(STAKE_INCREMENT, unDelegateBalance, + "v2", "unDelegateResource", "net"); + Metrics.histogramObserve(STAKE_AGGREGATE, unDelegateBalance, + "v2", "unDelegateResource", "net"); break; case ENERGY: EnergyProcessor energyProcessor = new EnergyProcessor(dynamicStore, accountStore); @@ -114,6 +121,10 @@ public boolean execute(Object result) throws ContractExeException { long newEnergyUsage = receiverCapsule.getEnergyUsage() - transferUsage; receiverCapsule.setEnergyUsage(newEnergyUsage); receiverCapsule.setLatestConsumeTimeForEnergy(now); + Metrics.counterInc(STAKE_INCREMENT, unDelegateBalance, + "v2", "unDelegateResource", "energy"); + Metrics.histogramObserve(STAKE_AGGREGATE, unDelegateBalance, + "v2", "unDelegateResource", "energy"); break; default: //this should never happen diff --git a/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceActuator.java b/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceActuator.java index 80334f1fc49..907675f6e1b 100755 --- a/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceActuator.java @@ -1,5 +1,8 @@ package org.tron.core.actuator; +import static org.tron.common.prometheus.MetricKeys.Counter.STAKE_INCREMENT; +import static org.tron.common.prometheus.MetricKeys.Gauge.TOTAL_RESOURCE_WEIGHT; +import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_AGGREGATE; import static org.tron.core.actuator.ActuatorConstant.ACCOUNT_EXCEPTION_STR; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; @@ -13,6 +16,7 @@ import java.util.Objects; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ArrayUtils; +import org.tron.common.prometheus.Metrics; import org.tron.common.utils.DecodeUtil; import org.tron.common.utils.StringUtil; import org.tron.core.capsule.AccountCapsule; @@ -99,11 +103,17 @@ public boolean execute(Object result) throws ContractExeException { unfreezeBalance = delegatedResourceCapsule.getFrozenBalanceForBandwidth(); delegatedResourceCapsule.setFrozenBalanceForBandwidth(0, 0); accountCapsule.addDelegatedFrozenBalanceForBandwidth(-unfreezeBalance); + Metrics.counterInc(STAKE_INCREMENT, unfreezeBalance, "v1", "unfreezeBalance", "net"); + Metrics.histogramObserve(STAKE_AGGREGATE, unfreezeBalance, + "v1", "unfreezeBalance", "net"); break; case ENERGY: unfreezeBalance = delegatedResourceCapsule.getFrozenBalanceForEnergy(); delegatedResourceCapsule.setFrozenBalanceForEnergy(0, 0); accountCapsule.addDelegatedFrozenBalanceForEnergy(-unfreezeBalance); + Metrics.counterInc(STAKE_INCREMENT, unfreezeBalance, "v1", "unfreezeBalance", "energy"); + Metrics.histogramObserve(STAKE_AGGREGATE, unfreezeBalance, + "v1", "unfreezeBalance", "energy"); break; default: //this should never happen diff --git a/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceV2Actuator.java b/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceV2Actuator.java index 45b05ec8bec..510d3da7391 100755 --- a/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceV2Actuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceV2Actuator.java @@ -1,5 +1,8 @@ package org.tron.core.actuator; +import static org.tron.common.prometheus.MetricKeys.Counter.STAKE_INCREMENT; +import static org.tron.common.prometheus.MetricKeys.Gauge.TOTAL_RESOURCE_WEIGHT; +import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_AGGREGATE; import static org.tron.core.actuator.ActuatorConstant.ACCOUNT_EXCEPTION_STR; import static org.tron.core.config.Parameter.ChainConstant.FROZEN_PERIOD; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; @@ -16,6 +19,7 @@ import java.util.Objects; import lombok.Getter; import lombok.extern.slf4j.Slf4j; +import org.tron.common.prometheus.Metrics; import org.tron.common.utils.DecodeUtil; import org.tron.common.utils.StringUtil; import org.tron.core.capsule.AccountCapsule; @@ -279,12 +283,16 @@ public void updateTotalResourceWeight(AccountCapsule accountCapsule, accountCapsule.addFrozenBalanceForBandwidthV2(-unfreezeBalance); long newNetWeight = accountCapsule.getFrozenV2BalanceWithDelegated(BANDWIDTH) / TRX_PRECISION; dynamicStore.addTotalNetWeight(newNetWeight - oldNetWeight); + Metrics.counterInc(STAKE_INCREMENT, unfreezeBalance, "v2", "unfreezeBalance", "net"); + Metrics.histogramObserve(STAKE_AGGREGATE, unfreezeBalance, "v2", "unfreezeBalance", "net"); break; case ENERGY: long oldEnergyWeight = accountCapsule.getFrozenV2BalanceWithDelegated(ENERGY) / TRX_PRECISION; accountCapsule.addFrozenBalanceForEnergyV2(-unfreezeBalance); long newEnergyWeight = accountCapsule.getFrozenV2BalanceWithDelegated(ENERGY) / TRX_PRECISION; dynamicStore.addTotalEnergyWeight(newEnergyWeight - oldEnergyWeight); + Metrics.counterInc(STAKE_INCREMENT, unfreezeBalance, "v2", "unfreezeBalance", "energy"); + Metrics.histogramObserve(STAKE_AGGREGATE, unfreezeBalance, "v2", "unfreezeBalance", "energy"); break; case TRON_POWER: long oldTPWeight = accountCapsule.getTronPowerFrozenV2Balance() / TRX_PRECISION; diff --git a/chainbase/src/main/java/org/tron/core/capsule/AccountCapsule.java b/chainbase/src/main/java/org/tron/core/capsule/AccountCapsule.java index 48593f5d36c..fa01ec0d6b5 100644 --- a/chainbase/src/main/java/org/tron/core/capsule/AccountCapsule.java +++ b/chainbase/src/main/java/org/tron/core/capsule/AccountCapsule.java @@ -20,6 +20,7 @@ import com.google.protobuf.InvalidProtocolBufferException; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; +import org.tron.common.prometheus.Metrics; import org.tron.common.utils.ByteArray; import org.tron.core.capsule.utils.AssetUtil; import org.tron.core.store.AssetIssueStore; @@ -42,6 +43,7 @@ import java.util.Map; import java.util.Objects; +import static org.tron.common.prometheus.MetricKeys.Histogram.RESOURCE_RECOVERY; import static org.tron.core.config.Parameter.ChainConstant.BLOCK_PRODUCED_INTERVAL; import static org.tron.core.config.Parameter.ChainConstant.WINDOW_SIZE_MS; import static org.tron.protos.contract.Common.ResourceCode.BANDWIDTH; @@ -1057,6 +1059,7 @@ public long getUsage(ResourceCode resourceCode) { public void setNetUsage(long netUsage) { this.account = this.account.toBuilder() .setNetUsage(netUsage).build(); + Metrics.histogramObserve(RESOURCE_RECOVERY, netUsage, "net", "usage"); } public AccountResource getAccountResource() { @@ -1154,6 +1157,7 @@ public void setEnergyUsage(long energyUsage) { .setAccountResource( this.account.getAccountResource().toBuilder().setEnergyUsage(energyUsage).build()) .build(); + Metrics.histogramObserve(RESOURCE_RECOVERY, energyUsage, "energy", "usage"); } public long getAllFrozenBalanceForEnergy() { @@ -1365,6 +1369,8 @@ public void setNewWindowSize(ResourceCode resourceCode, long newWindowSize) { this.account = this.account.toBuilder().setAccountResource(this.account.getAccountResource() .toBuilder().setEnergyWindowSize(newWindowSize).build()).build(); } + String resource = BANDWIDTH == resourceCode ? "net" : "energy"; + Metrics.histogramObserve(RESOURCE_RECOVERY, newWindowSize, resource, "window"); } public long getWindowSize(ResourceCode resourceCode) { diff --git a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java index d2870b45e2b..bec3d410642 100644 --- a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java +++ b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java @@ -1,5 +1,7 @@ package org.tron.core.store; +import static org.tron.common.prometheus.MetricKeys.Gauge.TOTAL_RESOURCE_WEIGHT; + import com.google.protobuf.ByteString; import java.util.Arrays; import java.util.Optional; @@ -11,6 +13,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.tron.common.parameter.CommonParameter; +import org.tron.common.prometheus.Metrics; import org.tron.common.utils.ByteArray; import org.tron.common.utils.Sha256Hash; import org.tron.core.capsule.BytesCapsule; @@ -2221,6 +2224,8 @@ public void addTotalNetWeight(long amount) { if (allowNewReward()) { totalNetWeight = Math.max(0, totalNetWeight); } + String version = supportUnfreezeDelay() ? "v2" : "v1"; + Metrics.gaugeSet(TOTAL_RESOURCE_WEIGHT, totalNetWeight, version, "net"); saveTotalNetWeight(totalNetWeight); } @@ -2231,6 +2236,8 @@ public void addTotalEnergyWeight(long amount) { if (allowNewReward()) { totalEnergyWeight = Math.max(0, totalEnergyWeight); } + String version = supportUnfreezeDelay() ? "v2" : "v1"; + Metrics.gaugeSet(TOTAL_RESOURCE_WEIGHT, totalEnergyWeight, version, "energy"); saveTotalEnergyWeight(totalEnergyWeight); } diff --git a/common/src/main/java/org/tron/common/prometheus/MetricKeys.java b/common/src/main/java/org/tron/common/prometheus/MetricKeys.java index e98311bcf10..913962ecd08 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricKeys.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricKeys.java @@ -17,6 +17,7 @@ public static class Counter { public static final String P2P_ERROR = "tron:p2p_error"; public static final String P2P_DISCONNECT = "tron:p2p_disconnect"; public static final String INTERNAL_SERVICE_FAIL = "tron:internal_service_fail"; + public static final String STAKE_INCREMENT = "tron:stake_c"; private Counter() { throw new IllegalStateException("Counter"); @@ -39,6 +40,9 @@ public static class Gauge { public static final String CONTRACT_FACTOR = "tron:contract_factor_g"; public static final String CONTRACT_USAGE = "tron:contract_usage_g"; + public static final String TOTAL_RESOURCE_WEIGHT = "tron:total_resource_g"; + public static final String VOTE_NUMBER = "tron:vote_number_g"; + private Gauge() { throw new IllegalStateException("Gauge"); } @@ -67,6 +71,9 @@ public static class Histogram { public static final String BLOCK_FETCH_LATENCY = "tron:block_fetch_latency_seconds"; public static final String BLOCK_RECEIVE_DELAY = "tron:block_receive_delay_seconds"; + public static final String RESOURCE_RECOVERY = "tron:resource_h"; + public static final String STAKE_AGGREGATE = "tron:stake_h"; + private Histogram() { throw new IllegalStateException("Histogram"); } diff --git a/common/src/main/java/org/tron/common/prometheus/MetricLabels.java b/common/src/main/java/org/tron/common/prometheus/MetricLabels.java index 34b0afa4a7e..74823e72a90 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricLabels.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricLabels.java @@ -5,6 +5,9 @@ @Slf4j(topic = "metrics") public class MetricLabels { + /** + * label values + */ public static final String SUCCESS = "success"; public static final String FAIL = "fail"; public static final String ALL = "all"; @@ -12,6 +15,14 @@ public class MetricLabels { public static final String BLOCK = "block"; public static final String TRX = "trx"; + /** + * label keys + */ + public static final String STAKE_VERSION = "version"; + public static final String RESOURCE_TYPE = "resource"; + public static final String CONTRACT_TYPE = "contract"; + public static final String RECOVERY_TYPE = "recovery"; + private MetricLabels() { throw new IllegalStateException("MetricsLabels"); } diff --git a/common/src/main/java/org/tron/common/prometheus/MetricsCounter.java b/common/src/main/java/org/tron/common/prometheus/MetricsCounter.java index 6acdf23b3bc..2f355ab76d8 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricsCounter.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricsCounter.java @@ -1,5 +1,9 @@ package org.tron.common.prometheus; +import static org.tron.common.prometheus.MetricLabels.CONTRACT_TYPE; +import static org.tron.common.prometheus.MetricLabels.RESOURCE_TYPE; +import static org.tron.common.prometheus.MetricLabels.STAKE_VERSION; + import io.prometheus.client.Counter; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -16,8 +20,10 @@ class MetricsCounter { init(MetricKeys.Counter.BLOCK_FORK, "tron block fork info .", "type"); init(MetricKeys.Counter.P2P_ERROR, "tron p2p error info .", "type"); init(MetricKeys.Counter.P2P_DISCONNECT, "tron p2p disconnect .", "type"); - init(MetricKeys.Counter.INTERNAL_SERVICE_FAIL, "internal Service fail.", - "class", "method"); + init(MetricKeys.Counter.INTERNAL_SERVICE_FAIL, "internal Service fail.", "class", "method"); + + init(MetricKeys.Counter.STAKE_INCREMENT, "stake increment info .", + STAKE_VERSION, CONTRACT_TYPE, RESOURCE_TYPE); } private MetricsCounter() { diff --git a/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java b/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java index c8b9857f3b1..3218df8dbcc 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java @@ -1,5 +1,8 @@ package org.tron.common.prometheus; +import static org.tron.common.prometheus.MetricLabels.RESOURCE_TYPE; +import static org.tron.common.prometheus.MetricLabels.STAKE_VERSION; + import io.prometheus.client.Gauge; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -24,6 +27,10 @@ class MetricsGauge { init(MetricKeys.Gauge.CONTRACT_FACTOR, "tron contract energy factor.", "contract"); init(MetricKeys.Gauge.CONTRACT_USAGE, "tron contract energy usage.", "contract", "type"); + init(MetricKeys.Gauge.TOTAL_RESOURCE_WEIGHT, "tron stake total resource weight.", + STAKE_VERSION, RESOURCE_TYPE); + init(MetricKeys.Gauge.VOTE_NUMBER, "tron number of votes .", STAKE_VERSION); + } private MetricsGauge() { diff --git a/common/src/main/java/org/tron/common/prometheus/MetricsHistogram.java b/common/src/main/java/org/tron/common/prometheus/MetricsHistogram.java index 10cbf1d2979..71b02a1cf12 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricsHistogram.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricsHistogram.java @@ -1,5 +1,10 @@ package org.tron.common.prometheus; +import static org.tron.common.prometheus.MetricLabels.CONTRACT_TYPE; +import static org.tron.common.prometheus.MetricLabels.RECOVERY_TYPE; +import static org.tron.common.prometheus.MetricLabels.RESOURCE_TYPE; +import static org.tron.common.prometheus.MetricLabels.STAKE_VERSION; + import io.prometheus.client.Histogram; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -46,6 +51,12 @@ public class MetricsHistogram { init(MetricKeys.Histogram.BLOCK_FETCH_LATENCY, "fetch block latency."); init(MetricKeys.Histogram.BLOCK_RECEIVE_DELAY, "receive block delay time, receiveTime - blockTime."); + + init(MetricKeys.Histogram.RESOURCE_RECOVERY, "resource recovery .", + RESOURCE_TYPE, RECOVERY_TYPE); + + init(MetricKeys.Histogram.STAKE_AGGREGATE, "stake net aggregate.", + STAKE_VERSION, CONTRACT_TYPE, RESOURCE_TYPE); } private MetricsHistogram() { From b7af5b0c40945e74bf34999b6adf6126b974b695 Mon Sep 17 00:00:00 2001 From: zhang0125 Date: Sat, 11 Feb 2023 14:11:49 +0800 Subject: [PATCH 11/27] feat(metrics): optimize stake metrics --- .../actuator/DelegateResourceActuator.java | 19 +++++---- .../core/actuator/FreezeBalanceActuator.java | 24 ++++++----- .../actuator/FreezeBalanceV2Actuator.java | 21 ++++++---- .../actuator/UnDelegateResourceActuator.java | 19 ++++----- .../actuator/UnfreezeBalanceActuator.java | 38 ++++++++--------- .../actuator/UnfreezeBalanceV2Actuator.java | 19 +++++---- .../WithdrawExpireUnfreezeActuator.java | 7 ++++ .../org/tron/core/capsule/AccountCapsule.java | 5 --- .../core/store/DynamicPropertiesStore.java | 42 +++++++++++++++++-- .../tron/common/prometheus/MetricKeys.java | 5 +-- .../tron/common/prometheus/MetricLabels.java | 18 ++++++-- .../common/prometheus/MetricsCounter.java | 7 ---- .../tron/common/prometheus/MetricsGauge.java | 8 ++-- .../common/prometheus/MetricsHistogram.java | 14 +++---- 14 files changed, 143 insertions(+), 103 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java b/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java index 4fe631bd60f..723853640cc 100755 --- a/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java @@ -1,7 +1,10 @@ package org.tron.core.actuator; -import static org.tron.common.prometheus.MetricKeys.Counter.STAKE_INCREMENT; -import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_AGGREGATE; +import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_HISTOGRAM; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_DELEGATE; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_ENERGY; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_NET; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_VERSION_V2; import static org.tron.core.actuator.ActuatorConstant.NOT_EXIST_STR; import static org.tron.core.config.Parameter.ChainConstant.DELEGATE_PERIOD; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; @@ -73,9 +76,8 @@ public boolean execute(Object result) throws ContractExeException { ownerCapsule.addDelegatedFrozenV2BalanceForBandwidth(delegateBalance); ownerCapsule.addFrozenBalanceForBandwidthV2(-delegateBalance); - Metrics.counterInc(STAKE_INCREMENT, delegateBalance, "v2", "delegateResource", "net"); - Metrics.histogramObserve(STAKE_AGGREGATE, delegateBalance, - "v2", "delegateResource", "net"); + Metrics.histogramObserve(STAKE_HISTOGRAM, delegateBalance, + STAKE_VERSION_V2, STAKE_DELEGATE, STAKE_NET); break; case ENERGY: delegateResource(ownerAddress, receiverAddress, false, @@ -83,9 +85,8 @@ public boolean execute(Object result) throws ContractExeException { ownerCapsule.addDelegatedFrozenV2BalanceForEnergy(delegateBalance); ownerCapsule.addFrozenBalanceForEnergyV2(-delegateBalance); - Metrics.counterInc(STAKE_INCREMENT, delegateBalance, "v2", "delegateResource", "energy"); - Metrics.histogramObserve(STAKE_AGGREGATE, delegateBalance, - "v2", "delegateResource", "energy"); + Metrics.histogramObserve(STAKE_HISTOGRAM, delegateBalance, + STAKE_VERSION_V2, STAKE_DELEGATE, STAKE_ENERGY); break; default: logger.debug("Resource Code Error."); @@ -190,7 +191,7 @@ public boolean validate() throws ContractValidateException { if (ownerCapsule.getFrozenV2BalanceForEnergy() - remainEnergyUsage < delegateBalance) { throw new ContractValidateException( - "delegateBalance must be less than available FreezeEnergyV2 balance"); + "delegateBalance must be less than available FreezeEnergyV2 balance"); } } break; diff --git a/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceActuator.java b/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceActuator.java index bd988efad16..17cdaaaa0cc 100755 --- a/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceActuator.java @@ -1,8 +1,10 @@ package org.tron.core.actuator; -import static org.tron.common.prometheus.MetricKeys.Counter.STAKE_INCREMENT; -import static org.tron.common.prometheus.MetricKeys.Gauge.TOTAL_RESOURCE_WEIGHT; -import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_AGGREGATE; +import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_HISTOGRAM; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_ENERGY; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_FREEZE; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_NET; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_VERSION_V1; import static org.tron.core.actuator.ActuatorConstant.NOT_EXIST_STR; import static org.tron.core.config.Parameter.ChainConstant.FROZEN_PERIOD; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; @@ -87,7 +89,7 @@ public boolean execute(Object result) throws ContractExeException { if (!ArrayUtils.isEmpty(receiverAddress) && dynamicStore.supportDR()) { increment = delegateResource(ownerAddress, receiverAddress, true, - frozenBalance, expireTime); + frozenBalance, expireTime); accountCapsule.addDelegatedFrozenBalanceForBandwidth(frozenBalance); } else { long oldNetWeight = accountCapsule.getFrozenBalance() / TRX_PRECISION; @@ -97,15 +99,15 @@ public boolean execute(Object result) throws ContractExeException { long newNetWeight = accountCapsule.getFrozenBalance() / TRX_PRECISION; increment = newNetWeight - oldNetWeight; } - Metrics.counterInc(STAKE_INCREMENT, frozenBalance, "v1", "freezeBalance", "net"); - Metrics.histogramObserve(STAKE_AGGREGATE, frozenBalance, "v1", "freezeBalance", "net"); + Metrics.histogramObserve(STAKE_HISTOGRAM, frozenBalance, + STAKE_VERSION_V1, STAKE_FREEZE, STAKE_NET); addTotalWeight(BANDWIDTH, dynamicStore, frozenBalance, increment); break; case ENERGY: if (!ArrayUtils.isEmpty(receiverAddress) && dynamicStore.supportDR()) { increment = delegateResource(ownerAddress, receiverAddress, false, - frozenBalance, expireTime); + frozenBalance, expireTime); accountCapsule.addDelegatedFrozenBalanceForEnergy(frozenBalance); } else { long oldEnergyWeight = accountCapsule.getEnergyFrozenBalance() / TRX_PRECISION; @@ -115,8 +117,8 @@ public boolean execute(Object result) throws ContractExeException { long newEnergyWeight = accountCapsule.getEnergyFrozenBalance() / TRX_PRECISION; increment = newEnergyWeight - oldEnergyWeight; } - Metrics.counterInc(STAKE_INCREMENT, frozenBalance, "v1", "freezeBalance", "energy"); - Metrics.histogramObserve(STAKE_AGGREGATE, frozenBalance, "v1", "freezeBalance", "energy"); + Metrics.histogramObserve(STAKE_HISTOGRAM, frozenBalance, + STAKE_VERSION_V1, STAKE_FREEZE, STAKE_ENERGY); addTotalWeight(ENERGY, dynamicStore, frozenBalance, increment); break; case TRON_POWER: @@ -279,7 +281,7 @@ public boolean validate() throws ContractValidateException { if (dynamicStore.supportUnfreezeDelay()) { throw new ContractValidateException( - "freeze v2 is open, old freeze is closed"); + "freeze v2 is open, old freeze is closed"); } return true; @@ -296,7 +298,7 @@ public long calcFee() { } private long delegateResource(byte[] ownerAddress, byte[] receiverAddress, boolean isBandwidth, - long balance, long expireTime) { + long balance, long expireTime) { AccountStore accountStore = chainBaseManager.getAccountStore(); DynamicPropertiesStore dynamicPropertiesStore = chainBaseManager.getDynamicPropertiesStore(); DelegatedResourceStore delegatedResourceStore = chainBaseManager.getDelegatedResourceStore(); diff --git a/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceV2Actuator.java b/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceV2Actuator.java index 96c125e0059..844521d9172 100755 --- a/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceV2Actuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceV2Actuator.java @@ -1,8 +1,11 @@ package org.tron.core.actuator; -import static org.tron.common.prometheus.MetricKeys.Counter.STAKE_INCREMENT; -import static org.tron.common.prometheus.MetricKeys.Gauge.TOTAL_RESOURCE_WEIGHT; -import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_AGGREGATE; +import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_HISTOGRAM; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_ENERGY; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_FREEZE; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_NET; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_POWER; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_VERSION_V2; import static org.tron.core.actuator.ActuatorConstant.NOT_EXIST_STR; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; import static org.tron.protos.contract.Common.ResourceCode.BANDWIDTH; @@ -65,24 +68,24 @@ public boolean execute(Object result) throws ContractExeException { accountCapsule.addFrozenBalanceForBandwidthV2(frozenBalance); long newNetWeight = accountCapsule.getFrozenV2BalanceWithDelegated(BANDWIDTH) / TRX_PRECISION; dynamicStore.addTotalNetWeight(newNetWeight - oldNetWeight); - Metrics.counterInc(STAKE_INCREMENT, frozenBalance, "v2", "freezeBalance", "net"); - Metrics.histogramObserve(STAKE_AGGREGATE, frozenBalance, - "v2", "freezeBalance", "net"); + Metrics.histogramObserve(STAKE_HISTOGRAM, frozenBalance, + STAKE_VERSION_V2, STAKE_FREEZE, STAKE_NET); break; case ENERGY: long oldEnergyWeight = accountCapsule.getFrozenV2BalanceWithDelegated(ENERGY) / TRX_PRECISION; accountCapsule.addFrozenBalanceForEnergyV2(frozenBalance); long newEnergyWeight = accountCapsule.getFrozenV2BalanceWithDelegated(ENERGY) / TRX_PRECISION; dynamicStore.addTotalEnergyWeight(newEnergyWeight - oldEnergyWeight); - Metrics.counterInc(STAKE_INCREMENT, frozenBalance, "v2", "freezeBalance", "energy"); - Metrics.histogramObserve(STAKE_AGGREGATE, frozenBalance, - "v2", "freezeBalance", "energy"); + Metrics.histogramObserve(STAKE_HISTOGRAM, frozenBalance, + STAKE_VERSION_V2, STAKE_FREEZE, STAKE_ENERGY); break; case TRON_POWER: long oldTPWeight = accountCapsule.getTronPowerFrozenV2Balance() / TRX_PRECISION; accountCapsule.addFrozenForTronPowerV2(frozenBalance); long newTPWeight = accountCapsule.getTronPowerFrozenV2Balance() / TRX_PRECISION; dynamicStore.addTotalTronPowerWeight(newTPWeight - oldTPWeight); + Metrics.histogramObserve(STAKE_HISTOGRAM, frozenBalance, + STAKE_VERSION_V2, STAKE_FREEZE, STAKE_POWER); break; default: logger.debug("Resource Code Error."); diff --git a/actuator/src/main/java/org/tron/core/actuator/UnDelegateResourceActuator.java b/actuator/src/main/java/org/tron/core/actuator/UnDelegateResourceActuator.java index 29103910495..1c1ec22b55b 100755 --- a/actuator/src/main/java/org/tron/core/actuator/UnDelegateResourceActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/UnDelegateResourceActuator.java @@ -1,7 +1,10 @@ package org.tron.core.actuator; -import static org.tron.common.prometheus.MetricKeys.Counter.STAKE_INCREMENT; -import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_AGGREGATE; +import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_HISTOGRAM; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_ENERGY; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_NET; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_UNDELEGATE; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_VERSION_V2; import static org.tron.core.actuator.ActuatorConstant.ACCOUNT_EXCEPTION_STR; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; import static org.tron.protos.contract.Common.ResourceCode.BANDWIDTH; @@ -94,10 +97,8 @@ public boolean execute(Object result) throws ContractExeException { long newNetUsage = receiverCapsule.getNetUsage() - transferUsage; receiverCapsule.setNetUsage(newNetUsage); receiverCapsule.setLatestConsumeTime(now); - Metrics.counterInc(STAKE_INCREMENT, unDelegateBalance, - "v2", "unDelegateResource", "net"); - Metrics.histogramObserve(STAKE_AGGREGATE, unDelegateBalance, - "v2", "unDelegateResource", "net"); + Metrics.histogramObserve(STAKE_HISTOGRAM, unDelegateBalance, + STAKE_VERSION_V2, STAKE_UNDELEGATE, STAKE_NET); break; case ENERGY: EnergyProcessor energyProcessor = new EnergyProcessor(dynamicStore, accountStore); @@ -121,10 +122,8 @@ public boolean execute(Object result) throws ContractExeException { long newEnergyUsage = receiverCapsule.getEnergyUsage() - transferUsage; receiverCapsule.setEnergyUsage(newEnergyUsage); receiverCapsule.setLatestConsumeTimeForEnergy(now); - Metrics.counterInc(STAKE_INCREMENT, unDelegateBalance, - "v2", "unDelegateResource", "energy"); - Metrics.histogramObserve(STAKE_AGGREGATE, unDelegateBalance, - "v2", "unDelegateResource", "energy"); + Metrics.histogramObserve(STAKE_HISTOGRAM, unDelegateBalance, + STAKE_VERSION_V2, STAKE_UNDELEGATE, STAKE_ENERGY); break; default: //this should never happen diff --git a/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceActuator.java b/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceActuator.java index 907675f6e1b..e6a6b7df311 100755 --- a/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceActuator.java @@ -1,8 +1,10 @@ package org.tron.core.actuator; -import static org.tron.common.prometheus.MetricKeys.Counter.STAKE_INCREMENT; -import static org.tron.common.prometheus.MetricKeys.Gauge.TOTAL_RESOURCE_WEIGHT; -import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_AGGREGATE; +import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_HISTOGRAM; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_ENERGY; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_NET; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_UNFREEZE; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_VERSION_V1; import static org.tron.core.actuator.ActuatorConstant.ACCOUNT_EXCEPTION_STR; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; @@ -43,7 +45,7 @@ public class UnfreezeBalanceActuator extends AbstractActuator { private static final String INVALID_RESOURCE_CODE = - "ResourceCode error.valid ResourceCode[BANDWIDTH、Energy]"; + "ResourceCode error.valid ResourceCode[BANDWIDTH、Energy]"; public UnfreezeBalanceActuator() { super(ContractType.UnfreezeBalanceContract, UnfreezeBalanceContract.class); @@ -103,17 +105,15 @@ public boolean execute(Object result) throws ContractExeException { unfreezeBalance = delegatedResourceCapsule.getFrozenBalanceForBandwidth(); delegatedResourceCapsule.setFrozenBalanceForBandwidth(0, 0); accountCapsule.addDelegatedFrozenBalanceForBandwidth(-unfreezeBalance); - Metrics.counterInc(STAKE_INCREMENT, unfreezeBalance, "v1", "unfreezeBalance", "net"); - Metrics.histogramObserve(STAKE_AGGREGATE, unfreezeBalance, - "v1", "unfreezeBalance", "net"); + Metrics.histogramObserve(STAKE_HISTOGRAM, unfreezeBalance, + STAKE_VERSION_V1, STAKE_UNFREEZE, STAKE_NET); break; case ENERGY: unfreezeBalance = delegatedResourceCapsule.getFrozenBalanceForEnergy(); delegatedResourceCapsule.setFrozenBalanceForEnergy(0, 0); accountCapsule.addDelegatedFrozenBalanceForEnergy(-unfreezeBalance); - Metrics.counterInc(STAKE_INCREMENT, unfreezeBalance, "v1", "unfreezeBalance", "energy"); - Metrics.histogramObserve(STAKE_AGGREGATE, unfreezeBalance, - "v1", "unfreezeBalance", "energy"); + Metrics.histogramObserve(STAKE_HISTOGRAM, unfreezeBalance, + STAKE_VERSION_V1, STAKE_UNFREEZE, STAKE_ENERGY); break; default: //this should never happen @@ -126,8 +126,8 @@ public boolean execute(Object result) throws ContractExeException { (receiverCapsule != null && receiverCapsule.getType() != AccountType.Contract)) { switch (unfreezeBalanceContract.getResource()) { case BANDWIDTH: - long oldNetWeight = receiverCapsule.getAcquiredDelegatedFrozenBalanceForBandwidth() / - TRX_PRECISION; + long oldNetWeight = receiverCapsule.getAcquiredDelegatedFrozenBalanceForBandwidth() / + TRX_PRECISION; if (dynamicStore.getAllowTvmSolidity059() == 1 && receiverCapsule.getAcquiredDelegatedFrozenBalanceForBandwidth() < unfreezeBalance) { @@ -136,13 +136,13 @@ public boolean execute(Object result) throws ContractExeException { } else { receiverCapsule.addAcquiredDelegatedFrozenBalanceForBandwidth(-unfreezeBalance); } - long newNetWeight = receiverCapsule.getAcquiredDelegatedFrozenBalanceForBandwidth() / - TRX_PRECISION; + long newNetWeight = receiverCapsule.getAcquiredDelegatedFrozenBalanceForBandwidth() / + TRX_PRECISION; decrease = newNetWeight - oldNetWeight; break; case ENERGY: - long oldEnergyWeight = receiverCapsule.getAcquiredDelegatedFrozenBalanceForEnergy() / - TRX_PRECISION; + long oldEnergyWeight = receiverCapsule.getAcquiredDelegatedFrozenBalanceForEnergy() / + TRX_PRECISION; if (dynamicStore.getAllowTvmSolidity059() == 1 && receiverCapsule.getAcquiredDelegatedFrozenBalanceForEnergy() < unfreezeBalance) { oldEnergyWeight = unfreezeBalance / TRX_PRECISION; @@ -150,8 +150,8 @@ public boolean execute(Object result) throws ContractExeException { } else { receiverCapsule.addAcquiredDelegatedFrozenBalanceForEnergy(-unfreezeBalance); } - long newEnergyWeight = receiverCapsule.getAcquiredDelegatedFrozenBalanceForEnergy() / - TRX_PRECISION; + long newEnergyWeight = receiverCapsule.getAcquiredDelegatedFrozenBalanceForEnergy() / + TRX_PRECISION; decrease = newEnergyWeight - oldEnergyWeight; break; default: @@ -249,7 +249,7 @@ public boolean execute(Object result) throws ContractExeException { } } - + long weight = dynamicStore.allowNewReward() ? decrease : -unfreezeBalance / TRX_PRECISION; switch (unfreezeBalanceContract.getResource()) { case BANDWIDTH: diff --git a/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceV2Actuator.java b/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceV2Actuator.java index 510d3da7391..f455dcf3bf1 100755 --- a/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceV2Actuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceV2Actuator.java @@ -1,8 +1,11 @@ package org.tron.core.actuator; -import static org.tron.common.prometheus.MetricKeys.Counter.STAKE_INCREMENT; -import static org.tron.common.prometheus.MetricKeys.Gauge.TOTAL_RESOURCE_WEIGHT; -import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_AGGREGATE; +import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_HISTOGRAM; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_ENERGY; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_NET; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_POWER; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_UNFREEZE; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_VERSION_V2; import static org.tron.core.actuator.ActuatorConstant.ACCOUNT_EXCEPTION_STR; import static org.tron.core.config.Parameter.ChainConstant.FROZEN_PERIOD; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; @@ -283,22 +286,24 @@ public void updateTotalResourceWeight(AccountCapsule accountCapsule, accountCapsule.addFrozenBalanceForBandwidthV2(-unfreezeBalance); long newNetWeight = accountCapsule.getFrozenV2BalanceWithDelegated(BANDWIDTH) / TRX_PRECISION; dynamicStore.addTotalNetWeight(newNetWeight - oldNetWeight); - Metrics.counterInc(STAKE_INCREMENT, unfreezeBalance, "v2", "unfreezeBalance", "net"); - Metrics.histogramObserve(STAKE_AGGREGATE, unfreezeBalance, "v2", "unfreezeBalance", "net"); + Metrics.histogramObserve(STAKE_HISTOGRAM, unfreezeBalance, + STAKE_VERSION_V2, STAKE_UNFREEZE, STAKE_NET); break; case ENERGY: long oldEnergyWeight = accountCapsule.getFrozenV2BalanceWithDelegated(ENERGY) / TRX_PRECISION; accountCapsule.addFrozenBalanceForEnergyV2(-unfreezeBalance); long newEnergyWeight = accountCapsule.getFrozenV2BalanceWithDelegated(ENERGY) / TRX_PRECISION; dynamicStore.addTotalEnergyWeight(newEnergyWeight - oldEnergyWeight); - Metrics.counterInc(STAKE_INCREMENT, unfreezeBalance, "v2", "unfreezeBalance", "energy"); - Metrics.histogramObserve(STAKE_AGGREGATE, unfreezeBalance, "v2", "unfreezeBalance", "energy"); + Metrics.histogramObserve(STAKE_HISTOGRAM, unfreezeBalance, + STAKE_VERSION_V2, STAKE_UNFREEZE, STAKE_ENERGY); break; case TRON_POWER: long oldTPWeight = accountCapsule.getTronPowerFrozenV2Balance() / TRX_PRECISION; accountCapsule.addFrozenForTronPowerV2(-unfreezeBalance); long newTPWeight = accountCapsule.getTronPowerFrozenV2Balance() / TRX_PRECISION; dynamicStore.addTotalTronPowerWeight(newTPWeight - oldTPWeight); + Metrics.histogramObserve(STAKE_HISTOGRAM, unfreezeBalance, + STAKE_VERSION_V2, STAKE_UNFREEZE, STAKE_POWER); break; default: //this should never happen diff --git a/actuator/src/main/java/org/tron/core/actuator/WithdrawExpireUnfreezeActuator.java b/actuator/src/main/java/org/tron/core/actuator/WithdrawExpireUnfreezeActuator.java index 0c547d2b5a3..f0ce3531122 100755 --- a/actuator/src/main/java/org/tron/core/actuator/WithdrawExpireUnfreezeActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/WithdrawExpireUnfreezeActuator.java @@ -1,5 +1,9 @@ package org.tron.core.actuator; +import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_HISTOGRAM; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_NET; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_VERSION_V2; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_WITHDRAW; import static org.tron.core.actuator.ActuatorConstant.ACCOUNT_EXCEPTION_STR; import static org.tron.core.actuator.ActuatorConstant.NOT_EXIST_STR; @@ -10,6 +14,7 @@ import java.util.Objects; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; +import org.tron.common.prometheus.Metrics; import org.tron.common.utils.DecodeUtil; import org.tron.common.utils.StringUtil; import org.tron.core.capsule.AccountCapsule; @@ -61,6 +66,8 @@ public boolean execute(Object result) throws ContractExeException { accountCapsule.addAllUnfrozenV2(newUnFreezeList); accountStore.put(accountCapsule.createDbKey(), accountCapsule); ret.setWithdrawExpireAmount(totalWithdrawUnfreeze); + Metrics.histogramObserve(STAKE_HISTOGRAM, totalWithdrawUnfreeze, + STAKE_VERSION_V2, STAKE_WITHDRAW, STAKE_NET); ret.setStatus(fee, code.SUCESS); return true; } diff --git a/chainbase/src/main/java/org/tron/core/capsule/AccountCapsule.java b/chainbase/src/main/java/org/tron/core/capsule/AccountCapsule.java index fa01ec0d6b5..0e3efece81b 100644 --- a/chainbase/src/main/java/org/tron/core/capsule/AccountCapsule.java +++ b/chainbase/src/main/java/org/tron/core/capsule/AccountCapsule.java @@ -43,7 +43,6 @@ import java.util.Map; import java.util.Objects; -import static org.tron.common.prometheus.MetricKeys.Histogram.RESOURCE_RECOVERY; import static org.tron.core.config.Parameter.ChainConstant.BLOCK_PRODUCED_INTERVAL; import static org.tron.core.config.Parameter.ChainConstant.WINDOW_SIZE_MS; import static org.tron.protos.contract.Common.ResourceCode.BANDWIDTH; @@ -1059,7 +1058,6 @@ public long getUsage(ResourceCode resourceCode) { public void setNetUsage(long netUsage) { this.account = this.account.toBuilder() .setNetUsage(netUsage).build(); - Metrics.histogramObserve(RESOURCE_RECOVERY, netUsage, "net", "usage"); } public AccountResource getAccountResource() { @@ -1157,7 +1155,6 @@ public void setEnergyUsage(long energyUsage) { .setAccountResource( this.account.getAccountResource().toBuilder().setEnergyUsage(energyUsage).build()) .build(); - Metrics.histogramObserve(RESOURCE_RECOVERY, energyUsage, "energy", "usage"); } public long getAllFrozenBalanceForEnergy() { @@ -1369,8 +1366,6 @@ public void setNewWindowSize(ResourceCode resourceCode, long newWindowSize) { this.account = this.account.toBuilder().setAccountResource(this.account.getAccountResource() .toBuilder().setEnergyWindowSize(newWindowSize).build()).build(); } - String resource = BANDWIDTH == resourceCode ? "net" : "energy"; - Metrics.histogramObserve(RESOURCE_RECOVERY, newWindowSize, resource, "window"); } public long getWindowSize(ResourceCode resourceCode) { diff --git a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java index bec3d410642..f624d05a828 100644 --- a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java +++ b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java @@ -1,6 +1,10 @@ package org.tron.core.store; import static org.tron.common.prometheus.MetricKeys.Gauge.TOTAL_RESOURCE_WEIGHT; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_ENERGY; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_NET; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_VERSION_V1; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_VERSION_V2; import com.google.protobuf.ByteString; import java.util.Arrays; @@ -407,6 +411,12 @@ private DynamicPropertiesStore(@Value("properties") String dbName) { this.saveTotalTronPowerWeight(0L); } + try { + this.getTotalVoteWeight(); + } catch (IllegalArgumentException e) { + this.saveTotalVoteWeight(0L); + } + try { this.getAllowAdaptiveEnergy(); } catch (IllegalArgumentException e) { @@ -1273,6 +1283,19 @@ public long getTotalTronPowerWeight() { () -> new IllegalArgumentException("not found TOTAL_TRON_POWER_WEIGHT")); } + public void saveTotalVoteWeight(long weight) { + this.put(DynamicResourceProperties.TOTAL_VOTE_WEIGHT, + new BytesCapsule(ByteArray.fromLong(weight))); + } + + public long getTotalVoteWeight() { + return Optional.ofNullable(getUnchecked(DynamicResourceProperties.TOTAL_VOTE_WEIGHT)) + .map(BytesCapsule::getData) + .map(ByteArray::toLong) + .orElseThrow( + () -> new IllegalArgumentException("not found TOTAL_VOTE_WEIGHT")); + } + public void saveTotalNetLimit(long totalNetLimit) { this.put(DynamicResourceProperties.TOTAL_NET_LIMIT, new BytesCapsule(ByteArray.fromLong(totalNetLimit))); @@ -2224,8 +2247,8 @@ public void addTotalNetWeight(long amount) { if (allowNewReward()) { totalNetWeight = Math.max(0, totalNetWeight); } - String version = supportUnfreezeDelay() ? "v2" : "v1"; - Metrics.gaugeSet(TOTAL_RESOURCE_WEIGHT, totalNetWeight, version, "net"); + String version = supportUnfreezeDelay() ? STAKE_VERSION_V2 : STAKE_VERSION_V1; + Metrics.gaugeSet(TOTAL_RESOURCE_WEIGHT, totalNetWeight, version, STAKE_NET); saveTotalNetWeight(totalNetWeight); } @@ -2236,8 +2259,8 @@ public void addTotalEnergyWeight(long amount) { if (allowNewReward()) { totalEnergyWeight = Math.max(0, totalEnergyWeight); } - String version = supportUnfreezeDelay() ? "v2" : "v1"; - Metrics.gaugeSet(TOTAL_RESOURCE_WEIGHT, totalEnergyWeight, version, "energy"); + String version = supportUnfreezeDelay() ? STAKE_VERSION_V2 : STAKE_VERSION_V1; + Metrics.gaugeSet(TOTAL_RESOURCE_WEIGHT, totalEnergyWeight, version, STAKE_ENERGY); saveTotalEnergyWeight(totalEnergyWeight); } @@ -2251,6 +2274,16 @@ public void addTotalTronPowerWeight(long amount) { saveTotalTronPowerWeight(totalWeight); } + public void addTotalVoteWeight(long amount) { + long totalWeight = getTotalVoteWeight(); + totalWeight += amount; + if (allowNewReward()) { + totalWeight = Math.max(0, totalWeight); + } + saveTotalVoteWeight(totalWeight); + } + + public void addTotalCreateAccountCost(long fee) { long newValue = getTotalCreateAccountCost() + fee; saveTotalCreateAccountFee(newValue); @@ -2782,6 +2815,7 @@ private static class DynamicResourceProperties { private static final byte[] TOTAL_ENERGY_AVERAGE_TIME = "TOTAL_ENERGY_AVERAGE_TIME".getBytes(); private static final byte[] TOTAL_ENERGY_WEIGHT = "TOTAL_ENERGY_WEIGHT".getBytes(); private static final byte[] TOTAL_TRON_POWER_WEIGHT = "TOTAL_TRON_POWER_WEIGHT".getBytes(); + private static final byte[] TOTAL_VOTE_WEIGHT = "TOTAL_VOTE_WEIGHT".getBytes(); private static final byte[] TOTAL_ENERGY_LIMIT = "TOTAL_ENERGY_LIMIT".getBytes(); private static final byte[] BLOCK_ENERGY_USAGE = "BLOCK_ENERGY_USAGE".getBytes(); private static final byte[] ADAPTIVE_RESOURCE_LIMIT_MULTIPLIER = diff --git a/common/src/main/java/org/tron/common/prometheus/MetricKeys.java b/common/src/main/java/org/tron/common/prometheus/MetricKeys.java index 913962ecd08..783edcb88bf 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricKeys.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricKeys.java @@ -17,7 +17,6 @@ public static class Counter { public static final String P2P_ERROR = "tron:p2p_error"; public static final String P2P_DISCONNECT = "tron:p2p_disconnect"; public static final String INTERNAL_SERVICE_FAIL = "tron:internal_service_fail"; - public static final String STAKE_INCREMENT = "tron:stake_c"; private Counter() { throw new IllegalStateException("Counter"); @@ -41,7 +40,6 @@ public static class Gauge { public static final String CONTRACT_USAGE = "tron:contract_usage_g"; public static final String TOTAL_RESOURCE_WEIGHT = "tron:total_resource_g"; - public static final String VOTE_NUMBER = "tron:vote_number_g"; private Gauge() { throw new IllegalStateException("Gauge"); @@ -71,8 +69,7 @@ public static class Histogram { public static final String BLOCK_FETCH_LATENCY = "tron:block_fetch_latency_seconds"; public static final String BLOCK_RECEIVE_DELAY = "tron:block_receive_delay_seconds"; - public static final String RESOURCE_RECOVERY = "tron:resource_h"; - public static final String STAKE_AGGREGATE = "tron:stake_h"; + public static final String STAKE_HISTOGRAM = "tron:stake_h"; private Histogram() { throw new IllegalStateException("Histogram"); diff --git a/common/src/main/java/org/tron/common/prometheus/MetricLabels.java b/common/src/main/java/org/tron/common/prometheus/MetricLabels.java index 74823e72a90..3be62079d18 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricLabels.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricLabels.java @@ -18,10 +18,9 @@ public class MetricLabels { /** * label keys */ - public static final String STAKE_VERSION = "version"; - public static final String RESOURCE_TYPE = "resource"; - public static final String CONTRACT_TYPE = "contract"; - public static final String RECOVERY_TYPE = "recovery"; + public static final String LABEL_STAKE_VERSION = "version"; + public static final String LABEL_RESOURCE_TYPE = "resource"; + public static final String LABEL_CONTRACT_TYPE = "contract"; private MetricLabels() { throw new IllegalStateException("MetricsLabels"); @@ -81,6 +80,17 @@ private Gauge() { public static class Histogram { public static final String TRAFFIC_IN = "in"; public static final String TRAFFIC_OUT = "out"; + public static final String STAKE_VERSION_V1 = "v1"; + public static final String STAKE_VERSION_V2 = "v2"; + public static final String STAKE_FREEZE = "freeze"; + public static final String STAKE_UNFREEZE = "unfreeze"; + public static final String STAKE_DELEGATE = "delegate"; + public static final String STAKE_UNDELEGATE = "undelegate"; + public static final String STAKE_WITHDRAW = "withdraw"; + public static final String STAKE_NET = "net"; + public static final String STAKE_ENERGY = "energy"; + public static final String STAKE_POWER = "power"; + private Histogram() { throw new IllegalStateException("Histogram"); diff --git a/common/src/main/java/org/tron/common/prometheus/MetricsCounter.java b/common/src/main/java/org/tron/common/prometheus/MetricsCounter.java index 2f355ab76d8..c74df003aa1 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricsCounter.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricsCounter.java @@ -1,9 +1,5 @@ package org.tron.common.prometheus; -import static org.tron.common.prometheus.MetricLabels.CONTRACT_TYPE; -import static org.tron.common.prometheus.MetricLabels.RESOURCE_TYPE; -import static org.tron.common.prometheus.MetricLabels.STAKE_VERSION; - import io.prometheus.client.Counter; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -21,9 +17,6 @@ class MetricsCounter { init(MetricKeys.Counter.P2P_ERROR, "tron p2p error info .", "type"); init(MetricKeys.Counter.P2P_DISCONNECT, "tron p2p disconnect .", "type"); init(MetricKeys.Counter.INTERNAL_SERVICE_FAIL, "internal Service fail.", "class", "method"); - - init(MetricKeys.Counter.STAKE_INCREMENT, "stake increment info .", - STAKE_VERSION, CONTRACT_TYPE, RESOURCE_TYPE); } private MetricsCounter() { diff --git a/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java b/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java index 3218df8dbcc..dd713c64d10 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java @@ -1,7 +1,7 @@ package org.tron.common.prometheus; -import static org.tron.common.prometheus.MetricLabels.RESOURCE_TYPE; -import static org.tron.common.prometheus.MetricLabels.STAKE_VERSION; +import static org.tron.common.prometheus.MetricLabels.LABEL_RESOURCE_TYPE; +import static org.tron.common.prometheus.MetricLabels.LABEL_STAKE_VERSION; import io.prometheus.client.Gauge; import java.util.Map; @@ -28,9 +28,7 @@ class MetricsGauge { init(MetricKeys.Gauge.CONTRACT_USAGE, "tron contract energy usage.", "contract", "type"); init(MetricKeys.Gauge.TOTAL_RESOURCE_WEIGHT, "tron stake total resource weight.", - STAKE_VERSION, RESOURCE_TYPE); - init(MetricKeys.Gauge.VOTE_NUMBER, "tron number of votes .", STAKE_VERSION); - + LABEL_STAKE_VERSION, LABEL_RESOURCE_TYPE); } private MetricsGauge() { diff --git a/common/src/main/java/org/tron/common/prometheus/MetricsHistogram.java b/common/src/main/java/org/tron/common/prometheus/MetricsHistogram.java index 71b02a1cf12..af25ac84009 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricsHistogram.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricsHistogram.java @@ -1,9 +1,8 @@ package org.tron.common.prometheus; -import static org.tron.common.prometheus.MetricLabels.CONTRACT_TYPE; -import static org.tron.common.prometheus.MetricLabels.RECOVERY_TYPE; -import static org.tron.common.prometheus.MetricLabels.RESOURCE_TYPE; -import static org.tron.common.prometheus.MetricLabels.STAKE_VERSION; +import static org.tron.common.prometheus.MetricLabels.LABEL_CONTRACT_TYPE; +import static org.tron.common.prometheus.MetricLabels.LABEL_RESOURCE_TYPE; +import static org.tron.common.prometheus.MetricLabels.LABEL_STAKE_VERSION; import io.prometheus.client.Histogram; import java.util.Map; @@ -52,11 +51,8 @@ public class MetricsHistogram { init(MetricKeys.Histogram.BLOCK_RECEIVE_DELAY, "receive block delay time, receiveTime - blockTime."); - init(MetricKeys.Histogram.RESOURCE_RECOVERY, "resource recovery .", - RESOURCE_TYPE, RECOVERY_TYPE); - - init(MetricKeys.Histogram.STAKE_AGGREGATE, "stake net aggregate.", - STAKE_VERSION, CONTRACT_TYPE, RESOURCE_TYPE); + init(MetricKeys.Histogram.STAKE_HISTOGRAM, "stake net aggregate.", + LABEL_STAKE_VERSION, LABEL_CONTRACT_TYPE, LABEL_RESOURCE_TYPE); } private MetricsHistogram() { From 44693fa6d88cd5f44c0e91a22cdcbc3a86f38eed Mon Sep 17 00:00:00 2001 From: zhang0125 Date: Tue, 14 Feb 2023 16:39:57 +0800 Subject: [PATCH 12/27] feat(metrics): add total vote metrics --- .../java/org/tron/consensus/ConsensusDelegate.java | 4 ++++ .../org/tron/consensus/dpos/MaintenanceManager.java | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/consensus/src/main/java/org/tron/consensus/ConsensusDelegate.java b/consensus/src/main/java/org/tron/consensus/ConsensusDelegate.java index 4a98c933bd1..1f91f902c51 100644 --- a/consensus/src/main/java/org/tron/consensus/ConsensusDelegate.java +++ b/consensus/src/main/java/org/tron/consensus/ConsensusDelegate.java @@ -108,6 +108,10 @@ public List getAllWitnesses() { return witnessStore.getAllWitnesses(); } + public List getWitnessStandby() { + return witnessStore.getWitnessStandby(); + } + public List updateWitnessStandby(List all) { return witnessStore.updateWitnessStandby(all); } diff --git a/consensus/src/main/java/org/tron/consensus/dpos/MaintenanceManager.java b/consensus/src/main/java/org/tron/consensus/dpos/MaintenanceManager.java index 24304da80f2..2aa53d91355 100644 --- a/consensus/src/main/java/org/tron/consensus/dpos/MaintenanceManager.java +++ b/consensus/src/main/java/org/tron/consensus/dpos/MaintenanceManager.java @@ -1,5 +1,9 @@ package org.tron.consensus.dpos; +import static org.tron.common.prometheus.MetricKeys.Gauge.TOTAL_RESOURCE_WEIGHT; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_NET; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_VERSION_V1; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_VERSION_V2; import static org.tron.common.utils.WalletUtil.getAddressStringList; import com.google.common.collect.Maps; @@ -180,6 +184,12 @@ public void doMaintenance() { delegationStore.setWitnessVote(nextCycle, witness.createDbKey(), witness.getVoteCount()); }); consensusDelegate.updateWitnessStandby(all); + if (dynamicPropertiesStore.getTotalVoteWeight() == 0) { + long totalVote = consensusDelegate.getWitnessStandby().stream() + .mapToLong(WitnessCapsule::getVoteCount).sum(); + dynamicPropertiesStore.saveTotalVoteWeight(totalVote); + Metrics.gaugeSet(TOTAL_RESOURCE_WEIGHT, totalVote, STAKE_VERSION_V1, STAKE_NET); + } } } From 92b2e9f21ca0ead0891df10232cdcd47fe44a01f Mon Sep 17 00:00:00 2001 From: zhang0125 Date: Tue, 14 Feb 2023 17:30:09 +0800 Subject: [PATCH 13/27] feat(metrics): optimize metric labels --- .../core/actuator/DelegateResourceActuator.java | 6 +++--- .../core/actuator/FreezeBalanceActuator.java | 6 +++--- .../core/actuator/FreezeBalanceV2Actuator.java | 8 ++++---- .../actuator/UnDelegateResourceActuator.java | 6 +++--- .../core/actuator/UnfreezeBalanceActuator.java | 6 +++--- .../actuator/UnfreezeBalanceV2Actuator.java | 8 ++++---- .../WithdrawExpireUnfreezeActuator.java | 4 ++-- .../tron/core/store/DynamicPropertiesStore.java | 8 ++++---- .../tron/common/prometheus/MetricLabels.java | 13 +++++++------ .../tron/consensus/dpos/MaintenanceManager.java | 17 ++++++++--------- 10 files changed, 41 insertions(+), 41 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java b/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java index 723853640cc..4b762889ed2 100755 --- a/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java @@ -2,9 +2,9 @@ import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_HISTOGRAM; import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_DELEGATE; -import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_ENERGY; -import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_NET; -import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_VERSION_V2; +import static org.tron.common.prometheus.MetricLabels.STAKE_ENERGY; +import static org.tron.common.prometheus.MetricLabels.STAKE_NET; +import static org.tron.common.prometheus.MetricLabels.STAKE_VERSION_V2; import static org.tron.core.actuator.ActuatorConstant.NOT_EXIST_STR; import static org.tron.core.config.Parameter.ChainConstant.DELEGATE_PERIOD; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; diff --git a/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceActuator.java b/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceActuator.java index 17cdaaaa0cc..fe241665e60 100755 --- a/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceActuator.java @@ -1,10 +1,10 @@ package org.tron.core.actuator; import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_HISTOGRAM; -import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_ENERGY; +import static org.tron.common.prometheus.MetricLabels.STAKE_ENERGY; import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_FREEZE; -import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_NET; -import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_VERSION_V1; +import static org.tron.common.prometheus.MetricLabels.STAKE_NET; +import static org.tron.common.prometheus.MetricLabels.STAKE_VERSION_V1; import static org.tron.core.actuator.ActuatorConstant.NOT_EXIST_STR; import static org.tron.core.config.Parameter.ChainConstant.FROZEN_PERIOD; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; diff --git a/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceV2Actuator.java b/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceV2Actuator.java index 844521d9172..028a55424d9 100755 --- a/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceV2Actuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceV2Actuator.java @@ -1,11 +1,11 @@ package org.tron.core.actuator; import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_HISTOGRAM; -import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_ENERGY; +import static org.tron.common.prometheus.MetricLabels.STAKE_ENERGY; import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_FREEZE; -import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_NET; -import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_POWER; -import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_VERSION_V2; +import static org.tron.common.prometheus.MetricLabels.STAKE_NET; +import static org.tron.common.prometheus.MetricLabels.STAKE_POWER; +import static org.tron.common.prometheus.MetricLabels.STAKE_VERSION_V2; import static org.tron.core.actuator.ActuatorConstant.NOT_EXIST_STR; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; import static org.tron.protos.contract.Common.ResourceCode.BANDWIDTH; diff --git a/actuator/src/main/java/org/tron/core/actuator/UnDelegateResourceActuator.java b/actuator/src/main/java/org/tron/core/actuator/UnDelegateResourceActuator.java index 1c1ec22b55b..66178d2bd32 100755 --- a/actuator/src/main/java/org/tron/core/actuator/UnDelegateResourceActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/UnDelegateResourceActuator.java @@ -1,10 +1,10 @@ package org.tron.core.actuator; import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_HISTOGRAM; -import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_ENERGY; -import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_NET; +import static org.tron.common.prometheus.MetricLabels.STAKE_ENERGY; +import static org.tron.common.prometheus.MetricLabels.STAKE_NET; import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_UNDELEGATE; -import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_VERSION_V2; +import static org.tron.common.prometheus.MetricLabels.STAKE_VERSION_V2; import static org.tron.core.actuator.ActuatorConstant.ACCOUNT_EXCEPTION_STR; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; import static org.tron.protos.contract.Common.ResourceCode.BANDWIDTH; diff --git a/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceActuator.java b/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceActuator.java index e6a6b7df311..c092fca42d9 100755 --- a/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceActuator.java @@ -1,10 +1,10 @@ package org.tron.core.actuator; import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_HISTOGRAM; -import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_ENERGY; -import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_NET; +import static org.tron.common.prometheus.MetricLabels.STAKE_ENERGY; +import static org.tron.common.prometheus.MetricLabels.STAKE_NET; import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_UNFREEZE; -import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_VERSION_V1; +import static org.tron.common.prometheus.MetricLabels.STAKE_VERSION_V1; import static org.tron.core.actuator.ActuatorConstant.ACCOUNT_EXCEPTION_STR; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; diff --git a/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceV2Actuator.java b/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceV2Actuator.java index f455dcf3bf1..bce4e1e7457 100755 --- a/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceV2Actuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceV2Actuator.java @@ -1,11 +1,11 @@ package org.tron.core.actuator; import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_HISTOGRAM; -import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_ENERGY; -import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_NET; -import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_POWER; +import static org.tron.common.prometheus.MetricLabels.STAKE_ENERGY; +import static org.tron.common.prometheus.MetricLabels.STAKE_NET; +import static org.tron.common.prometheus.MetricLabels.STAKE_POWER; import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_UNFREEZE; -import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_VERSION_V2; +import static org.tron.common.prometheus.MetricLabels.STAKE_VERSION_V2; import static org.tron.core.actuator.ActuatorConstant.ACCOUNT_EXCEPTION_STR; import static org.tron.core.config.Parameter.ChainConstant.FROZEN_PERIOD; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; diff --git a/actuator/src/main/java/org/tron/core/actuator/WithdrawExpireUnfreezeActuator.java b/actuator/src/main/java/org/tron/core/actuator/WithdrawExpireUnfreezeActuator.java index f0ce3531122..3cf4ca9ef60 100755 --- a/actuator/src/main/java/org/tron/core/actuator/WithdrawExpireUnfreezeActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/WithdrawExpireUnfreezeActuator.java @@ -1,8 +1,8 @@ package org.tron.core.actuator; import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_HISTOGRAM; -import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_NET; -import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_VERSION_V2; +import static org.tron.common.prometheus.MetricLabels.STAKE_NET; +import static org.tron.common.prometheus.MetricLabels.STAKE_VERSION_V2; import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_WITHDRAW; import static org.tron.core.actuator.ActuatorConstant.ACCOUNT_EXCEPTION_STR; import static org.tron.core.actuator.ActuatorConstant.NOT_EXIST_STR; diff --git a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java index f624d05a828..b35d27177b0 100644 --- a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java +++ b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java @@ -1,10 +1,10 @@ package org.tron.core.store; import static org.tron.common.prometheus.MetricKeys.Gauge.TOTAL_RESOURCE_WEIGHT; -import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_ENERGY; -import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_NET; -import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_VERSION_V1; -import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_VERSION_V2; +import static org.tron.common.prometheus.MetricLabels.STAKE_ENERGY; +import static org.tron.common.prometheus.MetricLabels.STAKE_NET; +import static org.tron.common.prometheus.MetricLabels.STAKE_VERSION_V1; +import static org.tron.common.prometheus.MetricLabels.STAKE_VERSION_V2; import com.google.protobuf.ByteString; import java.util.Arrays; diff --git a/common/src/main/java/org/tron/common/prometheus/MetricLabels.java b/common/src/main/java/org/tron/common/prometheus/MetricLabels.java index 3be62079d18..6c054ac9b3d 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricLabels.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricLabels.java @@ -15,6 +15,13 @@ public class MetricLabels { public static final String BLOCK = "block"; public static final String TRX = "trx"; + + public static final String STAKE_NET = "net"; + public static final String STAKE_ENERGY = "energy"; + public static final String STAKE_POWER = "power"; + public static final String STAKE_VOTE = "vote"; + public static final String STAKE_VERSION_V1 = "v1"; + public static final String STAKE_VERSION_V2 = "v2"; /** * label keys */ @@ -80,17 +87,11 @@ private Gauge() { public static class Histogram { public static final String TRAFFIC_IN = "in"; public static final String TRAFFIC_OUT = "out"; - public static final String STAKE_VERSION_V1 = "v1"; - public static final String STAKE_VERSION_V2 = "v2"; public static final String STAKE_FREEZE = "freeze"; public static final String STAKE_UNFREEZE = "unfreeze"; public static final String STAKE_DELEGATE = "delegate"; public static final String STAKE_UNDELEGATE = "undelegate"; public static final String STAKE_WITHDRAW = "withdraw"; - public static final String STAKE_NET = "net"; - public static final String STAKE_ENERGY = "energy"; - public static final String STAKE_POWER = "power"; - private Histogram() { throw new IllegalStateException("Histogram"); diff --git a/consensus/src/main/java/org/tron/consensus/dpos/MaintenanceManager.java b/consensus/src/main/java/org/tron/consensus/dpos/MaintenanceManager.java index 2aa53d91355..f3e10a69bdc 100644 --- a/consensus/src/main/java/org/tron/consensus/dpos/MaintenanceManager.java +++ b/consensus/src/main/java/org/tron/consensus/dpos/MaintenanceManager.java @@ -1,9 +1,8 @@ package org.tron.consensus.dpos; import static org.tron.common.prometheus.MetricKeys.Gauge.TOTAL_RESOURCE_WEIGHT; -import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_NET; -import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_VERSION_V1; -import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_VERSION_V2; +import static org.tron.common.prometheus.MetricLabels.STAKE_VERSION_V1; +import static org.tron.common.prometheus.MetricLabels.STAKE_VOTE; import static org.tron.common.utils.WalletUtil.getAddressStringList; import com.google.common.collect.Maps; @@ -184,12 +183,12 @@ public void doMaintenance() { delegationStore.setWitnessVote(nextCycle, witness.createDbKey(), witness.getVoteCount()); }); consensusDelegate.updateWitnessStandby(all); - if (dynamicPropertiesStore.getTotalVoteWeight() == 0) { - long totalVote = consensusDelegate.getWitnessStandby().stream() - .mapToLong(WitnessCapsule::getVoteCount).sum(); - dynamicPropertiesStore.saveTotalVoteWeight(totalVote); - Metrics.gaugeSet(TOTAL_RESOURCE_WEIGHT, totalVote, STAKE_VERSION_V1, STAKE_NET); - } + + + long totalVote = consensusDelegate.getWitnessStandby().stream() + .mapToLong(WitnessCapsule::getVoteCount).sum(); + dynamicPropertiesStore.saveTotalVoteWeight(totalVote); + Metrics.gaugeSet(TOTAL_RESOURCE_WEIGHT, totalVote, STAKE_VERSION_V1, STAKE_VOTE); } } From 8acb198e603492c7a00b71a98e3ac559259bfdb6 Mon Sep 17 00:00:00 2001 From: liuxincheng Date: Thu, 23 Mar 2023 10:53:40 +0800 Subject: [PATCH 14/27] fix(freezeV2): add some metric logs --- .../org/tron/core/actuator/DelegateResourceActuator.java | 3 ++- .../java/org/tron/core/actuator/FreezeBalanceActuator.java | 5 ++++- .../org/tron/core/actuator/FreezeBalanceV2Actuator.java | 7 ++++++- .../org/tron/core/actuator/UnDelegateResourceActuator.java | 3 ++- .../org/tron/core/actuator/UnfreezeBalanceActuator.java | 5 ++++- .../java/org/tron/core/store/DynamicPropertiesStore.java | 2 ++ 6 files changed, 20 insertions(+), 5 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java b/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java index 4b762889ed2..deefdae4171 100755 --- a/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java @@ -91,7 +91,8 @@ public boolean execute(Object result) throws ContractExeException { default: logger.debug("Resource Code Error."); } - + logger.info("delegate resource detail:{},{},{}", ownerCapsule.getAddress(), + ownerCapsule.getType(), delegateBalance); accountStore.put(ownerCapsule.createDbKey(), ownerCapsule); ret.setStatus(fee, code.SUCESS); diff --git a/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceActuator.java b/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceActuator.java index fe241665e60..384f7d17962 100755 --- a/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceActuator.java @@ -133,7 +133,10 @@ public boolean execute(Object result) throws ContractExeException { default: logger.debug("Resource Code Error."); } - + logger.info("freezeV1 detail:{},{},{}", + accountCapsule.getAddress(), + accountCapsule.getType(), + frozenBalance); accountCapsule.setBalance(newBalance); accountStore.put(accountCapsule.createDbKey(), accountCapsule); diff --git a/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceV2Actuator.java b/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceV2Actuator.java index 028a55424d9..9a8127e7f15 100755 --- a/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceV2Actuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceV2Actuator.java @@ -90,7 +90,12 @@ public boolean execute(Object result) throws ContractExeException { default: logger.debug("Resource Code Error."); } - + logger.info("freezeV2 detail:{},{},{},{}", + accountCapsule.getAddress(), + accountCapsule.getType(), + frozenBalance, + accountCapsule.getFrozenV2BalanceWithDelegated(BANDWIDTH) + + accountCapsule.getFrozenV2BalanceWithDelegated(ENERGY)); accountCapsule.setBalance(newBalance); accountStore.put(accountCapsule.createDbKey(), accountCapsule); diff --git a/actuator/src/main/java/org/tron/core/actuator/UnDelegateResourceActuator.java b/actuator/src/main/java/org/tron/core/actuator/UnDelegateResourceActuator.java index 66178d2bd32..d85cb0ea59c 100755 --- a/actuator/src/main/java/org/tron/core/actuator/UnDelegateResourceActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/UnDelegateResourceActuator.java @@ -180,7 +180,8 @@ public boolean execute(Object result) throws ContractExeException { //this should never happen break; } - + logger.info("undelegate resource detail:{},{},{}", ownerCapsule.getAddress(), + ownerCapsule.getType(), unDelegateBalance); if (unlockResource.getFrozenBalanceForBandwidth() == 0 && unlockResource.getFrozenBalanceForEnergy() == 0) { delegatedResourceStore.delete(unlockKey); diff --git a/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceActuator.java b/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceActuator.java index c092fca42d9..5eb3706948b 100755 --- a/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceActuator.java @@ -301,7 +301,10 @@ public boolean execute(Object result) throws ContractExeException { } accountStore.put(ownerAddress, accountCapsule); - + logger.info("unfreezeV1 detail:{},{},{}", + accountCapsule.getAddress(), + accountCapsule.getType(), + unfreezeBalance); ret.setUnfreezeAmount(unfreezeBalance); ret.setStatus(fee, code.SUCESS); diff --git a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java index b35d27177b0..fcff70b7cf8 100644 --- a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java +++ b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java @@ -2243,6 +2243,7 @@ public void updateNextMaintenanceTime(long blockTime) { //The unit is trx public void addTotalNetWeight(long amount) { long totalNetWeight = getTotalNetWeight(); + logger.info("totalNetWeight:{}", totalNetWeight); totalNetWeight += amount; if (allowNewReward()) { totalNetWeight = Math.max(0, totalNetWeight); @@ -2255,6 +2256,7 @@ public void addTotalNetWeight(long amount) { //The unit is trx public void addTotalEnergyWeight(long amount) { long totalEnergyWeight = getTotalEnergyWeight(); + logger.info("totalEnergyWeight:{}", totalEnergyWeight); totalEnergyWeight += amount; if (allowNewReward()) { totalEnergyWeight = Math.max(0, totalEnergyWeight); From 65c190ec10b3b4750a8f6665d9daed959be4552f Mon Sep 17 00:00:00 2001 From: liuxincheng Date: Fri, 24 Mar 2023 11:21:25 +0800 Subject: [PATCH 15/27] fix(freezeV2): supplement some metric logs --- .../org/tron/core/actuator/DelegateResourceActuator.java | 3 ++- .../java/org/tron/core/actuator/FreezeBalanceActuator.java | 2 +- .../org/tron/core/actuator/FreezeBalanceV2Actuator.java | 2 +- .../org/tron/core/actuator/UnDelegateResourceActuator.java | 3 ++- .../org/tron/core/actuator/UnfreezeBalanceActuator.java | 2 +- .../org/tron/core/actuator/UnfreezeBalanceV2Actuator.java | 7 ++++++- .../java/org/tron/core/store/DynamicPropertiesStore.java | 4 ++-- 7 files changed, 15 insertions(+), 8 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java b/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java index deefdae4171..a8591f70793 100755 --- a/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java @@ -91,7 +91,8 @@ public boolean execute(Object result) throws ContractExeException { default: logger.debug("Resource Code Error."); } - logger.info("delegate resource detail:{},{},{}", ownerCapsule.getAddress(), + logger.info("delegate resource detail:{},{},{}", + StringUtil.createReadableString(ownerCapsule.getAddress()), ownerCapsule.getType(), delegateBalance); accountStore.put(ownerCapsule.createDbKey(), ownerCapsule); diff --git a/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceActuator.java b/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceActuator.java index 384f7d17962..d11215f904e 100755 --- a/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceActuator.java @@ -134,7 +134,7 @@ public boolean execute(Object result) throws ContractExeException { logger.debug("Resource Code Error."); } logger.info("freezeV1 detail:{},{},{}", - accountCapsule.getAddress(), + StringUtil.createReadableString(accountCapsule.getAddress()), accountCapsule.getType(), frozenBalance); accountCapsule.setBalance(newBalance); diff --git a/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceV2Actuator.java b/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceV2Actuator.java index 9a8127e7f15..acaa846b3ca 100755 --- a/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceV2Actuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceV2Actuator.java @@ -91,7 +91,7 @@ public boolean execute(Object result) throws ContractExeException { logger.debug("Resource Code Error."); } logger.info("freezeV2 detail:{},{},{},{}", - accountCapsule.getAddress(), + StringUtil.createReadableString(accountCapsule.getAddress()), accountCapsule.getType(), frozenBalance, accountCapsule.getFrozenV2BalanceWithDelegated(BANDWIDTH) + diff --git a/actuator/src/main/java/org/tron/core/actuator/UnDelegateResourceActuator.java b/actuator/src/main/java/org/tron/core/actuator/UnDelegateResourceActuator.java index d85cb0ea59c..ca31898d015 100755 --- a/actuator/src/main/java/org/tron/core/actuator/UnDelegateResourceActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/UnDelegateResourceActuator.java @@ -180,7 +180,8 @@ public boolean execute(Object result) throws ContractExeException { //this should never happen break; } - logger.info("undelegate resource detail:{},{},{}", ownerCapsule.getAddress(), + logger.info("undelegate resource detail:{},{},{}", + StringUtil.createReadableString(ownerCapsule.getAddress()), ownerCapsule.getType(), unDelegateBalance); if (unlockResource.getFrozenBalanceForBandwidth() == 0 && unlockResource.getFrozenBalanceForEnergy() == 0) { diff --git a/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceActuator.java b/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceActuator.java index 5eb3706948b..6a8d22b0aec 100755 --- a/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceActuator.java @@ -302,7 +302,7 @@ public boolean execute(Object result) throws ContractExeException { accountStore.put(ownerAddress, accountCapsule); logger.info("unfreezeV1 detail:{},{},{}", - accountCapsule.getAddress(), + StringUtil.createReadableString(accountCapsule.getAddress()), accountCapsule.getType(), unfreezeBalance); ret.setUnfreezeAmount(unfreezeBalance); diff --git a/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceV2Actuator.java b/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceV2Actuator.java index bce4e1e7457..a13bd99d3a1 100755 --- a/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceV2Actuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceV2Actuator.java @@ -99,7 +99,12 @@ public boolean execute(Object result) throws ContractExeException { } accountStore.put(ownerAddress, accountCapsule); - + logger.info("unfreezeV2 detail:{},{},{},{}", + StringUtil.createReadableString(accountCapsule.getAddress()), + accountCapsule.getType(), + unfreezeBalance, + accountCapsule.getFrozenV2BalanceWithDelegated(BANDWIDTH) + + accountCapsule.getFrozenV2BalanceWithDelegated(ENERGY)); ret.setWithdrawExpireAmount(unfreezeAmount); ret.setStatus(fee, code.SUCESS); return true; diff --git a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java index fcff70b7cf8..6c92c2781f7 100644 --- a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java +++ b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java @@ -2243,26 +2243,26 @@ public void updateNextMaintenanceTime(long blockTime) { //The unit is trx public void addTotalNetWeight(long amount) { long totalNetWeight = getTotalNetWeight(); - logger.info("totalNetWeight:{}", totalNetWeight); totalNetWeight += amount; if (allowNewReward()) { totalNetWeight = Math.max(0, totalNetWeight); } String version = supportUnfreezeDelay() ? STAKE_VERSION_V2 : STAKE_VERSION_V1; Metrics.gaugeSet(TOTAL_RESOURCE_WEIGHT, totalNetWeight, version, STAKE_NET); + logger.info("totalNetWeight:{}", totalNetWeight); saveTotalNetWeight(totalNetWeight); } //The unit is trx public void addTotalEnergyWeight(long amount) { long totalEnergyWeight = getTotalEnergyWeight(); - logger.info("totalEnergyWeight:{}", totalEnergyWeight); totalEnergyWeight += amount; if (allowNewReward()) { totalEnergyWeight = Math.max(0, totalEnergyWeight); } String version = supportUnfreezeDelay() ? STAKE_VERSION_V2 : STAKE_VERSION_V1; Metrics.gaugeSet(TOTAL_RESOURCE_WEIGHT, totalEnergyWeight, version, STAKE_ENERGY); + logger.info("totalEnergyWeight:{}", totalEnergyWeight); saveTotalEnergyWeight(totalEnergyWeight); } From 475aaa533cc51e5a62a721aa333417c8f382f025 Mon Sep 17 00:00:00 2001 From: liuxincheng Date: Wed, 28 Jun 2023 17:36:07 +0800 Subject: [PATCH 16/27] feat(freezeV2): supplement metrics for stake 2.0 --- .../core/actuator/CancelAllUnfreezeV2Actuator.java | 10 ++++++++++ .../tron/core/actuator/DelegateResourceActuator.java | 10 ++++++---- .../main/java/org/tron/core/db/ResourceProcessor.java | 2 -- .../java/org/tron/common/prometheus/MetricLabels.java | 1 + 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/actuator/CancelAllUnfreezeV2Actuator.java b/actuator/src/main/java/org/tron/core/actuator/CancelAllUnfreezeV2Actuator.java index 527c88115ac..498072a59ba 100755 --- a/actuator/src/main/java/org/tron/core/actuator/CancelAllUnfreezeV2Actuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/CancelAllUnfreezeV2Actuator.java @@ -1,5 +1,9 @@ package org.tron.core.actuator; +import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_HISTOGRAM; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_WITHDRAW; +import static org.tron.common.prometheus.MetricLabels.STAKE_NET; +import static org.tron.common.prometheus.MetricLabels.STAKE_VERSION_V2; import static org.tron.core.actuator.ActuatorConstant.ACCOUNT_EXCEPTION_STR; import static org.tron.core.actuator.ActuatorConstant.NOT_EXIST_STR; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; @@ -17,6 +21,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Triple; +import org.tron.common.prometheus.Metrics; import org.tron.common.utils.DecodeUtil; import org.tron.common.utils.StringUtil; import org.tron.core.capsule.AccountCapsule; @@ -82,6 +87,11 @@ public boolean execute(Object result) throws ContractExeException { cancelUnfreezeV2AmountMap.put(TRON_POWER.name(), triple.getRight().getRight().get()); ret.putAllCancelUnfreezeV2AmountMap(cancelUnfreezeV2AmountMap); ret.setStatus(fee, code.SUCESS); + long sum = cancelUnfreezeV2AmountMap.values() + .stream().mapToLong(v -> v).sum(); + Metrics.histogramObserve(STAKE_HISTOGRAM, sum, STAKE_VERSION_V2, STAKE_WITHDRAW, STAKE_NET); + logger.info("cancel all unfreezeV2 detail:{},{},{}", + StringUtil.createReadableString(ownerCapsule.getAddress()), ownerCapsule.getType(), sum); return true; } diff --git a/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java b/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java index 5b93fe77fb7..bab7aaf27b7 100755 --- a/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java @@ -5,6 +5,7 @@ import static org.tron.common.prometheus.MetricLabels.STAKE_ENERGY; import static org.tron.common.prometheus.MetricLabels.STAKE_NET; import static org.tron.common.prometheus.MetricLabels.STAKE_VERSION_V2; +import static org.tron.common.prometheus.MetricLabels.STAKE_VERSION_V2_1; import static org.tron.core.actuator.ActuatorConstant.NOT_EXIST_STR; import static org.tron.core.config.Parameter.ChainConstant.DELEGATE_PERIOD; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; @@ -72,7 +73,8 @@ public boolean execute(Object result) throws ContractExeException { boolean lock = delegateResourceContract.getLock(); long lockPeriod = getLockPeriod(dynamicStore, delegateResourceContract); byte[] receiverAddress = delegateResourceContract.getReceiverAddress().toByteArray(); - + String version = dynamicStore.supportMaxDelegateLockPeriod() ? + STAKE_VERSION_V2_1 : STAKE_VERSION_V2; // delegate resource to receiver switch (delegateResourceContract.getResource()) { case BANDWIDTH: @@ -82,7 +84,7 @@ public boolean execute(Object result) throws ContractExeException { ownerCapsule.addDelegatedFrozenV2BalanceForBandwidth(delegateBalance); ownerCapsule.addFrozenBalanceForBandwidthV2(-delegateBalance); Metrics.histogramObserve(STAKE_HISTOGRAM, delegateBalance, - STAKE_VERSION_V2, STAKE_DELEGATE, STAKE_NET); + version, STAKE_DELEGATE, STAKE_NET); break; case ENERGY: delegateResource(ownerAddress, receiverAddress, false, @@ -91,12 +93,12 @@ public boolean execute(Object result) throws ContractExeException { ownerCapsule.addDelegatedFrozenV2BalanceForEnergy(delegateBalance); ownerCapsule.addFrozenBalanceForEnergyV2(-delegateBalance); Metrics.histogramObserve(STAKE_HISTOGRAM, delegateBalance, - STAKE_VERSION_V2, STAKE_DELEGATE, STAKE_ENERGY); + version, STAKE_DELEGATE, STAKE_ENERGY); break; default: logger.debug("Resource Code Error."); } - logger.info("delegate resource detail:{},{},{}", + logger.info("delegate resource {} detail:{},{},{}", version, StringUtil.createReadableString(ownerCapsule.getAddress()), ownerCapsule.getType(), delegateBalance); accountStore.put(ownerCapsule.createDbKey(), ownerCapsule); diff --git a/chainbase/src/main/java/org/tron/core/db/ResourceProcessor.java b/chainbase/src/main/java/org/tron/core/db/ResourceProcessor.java index 87472b6212f..b60ed28c71d 100644 --- a/chainbase/src/main/java/org/tron/core/db/ResourceProcessor.java +++ b/chainbase/src/main/java/org/tron/core/db/ResourceProcessor.java @@ -1,7 +1,5 @@ package org.tron.core.db; -import static java.lang.Math.ceil; -import static java.lang.Math.round; import static org.tron.core.config.Parameter.ChainConstant.BLOCK_PRODUCED_INTERVAL; import static org.tron.core.config.Parameter.ChainConstant.WINDOW_SIZE_PRECISION; diff --git a/common/src/main/java/org/tron/common/prometheus/MetricLabels.java b/common/src/main/java/org/tron/common/prometheus/MetricLabels.java index 6c054ac9b3d..ae0f180ca54 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricLabels.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricLabels.java @@ -22,6 +22,7 @@ public class MetricLabels { public static final String STAKE_VOTE = "vote"; public static final String STAKE_VERSION_V1 = "v1"; public static final String STAKE_VERSION_V2 = "v2"; + public static final String STAKE_VERSION_V2_1 = "v2.1"; /** * label keys */ From 11878d774c3c56e3047bace9f74a935a6b2b261f Mon Sep 17 00:00:00 2001 From: liuxincheng Date: Fri, 30 Jun 2023 17:57:44 +0800 Subject: [PATCH 17/27] fix(freezeV2): add metrics for cancel unfreeze --- .../org/tron/core/actuator/CancelAllUnfreezeV2Actuator.java | 4 +++- .../main/java/org/tron/common/prometheus/MetricLabels.java | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/actuator/src/main/java/org/tron/core/actuator/CancelAllUnfreezeV2Actuator.java b/actuator/src/main/java/org/tron/core/actuator/CancelAllUnfreezeV2Actuator.java index 498072a59ba..7d0c6a64057 100755 --- a/actuator/src/main/java/org/tron/core/actuator/CancelAllUnfreezeV2Actuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/CancelAllUnfreezeV2Actuator.java @@ -1,6 +1,7 @@ package org.tron.core.actuator; import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_HISTOGRAM; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_CANCEL_UNFREEZE; import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_WITHDRAW; import static org.tron.common.prometheus.MetricLabels.STAKE_NET; import static org.tron.common.prometheus.MetricLabels.STAKE_VERSION_V2; @@ -89,7 +90,8 @@ public boolean execute(Object result) throws ContractExeException { ret.setStatus(fee, code.SUCESS); long sum = cancelUnfreezeV2AmountMap.values() .stream().mapToLong(v -> v).sum(); - Metrics.histogramObserve(STAKE_HISTOGRAM, sum, STAKE_VERSION_V2, STAKE_WITHDRAW, STAKE_NET); + Metrics.histogramObserve(STAKE_HISTOGRAM, sum, STAKE_VERSION_V2, + STAKE_CANCEL_UNFREEZE, STAKE_NET); logger.info("cancel all unfreezeV2 detail:{},{},{}", StringUtil.createReadableString(ownerCapsule.getAddress()), ownerCapsule.getType(), sum); return true; diff --git a/common/src/main/java/org/tron/common/prometheus/MetricLabels.java b/common/src/main/java/org/tron/common/prometheus/MetricLabels.java index ae0f180ca54..a8f1c5e4f93 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricLabels.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricLabels.java @@ -93,6 +93,7 @@ public static class Histogram { public static final String STAKE_DELEGATE = "delegate"; public static final String STAKE_UNDELEGATE = "undelegate"; public static final String STAKE_WITHDRAW = "withdraw"; + public static final String STAKE_CANCEL_UNFREEZE = "cancelUnfreeze"; private Histogram() { throw new IllegalStateException("Histogram"); From 0e44f5224712efbd24ef690135ef0c9e73bd9df9 Mon Sep 17 00:00:00 2001 From: lxcmyf Date: Fri, 14 Jul 2023 12:23:37 +0800 Subject: [PATCH 18/27] fix(metric): add metrics for resource window size (#5349) --- .../core/actuator/CancelAllUnfreezeV2Actuator.java | 3 ++- .../java/org/tron/core/capsule/AccountCapsule.java | 14 ++++++++++++-- .../org/tron/common/prometheus/MetricKeys.java | 1 + .../org/tron/common/prometheus/MetricLabels.java | 2 ++ .../org/tron/common/prometheus/MetricsGauge.java | 4 ++++ 5 files changed, 21 insertions(+), 3 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/actuator/CancelAllUnfreezeV2Actuator.java b/actuator/src/main/java/org/tron/core/actuator/CancelAllUnfreezeV2Actuator.java index 7d0c6a64057..9c8a1dc317d 100755 --- a/actuator/src/main/java/org/tron/core/actuator/CancelAllUnfreezeV2Actuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/CancelAllUnfreezeV2Actuator.java @@ -4,6 +4,7 @@ import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_CANCEL_UNFREEZE; import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_WITHDRAW; import static org.tron.common.prometheus.MetricLabels.STAKE_NET; +import static org.tron.common.prometheus.MetricLabels.STAKE_RESOURCE; import static org.tron.common.prometheus.MetricLabels.STAKE_VERSION_V2; import static org.tron.core.actuator.ActuatorConstant.ACCOUNT_EXCEPTION_STR; import static org.tron.core.actuator.ActuatorConstant.NOT_EXIST_STR; @@ -91,7 +92,7 @@ public boolean execute(Object result) throws ContractExeException { long sum = cancelUnfreezeV2AmountMap.values() .stream().mapToLong(v -> v).sum(); Metrics.histogramObserve(STAKE_HISTOGRAM, sum, STAKE_VERSION_V2, - STAKE_CANCEL_UNFREEZE, STAKE_NET); + STAKE_CANCEL_UNFREEZE, STAKE_RESOURCE); logger.info("cancel all unfreezeV2 detail:{},{},{}", StringUtil.createReadableString(ownerCapsule.getAddress()), ownerCapsule.getType(), sum); return true; diff --git a/chainbase/src/main/java/org/tron/core/capsule/AccountCapsule.java b/chainbase/src/main/java/org/tron/core/capsule/AccountCapsule.java index f833be0d9ca..b6ba28524ad 100644 --- a/chainbase/src/main/java/org/tron/core/capsule/AccountCapsule.java +++ b/chainbase/src/main/java/org/tron/core/capsule/AccountCapsule.java @@ -22,6 +22,7 @@ import org.apache.commons.collections4.CollectionUtils; import org.tron.common.prometheus.Metrics; import org.tron.common.utils.ByteArray; +import org.tron.common.utils.StringUtil; import org.tron.core.capsule.utils.AssetUtil; import org.tron.core.store.AssetIssueStore; import org.tron.core.store.DynamicPropertiesStore; @@ -43,7 +44,9 @@ import java.util.Map; import java.util.Objects; -import static java.lang.Math.ceil; +import static org.tron.common.prometheus.MetricKeys.Gauge.RESOURCE_WINDOW_SIZE; +import static org.tron.common.prometheus.MetricLabels.STAKE_ENERGY; +import static org.tron.common.prometheus.MetricLabels.STAKE_NET; import static org.tron.core.config.Parameter.ChainConstant.BLOCK_PRODUCED_INTERVAL; import static org.tron.core.config.Parameter.ChainConstant.WINDOW_SIZE_MS; import static org.tron.core.config.Parameter.ChainConstant.WINDOW_SIZE_PRECISION; @@ -1446,7 +1449,14 @@ public long getFrozenV2BalanceWithDelegated(ResourceCode resourceCode) { } } - public void setNewWindowSizeV2( ResourceCode resourceCode, long newWindowSize) { + public void setNewWindowSizeV2(ResourceCode resourceCode, long newWindowSize) { + if (newWindowSize > 0 && newWindowSize < WINDOW_SIZE_PRECISION) { + String resourceType = resourceCode == BANDWIDTH ? STAKE_NET : STAKE_ENERGY; + String address = StringUtil.createReadableString(this.getAddress()); + logger.warn("this account[{}]'s {} window size[{}] is unacceptable !", + address, resourceType, newWindowSize); + Metrics.gaugeSet(RESOURCE_WINDOW_SIZE, newWindowSize, address, resourceType); + } this.setNewWindowSize(resourceCode, newWindowSize); if (!this.getWindowOptimized(resourceCode)) { this.setWindowOptimized(resourceCode, true); diff --git a/common/src/main/java/org/tron/common/prometheus/MetricKeys.java b/common/src/main/java/org/tron/common/prometheus/MetricKeys.java index 5b2773bff1c..a52b040404e 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricKeys.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricKeys.java @@ -40,6 +40,7 @@ public static class Gauge { public static final String CONTRACT_USAGE = "tron:contract_usage_g"; public static final String TOTAL_RESOURCE_WEIGHT = "tron:total_resource_g"; + public static final String RESOURCE_WINDOW_SIZE = "tron:resource_window_size_g"; private Gauge() { throw new IllegalStateException("Gauge"); diff --git a/common/src/main/java/org/tron/common/prometheus/MetricLabels.java b/common/src/main/java/org/tron/common/prometheus/MetricLabels.java index a8f1c5e4f93..5db46101bf7 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricLabels.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricLabels.java @@ -19,6 +19,7 @@ public class MetricLabels { public static final String STAKE_NET = "net"; public static final String STAKE_ENERGY = "energy"; public static final String STAKE_POWER = "power"; + public static final String STAKE_RESOURCE = "resource"; public static final String STAKE_VOTE = "vote"; public static final String STAKE_VERSION_V1 = "v1"; public static final String STAKE_VERSION_V2 = "v2"; @@ -29,6 +30,7 @@ public class MetricLabels { public static final String LABEL_STAKE_VERSION = "version"; public static final String LABEL_RESOURCE_TYPE = "resource"; public static final String LABEL_CONTRACT_TYPE = "contract"; + public static final String ACCOUNT_ADDRESS = "address"; private MetricLabels() { throw new IllegalStateException("MetricsLabels"); diff --git a/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java b/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java index dd713c64d10..34f838c498f 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java @@ -1,5 +1,7 @@ package org.tron.common.prometheus; +import static org.tron.common.prometheus.MetricKeys.Gauge.RESOURCE_WINDOW_SIZE; +import static org.tron.common.prometheus.MetricLabels.ACCOUNT_ADDRESS; import static org.tron.common.prometheus.MetricLabels.LABEL_RESOURCE_TYPE; import static org.tron.common.prometheus.MetricLabels.LABEL_STAKE_VERSION; @@ -29,6 +31,8 @@ class MetricsGauge { init(MetricKeys.Gauge.TOTAL_RESOURCE_WEIGHT, "tron stake total resource weight.", LABEL_STAKE_VERSION, LABEL_RESOURCE_TYPE); + init(RESOURCE_WINDOW_SIZE, "tron resource window size.", + ACCOUNT_ADDRESS, LABEL_RESOURCE_TYPE); } private MetricsGauge() { From 6624dc0318eea3d0ab5848a7c869e883e1881995 Mon Sep 17 00:00:00 2001 From: vikingzzu Date: Wed, 2 Aug 2023 12:11:08 +0800 Subject: [PATCH 19/27] chore(api): add prometheus metrics 1. add verify sign size metric --- common/src/main/java/org/tron/common/prometheus/MetricKeys.java | 2 ++ .../src/main/java/org/tron/common/prometheus/MetricsGauge.java | 2 ++ framework/src/main/java/org/tron/core/db/Manager.java | 2 ++ 3 files changed, 6 insertions(+) diff --git a/common/src/main/java/org/tron/common/prometheus/MetricKeys.java b/common/src/main/java/org/tron/common/prometheus/MetricKeys.java index a52b040404e..fa55bf0bd2c 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricKeys.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricKeys.java @@ -42,6 +42,8 @@ public static class Gauge { public static final String TOTAL_RESOURCE_WEIGHT = "tron:total_resource_g"; public static final String RESOURCE_WINDOW_SIZE = "tron:resource_window_size_g"; + public static final String VERIFY_SIGN_SIZE = "tron:verify_sign_size"; + private Gauge() { throw new IllegalStateException("Gauge"); } diff --git a/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java b/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java index 34f838c498f..54504f26eca 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java @@ -33,6 +33,8 @@ class MetricsGauge { LABEL_STAKE_VERSION, LABEL_RESOURCE_TYPE); init(RESOURCE_WINDOW_SIZE, "tron resource window size.", ACCOUNT_ADDRESS, LABEL_RESOURCE_TYPE); + + init(MetricKeys.Gauge.VERIFY_SIGN_SIZE, "tron verify sign trx size.", "type"); } private MetricsGauge() { diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 3928f657e44..afc54a234ed 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -66,6 +66,7 @@ import org.tron.common.overlay.message.Message; import org.tron.common.parameter.CommonParameter; import org.tron.common.prometheus.MetricKeys; +import org.tron.common.prometheus.MetricKeys.Gauge; import org.tron.common.prometheus.MetricLabels; import org.tron.common.prometheus.Metrics; import org.tron.common.runtime.RuntimeImpl; @@ -1968,6 +1969,7 @@ private void preValidateTransactionSign(List txs) } } finally { Metrics.histogramObserve(requestTimer); + Metrics.gaugeSet(Gauge.VERIFY_SIGN_SIZE, txs.size(), MetricLabels.TRX); } } From 82eae4bb38f66f70534bfa065463c26de7cea6a9 Mon Sep 17 00:00:00 2001 From: vikingzzu Date: Fri, 4 Aug 2023 11:41:47 +0800 Subject: [PATCH 20/27] chore(api): add prometheus metrics 1. remove verify sign size metric type tag --- .../src/main/java/org/tron/common/prometheus/MetricsGauge.java | 2 +- framework/src/main/java/org/tron/core/db/Manager.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java b/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java index 54504f26eca..b17cf957a6f 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java @@ -34,7 +34,7 @@ class MetricsGauge { init(RESOURCE_WINDOW_SIZE, "tron resource window size.", ACCOUNT_ADDRESS, LABEL_RESOURCE_TYPE); - init(MetricKeys.Gauge.VERIFY_SIGN_SIZE, "tron verify sign trx size.", "type"); + init(MetricKeys.Gauge.VERIFY_SIGN_SIZE, "tron verify sign trx size."); } private MetricsGauge() { diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index afc54a234ed..7db9514523a 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -1969,7 +1969,7 @@ private void preValidateTransactionSign(List txs) } } finally { Metrics.histogramObserve(requestTimer); - Metrics.gaugeSet(Gauge.VERIFY_SIGN_SIZE, txs.size(), MetricLabels.TRX); + Metrics.gaugeSet(Gauge.VERIFY_SIGN_SIZE, txs.size()); } } From 1c30e84e40b2b9c8aa92b778d1e94b047b583274 Mon Sep 17 00:00:00 2001 From: Vikingzzu Date: Fri, 4 Aug 2023 13:41:03 +0800 Subject: [PATCH 21/27] chore(metric):add verify sign size metric (#5399) --- common/src/main/java/org/tron/common/prometheus/MetricKeys.java | 2 ++ .../src/main/java/org/tron/common/prometheus/MetricsGauge.java | 2 ++ framework/src/main/java/org/tron/core/db/Manager.java | 2 ++ 3 files changed, 6 insertions(+) diff --git a/common/src/main/java/org/tron/common/prometheus/MetricKeys.java b/common/src/main/java/org/tron/common/prometheus/MetricKeys.java index a52b040404e..fa55bf0bd2c 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricKeys.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricKeys.java @@ -42,6 +42,8 @@ public static class Gauge { public static final String TOTAL_RESOURCE_WEIGHT = "tron:total_resource_g"; public static final String RESOURCE_WINDOW_SIZE = "tron:resource_window_size_g"; + public static final String VERIFY_SIGN_SIZE = "tron:verify_sign_size"; + private Gauge() { throw new IllegalStateException("Gauge"); } diff --git a/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java b/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java index 34f838c498f..b17cf957a6f 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricsGauge.java @@ -33,6 +33,8 @@ class MetricsGauge { LABEL_STAKE_VERSION, LABEL_RESOURCE_TYPE); init(RESOURCE_WINDOW_SIZE, "tron resource window size.", ACCOUNT_ADDRESS, LABEL_RESOURCE_TYPE); + + init(MetricKeys.Gauge.VERIFY_SIGN_SIZE, "tron verify sign trx size."); } private MetricsGauge() { diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 3928f657e44..7db9514523a 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -66,6 +66,7 @@ import org.tron.common.overlay.message.Message; import org.tron.common.parameter.CommonParameter; import org.tron.common.prometheus.MetricKeys; +import org.tron.common.prometheus.MetricKeys.Gauge; import org.tron.common.prometheus.MetricLabels; import org.tron.common.prometheus.Metrics; import org.tron.common.runtime.RuntimeImpl; @@ -1968,6 +1969,7 @@ private void preValidateTransactionSign(List txs) } } finally { Metrics.histogramObserve(requestTimer); + Metrics.gaugeSet(Gauge.VERIFY_SIGN_SIZE, txs.size()); } } From 48e2708023d4ea356cd8f6084c2914d4f3c75a6e Mon Sep 17 00:00:00 2001 From: lxcmyf Date: Thu, 17 Aug 2023 19:50:51 +0800 Subject: [PATCH 22/27] feat(freezeV2): add unfreezeV2 can withdraw metrics (#5401) --- .../tron/core/actuator/CancelAllUnfreezeV2Actuator.java | 8 ++++++++ .../org/tron/core/actuator/UnfreezeBalanceV2Actuator.java | 7 +++++++ .../main/java/org/tron/common/prometheus/MetricKeys.java | 1 + .../java/org/tron/common/prometheus/MetricsHistogram.java | 3 +++ 4 files changed, 19 insertions(+) diff --git a/actuator/src/main/java/org/tron/core/actuator/CancelAllUnfreezeV2Actuator.java b/actuator/src/main/java/org/tron/core/actuator/CancelAllUnfreezeV2Actuator.java index 9c8a1dc317d..929fd6f0126 100755 --- a/actuator/src/main/java/org/tron/core/actuator/CancelAllUnfreezeV2Actuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/CancelAllUnfreezeV2Actuator.java @@ -1,8 +1,11 @@ package org.tron.core.actuator; import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_HISTOGRAM; +import static org.tron.common.prometheus.MetricKeys.Histogram.UNFREEZE_CAN_WITHDRAW; import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_CANCEL_UNFREEZE; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_UNFREEZE; import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_WITHDRAW; +import static org.tron.common.prometheus.MetricLabels.STAKE_ENERGY; import static org.tron.common.prometheus.MetricLabels.STAKE_NET; import static org.tron.common.prometheus.MetricLabels.STAKE_RESOURCE; import static org.tron.common.prometheus.MetricLabels.STAKE_VERSION_V2; @@ -93,6 +96,11 @@ public boolean execute(Object result) throws ContractExeException { .stream().mapToLong(v -> v).sum(); Metrics.histogramObserve(STAKE_HISTOGRAM, sum, STAKE_VERSION_V2, STAKE_CANCEL_UNFREEZE, STAKE_RESOURCE); + + Metrics.histogramObserve(UNFREEZE_CAN_WITHDRAW, -triple.getLeft().getRight().get(), + STAKE_VERSION_V2, STAKE_NET); + Metrics.histogramObserve(UNFREEZE_CAN_WITHDRAW, -triple.getMiddle().getRight().get(), + STAKE_VERSION_V2, STAKE_ENERGY); logger.info("cancel all unfreezeV2 detail:{},{},{}", StringUtil.createReadableString(ownerCapsule.getAddress()), ownerCapsule.getType(), sum); return true; diff --git a/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceV2Actuator.java b/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceV2Actuator.java index a13bd99d3a1..b9783a471ac 100755 --- a/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceV2Actuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceV2Actuator.java @@ -1,6 +1,7 @@ package org.tron.core.actuator; import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_HISTOGRAM; +import static org.tron.common.prometheus.MetricKeys.Histogram.UNFREEZE_CAN_WITHDRAW; import static org.tron.common.prometheus.MetricLabels.STAKE_ENERGY; import static org.tron.common.prometheus.MetricLabels.STAKE_NET; import static org.tron.common.prometheus.MetricLabels.STAKE_POWER; @@ -293,6 +294,8 @@ public void updateTotalResourceWeight(AccountCapsule accountCapsule, dynamicStore.addTotalNetWeight(newNetWeight - oldNetWeight); Metrics.histogramObserve(STAKE_HISTOGRAM, unfreezeBalance, STAKE_VERSION_V2, STAKE_UNFREEZE, STAKE_NET); + Metrics.histogramObserve(UNFREEZE_CAN_WITHDRAW, unfreezeBalance, + STAKE_VERSION_V2, STAKE_UNFREEZE, STAKE_NET); break; case ENERGY: long oldEnergyWeight = accountCapsule.getFrozenV2BalanceWithDelegated(ENERGY) / TRX_PRECISION; @@ -301,6 +304,8 @@ public void updateTotalResourceWeight(AccountCapsule accountCapsule, dynamicStore.addTotalEnergyWeight(newEnergyWeight - oldEnergyWeight); Metrics.histogramObserve(STAKE_HISTOGRAM, unfreezeBalance, STAKE_VERSION_V2, STAKE_UNFREEZE, STAKE_ENERGY); + Metrics.histogramObserve(UNFREEZE_CAN_WITHDRAW, unfreezeBalance, + STAKE_VERSION_V2, STAKE_ENERGY); break; case TRON_POWER: long oldTPWeight = accountCapsule.getTronPowerFrozenV2Balance() / TRX_PRECISION; @@ -309,6 +314,8 @@ public void updateTotalResourceWeight(AccountCapsule accountCapsule, dynamicStore.addTotalTronPowerWeight(newTPWeight - oldTPWeight); Metrics.histogramObserve(STAKE_HISTOGRAM, unfreezeBalance, STAKE_VERSION_V2, STAKE_UNFREEZE, STAKE_POWER); + Metrics.histogramObserve(UNFREEZE_CAN_WITHDRAW, unfreezeBalance, + STAKE_VERSION_V2, STAKE_UNFREEZE, STAKE_POWER); break; default: //this should never happen diff --git a/common/src/main/java/org/tron/common/prometheus/MetricKeys.java b/common/src/main/java/org/tron/common/prometheus/MetricKeys.java index fa55bf0bd2c..a3a6069eafa 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricKeys.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricKeys.java @@ -74,6 +74,7 @@ public static class Histogram { public static final String BLOCK_RECEIVE_DELAY = "tron:block_receive_delay_seconds"; public static final String STAKE_HISTOGRAM = "tron:stake_h"; + public static final String UNFREEZE_CAN_WITHDRAW = "tron:unfreeze_can_withdraw"; private Histogram() { throw new IllegalStateException("Histogram"); diff --git a/common/src/main/java/org/tron/common/prometheus/MetricsHistogram.java b/common/src/main/java/org/tron/common/prometheus/MetricsHistogram.java index 98cdffc2be2..b9a195cc32f 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricsHistogram.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricsHistogram.java @@ -55,6 +55,9 @@ public class MetricsHistogram { init(MetricKeys.Histogram.STAKE_HISTOGRAM, "stake net aggregate.", LABEL_STAKE_VERSION, LABEL_CONTRACT_TYPE, LABEL_RESOURCE_TYPE); + + init(MetricKeys.Histogram.UNFREEZE_CAN_WITHDRAW, "unfreeze can withdraw.", + LABEL_STAKE_VERSION, LABEL_RESOURCE_TYPE); } private MetricsHistogram() { From 398a50d5087ad34164873dec6af42780107abaf5 Mon Sep 17 00:00:00 2001 From: lxcmyf Date: Mon, 11 Dec 2023 21:44:00 +0800 Subject: [PATCH 23/27] fix(metrics): fix the number of metric labels (#5605) --- .../java/org/tron/core/actuator/UnfreezeBalanceV2Actuator.java | 2 +- .../main/java/org/tron/common/prometheus/MetricsHistogram.java | 2 +- .../org/tron/core/actuator/UnfreezeBalanceV2ActuatorTest.java | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceV2Actuator.java b/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceV2Actuator.java index b9783a471ac..06fc2499f6b 100755 --- a/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceV2Actuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/UnfreezeBalanceV2Actuator.java @@ -305,7 +305,7 @@ public void updateTotalResourceWeight(AccountCapsule accountCapsule, Metrics.histogramObserve(STAKE_HISTOGRAM, unfreezeBalance, STAKE_VERSION_V2, STAKE_UNFREEZE, STAKE_ENERGY); Metrics.histogramObserve(UNFREEZE_CAN_WITHDRAW, unfreezeBalance, - STAKE_VERSION_V2, STAKE_ENERGY); + STAKE_VERSION_V2, STAKE_UNFREEZE, STAKE_ENERGY); break; case TRON_POWER: long oldTPWeight = accountCapsule.getTronPowerFrozenV2Balance() / TRX_PRECISION; diff --git a/common/src/main/java/org/tron/common/prometheus/MetricsHistogram.java b/common/src/main/java/org/tron/common/prometheus/MetricsHistogram.java index b9a195cc32f..425c29c26b5 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricsHistogram.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricsHistogram.java @@ -57,7 +57,7 @@ public class MetricsHistogram { LABEL_STAKE_VERSION, LABEL_CONTRACT_TYPE, LABEL_RESOURCE_TYPE); init(MetricKeys.Histogram.UNFREEZE_CAN_WITHDRAW, "unfreeze can withdraw.", - LABEL_STAKE_VERSION, LABEL_RESOURCE_TYPE); + LABEL_STAKE_VERSION, LABEL_CONTRACT_TYPE, LABEL_RESOURCE_TYPE); } private MetricsHistogram() { diff --git a/framework/src/test/java/org/tron/core/actuator/UnfreezeBalanceV2ActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/UnfreezeBalanceV2ActuatorTest.java index 14a6de98606..289e8f36b76 100644 --- a/framework/src/test/java/org/tron/core/actuator/UnfreezeBalanceV2ActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/UnfreezeBalanceV2ActuatorTest.java @@ -11,6 +11,7 @@ import org.junit.Before; import org.junit.Test; import org.tron.common.BaseTest; +import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.ByteArray; import org.tron.core.Constant; import org.tron.core.Wallet; @@ -40,6 +41,7 @@ public class UnfreezeBalanceV2ActuatorTest extends BaseTest { static { dbPath = "output_unfreeze_balance_v2_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); + CommonParameter.getInstance().setMetricsPrometheusEnable(true); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; RECEIVER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049150"; OWNER_ACCOUNT_INVALID = From af8bfc700f02ba5652be92c78086551cd3ae81b6 Mon Sep 17 00:00:00 2001 From: "morgan.peng" Date: Wed, 13 Dec 2023 22:03:00 +0800 Subject: [PATCH 24/27] fixMetricError --- .../org/tron/core/actuator/CancelAllUnfreezeV2Actuator.java | 4 ++-- .../tron/core/actuator/CancelAllUnfreezeV2ActuatorTest.java | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/actuator/CancelAllUnfreezeV2Actuator.java b/actuator/src/main/java/org/tron/core/actuator/CancelAllUnfreezeV2Actuator.java index df4b8ad605a..1253b883ad5 100755 --- a/actuator/src/main/java/org/tron/core/actuator/CancelAllUnfreezeV2Actuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/CancelAllUnfreezeV2Actuator.java @@ -103,9 +103,9 @@ public boolean execute(Object result) throws ContractExeException { STAKE_CANCEL_UNFREEZE, STAKE_RESOURCE); Metrics.histogramObserve(UNFREEZE_CAN_WITHDRAW, -triple.getLeft().getRight().get(), - STAKE_VERSION_V2, STAKE_NET); + STAKE_VERSION_V2, STAKE_CANCEL_UNFREEZE, STAKE_NET); Metrics.histogramObserve(UNFREEZE_CAN_WITHDRAW, -triple.getMiddle().getRight().get(), - STAKE_VERSION_V2, STAKE_ENERGY); + STAKE_VERSION_V2, STAKE_CANCEL_UNFREEZE, STAKE_ENERGY); logger.info("cancel all unfreezeV2 detail:{},{},{}", StringUtil.createReadableString(ownerCapsule.getAddress()), ownerCapsule.getType(), sum); return true; diff --git a/framework/src/test/java/org/tron/core/actuator/CancelAllUnfreezeV2ActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/CancelAllUnfreezeV2ActuatorTest.java index fc2dad88420..0c92cfc3bcc 100644 --- a/framework/src/test/java/org/tron/core/actuator/CancelAllUnfreezeV2ActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/CancelAllUnfreezeV2ActuatorTest.java @@ -14,6 +14,7 @@ import org.junit.Before; import org.junit.Test; import org.tron.common.BaseTest; +import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.ByteArray; import org.tron.core.Constant; import org.tron.core.Wallet; @@ -36,6 +37,7 @@ public class CancelAllUnfreezeV2ActuatorTest extends BaseTest { static { Args.setParam(new String[]{"--output-directory", dbPath()}, Constant.TEST_CONF); + CommonParameter.getInstance().setMetricsPrometheusEnable(true); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; RECEIVER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049150"; OWNER_ACCOUNT_INVALID = From eb86934abce6ada4e69907ffefdd9d2d9f51b451 Mon Sep 17 00:00:00 2001 From: vikingzzu Date: Mon, 15 Apr 2024 20:34:32 +0800 Subject: [PATCH 25/27] chore(api): merge v4.7.4 code prometheus metrics 1. merge v4.7.4 code prometheus metrics --- .../src/main/java/org/tron/consensus/ConsensusDelegate.java | 4 ---- .../main/java/org/tron/consensus/dpos/MaintenanceManager.java | 1 - 2 files changed, 5 deletions(-) diff --git a/consensus/src/main/java/org/tron/consensus/ConsensusDelegate.java b/consensus/src/main/java/org/tron/consensus/ConsensusDelegate.java index 1f91f902c51..8318b55e30c 100644 --- a/consensus/src/main/java/org/tron/consensus/ConsensusDelegate.java +++ b/consensus/src/main/java/org/tron/consensus/ConsensusDelegate.java @@ -112,10 +112,6 @@ public List getWitnessStandby() { return witnessStore.getWitnessStandby(); } - public List updateWitnessStandby(List all) { - return witnessStore.updateWitnessStandby(all); - } - public void saveStateFlag(int flag) { dynamicPropertiesStore.saveStateFlag(flag); } diff --git a/consensus/src/main/java/org/tron/consensus/dpos/MaintenanceManager.java b/consensus/src/main/java/org/tron/consensus/dpos/MaintenanceManager.java index f3e10a69bdc..d3562d64111 100644 --- a/consensus/src/main/java/org/tron/consensus/dpos/MaintenanceManager.java +++ b/consensus/src/main/java/org/tron/consensus/dpos/MaintenanceManager.java @@ -182,7 +182,6 @@ public void doMaintenance() { delegationStore.getBrokerage(witness.createDbKey())); delegationStore.setWitnessVote(nextCycle, witness.createDbKey(), witness.getVoteCount()); }); - consensusDelegate.updateWitnessStandby(all); long totalVote = consensusDelegate.getWitnessStandby().stream() From 7777fa52bd9828803bf23950669ffabb99599d97 Mon Sep 17 00:00:00 2001 From: liuxincheng Date: Mon, 3 Jun 2024 14:31:30 +0800 Subject: [PATCH 26/27] feat(metrics): add metrics for attack types --- .../src/main/java/org/tron/core/db/BandwidthProcessor.java | 6 ++++++ .../main/java/org/tron/common/prometheus/MetricKeys.java | 2 ++ .../main/java/org/tron/common/prometheus/MetricLabels.java | 6 ++++++ .../java/org/tron/common/prometheus/MetricsCounter.java | 4 ++++ framework/src/main/java/org/tron/core/db/Manager.java | 3 +++ .../org/tron/core/net/messagehandler/BlockMsgHandler.java | 5 +++++ 6 files changed, 26 insertions(+) diff --git a/chainbase/src/main/java/org/tron/core/db/BandwidthProcessor.java b/chainbase/src/main/java/org/tron/core/db/BandwidthProcessor.java index 3f0db86c537..6361c5cef1a 100644 --- a/chainbase/src/main/java/org/tron/core/db/BandwidthProcessor.java +++ b/chainbase/src/main/java/org/tron/core/db/BandwidthProcessor.java @@ -1,5 +1,8 @@ package org.tron.core.db; +import static org.tron.common.prometheus.MetricKeys.Counter.TX_ATTACK; +import static org.tron.common.prometheus.MetricLabels.ATTACK_BIG_TX_RET; +import static org.tron.common.prometheus.MetricLabels.ATTACK_CREATE_ACCOUNT; import static org.tron.core.Constant.PER_SIGN_LENGTH; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; import static org.tron.protos.Protocol.Transaction.Contract.ContractType.ShieldedTransferContract; @@ -11,6 +14,7 @@ import java.util.List; import java.util.Map; import lombok.extern.slf4j.Slf4j; +import org.tron.common.prometheus.Metrics; import org.tron.common.utils.ByteArray; import org.tron.common.utils.Commons; import org.tron.common.utils.StringUtil; @@ -101,6 +105,7 @@ public void consume(TransactionCapsule trx, TransactionTrace trace) long resultSizeWithMaxContractRet = trx.getResultSizeWithMaxContractRet(); if (!trx.isInBlock() && resultSizeWithMaxContractRet > Constant.MAX_RESULT_SIZE_IN_TX * contracts.size()) { + Metrics.counterInc(TX_ATTACK, 1, ATTACK_BIG_TX_RET); throw new TooBigTransactionResultException(String.format( "Too big transaction result, TxId %s, the result size is %d bytes, maxResultSize %d", trx.getTransactionId(), resultSizeWithMaxContractRet, Constant.MAX_RESULT_SIZE_IN_TX)); @@ -141,6 +146,7 @@ public void consume(TransactionCapsule trx, TransactionTrace trace) long createAccountBytesSize = trx.getInstance().toBuilder().clearRet() .build().getSerializedSize() - (signatureCount * PER_SIGN_LENGTH); if (createAccountBytesSize > maxCreateAccountTxSize) { + Metrics.counterInc(TX_ATTACK, 1, ATTACK_CREATE_ACCOUNT); throw new TooBigTransactionException(String.format( "Too big new account transaction, TxId %s, the size is %d bytes, maxTxSize %d", trx.getTransactionId(), createAccountBytesSize, maxCreateAccountTxSize)); diff --git a/common/src/main/java/org/tron/common/prometheus/MetricKeys.java b/common/src/main/java/org/tron/common/prometheus/MetricKeys.java index a3a6069eafa..2190dddf4dc 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricKeys.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricKeys.java @@ -17,6 +17,8 @@ public static class Counter { public static final String P2P_ERROR = "tron:p2p_error"; public static final String P2P_DISCONNECT = "tron:p2p_disconnect"; public static final String INTERNAL_SERVICE_FAIL = "tron:internal_service_fail"; + public static final String TX_ATTACK = "tron:tx_attack"; + public static final String BLK_ATTACK = "tron:blk_attack"; private Counter() { throw new IllegalStateException("Counter"); diff --git a/common/src/main/java/org/tron/common/prometheus/MetricLabels.java b/common/src/main/java/org/tron/common/prometheus/MetricLabels.java index 5db46101bf7..5dce8a2ed89 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricLabels.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricLabels.java @@ -24,6 +24,11 @@ public class MetricLabels { public static final String STAKE_VERSION_V1 = "v1"; public static final String STAKE_VERSION_V2 = "v2"; public static final String STAKE_VERSION_V2_1 = "v2.1"; + public static final String ATTACK_CREATE_ACCOUNT = "createaccount"; + public static final String ATTACK_BIG_TX = "bigtx"; + public static final String ATTACK_BIG_TX_RET = "bigtxret"; + public static final String ATTACK_BIG_BLK = "bigblk"; + public static final String ATTACK_LONG_GAP = "longgap"; /** * label keys */ @@ -31,6 +36,7 @@ public class MetricLabels { public static final String LABEL_RESOURCE_TYPE = "resource"; public static final String LABEL_CONTRACT_TYPE = "contract"; public static final String ACCOUNT_ADDRESS = "address"; + public static final String ATTACK_TYPE = "attack"; private MetricLabels() { throw new IllegalStateException("MetricsLabels"); diff --git a/common/src/main/java/org/tron/common/prometheus/MetricsCounter.java b/common/src/main/java/org/tron/common/prometheus/MetricsCounter.java index c74df003aa1..ad4175a9ebe 100644 --- a/common/src/main/java/org/tron/common/prometheus/MetricsCounter.java +++ b/common/src/main/java/org/tron/common/prometheus/MetricsCounter.java @@ -1,5 +1,7 @@ package org.tron.common.prometheus; +import static org.tron.common.prometheus.MetricLabels.ATTACK_TYPE; + import io.prometheus.client.Counter; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -17,6 +19,8 @@ class MetricsCounter { init(MetricKeys.Counter.P2P_ERROR, "tron p2p error info .", "type"); init(MetricKeys.Counter.P2P_DISCONNECT, "tron p2p disconnect .", "type"); init(MetricKeys.Counter.INTERNAL_SERVICE_FAIL, "internal Service fail.", "class", "method"); + init(MetricKeys.Counter.TX_ATTACK, "transaction attack.", ATTACK_TYPE); + init(MetricKeys.Counter.BLK_ATTACK, "block attack.", ATTACK_TYPE); } private MetricsCounter() { diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 429444a7eba..2bcaf606761 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -1,5 +1,7 @@ package org.tron.core.db; +import static org.tron.common.prometheus.MetricKeys.Counter.TX_ATTACK; +import static org.tron.common.prometheus.MetricLabels.ATTACK_BIG_TX; import static org.tron.common.utils.Commons.adjustBalance; import static org.tron.core.Constant.TRANSACTION_MAX_BYTE_SIZE; import static org.tron.core.exception.BadBlockException.TypeEnum.CALC_MERKLE_ROOT_FAILED; @@ -801,6 +803,7 @@ void validateCommon(TransactionCapsule transactionCapsule) transactionCapsule.getInstance().toBuilder().clearRet().build().getSerializedSize() + Constant.MAX_RESULT_SIZE_IN_TX + Constant.MAX_RESULT_SIZE_IN_TX; if (generalBytesSize > TRANSACTION_MAX_BYTE_SIZE) { + Metrics.counterInc(TX_ATTACK, 1, ATTACK_BIG_TX); throw new TooBigTransactionException(String.format( "Too big transaction with result, TxId %s, the size is %d bytes, maxTxSize %d", transactionCapsule.getTransactionId(), generalBytesSize, TRANSACTION_MAX_BYTE_SIZE)); diff --git a/framework/src/main/java/org/tron/core/net/messagehandler/BlockMsgHandler.java b/framework/src/main/java/org/tron/core/net/messagehandler/BlockMsgHandler.java index 926ed1a01ca..0bd04cc6e8a 100644 --- a/framework/src/main/java/org/tron/core/net/messagehandler/BlockMsgHandler.java +++ b/framework/src/main/java/org/tron/core/net/messagehandler/BlockMsgHandler.java @@ -1,5 +1,8 @@ package org.tron.core.net.messagehandler; +import static org.tron.common.prometheus.MetricKeys.Counter.BLK_ATTACK; +import static org.tron.common.prometheus.MetricLabels.ATTACK_BIG_BLK; +import static org.tron.common.prometheus.MetricLabels.ATTACK_LONG_GAP; import static org.tron.core.config.Parameter.ChainConstant.BLOCK_PRODUCED_INTERVAL; import static org.tron.core.config.Parameter.ChainConstant.BLOCK_SIZE; @@ -63,12 +66,14 @@ public void processMessage(PeerConnection peer, TronMessage msg) throws P2pExcep BlockCapsule blockCapsule = blockMessage.getBlockCapsule(); if (blockCapsule.getInstance().getSerializedSize() > maxBlockSize) { + Metrics.counterInc(BLK_ATTACK, 1, ATTACK_BIG_BLK); logger.error("Receive bad block {} from peer {}, block size over limit", blockMessage.getBlockId(), peer.getInetSocketAddress()); throw new P2pException(TypeEnum.BAD_MESSAGE, "block size over limit"); } long gap = blockCapsule.getTimeStamp() - System.currentTimeMillis(); if (gap >= BLOCK_PRODUCED_INTERVAL) { + Metrics.counterInc(BLK_ATTACK, 1, ATTACK_LONG_GAP); logger.error("Receive bad block {} from peer {}, block time error", blockMessage.getBlockId(), peer.getInetSocketAddress()); throw new P2pException(TypeEnum.BAD_MESSAGE, "block time error"); From fb204b30d32c04fa2b8050768a5f32731d1badf5 Mon Sep 17 00:00:00 2001 From: ffkissyou Date: Tue, 22 Oct 2024 11:25:39 +0800 Subject: [PATCH 27/27] Merge Master (#6047) * update a new version. version name:GreatVoyage-v4.7.4-44-g8720e06a6,version code:18306 * test(CI): add test-retry plugin for test Mitigate flaky tests by retrying tests when they fail. * feat(version): update version to 4.7.6 * feat(net) : optimize the isIdle method * feat(net): add isSyncIdle method * feat(net): optimize fetch inventory message check logic * feat(net) : optimizing the sortPeers method * feat(net): use comparingLong method for sortPeers * initial commit of test isolated * init commit of set_block_both_have2 * test(MerkleTree): ignore testConcurrent This is an unstable concurrent unit test. * add testcase testProcessBlock for BlockMsgHandler * add testcase testProcessBlock for BlockMsgHandler * fix(http/metric): change endpoint variable from member to local * set lastactivetime in P2pEventHandlerImpl * add updateLastActiveTime * optimize log method of PeerConnection * catch exception of sort peers * catch exception min of peers * feat(monitor): add tcp out traffic and udp in traffic statistics * add some log for isolated2 disconnection * add log of candidate disconnect size when node is isolated * set blockNotChangeThreshold from 90 to 60 seconds * remove the condition of peer.isDisconnect * don't disconnect with syncing node when random disconnect * add DisConnectCause * add DisConnectCause * change the condition of isLanNode * don't disconnect with syncing peer if i am lan node * modify testcase of ResilienceServiceTest * use the condition: active size >= min active size in isolate2 * change varible name from lastActiveTime to lastInteractiveTime * fix the testcase of testUpdateLastInteractiveTime * Add transaction expiration time check before execution (#1) feat(net): add transaction expiration time check before execution * prefer to disconnect from broadcast nodes when isOpenFullTcpDisconnect is enable * adjust ResilienceServiceTest * add testcase PeerStatusCheckTest * use WeightedRandom to choose broadcast peer * don't disconnect from high peer if its number <=1 * feat(net): delete useless test code * print trx size from pending and repush after generating block * add some test case * feat(dependencies): update dependencies for protobuf-java Bump com.google.protobuf:protobuf-java from 3.21.12 to 3.25.5 Bump io.github.tronprotocol:libp2p from 2.2.1 to 2.2.4 * update a new version. version name:GreatVoyage-v4.7.5-64-g4103dfeb63,version code:18372 --------- Co-authored-by: halibobo1205 Co-authored-by: zeusoo001 Co-authored-by: jiangyuanshu <317787106@qq.com> Co-authored-by: tomatoishealthy Co-authored-by: fyyhtx <72650068+fyyhtx@users.noreply.github.com> Co-authored-by: chengtx01 --- build.gradle | 7 - .../java/org/tron/core/ChainBaseManager.java | 5 + .../tron/core/capsule/TransactionCapsule.java | 9 + common/build.gradle | 2 +- .../common/parameter/CommonParameter.java | 3 + .../src/main/java/org/tron/core/Constant.java | 2 + framework/build.gradle | 5 + .../src/main/java/org/tron/core/Wallet.java | 1 + .../java/org/tron/core/config/args/Args.java | 7 + .../main/java/org/tron/core/db/Manager.java | 20 +- .../tron/core/net/P2pEventHandlerImpl.java | 25 +- .../org/tron/core/net/TronNetDelegate.java | 8 + .../org/tron/core/net/TronNetService.java | 8 +- .../net/messagehandler/BlockMsgHandler.java | 7 + .../FetchInvDataMsgHandler.java | 4 + .../messagehandler/InventoryMsgHandler.java | 3 + .../SyncBlockChainMsgHandler.java | 1 - .../TransactionsMsgHandler.java | 5 + .../tron/core/net/peer/PeerConnection.java | 16 +- .../org/tron/core/net/peer/PeerManager.java | 6 +- .../service/effective/ResilienceService.java | 262 ++++++++++++++++++ .../service/statistics/TronStatsManager.java | 8 + .../core/net/service/sync/SyncService.java | 4 +- .../core/services/filter/HttpInterceptor.java | 2 +- .../main/java/org/tron/program/Version.java | 6 +- .../src/main/resources/config-localtest.conf | 1 + framework/src/main/resources/config.conf | 1 + .../core/capsule/utils/MerkleTreeTest.java | 2 + .../tron/core/db/TransactionExpireTest.java | 79 +++++- .../core/net/P2pEventHandlerImplTest.java | 21 ++ .../messagehandler/BlockMsgHandlerTest.java | 52 +++- .../FetchInvDataMsgHandlerTest.java | 35 ++- .../TransactionsMsgHandlerTest.java | 43 +++ .../core/net/peer/PeerConnectionTest.java | 30 ++ .../tron/core/net/peer/PeerManagerTest.java | 28 ++ .../core/net/peer/PeerStatusCheckTest.java | 73 +++++ .../core/net/services/AdvServiceTest.java | 19 +- .../net/services/ResilienceServiceTest.java | 205 ++++++++++++++ .../net/services/TronStatsManagerTest.java | 36 +++ framework/src/test/resources/args-test.conf | 1 + .../src/test/resources/config-localtest.conf | 1 + framework/src/test/resources/config-test.conf | 1 + .../org/tron/plugins/utils/ByteArrayTest.java | 44 +++ protocol/build.gradle | 2 +- 44 files changed, 1054 insertions(+), 46 deletions(-) create mode 100644 framework/src/main/java/org/tron/core/net/service/effective/ResilienceService.java create mode 100644 framework/src/test/java/org/tron/core/net/peer/PeerStatusCheckTest.java create mode 100644 framework/src/test/java/org/tron/core/net/services/ResilienceServiceTest.java create mode 100644 plugins/src/test/java/org/tron/plugins/utils/ByteArrayTest.java diff --git a/build.gradle b/build.gradle index a56be97afa1..f5b144657f3 100644 --- a/build.gradle +++ b/build.gradle @@ -39,7 +39,6 @@ subprojects { compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25' compile group: 'org.slf4j', name: 'jcl-over-slf4j', version: '1.7.25' compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.9' - compile group: 'com.google.guava', name: 'guava', version: '30.1-jre' compile "com.google.code.findbugs:jsr305:3.0.0" compile group: 'org.springframework', name: 'spring-context', version: '5.3.18' compile group: 'org.springframework', name: 'spring-tx', version: '5.3.18' @@ -68,12 +67,6 @@ subprojects { preserveFileTimestamps = false reproducibleFileOrder = true } - - configurations.all { - resolutionStrategy { - force group: 'com.google.guava', name: 'guava', version: '30.1-jre' - } - } } task copyToParent(type: Copy) { diff --git a/chainbase/src/main/java/org/tron/core/ChainBaseManager.java b/chainbase/src/main/java/org/tron/core/ChainBaseManager.java index e43d442534a..d148021f6c4 100644 --- a/chainbase/src/main/java/org/tron/core/ChainBaseManager.java +++ b/chainbase/src/main/java/org/tron/core/ChainBaseManager.java @@ -244,6 +244,10 @@ public class ChainBaseManager { @Setter private long lowestBlockNum = -1; // except num = 0. + @Getter + @Setter + private long latestSaveBlockTime; + // for test only public List getWitnesses() { return witnessScheduleStore.getActiveWitnesses(); @@ -381,6 +385,7 @@ private void init() { this.lowestBlockNum = this.blockIndexStore.getLimitNumber(1, 1).stream() .map(BlockId::getNum).findFirst().orElse(0L); this.nodeType = getLowestBlockNum() > 1 ? NodeType.LITE : NodeType.FULL; + this.latestSaveBlockTime = System.currentTimeMillis(); } public void shutdown() { diff --git a/chainbase/src/main/java/org/tron/core/capsule/TransactionCapsule.java b/chainbase/src/main/java/org/tron/core/capsule/TransactionCapsule.java index c0a0fa4d88c..2b5e8b98596 100755 --- a/chainbase/src/main/java/org/tron/core/capsule/TransactionCapsule.java +++ b/chainbase/src/main/java/org/tron/core/capsule/TransactionCapsule.java @@ -59,6 +59,7 @@ import org.tron.core.exception.P2pException; import org.tron.core.exception.PermissionException; import org.tron.core.exception.SignatureFormatException; +import org.tron.core.exception.TransactionExpirationException; import org.tron.core.exception.ValidateSignatureException; import org.tron.core.store.AccountStore; import org.tron.core.store.DynamicPropertiesStore; @@ -869,4 +870,12 @@ public void removeRedundantRet() { this.transaction = transactionBuilder.build(); } } + + public void checkExpiration(long nextSlotTime) throws TransactionExpirationException { + if (getExpiration() < nextSlotTime) { + throw new TransactionExpirationException(String.format( + "Transaction expiration time is %d, but next slot time is %d", + getExpiration(), nextSlotTime)); + } + } } diff --git a/common/build.gradle b/common/build.gradle index 6c1545e5d13..8c651e48455 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -46,7 +46,7 @@ dependencies { compile 'org.aspectj:aspectjrt:1.8.13' compile 'org.aspectj:aspectjweaver:1.8.13' compile 'org.aspectj:aspectjtools:1.8.13' - compile group: 'io.github.tronprotocol', name: 'libp2p', version: '2.2.1',{ + compile group: 'io.github.tronprotocol', name: 'libp2p', version: '2.2.4',{ exclude group: 'io.grpc', module: 'grpc-context' exclude group: 'io.grpc', module: 'grpc-core' exclude group: 'io.grpc', module: 'grpc-netty' diff --git a/common/src/main/java/org/tron/common/parameter/CommonParameter.java b/common/src/main/java/org/tron/common/parameter/CommonParameter.java index 22159063333..62ed12d856c 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -333,6 +333,9 @@ public class CommonParameter { public boolean isOpenFullTcpDisconnect; @Getter @Setter + public int inactiveThreshold; + @Getter + @Setter public boolean nodeDetectEnable; @Getter @Setter diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index 0e634d3ef7d..da3b2b1becc 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -198,6 +198,8 @@ public class Constant { public static final String NODE_IS_OPEN_FULL_TCP_DISCONNECT = "node.isOpenFullTcpDisconnect"; + public static final String NODE_INACTIVE_THRESHOLD = "node.inactiveThreshold"; + public static final String NODE_DETECT_ENABLE = "node.nodeDetectEnable"; public static final String NODE_MAX_TRANSACTION_PENDING_SIZE = "node.maxTransactionPendingSize"; diff --git a/framework/build.gradle b/framework/build.gradle index 8c4fbfc4583..a297faed7a9 100644 --- a/framework/build.gradle +++ b/framework/build.gradle @@ -1,4 +1,5 @@ plugins { + id "org.gradle.test-retry" version "1.5.9" id "org.sonarqube" version "2.6" id "com.gorylenko.gradle-git-properties" version "2.4.1" } @@ -113,6 +114,10 @@ run { } test { + retry { + maxRetries = 5 + maxFailures = 20 + } testLogging { exceptionFormat = 'full' } diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index 9d7eb75df1b..769274e8f2a 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -549,6 +549,7 @@ public GrpcAPI.Return broadcastTransaction(Transaction signedTransaction) { throw new ContractValidateException(ActuatorConstant.CONTRACT_NOT_EXIST); } TransactionMessage message = new TransactionMessage(trx.getInstance().toByteArray()); + trx.checkExpiration(tronNetDelegate.getNextBlockSlotTime()); dbManager.pushTransaction(trx); int num = tronNetService.fastBroadcastTransaction(message); if (num == 0 && minEffectiveConnection != 0) { diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index 422efefaed8..00142733f74 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -173,6 +173,7 @@ public static void clearParam() { PARAMETER.receiveTcpMinDataLength = 2048; PARAMETER.isOpenFullTcpDisconnect = false; PARAMETER.nodeDetectEnable = false; + PARAMETER.inactiveThreshold = 600; PARAMETER.supportConstant = false; PARAMETER.debug = false; PARAMETER.minTimeRatio = 0.0; @@ -845,6 +846,12 @@ public static void setParam(final String[] args, final String confFileName) { PARAMETER.nodeDetectEnable = config.hasPath(Constant.NODE_DETECT_ENABLE) && config.getBoolean(Constant.NODE_DETECT_ENABLE); + PARAMETER.inactiveThreshold = config.hasPath(Constant.NODE_INACTIVE_THRESHOLD) + ? config.getInt(Constant.NODE_INACTIVE_THRESHOLD) : 600; + if (PARAMETER.inactiveThreshold < 1) { + PARAMETER.inactiveThreshold = 1; + } + PARAMETER.maxTransactionPendingSize = config.hasPath(Constant.NODE_MAX_TRANSACTION_PENDING_SIZE) ? config.getInt(Constant.NODE_MAX_TRANSACTION_PENDING_SIZE) : 2000; diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 2bcaf606761..e5a98bd4073 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -1388,6 +1388,7 @@ public void updateDynamicProperties(BlockCapsule block) { (chainBaseManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber() - chainBaseManager.getDynamicPropertiesStore().getLatestSolidifiedBlockNum() + 1)); + chainBaseManager.setLatestSaveBlockTime(System.currentTimeMillis()); Metrics.gaugeSet(MetricKeys.Gauge.HEADER_HEIGHT, block.getNum()); Metrics.gaugeSet(MetricKeys.Gauge.HEADER_TIME, block.getTimeStamp()); } @@ -1572,6 +1573,7 @@ public BlockCapsule generateBlock(Miner miner, long blockTime, long timeout) { List toBePacked = new ArrayList<>(); long currentSize = blockCapsule.getInstance().getSerializedSize(); boolean isSort = Args.getInstance().isOpenTransactionSort(); + int[] logSize = new int[] {pendingTransactions.size(), rePushTransactions.size(), 0, 0}; while (pendingTransactions.size() > 0 || rePushTransactions.size() > 0) { boolean fromPending = false; TransactionCapsule trx; @@ -1647,6 +1649,11 @@ public BlockCapsule generateBlock(Miner miner, long blockTime, long timeout) { tmpSession.merge(); toBePacked.add(trx); currentSize += trxPackSize; + if (fromPending) { + logSize[2] += 1; + } else { + logSize[3] += 1; + } } catch (Exception e) { logger.warn("Process trx {} failed when generating block {}, {}.", trx.getTransactionId(), blockCapsule.getNum(), e.getMessage()); @@ -1663,11 +1670,14 @@ public BlockCapsule generateBlock(Miner miner, long blockTime, long timeout) { BlockCapsule capsule = new BlockCapsule(blockCapsule.getInstance()); capsule.generatedByMyself = true; Metrics.histogramObserve(timer); - logger.info("Generate block {} success, trxs:{}, pendingCount: {}, rePushCount: {}," - + " postponedCount: {}, blockSize: {} B", - capsule.getNum(), capsule.getTransactions().size(), - pendingTransactions.size(), rePushTransactions.size(), postponedTrxCount, - capsule.getSerializedSize()); + logger.info("Generate block {} success, trxs:{}, before pendingCount: {}, rePushCount: {}, " + + "from pending: {}, rePush: {}, after pendingCount: {}, rePushCount: {}, " + + "postponedCount: {}, blockSize: {} B", + capsule.getNum(), capsule.getTransactions().size(), + logSize[0], logSize[1], logSize[2], logSize[3], + pendingTransactions.size(), rePushTransactions.size(), postponedTrxCount, + capsule.getSerializedSize()); + return capsule; } diff --git a/framework/src/main/java/org/tron/core/net/P2pEventHandlerImpl.java b/framework/src/main/java/org/tron/core/net/P2pEventHandlerImpl.java index 7518b1347a7..795c90b4edd 100644 --- a/framework/src/main/java/org/tron/core/net/P2pEventHandlerImpl.java +++ b/framework/src/main/java/org/tron/core/net/P2pEventHandlerImpl.java @@ -19,6 +19,7 @@ import org.tron.core.net.message.PbftMessageFactory; import org.tron.core.net.message.TronMessage; import org.tron.core.net.message.TronMessageFactory; +import org.tron.core.net.message.adv.FetchInvDataMessage; import org.tron.core.net.message.adv.InventoryMessage; import org.tron.core.net.message.base.DisconnectMessage; import org.tron.core.net.message.handshake.HelloMessage; @@ -38,7 +39,7 @@ import org.tron.p2p.P2pEventHandler; import org.tron.p2p.connection.Channel; import org.tron.protos.Protocol; -import org.tron.protos.Protocol.ReasonCode; +import org.tron.protos.Protocol.Inventory.InventoryType; @Slf4j(topic = "net") @Component @@ -205,6 +206,7 @@ private void processMessage(PeerConnection peer, byte[] data) { default: throw new P2pException(P2pException.TypeEnum.NO_SUCH_MESSAGE, msg.getType().toString()); } + updateLastInteractiveTime(peer, msg); } catch (Exception e) { processException(peer, msg, e); } finally { @@ -220,6 +222,27 @@ private void processMessage(PeerConnection peer, byte[] data) { } } + private void updateLastInteractiveTime(PeerConnection peer, TronMessage msg) { + MessageTypes type = msg.getType(); + + boolean flag = false; + switch (type) { + case SYNC_BLOCK_CHAIN: + case BLOCK_CHAIN_INVENTORY: + case BLOCK: + flag = true; + break; + case FETCH_INV_DATA: + flag = ((FetchInvDataMessage) msg).getInventoryType().equals(InventoryType.BLOCK); + break; + default: + break; + } + if (flag) { + peer.setLastInteractiveTime(System.currentTimeMillis()); + } + } + private void processException(PeerConnection peer, TronMessage msg, Exception ex) { Protocol.ReasonCode code; diff --git a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java index cd9c8f01d8b..a6f9812a2d7 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java +++ b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java @@ -380,4 +380,12 @@ public boolean isBlockUnsolidified() { return headNum - solidNum >= maxUnsolidifiedBlocks; } + public long getNextBlockSlotTime() { + long slotCount = 1; + if (chainBaseManager.getDynamicPropertiesStore().getStateFlag() == 1) { + slotCount += chainBaseManager.getDynamicPropertiesStore().getMaintenanceSkipSlots(); + } + return chainBaseManager.getDynamicPropertiesStore().getLatestBlockHeaderTimestamp() + + slotCount * BLOCK_PRODUCED_INTERVAL; + } } diff --git a/framework/src/main/java/org/tron/core/net/TronNetService.java b/framework/src/main/java/org/tron/core/net/TronNetService.java index 03becf5d4e9..5b99f94c0db 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetService.java +++ b/framework/src/main/java/org/tron/core/net/TronNetService.java @@ -22,6 +22,7 @@ import org.tron.core.net.peer.PeerStatusCheck; import org.tron.core.net.service.adv.AdvService; import org.tron.core.net.service.effective.EffectiveCheckService; +import org.tron.core.net.service.effective.ResilienceService; import org.tron.core.net.service.fetchblock.FetchBlockService; import org.tron.core.net.service.nodepersist.NodePersistService; import org.tron.core.net.service.relay.RelayService; @@ -50,6 +51,9 @@ public class TronNetService { @Autowired private PeerStatusCheck peerStatusCheck; + @Autowired + private ResilienceService resilienceService; + @Autowired private TransactionsMsgHandler transactionsMsgHandler; @@ -88,6 +92,7 @@ public void start() { advService.init(); syncService.init(); peerStatusCheck.init(); + resilienceService.init(); transactionsMsgHandler.init(); fetchBlockService.init(); nodePersistService.init(); @@ -110,6 +115,7 @@ public void close() { nodePersistService.close(); advService.close(); syncService.close(); + resilienceService.close(); peerStatusCheck.close(); transactionsMsgHandler.close(); fetchBlockService.close(); @@ -177,7 +183,7 @@ private P2pConfig updateConfig(P2pConfig config) { config.setMaxConnectionsWithSameIp(parameter.getMaxConnectionsWithSameIp()); config.setPort(parameter.getNodeListenPort()); config.setNetworkId(parameter.getNodeP2pVersion()); - config.setDisconnectionPolicyEnable(parameter.isOpenFullTcpDisconnect()); + config.setDisconnectionPolicyEnable(false); config.setNodeDetectEnable(parameter.isNodeDetectEnable()); config.setDiscoverEnable(parameter.isNodeDiscoveryEnable()); if (StringUtils.isEmpty(config.getIp()) && hasIpv4Stack(NetUtil.getAllLocalAddress())) { diff --git a/framework/src/main/java/org/tron/core/net/messagehandler/BlockMsgHandler.java b/framework/src/main/java/org/tron/core/net/messagehandler/BlockMsgHandler.java index 0bd04cc6e8a..d73258af9d6 100644 --- a/framework/src/main/java/org/tron/core/net/messagehandler/BlockMsgHandler.java +++ b/framework/src/main/java/org/tron/core/net/messagehandler/BlockMsgHandler.java @@ -156,6 +156,13 @@ private void processBlock(PeerConnection peer, BlockCapsule block) throws P2pExc try { tronNetDelegate.processBlock(block, false); witnessProductBlockService.validWitnessProductTwoBlock(block); + + Item item = new Item(blockId, InventoryType.BLOCK); + tronNetDelegate.getActivePeer().forEach(p -> { + if (p.getAdvInvReceive().getIfPresent(item) != null) { + p.setBlockBothHave(blockId); + } + }); } catch (Exception e) { logger.warn("Process adv block {} from peer {} failed. reason: {}", blockId, peer.getInetAddress(), e.getMessage()); diff --git a/framework/src/main/java/org/tron/core/net/messagehandler/FetchInvDataMsgHandler.java b/framework/src/main/java/org/tron/core/net/messagehandler/FetchInvDataMsgHandler.java index 5e797c084b3..5415ea435e3 100644 --- a/framework/src/main/java/org/tron/core/net/messagehandler/FetchInvDataMsgHandler.java +++ b/framework/src/main/java/org/tron/core/net/messagehandler/FetchInvDataMsgHandler.java @@ -164,6 +164,10 @@ private void check(PeerConnection peer, FetchInvDataMessage fetchInvDataMsg) thr throw new P2pException(TypeEnum.BAD_MESSAGE, "minBlockNum: " + minBlockNum + ", blockNum: " + blockNum); } + if (blockNum > peer.getLastSyncBlockId().getNum()) { + throw new P2pException(TypeEnum.BAD_MESSAGE, + "maxBlockNum: " + peer.getLastSyncBlockId().getNum() + ", blockNum: " + blockNum); + } if (peer.getSyncBlockIdCache().getIfPresent(hash) != null) { throw new P2pException(TypeEnum.BAD_MESSAGE, new BlockId(hash).getString() + " is exist"); diff --git a/framework/src/main/java/org/tron/core/net/messagehandler/InventoryMsgHandler.java b/framework/src/main/java/org/tron/core/net/messagehandler/InventoryMsgHandler.java index a8ad8d0ec73..e8783b25e95 100644 --- a/framework/src/main/java/org/tron/core/net/messagehandler/InventoryMsgHandler.java +++ b/framework/src/main/java/org/tron/core/net/messagehandler/InventoryMsgHandler.java @@ -39,6 +39,9 @@ public void processMessage(PeerConnection peer, TronMessage msg) { Item item = new Item(id, type); peer.getAdvInvReceive().put(item, System.currentTimeMillis()); advService.addInv(item); + if (type.equals(InventoryType.BLOCK) && peer.getAdvInvSpread().getIfPresent(item) == null) { + peer.setLastInteractiveTime(System.currentTimeMillis()); + } } } diff --git a/framework/src/main/java/org/tron/core/net/messagehandler/SyncBlockChainMsgHandler.java b/framework/src/main/java/org/tron/core/net/messagehandler/SyncBlockChainMsgHandler.java index 958ebfe5561..f575253c50c 100644 --- a/framework/src/main/java/org/tron/core/net/messagehandler/SyncBlockChainMsgHandler.java +++ b/framework/src/main/java/org/tron/core/net/messagehandler/SyncBlockChainMsgHandler.java @@ -33,7 +33,6 @@ public void processMessage(PeerConnection peer, TronMessage msg) throws P2pExcep peer.disconnect(Protocol.ReasonCode.BAD_PROTOCOL); return; } - long remainNum = 0; List summaryChainIds = syncBlockChainMessage.getBlockIds(); diff --git a/framework/src/main/java/org/tron/core/net/messagehandler/TransactionsMsgHandler.java b/framework/src/main/java/org/tron/core/net/messagehandler/TransactionsMsgHandler.java index 665381b31a8..0c58fe08cd6 100644 --- a/framework/src/main/java/org/tron/core/net/messagehandler/TransactionsMsgHandler.java +++ b/framework/src/main/java/org/tron/core/net/messagehandler/TransactionsMsgHandler.java @@ -13,6 +13,7 @@ import org.tron.core.config.args.Args; import org.tron.core.exception.P2pException; import org.tron.core.exception.P2pException.TypeEnum; +import org.tron.core.exception.TransactionExpirationException; import org.tron.core.net.TronNetDelegate; import org.tron.core.net.message.TronMessage; import org.tron.core.net.message.adv.TransactionMessage; @@ -128,6 +129,7 @@ private void handleTransaction(PeerConnection peer, TransactionMessage trx) { } try { + trx.getTransactionCapsule().checkExpiration(tronNetDelegate.getNextBlockSlotTime()); tronNetDelegate.pushTransaction(trx.getTransactionCapsule()); advService.broadcast(trx); } catch (P2pException e) { @@ -137,6 +139,9 @@ private void handleTransaction(PeerConnection peer, TransactionMessage trx) { peer.setBadPeer(true); peer.disconnect(ReasonCode.BAD_TX); } + } catch (TransactionExpirationException e) { + logger.warn("{}. trx: {}, peer: {}", + e.getMessage(), trx.getMessageId(), peer.getInetAddress()); } catch (Exception e) { logger.error("Trx {} from peer {} process failed", trx.getMessageId(), peer.getInetAddress(), e); diff --git a/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java b/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java index 4fac50b82c7..2e08e105bed 100644 --- a/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java +++ b/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java @@ -79,6 +79,10 @@ public class PeerConnection { @Setter private ByteString address; + @Getter + @Setter + private volatile long lastInteractiveTime; + @Getter @Setter private TronState tronState = TronState.INIT; @@ -159,6 +163,7 @@ public void setChannel(Channel channel) { this.isRelayPeer = true; } this.nodeStatistics = TronStatsManager.getNodeStatistics(channel.getInetAddress()); + lastInteractiveTime = System.currentTimeMillis(); } public void setBlockBothHave(BlockId blockId) { @@ -167,7 +172,11 @@ public void setBlockBothHave(BlockId blockId) { } public boolean isIdle() { - return advInvRequest.isEmpty() && syncBlockRequested.isEmpty() && syncChainRequested == null; + return advInvRequest.isEmpty() && isSyncIdle(); + } + + public boolean isSyncIdle() { + return syncBlockRequested.isEmpty() && syncChainRequested == null; } public void sendMessage(Message message) { @@ -221,11 +230,13 @@ public String log() { + "syncBlockRequestedSize:%d\n" + "remainNum:%d\n" + "syncChainRequested:%d\n" + + "inactiveSeconds:%d\n" + "blockInProcess:%d\n", channel.getInetSocketAddress(), (now - channel.getStartTime()) / Constant.ONE_THOUSAND, channel.getAvgLatency(), - fastForwardBlock != null ? fastForwardBlock.getNum() : blockBothHave.getNum(), + fastForwardBlock != null ? fastForwardBlock.getNum() : String.format("%d [%ds]", + blockBothHave.getNum(), (now - blockBothHaveUpdateTime) / Constant.ONE_THOUSAND), isNeedSyncFromPeer(), isNeedSyncFromUs(), syncBlockToFetch.size(), @@ -234,6 +245,7 @@ public String log() { remainNum, requested == null ? 0 : (now - requested.getValue()) / Constant.ONE_THOUSAND, + (now - lastInteractiveTime) / Constant.ONE_THOUSAND, syncBlockInProcess.size()); } diff --git a/framework/src/main/java/org/tron/core/net/peer/PeerManager.java b/framework/src/main/java/org/tron/core/net/peer/PeerManager.java index 537f2083691..f564b90f3ed 100644 --- a/framework/src/main/java/org/tron/core/net/peer/PeerManager.java +++ b/framework/src/main/java/org/tron/core/net/peer/PeerManager.java @@ -94,7 +94,11 @@ private static void remove(PeerConnection peerConnection) { } public static synchronized void sortPeers() { - peers.sort(Comparator.comparingDouble(c -> c.getChannel().getAvgLatency())); + try { + peers.sort(Comparator.comparingLong(c -> c.getChannel().getAvgLatency())); + } catch (Exception e) { + logger.warn("Sort peers failed. {}", e.getMessage()); + } } public static PeerConnection getPeerConnection(Channel channel) { diff --git a/framework/src/main/java/org/tron/core/net/service/effective/ResilienceService.java b/framework/src/main/java/org/tron/core/net/service/effective/ResilienceService.java new file mode 100644 index 00000000000..a63fd4bf0a9 --- /dev/null +++ b/framework/src/main/java/org/tron/core/net/service/effective/ResilienceService.java @@ -0,0 +1,262 @@ +package org.tron.core.net.service.effective; + +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Random; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.common.es.ExecutorServiceManager; +import org.tron.common.parameter.CommonParameter; +import org.tron.core.ChainBaseManager; +import org.tron.core.config.args.Args; +import org.tron.core.net.TronNetDelegate; +import org.tron.core.net.peer.PeerConnection; +import org.tron.protos.Protocol.ReasonCode; + +@Slf4j(topic = "net") +@Component +public class ResilienceService { + + private static final long inactiveThreshold = + CommonParameter.getInstance().getInactiveThreshold() * 1000L; + public static final long blockNotChangeThreshold = 60 * 1000L; + + //when node is isolated, retention percent peers will not be disconnected + public static final double retentionPercent = 0.8; + private static final int initialDelay = 300; + public static final int minBroadcastPeerSize = 3; + private static final String esName = "resilience-service"; + private final ScheduledExecutorService executor = ExecutorServiceManager + .newSingleThreadScheduledExecutor(esName); + + @Autowired + private TronNetDelegate tronNetDelegate; + + @Autowired + private ChainBaseManager chainBaseManager; + + public void init() { + if (Args.getInstance().isOpenFullTcpDisconnect) { + executor.scheduleWithFixedDelay(() -> { + try { + disconnectRandom(); + } catch (Exception e) { + logger.error("DisconnectRandom node failed", e); + } + }, initialDelay, 30, TimeUnit.SECONDS); + } else { + logger.info("OpenFullTcpDisconnect is disabled"); + } + + executor.scheduleWithFixedDelay(() -> { + try { + disconnectLan(); + } catch (Exception e) { + logger.error("DisconnectLan node failed", e); + } + }, initialDelay, 10, TimeUnit.SECONDS); + + executor.scheduleWithFixedDelay(() -> { + try { + disconnectIsolated2(); + } catch (Exception e) { + logger.error("DisconnectIsolated node failed", e); + } + }, initialDelay, 30, TimeUnit.SECONDS); + } + + private void disconnectRandom() { + int peerSize = tronNetDelegate.getActivePeer().size(); + if (peerSize < CommonParameter.getInstance().getMaxConnections()) { + return; + } + List peers = tronNetDelegate.getActivePeer().stream() + .filter(peer -> !peer.getChannel().isTrustPeer()) + .filter(peer -> !peer.isNeedSyncFromUs() && !peer.isNeedSyncFromPeer()) + .collect(Collectors.toList()); + + if (peers.size() >= minBroadcastPeerSize) { + long now = System.currentTimeMillis(); + Map weights = new HashMap<>(); + peers.forEach(peer -> { + int weight = (int) Math.ceil((double) (now - peer.getLastInteractiveTime()) / 500); + weights.put(peer, Math.max(weight, 1)); + }); + WeightedRandom weightedRandom = new WeightedRandom(weights); + PeerConnection one = (PeerConnection) weightedRandom.next(); + disconnectFromPeer(one, ReasonCode.RANDOM_ELIMINATION, DisconnectCause.RANDOM_ELIMINATION); + return; + } + + int needSyncFromPeerCount = (int) tronNetDelegate.getActivePeer().stream() + .filter(peer -> !peer.getChannel().isTrustPeer()) + .filter(PeerConnection::isNeedSyncFromPeer) + .count(); + if (needSyncFromPeerCount >= 2) { + peers = tronNetDelegate.getActivePeer().stream() + .filter(peer -> !peer.getChannel().isTrustPeer()) + .filter(peer -> peer.isNeedSyncFromUs() || peer.isNeedSyncFromPeer()) + .collect(Collectors.toList()); + } else { + peers = tronNetDelegate.getActivePeer().stream() + .filter(peer -> !peer.getChannel().isTrustPeer()) + .filter(PeerConnection::isNeedSyncFromUs) + .collect(Collectors.toList()); + } + if (!peers.isEmpty()) { + int index = new Random().nextInt(peers.size()); + disconnectFromPeer(peers.get(index), ReasonCode.RANDOM_ELIMINATION, + DisconnectCause.RANDOM_ELIMINATION); + } + } + + + private void disconnectLan() { + if (!isLanNode()) { + return; + } + // disconnect from the node that has keep inactive for more than inactiveThreshold + // and its lastActiveTime is smallest + int peerSize = tronNetDelegate.getActivePeer().size(); + if (peerSize >= CommonParameter.getInstance().getMinConnections()) { + long now = System.currentTimeMillis(); + List peers = tronNetDelegate.getActivePeer().stream() + .filter(peer -> now - peer.getLastInteractiveTime() >= inactiveThreshold) + .filter(peer -> !peer.isNeedSyncFromPeer() && !peer.isNeedSyncFromUs()) + .filter(peer -> !peer.getChannel().isTrustPeer()) + .collect(Collectors.toList()); + Optional one = getEarliestPeer(peers); + one.ifPresent( + peer -> disconnectFromPeer(peer, ReasonCode.BAD_PROTOCOL, DisconnectCause.LAN_NODE)); + } + } + + private void disconnectIsolated2() { + if (!isIsolateLand2()) { + return; + } + logger.warn("Node is isolated, try to disconnect from peers"); + + //disconnect from the node whose lastActiveTime is smallest + int activePeerSize = (int) tronNetDelegate.getActivePeer().stream() + .filter(peer -> peer.getChannel().isActive()) + .count(); + if (activePeerSize >= CommonParameter.getInstance().getMinActiveConnections()) { + List peers = tronNetDelegate.getActivePeer().stream() + .filter(peer -> !peer.getChannel().isTrustPeer()) + .filter(peer -> peer.getChannel().isActive()) + .collect(Collectors.toList()); + + Optional one = getEarliestPeer(peers); + one.ifPresent(peer -> disconnectFromPeer(peer, ReasonCode.BAD_PROTOCOL, + DisconnectCause.ISOLATE2_ACTIVE)); + } + + //disconnect from some passive nodes, make sure retention nodes' num <= 0.8 * maxConnection, + //so new peers can come in + int peerSize = tronNetDelegate.getActivePeer().size(); + int threshold = (int) (CommonParameter.getInstance().getMaxConnections() * retentionPercent); + if (peerSize > threshold) { + int disconnectSize = peerSize - threshold; + List peers = tronNetDelegate.getActivePeer().stream() + .filter(peer -> !peer.getChannel().isTrustPeer()) + .filter(peer -> !peer.getChannel().isActive()) + .collect(Collectors.toList()); + try { + peers.sort(Comparator.comparing(PeerConnection::getLastInteractiveTime, Long::compareTo)); + } catch (Exception e) { + logger.warn("Sort disconnectIsolated2 peers failed: {}", e.getMessage()); + return; + } + int candidateSize = peers.size(); + if (peers.size() > disconnectSize) { + peers = peers.subList(0, disconnectSize); + } + logger.info("All peer Size:{}, plan size:{}, candidate size:{}, real size:{}", peerSize, + disconnectSize, candidateSize, peers.size()); + peers.forEach(peer -> disconnectFromPeer(peer, ReasonCode.BAD_PROTOCOL, + DisconnectCause.ISOLATE2_PASSIVE)); + } + } + + private Optional getEarliestPeer(List pees) { + Optional one = Optional.empty(); + try { + one = pees.stream() + .min(Comparator.comparing(PeerConnection::getLastInteractiveTime, Long::compareTo)); + } catch (Exception e) { + logger.warn("Get earliest peer failed: {}", e.getMessage()); + } + return one; + } + + private boolean isLanNode() { + int peerSize = tronNetDelegate.getActivePeer().size(); + int activePeerSize = (int) tronNetDelegate.getActivePeer().stream() + .filter(peer -> peer.getChannel().isActive()) + .count(); + return peerSize >= CommonParameter.getInstance().getMinActiveConnections() + && peerSize == activePeerSize; + } + + private boolean isIsolateLand2() { + int advPeerCount = (int) tronNetDelegate.getActivePeer().stream() + .filter(peer -> !peer.isNeedSyncFromPeer() && !peer.isNeedSyncFromUs()) + .count(); + long diff = System.currentTimeMillis() - chainBaseManager.getLatestSaveBlockTime(); + return advPeerCount >= 1 && diff >= blockNotChangeThreshold; + } + + private void disconnectFromPeer(PeerConnection peer, ReasonCode reasonCode, + DisconnectCause cause) { + int inactiveSeconds = (int) ((System.currentTimeMillis() - peer.getLastInteractiveTime()) + / 1000); + logger.info("Disconnect from peer {}, inactive seconds {}, cause: {}", + peer.getInetSocketAddress(), inactiveSeconds, cause); + peer.disconnect(reasonCode); + } + + private enum DisconnectCause { + RANDOM_ELIMINATION, + LAN_NODE, + ISOLATE2_ACTIVE, + ISOLATE2_PASSIVE, + } + + static class WeightedRandom { + + private final Map weights; + private final Random random; + + public WeightedRandom(Map weights) { + this.weights = weights; + this.random = new Random(); + } + + public Object next() { + int totalWeight = 0; + for (int weight : weights.values()) { + totalWeight += weight; + } + int randomNum = random.nextInt(totalWeight); + for (Object key : weights.keySet()) { + randomNum -= weights.get(key); + if (randomNum < 0) { + return key; + } + } + throw new IllegalStateException("Sum of weights should not be negative."); + } + } + + public void close() { + ExecutorServiceManager.shutdownAndAwaitTermination(executor, esName); + } +} diff --git a/framework/src/main/java/org/tron/core/net/service/statistics/TronStatsManager.java b/framework/src/main/java/org/tron/core/net/service/statistics/TronStatsManager.java index caac3f7f325..99e12834ced 100644 --- a/framework/src/main/java/org/tron/core/net/service/statistics/TronStatsManager.java +++ b/framework/src/main/java/org/tron/core/net/service/statistics/TronStatsManager.java @@ -63,11 +63,19 @@ private void work() { Metrics.histogramObserve(MetricKeys.Histogram.TCP_BYTES, stats.getTcpInSize() - TCP_TRAFFIC_IN, MetricLabels.Histogram.TRAFFIC_IN); + MetricsUtil.meterMark(MetricsKey.NET_TCP_OUT_TRAFFIC, stats.getTcpOutSize() - TCP_TRAFFIC_OUT); + Metrics.histogramObserve(MetricKeys.Histogram.TCP_BYTES, + stats.getTcpOutSize() - TCP_TRAFFIC_OUT, + MetricLabels.Histogram.TRAFFIC_OUT); + + MetricsUtil.meterMark(MetricsKey.NET_UDP_IN_TRAFFIC, + stats.getUdpInSize() - UDP_TRAFFIC_IN); Metrics.histogramObserve(MetricKeys.Histogram.UDP_BYTES, stats.getUdpInSize() - UDP_TRAFFIC_IN, MetricLabels.Histogram.TRAFFIC_IN); + MetricsUtil.meterMark(MetricsKey.NET_UDP_OUT_TRAFFIC, stats.getUdpOutSize() - UDP_TRAFFIC_OUT); Metrics.histogramObserve(MetricKeys.Histogram.UDP_BYTES, diff --git a/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java b/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java index 9453700df0d..8c673977962 100644 --- a/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java +++ b/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java @@ -134,7 +134,7 @@ public void processBlock(PeerConnection peer, BlockMessage blockMessage) { blockJustReceived.put(blockMessage, peer); } handleFlag = true; - if (peer.isIdle()) { + if (peer.isSyncIdle()) { if (peer.getRemainNum() > 0 && peer.getSyncBlockToFetch().size() <= syncFetchBatchNum) { syncNext(peer); @@ -226,7 +226,7 @@ private BlockId getBlockIdByNum(long num) throws P2pException { private void startFetchSyncBlock() { HashMap> send = new HashMap<>(); tronNetDelegate.getActivePeer().stream() - .filter(peer -> peer.isNeedSyncFromPeer() && peer.isIdle()) + .filter(peer -> peer.isNeedSyncFromPeer() && peer.isSyncIdle()) .filter(peer -> peer.isFetchAble()) .forEach(peer -> { if (!send.containsKey(peer)) { diff --git a/framework/src/main/java/org/tron/core/services/filter/HttpInterceptor.java b/framework/src/main/java/org/tron/core/services/filter/HttpInterceptor.java index 2cce8272dd5..8b43cfef642 100644 --- a/framework/src/main/java/org/tron/core/services/filter/HttpInterceptor.java +++ b/framework/src/main/java/org/tron/core/services/filter/HttpInterceptor.java @@ -18,7 +18,6 @@ @Slf4j(topic = "httpInterceptor") public class HttpInterceptor implements Filter { - private String endpoint; private final int HTTP_SUCCESS = 200; private final int HTTP_BAD_REQUEST = 400; private final int HTTP_NOT_ACCEPTABLE = 406; @@ -29,6 +28,7 @@ public void init(FilterConfig filterConfig) { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { + String endpoint = MetricLabels.UNDEFINED; try { if (!(request instanceof HttpServletRequest)) { chain.doFilter(request, response); diff --git a/framework/src/main/java/org/tron/program/Version.java b/framework/src/main/java/org/tron/program/Version.java index ee624f6078a..250bc087be3 100644 --- a/framework/src/main/java/org/tron/program/Version.java +++ b/framework/src/main/java/org/tron/program/Version.java @@ -2,9 +2,9 @@ public class Version { - public static final String VERSION_NAME = "GreatVoyage-v4.7.3.1-78-ge84a9e778"; - public static final String VERSION_CODE = "18260"; - private static final String VERSION = "4.7.5"; + public static final String VERSION_NAME = "GreatVoyage-v4.7.5-64-g4103dfeb63"; + public static final String VERSION_CODE = "18372"; + private static final String VERSION = "4.7.6"; public static String getVersion() { return VERSION; diff --git a/framework/src/main/resources/config-localtest.conf b/framework/src/main/resources/config-localtest.conf index f1ac104c9ed..50e7539c1d0 100644 --- a/framework/src/main/resources/config-localtest.conf +++ b/framework/src/main/resources/config-localtest.conf @@ -99,6 +99,7 @@ node { # check the peer data transfer ,disconnect factor isOpenFullTcpDisconnect = true + inactiveThreshold = 600 //seconds p2p { version = 333 # 11111: mainnet; 20180622: testnet diff --git a/framework/src/main/resources/config.conf b/framework/src/main/resources/config.conf index 78427c30f87..f9fc2dd673d 100644 --- a/framework/src/main/resources/config.conf +++ b/framework/src/main/resources/config.conf @@ -180,6 +180,7 @@ node { minParticipationRate = 15 isOpenFullTcpDisconnect = false + inactiveThreshold = 600 //seconds p2p { version = 11111 # 11111: mainnet; 20180622: testnet diff --git a/framework/src/test/java/org/tron/core/capsule/utils/MerkleTreeTest.java b/framework/src/test/java/org/tron/core/capsule/utils/MerkleTreeTest.java index 3662fb524b8..910b1adba67 100644 --- a/framework/src/test/java/org/tron/core/capsule/utils/MerkleTreeTest.java +++ b/framework/src/test/java/org/tron/core/capsule/utils/MerkleTreeTest.java @@ -8,6 +8,7 @@ import java.util.stream.IntStream; import lombok.extern.slf4j.Slf4j; import org.junit.Assert; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -185,6 +186,7 @@ public void testAnyHashNum() { } @Test + @Ignore public void testConcurrent() { Sha256Hash root1 = Sha256Hash.wrap( ByteString.fromHex("6cb38b4f493db8bacf26123cd4253bbfc530c708b97b3747e782f64097c3c482")); diff --git a/framework/src/test/java/org/tron/core/db/TransactionExpireTest.java b/framework/src/test/java/org/tron/core/db/TransactionExpireTest.java index 5243405b7e6..5193f4128cd 100644 --- a/framework/src/test/java/org/tron/core/db/TransactionExpireTest.java +++ b/framework/src/test/java/org/tron/core/db/TransactionExpireTest.java @@ -50,19 +50,6 @@ public void init() throws IOException { context = new TronApplicationContext(DefaultConfig.class); wallet = context.getBean(Wallet.class); dbManager = context.getBean(Manager.class); - - blockCapsule = new BlockCapsule( - 1, - Sha256Hash.wrap(ByteString.copyFrom( - ByteArray.fromHexString( - "0304f784e4e7bae517bcab94c3e0c9214fb4ac7ff9d7d5a937d1f40031f87b81"))), - 1, - ByteString.copyFromUtf8("testAddress")); - dbManager.getDynamicPropertiesStore().saveLatestBlockHeaderNumber(blockCapsule.getNum()); - dbManager.getDynamicPropertiesStore() - .saveLatestBlockHeaderTimestamp(blockCapsule.getTimeStamp()); - dbManager.updateRecentBlock(blockCapsule); - initLocalWitness(); } private void initLocalWitness() { @@ -81,6 +68,19 @@ public void removeDb() { @Test public void testExpireTransaction() { + blockCapsule = new BlockCapsule( + 1, + Sha256Hash.wrap(ByteString.copyFrom( + ByteArray.fromHexString( + "0304f784e4e7bae517bcab94c3e0c9214fb4ac7ff9d7d5a937d1f40031f87b81"))), + 1, + ByteString.copyFromUtf8("testAddress")); + dbManager.getDynamicPropertiesStore().saveLatestBlockHeaderNumber(blockCapsule.getNum()); + dbManager.getDynamicPropertiesStore() + .saveLatestBlockHeaderTimestamp(blockCapsule.getTimeStamp()); + dbManager.updateRecentBlock(blockCapsule); + initLocalWitness(); + TransferContract transferContract = TransferContract.newBuilder() .setAmount(1L) .setOwnerAddress(ByteString.copyFrom(Args.getLocalWitnesses() @@ -101,8 +101,61 @@ public void testExpireTransaction() { Assert.assertEquals(response_code.TRANSACTION_EXPIRATION_ERROR, result.getCode()); } + @Test + public void testExpireTransactionNew() { + blockCapsule = new BlockCapsule( + 1, + Sha256Hash.wrap(ByteString.copyFrom( + ByteArray.fromHexString( + "0304f784e4e7bae517bcab94c3e0c9214fb4ac7ff9d7d5a937d1f40031f87b81"))), + System.currentTimeMillis(), + ByteString.copyFromUtf8("testAddress")); + dbManager.getDynamicPropertiesStore().saveLatestBlockHeaderNumber(blockCapsule.getNum()); + dbManager.getDynamicPropertiesStore() + .saveLatestBlockHeaderTimestamp(blockCapsule.getTimeStamp()); + dbManager.updateRecentBlock(blockCapsule); + initLocalWitness(); + byte[] address = Args.getLocalWitnesses() + .getWitnessAccountAddress(CommonParameter.getInstance().isECKeyCryptoEngine()); + ByteString addressByte = ByteString.copyFrom(address); + AccountCapsule accountCapsule = + new AccountCapsule(Protocol.Account.newBuilder().setAddress(addressByte).build()); + accountCapsule.setBalance(1000_000_000L); + dbManager.getChainBaseManager().getAccountStore() + .put(accountCapsule.createDbKey(), accountCapsule); + + TransferContract transferContract = TransferContract.newBuilder() + .setAmount(1L) + .setOwnerAddress(addressByte) + .setToAddress(ByteString.copyFrom(ByteArray.fromHexString( + (Wallet.getAddressPreFixString() + "A389132D6639FBDA4FBC8B659264E6B7C90DB086")))) + .build(); + TransactionCapsule transactionCapsule = + new TransactionCapsule(transferContract, ContractType.TransferContract); + transactionCapsule.setReference(blockCapsule.getNum(), blockCapsule.getBlockId().getBytes()); + + transactionCapsule.setExpiration(System.currentTimeMillis()); + transactionCapsule.sign(ByteArray.fromHexString(Args.getLocalWitnesses().getPrivateKey())); + + GrpcAPI.Return result = wallet.broadcastTransaction(transactionCapsule.getInstance()); + Assert.assertEquals(response_code.TRANSACTION_EXPIRATION_ERROR, result.getCode()); + } + @Test public void testTransactionApprovedList() { + blockCapsule = new BlockCapsule( + 1, + Sha256Hash.wrap(ByteString.copyFrom( + ByteArray.fromHexString( + "0304f784e4e7bae517bcab94c3e0c9214fb4ac7ff9d7d5a937d1f40031f87b81"))), + 1, + ByteString.copyFromUtf8("testAddress")); + dbManager.getDynamicPropertiesStore().saveLatestBlockHeaderNumber(blockCapsule.getNum()); + dbManager.getDynamicPropertiesStore() + .saveLatestBlockHeaderTimestamp(blockCapsule.getTimeStamp()); + dbManager.updateRecentBlock(blockCapsule); + initLocalWitness(); + byte[] address = Args.getLocalWitnesses() .getWitnessAccountAddress(CommonParameter.getInstance().isECKeyCryptoEngine()); TransferContract transferContract = TransferContract.newBuilder() diff --git a/framework/src/test/java/org/tron/core/net/P2pEventHandlerImplTest.java b/framework/src/test/java/org/tron/core/net/P2pEventHandlerImplTest.java index 0008ec315d5..e0c816a537a 100644 --- a/framework/src/test/java/org/tron/core/net/P2pEventHandlerImplTest.java +++ b/framework/src/test/java/org/tron/core/net/P2pEventHandlerImplTest.java @@ -12,10 +12,13 @@ import org.tron.common.utils.Sha256Hash; import org.tron.core.Constant; import org.tron.core.config.args.Args; +import org.tron.core.net.message.TronMessage; +import org.tron.core.net.message.adv.FetchInvDataMessage; import org.tron.core.net.message.adv.InventoryMessage; import org.tron.core.net.peer.PeerConnection; import org.tron.core.net.service.statistics.PeerStatistics; import org.tron.protos.Protocol; +import org.tron.protos.Protocol.Inventory.InventoryType; public class P2pEventHandlerImplTest { @@ -108,4 +111,22 @@ public void testProcessInventoryMessage() throws Exception { Assert.assertEquals(300, count); } + + @Test + public void testUpdateLastInteractiveTime() throws Exception { + String[] a = new String[0]; + Args.setParam(a, Constant.TESTNET_CONF); + + PeerConnection peer = new PeerConnection(); + P2pEventHandlerImpl p2pEventHandler = new P2pEventHandlerImpl(); + + Method method = p2pEventHandler.getClass() + .getDeclaredMethod("updateLastInteractiveTime", PeerConnection.class, TronMessage.class); + method.setAccessible(true); + + long t1 = System.currentTimeMillis(); + FetchInvDataMessage message = new FetchInvDataMessage(new ArrayList<>(), InventoryType.BLOCK); + method.invoke(p2pEventHandler, peer, message); + Assert.assertTrue(peer.getLastInteractiveTime() >= t1); + } } diff --git a/framework/src/test/java/org/tron/core/net/messagehandler/BlockMsgHandlerTest.java b/framework/src/test/java/org/tron/core/net/messagehandler/BlockMsgHandlerTest.java index 8154d01aded..48e7d730520 100644 --- a/framework/src/test/java/org/tron/core/net/messagehandler/BlockMsgHandlerTest.java +++ b/framework/src/test/java/org/tron/core/net/messagehandler/BlockMsgHandlerTest.java @@ -1,26 +1,33 @@ package org.tron.core.net.messagehandler; import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; import com.google.common.collect.ImmutableList; import com.google.protobuf.ByteString; - import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.net.InetSocketAddress; +import java.util.ArrayList; import java.util.List; import javax.annotation.Resource; - import lombok.extern.slf4j.Slf4j; +import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; +import org.mockito.Mockito; import org.tron.common.BaseTest; +import org.tron.common.utils.ByteArray; import org.tron.common.utils.Sha256Hash; import org.tron.core.Constant; import org.tron.core.capsule.BlockCapsule; +import org.tron.core.capsule.BlockCapsule.BlockId; import org.tron.core.config.Parameter; import org.tron.core.config.args.Args; import org.tron.core.exception.P2pException; +import org.tron.core.net.TronNetDelegate; import org.tron.core.net.message.adv.BlockMessage; import org.tron.core.net.peer.Item; import org.tron.core.net.peer.PeerConnection; @@ -41,9 +48,8 @@ public class BlockMsgHandlerTest extends BaseTest { */ @BeforeClass public static void init() { - Args.setParam(new String[]{"--output-directory", dbPath(), "--debug"}, + Args.setParam(new String[] {"--output-directory", dbPath(), "--debug"}, Constant.TEST_CONF); - } @Before @@ -123,4 +129,42 @@ public void testProcessMessage() { logger.error("error", e); } } + + @Test + public void testProcessBlock() { + TronNetDelegate tronNetDelegate = Mockito.mock(TronNetDelegate.class); + + try { + Field field = handler.getClass().getDeclaredField("tronNetDelegate"); + field.setAccessible(true); + field.set(handler, tronNetDelegate); + + BlockCapsule blockCapsule0 = new BlockCapsule(1, + Sha256Hash.wrap(ByteString + .copyFrom(ByteArray + .fromHexString( + "9938a342238077182498b464ac0292229938a342238077182498b464ac029222"))), + 1234, + ByteString.copyFrom("1234567".getBytes())); + + peer.getAdvInvReceive() + .put(new Item(blockCapsule0.getBlockId(), InventoryType.BLOCK), + System.currentTimeMillis()); + + Mockito.doReturn(true).when(tronNetDelegate).validBlock(any(BlockCapsule.class)); + Mockito.doReturn(true).when(tronNetDelegate).containBlock(any(BlockId.class)); + Mockito.doReturn(blockCapsule0.getBlockId()).when(tronNetDelegate).getHeadBlockId(); + Mockito.doNothing().when(tronNetDelegate).processBlock(any(BlockCapsule.class), anyBoolean()); + List peers = new ArrayList<>(); + peers.add(peer); + Mockito.doReturn(peers).when(tronNetDelegate).getActivePeer(); + + Method method = handler.getClass() + .getDeclaredMethod("processBlock", PeerConnection.class, BlockCapsule.class); + method.setAccessible(true); + method.invoke(handler, peer, blockCapsule0); + } catch (Exception e) { + Assert.fail(); + } + } } diff --git a/framework/src/test/java/org/tron/core/net/messagehandler/FetchInvDataMsgHandlerTest.java b/framework/src/test/java/org/tron/core/net/messagehandler/FetchInvDataMsgHandlerTest.java index 404d275276a..5fd6d6725ba 100644 --- a/framework/src/test/java/org/tron/core/net/messagehandler/FetchInvDataMsgHandlerTest.java +++ b/framework/src/test/java/org/tron/core/net/messagehandler/FetchInvDataMsgHandlerTest.java @@ -21,8 +21,6 @@ import org.tron.core.net.service.adv.AdvService; import org.tron.protos.Protocol; - - public class FetchInvDataMsgHandlerTest { @Test @@ -62,4 +60,37 @@ public void testProcessMessage() throws Exception { new FetchInvDataMessage(blockIds, Protocol.Inventory.InventoryType.BLOCK)); Assert.assertNotNull(syncBlockIdCache.getIfPresent(blockId)); } + + @Test + public void testSyncFetchCheck() { + BlockCapsule.BlockId blockId = new BlockCapsule.BlockId(Sha256Hash.ZERO_HASH, 10000L); + List blockIds = new LinkedList<>(); + blockIds.add(blockId); + FetchInvDataMessage msg = + new FetchInvDataMessage(blockIds, Protocol.Inventory.InventoryType.BLOCK); + + PeerConnection peer = Mockito.mock(PeerConnection.class); + Mockito.when(peer.isNeedSyncFromUs()).thenReturn(true); + Cache advInvSpread = CacheBuilder.newBuilder().maximumSize(100) + .expireAfterWrite(1, TimeUnit.HOURS).recordStats().build(); + Mockito.when(peer.getAdvInvSpread()).thenReturn(advInvSpread); + + FetchInvDataMsgHandler fetchInvDataMsgHandler = new FetchInvDataMsgHandler(); + + try { + Mockito.when(peer.getLastSyncBlockId()) + .thenReturn(new BlockCapsule.BlockId(Sha256Hash.ZERO_HASH, 1000L)); + fetchInvDataMsgHandler.processMessage(peer, msg); + } catch (Exception e) { + Assert.assertEquals(e.getMessage(), "maxBlockNum: 1000, blockNum: 10000"); + } + + try { + Mockito.when(peer.getLastSyncBlockId()) + .thenReturn(new BlockCapsule.BlockId(Sha256Hash.ZERO_HASH, 20000L)); + fetchInvDataMsgHandler.processMessage(peer, msg); + } catch (Exception e) { + Assert.assertEquals(e.getMessage(), "minBlockNum: 16000, blockNum: 10000"); + } + } } diff --git a/framework/src/test/java/org/tron/core/net/messagehandler/TransactionsMsgHandlerTest.java b/framework/src/test/java/org/tron/core/net/messagehandler/TransactionsMsgHandlerTest.java index 47ffde30ac3..e1865543443 100644 --- a/framework/src/test/java/org/tron/core/net/messagehandler/TransactionsMsgHandlerTest.java +++ b/framework/src/test/java/org/tron/core/net/messagehandler/TransactionsMsgHandlerTest.java @@ -6,13 +6,18 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.concurrent.BlockingQueue; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.LinkedBlockingQueue; + +import lombok.Getter; import org.joda.time.DateTime; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import org.mockito.Mockito; import org.tron.common.BaseTest; +import org.tron.common.runtime.TvmTestUtils; import org.tron.common.utils.ByteArray; import org.tron.core.Constant; import org.tron.core.config.args.Args; @@ -75,10 +80,48 @@ public void testProcessMessage() { transactionsMsgHandler.processMessage(peer, new TransactionsMessage(transactionList)); Assert.assertNull(advInvRequest.get(item)); //Thread.sleep(10); + transactionsMsgHandler.close(); + BlockingQueue smartContractQueue = + new LinkedBlockingQueue(2); + smartContractQueue.offer(new TrxEvent(null, null)); + smartContractQueue.offer(new TrxEvent(null, null)); + Field field1 = TransactionsMsgHandler.class.getDeclaredField("smartContractQueue"); + field1.setAccessible(true); + field1.set(transactionsMsgHandler, smartContractQueue); + Protocol.Transaction trx1 = TvmTestUtils.generateTriggerSmartContractAndGetTransaction( + ByteArray.fromHexString("121212a9cf"), + ByteArray.fromHexString("121212a9cf"), + ByteArray.fromHexString("123456"), + 100, 100000000, 0, 0); + Map advInvRequest1 = new ConcurrentHashMap<>(); + Item item1 = new Item(new TransactionMessage(trx1).getMessageId(), + Protocol.Inventory.InventoryType.TRX); + advInvRequest1.put(item1, 0L); + Mockito.when(peer.getAdvInvRequest()).thenReturn(advInvRequest1); + List transactionList1 = new ArrayList<>(); + transactionList1.add(trx1); + transactionsMsgHandler.processMessage(peer, new TransactionsMessage(transactionList1)); + Assert.assertNull(advInvRequest.get(item1)); } catch (Exception e) { Assert.fail(); } finally { transactionsMsgHandler.close(); } } + + class TrxEvent { + + @Getter + private PeerConnection peer; + @Getter + private TransactionMessage msg; + @Getter + private long time; + + public TrxEvent(PeerConnection peer, TransactionMessage msg) { + this.peer = peer; + this.msg = msg; + this.time = System.currentTimeMillis(); + } + } } diff --git a/framework/src/test/java/org/tron/core/net/peer/PeerConnectionTest.java b/framework/src/test/java/org/tron/core/net/peer/PeerConnectionTest.java index 9db5230ed45..5a67cd8f609 100644 --- a/framework/src/test/java/org/tron/core/net/peer/PeerConnectionTest.java +++ b/framework/src/test/java/org/tron/core/net/peer/PeerConnectionTest.java @@ -98,6 +98,36 @@ public void testIsIdle() { Assert.assertTrue(!f); } + @Test + public void testIsSyncIdle() { + PeerConnection peerConnection = new PeerConnection(); + boolean f = peerConnection.isSyncIdle(); + Assert.assertTrue(f); + + Item item = new Item(Sha256Hash.ZERO_HASH, Protocol.Inventory.InventoryType.TRX); + Long time = System.currentTimeMillis(); + peerConnection.getAdvInvRequest().put(item, time); + f = peerConnection.isSyncIdle(); + Assert.assertTrue(f); + + peerConnection.getAdvInvRequest().clear(); + f = peerConnection.isSyncIdle(); + Assert.assertTrue(f); + + BlockCapsule.BlockId blockId = new BlockCapsule.BlockId(); + peerConnection.getSyncBlockRequested().put(blockId, time); + f = peerConnection.isSyncIdle(); + Assert.assertTrue(!f); + + peerConnection.getSyncBlockRequested().clear(); + f = peerConnection.isSyncIdle(); + Assert.assertTrue(f); + + peerConnection.setSyncChainRequested(new Pair<>(new LinkedList<>(), time)); + f = peerConnection.isSyncIdle(); + Assert.assertTrue(!f); + } + @Test public void testOnConnect() { PeerConnection peerConnection = new PeerConnection(); diff --git a/framework/src/test/java/org/tron/core/net/peer/PeerManagerTest.java b/framework/src/test/java/org/tron/core/net/peer/PeerManagerTest.java index a6151da6d1c..b8c03de1029 100644 --- a/framework/src/test/java/org/tron/core/net/peer/PeerManagerTest.java +++ b/framework/src/test/java/org/tron/core/net/peer/PeerManagerTest.java @@ -135,4 +135,32 @@ public void testGetPeers() throws Exception { Assert.assertEquals(2, peers.size()); } + @Test + public void testSortPeers() throws Exception { + PeerConnection p1 = new PeerConnection(); + PeerConnection p2 = new PeerConnection(); + + List peers = new ArrayList<>(); + peers.add(p1); + peers.add(p2); + + Field field = PeerManager.class.getDeclaredField("peers"); + field.setAccessible(true); + field.set(PeerManager.class, Collections.synchronizedList(peers)); + + PeerManager.sortPeers(); + + Channel c1 = new Channel(); + c1.updateAvgLatency(100000L); + ReflectUtils.setFieldValue(p1, "channel", c1); + + Channel c2 = new Channel(); + c2.updateAvgLatency(1000L); + ReflectUtils.setFieldValue(p2, "channel", c2); + + PeerManager.sortPeers(); + + Assert.assertEquals(PeerManager.getPeers().get(0), p2); + } + } diff --git a/framework/src/test/java/org/tron/core/net/peer/PeerStatusCheckTest.java b/framework/src/test/java/org/tron/core/net/peer/PeerStatusCheckTest.java new file mode 100644 index 00000000000..53e678c7ca4 --- /dev/null +++ b/framework/src/test/java/org/tron/core/net/peer/PeerStatusCheckTest.java @@ -0,0 +1,73 @@ +package org.tron.core.net.peer; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.spy; + +import io.netty.channel.ChannelHandlerContext; +import java.io.IOException; +import java.net.InetSocketAddress; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.mockito.Mockito; +import org.tron.common.application.TronApplicationContext; +import org.tron.common.utils.ReflectUtils; +import org.tron.core.Constant; +import org.tron.core.capsule.BlockCapsule.BlockId; +import org.tron.core.config.DefaultConfig; +import org.tron.core.config.Parameter.NetConstants; +import org.tron.core.config.args.Args; +import org.tron.p2p.connection.Channel; + + +public class PeerStatusCheckTest { + + protected TronApplicationContext context; + private PeerStatusCheck service; + @Rule + public final TemporaryFolder temporaryFolder = new TemporaryFolder(); + + @Before + public void init() throws IOException { + Args.setParam(new String[] {"--output-directory", + temporaryFolder.newFolder().toString(), "--debug"}, Constant.TEST_CONF); + context = new TronApplicationContext(DefaultConfig.class); + service = context.getBean(PeerStatusCheck.class); + } + + /** + * destroy. + */ + @After + public void destroy() { + Args.clearParam(); + context.destroy(); + } + + @Test + public void testCheck() { + int maxConnection = 30; + Assert.assertEquals(maxConnection, Args.getInstance().getMaxConnections()); + Assert.assertEquals(0, PeerManager.getPeers().size()); + + for (int i = 0; i < maxConnection; i++) { + InetSocketAddress inetSocketAddress = new InetSocketAddress("201.0.0." + i, 10001); + Channel c1 = spy(Channel.class); + ReflectUtils.setFieldValue(c1, "inetSocketAddress", inetSocketAddress); + ReflectUtils.setFieldValue(c1, "inetAddress", inetSocketAddress.getAddress()); + ReflectUtils.setFieldValue(c1, "ctx", spy(ChannelHandlerContext.class)); + Mockito.doNothing().when(c1).send((byte[]) any()); + + PeerManager.add(context, c1); + } + + PeerManager.getPeers().get(0).getSyncBlockRequested() + .put(new BlockId(), System.currentTimeMillis() - NetConstants.SYNC_TIME_OUT - 1000); + ReflectUtils.invokeMethod(service, "statusCheck"); + + Assert.assertEquals(maxConnection - 1L, PeerManager.getPeers().size()); + } +} diff --git a/framework/src/test/java/org/tron/core/net/services/AdvServiceTest.java b/framework/src/test/java/org/tron/core/net/services/AdvServiceTest.java index d79b54f6f45..c4ac4b06c43 100644 --- a/framework/src/test/java/org/tron/core/net/services/AdvServiceTest.java +++ b/framework/src/test/java/org/tron/core/net/services/AdvServiceTest.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.net.InetSocketAddress; + import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; @@ -105,12 +106,28 @@ private void testBroadcast() { } private void testTrxBroadcast() { - Protocol.Transaction trx = Protocol.Transaction.newBuilder().build(); + Protocol.Transaction trx = Protocol.Transaction.newBuilder() + .setRawData( + Protocol.Transaction.raw.newBuilder() + .setRefBlockNum(1) + .setExpiration(System.currentTimeMillis() + 3000).build()).build(); CommonParameter.getInstance().setValidContractProtoThreadNum(1); TransactionMessage msg = new TransactionMessage(trx); service.broadcast(msg); Item item = new Item(msg.getMessageId(), InventoryType.TRX); Assert.assertNotNull(service.getMessage(item)); + + Protocol.Transaction expiredTrx = Protocol.Transaction.newBuilder() + .setRawData( + Protocol.Transaction.raw.newBuilder() + .setRefBlockNum(1) + .setExpiration(System.currentTimeMillis() - 1).build()) + .build(); + CommonParameter.getInstance().setValidContractProtoThreadNum(1); + TransactionMessage msg1 = new TransactionMessage(expiredTrx); + service.broadcast(msg); + Item item1 = new Item(msg1.getMessageId(), InventoryType.TRX); + Assert.assertNull(service.getMessage(item1)); } } diff --git a/framework/src/test/java/org/tron/core/net/services/ResilienceServiceTest.java b/framework/src/test/java/org/tron/core/net/services/ResilienceServiceTest.java new file mode 100644 index 00000000000..ce723e5c991 --- /dev/null +++ b/framework/src/test/java/org/tron/core/net/services/ResilienceServiceTest.java @@ -0,0 +1,205 @@ +package org.tron.core.net.services; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.spy; + +import io.netty.channel.ChannelHandlerContext; +import java.io.IOException; +import java.net.InetSocketAddress; +import java.util.HashSet; +import java.util.Set; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.mockito.Mockito; +import org.tron.common.application.TronApplicationContext; +import org.tron.common.utils.ReflectUtils; +import org.tron.core.ChainBaseManager; +import org.tron.core.Constant; +import org.tron.core.config.DefaultConfig; +import org.tron.core.config.args.Args; +import org.tron.core.net.peer.PeerConnection; +import org.tron.core.net.peer.PeerManager; +import org.tron.core.net.service.effective.ResilienceService; +import org.tron.p2p.connection.Channel; + +public class ResilienceServiceTest { + + protected TronApplicationContext context; + private ResilienceService service; + private ChainBaseManager chainBaseManager; + + @Rule + public final TemporaryFolder temporaryFolder = new TemporaryFolder(); + + @Before + public void init() throws IOException { + Args.setParam(new String[] {"--output-directory", + temporaryFolder.newFolder().toString(), "--debug"}, Constant.TEST_CONF); + context = new TronApplicationContext(DefaultConfig.class); + chainBaseManager = context.getBean(ChainBaseManager.class); + service = context.getBean(ResilienceService.class); + } + + @Test + public void testDisconnectRandom() { + int maxConnection = 30; + Assert.assertEquals(maxConnection, Args.getInstance().getMaxConnections()); + clearPeers(); + Assert.assertEquals(0, PeerManager.getPeers().size()); + + for (int i = 0; i < maxConnection + 1; i++) { + InetSocketAddress inetSocketAddress = new InetSocketAddress("201.0.0." + i, 10001); + Channel c1 = spy(Channel.class); + ReflectUtils.setFieldValue(c1, "inetSocketAddress", inetSocketAddress); + ReflectUtils.setFieldValue(c1, "inetAddress", inetSocketAddress.getAddress()); + ReflectUtils.setFieldValue(c1, "ctx", spy(ChannelHandlerContext.class)); + Mockito.doNothing().when(c1).send((byte[]) any()); + + PeerManager.add(context, c1); + } + for (PeerConnection peer : PeerManager.getPeers() + .subList(0, ResilienceService.minBroadcastPeerSize)) { + peer.setNeedSyncFromPeer(false); + peer.setNeedSyncFromUs(false); + peer.setLastInteractiveTime(System.currentTimeMillis() - 1000); + } + for (PeerConnection peer : PeerManager.getPeers() + .subList(ResilienceService.minBroadcastPeerSize, maxConnection + 1)) { + peer.setNeedSyncFromPeer(false); + peer.setNeedSyncFromUs(true); + } + int size1 = (int) PeerManager.getPeers().stream() + .filter(peer -> !peer.isNeedSyncFromUs() && !peer.isNeedSyncFromPeer()) + .count(); + Assert.assertEquals(ResilienceService.minBroadcastPeerSize, size1); + Assert.assertEquals(maxConnection + 1, PeerManager.getPeers().size()); + + //disconnect from broadcasting peer + ReflectUtils.invokeMethod(service, "disconnectRandom"); + size1 = (int) PeerManager.getPeers().stream() + .filter(peer -> !peer.isNeedSyncFromUs() && !peer.isNeedSyncFromPeer()) + .count(); + Assert.assertEquals(ResilienceService.minBroadcastPeerSize - 1, size1); + Assert.assertEquals(maxConnection, PeerManager.getPeers().size()); + + //disconnect from syncing peer + ReflectUtils.invokeMethod(service, "disconnectRandom"); + size1 = (int) PeerManager.getPeers().stream() + .filter(peer -> !peer.isNeedSyncFromUs() && !peer.isNeedSyncFromPeer()) + .count(); + Assert.assertEquals(ResilienceService.minBroadcastPeerSize - 1, size1); + Assert.assertEquals(maxConnection - 1, PeerManager.getPeers().size()); + } + + @Test + public void testDisconnectLan() { + int minConnection = 8; + Assert.assertEquals(minConnection, Args.getInstance().getMinConnections()); + clearPeers(); + Assert.assertEquals(0, PeerManager.getPeers().size()); + + for (int i = 0; i < 9; i++) { + InetSocketAddress inetSocketAddress = new InetSocketAddress("201.0.0." + i, 10001); + Channel c1 = spy(Channel.class); + ReflectUtils.setFieldValue(c1, "inetSocketAddress", inetSocketAddress); + ReflectUtils.setFieldValue(c1, "inetAddress", inetSocketAddress.getAddress()); + ReflectUtils.setFieldValue(c1, "isActive", true); + ReflectUtils.setFieldValue(c1, "ctx", spy(ChannelHandlerContext.class)); + Mockito.doNothing().when(c1).send((byte[]) any()); + + PeerManager.add(context, c1); + } + for (PeerConnection peer : PeerManager.getPeers()) { + peer.setNeedSyncFromPeer(false); + peer.setNeedSyncFromUs(false); + } + Assert.assertEquals(9, PeerManager.getPeers().size()); + + boolean isLan = ReflectUtils.invokeMethod(service, "isLanNode"); + Assert.assertTrue(isLan); + + PeerConnection p1 = PeerManager.getPeers().get(1); + InetSocketAddress address1 = p1.getChannel().getInetSocketAddress(); + p1.setLastInteractiveTime( + System.currentTimeMillis() - Args.getInstance().inactiveThreshold * 1000L - 1000); + PeerConnection p2 = PeerManager.getPeers().get(2); + InetSocketAddress address2 = p2.getChannel().getInetSocketAddress(); + p2.setLastInteractiveTime( + System.currentTimeMillis() - Args.getInstance().inactiveThreshold * 1000L - 2000); + + ReflectUtils.invokeMethod(service, "disconnectLan"); + Assert.assertEquals(8, PeerManager.getPeers().size()); + Set addressSet = new HashSet<>(); + PeerManager.getPeers() + .forEach(p -> addressSet.add(p.getChannel().getInetSocketAddress())); + Assert.assertTrue(addressSet.contains(address1)); + Assert.assertFalse(addressSet.contains(address2)); + + ReflectUtils.invokeMethod(service, "disconnectLan"); + Assert.assertEquals(7, PeerManager.getPeers().size()); + addressSet.clear(); + PeerManager.getPeers() + .forEach(p -> addressSet.add(p.getChannel().getInetSocketAddress())); + Assert.assertFalse(addressSet.contains(address1)); + + ReflectUtils.invokeMethod(service, "disconnectLan"); + Assert.assertEquals(7, PeerManager.getPeers().size()); + } + + @Test + public void testDisconnectIsolated2() { + int maxConnection = 30; + Assert.assertEquals(maxConnection, Args.getInstance().getMaxConnections()); + clearPeers(); + Assert.assertEquals(0, PeerManager.getPeers().size()); + + int addSize = (int) (maxConnection * ResilienceService.retentionPercent) + 2; //26 + for (int i = 0; i < addSize; i++) { + InetSocketAddress inetSocketAddress = new InetSocketAddress("201.0.0." + i, 10001); + Channel c1 = spy(Channel.class); + ReflectUtils.setFieldValue(c1, "inetSocketAddress", inetSocketAddress); + ReflectUtils.setFieldValue(c1, "inetAddress", inetSocketAddress.getAddress()); + // 1 ~ 3 is active, 4 ~ 26 is not active + ReflectUtils.setFieldValue(c1, "isActive", i <= 2); + ReflectUtils.setFieldValue(c1, "ctx", spy(ChannelHandlerContext.class)); + Mockito.doNothing().when(c1).send((byte[]) any()); + + PeerManager.add(context, c1); + } + PeerManager.getPeers().get(10).setNeedSyncFromUs(false); + PeerManager.getPeers().get(10).setNeedSyncFromPeer(false); + chainBaseManager.setLatestSaveBlockTime( + System.currentTimeMillis() - ResilienceService.blockNotChangeThreshold - 100L); + boolean isIsolated = ReflectUtils.invokeMethod(service, "isIsolateLand2"); + Assert.assertTrue(isIsolated); + + ReflectUtils.invokeMethod(service, "disconnectIsolated2"); + int activeNodeSize = (int) PeerManager.getPeers().stream() + .filter(p -> p.getChannel().isActive()) + .count(); + int passiveSize = (int) PeerManager.getPeers().stream() + .filter(p -> !p.getChannel().isActive()) + .count(); + Assert.assertEquals(2, activeNodeSize); + Assert.assertEquals((int) (maxConnection * ResilienceService.retentionPercent), + activeNodeSize + passiveSize); + Assert.assertEquals((int) (maxConnection * ResilienceService.retentionPercent), + PeerManager.getPeers().size()); + } + + private void clearPeers() { + for (PeerConnection p : PeerManager.getPeers()) { + PeerManager.remove(p.getChannel()); + } + } + + @After + public void destroy() { + Args.clearParam(); + context.destroy(); + } +} \ No newline at end of file diff --git a/framework/src/test/java/org/tron/core/net/services/TronStatsManagerTest.java b/framework/src/test/java/org/tron/core/net/services/TronStatsManagerTest.java index 369955f4e7f..a940a14d392 100644 --- a/framework/src/test/java/org/tron/core/net/services/TronStatsManagerTest.java +++ b/framework/src/test/java/org/tron/core/net/services/TronStatsManagerTest.java @@ -1,5 +1,7 @@ package org.tron.core.net.services; +import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.net.InetAddress; import java.net.InetSocketAddress; @@ -24,4 +26,38 @@ public void testOnDisconnect() { Assert.assertEquals(Protocol.ReasonCode.UNKNOWN, statistics.getDisconnectReason()); } + @Test + public void testWork() throws Exception { + TronStatsManager manager = new TronStatsManager(); + Field field1 = manager.getClass().getDeclaredField("TCP_TRAFFIC_IN"); + field1.setAccessible(true); + field1.set(manager, 1L); + + Field field2 = manager.getClass().getDeclaredField("TCP_TRAFFIC_OUT"); + field2.setAccessible(true); + field2.set(manager, 1L); + + Field field3 = manager.getClass().getDeclaredField("UDP_TRAFFIC_IN"); + field3.setAccessible(true); + field3.set(manager, 1L); + + Field field4 = manager.getClass().getDeclaredField("UDP_TRAFFIC_OUT"); + field4.setAccessible(true); + field4.set(manager, 1L); + + Assert.assertEquals(field1.get(manager), 1L); + Assert.assertEquals(field2.get(manager), 1L); + Assert.assertEquals(field3.get(manager), 1L); + Assert.assertEquals(field4.get(manager), 1L); + + Method method = manager.getClass().getDeclaredMethod("work"); + method.setAccessible(true); + method.invoke(manager); + + Assert.assertEquals(field1.get(manager), 0L); + Assert.assertEquals(field2.get(manager), 0L); + Assert.assertEquals(field3.get(manager), 0L); + Assert.assertEquals(field4.get(manager), 0L); + } + } diff --git a/framework/src/test/resources/args-test.conf b/framework/src/test/resources/args-test.conf index 91913dfe32e..cf5d0b8d718 100644 --- a/framework/src/test/resources/args-test.conf +++ b/framework/src/test/resources/args-test.conf @@ -92,6 +92,7 @@ node { maxConnections = 30 minConnections = 8 minActiveConnections = 3 + inactiveThreshold = 600 //seconds p2p { version = 43 # 43: testnet; 101: debug diff --git a/framework/src/test/resources/config-localtest.conf b/framework/src/test/resources/config-localtest.conf index d7f573fe90e..1d7ae09af7c 100644 --- a/framework/src/test/resources/config-localtest.conf +++ b/framework/src/test/resources/config-localtest.conf @@ -96,6 +96,7 @@ node { # check the peer data transfer ,disconnect factor isOpenFullTcpDisconnect = true + inactiveThreshold = 600 //seconds p2p { version = 333 # 11111: mainnet; 20180622: testnet diff --git a/framework/src/test/resources/config-test.conf b/framework/src/test/resources/config-test.conf index db24bb2a8a0..62337f02fc5 100644 --- a/framework/src/test/resources/config-test.conf +++ b/framework/src/test/resources/config-test.conf @@ -100,6 +100,7 @@ node { # nodeId = e437a4836b77ad9d9ffe73ee782ef2614e6d8370fcf62191a6e488276e23717147073a7ce0b444d485fff5a0c34c4577251a7a990cf80d8542e21b95aa8c5e6c # } ] + inactiveThreshold = 600 //seconds p2p { version = 43 # 43: testnet; 101: debug diff --git a/plugins/src/test/java/org/tron/plugins/utils/ByteArrayTest.java b/plugins/src/test/java/org/tron/plugins/utils/ByteArrayTest.java new file mode 100644 index 00000000000..300c983db3a --- /dev/null +++ b/plugins/src/test/java/org/tron/plugins/utils/ByteArrayTest.java @@ -0,0 +1,44 @@ +package org.tron.plugins.utils; + +import lombok.extern.slf4j.Slf4j; +import org.junit.Assert; +import org.junit.Test; + +@Slf4j +public class ByteArrayTest { + + @Test + public void testToStrToInt() { + String test = "abc"; + byte[] testBytes = test.getBytes(); + Assert.assertEquals(test, ByteArray.toStr(testBytes)); + + int i = 5; + Assert.assertEquals(ByteArray.toInt(ByteArray.fromInt(i)), 5); + } + + @Test + public void testFromHexString() { + Assert.assertArrayEquals(ByteArray.EMPTY_BYTE_ARRAY, ByteArray.fromHexString(null)); + + Assert.assertArrayEquals(ByteArray.fromHexString("12"), ByteArray.fromHexString("0x12")); + + Assert.assertArrayEquals(ByteArray.fromHexString("0x2"), ByteArray.fromHexString("0x02")); + } + + @Test + public void testCompareUnsigned() { + byte[] a = new byte[] {1, 2}; + Assert.assertEquals(0, ByteArray.compareUnsigned(a, a)); + Assert.assertEquals(-1, ByteArray.compareUnsigned(null, a)); + Assert.assertEquals(1, ByteArray.compareUnsigned(a, null)); + + byte[] b = new byte[] {1, 3}; + Assert.assertEquals(-1, ByteArray.compareUnsigned(a, b)); + Assert.assertEquals(1, ByteArray.compareUnsigned(b, a)); + + byte[] c = new byte[] {1, 2, 3}; + Assert.assertEquals(-1, ByteArray.compareUnsigned(a, c)); + Assert.assertEquals(1, ByteArray.compareUnsigned(c, a)); + } +} diff --git a/protocol/build.gradle b/protocol/build.gradle index 922d6d19859..d88687227e8 100644 --- a/protocol/build.gradle +++ b/protocol/build.gradle @@ -1,6 +1,6 @@ apply plugin: 'com.google.protobuf' -def protobufVersion = '3.21.12' +def protobufVersion = '3.25.5' def grpcVersion = '1.52.1' dependencies {