Skip to content

Commit 911f12e

Browse files
authored
Repackage options (#7688)
Updates MetricsOptions to implement CLIOptions, and to contain its unstable options. --------- Signed-off-by: Justin Florentine <justin+github@florentine.us>
1 parent 49c6cbd commit 911f12e

File tree

17 files changed

+172
-180
lines changed

17 files changed

+172
-180
lines changed

acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/BesuNode.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import static org.apache.tuweni.io.file.Files.copyResource;
1919

2020
import org.hyperledger.besu.cli.config.NetworkName;
21-
import org.hyperledger.besu.config.MergeConfigOptions;
21+
import org.hyperledger.besu.config.MergeConfiguration;
2222
import org.hyperledger.besu.crypto.KeyPair;
2323
import org.hyperledger.besu.crypto.KeyPairUtil;
2424
import org.hyperledger.besu.datatypes.Address;
@@ -228,7 +228,7 @@ public BesuNode(
228228
});
229229
this.requestedPlugins = requestedPlugins;
230230
engineRpcConfiguration.ifPresent(
231-
config -> MergeConfigOptions.setMergeEnabled(config.isEnabled()));
231+
config -> MergeConfiguration.setMergeEnabled(config.isEnabled()));
232232
this.extraCLIOptions = extraCLIOptions;
233233
this.staticNodes = staticNodes;
234234
this.isDnsEnabled = isDnsEnabled;

besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java

