@Test public void testRequestDebug() { assertFalse(debugRouting(ctx)); assertFalse(debugRequest(ctx)); setDebugRouting(ctx, true); setDebugRequest(ctx, true); assertTrue(debugRouting(ctx)); assertTrue(debugRequest(ctx)); addRoutingDebug(ctx, "test1"); assertTrue(getRoutingDebug(ctx).contains("test1")); addRequestDebug(ctx, "test2"); assertTrue(getRequestDebug(ctx).contains("test2")); }
public static Observable<Boolean> writeDebugMessage(SessionContext context, ZuulMessage msg, String prefix, String arrow) { Observable<Boolean> obs = null; for (Header header : msg.getHeaders().entries()) { Debug.addRequestDebug(context, String.format("%s:: %s HDR: %s:%s", prefix, arrow, header.getKey(), header.getValue())); } // Capture the response body into a Byte array for later usage. if (msg.hasBody()) { if (! Debug.debugRequestHeadersOnly(context)) { // Convert body to a String and add to debug log. String body = msg.getBodyAsText(); Debug.addRequestDebug(context, String.format("%s:: %s BODY: %s", prefix, arrow, body)); } } if (obs == null) obs = Observable.just(Boolean.FALSE); return obs; }
public static Observable<Boolean> writeDebugResponse(SessionContext context, HttpResponseInfo response, boolean isInbound) { Observable<Boolean> obs = null; if (Debug.debugRequest(context)) { String prefix = isInbound ? "RESPONSE_INBOUND" : "RESPONSE_OUTBOUND"; String arrow = "<"; Debug.addRequestDebug(context, String.format("%s:: %s STATUS: %s", prefix, arrow, response.getStatus())); obs = Debug.writeDebugMessage(context, response, prefix, arrow); } if (obs == null) obs = Observable.just(Boolean.FALSE); return obs; }
@Test public void testWriteInboundRequestDebug() { ctx.setDebugRequest(true); ctx.setDebugRequestHeadersOnly(true); Debug.writeDebugRequest(ctx, request, true).toBlocking().single(); List<String> debugLines = Debug.getRequestDebug(ctx); assertEquals(3, debugLines.size()); assertEquals("REQUEST_INBOUND:: > LINE: POST /some/where?k1=v1 HTTP/1.1", debugLines.get(0)); assertEquals("REQUEST_INBOUND:: > HDR: Content-Length:13", debugLines.get(1)); assertEquals("REQUEST_INBOUND:: > HDR: lah:deda", debugLines.get(2)); }
@Test public void testWriteInboundResponseDebug() { ctx.setDebugRequest(true); ctx.setDebugRequestHeadersOnly(true); Debug.writeDebugResponse(ctx, response, true).toBlocking().single(); List<String> debugLines = Debug.getRequestDebug(ctx); assertEquals(3, debugLines.size()); assertEquals("RESPONSE_INBOUND:: < STATUS: 200", debugLines.get(0)); assertEquals("RESPONSE_INBOUND:: < HDR: Content-Length:13", debugLines.get(1)); assertEquals("RESPONSE_INBOUND:: < HDR: lah:deda", debugLines.get(2)); }
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); }
dumpDebugInfo(Debug.getRequestDebug(zuulCtx)); dumpDebugInfo(Debug.getRoutingDebug(zuulCtx));
SessionContext context = request.getContext(); OriginManager<NettyOrigin> originManager = (OriginManager<NettyOrigin>) context.get(CommonContextKeys.ORIGIN_MANAGER); if (Debug.debugRequest(context)) { Debug.addRequestDebug(context, "RoutingLog: " + entry);
/** * Adds debug details about changes that a given filter made to the request context. * @param filterName * @param copy */ public static void compareContextState(String filterName, SessionContext context, SessionContext copy) { // TODO - only comparing Attributes. Need to compare the messages too. Iterator<String> it = context.keySet().iterator(); String key = it.next(); while (key != null) { if ((!key.equals("routingDebug") && !key.equals("requestDebug"))) { Object newValue = context.get(key); Object oldValue = copy.get(key); if (oldValue == null && newValue != null) { addRoutingDebug(context, "{" + filterName + "} added " + key + "=" + newValue.toString()); } else if (oldValue != null && newValue != null) { if (!(oldValue.equals(newValue))) { addRoutingDebug(context, "{" +filterName + "} changed " + key + "=" + newValue.toString()); } } } if (it.hasNext()) { key = it.next(); } else { key = null; } } }
public static void addRequestDebugForMessage(SessionContext ctx, ZuulMessage message, String prefix) { for (Header header : message.getHeaders().entries()) { Debug.addRequestDebug(ctx, prefix + " " + header.getKey() + " " + header.getValue()); } if (message.hasBody()) { String bodyStr = message.getBodyAsText(); Debug.addRequestDebug(ctx, prefix + " " + bodyStr); } }
/** * Adds a line to the Request debug messages * @param line */ public static void addRequestDebug(SessionContext ctx, String line) { List<String> rd = getRequestDebug(ctx); rd.add(line); }
public static void addRoutingDebug(SessionContext ctx, String line) { List<String> rd = getRoutingDebug(ctx); rd.add(line); }
public static Observable<Boolean> writeDebugRequest(SessionContext context, HttpRequestInfo request, boolean isInbound) { Observable<Boolean> obs = null; if (Debug.debugRequest(context)) { String prefix = isInbound ? "REQUEST_INBOUND" : "REQUEST_OUTBOUND"; String arrow = ">"; Debug.addRequestDebug(context, String.format("%s:: %s LINE: %s %s %s", prefix, arrow, request.getMethod().toUpperCase(), request.getPathAndQuery(), request.getProtocol())); obs = Debug.writeDebugMessage(context, request, prefix, arrow); } if (obs == null) obs = Observable.just(Boolean.FALSE); return obs; }
@Test public void testWriteRequestDebug_WithBody() { ctx.setDebugRequest(true); ctx.setDebugRequestHeadersOnly(false); Debug.writeDebugRequest(ctx, request, true).toBlocking().single(); List<String> debugLines = Debug.getRequestDebug(ctx); assertEquals(4, debugLines.size()); assertEquals("REQUEST_INBOUND:: > LINE: POST /some/where?k1=v1 HTTP/1.1", debugLines.get(0)); assertEquals("REQUEST_INBOUND:: > HDR: Content-Length:13", debugLines.get(1)); assertEquals("REQUEST_INBOUND:: > HDR: lah:deda", debugLines.get(2)); assertEquals("REQUEST_INBOUND:: > BODY: some text", debugLines.get(3)); }
@Test public void testWriteOutboundResponseDebug() { ctx.setDebugRequest(true); ctx.setDebugRequestHeadersOnly(true); Debug.writeDebugResponse(ctx, response, false).toBlocking().single(); List<String> debugLines = Debug.getRequestDebug(ctx); assertEquals(3, debugLines.size()); assertEquals("RESPONSE_OUTBOUND:: < STATUS: 200", debugLines.get(0)); assertEquals("RESPONSE_OUTBOUND:: < HDR: Content-Length:13", debugLines.get(1)); assertEquals("RESPONSE_OUTBOUND:: < HDR: lah:deda", debugLines.get(2)); }
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); }
dumpDebugInfo(Debug.getRequestDebug(zuulCtx)); dumpDebugInfo(Debug.getRoutingDebug(zuulCtx));
SessionContext context = request.getContext(); OriginManager<NettyOrigin> originManager = (OriginManager<NettyOrigin>) context.get(CommonContextKeys.ORIGIN_MANAGER); if (Debug.debugRequest(context)) { Debug.addRequestDebug(context, "RoutingLog: " + entry);
protected void recordFilterError(final I inMesg, final ZuulFilter<I, O> filter, final Throwable t) { // Add a log statement for this exception. final String errorMsg = "Filter Exception: filter=" + filter.filterName() + ", request-info=" + inMesg.getInfoForLogging() + ", msg=" + String.valueOf(t.getMessage()); if (t instanceof ZuulException && !((ZuulException) t).shouldLogAsError()) { LOG.warn(errorMsg); } else { LOG.error(errorMsg, t); } // Store this filter error for possible future use. But we still continue with next filter in the chain. final SessionContext zuulCtx = inMesg.getContext(); zuulCtx.getFilterErrors().add(new FilterError(filter.filterName(), filter.filterType().toString(), t)); if (zuulCtx.debugRouting()) { Debug.addRoutingDebug(zuulCtx, "Running Filter failed " + filter.filterName() + " type:" + filter.filterType() + " order:" + filter.filterOrder() + " " + t.getMessage()); } }
public static void addRequestDebugForMessage(SessionContext ctx, ZuulMessage message, String prefix) { for (Header header : message.getHeaders().entries()) { Debug.addRequestDebug(ctx, prefix + " " + header.getKey() + " " + header.getValue()); } if (message.hasBody()) { String bodyStr = message.getBodyAsText(); Debug.addRequestDebug(ctx, prefix + " " + bodyStr); } }