private static boolean isSuccess(RequestLog log) { if (log.responseCause() != null) { return false; } final int statusCode = log.statusCode(); if (statusCode < 100 || statusCode >= 400) { return false; } final Object responseContent = log.responseContent(); if (responseContent instanceof RpcResponse) { return !((RpcResponse) responseContent).isCompletedExceptionally(); } return true; }
/** * Logs a stringified response of {@link RequestLog}. */ public static void logResponse(Logger logger, RequestLog log, LogLevel requestLogLevel, Function<HttpHeaders, HttpHeaders> requestHeadersSanitizer, Function<Object, Object> requestContentSanitizer, LogLevel successfulResponseLogLevel, LogLevel failedResponseLogLevel, Function<HttpHeaders, HttpHeaders> responseHeadersSanitizer, Function<Object, Object> responseContentSanitizer) { final LogLevel level = log.responseCause() == null ? successfulResponseLogLevel : failedResponseLogLevel; if (level.isEnabled(logger)) { if (log.responseCause() == null) { level.log(logger, RESPONSE_FORMAT, log.toStringResponseOnly(responseHeadersSanitizer, responseContentSanitizer)); } else { if (!requestLogLevel.isEnabled(logger)) { // Request wasn't logged but this is an unsuccessful response, log the request too to help // debugging. level.log(logger, REQUEST_FORMAT, log.toStringRequestOnly(requestHeadersSanitizer, responseContentSanitizer)); } level.log(logger, RESPONSE_FORMAT, log.toStringResponseOnly(responseHeadersSanitizer, responseContentSanitizer), log.responseCause()); } } } }
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()); }
.tag("http.url", uriBuilder.toString()) .tag("http.status_code", log.status().codeAsText()); final Throwable responseCause = log.responseCause(); if (responseCause != null) { span.tag("error", responseCause.toString());
return RequestLog::responseLength; case "responseCause": return log -> handleThrowable(log.responseCause());
"armeria.grpc.testing.UnitTestService/StreamClientCancelsBeforeResponseClosedCancels"); assertThat(rpcReq.params()).containsExactly(SimpleRequest.getDefaultInstance()); assertThat(log.responseCause()).isInstanceOf(AbortedStreamException.class);
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); }
@Override protected HttpResponse doExecute(ClientRequestContext ctx, HttpRequest req, CircuitBreaker circuitBreaker) throws Exception { final HttpResponse response; try { response = delegate().execute(ctx, req); } catch (Throwable cause) { if (needsContentInStrategy) { reportSuccessOrFailure(circuitBreaker, strategyWithContent().shouldReportAsSuccess( ctx, HttpResponse.ofFailure(cause))); } else { reportSuccessOrFailure(circuitBreaker, strategy().shouldReportAsSuccess(ctx, cause)); } throw cause; } if (needsContentInStrategy) { final HttpResponseDuplicator resDuplicator = new HttpResponseDuplicator( response, maxSignalLength(ctx.maxResponseLength()), ctx.eventLoop()); reportSuccessOrFailure(circuitBreaker, strategyWithContent().shouldReportAsSuccess( ctx, resDuplicator.duplicateStream())); return resDuplicator.duplicateStream(true); } ctx.log().addListener(log -> { final Throwable cause = log.isAvailable(RequestLogAvailability.RESPONSE_END) ? log.responseCause() : null; reportSuccessOrFailure(circuitBreaker, strategy().shouldReportAsSuccess(ctx, cause)); }, RequestLogAvailability.RESPONSE_HEADERS); return response; }
} else { final Throwable responseCause = log.isAvailable(RequestLogAvailability.RESPONSE_END) ? log.responseCause() : null; retryStrategy().shouldRetry(derivedCtx, responseCause) .handle(handleBackoff(ctx, derivedCtx, rootReqDuplicator, originalReq,