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 048f703e9f7..1253b883ad5 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,14 @@ 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; 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 +26,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; @@ -87,6 +97,17 @@ 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_CANCEL_UNFREEZE, STAKE_RESOURCE); + + Metrics.histogramObserve(UNFREEZE_CAN_WITHDRAW, -triple.getLeft().getRight().get(), + STAKE_VERSION_V2, STAKE_CANCEL_UNFREEZE, STAKE_NET); + Metrics.histogramObserve(UNFREEZE_CAN_WITHDRAW, -triple.getMiddle().getRight().get(), + 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/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java b/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java index 161f22cfb17..6efc75b1f60 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,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_DELEGATE; +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.BLOCK_PRODUCED_INTERVAL; import static org.tron.core.config.Parameter.ChainConstant.DELEGATE_PERIOD; @@ -16,6 +22,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,7 +77,8 @@ public boolean execute(Object result) throws ContractExeException { long lockPeriod = getLockPeriod(dynamicStore.supportMaxDelegateLockPeriod(), 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: @@ -79,6 +87,8 @@ public boolean execute(Object result) throws ContractExeException { ownerCapsule.addDelegatedFrozenV2BalanceForBandwidth(delegateBalance); ownerCapsule.addFrozenBalanceForBandwidthV2(-delegateBalance); + Metrics.histogramObserve(STAKE_HISTOGRAM, delegateBalance, + version, STAKE_DELEGATE, STAKE_NET); break; case ENERGY: delegateResource(ownerAddress, receiverAddress, false, @@ -86,11 +96,15 @@ public boolean execute(Object result) throws ContractExeException { ownerCapsule.addDelegatedFrozenV2BalanceForEnergy(delegateBalance); ownerCapsule.addFrozenBalanceForEnergyV2(-delegateBalance); + Metrics.histogramObserve(STAKE_HISTOGRAM, delegateBalance, + version, STAKE_DELEGATE, STAKE_ENERGY); break; default: logger.debug("Resource Code Error."); } - + logger.info("delegate resource {} detail:{},{},{}", version, + StringUtil.createReadableString(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 421b4e3013a..cbac37b2579 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,10 @@ package org.tron.core.actuator; +import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_HISTOGRAM; +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.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; @@ -16,6 +21,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 +78,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(); @@ -82,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; @@ -92,13 +99,15 @@ public boolean execute(Object result) throws ContractExeException { long newNetWeight = accountCapsule.getFrozenBalance() / TRX_PRECISION; increment = newNetWeight - oldNetWeight; } + 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; @@ -108,6 +117,8 @@ public boolean execute(Object result) throws ContractExeException { long newEnergyWeight = accountCapsule.getEnergyFrozenBalance() / TRX_PRECISION; increment = newEnergyWeight - oldEnergyWeight; } + Metrics.histogramObserve(STAKE_HISTOGRAM, frozenBalance, + STAKE_VERSION_V1, STAKE_FREEZE, STAKE_ENERGY); addTotalWeight(ENERGY, dynamicStore, frozenBalance, increment); break; case TRON_POWER: @@ -122,7 +133,10 @@ public boolean execute(Object result) throws ContractExeException { default: logger.debug("Resource Code Error."); } - + logger.info("freezeV1 detail:{},{},{}", + StringUtil.createReadableString(accountCapsule.getAddress()), + accountCapsule.getType(), + frozenBalance); accountCapsule.setBalance(newBalance); accountStore.put(accountCapsule.createDbKey(), accountCapsule); @@ -270,7 +284,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; @@ -287,7 +301,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 f0e5505be9c..12bf70223ab 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,21 @@ package org.tron.core.actuator; +import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_HISTOGRAM; +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.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; +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 +28,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 { @@ -63,23 +69,34 @@ public boolean execute(Object result) throws ContractExeException { accountCapsule.addFrozenBalanceForBandwidthV2(frozenBalance); long newNetWeight = accountCapsule.getFrozenV2BalanceWithDelegated(BANDWIDTH) / TRX_PRECISION; dynamicStore.addTotalNetWeight(newNetWeight - oldNetWeight); + 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.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."); } - + logger.info("freezeV2 detail:{},{},{},{}", + StringUtil.createReadableString(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 79a09664180..218bb4949e2 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,10 @@ package org.tron.core.actuator; +import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_HISTOGRAM; +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.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; @@ -10,6 +15,8 @@ import java.util.Arrays; 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; @@ -90,6 +97,8 @@ public boolean execute(Object result) throws ContractExeException { long newNetUsage = receiverCapsule.getNetUsage() - transferUsage; receiverCapsule.setNetUsage(newNetUsage); receiverCapsule.setLatestConsumeTime(now); + Metrics.histogramObserve(STAKE_HISTOGRAM, unDelegateBalance, + STAKE_VERSION_V2, STAKE_UNDELEGATE, STAKE_NET); break; case ENERGY: EnergyProcessor energyProcessor = new EnergyProcessor(dynamicStore, accountStore); @@ -113,6 +122,8 @@ public boolean execute(Object result) throws ContractExeException { long newEnergyUsage = receiverCapsule.getEnergyUsage() - transferUsage; receiverCapsule.setEnergyUsage(newEnergyUsage); receiverCapsule.setLatestConsumeTimeForEnergy(now); + Metrics.histogramObserve(STAKE_HISTOGRAM, unDelegateBalance, + STAKE_VERSION_V2, STAKE_UNDELEGATE, STAKE_ENERGY); break; default: //this should never happen @@ -166,7 +177,9 @@ public boolean execute(Object result) throws ContractExeException { //this should never happen break; } - + logger.info("undelegate resource detail:{},{},{}", + StringUtil.createReadableString(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 80334f1fc49..6a8d22b0aec 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,10 @@ package org.tron.core.actuator; +import static org.tron.common.prometheus.MetricKeys.Histogram.STAKE_HISTOGRAM; +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.STAKE_VERSION_V1; import static org.tron.core.actuator.ActuatorConstant.ACCOUNT_EXCEPTION_STR; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; @@ -13,6 +18,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; @@ -39,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); @@ -99,11 +105,15 @@ public boolean execute(Object result) throws ContractExeException { unfreezeBalance = delegatedResourceCapsule.getFrozenBalanceForBandwidth(); delegatedResourceCapsule.setFrozenBalanceForBandwidth(0, 0); accountCapsule.addDelegatedFrozenBalanceForBandwidth(-unfreezeBalance); + 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.histogramObserve(STAKE_HISTOGRAM, unfreezeBalance, + STAKE_VERSION_V1, STAKE_UNFREEZE, STAKE_ENERGY); break; default: //this should never happen @@ -116,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) { @@ -126,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; @@ -140,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: @@ -239,7 +249,7 @@ public boolean execute(Object result) throws ContractExeException { } } - + long weight = dynamicStore.allowNewReward() ? decrease : -unfreezeBalance / TRX_PRECISION; switch (unfreezeBalanceContract.getResource()) { case BANDWIDTH: @@ -291,7 +301,10 @@ public boolean execute(Object result) throws ContractExeException { } accountStore.put(ownerAddress, accountCapsule); - + logger.info("unfreezeV1 detail:{},{},{}", + StringUtil.createReadableString(accountCapsule.getAddress()), + accountCapsule.getType(), + unfreezeBalance); ret.setUnfreezeAmount(unfreezeBalance); ret.setStatus(fee, code.SUCESS); 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 fb41c97f7ed..cc1dde82134 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,12 @@ 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; +import static org.tron.common.prometheus.MetricLabels.Histogram.STAKE_UNFREEZE; +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; @@ -18,6 +25,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; @@ -94,7 +102,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; @@ -281,18 +294,30 @@ public void updateTotalResourceWeight(AccountCapsule accountCapsule, accountCapsule.addFrozenBalanceForBandwidthV2(-unfreezeBalance); long newNetWeight = accountCapsule.getFrozenV2BalanceWithDelegated(BANDWIDTH) / TRX_PRECISION; 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; accountCapsule.addFrozenBalanceForEnergyV2(-unfreezeBalance); long newEnergyWeight = accountCapsule.getFrozenV2BalanceWithDelegated(ENERGY) / TRX_PRECISION; 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_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); + Metrics.histogramObserve(UNFREEZE_CAN_WITHDRAW, 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 fd71ebf1404..7b127b17450 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.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; @@ -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/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 4273778a7d6..af7124cd1bd 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 @@ -31,12 +31,15 @@ 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.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; @@ -2226,6 +2229,20 @@ public long updateContextContractFactor() { contractState.getDynamicPropertiesStore().getCurrentCycleNumber()); contractState.updateContractState(getContextAddress(), contractStateCapsule); } else { + long oldEnergyFactor = contractStateCapsule.getEnergyFactor(); + String contractAddress = StringUtil.encode58Check(getContextAddress()); + + // 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, "energy"); + } + if (contractStateCapsule.catchUpToCycle( contractState.getDynamicPropertiesStore().getCurrentCycleNumber(), VMConfig.getDynamicEnergyThreshold(), @@ -2249,6 +2266,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/AccountCapsule.java b/chainbase/src/main/java/org/tron/core/capsule/AccountCapsule.java index b60fed63cda..7843c8554e5 100644 --- a/chainbase/src/main/java/org/tron/core/capsule/AccountCapsule.java +++ b/chainbase/src/main/java/org/tron/core/capsule/AccountCapsule.java @@ -20,7 +20,9 @@ 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.common.utils.StringUtil; import org.tron.core.capsule.utils.AssetUtil; import org.tron.core.store.AssetIssueStore; import org.tron.core.store.DynamicPropertiesStore; @@ -42,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; @@ -1445,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/chainbase/src/main/java/org/tron/core/capsule/ContractStateCapsule.java b/chainbase/src/main/java/org/tron/core/capsule/ContractStateCapsule.java index 8ebb86ea332..da7835e32a8 100644 --- a/chainbase/src/main/java/org/tron/core/capsule/ContractStateCapsule.java +++ b/chainbase/src/main/java/org/tron/core/capsule/ContractStateCapsule.java @@ -53,6 +53,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/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/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/chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java index f0f169ae340..8b27c3ebfb3 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 @@ -16,6 +16,8 @@ import java.util.Map; import java.util.Objects; import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -23,6 +25,8 @@ import java.util.concurrent.locks.LockSupport; import java.util.stream.Collectors; import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; +import io.prometheus.client.Histogram; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; @@ -355,7 +359,6 @@ public void flush() { deleteCheckpoint(); } createCheckpoint(); - long checkPointEnd = System.currentTimeMillis(); refresh(); flushCount = 0; 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 4af338f09bb..73ba075ba9f 100644 --- a/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java +++ b/chainbase/src/main/java/org/tron/core/store/DynamicPropertiesStore.java @@ -3,6 +3,12 @@ import static org.tron.core.config.Parameter.ChainConstant.BLOCK_PRODUCED_INTERVAL; import static org.tron.core.config.Parameter.ChainConstant.DELEGATE_PERIOD; +import static org.tron.common.prometheus.MetricKeys.Gauge.TOTAL_RESOURCE_WEIGHT; +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; import java.util.Optional; @@ -14,6 +20,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; @@ -422,6 +429,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) { @@ -1288,6 +1301,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))); @@ -2242,6 +2268,9 @@ public void addTotalNetWeight(long 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); } @@ -2255,6 +2284,9 @@ public void addTotalEnergyWeight(long 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); } @@ -2271,6 +2303,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); @@ -2911,6 +2953,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 87ab6fae0a3..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"); @@ -33,6 +35,16 @@ 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"; + + 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 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"); @@ -63,6 +75,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 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/MetricLabels.java b/common/src/main/java/org/tron/common/prometheus/MetricLabels.java index 2aa3c1e3378..5dce8a2ed89 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,29 @@ 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_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"; + 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 + */ + 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"; + public static final String ATTACK_TYPE = "attack"; + private MetricLabels() { throw new IllegalStateException("MetricsLabels"); } @@ -22,6 +48,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"; @@ -68,6 +96,12 @@ 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_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_CANCEL_UNFREEZE = "cancelUnfreeze"; 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..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; @@ -16,8 +18,9 @@ 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.TX_ATTACK, "transaction attack.", ATTACK_TYPE); + init(MetricKeys.Counter.BLK_ATTACK, "block attack.", ATTACK_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 dc1e5447540..b17cf957a6f 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,10 @@ 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; + import io.prometheus.client.Gauge; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -19,6 +24,17 @@ 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"); + 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.", + 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/common/src/main/java/org/tron/common/prometheus/MetricsHistogram.java b/common/src/main/java/org/tron/common/prometheus/MetricsHistogram.java index 556db10feb5..425c29c26b5 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,9 @@ package org.tron.common.prometheus; +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; import java.util.concurrent.ConcurrentHashMap; @@ -48,6 +52,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.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_CONTRACT_TYPE, LABEL_RESOURCE_TYPE); } private MetricsHistogram() { diff --git a/consensus/src/main/java/org/tron/consensus/ConsensusDelegate.java b/consensus/src/main/java/org/tron/consensus/ConsensusDelegate.java index 767463a6a5b..8318b55e30c 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 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 012169bdb87..d3562d64111 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,8 @@ package org.tron.consensus.dpos; +import static org.tron.common.prometheus.MetricKeys.Gauge.TOTAL_RESOURCE_WEIGHT; +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; @@ -16,6 +19,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 +71,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.encode58Check(witness.toByteArray()), MetricLabels.Counter.MINE_NEW); + } + Metrics.gaugeSet(MetricKeys.Gauge.MINER, + consensusDelegate.getWitness(witness.toByteArray()).getVoteCount(), + StringUtil.encode58Check(witness.toByteArray()), "vote"); + } + // metrics for delete Witness + for (ByteString witness : beforeWitness) { + if (!currentWitness.contains(witness)) { + Metrics.counterInc(MetricKeys.Counter.MINER, 1, + StringUtil.encode58Check(witness.toByteArray()), MetricLabels.Counter.MINE_DEL); + } + } } consensusDelegate.updateNextMaintenanceTime(blockTime); if (blockNum != 1) { @@ -151,11 +176,18 @@ public void doMaintenance() { if (dynamicPropertiesStore.allowChangeDelegation()) { long nextCycle = dynamicPropertiesStore.getCurrentCycleNumber() + 1; dynamicPropertiesStore.saveCurrentCycleNumber(nextCycle); - consensusDelegate.getAllWitnesses().forEach(witness -> { + List all = consensusDelegate.getAllWitnesses(); + all.forEach(witness -> { delegationStore.setBrokerage(nextCycle, witness.createDbKey(), delegationStore.getBrokerage(witness.createDbKey())); delegationStore.setWitnessVote(nextCycle, witness.createDbKey(), witness.getVoteCount()); }); + + + long totalVote = consensusDelegate.getWitnessStandby().stream() + .mapToLong(WitnessCapsule::getVoteCount).sum(); + dynamicPropertiesStore.saveTotalVoteWeight(totalVote); + Metrics.gaugeSet(TOTAL_RESOURCE_WEIGHT, totalVote, STAKE_VERSION_V1, STAKE_VOTE); } } 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()); } 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 908e248bdee..3339d336461 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; @@ -67,6 +69,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; @@ -800,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)); @@ -2003,6 +2007,7 @@ private void preValidateTransactionSign(List txs) } } finally { Metrics.histogramObserve(requestTimer); + Metrics.gaugeSet(Gauge.VERIFY_SIGN_SIZE, txs.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 dc886517476..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 @@ -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"); diff --git a/framework/src/main/java/org/tron/program/FullNode.java b/framework/src/main/java/org/tron/program/FullNode.java index 0fd87eb5de0..c3c809d4f6f 100644 --- a/framework/src/main/java/org/tron/program/FullNode.java +++ b/framework/src/main/java/org/tron/program/FullNode.java @@ -15,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.net.P2pEventHandlerImpl; import org.tron.core.services.RpcApiService; import org.tron.core.services.http.FullNodeHttpApiService; import org.tron.core.services.interfaceJsonRpcOnPBFT.JsonRpcServiceOnPBFT; 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 = 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 749052736e5..a0559013fde 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; @@ -39,6 +40,7 @@ public class UnfreezeBalanceV2ActuatorTest 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 = 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 {