package org.stagemonitor.alerting.alerter;
import org.stagemonitor.alerting.incident.Incident;
import org.stagemonitor.core.StagemonitorSPI;
import org.stagemonitor.configuration.ConfigurationRegistry;
/**
* An alerter reports incidents to some channel like email.
* <p/>
* To add a custom {@link Alerter}, just implement the abstract class and add the full qualified class name to
* src/main/resources/META-INF/services/org.stagemonitor.alerting.alerter.Alerter.
* The content of the file has to be the canonical class name of the alerter.
*/
public abstract class Alerter implements StagemonitorSPI {
public void init(InitArguments initArguments) {
}
/**
* Triggers an alert
*
* @param alertArguments
*/
public abstract void alert(AlertArguments alertArguments);
/**
* A unique name for this alerter e.g. email or irc.
*
* @return the unique alerter name
*/
public abstract String getAlerterType();
/**
* An alerter is available if all required configuration options for the particular Alerter are set.
*
* @return <code>true</code>, if the alerter is available, <code>false</code> otherwise
*/
public boolean isAvailable() {
return true;
}
/**
* The label of the target parameter that is used in {@link Subscription#target}
* <p/>
* For example "Email address" for the Email alerter. Returning <code>null</code> means that
* this alerter does not have a target parameter.
*
* @return The label of the target parameter that is used in {@link Subscription#target}
*/
public abstract String getTargetLabel();
public static class InitArguments {
private final ConfigurationRegistry configuration;
InitArguments(ConfigurationRegistry configuration) {
this.configuration = configuration;
}
public ConfigurationRegistry getConfiguration() {
return configuration;
}
}
public static class AlertArguments {
private final Incident incident;
private final Subscription subscription;
/**
* @param incident the incident to report
* @param subscription the corresponding subscription
*/
public AlertArguments(Incident incident, Subscription subscription) {
this.incident = incident;
this.subscription = subscription;
}
public Incident getIncident() {
return incident;
}
public Subscription getSubscription() {
return subscription;
}
}
}