diff --git a/service/pom.xml b/service/pom.xml
index d15272975..ecfe85989 100644
--- a/service/pom.xml
+++ b/service/pom.xml
@@ -86,6 +86,18 @@
1.5.2
+
+ io.micrometer
+ micrometer-registry-signalfx
+ 1.5.3
+
+
+
+ com.signalfx.public
+ signalfx-codahale
+ 1.0.4
+
+
org.coursera
dropwizard-metrics-datadog
diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java
index cd875e59b..897c1f4e9 100644
--- a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java
+++ b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java
@@ -42,8 +42,6 @@ import io.dropwizard.db.PooledDataSourceFactory;
import io.dropwizard.jdbi3.JdbiFactory;
import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;
-import io.lettuce.core.RedisURI;
-import io.lettuce.core.cluster.RedisClusterClient;
import io.micrometer.core.instrument.Clock;
import io.micrometer.core.instrument.ImmutableTag;
import io.micrometer.core.instrument.Meter;
@@ -52,6 +50,8 @@ import io.micrometer.core.instrument.Tag;
import io.micrometer.core.instrument.distribution.DistributionStatisticConfig;
import io.micrometer.datadog.DatadogConfig;
import io.micrometer.datadog.DatadogMeterRegistry;
+import io.micrometer.signalfx.SignalFxConfig;
+import io.micrometer.signalfx.SignalFxMeterRegistry;
import io.micrometer.wavefront.WavefrontConfig;
import io.micrometer.wavefront.WavefrontMeterRegistry;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
@@ -173,7 +173,6 @@ import java.util.EnumSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
-import java.util.stream.Collectors;
import static com.codahale.metrics.MetricRegistry.name;
@@ -223,6 +222,7 @@ public class WhisperServerService extends Application micrometerConfigurationByName = config.getMicrometerConfiguration();
@@ -261,8 +261,6 @@ public class WhisperServerService extends Application getConventionTags(@Nonnull Meter.Id id) {
+ final List tags = super.getConventionTags(id);
+ tags.add(new ImmutableTag("environment", micrometerSignalfxConfig.getEnvironment()));
+ return tags;
+ }
+
+ @Override
+ protected DistributionStatisticConfig defaultHistogramConfig() {
+ return DistributionStatisticConfig.builder()
+ .percentiles(.75, .95, .99, .999)
+ .build()
+ .merge(super.defaultHistogramConfig());
+ }
+ });
+ }
+
environment.getObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
environment.getObjectMapper().setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE);
environment.getObjectMapper().setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/metrics/SignalSignalfxReporterFactory.java b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/SignalSignalfxReporterFactory.java
new file mode 100644
index 000000000..c44c8eb6d
--- /dev/null
+++ b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/SignalSignalfxReporterFactory.java
@@ -0,0 +1,33 @@
+package org.whispersystems.textsecuregcm.metrics;
+
+import com.amazonaws.util.EC2MetadataUtils;
+import com.codahale.metrics.MetricRegistry;
+import com.codahale.metrics.ScheduledReporter;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.signalfx.codahale.reporter.SignalFxReporter;
+import com.signalfx.metrics.auth.StaticAuthToken;
+import io.dropwizard.metrics.BaseReporterFactory;
+
+import javax.validation.constraints.NotEmpty;
+
+@JsonTypeName("signalsignalfx")
+public class SignalSignalfxReporterFactory extends BaseReporterFactory {
+
+ @JsonProperty
+ @NotEmpty
+ private String authToken = null;
+
+ @JsonProperty
+ @NotEmpty
+ private String environment = null;
+
+ public ScheduledReporter build(MetricRegistry registry) {
+ return new SignalFxReporter.Builder(registry, new StaticAuthToken(authToken), EC2MetadataUtils.getInstanceId())
+ .addDimension("environment", environment)
+ .setFilter(getFilter())
+ .setDurationUnit(getDurationUnit())
+ .setRateUnit(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 be127b6fd..1a5808380 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,2 +1,3 @@
org.whispersystems.textsecuregcm.metrics.JsonMetricsReporterFactory
org.whispersystems.textsecuregcm.metrics.SignalDatadogReporterFactory
+org.whispersystems.textsecuregcm.metrics.SignalSignalfxReporterFactory