Add support for reporting metrics to signalfx (#129)

This commit is contained in:
Ehren Kret 2020-08-07 11:10:31 -05:00 committed by GitHub
parent 38293efe75
commit ea00224e7f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 84 additions and 5 deletions

View File

@ -86,6 +86,18 @@
<version>1.5.2</version>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-signalfx</artifactId>
<version>1.5.3</version>
</dependency>
<dependency>
<groupId>com.signalfx.public</groupId>
<artifactId>signalfx-codahale</artifactId>
<version>1.0.4</version>
</dependency>
<dependency>
<groupId>org.coursera</groupId>
<artifactId>dropwizard-metrics-datadog</artifactId>

View File

@ -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<WhisperServerConfiguration
public void run(WhisperServerConfiguration config, Environment environment)
throws Exception
{
final String instanceId = EC2MetadataUtils.getInstanceId();
SharedMetricRegistries.add(Constants.METRICS_NAME, environment.metrics());
final Map<String, MicrometerConfiguration> micrometerConfigurationByName = config.getMicrometerConfiguration();
@ -261,8 +261,6 @@ public class WhisperServerService extends Application<WhisperServerConfiguration
{
final MicrometerConfiguration micrometerDatadogConfig = micrometerConfigurationByName.get("datadog");
final String instanceId = EC2MetadataUtils.getInstanceId();
Metrics.addRegistry(new DatadogMeterRegistry(new DatadogConfig() {
@Override
public String get(final String key) {
@ -296,6 +294,41 @@ public class WhisperServerService extends Application<WhisperServerConfiguration
});
}
{
final MicrometerConfiguration micrometerSignalfxConfig = micrometerConfigurationByName.get("signalfx");
Metrics.addRegistry(new SignalFxMeterRegistry(new SignalFxConfig() {
@Override
public String get(String key) {
return null;
}
@Override
public String accessToken() {
return micrometerSignalfxConfig.getApiKey();
}
@Override
public String source() {
return instanceId;
}
}, Clock.SYSTEM) {
@Override
protected List<Tag> getConventionTags(@Nonnull Meter.Id id) {
final List<Tag> 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);

View File

@ -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();
}
}

View File

@ -1,2 +1,3 @@
org.whispersystems.textsecuregcm.metrics.JsonMetricsReporterFactory
org.whispersystems.textsecuregcm.metrics.SignalDatadogReporterFactory
org.whispersystems.textsecuregcm.metrics.SignalSignalfxReporterFactory