Skip to content

Commit 1ad784b

Browse files
authored
Add timing metric for client request headers (#1928)
Turns out we don't have a timing metric around header reading internally, so this change adds one.
1 parent 6285c78 commit 1ad784b

File tree

4 files changed

+22
-3
lines changed

4 files changed

+22
-3
lines changed

zuul-core/src/main/java/com/netflix/zuul/netty/server/BaseServerStartup.java

+5
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import com.netflix.netty.common.status.ServerStatusManager;
3333
import com.netflix.spectator.api.Counter;
3434
import com.netflix.spectator.api.Registry;
35+
import com.netflix.spectator.api.Timer;
3536
import com.netflix.zuul.FilterLoader;
3637
import com.netflix.zuul.FilterUsageNotifier;
3738
import com.netflix.zuul.RequestCompleteHandler;
@@ -168,6 +169,8 @@ protected void addChannelDependencies(
168169
channelDeps.set(ZuulDependencyKeys.requestCompleteHandler, reqCompleteHandler);
169170
Counter httpRequestHeadersReadTimeoutCounter = registry.counter("server.http.request.headers.read.timeout");
170171
channelDeps.set(ZuulDependencyKeys.httpRequestHeadersReadTimeoutCounter, httpRequestHeadersReadTimeoutCounter);
172+
Timer httpRequestHeadersReadTimer = registry.timer("server.http.request.headers.read.timer");
173+
channelDeps.set(ZuulDependencyKeys.httpRequestHeadersReadTimer, httpRequestHeadersReadTimer);
171174
Counter httpRequestReadTimeoutCounter = registry.counter("server.http.request.read.timeout");
172175
channelDeps.set(ZuulDependencyKeys.httpRequestReadTimeoutCounter, httpRequestReadTimeoutCounter);
173176
channelDeps.set(ZuulDependencyKeys.filterLoader, filterLoader);
@@ -193,6 +196,8 @@ protected void addChannelDependencies(
193196
channelDeps.set(ZuulDependencyKeys.requestCompleteHandler, reqCompleteHandler);
194197
Counter httpRequestHeadersReadTimeoutCounter = registry.counter("server.http.request.headers.read.timeout");
195198
channelDeps.set(ZuulDependencyKeys.httpRequestHeadersReadTimeoutCounter, httpRequestHeadersReadTimeoutCounter);
199+
Timer httpRequestHeadersReadTimer = registry.timer("server.http.request.headers.read.timer");
200+
channelDeps.set(ZuulDependencyKeys.httpRequestHeadersReadTimer, httpRequestHeadersReadTimer);
196201
Counter httpRequestReadTimeoutCounter = registry.counter("server.http.request.read.timeout");
197202
channelDeps.set(ZuulDependencyKeys.httpRequestReadTimeoutCounter, httpRequestReadTimeoutCounter);
198203
channelDeps.set(ZuulDependencyKeys.filterLoader, filterLoader);

zuul-core/src/main/java/com/netflix/zuul/netty/server/BaseZuulChannelInitializer.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import com.netflix.netty.common.throttle.MaxInboundConnectionsHandler;
4040
import com.netflix.spectator.api.Counter;
4141
import com.netflix.spectator.api.Registry;
42+
import com.netflix.spectator.api.Timer;
4243
import com.netflix.zuul.FilterLoader;
4344
import com.netflix.zuul.FilterUsageNotifier;
4445
import com.netflix.zuul.RequestCompleteHandler;
@@ -137,6 +138,7 @@ public abstract class BaseZuulChannelInitializer extends ChannelInitializer<Chan
137138
protected final SessionContextDecorator sessionContextDecorator;
138139
protected final RequestCompleteHandler requestCompleteHandler;
139140
protected final Counter httpRequestHeadersReadTimeoutCounter;
141+
protected final Timer httpRequestHeadersReadTimer;
140142
protected final Counter httpRequestReadTimeoutCounter;
141143
protected final FilterLoader filterLoader;
142144
protected final FilterUsageNotifier filterUsageNotifier;
@@ -214,6 +216,7 @@ private BaseZuulChannelInitializer(
214216
this.sessionContextDecorator = channelDependencies.get(ZuulDependencyKeys.sessionCtxDecorator);
215217
this.requestCompleteHandler = channelDependencies.get(ZuulDependencyKeys.requestCompleteHandler);
216218
this.httpRequestHeadersReadTimeoutCounter = channelDependencies.get(ZuulDependencyKeys.httpRequestHeadersReadTimeoutCounter);
219+
this.httpRequestHeadersReadTimer = channelDependencies.get(ZuulDependencyKeys.httpRequestHeadersReadTimer);
217220
this.httpRequestReadTimeoutCounter = channelDependencies.get(ZuulDependencyKeys.httpRequestReadTimeoutCounter);
218221

219222
this.filterLoader = channelDependencies.get(ZuulDependencyKeys.filterLoader);
@@ -262,7 +265,8 @@ protected void addHttpRelatedHandlers(ChannelPipeline pipeline) {
262265
pipeline.addLast(new HttpHeadersTimeoutHandler.InboundHandler(
263266
HTTP_REQUEST_HEADERS_READ_TIMEOUT_ENABLED::get,
264267
HTTP_REQUEST_HEADERS_READ_TIMEOUT::get,
265-
httpRequestHeadersReadTimeoutCounter
268+
httpRequestHeadersReadTimeoutCounter,
269+
httpRequestHeadersReadTimer
266270
));
267271
pipeline.addLast(new PassportStateHttpServerHandler.InboundHandler());
268272
pipeline.addLast(new PassportStateHttpServerHandler.OutboundHandler());

zuul-core/src/main/java/com/netflix/zuul/netty/server/ZuulDependencyKeys.java

+3
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.netflix.netty.common.status.ServerStatusManager;
2525
import com.netflix.spectator.api.Counter;
2626
import com.netflix.spectator.api.Registry;
27+
import com.netflix.spectator.api.Timer;
2728
import com.netflix.zuul.FilterLoader;
2829
import com.netflix.zuul.FilterUsageNotifier;
2930
import com.netflix.zuul.RequestCompleteHandler;
@@ -50,6 +51,8 @@ public class ZuulDependencyKeys {
5051
new ChannelConfigKey<>("requestCompleteHandler");
5152
public static final ChannelConfigKey<Counter> httpRequestHeadersReadTimeoutCounter =
5253
new ChannelConfigKey<>("httpRequestHeadersReadTimeoutCounter");
54+
public static final ChannelConfigKey<Timer> httpRequestHeadersReadTimer =
55+
new ChannelConfigKey<>("httpRequestHeadersReadTimer");
5356
public static final ChannelConfigKey<Counter> httpRequestReadTimeoutCounter =
5457
new ChannelConfigKey<>("httpRequestReadTimeoutCounter");
5558
public static final ChannelConfigKey<FilterLoader> filterLoader = new ChannelConfigKey<>("filterLoader");

zuul-core/src/main/java/com/netflix/zuul/netty/timeouts/HttpHeadersTimeoutHandler.java

+9-2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.slf4j.LoggerFactory;
2525

2626
import com.netflix.spectator.api.Counter;
27+
import com.netflix.spectator.api.Timer;
2728

2829
import io.netty.channel.ChannelHandlerContext;
2930
import io.netty.channel.ChannelInboundHandlerAdapter;
@@ -37,24 +38,29 @@ public class HttpHeadersTimeoutHandler {
3738

3839
private static final AttributeKey<ScheduledFuture<Void>> HTTP_HEADERS_READ_TIMEOUT_FUTURE =
3940
AttributeKey.newInstance("httpHeadersReadTimeoutFuture");
41+
private static final AttributeKey<Long> HTTP_HEADERS_READ_START_TIME =
42+
AttributeKey.newInstance("httpHeadersReadStartTime");
4043

4144
public static class InboundHandler extends ChannelInboundHandlerAdapter {
4245
private final BooleanSupplier httpHeadersReadTimeoutEnabledSupplier;
4346
private final IntSupplier httpHeadersReadTimeoutSupplier;
4447

4548
private final Counter httpHeadersReadTimeoutCounter;
49+
private final Timer httpHeadersReadTimer;
4650

4751
private boolean closed = false;
4852

49-
public InboundHandler(BooleanSupplier httpHeadersReadTimeoutEnabledSupplier, IntSupplier httpHeadersReadTimeoutSupplier, Counter httpHeadersReadTimeoutCounter) {
53+
public InboundHandler(BooleanSupplier httpHeadersReadTimeoutEnabledSupplier, IntSupplier httpHeadersReadTimeoutSupplier, Counter httpHeadersReadTimeoutCounter, Timer httpHeadersReadTimer) {
5054
this.httpHeadersReadTimeoutEnabledSupplier = httpHeadersReadTimeoutEnabledSupplier;
5155
this.httpHeadersReadTimeoutSupplier = httpHeadersReadTimeoutSupplier;
5256
this.httpHeadersReadTimeoutCounter = httpHeadersReadTimeoutCounter;
57+
this.httpHeadersReadTimer = httpHeadersReadTimer;
5358
}
5459

5560
@Override
5661
public void channelActive(ChannelHandlerContext ctx) throws Exception {
5762
try {
63+
ctx.channel().attr(HTTP_HEADERS_READ_START_TIME).set(System.nanoTime());
5864
if (!httpHeadersReadTimeoutEnabledSupplier.getAsBoolean())
5965
return;
6066
int timeout = httpHeadersReadTimeoutSupplier.getAsInt();
@@ -84,12 +90,13 @@ public void channelActive(ChannelHandlerContext ctx) throws Exception {
8490
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
8591
try {
8692
if (msg instanceof HttpMessage) {
93+
httpHeadersReadTimer.record(System.nanoTime() - ctx.channel().attr(HTTP_HEADERS_READ_START_TIME).get(), TimeUnit.NANOSECONDS);
8794
ScheduledFuture<Void> future = ctx.channel().attr(HTTP_HEADERS_READ_TIMEOUT_FUTURE).get();
8895
if (future != null) {
8996
future.cancel(false);
90-
ctx.pipeline().remove(this);
9197
LOG.debug("[{}] Removing HTTP headers read timeout handler", ctx.channel().id());
9298
}
99+
ctx.pipeline().remove(this);
93100
}
94101
} finally {
95102
super.channelRead(ctx, msg);

0 commit comments

Comments
 (0)