package io.dropwizard.metrics.graphite;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.ScheduledReporter;
import com.codahale.metrics.graphite.Graphite;
import com.codahale.metrics.graphite.GraphiteReporter;
import com.codahale.metrics.graphite.GraphiteUDP;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeName;
import com.google.common.annotations.VisibleForTesting;
import io.dropwizard.metrics.BaseReporterFactory;
import io.dropwizard.validation.OneOf;
import io.dropwizard.validation.PortRange;
import org.hibernate.validator.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
/**
* A factory for {@link GraphiteReporter} instances.
* <p/>
* <b>Configuration Parameters:</b>
* <table>
* <tr>
* <td>Name</td>
* <td>Default</td>
* <td>Description</td>
* </tr>
* <tr>
* <td>host</td>
* <td>localhost</td>
* <td>The hostname of the Graphite server to report to.</td>
* </tr>
* <tr>
* <td>port</td>
* <td>2003</td>
* <td>The port of the Graphite server to report to.</td>
* </tr>
* <tr>
* <td>prefix</td>
* <td><i>None</i></td>
* <td>The prefix for Metric key names to report to Graphite.</td>
* </tr>
* <tr>
* <td>transport</td>
* <td><i>tcp</i></td>
* <td>The transport used to report to Graphite. One of {@code tcp} or
* {@code udp}.</td>
* </tr>
* </table>
*/
@JsonTypeName("graphite")
public class GraphiteReporterFactory extends BaseReporterFactory {
@NotEmpty
private String host = "localhost";
@PortRange
private int port = 2003;
@NotNull
private String prefix = "";
@NotNull
@OneOf(value = {"tcp", "udp"}, ignoreCase = true)
private String transport = "tcp";
@JsonProperty
public String getHost() {
return host;
}
@JsonProperty
public void setHost(String host) {
this.host = host;
}
@JsonProperty
public int getPort() {
return port;
}
@JsonProperty
public void setPort(int port) {
this.port = port;
}
@JsonProperty
public String getPrefix() {
return prefix;
}
@JsonProperty
public void setPrefix(String prefix) {
this.prefix = prefix;
}
@JsonProperty
public String getTransport() {
return transport;
}
@JsonProperty
public void setTransport(String transport) {
this.transport = transport;
}
@Override
public ScheduledReporter build(MetricRegistry registry) {
GraphiteReporter.Builder builder = builder(registry);
if ("udp".equalsIgnoreCase(transport)) {
return builder.build(new GraphiteUDP(host, port));
} else {
return builder.build(new Graphite(host, port));
}
}
@VisibleForTesting
protected GraphiteReporter.Builder builder(MetricRegistry registry) {
return GraphiteReporter.forRegistry(registry)
.convertDurationsTo(getDurationUnit())
.convertRatesTo(getRateUnit())
.filter(getFilter())
.prefixedWith(getPrefix())
.disabledMetricAttributes(getDisabledAttributes());
}
}