Skip to content
This repository was archived by the owner on Jul 1, 2025. It is now read-only.

Commit 6f74fc8

Browse files
ahamlatgaryschulte
authored andcommitted
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. <[email protected]>
1 parent 70d96bf commit 6f74fc8

File tree

11 files changed

+90
-25
lines changed

11 files changed

+90
-25
lines changed

ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright contributors to Hyperledger Besu.
2+
* Copyright contributors to Besu.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
55
* the License. You may obtain a copy of the License at
@@ -22,6 +22,7 @@
2222
import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.ExecutionEngineJsonRpcMethod.EngineStatus.VALID;
2323
import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine.RequestValidatorProvider.getRequestsValidator;
2424
import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine.WithdrawalsValidatorProvider.getWithdrawalsValidator;
25+
import static org.hyperledger.besu.metrics.BesuMetricCategory.BLOCK_PROCESSING;
2526

2627
import org.hyperledger.besu.consensus.merge.blockcreation.MergeMiningCoordinator;
2728
import org.hyperledger.besu.datatypes.BlobGas;
@@ -61,6 +62,7 @@
6162
import org.hyperledger.besu.ethereum.mainnet.feemarket.ExcessBlobGasCalculator;
6263
import org.hyperledger.besu.ethereum.rlp.RLPException;
6364
import org.hyperledger.besu.ethereum.trie.MerkleTrieException;
65+
import org.hyperledger.besu.plugin.services.MetricsSystem;
6466
import org.hyperledger.besu.plugin.services.exception.StorageException;
6567

6668
import java.security.InvalidParameterException;
@@ -85,17 +87,24 @@ public abstract class AbstractEngineNewPayload extends ExecutionEngineJsonRpcMet
8587
private static final BlockHeaderFunctions headerFunctions = new MainnetBlockHeaderFunctions();
8688
private final MergeMiningCoordinator mergeCoordinator;
8789
private final EthPeers ethPeers;
90+
private long lastExecutionTime = 0L;
8891

8992
public AbstractEngineNewPayload(
9093
final Vertx vertx,
9194
final ProtocolSchedule protocolSchedule,
9295
final ProtocolContext protocolContext,
9396
final MergeMiningCoordinator mergeCoordinator,
9497
final EthPeers ethPeers,
95-
final EngineCallListener engineCallListener) {
98+
final EngineCallListener engineCallListener,
99+
final MetricsSystem metricsSystem) {
96100
super(vertx, protocolSchedule, protocolContext, engineCallListener);
97101
this.mergeCoordinator = mergeCoordinator;
98102
this.ethPeers = ethPeers;
103+
metricsSystem.createLongGauge(
104+
BLOCK_PROCESSING,
105+
"execution_time_head",
106+
"The execution time of the last block (head)",
107+
this::getLastExecutionTime);
99108
}
100109

101110
@Override
@@ -347,16 +356,16 @@ public JsonRpcResponse syncResponse(final JsonRpcRequestContext requestContext)
347356
// execute block and return result response
348357
final long startTimeMs = System.currentTimeMillis();
349358
final BlockProcessingResult executionResult = mergeCoordinator.rememberBlock(block);
350-
351359
if (executionResult.isSuccessful()) {
360+
lastExecutionTime = System.currentTimeMillis() - startTimeMs;
352361
logImportedBlockInfo(
353362
block,
354363
blobTransactions.stream()
355364
.map(Transaction::getVersionedHashes)
356365
.flatMap(Optional::stream)
357366
.mapToInt(List::size)
358367
.sum(),
359-
(System.currentTimeMillis() - startTimeMs) / 1000.0,
368+
lastExecutionTime / 1000.0,
360369
executionResult.getNbParallelizedTransations());
361370
return respondWith(reqId, blockParam, newBlockHeader.getHash(), VALID);
362371
} else {
@@ -629,4 +638,8 @@ private void logImportedBlockInfo(
629638
messageArgs.add(ethPeers.peerCount());
630639
LOG.info(String.format(message.toString(), messageArgs.toArray()));
631640
}
641+
642+
private long getLastExecutionTime() {
643+
return this.lastExecutionTime;
644+
}
632645
}

ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV1.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright contributors to Hyperledger Besu.
2+
* Copyright contributors to Besu.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
55
* the License. You may obtain a copy of the License at
@@ -27,6 +27,7 @@
2727
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
2828
import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec;
2929
import org.hyperledger.besu.ethereum.mainnet.ValidationResult;
30+
import org.hyperledger.besu.plugin.services.MetricsSystem;
3031

