public ZuulMessageImpl(SessionContext context, Headers headers) { this.context = context == null ? new SessionContext() : context; this.headers = headers == null ? new Headers() : headers; this.bodyChunks = new ArrayList<>(16); }
protected String getRequestId(Channel channel, SessionContext ctx) { return ctx == null ? "-" : ctx.getUUID(); } }
protected String getEndPointName(final SessionContext zuulCtx) { if (zuulCtx.shouldSendErrorResponse()) { zuulCtx.setShouldSendErrorResponse(false); zuulCtx.setErrorResponseSent(true); final String errEndPointName = zuulCtx.getErrorEndpoint(); return (Strings.isNullOrEmpty(errEndPointName)) ? DEFAULT_ERROR_ENDPOINT.get() : errEndPointName; } else { return zuulCtx.getEndpoint(); } }
@Test public void testBoolean() { SessionContext context = new SessionContext(); assertEquals(context.getBoolean("boolean_test"), Boolean.FALSE); assertEquals(context.getBoolean("boolean_test", true), true); } }
final CompleteReason reason = ((CompleteEvent) evt).getReason(); if (zuulRequest != null) { zuulRequest.getContext().cancel(); zuulRequest.disposeBufferedBody(); final CurrentPassport passport = CurrentPassport.fromSessionContext(zuulRequest.getContext()); zuulCtx.getUUID(), clientRequest.uri(), reason.name(), ChannelUtils.channelInfoForLogging(ctx.channel())); if (zuulCtx.debugRequest()) { LOG.debug("Endpoint = {}", zuulCtx.getEndpoint()); dumpDebugInfo(Debug.getRequestDebug(zuulCtx)); dumpDebugInfo(Debug.getRoutingDebug(zuulCtx));
@Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { LOG.error("zuul filter chain handler caught exception. cause=" + String.valueOf(cause), cause); if (zuulRequest != null && !isClientChannelClosed(cause)) { final SessionContext zuulCtx = zuulRequest.getContext(); zuulCtx.setError(cause); zuulCtx.setShouldSendErrorResponse(true); sendResponse(FAILURE_LOCAL, 500, ctx); } else { fireEndpointFinish(true); ctx.close(); } }
if (zuulCtx.isInBrownoutMode()) { zuulCtx.setError(ex); zuulCtx.setShouldSendErrorResponse(true);
ZuulStatusCategory.FAILURE_CLIENT_BAD_REQUEST); zuulRequest.getContext().setError(ze); zuulRequest.getContext().setShouldSendErrorResponse(true); if ((zuulRequest != null) && (! zuulRequest.getContext().isCancelled())) { ctx.fireChannelRead(msg); } else {
protected final O filter(final ZuulFilter<I, O> filter, final I inMesg) { final long startTime = System.currentTimeMillis(); final ZuulMessage snapshot = inMesg.getContext().debugRouting() ? inMesg.clone() : null; FilterChainResumer resumer = null; if (filter.filterType() == INBOUND && inMesg.getContext().shouldSendErrorResponse()) { LOG.debug("Filter {} waiting for body, UUID {}", filter.filterName(), inMesg.getContext().getUUID()); return null; //wait for whole body to be buffered
/** * sets a key value to Boolean.TRUE * * @param key */ public void set(String key) { put(key, Boolean.TRUE); }
SessionContext context = new SessionContext(); request.getContext().getTimings().getRequest().start(); context.getTimings().getRequest().end();
@Override public void collectAndPublish(SessionContext context) { // Request timings. long totalRequestTime = context.getTimings().getRequest().getDuration(); long requestProxyTime = context.getTimings().getRequestProxy().getDuration(); int originReportedDuration = context.getOriginReportedDuration(); // Approximation of time spent just within Zuul's own processing of the request. long totalInternalTime = totalRequestTime - requestProxyTime; // Approximation of time added to request by addition of Zuul+NIWS // (ie. the time added compared to if ELB sent request direct to Origin). // if -1, means we don't have that metric. long totalTimeAddedToOrigin = -1; if (originReportedDuration > -1) { totalTimeAddedToOrigin = totalRequestTime - originReportedDuration; } // Publish final String METRIC_TIMINGS_REQ_PREFIX = "zuul.timings.request."; recordRequestTiming(METRIC_TIMINGS_REQ_PREFIX + "total", totalRequestTime); recordRequestTiming(METRIC_TIMINGS_REQ_PREFIX + "proxy", requestProxyTime); recordRequestTiming(METRIC_TIMINGS_REQ_PREFIX + "internal", totalInternalTime); recordRequestTiming(METRIC_TIMINGS_REQ_PREFIX + "added", totalTimeAddedToOrigin); }
@Override public void filter(final HttpRequestMessage zuulReq) { if (zuulReq.getContext().isCancelled()) { zuulReq.disposeBufferedBody(); logger.debug("Request was cancelled, UUID {}", zuulReq.getContext().getUUID()); return; } final String endpointName = getEndPointName(zuulReq.getContext()); try { Preconditions.checkNotNull(zuulReq, "input message"); final ZuulFilter<HttpRequestMessage, HttpResponseMessage> endpoint = getEndpoint(endpointName, zuulReq); logger.debug("Got endpoint {}, UUID {}", endpoint.filterName(), zuulReq.getContext().getUUID()); setEndpoint(zuulReq, endpoint); final HttpResponseMessage zuulResp = filter(endpoint, zuulReq); if ((zuulResp != null)&&(! (endpoint instanceof ProxyEndpoint))) { //EdgeProxyEndpoint calls invokeNextStage internally logger.debug("Endpoint calling invokeNextStage, UUID {}", zuulReq.getContext().getUUID()); invokeNextStage(zuulResp); } } catch (Exception ex) { handleException(zuulReq, endpointName, ex); } }
protected void recordFilterCompletion(final ExecutionStatus status, final ZuulFilter<I, O> filter, long startTime, final ZuulMessage zuulMesg, final ZuulMessage startSnapshot) { final SessionContext zuulCtx = zuulMesg.getContext(); final long execTime = System.currentTimeMillis() - startTime; if (execTime >= FILTER_EXCESSIVE_EXEC_TIME.get()) { LOG.warn("Filter {} took {} ms to complete! status = {}", filter.filterName(), execTime, status.name()); } // Record the execution summary in context. switch (status) { case FAILED: zuulCtx.addFilterExecutionSummary(filter.filterName(), FAILED.name(), execTime); break; case SUCCESS: zuulCtx.addFilterExecutionSummary(filter.filterName(), SUCCESS.name(), execTime); if (startSnapshot != null) { //debugRouting == true Debug.addRoutingDebug(zuulCtx, "Filter {" + filter.filterName() + " TYPE:" + filter.filterType().toString() + " ORDER:" + filter.filterOrder() + "} Execution time = " + execTime + "ms"); Debug.compareContextState(filter.filterName(), zuulCtx, startSnapshot.getContext()); } break; default: break; } LOG.debug("Filter {} completed with status {}, UUID {}", filter.filterName(), status.name(), zuulMesg.getContext().getUUID()); // Notify configured listener. usageNotifier.notify(filter, status); }
final Timing timing = ctx.getTimings().getRequestProxy(); timing.start(); if (stats != null) ctx.setShouldSendErrorResponse(true);
@Override public ZuulMessage clone() { final ZuulMessageImpl copy = new ZuulMessageImpl(context.clone(), headers.clone()); this.bodyChunks.forEach(chunk -> { chunk.retain(); copy.bufferBodyContents(chunk); }); return copy; }
@Override public String getPath() { if (message.getContext().containsKey(CommonContextKeys.ZUUL_USE_DECODED_URI)) { return decodedPath; } return path; } @Override
Timing readTiming = context.getTimings().getRequestBodyRead(); readTiming.start(); requestBuiltObs.finallyDo(() -> readTiming.end() ); final Timing timing = context.getTimings().getRequestProxy(); timing.start(); Observable<HttpResponseMessage> responseObs = requestBuiltObs.map(httpClientRequest -> {
protected ZuulException proxyError(HttpRequestMessage zuulReq, Throwable t, String errorCauseMsg) { // Flag this as a proxy failure in the RequestContext. Error filter will then use this flag. zuulReq.getContext().setShouldSendErrorResponse(true); LOG.error(String.format("Error making http request to Origin. restClientName=%s, url=%s", this.name, zuulReq.getPathAndQuery()), t); if (errorCauseMsg == null) { if (t.getCause() != null) { errorCauseMsg = t.getCause().getMessage(); } } if (errorCauseMsg == null) errorCauseMsg = "unknown"; return new ZuulException("Proxying error", t, errorCauseMsg); }