Move JSON reporter to Dropwizard ReporterFactory structure.
This commit is contained in:
parent
8441fa9687
commit
dafda85c36
|
@ -17,16 +17,15 @@
|
||||||
package org.whispersystems.textsecuregcm;
|
package org.whispersystems.textsecuregcm;
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import org.whispersystems.textsecuregcm.configuration.DirectoryConfiguration;
|
||||||
import org.whispersystems.textsecuregcm.configuration.FederationConfiguration;
|
import org.whispersystems.textsecuregcm.configuration.FederationConfiguration;
|
||||||
import org.whispersystems.textsecuregcm.configuration.GraphiteConfiguration;
|
import org.whispersystems.textsecuregcm.configuration.GraphiteConfiguration;
|
||||||
import org.whispersystems.textsecuregcm.configuration.MemcacheConfiguration;
|
import org.whispersystems.textsecuregcm.configuration.MemcacheConfiguration;
|
||||||
import org.whispersystems.textsecuregcm.configuration.MessageStoreConfiguration;
|
import org.whispersystems.textsecuregcm.configuration.MessageStoreConfiguration;
|
||||||
import org.whispersystems.textsecuregcm.configuration.MetricsConfiguration;
|
|
||||||
import org.whispersystems.textsecuregcm.configuration.NexmoConfiguration;
|
import org.whispersystems.textsecuregcm.configuration.NexmoConfiguration;
|
||||||
import org.whispersystems.textsecuregcm.configuration.PushConfiguration;
|
import org.whispersystems.textsecuregcm.configuration.PushConfiguration;
|
||||||
import org.whispersystems.textsecuregcm.configuration.RateLimitsConfiguration;
|
import org.whispersystems.textsecuregcm.configuration.RateLimitsConfiguration;
|
||||||
import org.whispersystems.textsecuregcm.configuration.RedPhoneConfiguration;
|
import org.whispersystems.textsecuregcm.configuration.RedPhoneConfiguration;
|
||||||
import org.whispersystems.textsecuregcm.configuration.DirectoryConfiguration;
|
|
||||||
import org.whispersystems.textsecuregcm.configuration.S3Configuration;
|
import org.whispersystems.textsecuregcm.configuration.S3Configuration;
|
||||||
import org.whispersystems.textsecuregcm.configuration.TwilioConfiguration;
|
import org.whispersystems.textsecuregcm.configuration.TwilioConfiguration;
|
||||||
import org.whispersystems.textsecuregcm.configuration.WebsocketConfiguration;
|
import org.whispersystems.textsecuregcm.configuration.WebsocketConfiguration;
|
||||||
|
@ -91,10 +90,6 @@ public class WhisperServerConfiguration extends Configuration {
|
||||||
@JsonProperty
|
@JsonProperty
|
||||||
private GraphiteConfiguration graphite = new GraphiteConfiguration();
|
private GraphiteConfiguration graphite = new GraphiteConfiguration();
|
||||||
|
|
||||||
@Valid
|
|
||||||
@JsonProperty
|
|
||||||
private MetricsConfiguration viz = new MetricsConfiguration();
|
|
||||||
|
|
||||||
@Valid
|
@Valid
|
||||||
@JsonProperty
|
@JsonProperty
|
||||||
private WebsocketConfiguration websocket = new WebsocketConfiguration();
|
private WebsocketConfiguration websocket = new WebsocketConfiguration();
|
||||||
|
@ -160,10 +155,6 @@ public class WhisperServerConfiguration extends Configuration {
|
||||||
return graphite;
|
return graphite;
|
||||||
}
|
}
|
||||||
|
|
||||||
public MetricsConfiguration getMetricsConfiguration() {
|
|
||||||
return viz;
|
|
||||||
}
|
|
||||||
|
|
||||||
public RedPhoneConfiguration getRedphoneConfiguration() {
|
public RedPhoneConfiguration getRedphoneConfiguration() {
|
||||||
return redphone;
|
return redphone;
|
||||||
}
|
}
|
||||||
|
|
|
@ -229,13 +229,6 @@ public class WhisperServerService extends Application<WhisperServerConfiguration
|
||||||
GraphiteReporter graphiteReporter = (GraphiteReporter) graphiteReporterFactory.build(environment.metrics());
|
GraphiteReporter graphiteReporter = (GraphiteReporter) graphiteReporterFactory.build(environment.metrics());
|
||||||
graphiteReporter.start(15, TimeUnit.SECONDS);
|
graphiteReporter.start(15, TimeUnit.SECONDS);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config.getMetricsConfiguration().isEnabled()) {
|
|
||||||
new JsonMetricsReporter(environment.metrics(),
|
|
||||||
config.getMetricsConfiguration().getToken(),
|
|
||||||
config.getMetricsConfiguration().getHost())
|
|
||||||
.start(60, TimeUnit.SECONDS);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Optional<NexmoSmsSender> initializeNexmoSmsSender(NexmoConfiguration configuration) {
|
private Optional<NexmoSmsSender> initializeNexmoSmsSender(NexmoConfiguration configuration) {
|
||||||
|
|
|
@ -1,27 +0,0 @@
|
||||||
package org.whispersystems.textsecuregcm.configuration;
|
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
|
||||||
|
|
||||||
public class MetricsConfiguration {
|
|
||||||
|
|
||||||
@JsonProperty
|
|
||||||
private String token;
|
|
||||||
|
|
||||||
@JsonProperty
|
|
||||||
private String host;
|
|
||||||
|
|
||||||
@JsonProperty
|
|
||||||
private boolean enabled = false;
|
|
||||||
|
|
||||||
public String getHost() {
|
|
||||||
return host;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getToken() {
|
|
||||||
return token;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isEnabled() {
|
|
||||||
return enabled && token != null && host != null;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -27,25 +27,25 @@ import java.util.SortedMap;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
/**
|
|
||||||
* Adapted from MetricsServlet.
|
|
||||||
*/
|
|
||||||
public class JsonMetricsReporter extends ScheduledReporter {
|
public class JsonMetricsReporter extends ScheduledReporter {
|
||||||
|
|
||||||
private final Logger logger = LoggerFactory.getLogger(JsonMetricsReporter.class);
|
private static final Pattern SIMPLE_NAMES = Pattern.compile("[^a-zA-Z0-9_.\\-~]");
|
||||||
|
|
||||||
|
private final Logger logger = LoggerFactory.getLogger(JsonMetricsReporter.class);
|
||||||
private final JsonFactory factory = new JsonFactory();
|
private final JsonFactory factory = new JsonFactory();
|
||||||
|
|
||||||
private final String table;
|
private final String token;
|
||||||
private final String sunnylabsHost;
|
private final String hostname;
|
||||||
private final String host;
|
private final String host;
|
||||||
|
|
||||||
public JsonMetricsReporter(MetricRegistry registry, String token, String sunnylabsHost)
|
public JsonMetricsReporter(MetricRegistry registry, String token, String hostname,
|
||||||
|
MetricFilter filter, TimeUnit rateUnit, TimeUnit durationUnit)
|
||||||
throws UnknownHostException
|
throws UnknownHostException
|
||||||
{
|
{
|
||||||
super(registry, "jsonmetrics-reporter", MetricFilter.ALL, TimeUnit.SECONDS, TimeUnit.MILLISECONDS);
|
super(registry, "json-reporter", filter, rateUnit, durationUnit);
|
||||||
this.table = token;
|
this.token = token;
|
||||||
this.sunnylabsHost = sunnylabsHost;
|
this.hostname = hostname;
|
||||||
this.host = InetAddress.getLocalHost().getHostName();
|
this.host = InetAddress.getLocalHost().getHostName();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -57,7 +57,7 @@ public class JsonMetricsReporter extends ScheduledReporter {
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
logger.debug("Reporting metrics...");
|
logger.debug("Reporting metrics...");
|
||||||
URL url = new URL("https", sunnylabsHost, 443, "/report/metrics?t=" + table + "&h=" + host);
|
URL url = new URL("https", hostname, 443, String.format("/report/metrics?t=%s&h=%s", token, host));
|
||||||
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
||||||
|
|
||||||
connection.setDoOutput(true);
|
connection.setDoOutput(true);
|
||||||
|
@ -175,10 +175,66 @@ public class JsonMetricsReporter extends ScheduledReporter {
|
||||||
json.writeNumberField("m15", convertRate(meter.getFifteenMinuteRate()));
|
json.writeNumberField("m15", convertRate(meter.getFifteenMinuteRate()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final Pattern SIMPLE_NAMES = Pattern.compile("[^a-zA-Z0-9_.\\-~]");
|
|
||||||
|
|
||||||
private String sanitize(String metricName) {
|
private String sanitize(String metricName) {
|
||||||
return SIMPLE_NAMES.matcher(metricName).replaceAll("_");
|
return SIMPLE_NAMES.matcher(metricName).replaceAll("_");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Builder forRegistry(MetricRegistry registry) {
|
||||||
|
return new Builder(registry);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Builder {
|
||||||
|
|
||||||
|
private final MetricRegistry registry;
|
||||||
|
private MetricFilter filter = MetricFilter.ALL;
|
||||||
|
private TimeUnit rateUnit = TimeUnit.SECONDS;
|
||||||
|
private TimeUnit durationUnit = TimeUnit.MILLISECONDS;
|
||||||
|
private String token;
|
||||||
|
private String hostname;
|
||||||
|
|
||||||
|
private Builder(MetricRegistry registry) {
|
||||||
|
this.registry = registry;
|
||||||
|
this.rateUnit = TimeUnit.SECONDS;
|
||||||
|
this.durationUnit = TimeUnit.MILLISECONDS;
|
||||||
|
this.filter = MetricFilter.ALL;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder convertRatesTo(TimeUnit rateUnit) {
|
||||||
|
this.rateUnit = rateUnit;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder convertDurationsTo(TimeUnit durationUnit) {
|
||||||
|
this.durationUnit = durationUnit;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder filter(MetricFilter filter) {
|
||||||
|
this.filter = filter;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder withToken(String token) {
|
||||||
|
this.token = token;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder withHostname(String hostname) {
|
||||||
|
this.hostname = hostname;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public JsonMetricsReporter build() throws UnknownHostException {
|
||||||
|
if (hostname == null) {
|
||||||
|
throw new IllegalArgumentException("No hostname specified!");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (token == null) {
|
||||||
|
throw new IllegalArgumentException("No token specified!");
|
||||||
|
}
|
||||||
|
|
||||||
|
return new JsonMetricsReporter(registry, token, hostname, filter, rateUnit, durationUnit);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
package org.whispersystems.textsecuregcm.metrics;
|
||||||
|
|
||||||
|
import com.codahale.metrics.MetricRegistry;
|
||||||
|
import com.codahale.metrics.ScheduledReporter;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonTypeName;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
import java.net.UnknownHostException;
|
||||||
|
|
||||||
|
import io.dropwizard.metrics.BaseReporterFactory;
|
||||||
|
|
||||||
|
@JsonTypeName("json")
|
||||||
|
public class JsonMetricsReporterFactory extends BaseReporterFactory {
|
||||||
|
|
||||||
|
@JsonProperty
|
||||||
|
@NotNull
|
||||||
|
private String hostname;
|
||||||
|
|
||||||
|
@JsonProperty
|
||||||
|
@NotNull
|
||||||
|
private String token;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ScheduledReporter build(MetricRegistry metricRegistry) {
|
||||||
|
try {
|
||||||
|
return JsonMetricsReporter.forRegistry(metricRegistry)
|
||||||
|
.withHostname(hostname)
|
||||||
|
.withToken(token)
|
||||||
|
.convertRatesTo(getRateUnit())
|
||||||
|
.convertDurationsTo(getDurationUnit())
|
||||||
|
.filter(getFilter())
|
||||||
|
.build();
|
||||||
|
} catch (UnknownHostException e) {
|
||||||
|
throw new IllegalArgumentException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
org.whispersystems.textsecuregcm.metrics.JsonMetricsReporterFactory
|
Loading…
Reference in New Issue