Lines changed: 29 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
import org.hyperledger.besu.cli.options.stable.GraphQlOptions;
5151
import org.hyperledger.besu.cli.options.stable.JsonRpcHttpOptions;
5252
import org.hyperledger.besu.cli.options.stable.LoggingLevelOption;
53-
import org.hyperledger.besu.cli.options.stable.MetricsOptionGroup;
53+
import org.hyperledger.besu.cli.options.stable.MetricsOptions;
5454
import org.hyperledger.besu.cli.options.stable.NodePrivateKeyFileOption;
5555
import org.hyperledger.besu.cli.options.stable.P2PDiscoveryOptions;
5656
import org.hyperledger.besu.cli.options.stable.PermissionsOptions;
@@ -62,7 +62,6 @@
6262
import org.hyperledger.besu.cli.options.unstable.EvmOptions;
6363
import org.hyperledger.besu.cli.options.unstable.InProcessRpcOptions;
6464
import org.hyperledger.besu.cli.options.unstable.IpcOptions;
65-
import org.hyperledger.besu.cli.options.unstable.MetricsCLIOptions;
6665
import org.hyperledger.besu.cli.options.unstable.NatOptions;
6766
import org.hyperledger.besu.cli.options.unstable.NativeLibraryOptions;
6867
import org.hyperledger.besu.cli.options.unstable.NetworkingOptions;
@@ -89,7 +88,7 @@
8988
import org.hyperledger.besu.config.CheckpointConfigOptions;
9089
import org.hyperledger.besu.config.GenesisConfigFile;
9190
import org.hyperledger.besu.config.GenesisConfigOptions;
92-
import org.hyperledger.besu.config.MergeConfigOptions;
91+
import org.hyperledger.besu.config.MergeConfiguration;
9392
import org.hyperledger.besu.controller.BesuController;
9493
import org.hyperledger.besu.controller.BesuControllerBuilder;
9594
import org.hyperledger.besu.crypto.Blake2bfMessageDigest;
@@ -246,7 +245,6 @@
246245
import io.vertx.core.Vertx;
247246
import io.vertx.core.VertxOptions;
248247
import io.vertx.core.json.DecodeException;
249-
import io.vertx.core.metrics.MetricsOptions;
250248
import org.apache.tuweni.bytes.Bytes;
251249
import org.apache.tuweni.units.bigints.UInt256;
252250
import org.slf4j.Logger;
@@ -295,7 +293,6 @@ public class BesuCommand implements DefaultCommandValues, Runnable {
295293
final NetworkingOptions unstableNetworkingOptions = NetworkingOptions.create();
296294
final SynchronizerOptions unstableSynchronizerOptions = SynchronizerOptions.create();
297295
final EthProtocolOptions unstableEthProtocolOptions = EthProtocolOptions.create();
298-
final MetricsCLIOptions unstableMetricsCLIOptions = MetricsCLIOptions.create();
299296
private final DnsOptions unstableDnsOptions = DnsOptions.create();
300297
private final NatOptions unstableNatOptions = NatOptions.create();
301298
private final NativeLibraryOptions unstableNativeLibraryOptions = NativeLibraryOptions.create();
@@ -584,7 +581,7 @@ static class PrivacyOptionGroup {
584581

585582
// Metrics Option Group
586583
@CommandLine.ArgGroup(validate = false, heading = "@|bold Metrics Options|@%n")
587-
MetricsOptionGroup metricsOptionGroup = new MetricsOptionGroup();
584+
MetricsOptions metricsOptions = MetricsOptions.create();
588585

589586
@Option(
590587
names = {"--host-allowlist"},
@@ -1153,7 +1150,6 @@ private void handleUnstableOptions() {
11531150
final ImmutableMap<String, Object> unstableOptions =
11541151
unstableOptionsBuild
11551152
.put("Ethereum Wire Protocol", unstableEthProtocolOptions)
1156-
.put("Metrics", unstableMetricsCLIOptions)
11571153
.put("P2P Network", unstableNetworkingOptions)
11581154
.put("RPC", unstableRPCOptions)
11591155
.put("DNS Configuration", unstableDnsOptions)
@@ -1864,7 +1860,7 @@ private void checkPrivacyTlsOptionsDependencies() {
18641860
* @return instance of MetricsConfiguration.
18651861
*/
18661862
public MetricsConfiguration metricsConfiguration() {
1867-
if (metricsOptionGroup.getMetricsEnabled() && metricsOptionGroup.getMetricsPushEnabled()) {
1863+
if (metricsOptions.getMetricsEnabled() && metricsOptions.getMetricsPushEnabled()) {
18681864
throw new ParameterException(
18691865
this.commandLine,
18701866
"--metrics-enabled option and --metrics-push-enabled option can't be used at the same "
@@ -1875,40 +1871,33 @@ public MetricsConfiguration metricsConfiguration() {
18751871
logger,
18761872
commandLine,
18771873
"--metrics-enabled",
1878-
!metricsOptionGroup.getMetricsEnabled(),
1874+
!metricsOptions.getMetricsEnabled(),
18791875
asList("--metrics-host", "--metrics-port"));
18801876

18811877
CommandLineUtils.checkOptionDependencies(
18821878
logger,
18831879
commandLine,
18841880
"--metrics-push-enabled",
1885-
!metricsOptionGroup.getMetricsPushEnabled(),
1881+
!metricsOptions.getMetricsPushEnabled(),
18861882
asList(
18871883
"--metrics-push-host",
18881884
"--metrics-push-port",
18891885
"--metrics-push-interval",
18901886
"--metrics-push-prometheus-job"));
18911887

1892-
return unstableMetricsCLIOptions
1893-
.toDomainObject()
1894-
.enabled(metricsOptionGroup.getMetricsEnabled())
1888+
final MetricsConfiguration.Builder metricsConfigurationBuilder =
1889+
metricsOptions.toDomainObject();
1890+
metricsConfigurationBuilder
18951891
.host(
1896-
Strings.isNullOrEmpty(metricsOptionGroup.getMetricsHost())
1892+
Strings.isNullOrEmpty(metricsOptions.getMetricsHost())
18971893
? p2PDiscoveryOptions.p2pHost
1898-
: metricsOptionGroup.getMetricsHost())
1899-
.port(metricsOptionGroup.getMetricsPort())
1900-
.protocol(metricsOptionGroup.getMetricsProtocol())
1901-
.metricCategories(metricsOptionGroup.getMetricCategories())
1902-
.pushEnabled(metricsOptionGroup.getMetricsPushEnabled())
1894+
: metricsOptions.getMetricsHost())
19031895
.pushHost(
1904-
Strings.isNullOrEmpty(metricsOptionGroup.getMetricsPushHost())
1896+
Strings.isNullOrEmpty(metricsOptions.getMetricsPushHost())
19051897
? p2PDiscoveryOptions.autoDiscoverDefaultIP().getHostAddress()
1906-
: metricsOptionGroup.getMetricsPushHost())
1907-
.pushPort(metricsOptionGroup.getMetricsPushPort())
1908-
.pushInterval(metricsOptionGroup.getMetricsPushInterval())
1909-
.hostsAllowlist(hostsAllowlist)
1910-
.prometheusJob(metricsOptionGroup.getMetricsPrometheusJob())
1911-
.build();
1898+
: metricsOptions.getMetricsPushHost())
1899+
.hostsAllowlist(hostsAllowlist);
1900+
return metricsConfigurationBuilder.build();
19121901
}
19131902

19141903
private PrivacyParameters privacyParameters() {
@@ -2281,7 +2270,7 @@ private VertxOptions createVertxOptions(final MetricsSystem metricsSystem) {
22812270
return new VertxOptions()
22822271
.setPreferNativeTransport(true)
22832272
.setMetricsOptions(
2284-
new MetricsOptions()
2273+
new io.vertx.core.metrics.MetricsOptions()
22852274
.setEnabled(true)
22862275
.setFactory(new VertxMetricsAdapterFactory(metricsSystem)));
22872276
}
@@ -2537,9 +2526,7 @@ private List<Integer> getEffectivePorts() {
25372526
effectivePorts, rpcWebsocketOptions.getRpcWsPort(), rpcWebsocketOptions.isRpcWsEnabled());
25382527
addPortIfEnabled(effectivePorts, engineRPCConfig.engineRpcPort(), isEngineApiEnabled());
25392528
addPortIfEnabled(
2540-
effectivePorts,
2541-
metricsOptionGroup.getMetricsPort(),
2542-
metricsOptionGroup.getMetricsEnabled());
2529+
effectivePorts, metricsOptions.getMetricsPort(), metricsOptions.getMetricsEnabled());
25432530
addPortIfEnabled(
25442531
effectivePorts,
25452532
miningParametersSupplier.get().getStratumPort(),
@@ -2613,7 +2600,7 @@ protected GenesisConfigOptions getGenesisConfigOptions() {
26132600
}
26142601

26152602
private void setMergeConfigOptions() {
2616-
MergeConfigOptions.setMergeEnabled(
2603+
MergeConfiguration.setMergeEnabled(
26172604
genesisConfigOptionsSupplier.get().getTerminalTotalDifficulty().isPresent());
26182605
}
26192606

@@ -2658,7 +2645,7 @@ private void validatePostMergeCheckpointBlockRequirements() {
26582645
}
26592646

26602647
private boolean isMergeEnabled() {
2661-
return MergeConfigOptions.isMergeEnabled();
2648+
return MergeConfiguration.isMergeEnabled();
26622649
}
26632650

26642651
private boolean isEngineApiEnabled() {
@@ -2752,11 +2739,20 @@ && getDataStorageConfiguration().getBonsaiLimitTrieLogsEnabled()) {
27522739
}
27532740

27542741
/**
2755-
* Returns the plugin context.
2742+
* 2 Returns the plugin context.
27562743
*
27572744
* @return the plugin context.
27582745
*/
27592746
public BesuPluginContextImpl getBesuPluginContext() {
27602747
return besuPluginContext;
27612748
}
2749+
2750+
/**
2751+
* Returns the metrics options
2752+
*
2753+
* @return the metrics options
2754+
*/
2755+
public MetricsOptions getMetricsOptions() {
2756+
return metricsOptions;
2757+
}
27622758
}

besu/src/main/java/org/hyperledger/besu/cli/options/stable/MetricsOptionGroup.java renamed to besu/src/main/java/org/hyperledger/besu/cli/options/stable/MetricsOptions.java

Lines changed: 102 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,20 +22,80 @@
2222
import static org.hyperledger.besu.metrics.prometheus.MetricsConfiguration.DEFAULT_METRICS_PORT;
2323
import static org.hyperledger.besu.metrics.prometheus.MetricsConfiguration.DEFAULT_METRICS_PUSH_PORT;
2424

25+
import org.hyperledger.besu.cli.options.CLIOptions;
26+
import org.hyperledger.besu.cli.util.CommandLineUtils;
2527
import org.hyperledger.besu.metrics.MetricsProtocol;
28+
import org.hyperledger.besu.metrics.prometheus.MetricsConfiguration;
2629
import org.hyperledger.besu.plugin.services.metrics.MetricCategory;
2730

31+
import java.util.List;
2832
import java.util.Set;
2933

3034
import picocli.CommandLine;
3135

3236
/** Command line options for configuring metrics. */
33-
// TODO: implement CLIOption<MetricsConfiguration> and rename to drop the Group
34-
public class MetricsOptionGroup {
37+
// TODO: implement CLIOption<MetricsConfiguration>
38+
public class MetricsOptions implements CLIOptions<MetricsConfiguration.Builder> {
39+
40+
/**
41+
* Returns a MetricsConfiguration.Builder because fields are often overridden from other domains,
42+
* like using P2P settings as defaults.
43+
*
44+
* @return a newly created {@link MetricsOptions} with default values
45+
*/
46+
@Override
47+
public MetricsConfiguration.Builder toDomainObject() {
48+
MetricsConfiguration.Builder builder = MetricsConfiguration.builder();
49+
builder
50+
.timersEnabled(unstableOptions.timersEnabled)
51+
.idleTimeout(unstableOptions.idleTimeout)
52+
.enabled(getMetricsEnabled())
53+
.host(getMetricsHost())
54+
.port(getMetricsPort())
55+
.protocol(getMetricsProtocol())
56+
.metricCategories(getMetricCategories())
57+
.pushEnabled(getMetricsPushEnabled())
58+
.pushHost(getMetricsPushHost())
59+
.pushPort(getMetricsPushPort())
60+
.pushInterval(getMetricsPushInterval())
61+
.prometheusJob(getMetricsPrometheusJob());
62+
return builder;
63+
}
64+
65+
// TODO: why do we need to be able to reverse this?
66+
/**
67+
* Returns a newly created {@link MetricsOptions} reversed from the supplied MetricsConfiguration
68+
*
69+
* @param config the metrics configuration
70+
* @return a newly created {@link MetricsOptions} reversed from the supplied MetricsConfiguration
71+
*/
72+
public static MetricsOptions fromConfiguration(final MetricsConfiguration config) {
73+
final MetricsOptions metricsOptions = create();
74+
metricsOptions.unstableOptions.timersEnabled = config.isTimersEnabled();
75+
metricsOptions.unstableOptions.idleTimeout = config.getIdleTimeout();
76+
metricsOptions.isMetricsEnabled = config.isEnabled();
77+
metricsOptions.metricsHost = config.getHost();
78+
metricsOptions.metricsPort = config.getPort();
79+
metricsOptions.metricsProtocol = config.getProtocol();
80+
metricsOptions.metricCategories = config.getMetricCategories();
81+
metricsOptions.metricsPrometheusJob = config.getPrometheusJob();
82+
metricsOptions.isMetricsPushEnabled = config.isPushEnabled();
83+
metricsOptions.metricsPushHost = config.getPushHost();
84+
metricsOptions.metricsPushPort = config.getPushPort();
85+
metricsOptions.metricsPushInterval = config.getPushInterval();
86+
87+
return metricsOptions;
88+
}
89+
90+
@Override
91+
public List<String> getCLIOptions() {
92+
return CommandLineUtils.getCLIOptions(this, new MetricsOptions());
93+
}
94+
3595
@CommandLine.Option(
3696
names = {"--metrics-enabled"},
3797
description = "Set to start the metrics exporter (default: ${DEFAULT-VALUE})")
38-
private final Boolean isMetricsEnabled = false;
98+
private Boolean isMetricsEnabled = false;
3999

40100
@SuppressWarnings({"FieldCanBeFinal", "FieldMayBeFinal"}) // PicoCLI requires non-final Strings.
41101
@CommandLine.Option(
@@ -50,14 +110,14 @@ public class MetricsOptionGroup {
50110
paramLabel = MANDATORY_HOST_FORMAT_HELP,
51111
description = "Host for the metrics exporter to listen on (default: ${DEFAULT-VALUE})",
52112
arity = "1")
53-
private String metricsHost;
113+
private String metricsHost = MetricsConfiguration.DEFAULT_METRICS_HOST;
54114

55115
@CommandLine.Option(
56116
names = {"--metrics-port"},
57117
paramLabel = MANDATORY_PORT_FORMAT_HELP,
58118
description = "Port for the metrics exporter to listen on (default: ${DEFAULT-VALUE})",
59119
arity = "1")
60-
private final Integer metricsPort = DEFAULT_METRICS_PORT;
120+
private Integer metricsPort = DEFAULT_METRICS_PORT;
61121

62122
@CommandLine.Option(
63123
names = {"--metrics-category", "--metrics-categories"},
@@ -66,35 +126,35 @@ public class MetricsOptionGroup {
66126
arity = "1..*",
67127
description =
68128
"Comma separated list of categories to track metrics for (default: ${DEFAULT-VALUE})")
69-
private final Set<MetricCategory> metricCategories = DEFAULT_METRIC_CATEGORIES;
129+
private Set<MetricCategory> metricCategories = DEFAULT_METRIC_CATEGORIES;
70130

71131
@CommandLine.Option(
72132
names = {"--metrics-push-enabled"},
73133
description = "Enable the metrics push gateway integration (default: ${DEFAULT-VALUE})")
74-
private final Boolean isMetricsPushEnabled = false;
134+
private Boolean isMetricsPushEnabled = false;
75135

76136
@SuppressWarnings({"FieldCanBeFinal", "FieldMayBeFinal"}) // PicoCLI requires non-final Strings.
77137
@CommandLine.Option(
78138
names = {"--metrics-push-host"},
79139
paramLabel = MANDATORY_HOST_FORMAT_HELP,
80140
description = "Host of the Prometheus Push Gateway for push mode (default: ${DEFAULT-VALUE})",
81141
arity = "1")
82-
private String metricsPushHost;
142+
private String metricsPushHost = MetricsConfiguration.DEFAULT_METRICS_PUSH_HOST;
83143

84144
@CommandLine.Option(
85145
names = {"--metrics-push-port"},
86146
paramLabel = MANDATORY_PORT_FORMAT_HELP,
87147
description = "Port of the Prometheus Push Gateway for push mode (default: ${DEFAULT-VALUE})",
88148
arity = "1")
89-
private final Integer metricsPushPort = DEFAULT_METRICS_PUSH_PORT;
149+
private Integer metricsPushPort = DEFAULT_METRICS_PUSH_PORT;
90150

91151
@CommandLine.Option(
92152
names = {"--metrics-push-interval"},
93153
paramLabel = MANDATORY_INTEGER_FORMAT_HELP,
94154
description =
95155
"Interval in seconds to push metrics when in push mode (default: ${DEFAULT-VALUE})",
96156
arity = "1")
97-
private final Integer metricsPushInterval = 15;
157+
private Integer metricsPushInterval = 15;
98158

99159
@SuppressWarnings({"FieldCanBeFinal", "FieldMayBeFinal"}) // PicoCLI requires non-final Strings.
100160
@CommandLine.Option(
@@ -103,8 +163,16 @@ public class MetricsOptionGroup {
103163
arity = "1")
104164
private String metricsPrometheusJob = "besu-client";
105165

106-
/** Returns a newly created {@link MetricsOptionGroup} with default values. */
107-
public MetricsOptionGroup() {}
166+
/**
167+
* Returns a newly created {@link MetricsOptions} with default values.
168+
*
169+
* @return new instance
170+
*/
171+
public static MetricsOptions create() {
172+
return new MetricsOptions();
173+
}
174+
175+
private MetricsOptions() {}
108176

109177
/**
110178
* Returns whether metrics are enabled.
@@ -195,4 +263,26 @@ public Integer getMetricsPushInterval() {
195263
public String getMetricsPrometheusJob() {
196264
return metricsPrometheusJob;
197265
}
266+
267+
@CommandLine.ArgGroup(validate = false)
268+
private final MetricsOptions.Unstable unstableOptions = new MetricsOptions.Unstable();
269+
270+
static class Unstable {
271+
private static final String TIMERS_ENABLED_FLAG = "--Xmetrics-timers-enabled";
272+
private static final String IDLE_TIMEOUT_FLAG = "--Xmetrics-idle-timeout";
273+
274+
@CommandLine.Option(
275+
names = TIMERS_ENABLED_FLAG,
276+
hidden = true,
277+
description = "Whether to enable timer metrics (default: ${DEFAULT-VALUE}).")
278+
private Boolean timersEnabled = MetricsConfiguration.DEFAULT_METRICS_TIMERS_ENABLED;
279+
280+
@CommandLine.Option(
281+
hidden = true,
282+
names = {IDLE_TIMEOUT_FLAG},
283+
paramLabel = "<INTEGER>",
284+
description = "Timeout for metrics TCP connections, in seconds (default: ${DEFAULT-VALUE})",
285+
arity = "1")
286+
private int idleTimeout = MetricsConfiguration.DEFAULT_METRICS_IDLE_TIMEOUT_SECONDS;
287+
}
198288
}

0 commit comments

Comments
 (0)