package mireka.transmission.queue;
import java.lang.management.ManagementFactory;
import java.util.concurrent.TimeUnit;
import javax.annotation.PostConstruct;
import javax.management.JMException;
import javax.management.ObjectName;
import mireka.transmission.queuing.QueuingTransmitter;
import com.yammer.metrics.Metrics;
import com.yammer.metrics.core.Meter;
import com.yammer.metrics.core.MetricName;
/**
* TransmitterSummary holds and publishes statistics data about the mail
* transactions of a {@link QueuingTransmitter}.
*/
public class TransmitterSummary implements TransmitterSummaryMBean {
private String name;
private Meter mailTransactions;
private Meter successfulMailTransactions;
private Meter failures;
private Meter permanentFailures;
private Meter transientFailures;
private Meter partialFailures;
public volatile String lastFailure;
/**
* Meter which counts unexpected Java exceptions occurred during mail
* transmission that were not handled by sending an SMTP error reply and
* that are not expected, usual connection problems.
*/
private Meter errors;
public volatile String lastError;
@PostConstruct
public void register() {
try {
ObjectName objectName =
new ObjectName("mireka:type=TransmitterTraffic,name="
+ name);
ManagementFactory.getPlatformMBeanServer().registerMBean(this,
objectName);
} catch (JMException e) {
throw new RuntimeException(e);
}
mailTransactions =
Metrics.newMeter(metricName("mailTransactions"),
"transactions", TimeUnit.MINUTES);
successfulMailTransactions =
Metrics.newMeter(metricName("successfulMailTransactions"),
"transactions", TimeUnit.MINUTES);
failures =
Metrics.newMeter(metricName("failures"), "transactions",
TimeUnit.MINUTES);
permanentFailures =
Metrics.newMeter(metricName("permanentFailures"),
"transactions", TimeUnit.MINUTES);
transientFailures =
Metrics.newMeter(metricName("transientFailures"),
"transactions", TimeUnit.MINUTES);
partialFailures =
Metrics.newMeter(metricName("partialFailures"), "transactions",
TimeUnit.MINUTES);
errors =
Metrics.newMeter(metricName("errors"), "transactions",
TimeUnit.MINUTES);
}
private MetricName metricName(String name) {
return new MetricName("mireka", "TransmitterTraffic", name, this.name);
}
/**
* @x.category GETSET
*/
public void setName(String name) {
this.name = name;
}
@Override
public double getFailuresPercentage() {
double total = mailTransactions.fifteenMinuteRate();
if (total == 0)
return 0;
return Math.round(1000.0 * failures.fifteenMinuteRate() / total) / 10;
}
@Override
public double getPermanentFailuresPercentage() {
double total = mailTransactions.fifteenMinuteRate();
if (total == 0)
return 0;
return Math.round(1000.0 * permanentFailures.fifteenMinuteRate()
/ total) / 10;
}
@Override
public double getTransientFailuresPercentage() {
double total = mailTransactions.fifteenMinuteRate();
if (total == 0)
return 0;
return Math.round(1000.0 * transientFailures.fifteenMinuteRate()
/ total) / 10;
}
@Override
public String getLastFailure() {
return lastFailure;
}
@Override
public String getLastError() {
return lastError;
}
public Meter mailTransactionsMeter() {
return mailTransactions;
}
public Meter successfulMailTransactionsMeter() {
return successfulMailTransactions;
}
public Meter failuresMeter() {
return failures;
}
public Meter permanentFailuresMeter() {
return permanentFailures;
}
public Meter transientFailuresMeter() {
return transientFailures;
}
public Meter partialFailuresMeter() {
return partialFailures;
}
public Meter errorsMeter() {
return errors;
}
}