/* Status.java
*
* Copyright 2009-2012 Comcast Interactive Media, LLC.
*
* 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 org.fishwife.jrugged;
/**
* Various components in the system need to report their status. This <code>enum</code>
* standardizes on a set of conventions for reporting this. Each {@link Status} has an
* integer <code>value</code> which can be compared; higher values represent higher levels
* of functionality. In addition, each {@link Status} has a {@link String}
* <code>signal</code> which is either GREEN, YELLOW, or RED.
* <p>
* The general notion is that the whole system (or a subsystem) should only report GREEN
* status (UP) if everything is working as designed. When subsystems start to go down, or
* the current system stops working, status should drop to either YELLOW (DEGRADED) or RED
* (DOWN), depending on whether service was still available in some form. For example, if
* a cache subsystem goes down, we might report a YELLOW status because we can attempt to
* serve without a cache. However, if a required database goes down, we probably need to
* report a RED status, unable to serve requests.
* <p>
* A "rugged" system should be able to accurately (and responsively) report on its status
* even if it is unable to perform its main functions. This will assist operators in
* diagnosing the problem; a hung process tells no tales.
*/
public enum Status {
/** Unrecoverable: we're basically dead for good. */
FAILED(-2, "RED"),
/** Being initialized: not yet ready to serve. */
INIT(-1, "RED"),
/** Currently unavailable. */
DOWN(0, "RED"),
/** Something's wrong, but we can still serve requests. */
DEGRADED(1, "YELLOW"),
/** Everything is operating as expected. */
UP(2, "GREEN"),
/**
* This status was introduced in a prior version of JRugged and so is retained for
* backwards compatibility, but is specific to
* {@link org.fishwife.jrugged.CircuitBreaker} states and should not be used.
*/
@Deprecated BYPASS(3, "GREEN");
private final int value;
private final String signal;
Status(final int value, final String signal) {
this.value = value;
this.signal = signal;
}
/**
* Returns the current status as an integer. Higher values are for states of higher
* functionality/availability.
*/
public int getValue() {
return value;
}
/**
* Returns the current GREEN/YELLOW/RED dashboard indicator corresponding to this
* status.
*/
public String getSignal() {
return signal;
}
/**
* Returns whether the status indicates a system that is able to serve requests.
*/
public boolean isAvailable() {
return value > 0;
}
}