public ZuulFilterChainRunner(ZuulFilter<T, T>[] zuulFilters, FilterUsageNotifier usageNotifier, FilterRunner<T, ?> nextStage) { super(zuulFilters[0].filterType(), usageNotifier, nextStage); this.filters = zuulFilters; }
void putFilter(String sName, ZuulFilter filter, long lastModified) { List<ZuulFilter> list = hashFiltersByType.get(filter.filterType()); if (list != null) { hashFiltersByType.remove(filter.filterType()); //rebuild this list } String nameAndType = filter.filterType() + ":" + filter.filterName(); filtersByNameAndType.put(nameAndType, filter); filterRegistry.put(sName, filter); filterClassLastModified.put(sName, lastModified); }
public <T extends ZuulMessage> ZuulFilter<T, T> [] getFilters(final ZuulFilter start, final ZuulFilter stop) { final List<ZuulFilter> zuulFilters = filterLoader.getFiltersByType(start.filterType()); final ZuulFilter[] filters = new ZuulFilter[zuulFilters.size() + 2]; filters[0] = start; for (int i=1, j=0; i < filters.length && j < zuulFilters.size(); i++,j++) { filters[i] = zuulFilters.get(j); } filters[filters.length -1] = stop; return filters; }
public ZuulFilterChainRunner(ZuulFilter<T, T>[] zuulFilters, FilterUsageNotifier usageNotifier, FilterRunner<T, ?> nextStage) { super(zuulFilters[0].filterType(), usageNotifier, nextStage); this.filters = zuulFilters; }
@Override public void notify(ZuulFilter filter, ExecutionStatus status) { DynamicCounter.increment(METRIC_PREFIX + filter.getClass().getSimpleName(), "status", status.name(), "filtertype", filter.filterType().toString()); } }
/** * Returns a list of filters by the filterType specified * * @param filterType * @return a List<ZuulFilter> */ public List<ZuulFilter> getFiltersByType(FilterType filterType) { List<ZuulFilter> list = hashFiltersByType.get(filterType); if (list != null) return list; list = new ArrayList<ZuulFilter>(); Collection<ZuulFilter> filters = filterRegistry.getAllFilters(); for (Iterator<ZuulFilter> iterator = filters.iterator(); iterator.hasNext(); ) { ZuulFilter filter = iterator.next(); if (filter.filterType().equals(filterType)) { list.add(filter); } } // Sort by filterOrder. Collections.sort(list, new Comparator<ZuulFilter>() { @Override public int compare(ZuulFilter o1, ZuulFilter o2) { return o1.filterOrder() - o2.filterOrder(); } }); hashFiltersByType.putIfAbsent(filterType, list); return list; }
void putFilter(String sName, ZuulFilter filter, long lastModified) { List<ZuulFilter> list = hashFiltersByType.get(filter.filterType()); if (list != null) { hashFiltersByType.remove(filter.filterType()); //rebuild this list } String nameAndType = filter.filterType() + ":" + filter.filterName(); filtersByNameAndType.put(nameAndType, filter); filterRegistry.put(sName, filter); filterClassLastModified.put(sName, lastModified); }
public <T extends ZuulMessage> ZuulFilter<T, T> [] getFilters(final ZuulFilter start, final ZuulFilter stop) { final List<ZuulFilter> zuulFilters = filterLoader.getFiltersByType(start.filterType()); final ZuulFilter[] filters = new ZuulFilter[zuulFilters.size() + 2]; filters[0] = start; for (int i=1, j=0; i < filters.length && j < zuulFilters.size(); i++,j++) { filters[i] = zuulFilters.get(j); } filters[filters.length -1] = stop; return filters; }
@Test public void testGetFiltersByType() throws Exception { assertTrue(loader.putFilter(file)); verify(registry).put(any(String.class), any(ZuulFilter.class)); final List<ZuulFilter> filters = new ArrayList<ZuulFilter>(); filters.add(filter); when(registry.getAllFilters()).thenReturn(filters); List<ZuulFilter> list = loader.getFiltersByType(FilterType.INBOUND); assertTrue(list != null); assertTrue(list.size() == 1); ZuulFilter filter = list.get(0); assertTrue(filter != null); assertTrue(filter.filterType().equals(FilterType.INBOUND)); }
@Override public void notify(ZuulFilter filter, ExecutionStatus status) { DynamicCounter.increment(METRIC_PREFIX + filter.getClass().getSimpleName(), "status", status.name(), "filtertype", filter.filterType().toString()); } }
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()); } }
/** * Returns a list of filters by the filterType specified * * @param filterType * @return a List<ZuulFilter> */ public List<ZuulFilter> getFiltersByType(FilterType filterType) { List<ZuulFilter> list = hashFiltersByType.get(filterType); if (list != null) return list; list = new ArrayList<ZuulFilter>(); Collection<ZuulFilter> filters = filterRegistry.getAllFilters(); for (Iterator<ZuulFilter> iterator = filters.iterator(); iterator.hasNext(); ) { ZuulFilter filter = iterator.next(); if (filter.filterType().equals(filterType)) { list.add(filter); } } // Sort by filterOrder. Collections.sort(list, new Comparator<ZuulFilter>() { @Override public int compare(ZuulFilter o1, ZuulFilter o2) { return o1.filterOrder() - o2.filterOrder(); } }); hashFiltersByType.putIfAbsent(filterType, list); return list; }
protected O handleFilterException(final I inMesg, final ZuulFilter<I, O> filter, final Throwable ex) { inMesg.getContext().setError(ex); if (filter.filterType() == ENDPOINT) { inMesg.getContext().setShouldSendErrorResponse(true); } recordFilterError(inMesg, filter, ex); return filter.getDefaultOutput(inMesg); }
protected final boolean shouldSkipFilter(final I inMesg, final ZuulFilter<I, O> filter) { if (filter.filterType() == ENDPOINT) { //Endpoints may not be skipped return false; } final SessionContext zuulCtx = inMesg.getContext(); if (!filter.shouldFilter(inMesg)) { return true; } if ((zuulCtx.shouldStopFilterProcessing()) && (!filter.overrideStopFilterProcessing())) { return true; } if (zuulCtx.isCancelled()) { return true; } return false; }
@Test public void testGetFiltersByType() throws Exception { assertTrue(loader.putFilter(file)); verify(registry).put(any(String.class), any(ZuulFilter.class)); final List<ZuulFilter> filters = new ArrayList<ZuulFilter>(); filters.add(filter); when(registry.getAllFilters()).thenReturn(filters); List<ZuulFilter> list = loader.getFiltersByType(FilterType.INBOUND); assertTrue(list != null); assertTrue(list.size() == 1); ZuulFilter filter = list.get(0); assertTrue(filter != null); assertTrue(filter.filterType().equals(FilterType.INBOUND)); }
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()); } }
protected O handleFilterException(final I inMesg, final ZuulFilter<I, O> filter, final Throwable ex) { inMesg.getContext().setError(ex); if (filter.filterType() == ENDPOINT) { inMesg.getContext().setShouldSendErrorResponse(true); } recordFilterError(inMesg, filter, ex); return filter.getDefaultOutput(inMesg); }
protected final boolean shouldSkipFilter(final I inMesg, final ZuulFilter<I, O> filter) { if (filter.filterType() == ENDPOINT) { //Endpoints may not be skipped return false; } final SessionContext zuulCtx = inMesg.getContext(); if (!filter.shouldFilter(inMesg)) { return true; } if ((zuulCtx.shouldStopFilterProcessing()) && (!filter.overrideStopFilterProcessing())) { return true; } if (zuulCtx.isCancelled()) { return true; } return false; }
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); }
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); }