adjust lettuce metric denial for post-transform name

This commit is contained in:
Ravi Khadiwala 2023-08-10 17:44:34 -05:00 committed by ravi-signal
parent b6ee074149
commit ed6a2c55eb
2 changed files with 68 additions and 37 deletions

View File

@ -6,12 +6,13 @@
package org.whispersystems.textsecuregcm.metrics;
import com.codahale.metrics.SharedMetricRegistries;
import com.google.common.annotations.VisibleForTesting;
import io.dropwizard.setup.Environment;
import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Metrics;
import io.micrometer.core.instrument.Tags;
import io.micrometer.core.instrument.config.MeterFilter;
import io.micrometer.core.instrument.config.MeterFilterReply;
import io.micrometer.core.instrument.distribution.DistributionStatisticConfig;
import io.micrometer.datadog.DatadogMeterRegistry;
import java.util.concurrent.TimeUnit;
@ -43,10 +44,6 @@ public class MetricsUtil {
public static void configureRegistries(final WhisperServerConfiguration config, final Environment environment) {
SharedMetricRegistries.add(Constants.METRICS_NAME, environment.metrics());
final DistributionStatisticConfig defaultDistributionStatisticConfig = DistributionStatisticConfig.builder()
.percentiles(.75, .95, .99, .999)
.build();
{
final DatadogMeterRegistry datadogMeterRegistry = new DatadogMeterRegistry(
config.getDatadogConfiguration(), io.micrometer.core.instrument.Clock.SYSTEM);
@ -56,19 +53,28 @@ public class MetricsUtil {
"service", "chat",
"host", HostnameUtil.getLocalHostname(),
"version", WhisperServerVersion.getServerVersion(),
"env", config.getDatadogConfiguration().getEnvironment()))
"env", config.getDatadogConfiguration().getEnvironment()));
configureMeterFilters(datadogMeterRegistry.config());
Metrics.addRegistry(datadogMeterRegistry);
}
environment.lifecycle().manage(new MicrometerRegistryManager(Metrics.globalRegistry));
environment.lifecycle().manage(new ApplicationShutdownMonitor(Metrics.globalRegistry));
}
@VisibleForTesting
static MeterRegistry.Config configureMeterFilters(MeterRegistry.Config config) {
final DistributionStatisticConfig defaultDistributionStatisticConfig = DistributionStatisticConfig.builder()
.percentiles(.75, .95, .99, .999)
.build();
return config
.meterFilter(new MeterFilter() {
@Override
public DistributionStatisticConfig configure(final Meter.Id id, final DistributionStatisticConfig config) {
return defaultDistributionStatisticConfig.merge(config);
}
});
datadogMeterRegistry.config()
// Deny lettuce metrics, but leave command.completions.max
.meterFilter(MeterFilter.deny(id ->
id.getName().startsWith("lettuce") && !id.getName().contains("command.completions.max")
))
})
// Remove high-cardinality `command` tags from Lettuce metrics and prepend "chat." to meter names
.meterFilter(new MeterFilter() {
@Override
@ -82,13 +88,12 @@ public class MetricsUtil {
return MeterFilter.super.map(id);
}
});
Metrics.addRegistry(datadogMeterRegistry);
}
environment.lifecycle().manage(new MicrometerRegistryManager(Metrics.globalRegistry));
environment.lifecycle().manage(new ApplicationShutdownMonitor(Metrics.globalRegistry));
})
// Deny lettuce metrics, but leave command.completions.max. Note that regardless of configured order, accept
// filters are applied after map filters.
.meterFilter(MeterFilter.deny(id ->
id.getName().startsWith(PREFIX + ".lettuce") && !id.getName().contains("command.completion.max")
));
}
public static void registerSystemResourceMetrics(final Environment environment) {

View File

@ -5,8 +5,13 @@
package org.whispersystems.textsecuregcm.metrics;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
import java.util.List;
import org.junit.jupiter.api.Test;
@ -19,4 +24,25 @@ class MetricsUtilTest {
assertEquals("chat.MetricsUtilTest.namespace.metric",
MetricsUtil.name(MetricsUtilTest.class, "namespace", "metric"));
}
@Test
void lettuceRejection() {
MeterRegistry registry = new SimpleMeterRegistry();
MetricsUtil.configureMeterFilters(registry.config());
registry.counter("lettuce.command.completion.count").increment();
registry.counter("lettuce.command.firstresponse.max").increment();
registry.counter("lettuce.test").increment();
assertThat(registry.getMeters()).isEmpty();
// this lettuce statistic is allow-listed
registry.counter("lettuce.command.completion.max", "command", "hello", "remote", "world").increment();
final List<Meter> meters = registry.getMeters();
assertThat(meters).hasSize(1);
Meter meter = meters.get(0);
assertThat(meter.getId().getName()).isEqualTo("chat.lettuce.command.completion.max");
assertThat(meter.getId().getTag("command")).isNull();
assertThat(meter.getId().getTag("remote")).isNotNull();
}
}