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:
ahamlat
2025-01-13 21:44:40 +01:00
committed by GitHub
parent 1f67cb511c
commit 9ebba75192
11 changed files with 90 additions and 25 deletions

View File

@@ -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;
}
}

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -124,7 +124,8 @@ public class JsonRpcMethodsFactory {
consensusEngineServer,
clientVersion,
commit,
transactionPool),
transactionPool,
metricsSystem),
new EthJsonRpcMethods(
blockchainQueries,
synchronizer,

View File

@@ -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

View File

@@ -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

View File

@@ -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(

View File

@@ -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();