diff --git a/pom.xml b/pom.xml index d23e1b3a4..3408a9ac3 100644 --- a/pom.xml +++ b/pom.xml @@ -35,6 +35,7 @@ 1.8 2.9.0 2.0.22 + 1.1.13 30.1.1-jre 2.3.1 2.9.0 @@ -171,6 +172,11 @@ commons-csv ${commons-csv.version} + + org.coursera + dropwizard-metrics-datadog + ${dropwizard-metrics-datadog.version} + org.glassfish.jaxb jaxb-runtime diff --git a/service/pom.xml b/service/pom.xml index c8bf0a5d5..50facfaf6 100644 --- a/service/pom.xml +++ b/service/pom.xml @@ -226,7 +226,10 @@ io.micrometer micrometer-registry-datadog - + + org.coursera + dropwizard-metrics-datadog + com.fasterxml.jackson.core jackson-core diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/metrics/SignalDatadogReporterFactory.java b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/SignalDatadogReporterFactory.java new file mode 100644 index 000000000..0f4664102 --- /dev/null +++ b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/SignalDatadogReporterFactory.java @@ -0,0 +1,74 @@ +/* + * This is derived from Coursera's dropwizard datadog reporter. + * https://github.com/coursera/metrics-datadog + */ + +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 io.dropwizard.metrics.BaseReporterFactory; +import java.util.EnumSet; +import java.util.List; +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import org.coursera.metrics.datadog.DatadogReporter; +import org.coursera.metrics.datadog.DatadogReporter.Expansion; +import org.coursera.metrics.datadog.DefaultMetricNameFormatterFactory; +import org.coursera.metrics.datadog.DynamicTagsCallbackFactory; +import org.coursera.metrics.datadog.MetricNameFormatterFactory; +import org.coursera.metrics.datadog.transport.AbstractTransportFactory; +import org.whispersystems.textsecuregcm.util.HostnameUtil; + +@JsonTypeName("signal-datadog") +public class SignalDatadogReporterFactory extends BaseReporterFactory { + + @JsonProperty + private List tags = null; + + @Valid + @JsonProperty + private DynamicTagsCallbackFactory dynamicTagsCallback = null; + + @JsonProperty + private String prefix = null; + + @Valid + @NotNull + @JsonProperty + private MetricNameFormatterFactory metricNameFormatter = new DefaultMetricNameFormatterFactory(); + + @Valid + @NotNull + @JsonProperty + private AbstractTransportFactory transport = null; + + private static final EnumSet EXPANSIONS = EnumSet.of( + Expansion.COUNT, + Expansion.MIN, + Expansion.MAX, + Expansion.MEAN, + Expansion.MEDIAN, + Expansion.P75, + Expansion.P95, + Expansion.P99, + Expansion.P999 + ); + + public ScheduledReporter build(MetricRegistry registry) { + return DatadogReporter.forRegistry(registry) + .withTransport(transport.build()) + .withHost(HostnameUtil.getLocalHostname()) + .withTags(tags) + .withPrefix(prefix) + .withExpansions(EXPANSIONS) + .withMetricNameFormatter(metricNameFormatter.build()) + .withDynamicTagCallback(dynamicTagsCallback != null ? dynamicTagsCallback.build() : null) + .filter(getFilter()) + .convertDurationsTo(getDurationUnit()) + .convertRatesTo(getRateUnit()) + .build(); + } +} diff --git a/service/src/main/resources/META-INF/services/io.dropwizard.metrics.ReporterFactory b/service/src/main/resources/META-INF/services/io.dropwizard.metrics.ReporterFactory index 3b2cb3003..be127b6fd 100644 --- a/service/src/main/resources/META-INF/services/io.dropwizard.metrics.ReporterFactory +++ b/service/src/main/resources/META-INF/services/io.dropwizard.metrics.ReporterFactory @@ -1 +1,2 @@ org.whispersystems.textsecuregcm.metrics.JsonMetricsReporterFactory +org.whispersystems.textsecuregcm.metrics.SignalDatadogReporterFactory