From 1082c421003a963acfd9f4d18d76c034ffb764f1 Mon Sep 17 00:00:00 2001 From: thinkAfCod Date: Wed, 2 Aug 2023 15:44:02 +0800 Subject: [PATCH] add a dependency of the hildr-utilities project to the hildr-node. --- hildr-node/build.gradle | 2 + .../src/main/java/io/optimism/cli/Cli.java | 2 + .../main/java/io/optimism/driver/Driver.java | 2 +- .../java/io/optimism/driver/EngineDriver.java | 2 +- .../java/io/optimism/l1/InnerWatcher.java | 2 +- .../optimism/rpc/methods/OutputAtBlock.java | 4 +- .../provider/RetryRateLimitInterceptor.java | 133 ------------------ .../optimism/rpc/provider/Web3jProvider.java | 59 -------- .../main/java/io/optimism/runner/Runner.java | 2 +- .../optimism/telemetry/TracerTaskWrapper.java | 52 ------- .../java/io/optimism/rpc/RpcServerTest.java | 2 +- 11 files changed, 11 insertions(+), 251 deletions(-) delete mode 100644 hildr-node/src/main/java/io/optimism/rpc/provider/RetryRateLimitInterceptor.java delete mode 100644 hildr-node/src/main/java/io/optimism/rpc/provider/Web3jProvider.java delete mode 100644 hildr-node/src/main/java/io/optimism/telemetry/TracerTaskWrapper.java diff --git a/hildr-node/build.gradle b/hildr-node/build.gradle index eeca33cf..09da983e 100644 --- a/hildr-node/build.gradle +++ b/hildr-node/build.gradle @@ -61,6 +61,7 @@ tasks.withType(JavaExec).configureEach { } dependencies { + implementation project(':hildr-utilities') // This dependency is used by the application. implementation 'com.google.guava:guava:31.1-jre' implementation 'com.github.rholder:guava-retrying:2.0.0' @@ -377,6 +378,7 @@ javadoc { } jar { + dependsOn(configurations.runtimeClasspath) manifest { attributes "Main-Class": "io.optimism.Hildr" } diff --git a/hildr-node/src/main/java/io/optimism/cli/Cli.java b/hildr-node/src/main/java/io/optimism/cli/Cli.java index edab4f77..4f6606c4 100644 --- a/hildr-node/src/main/java/io/optimism/cli/Cli.java +++ b/hildr-node/src/main/java/io/optimism/cli/Cli.java @@ -23,6 +23,7 @@ import io.optimism.runner.Runner; import io.optimism.telemetry.InnerMetrics; import io.optimism.telemetry.Logging; +import io.optimism.utilities.telemetry.TracerTaskWrapper; import java.nio.file.Files; import java.nio.file.Paths; import org.slf4j.Logger; @@ -95,6 +96,7 @@ public Cli() {} @Override public void run() { + TracerTaskWrapper.setTracerSupplier(Logging.INSTANCE::getTracer); InnerMetrics.start(9200); Signal.handle(new Signal("INT"), sig -> System.exit(0)); Signal.handle(new Signal("TERM"), sig -> System.exit(0)); diff --git a/hildr-node/src/main/java/io/optimism/driver/Driver.java b/hildr-node/src/main/java/io/optimism/driver/Driver.java index e116c222..9872e914 100644 --- a/hildr-node/src/main/java/io/optimism/driver/Driver.java +++ b/hildr-node/src/main/java/io/optimism/driver/Driver.java @@ -35,7 +35,7 @@ import io.optimism.l1.ChainWatcher; import io.optimism.rpc.RpcServer; import io.optimism.telemetry.InnerMetrics; -import io.optimism.telemetry.TracerTaskWrapper; +import io.optimism.utilities.telemetry.TracerTaskWrapper; import java.math.BigInteger; import java.time.Duration; import java.util.List; diff --git a/hildr-node/src/main/java/io/optimism/driver/EngineDriver.java b/hildr-node/src/main/java/io/optimism/driver/EngineDriver.java index 9742f652..9f6c42b9 100644 --- a/hildr-node/src/main/java/io/optimism/driver/EngineDriver.java +++ b/hildr-node/src/main/java/io/optimism/driver/EngineDriver.java @@ -30,7 +30,7 @@ import io.optimism.engine.OpEthExecutionPayload; import io.optimism.engine.OpEthForkChoiceUpdate; import io.optimism.engine.OpEthPayloadStatus; -import io.optimism.telemetry.TracerTaskWrapper; +import io.optimism.utilities.telemetry.TracerTaskWrapper; import java.math.BigInteger; import java.util.List; import java.util.concurrent.ExecutionException; diff --git a/hildr-node/src/main/java/io/optimism/l1/InnerWatcher.java b/hildr-node/src/main/java/io/optimism/l1/InnerWatcher.java index df966972..79a00487 100644 --- a/hildr-node/src/main/java/io/optimism/l1/InnerWatcher.java +++ b/hildr-node/src/main/java/io/optimism/l1/InnerWatcher.java @@ -28,8 +28,8 @@ import io.optimism.derive.stages.Attributes.UserDeposited; import io.optimism.driver.L1AttributesDepositedTxNotFoundException; import io.optimism.l1.BlockUpdate.FinalityUpdate; -import io.optimism.rpc.provider.Web3jProvider; import io.optimism.telemetry.Logging; +import io.optimism.utilities.rpc.Web3jProvider; import java.math.BigInteger; import java.time.Duration; import java.util.ArrayList; diff --git a/hildr-node/src/main/java/io/optimism/rpc/methods/OutputAtBlock.java b/hildr-node/src/main/java/io/optimism/rpc/methods/OutputAtBlock.java index 98191f25..1701eef9 100644 --- a/hildr-node/src/main/java/io/optimism/rpc/methods/OutputAtBlock.java +++ b/hildr-node/src/main/java/io/optimism/rpc/methods/OutputAtBlock.java @@ -23,8 +23,8 @@ import io.optimism.rpc.internal.response.JsonRpcSuccessResponse; import io.optimism.rpc.internal.result.EthGetProof; import io.optimism.rpc.internal.result.OutputRootResult; -import io.optimism.rpc.provider.Web3jProvider; -import io.optimism.telemetry.TracerTaskWrapper; +import io.optimism.utilities.rpc.Web3jProvider; +import io.optimism.utilities.telemetry.TracerTaskWrapper; import java.math.BigInteger; import java.util.Arrays; import java.util.Collections; diff --git a/hildr-node/src/main/java/io/optimism/rpc/provider/RetryRateLimitInterceptor.java b/hildr-node/src/main/java/io/optimism/rpc/provider/RetryRateLimitInterceptor.java deleted file mode 100644 index 76a4f2d5..00000000 --- a/hildr-node/src/main/java/io/optimism/rpc/provider/RetryRateLimitInterceptor.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright 2023 281165273grape@gmail.com - * - * 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 - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, - * either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ - -package io.optimism.rpc.provider; - -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.github.rholder.retry.RetryException; -import com.github.rholder.retry.Retryer; -import com.github.rholder.retry.RetryerBuilder; -import com.github.rholder.retry.StopStrategies; -import com.github.rholder.retry.WaitStrategies; -import com.google.common.util.concurrent.RateLimiter; -import io.optimism.l1.InnerWatcher; -import java.io.IOException; -import java.time.Duration; -import java.util.Map; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import okhttp3.Interceptor; -import okhttp3.Protocol; -import okhttp3.Response; -import org.jetbrains.annotations.NotNull; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * custom retry and rate limit interceptor of OkHttp. - * - * @author thinkAfCod - * @since 0.1.0 - */ -@SuppressWarnings("checkstyle:AnnotationLocationMostCases") -public class RetryRateLimitInterceptor implements Interceptor { - - private static final Logger LOGGER = LoggerFactory.getLogger(InnerWatcher.class); - - private static final String HEADER_NOT_FOUND = "header not found"; - - private static final String RATE_LIMIT_MSG = "rate limit"; - - private static final String DAILY_REQUEST_COUNT_EXCEEDED_REQUEST_RATE_LIMITED = - "daily request count exceeded, request rate limited"; - - private static final String RPC_CODE = "code"; - private static final String RPC_MESSAGE = "message"; - - private static final String RPC_ERROR_CODE = "429"; - private static final String EXCEEDS_BLOCK_GAS_LIMIT = "-32005"; - private static final String RATE_LIMIT_ERROR_CODE = "-32016"; - - private final RateLimiter rateLimiter; - - private final Retryer retryer; - - private final ObjectMapper mapper = new ObjectMapper(); - - /** the RetryRateLimitInterceptor constructor. */ - public RetryRateLimitInterceptor() { - this.rateLimiter = RateLimiter.create(200, Duration.ofMillis(50L)); - this.retryer = - RetryerBuilder.newBuilder() - .withWaitStrategy(WaitStrategies.randomWait(100, TimeUnit.MILLISECONDS)) - .withStopStrategy(StopStrategies.stopAfterAttempt(100)) - .retryIfResult(this::shouldRetry) - .retryIfException(e -> e instanceof IOException) - .build(); - } - - @NotNull @Override - public Response intercept(@NotNull final Chain chain) throws IOException { - try { - return this.retryer.call( - () -> { - if (!this.rateLimiter.tryAcquire()) { - return new Response.Builder() - .request(chain.request()) - .protocol(Protocol.HTTP_1_1) - .code(429) - .build(); - } - return chain.proceed(chain.request()); - }); - } catch (ExecutionException | RetryException e) { - LOGGER.error("request failed", e); - return new Response.Builder().request(chain.request()).code(-1).build(); - } - } - - private boolean shouldRetry(Response res) { - var httpCode = res.code(); - if (httpCode == 429) { - return true; - } - - try { - if (res.body() == null) { - return false; - } - String jsonRpcRes = res.peekBody(Long.MAX_VALUE).string(); - Map rpcRes = mapper.readValue(jsonRpcRes, new TypeReference<>() {}); - String rpcCode = (String) rpcRes.get(RPC_CODE); - String rpcMsg = (String) rpcRes.getOrDefault(RPC_MESSAGE, ""); - if (RPC_ERROR_CODE.equals(rpcCode) - || EXCEEDS_BLOCK_GAS_LIMIT.equals(rpcCode) - || (RATE_LIMIT_ERROR_CODE.equals(rpcCode) && RATE_LIMIT_MSG.contains(rpcMsg))) { - return true; - } - if (HEADER_NOT_FOUND.equals(rpcMsg) - || DAILY_REQUEST_COUNT_EXCEEDED_REQUEST_RATE_LIMITED.equals(rpcMsg)) { - return true; - } - - } catch (IOException e) { - throw new RuntimeException(e); - } - - return false; - } -} diff --git a/hildr-node/src/main/java/io/optimism/rpc/provider/Web3jProvider.java b/hildr-node/src/main/java/io/optimism/rpc/provider/Web3jProvider.java deleted file mode 100644 index 7af89145..00000000 --- a/hildr-node/src/main/java/io/optimism/rpc/provider/Web3jProvider.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2023 281165273grape@gmail.com - * - * 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 - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, - * either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ - -package io.optimism.rpc.provider; - -import okhttp3.OkHttpClient; -import org.web3j.protocol.Web3j; -import org.web3j.protocol.Web3jService; -import org.web3j.protocol.http.HttpService; -import org.web3j.tuples.generated.Tuple2; - -/** - * Web3j client provider. - * - * @author thinkAfCod - * @since 2023.06 - */ -public class Web3jProvider { - - private Web3jProvider() {} - - /** - * create web3j client. - * - * @param url ethereum/optimism client node url - * @return web3j client - */ - public static Web3j createClient(String url) { - OkHttpClient okHttpClient = - new OkHttpClient.Builder().addInterceptor(new RetryRateLimitInterceptor()).build(); - return Web3j.build(new HttpService(url, okHttpClient)); - } - - /** - * create web3j client. - * - * @param url ethereum/optimism client node url - * @return web3j client and web3j service - */ - public static Tuple2 create(String url) { - OkHttpClient okHttpClient = - new OkHttpClient.Builder().addInterceptor(new RetryRateLimitInterceptor()).build(); - Web3jService web3jService = new HttpService(url, okHttpClient); - return new Tuple2<>(Web3j.build(web3jService), web3jService); - } -} diff --git a/hildr-node/src/main/java/io/optimism/runner/Runner.java b/hildr-node/src/main/java/io/optimism/runner/Runner.java index d0c253a0..48200aff 100644 --- a/hildr-node/src/main/java/io/optimism/runner/Runner.java +++ b/hildr-node/src/main/java/io/optimism/runner/Runner.java @@ -30,7 +30,7 @@ import io.optimism.engine.ForkChoiceUpdate.ForkchoiceState; import io.optimism.engine.OpEthForkChoiceUpdate; import io.optimism.engine.OpEthPayloadStatus; -import io.optimism.telemetry.TracerTaskWrapper; +import io.optimism.utilities.telemetry.TracerTaskWrapper; import java.math.BigInteger; import java.time.Duration; import java.util.Arrays; diff --git a/hildr-node/src/main/java/io/optimism/telemetry/TracerTaskWrapper.java b/hildr-node/src/main/java/io/optimism/telemetry/TracerTaskWrapper.java deleted file mode 100644 index 151b1a47..00000000 --- a/hildr-node/src/main/java/io/optimism/telemetry/TracerTaskWrapper.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2023 281165273grape@gmail.com - * - * 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 - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, - * either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ - -package io.optimism.telemetry; - -import io.micrometer.tracing.Span; -import io.micrometer.tracing.Tracer; -import java.util.concurrent.Callable; - -/** - * The type TracerTaskWrapper. - * - * @author thinkAfCod - * @since 0.1.0 - */ -public class TracerTaskWrapper { - - /** Instantiates a new Tracer task wrapper. */ - public TracerTaskWrapper() {} - - /** - * Wrap callable. - * - * @param the type parameter - * @param call the call - * @return the callable - */ - public static Callable wrap(Callable call) { - return () -> { - Tracer tracer = Logging.INSTANCE.getTracer("structure-task-scope"); - Span span = tracer.nextSpan().name("call").start(); - try (var spanInScope = tracer.withSpan(span)) { - return call.call(); - } finally { - span.end(); - } - }; - } -} diff --git a/hildr-node/src/test/java/io/optimism/rpc/RpcServerTest.java b/hildr-node/src/test/java/io/optimism/rpc/RpcServerTest.java index ee47bec6..d9566b97 100644 --- a/hildr-node/src/test/java/io/optimism/rpc/RpcServerTest.java +++ b/hildr-node/src/test/java/io/optimism/rpc/RpcServerTest.java @@ -27,7 +27,7 @@ import io.optimism.rpc.internal.JsonRpcRequest; import io.optimism.rpc.internal.JsonRpcRequestId; import io.optimism.rpc.internal.result.OutputRootResult; -import io.optimism.telemetry.TracerTaskWrapper; +import io.optimism.utilities.telemetry.TracerTaskWrapper; import java.time.Duration; import java.util.Map; import java.util.concurrent.Future;