From eb1b073385b4c2cabb1ddc55a813e6d519174d9f Mon Sep 17 00:00:00 2001
From: Jon Chambers <jon@signal.org>
Date: Wed, 9 Jun 2021 12:39:06 -0400
Subject: [PATCH] Add a hostname-aware reporter factory.

---
 pom.xml                                       |  6 ++
 service/pom.xml                               |  5 +-
 .../metrics/SignalDatadogReporterFactory.java | 74 +++++++++++++++++++
 .../io.dropwizard.metrics.ReporterFactory     |  1 +
 4 files changed, 85 insertions(+), 1 deletion(-)
 create mode 100644 service/src/main/java/org/whispersystems/textsecuregcm/metrics/SignalDatadogReporterFactory.java

diff --git a/pom.xml b/pom.xml
index d23e1b3a4..3408a9ac3 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 c8bf0a5d5..50facfaf6 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 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<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 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
-- 
GitLab