/**
* Copyright 2012 Netflix, Inc.
*
* 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.netflix.hystrix;
import com.netflix.hystrix.util.HystrixRollingNumberEvent;
import java.util.ArrayList;
import java.util.List;
/**
* Various states/events that execution can result in or have tracked.
* <p>
* These are most often accessed via {@link HystrixRequestLog} or {@link HystrixCommand#getExecutionEvents()}.
*/
public enum HystrixEventType {
EMIT(false),
SUCCESS(true),
FAILURE(false),
TIMEOUT(false),
BAD_REQUEST(true),
SHORT_CIRCUITED(false),
THREAD_POOL_REJECTED(false),
SEMAPHORE_REJECTED(false),
FALLBACK_EMIT(false),
FALLBACK_SUCCESS(true),
FALLBACK_FAILURE(true),
FALLBACK_REJECTION(true),
FALLBACK_MISSING(true),
EXCEPTION_THROWN(false),
RESPONSE_FROM_CACHE(true),
CANCELLED(true),
COLLAPSED(false),
COMMAND_MAX_ACTIVE(false);
private final boolean isTerminal;
HystrixEventType(boolean isTerminal) {
this.isTerminal = isTerminal;
}
public boolean isTerminal() {
return isTerminal;
}
public static HystrixEventType from(HystrixRollingNumberEvent event) {
switch (event) {
case EMIT: return EMIT;
case SUCCESS: return SUCCESS;
case FAILURE: return FAILURE;
case TIMEOUT: return TIMEOUT;
case SHORT_CIRCUITED: return SHORT_CIRCUITED;
case THREAD_POOL_REJECTED: return THREAD_POOL_REJECTED;
case SEMAPHORE_REJECTED: return SEMAPHORE_REJECTED;
case FALLBACK_EMIT: return FALLBACK_EMIT;
case FALLBACK_SUCCESS: return FALLBACK_SUCCESS;
case FALLBACK_FAILURE: return FALLBACK_FAILURE;
case FALLBACK_REJECTION: return FALLBACK_REJECTION;
case FALLBACK_MISSING: return FALLBACK_MISSING;
case EXCEPTION_THROWN: return EXCEPTION_THROWN;
case RESPONSE_FROM_CACHE: return RESPONSE_FROM_CACHE;
case COLLAPSED: return COLLAPSED;
case BAD_REQUEST: return BAD_REQUEST;
case COMMAND_MAX_ACTIVE: return COMMAND_MAX_ACTIVE;
default:
throw new RuntimeException("Not an event that can be converted to HystrixEventType : " + event);
}
}
/**
* List of events that throw an Exception to the caller
*/
public final static List<HystrixEventType> EXCEPTION_PRODUCING_EVENT_TYPES = new ArrayList<HystrixEventType>();
/**
* List of events that are terminal
*/
public final static List<HystrixEventType> TERMINAL_EVENT_TYPES = new ArrayList<HystrixEventType>();
static {
EXCEPTION_PRODUCING_EVENT_TYPES.add(BAD_REQUEST);
EXCEPTION_PRODUCING_EVENT_TYPES.add(FALLBACK_FAILURE);
EXCEPTION_PRODUCING_EVENT_TYPES.add(FALLBACK_MISSING);
EXCEPTION_PRODUCING_EVENT_TYPES.add(FALLBACK_REJECTION);
for (HystrixEventType eventType: HystrixEventType.values()) {
if (eventType.isTerminal()) {
TERMINAL_EVENT_TYPES.add(eventType);
}
}
}
public enum ThreadPool {
EXECUTED, REJECTED;
public static ThreadPool from(HystrixRollingNumberEvent event) {
switch (event) {
case THREAD_EXECUTION: return EXECUTED;
case THREAD_POOL_REJECTED: return REJECTED;
default:
throw new RuntimeException("Not an event that can be converted to HystrixEventType.ThreadPool : " + event);
}
}
public static ThreadPool from(HystrixEventType eventType) {
switch (eventType) {
case SUCCESS: return EXECUTED;
case FAILURE: return EXECUTED;
case TIMEOUT: return EXECUTED;
case BAD_REQUEST: return EXECUTED;
case THREAD_POOL_REJECTED: return REJECTED;
default: return null;
}
}
}
public enum Collapser {
BATCH_EXECUTED, ADDED_TO_BATCH, RESPONSE_FROM_CACHE;
public static Collapser from(HystrixRollingNumberEvent event) {
switch (event) {
case COLLAPSER_BATCH: return BATCH_EXECUTED;
case COLLAPSER_REQUEST_BATCHED: return ADDED_TO_BATCH;
case RESPONSE_FROM_CACHE: return RESPONSE_FROM_CACHE;
default:
throw new RuntimeException("Not an event that can be converted to HystrixEventType.Collapser : " + event);
}
}
}
}