3132
import java.util.List;
3233
import java.util.Optional;
@@ -41,8 +42,16 @@ public EngineNewPayloadV1(
4142
final ProtocolContext protocolContext,
4243
final MergeMiningCoordinator mergeCoordinator,
4344
final EthPeers ethPeers,
44-
final EngineCallListener engineCallListener) {
45-
super(vertx, protocolSchedule, protocolContext, mergeCoordinator, ethPeers, engineCallListener);
45+
final EngineCallListener engineCallListener,
46+
final MetricsSystem metricsSystem) {
47+
super(
48+
vertx,
49+
protocolSchedule,
50+
protocolContext,
51+
mergeCoordinator,
52+
ethPeers,
53+
engineCallListener,
54+
metricsSystem);
4655
}
4756

4857
@Override

ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV2.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright contributors to Hyperledger Besu.
2+
* Copyright contributors to Besu.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
55
* the License. You may obtain a copy of the License at
@@ -28,6 +28,7 @@
2828
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
2929
import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec;
3030
import org.hyperledger.besu.ethereum.mainnet.ValidationResult;
31+
import org.hyperledger.besu.plugin.services.MetricsSystem;
3132

3233
import java.util.List;
3334
import java.util.Optional;
@@ -43,8 +44,16 @@ public EngineNewPayloadV2(
4344
final ProtocolContext protocolContext,
4445
final MergeMiningCoordinator mergeCoordinator,
4546
final EthPeers ethPeers,
46-
final EngineCallListener engineCallListener) {
47-
super(vertx, protocolSchedule, protocolContext, mergeCoordinator, ethPeers, engineCallListener);
47+
final EngineCallListener engineCallListener,
48+
final MetricsSystem metricsSystem) {
49+
super(
50+
vertx,
51+
protocolSchedule,
52+
protocolContext,
53+
mergeCoordinator,
54+
ethPeers,
55+
engineCallListener,
56+
metricsSystem);
4857
cancunMilestone = protocolSchedule.milestoneFor(CANCUN);
4958
}
5059

ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV3.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.hyperledger.besu.ethereum.eth.manager.EthPeers;
2525
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
2626
import org.hyperledger.besu.ethereum.mainnet.ValidationResult;
27+
import org.hyperledger.besu.plugin.services.MetricsSystem;
2728

2829
import java.util.List;
2930
import java.util.Optional;
@@ -40,9 +41,16 @@ public EngineNewPayloadV3(
4041
final ProtocolContext protocolContext,
4142
final MergeMiningCoordinator mergeCoordinator,
4243
final EthPeers ethPeers,
43-
final EngineCallListener engineCallListener) {
44+
final EngineCallListener engineCallListener,
45+
final MetricsSystem metricsSystem) {
4446
super(
45-
vertx, timestampSchedule, protocolContext, mergeCoordinator, ethPeers, engineCallListener);
47+
vertx,
48+
timestampSchedule,
49+
protocolContext,
50+
mergeCoordinator,
51+
ethPeers,
52+
engineCallListener,
53+
metricsSystem);
4654
this.cancunMilestone = timestampSchedule.milestoneFor(CANCUN);
4755
}
4856

ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV4.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.hyperledger.besu.ethereum.eth.manager.EthPeers;
2525
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
2626
import org.hyperledger.besu.ethereum.mainnet.ValidationResult;
27+
import org.hyperledger.besu.plugin.services.MetricsSystem;
2728

2829
import java.util.List;
2930
import java.util.Optional;
@@ -40,9 +41,16 @@ public EngineNewPayloadV4(
4041
final ProtocolContext protocolContext,
4142
final MergeMiningCoordinator mergeCoordinator,
4243
final EthPeers ethPeers,
43-
final EngineCallListener engineCallListener) {
44+
final EngineCallListener engineCallListener,
45+
final MetricsSystem metricsSystem) {
4446
super(
45-
vertx, timestampSchedule, protocolContext, mergeCoordinator, ethPeers, engineCallListener);
47+
vertx,
48+
timestampSchedule,
49+
protocolContext,
50+
mergeCoordinator,
51+
ethPeers,
52+
engineCallListener,
53+
metricsSystem);
4654
pragueMilestone = timestampSchedule.milestoneFor(PRAGUE);
4755
}
4856

ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/ExecutionEngineJsonRpcMethods.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import org.hyperledger.besu.ethereum.eth.manager.EthPeers;
4343
import org.hyperledger.besu.ethereum.eth.transactions.TransactionPool;
4444
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
45+
import org.hyperledger.besu.plugin.services.MetricsSystem;
4546

