diff --git a/pom.xml b/pom.xml index d23e1b3a4a15194ee13a79584d39eaf5d9e2f32e..3408a9ac34ceaf60ce79370d50dca339f073ae43 100644 --- a/pom.xml +++ b/pom.xml @@ -35,6 +35,7 @@ <commons-csv.version>1.8</commons-csv.version> <commons-io.version>2.9.0</commons-io.version> <dropwizard.version>2.0.22</dropwizard.version> + <dropwizard-metrics-datadog.version>1.1.13</dropwizard-metrics-datadog.version> <guava.version>30.1.1-jre</guava.version> <jaxb.version>2.3.1</jaxb.version> <jedis.version>2.9.0</jedis.version> @@ -171,6 +172,11 @@ <artifactId>commons-csv</artifactId> <version>${commons-csv.version}</version> </dependency> + <dependency> + <groupId>org.coursera</groupId> + <artifactId>dropwizard-metrics-datadog</artifactId> + <version>${dropwizard-metrics-datadog.version}</version> + </dependency> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> diff --git a/service/pom.xml b/service/pom.xml index c8bf0a5d5b2b8f6ac6851c1457f0490ee93eb555..50facfaf68c2bf0b0ec05df010990c5add1141a3 100644 --- a/service/pom.xml +++ b/service/pom.xml @@ -226,7 +226,10 @@ <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-datadog</artifactId> </dependency> - + <dependency> + <groupId>org.coursera</groupId> + <artifactId>dropwizard-metrics-datadog</artifactId> + </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> 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 0000000000000000000000000000000000000000..0f4664102622ed25441568a1cce9b7210b49702c --- /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<String> 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<Expansion> 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 3b2cb300364d7180160e82cd2432a12fdfe57bbe..be127b6fd9d8a186c1b0c5fc6f9826e6237ae552 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