/** * Returns the status of the {@link Response}. * * @return the {@link HttpStatus}. {@link HttpStatus#UNKNOWN} if the {@link Response} has failed even * before receiving its first non-informational headers. * @throws RequestLogAvailabilityException if this property is not available yet */ default HttpStatus status() { final HttpStatus status = responseHeaders().status(); assert status != null; return status; }
@Nullable @Override public final Object getMessage(RequestLog log) { if (condition != null && !condition.apply(log.responseHeaders())) { return null; } return getMessage0(log); }
private void exportHttpResponseHeaders(Map<String, String> out, RequestLog log) { if (httpResHeaders == null || !log.isAvailable(RequestLogAvailability.RESPONSE_HEADERS)) { return; } exportHttpHeaders(out, log.responseHeaders(), httpResHeaders); }
private static long getRetryAfterMillis(ClientRequestContext ctx) { final HttpHeaders headers = firstNonNull(ctx.log().responseHeaders(), EMPTY_HEADERS); long millisAfter = -1; final String value = headers.get(HttpHeaderNames.RETRY_AFTER); if (value != null) { try { millisAfter = Duration.ofSeconds(Integer.parseInt(value)).toMillis(); return millisAfter; } catch (Exception ignored) { // Not a second value. } try { final Long later = headers.getTimeMillis(HttpHeaderNames.RETRY_AFTER); millisAfter = later - System.currentTimeMillis(); } catch (Exception ignored) { logger.debug("The retryAfter: {}, from the server is neither an HTTP date nor a second.", value); } } return millisAfter; }
@Override public CompletionStage<Boolean> shouldReportAsSuccess(ClientRequestContext ctx, @Nullable Throwable cause) { if (cause instanceof UnprocessedRequestException) { return CompletableFuture.completedFuture(null); // Neither success nor failure. } final HttpStatus status; if (ctx.log().isAvailable(RequestLogAvailability.RESPONSE_HEADERS)) { status = ctx.log().responseHeaders().status(); } else { status = null; } return CompletableFuture.completedFuture(function.apply(status, cause)); } }
@Override public CompletionStage<Backoff> shouldRetry(ClientRequestContext ctx, @Nullable Throwable cause) { final HttpStatus status; if (ctx.log().isAvailable(RequestLogAvailability.RESPONSE_HEADERS)) { status = ctx.log().responseHeaders().status(); } else { status = null; } return CompletableFuture.completedFuture(backoffFunction.apply(status, cause)); } }
private void checkRequestLogError(RequestLogErrorChecker checker) throws Exception { final RequestLog log = requestLogQueue.take(); assertThat(log.availabilities()).contains(RequestLogAvailability.COMPLETE); final RpcRequest rpcReq = (RpcRequest) log.requestContent(); if (rpcReq != null) { assertThat(rpcReq.serviceType()).isEqualTo(GrpcLogUtil.class); } checker.check(log.responseHeaders(), rpcReq, log.responseCause()); }
case "host": return log -> { final String authority = log.responseHeaders().authority(); if ("?".equals(authority)) { final InetSocketAddress remoteAddr = log.context().remoteAddress();
@Test(timeout = 10000) public void testMessageLogsForOneWay() throws Exception { final OnewayHelloService.Iface client = Clients.newClient(clientFactory(), getURI(Handlers.HELLO), Handlers.ONEWAYHELLO.iface(), clientOptions); recordMessageLogs = true; client.hello("trustin"); final RequestLog log = requestLogs.take(); assertThat(log.requestHeaders()).isInstanceOf(HttpHeaders.class); assertThat(log.requestContent()).isInstanceOf(RpcRequest.class); assertThat(log.rawRequestContent()).isInstanceOf(ThriftCall.class); final RpcRequest request = (RpcRequest) log.requestContent(); assertThat(request.serviceType()).isEqualTo(OnewayHelloService.Iface.class); assertThat(request.method()).isEqualTo("hello"); assertThat(request.params()).containsExactly("trustin"); final ThriftCall rawRequest = (ThriftCall) log.rawRequestContent(); assertThat(rawRequest.header().type).isEqualTo(TMessageType.ONEWAY); assertThat(rawRequest.header().name).isEqualTo("hello"); assertThat(rawRequest.args()).isInstanceOf(OnewayHelloService.hello_args.class); assertThat(((OnewayHelloService.hello_args) rawRequest.args()).getName()).isEqualTo("trustin"); assertThat(log.responseHeaders()).isInstanceOf(HttpHeaders.class); assertThat(log.responseContent()).isInstanceOf(RpcResponse.class); assertThat(log.rawResponseContent()).isNull(); final RpcResponse response = (RpcResponse) log.responseContent(); assertThat(response.get()).isNull(); }
@Test(timeout = 10000) public void testMessageLogsForException() throws Exception { final HelloService.Iface client = Clients.newClient(clientFactory(), getURI(Handlers.EXCEPTION), Handlers.EXCEPTION.iface(), clientOptions); recordMessageLogs = true; assertThatThrownBy(() -> client.hello("trustin")).isInstanceOf(TApplicationException.class); final RequestLog log = requestLogs.take(); assertThat(log.requestHeaders()).isInstanceOf(HttpHeaders.class); assertThat(log.requestContent()).isInstanceOf(RpcRequest.class); assertThat(log.rawRequestContent()).isInstanceOf(ThriftCall.class); final RpcRequest request = (RpcRequest) log.requestContent(); assertThat(request.serviceType()).isEqualTo(HelloService.Iface.class); assertThat(request.method()).isEqualTo("hello"); assertThat(request.params()).containsExactly("trustin"); final ThriftCall rawRequest = (ThriftCall) log.rawRequestContent(); assertThat(rawRequest.header().type).isEqualTo(TMessageType.CALL); assertThat(rawRequest.header().name).isEqualTo("hello"); assertThat(rawRequest.args()).isInstanceOf(HelloService.hello_args.class); assertThat(((HelloService.hello_args) rawRequest.args()).getName()).isEqualTo("trustin"); assertThat(log.responseHeaders()).isInstanceOf(HttpHeaders.class); assertThat(log.responseContent()).isInstanceOf(RpcResponse.class); assertThat(log.rawResponseContent()).isInstanceOf(ThriftReply.class); final RpcResponse response = (RpcResponse) log.responseContent(); assertThat(response.cause()).isNotNull(); final ThriftReply rawResponse = (ThriftReply) log.rawResponseContent(); assertThat(rawResponse.header().type).isEqualTo(TMessageType.EXCEPTION); assertThat(rawResponse.header().name).isEqualTo("hello"); assertThat(rawResponse.exception()).isNotNull(); }
assertThat(((HelloService.hello_args) rawRequest.args()).getName()).isEqualTo("trustin"); assertThat(log.responseHeaders()).isInstanceOf(HttpHeaders.class); assertThat(log.responseContent()).isInstanceOf(RpcResponse.class); assertThat(log.rawResponseContent()).isInstanceOf(ThriftReply.class);
assertThat(((HelloService.hello_args) rawRequest.args()).getName()).isEqualTo("Trustin"); assertThat(log.responseHeaders()).isInstanceOf(HttpHeaders.class); assertThat(log.responseContent()).isInstanceOf(RpcResponse.class); assertThat(log.rawResponseContent()).isInstanceOf(ThriftReply.class);
assertThat(((HelloService.hello_args) rawRequest.args()).getName()).isEqualTo("Trustin"); assertThat(log.responseHeaders()).isInstanceOf(HttpHeaders.class); assertThat(log.responseContent()).isInstanceOf(RpcResponse.class); assertThat(log.rawResponseContent()).isInstanceOf(ThriftReply.class);
final HttpStatus status = log.responseHeaders().status(); if (status != null && status.code() >= 200 && status.code() < 400) { pathAndQuery.storeInCache(originalPath);
private void propagateResponseSideLog(RequestLog lastChild) { // update the available logs if the lastChild already has them if (lastChild.isAvailable(RESPONSE_START)) { startResponse0(lastChild.responseStartTimeNanos(), lastChild.responseStartTimeMicros(), true); } if (lastChild.isAvailable(RESPONSE_FIRST_BYTES_TRANSFERRED)) { responseFirstBytesTransferred(lastChild.responseFirstBytesTransferredTimeNanos()); } if (lastChild.isAvailable(RESPONSE_HEADERS)) { responseHeaders(lastChild.responseHeaders()); } if (lastChild.isAvailable(RESPONSE_CONTENT)) { responseContent(lastChild.responseContent(), lastChild.rawResponseContent()); } if (lastChild.isAvailable(RESPONSE_END)) { endResponse0(lastChild.responseCause(), lastChild.responseEndTimeNanos()); } lastChild.addListener(log -> startResponse0( log.responseStartTimeNanos(), log.responseStartTimeMicros(), true), RESPONSE_START); lastChild.addListener(log -> responseFirstBytesTransferred( log.responseFirstBytesTransferredTimeNanos()), RESPONSE_FIRST_BYTES_TRANSFERRED); lastChild.addListener(log -> responseHeaders(log.responseHeaders()), RESPONSE_HEADERS); lastChild.addListener(log -> responseContent( log.responseContent(), log.rawResponseContent()), RESPONSE_CONTENT); lastChild.addListener(log -> endResponse0( log.responseCause(), log.responseEndTimeNanos()), RESPONSE_END); }
private void exportHttpResponseHeaders(Map<String, String> out, RequestLog log) { if (httpResHeaders == null || !log.isAvailable(RequestLogAvailability.RESPONSE_HEADERS)) { return; } exportHttpHeaders(out, log.responseHeaders(), httpResHeaders); }
private void exportHttpResponseHeaders(Map<String, String> out, RequestLog log) { if (httpResHeaders == null || !log.isAvailable(RequestLogAvailability.RESPONSE_HEADERS)) { return; } exportHttpHeaders(out, log.responseHeaders(), httpResHeaders); }