4647
import java.util.ArrayList;
4748
import java.util.Arrays;
@@ -63,6 +64,7 @@ public class ExecutionEngineJsonRpcMethods extends ApiGroupJsonRpcMethods {
6364
private final String clientVersion;
6465
private final String commit;
6566
private final TransactionPool transactionPool;
67+
private final MetricsSystem metricsSystem;
6668

6769
ExecutionEngineJsonRpcMethods(
6870
final MiningCoordinator miningCoordinator,
@@ -72,7 +74,8 @@ public class ExecutionEngineJsonRpcMethods extends ApiGroupJsonRpcMethods {
7274
final Vertx consensusEngineServer,
7375
final String clientVersion,
7476
final String commit,
75-
final TransactionPool transactionPool) {
77+
final TransactionPool transactionPool,
78+
final MetricsSystem metricsSystem) {
7679
this.mergeCoordinator =
7780
Optional.ofNullable(miningCoordinator)
7881
.filter(mc -> mc.isCompatibleWithEngineApi())
@@ -84,6 +87,7 @@ public class ExecutionEngineJsonRpcMethods extends ApiGroupJsonRpcMethods {
8487
this.clientVersion = clientVersion;
8588
this.commit = commit;
8689
this.transactionPool = transactionPool;
90+
this.metricsSystem = metricsSystem;
8791
}
8892

8993
@Override
@@ -117,21 +121,24 @@ protected Map<String, JsonRpcMethod> create() {
117121
protocolContext,
118122
mergeCoordinator.get(),
119123
ethPeers,
120-
engineQosTimer),
124+
engineQosTimer,
125+
metricsSystem),
121126
new EngineNewPayloadV2(
122127
consensusEngineServer,
123128
protocolSchedule,
124129
protocolContext,
125130
mergeCoordinator.get(),
126131
ethPeers,
127-
engineQosTimer),
132+
engineQosTimer,
133+
metricsSystem),
128134
new EngineNewPayloadV3(
129135
consensusEngineServer,
130136
protocolSchedule,
131137
protocolContext,
132138
mergeCoordinator.get(),
133139
ethPeers,
134-
engineQosTimer),
140+
engineQosTimer,
141+
metricsSystem),
135142
new EngineForkchoiceUpdatedV1(
136143
consensusEngineServer,
137144
protocolSchedule,
@@ -193,7 +200,8 @@ protected Map<String, JsonRpcMethod> create() {
193200
protocolContext,
194201
mergeCoordinator.get(),
195202
ethPeers,
196-
engineQosTimer));
203+
engineQosTimer,
204+
metricsSystem));
197205
}
198206

199207
return mapOf(executionEngineApisSupported);

ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/JsonRpcMethodsFactory.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,8 @@ public Map<String, JsonRpcMethod> methods(
124124
consensusEngineServer,
125125
clientVersion,
126126
commit,
127-
transactionPool),
127+
transactionPool,
128+
metricsSystem),
128129
new EthJsonRpcMethods(
129130
blockchainQueries,
130131
synchronizer,

ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV1Test.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.ExecutionEngineJsonRpcMethod.EngineStatus.INVALID_BLOCK_HASH;
1919

2020
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.ExecutionEngineJsonRpcMethod;
21+
import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem;
2122

2223
import org.junit.jupiter.api.BeforeEach;
2324
import org.junit.jupiter.api.Test;
@@ -43,7 +44,8 @@ public void before() {
4344
protocolContext,
4445
mergeCoordinator,
4546
ethPeers,
46-
engineCallListener);
47+
engineCallListener,
48+
new NoOpMetricsSystem());
4749
}
4850

4951
@Override

ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV2Test.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.hyperledger.besu.ethereum.core.BlockHeader;
3636
import org.hyperledger.besu.ethereum.core.Withdrawal;
3737
import org.hyperledger.besu.ethereum.mainnet.WithdrawalsValidator;
38+
import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem;
3839

3940
import java.util.Collections;
4041
import java.util.List;
@@ -64,7 +65,8 @@ public void before() {
6465
protocolContext,
6566
mergeCoordinator,
6667
ethPeers,
67-
engineCallListener);
68+
engineCallListener,
69+
new NoOpMetricsSystem());
6870
}
6971

7072
@Override

ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV3Test.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import org.hyperledger.besu.ethereum.mainnet.CancunTargetingGasLimitCalculator;
5555
import org.hyperledger.besu.ethereum.mainnet.ValidationResult;
5656
import org.hyperledger.besu.evm.gascalculator.CancunGasCalculator;
57+
import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem;
5758

5859
import java.math.BigInteger;
5960
import java.util.List;
@@ -95,7 +96,8 @@ public void before() {
9596
protocolContext,
9697
mergeCoordinator,
9798
ethPeers,
98-
engineCallListener);
99+
engineCallListener,
100+
new NoOpMetricsSystem());
99101
lenient().when(protocolSpec.getGasCalculator()).thenReturn(new CancunGasCalculator());
100102
lenient()
101103
.when(protocolSpec.getGasLimitCalculator())
@@ -120,7 +122,8 @@ public void shouldInvalidVersionedHash_whenShortVersionedHash() {
120122
protocolContext,
121123
mergeCoordinator,
122124
ethPeers,
123-
engineCallListener);
125+
engineCallListener,
126+
new NoOpMetricsSystem());
124127
final JsonRpcResponse badParam =
125128
methodV3.response(
126129
new JsonRpcRequestContext(

0 commit comments

Comments
 (0)