Skip to content

Commit 39d99ee

Browse files
committed
feat(metric): add prometheus interceptor
1 parent 4d0ad61 commit 39d99ee

File tree

6 files changed

+75
-8
lines changed

6 files changed

+75
-8
lines changed

framework/src/main/java/org/tron/core/services/RpcApiService.java

+8
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@
9898
import org.tron.core.exception.ZksnarkException;
9999
import org.tron.core.metrics.MetricsApiService;
100100
import org.tron.core.services.filter.LiteFnQueryGrpcInterceptor;
101+
import org.tron.core.services.ratelimiter.PrometheusInterceptor;
101102
import org.tron.core.services.ratelimiter.RateLimiterInterceptor;
102103
import org.tron.core.services.ratelimiter.RpcApiAccessInterceptor;
103104
import org.tron.core.utils.TransactionUtil;
@@ -189,6 +190,8 @@ public class RpcApiService extends RpcService {
189190
private RpcApiAccessInterceptor apiAccessInterceptor;
190191
@Autowired
191192
private MetricsApiService metricsApiService;
193+
@Autowired
194+
private PrometheusInterceptor prometheusInterceptor;
192195
@Getter
193196
private DatabaseApi databaseApi = new DatabaseApi();
194197
private WalletApi walletApi = new WalletApi();
@@ -252,6 +255,11 @@ public void start() {
252255
// add lite fullnode query interceptor
253256
serverBuilder.intercept(liteFnQueryGrpcInterceptor);
254257

258+
// add prometheus interceptor
259+
if (parameter.isMetricsPrometheusEnable()) {
260+
serverBuilder.intercept(prometheusInterceptor);
261+
}
262+
255263
if (parameter.isRpcReflectionServiceEnable()) {
256264
serverBuilder.addService(ProtoReflectionService.newInstance());
257265
}

framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java

+9
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import org.tron.core.config.args.Args;
4242
import org.tron.core.services.RpcApiService;
4343
import org.tron.core.services.filter.LiteFnQueryGrpcInterceptor;
44+
import org.tron.core.services.ratelimiter.PrometheusInterceptor;
4445
import org.tron.core.services.ratelimiter.RateLimiterInterceptor;
4546
import org.tron.core.services.ratelimiter.RpcApiAccessInterceptor;
4647
import org.tron.protos.Protocol.Account;
@@ -79,6 +80,9 @@ public class RpcApiServiceOnPBFT extends RpcService {
7980
@Autowired
8081
private RpcApiAccessInterceptor apiAccessInterceptor;
8182

83+
@Autowired
84+
private PrometheusInterceptor prometheusInterceptor;
85+
8286
private final String executorName = "rpc-pbft-executor";
8387

8488
@Override
@@ -124,6 +128,11 @@ public void start() {
124128
// add lite fullnode query interceptor
125129
serverBuilder.intercept(liteFnQueryGrpcInterceptor);
126130

131+
// add prometheus interceptor
132+
if (args.isMetricsPrometheusEnable()) {
133+
serverBuilder.intercept(prometheusInterceptor);
134+
}
135+
127136
if (args.isRpcReflectionServiceEnable()) {
128137
serverBuilder.addService(ProtoReflectionService.newInstance());
129138
}

framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java

+9
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import org.tron.core.config.args.Args;
4343
import org.tron.core.services.RpcApiService;
4444
import org.tron.core.services.filter.LiteFnQueryGrpcInterceptor;
45+
import org.tron.core.services.ratelimiter.PrometheusInterceptor;
4546
import org.tron.core.services.ratelimiter.RateLimiterInterceptor;
4647
import org.tron.core.services.ratelimiter.RpcApiAccessInterceptor;
4748
import org.tron.protos.Protocol.Account;
@@ -81,6 +82,9 @@ public class RpcApiServiceOnSolidity extends RpcService {
8182
@Autowired
8283
private RpcApiAccessInterceptor apiAccessInterceptor;
8384

85+
@Autowired
86+
private PrometheusInterceptor prometheusInterceptor;
87+
8488
private final String executorName = "rpc-solidity-executor";
8589

8690
@Override
@@ -125,6 +129,11 @@ public void start() {
125129
// add lite fullnode query interceptor
126130
serverBuilder.intercept(liteFnQueryGrpcInterceptor);
127131

132+
// add prometheus interceptor
133+
if (parameter.isMetricsPrometheusEnable()) {
134+
serverBuilder.intercept(prometheusInterceptor);
135+
}
136+
128137
if (parameter.isRpcReflectionServiceEnable()) {
129138
serverBuilder.addService(ProtoReflectionService.newInstance());
130139
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
2+
package org.tron.core.services.ratelimiter;
3+
4+
import io.grpc.ForwardingServerCall;
5+
import io.grpc.Metadata;
6+
import io.grpc.ServerCall;
7+
import io.grpc.ServerCallHandler;
8+
import io.grpc.ServerInterceptor;
9+
import io.grpc.Status;
10+
import io.prometheus.client.Histogram;
11+
import lombok.extern.slf4j.Slf4j;
12+
import org.springframework.stereotype.Component;
13+
import org.tron.common.prometheus.MetricKeys;
14+
import org.tron.common.prometheus.Metrics;
15+
16+
/**
17+
* A {@link ServerInterceptor} which sends latency stats about incoming grpc calls to Prometheus.
18+
*/
19+
@Slf4j(topic = "metrics")
20+
@Component
21+
public class PrometheusInterceptor implements ServerInterceptor {
22+
23+
@Override
24+
public <R, S> ServerCall.Listener<R> interceptCall(
25+
ServerCall<R, S> call, Metadata requestMetadata, ServerCallHandler<R, S> next) {
26+
return next.startCall(new MonitoringServerCall<>(call), requestMetadata);
27+
}
28+
29+
static class MonitoringServerCall<R, S> extends ForwardingServerCall
30+
.SimpleForwardingServerCall<R, S> {
31+
32+
private final Histogram.Timer requestTimer;
33+
34+
MonitoringServerCall(ServerCall<R, S> delegate) {
35+
super(delegate);
36+
this.requestTimer = Metrics.histogramStartTimer(
37+
MetricKeys.Histogram.GRPC_SERVICE_LATENCY, getMethodDescriptor().getFullMethodName());
38+
}
39+
40+
@Override
41+
public void close(Status status, Metadata responseHeaders) {
42+
Metrics.histogramObserve(requestTimer);
43+
super.close(status, responseHeaders);
44+
}
45+
}
46+
}

framework/src/main/java/org/tron/core/services/ratelimiter/RpcApiAccessInterceptor.java

+1-8
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,10 @@
66
import io.grpc.ServerCallHandler;
77
import io.grpc.ServerInterceptor;
88
import io.grpc.Status;
9-
import io.prometheus.client.Histogram;
109
import java.util.List;
1110
import lombok.extern.slf4j.Slf4j;
1211
import org.springframework.stereotype.Component;
1312
import org.tron.common.parameter.CommonParameter;
14-
import org.tron.common.prometheus.MetricKeys;
15-
import org.tron.common.prometheus.Metrics;
1613

1714
@Slf4j
1815
@Component
@@ -32,11 +29,7 @@ public <ReqT, RespT> Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> call,
3229
return new ServerCall.Listener<ReqT>() {};
3330

3431
} else {
35-
Histogram.Timer requestTimer = Metrics.histogramStartTimer(
36-
MetricKeys.Histogram.GRPC_SERVICE_LATENCY, endpoint);
37-
Listener<ReqT> res = next.startCall(call, headers);
38-
Metrics.histogramObserve(requestTimer);
39-
return res;
32+
return next.startCall(call, headers);
4033
}
4134
} catch (Exception e) {
4235
logger.error("check rpc api access Error: {}", e.getMessage());

framework/src/test/java/org/tron/core/services/RpcApiServicesTest.java

+2
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,8 @@ public static void init() throws IOException {
138138
getInstance().setRpcPort(PublicMethod.chooseRandomPort());
139139
getInstance().setRpcOnSolidityPort(PublicMethod.chooseRandomPort());
140140
getInstance().setRpcOnPBFTPort(PublicMethod.chooseRandomPort());
141+
getInstance().setMetricsPrometheusPort(PublicMethod.chooseRandomPort());
142+
getInstance().setMetricsPrometheusEnable(true);
141143
String fullNode = String.format("%s:%d", getInstance().getNodeLanIp(),
142144
getInstance().getRpcPort());
143145
String solidityNode = String.format("%s:%d", getInstance().getNodeLanIp(),

0 commit comments

Comments
 (0)