mirror of
https://github.com/vacp2p/linea-besu.git
synced 2026-01-09 21:17:54 -05:00
Expose head execution time metric (#8092)
* Add head execution time metric during new payload execution * Change the metric value only if the block was executed sucessfully Signed-off-by: Ameziane H. <ameziane.hamlat@consensys.net>
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright contributors to Hyperledger Besu.
|
||||
* Copyright contributors to Besu.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
@@ -22,6 +22,7 @@ import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.Executi
|
||||
import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.ExecutionEngineJsonRpcMethod.EngineStatus.VALID;
|
||||
import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine.RequestValidatorProvider.getRequestsValidator;
|
||||
import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine.WithdrawalsValidatorProvider.getWithdrawalsValidator;
|
||||
import static org.hyperledger.besu.metrics.BesuMetricCategory.BLOCK_PROCESSING;
|
||||
|
||||
import org.hyperledger.besu.consensus.merge.blockcreation.MergeMiningCoordinator;
|
||||
import org.hyperledger.besu.datatypes.BlobGas;
|
||||
@@ -61,6 +62,7 @@ import org.hyperledger.besu.ethereum.mainnet.ValidationResult;
|
||||
import org.hyperledger.besu.ethereum.mainnet.feemarket.ExcessBlobGasCalculator;
|
||||
import org.hyperledger.besu.ethereum.rlp.RLPException;
|
||||
import org.hyperledger.besu.ethereum.trie.MerkleTrieException;
|
||||
import org.hyperledger.besu.plugin.services.MetricsSystem;
|
||||
import org.hyperledger.besu.plugin.services.exception.StorageException;
|
||||
|
||||
import java.security.InvalidParameterException;
|
||||
@@ -85,6 +87,7 @@ public abstract class AbstractEngineNewPayload extends ExecutionEngineJsonRpcMet
|
||||
private static final BlockHeaderFunctions headerFunctions = new MainnetBlockHeaderFunctions();
|
||||
private final MergeMiningCoordinator mergeCoordinator;
|
||||
private final EthPeers ethPeers;
|
||||
private long lastExecutionTime = 0L;
|
||||
|
||||
public AbstractEngineNewPayload(
|
||||
final Vertx vertx,
|
||||
@@ -92,10 +95,16 @@ public abstract class AbstractEngineNewPayload extends ExecutionEngineJsonRpcMet
|
||||
final ProtocolContext protocolContext,
|
||||
final MergeMiningCoordinator mergeCoordinator,
|
||||
final EthPeers ethPeers,
|
||||
final EngineCallListener engineCallListener) {
|
||||
final EngineCallListener engineCallListener,
|
||||
final MetricsSystem metricsSystem) {
|
||||
super(vertx, protocolSchedule, protocolContext, engineCallListener);
|
||||
this.mergeCoordinator = mergeCoordinator;
|
||||
this.ethPeers = ethPeers;
|
||||
metricsSystem.createLongGauge(
|
||||
BLOCK_PROCESSING,
|
||||
"execution_time_head",
|
||||
"The execution time of the last block (head)",
|
||||
this::getLastExecutionTime);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -347,8 +356,8 @@ public abstract class AbstractEngineNewPayload extends ExecutionEngineJsonRpcMet
|
||||
// execute block and return result response
|
||||
final long startTimeMs = System.currentTimeMillis();
|
||||
final BlockProcessingResult executionResult = mergeCoordinator.rememberBlock(block);
|
||||
|
||||
if (executionResult.isSuccessful()) {
|
||||
lastExecutionTime = System.currentTimeMillis() - startTimeMs;
|
||||
logImportedBlockInfo(
|
||||
block,
|
||||
blobTransactions.stream()
|
||||
@@ -356,7 +365,7 @@ public abstract class AbstractEngineNewPayload extends ExecutionEngineJsonRpcMet
|
||||
.flatMap(Optional::stream)
|
||||
.mapToInt(List::size)
|
||||
.sum(),
|
||||
(System.currentTimeMillis() - startTimeMs) / 1000.0,
|
||||
lastExecutionTime / 1000.0,
|
||||
executionResult.getNbParallelizedTransations());
|
||||
return respondWith(reqId, blockParam, newBlockHeader.getHash(), VALID);
|
||||
} else {
|
||||
@@ -629,4 +638,8 @@ public abstract class AbstractEngineNewPayload extends ExecutionEngineJsonRpcMet
|
||||
messageArgs.add(ethPeers.peerCount());
|
||||
LOG.info(String.format(message.toString(), messageArgs.toArray()));
|
||||
}
|
||||
|
||||
private long getLastExecutionTime() {
|
||||
return this.lastExecutionTime;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright contributors to Hyperledger Besu.
|
||||
* Copyright contributors to Besu.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
@@ -27,6 +27,7 @@ import org.hyperledger.besu.ethereum.eth.manager.EthPeers;
|
||||
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
|
||||
import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec;
|
||||
import org.hyperledger.besu.ethereum.mainnet.ValidationResult;
|
||||
import org.hyperledger.besu.plugin.services.MetricsSystem;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
@@ -41,8 +42,16 @@ public class EngineNewPayloadV1 extends AbstractEngineNewPayload {
|
||||
final ProtocolContext protocolContext,
|
||||
final MergeMiningCoordinator mergeCoordinator,
|
||||
final EthPeers ethPeers,
|
||||
final EngineCallListener engineCallListener) {
|
||||
super(vertx, protocolSchedule, protocolContext, mergeCoordinator, ethPeers, engineCallListener);
|
||||
final EngineCallListener engineCallListener,
|
||||
final MetricsSystem metricsSystem) {
|
||||
super(
|
||||
vertx,
|
||||
protocolSchedule,
|
||||
protocolContext,
|
||||
mergeCoordinator,
|
||||
ethPeers,
|
||||
engineCallListener,
|
||||
metricsSystem);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright contributors to Hyperledger Besu.
|
||||
* Copyright contributors to Besu.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
@@ -28,6 +28,7 @@ import org.hyperledger.besu.ethereum.eth.manager.EthPeers;
|
||||
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
|
||||
import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec;
|
||||
import org.hyperledger.besu.ethereum.mainnet.ValidationResult;
|
||||
import org.hyperledger.besu.plugin.services.MetricsSystem;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
@@ -43,8 +44,16 @@ public class EngineNewPayloadV2 extends AbstractEngineNewPayload {
|
||||
final ProtocolContext protocolContext,
|
||||
final MergeMiningCoordinator mergeCoordinator,
|
||||
final EthPeers ethPeers,
|
||||
final EngineCallListener engineCallListener) {
|
||||
super(vertx, protocolSchedule, protocolContext, mergeCoordinator, ethPeers, engineCallListener);
|
||||
final EngineCallListener engineCallListener,
|
||||
final MetricsSystem metricsSystem) {
|
||||
super(
|
||||
vertx,
|
||||
protocolSchedule,
|
||||
protocolContext,
|
||||
mergeCoordinator,
|
||||
ethPeers,
|
||||
engineCallListener,
|
||||
metricsSystem);
|
||||
cancunMilestone = protocolSchedule.milestoneFor(CANCUN);
|
||||
}
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@ import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.RpcErrorType;
|
||||
import org.hyperledger.besu.ethereum.eth.manager.EthPeers;
|
||||
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
|
||||
import org.hyperledger.besu.ethereum.mainnet.ValidationResult;
|
||||
import org.hyperledger.besu.plugin.services.MetricsSystem;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
@@ -40,9 +41,16 @@ public class EngineNewPayloadV3 extends AbstractEngineNewPayload {
|
||||
final ProtocolContext protocolContext,
|
||||
final MergeMiningCoordinator mergeCoordinator,
|
||||
final EthPeers ethPeers,
|
||||
final EngineCallListener engineCallListener) {
|
||||
final EngineCallListener engineCallListener,
|
||||
final MetricsSystem metricsSystem) {
|
||||
super(
|
||||
vertx, timestampSchedule, protocolContext, mergeCoordinator, ethPeers, engineCallListener);
|
||||
vertx,
|
||||
timestampSchedule,
|
||||
protocolContext,
|
||||
mergeCoordinator,
|
||||
ethPeers,
|
||||
engineCallListener,
|
||||
metricsSystem);
|
||||
this.cancunMilestone = timestampSchedule.milestoneFor(CANCUN);
|
||||
}
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@ import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.RpcErrorType;
|
||||
import org.hyperledger.besu.ethereum.eth.manager.EthPeers;
|
||||
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
|
||||
import org.hyperledger.besu.ethereum.mainnet.ValidationResult;
|
||||
import org.hyperledger.besu.plugin.services.MetricsSystem;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
@@ -40,9 +41,16 @@ public class EngineNewPayloadV4 extends AbstractEngineNewPayload {
|
||||
final ProtocolContext protocolContext,
|
||||
final MergeMiningCoordinator mergeCoordinator,
|
||||
final EthPeers ethPeers,
|
||||
final EngineCallListener engineCallListener) {
|
||||
final EngineCallListener engineCallListener,
|
||||
final MetricsSystem metricsSystem) {
|
||||
super(
|
||||
vertx, timestampSchedule, protocolContext, mergeCoordinator, ethPeers, engineCallListener);
|
||||
vertx,
|
||||
timestampSchedule,
|
||||
protocolContext,
|
||||
mergeCoordinator,
|
||||
ethPeers,
|
||||
engineCallListener,
|
||||
metricsSystem);
|
||||
pragueMilestone = timestampSchedule.milestoneFor(PRAGUE);
|
||||
}
|
||||
|
||||
|
||||
@@ -42,6 +42,7 @@ import org.hyperledger.besu.ethereum.blockcreation.MiningCoordinator;
|
||||
import org.hyperledger.besu.ethereum.eth.manager.EthPeers;
|
||||
import org.hyperledger.besu.ethereum.eth.transactions.TransactionPool;
|
||||
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
|
||||
import org.hyperledger.besu.plugin.services.MetricsSystem;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
@@ -63,6 +64,7 @@ public class ExecutionEngineJsonRpcMethods extends ApiGroupJsonRpcMethods {
|
||||
private final String clientVersion;
|
||||
private final String commit;
|
||||
private final TransactionPool transactionPool;
|
||||
private final MetricsSystem metricsSystem;
|
||||
|
||||
ExecutionEngineJsonRpcMethods(
|
||||
final MiningCoordinator miningCoordinator,
|
||||
@@ -72,7 +74,8 @@ public class ExecutionEngineJsonRpcMethods extends ApiGroupJsonRpcMethods {
|
||||
final Vertx consensusEngineServer,
|
||||
final String clientVersion,
|
||||
final String commit,
|
||||
final TransactionPool transactionPool) {
|
||||
final TransactionPool transactionPool,
|
||||
final MetricsSystem metricsSystem) {
|
||||
this.mergeCoordinator =
|
||||
Optional.ofNullable(miningCoordinator)
|
||||
.filter(mc -> mc.isCompatibleWithEngineApi())
|
||||
@@ -84,6 +87,7 @@ public class ExecutionEngineJsonRpcMethods extends ApiGroupJsonRpcMethods {
|
||||
this.clientVersion = clientVersion;
|
||||
this.commit = commit;
|
||||
this.transactionPool = transactionPool;
|
||||
this.metricsSystem = metricsSystem;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -117,21 +121,24 @@ public class ExecutionEngineJsonRpcMethods extends ApiGroupJsonRpcMethods {
|
||||
protocolContext,
|
||||
mergeCoordinator.get(),
|
||||
ethPeers,
|
||||
engineQosTimer),
|
||||
engineQosTimer,
|
||||
metricsSystem),
|
||||
new EngineNewPayloadV2(
|
||||
consensusEngineServer,
|
||||
protocolSchedule,
|
||||
protocolContext,
|
||||
mergeCoordinator.get(),
|
||||
ethPeers,
|
||||
engineQosTimer),
|
||||
engineQosTimer,
|
||||
metricsSystem),
|
||||
new EngineNewPayloadV3(
|
||||
consensusEngineServer,
|
||||
protocolSchedule,
|
||||
protocolContext,
|
||||
mergeCoordinator.get(),
|
||||
ethPeers,
|
||||
engineQosTimer),
|
||||
engineQosTimer,
|
||||
metricsSystem),
|
||||
new EngineForkchoiceUpdatedV1(
|
||||
consensusEngineServer,
|
||||
protocolSchedule,
|
||||
@@ -193,7 +200,8 @@ public class ExecutionEngineJsonRpcMethods extends ApiGroupJsonRpcMethods {
|
||||
protocolContext,
|
||||
mergeCoordinator.get(),
|
||||
ethPeers,
|
||||
engineQosTimer));
|
||||
engineQosTimer,
|
||||
metricsSystem));
|
||||
}
|
||||
|
||||
return mapOf(executionEngineApisSupported);
|
||||
|
||||
@@ -124,7 +124,8 @@ public class JsonRpcMethodsFactory {
|
||||
consensusEngineServer,
|
||||
clientVersion,
|
||||
commit,
|
||||
transactionPool),
|
||||
transactionPool,
|
||||
metricsSystem),
|
||||
new EthJsonRpcMethods(
|
||||
blockchainQueries,
|
||||
synchronizer,
|
||||
|
||||
@@ -18,6 +18,7 @@ import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.ExecutionEngineJsonRpcMethod.EngineStatus.INVALID_BLOCK_HASH;
|
||||
|
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.ExecutionEngineJsonRpcMethod;
|
||||
import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem;
|
||||
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
@@ -43,7 +44,8 @@ public class EngineNewPayloadV1Test extends AbstractEngineNewPayloadTest {
|
||||
protocolContext,
|
||||
mergeCoordinator,
|
||||
ethPeers,
|
||||
engineCallListener);
|
||||
engineCallListener,
|
||||
new NoOpMetricsSystem());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -35,6 +35,7 @@ import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError;
|
||||
import org.hyperledger.besu.ethereum.core.BlockHeader;
|
||||
import org.hyperledger.besu.ethereum.core.Withdrawal;
|
||||
import org.hyperledger.besu.ethereum.mainnet.WithdrawalsValidator;
|
||||
import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
@@ -64,7 +65,8 @@ public class EngineNewPayloadV2Test extends AbstractEngineNewPayloadTest {
|
||||
protocolContext,
|
||||
mergeCoordinator,
|
||||
ethPeers,
|
||||
engineCallListener);
|
||||
engineCallListener,
|
||||
new NoOpMetricsSystem());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -54,6 +54,7 @@ import org.hyperledger.besu.ethereum.mainnet.BodyValidation;
|
||||
import org.hyperledger.besu.ethereum.mainnet.CancunTargetingGasLimitCalculator;
|
||||
import org.hyperledger.besu.ethereum.mainnet.ValidationResult;
|
||||
import org.hyperledger.besu.evm.gascalculator.CancunGasCalculator;
|
||||
import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem;
|
||||
|
||||
import java.math.BigInteger;
|
||||
import java.util.List;
|
||||
@@ -95,7 +96,8 @@ public class EngineNewPayloadV3Test extends EngineNewPayloadV2Test {
|
||||
protocolContext,
|
||||
mergeCoordinator,
|
||||
ethPeers,
|
||||
engineCallListener);
|
||||
engineCallListener,
|
||||
new NoOpMetricsSystem());
|
||||
lenient().when(protocolSpec.getGasCalculator()).thenReturn(new CancunGasCalculator());
|
||||
lenient()
|
||||
.when(protocolSpec.getGasLimitCalculator())
|
||||
@@ -120,7 +122,8 @@ public class EngineNewPayloadV3Test extends EngineNewPayloadV2Test {
|
||||
protocolContext,
|
||||
mergeCoordinator,
|
||||
ethPeers,
|
||||
engineCallListener);
|
||||
engineCallListener,
|
||||
new NoOpMetricsSystem());
|
||||
final JsonRpcResponse badParam =
|
||||
methodV3.response(
|
||||
new JsonRpcRequestContext(
|
||||
|
||||
@@ -43,6 +43,7 @@ import org.hyperledger.besu.ethereum.mainnet.BodyValidation;
|
||||
import org.hyperledger.besu.ethereum.mainnet.requests.MainnetRequestsValidator;
|
||||
import org.hyperledger.besu.ethereum.mainnet.requests.ProhibitedRequestValidator;
|
||||
import org.hyperledger.besu.evm.gascalculator.PragueGasCalculator;
|
||||
import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem;
|
||||
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
@@ -78,7 +79,8 @@ public class EngineNewPayloadV4Test extends EngineNewPayloadV3Test {
|
||||
protocolContext,
|
||||
mergeCoordinator,
|
||||
ethPeers,
|
||||
engineCallListener);
|
||||
engineCallListener,
|
||||
new NoOpMetricsSystem());
|
||||
lenient().when(protocolSchedule.hardforkFor(any())).thenReturn(Optional.of(pragueHardfork));
|
||||
lenient().when(protocolSpec.getGasCalculator()).thenReturn(new PragueGasCalculator());
|
||||
mockAllowedRequestsValidator();
|
||||
|
||||
Reference in New Issue
Block a user