/** * Copyright (c) 2009-2011 VMware, Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.springsource.insight.plugin.springcloud.hystrix; import com.springsource.insight.intercept.operation.Operation; import com.springsource.insight.intercept.operation.OperationList; import com.springsource.insight.intercept.operation.OperationType; import com.springsource.insight.intercept.trace.AbstractTraceErrorAnalyzer; import com.springsource.insight.intercept.trace.Frame; import com.springsource.insight.intercept.trace.TraceError; import com.springsource.insight.plugin.springcloud.SpringCloudPluginRuntimeDescriptor; import org.apache.commons.lang.StringUtils; public class HystrixCommandErrorAnalyzer extends AbstractTraceErrorAnalyzer { protected HystrixCommandErrorAnalyzer(OperationType opType) { super(opType); } private static final HystrixCommandErrorAnalyzer INSTANCE = new HystrixCommandErrorAnalyzer(); private HystrixCommandErrorAnalyzer() { super(SpringCloudPluginRuntimeDescriptor.HYSTRIX_COMMAND); } public static final HystrixCommandErrorAnalyzer getInstance() { return INSTANCE; } @Override public TraceError locateFrameError(Frame frame) { Operation operation = frame.getOperation(); if (operation != null && operation.getType() == SpringCloudPluginRuntimeDescriptor.HYSTRIX_COMMAND) { String events = operation.get("events", String.class); if (!StringUtils.isEmpty(events)) { String[] eventArr = events.split(","); for(int i = 0; i < eventArr.length; i++) { String event = eventArr[i]; if (isErrorEvent(event.trim())) { return new TraceError("HystrixCommand failed: " + event); } } } } return null; } private boolean isErrorEvent(String event) { if ("TIMEOUT".equals(event)) return true; if ("FAILURE".equals(event)) return true; if ("SHORT_CIRCUITED".equals(event)) return true; if ("THREAD_POOL_REJECTED".equals(event)) return true; if ("SEMAPHORE_REJECTED".equals(event)) return true; if ("FALLBACK_FAILURE".equals(event)) return true; if ("FALLBACK_REJECTION".equals(event)) return true; if ("EXCEPTION_THROWN".equals(event)) return true; if ("BAD_REQUEST".equals(event)) return true; return false; } }