Skip to content

Commit 4a87265

Browse files
committed
Add a new metric turms.client.request.pending to record the number of pending requests
1 parent e8991ed commit 4a87265

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

turms-gateway/src/main/java/im/turms/gateway/access/client/common/ClientRequestDispatcher.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,14 @@
1717

1818
package im.turms.gateway.access.client.common;
1919

20+
import java.util.concurrent.atomic.AtomicInteger;
21+
2022
import io.netty.buffer.ByteBuf;
2123
import io.netty.buffer.Unpooled;
2224
import org.springframework.stereotype.Component;
2325
import reactor.core.publisher.Mono;
2426

27+
import im.turms.gateway.domain.observation.service.MetricsService;
2528
import im.turms.gateway.domain.servicerequest.service.ServiceRequestService;
2629
import im.turms.gateway.domain.session.access.client.controller.SessionClientController;
2730
import im.turms.gateway.domain.session.service.SessionService;
@@ -43,6 +46,7 @@
4346
import im.turms.server.common.infra.healthcheck.ServiceAvailability;
4447
import im.turms.server.common.infra.logging.core.logger.Logger;
4548
import im.turms.server.common.infra.logging.core.logger.LoggerFactory;
49+
import im.turms.server.common.infra.metrics.CommonMetricNameConst;
4650
import im.turms.server.common.infra.property.TurmsPropertiesManager;
4751
import im.turms.server.common.infra.proto.ProtoDecoder;
4852
import im.turms.server.common.infra.proto.ProtoEncoder;
@@ -84,6 +88,8 @@ public class ClientRequestDispatcher {
8488
private final ServiceRequestService serviceRequestService;
8589
private final ServerStatusManager serverStatusManager;
8690

91+
private final AtomicInteger pendingRequestCount;
92+
8793
public ClientRequestDispatcher(
8894
ApiLoggingContext apiLoggingContext,
8995
BlocklistService blocklistService,
@@ -92,6 +98,7 @@ public ClientRequestDispatcher(
9298
SessionService sessionService,
9399
ServiceRequestService serviceRequestService,
94100
ServerStatusManager serverStatusManager,
101+
MetricsService metricsService,
95102
TurmsPropertiesManager propertiesManager) {
96103
this.apiLoggingContext = apiLoggingContext;
97104
this.blocklistService = blocklistService;
@@ -100,6 +107,8 @@ public ClientRequestDispatcher(
100107
this.sessionService = sessionService;
101108
this.serviceRequestService = serviceRequestService;
102109
this.serverStatusManager = serverStatusManager;
110+
pendingRequestCount = metricsService.getRegistry()
111+
.gauge(CommonMetricNameConst.TURMS_CLIENT_REQUEST_PENDING, new AtomicInteger());
103112
NotificationFactory.init(propertiesManager);
104113
}
105114

@@ -113,6 +122,19 @@ public ClientRequestDispatcher(
113122
public Mono<ByteBuf> handleRequest(
114123
UserSessionWrapper sessionWrapper,
115124
ByteBuf serviceRequestBuffer) {
125+
pendingRequestCount.incrementAndGet();
126+
try {
127+
return handleRequest0(sessionWrapper, serviceRequestBuffer)
128+
.doFinally(signalType -> pendingRequestCount.decrementAndGet());
129+
} catch (Exception e) {
130+
pendingRequestCount.decrementAndGet();
131+
return Mono.error(e);
132+
}
133+
}
134+
135+
public Mono<ByteBuf> handleRequest0(
136+
UserSessionWrapper sessionWrapper,
137+
ByteBuf serviceRequestBuffer) {
116138
// Check if it is a heartbeat request
117139
if (!serviceRequestBuffer.isReadable()) {
118140
serviceRequestBuffer.release();

turms-service/src/main/java/im/turms/service/access/servicerequest/dispatcher/ServiceRequestDispatcher.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.ArrayList;
2323
import java.util.List;
2424
import java.util.Set;
25+
import java.util.concurrent.atomic.AtomicInteger;
2526
import jakarta.annotation.Nullable;
2627
import jakarta.validation.constraints.NotNull;
2728

@@ -65,6 +66,7 @@
6566
import im.turms.server.common.infra.tracing.TracingContext;
6667
import im.turms.service.access.servicerequest.dto.ClientRequest;
6768
import im.turms.service.access.servicerequest.dto.RequestHandlerResult;
69+
import im.turms.service.domain.observation.service.MetricsService;
6870
import im.turms.service.infra.logging.ApiLoggingContext;
6971
import im.turms.service.infra.logging.ClientApiLogging;
7072
import im.turms.service.infra.plugin.extension.ClientRequestTransformer;
@@ -98,6 +100,8 @@ public class ServiceRequestDispatcher implements IServiceRequestDispatcher {
98100

99101
private final FastEnumMap<TurmsRequest.KindCase, ClientRequestHandler> requestTypeToHandler;
100102

103+
private final AtomicInteger pendingRequestCount;
104+
101105
static {
102106
try {
103107
REQUEST_TRANSFORM_METHOD = ClientRequestTransformer.class.getDeclaredMethod("transform",
@@ -124,6 +128,7 @@ public ServiceRequestDispatcher(
124128
ApiLoggingContext apiLoggingContext,
125129
ApplicationContext context,
126130
BlocklistService blocklistService,
131+
MetricsService metricsService,
127132
OutboundMessageManager outboundMessageManager,
128133
ServerStatusManager serverStatusManager,
129134
PluginManager pluginManager,
@@ -147,6 +152,8 @@ public ServiceRequestDispatcher(
147152
+ requestType);
148153
}
149154
}
155+
pendingRequestCount = metricsService.getRegistry()
156+
.gauge(TURMS_CLIENT_REQUEST_PENDING, new AtomicInteger());
150157
}
151158

152159
private FastEnumMap<TurmsRequest.KindCase, ClientRequestHandler> getMappings(
@@ -194,10 +201,13 @@ private boolean isRequestForGateway(TurmsRequest.KindCase type) {
194201
@Override
195202
public Mono<ServiceResponse> dispatch(TracingContext context, ServiceRequest serviceRequest) {
196203
ByteBuf requestBuffer = serviceRequest.getTurmsRequestBuffer();
204+
pendingRequestCount.incrementAndGet();
197205
try {
198206
requestBuffer.touch(serviceRequest);
199-
return dispatch0(context, serviceRequest);
207+
return dispatch0(context, serviceRequest)
208+
.doFinally(unused -> pendingRequestCount.decrementAndGet());
200209
} catch (Exception e) {
210+
pendingRequestCount.decrementAndGet();
201211
LOGGER.error("Failed to handle the request: {}", serviceRequest, e);
202212
return Mono.just(
203213
ServiceResponse.of(ResponseStatusCode.SERVER_INTERNAL_ERROR, e.toString()));

0 commit comments

Comments
 (0)