adjust lettuce metric denial for post-transform name
This commit is contained in:
parent
b6ee074149
commit
ed6a2c55eb
|
@ -6,12 +6,13 @@
|
||||||
package org.whispersystems.textsecuregcm.metrics;
|
package org.whispersystems.textsecuregcm.metrics;
|
||||||
|
|
||||||
import com.codahale.metrics.SharedMetricRegistries;
|
import com.codahale.metrics.SharedMetricRegistries;
|
||||||
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
import io.dropwizard.setup.Environment;
|
import io.dropwizard.setup.Environment;
|
||||||
import io.micrometer.core.instrument.Meter;
|
import io.micrometer.core.instrument.Meter;
|
||||||
|
import io.micrometer.core.instrument.MeterRegistry;
|
||||||
import io.micrometer.core.instrument.Metrics;
|
import io.micrometer.core.instrument.Metrics;
|
||||||
import io.micrometer.core.instrument.Tags;
|
import io.micrometer.core.instrument.Tags;
|
||||||
import io.micrometer.core.instrument.config.MeterFilter;
|
import io.micrometer.core.instrument.config.MeterFilter;
|
||||||
import io.micrometer.core.instrument.config.MeterFilterReply;
|
|
||||||
import io.micrometer.core.instrument.distribution.DistributionStatisticConfig;
|
import io.micrometer.core.instrument.distribution.DistributionStatisticConfig;
|
||||||
import io.micrometer.datadog.DatadogMeterRegistry;
|
import io.micrometer.datadog.DatadogMeterRegistry;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
@ -43,47 +44,17 @@ public class MetricsUtil {
|
||||||
public static void configureRegistries(final WhisperServerConfiguration config, final Environment environment) {
|
public static void configureRegistries(final WhisperServerConfiguration config, final Environment environment) {
|
||||||
SharedMetricRegistries.add(Constants.METRICS_NAME, environment.metrics());
|
SharedMetricRegistries.add(Constants.METRICS_NAME, environment.metrics());
|
||||||
|
|
||||||
final DistributionStatisticConfig defaultDistributionStatisticConfig = DistributionStatisticConfig.builder()
|
|
||||||
.percentiles(.75, .95, .99, .999)
|
|
||||||
.build();
|
|
||||||
|
|
||||||
{
|
{
|
||||||
final DatadogMeterRegistry datadogMeterRegistry = new DatadogMeterRegistry(
|
final DatadogMeterRegistry datadogMeterRegistry = new DatadogMeterRegistry(
|
||||||
config.getDatadogConfiguration(), io.micrometer.core.instrument.Clock.SYSTEM);
|
config.getDatadogConfiguration(), io.micrometer.core.instrument.Clock.SYSTEM);
|
||||||
|
|
||||||
datadogMeterRegistry.config().commonTags(
|
datadogMeterRegistry.config().commonTags(
|
||||||
Tags.of(
|
Tags.of(
|
||||||
"service", "chat",
|
"service", "chat",
|
||||||
"host", HostnameUtil.getLocalHostname(),
|
"host", HostnameUtil.getLocalHostname(),
|
||||||
"version", WhisperServerVersion.getServerVersion(),
|
"version", WhisperServerVersion.getServerVersion(),
|
||||||
"env", config.getDatadogConfiguration().getEnvironment()))
|
"env", config.getDatadogConfiguration().getEnvironment()));
|
||||||
.meterFilter(new MeterFilter() {
|
configureMeterFilters(datadogMeterRegistry.config());
|
||||||
@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
|
|
||||||
public Meter.Id map(final Meter.Id id) {
|
|
||||||
if (id.getName().startsWith("lettuce")) {
|
|
||||||
return id.withName(PREFIX + "." + id.getName())
|
|
||||||
.replaceTags(id.getTags().stream()
|
|
||||||
.filter(tag -> !"command".equals(tag.getKey()))
|
|
||||||
.toList());
|
|
||||||
}
|
|
||||||
|
|
||||||
return MeterFilter.super.map(id);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Metrics.addRegistry(datadogMeterRegistry);
|
Metrics.addRegistry(datadogMeterRegistry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -91,6 +62,40 @@ public class MetricsUtil {
|
||||||
environment.lifecycle().manage(new ApplicationShutdownMonitor(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);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
// Remove high-cardinality `command` tags from Lettuce metrics and prepend "chat." to meter names
|
||||||
|
.meterFilter(new MeterFilter() {
|
||||||
|
@Override
|
||||||
|
public Meter.Id map(final Meter.Id id) {
|
||||||
|
if (id.getName().startsWith("lettuce")) {
|
||||||
|
return id.withName(PREFIX + "." + id.getName())
|
||||||
|
.replaceTags(id.getTags().stream()
|
||||||
|
.filter(tag -> !"command".equals(tag.getKey()))
|
||||||
|
.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
return MeterFilter.super.map(id);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
// 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) {
|
public static void registerSystemResourceMetrics(final Environment environment) {
|
||||||
environment.metrics().register(name(CpuUsageGauge.class, "cpu"), new CpuUsageGauge(3, TimeUnit.SECONDS));
|
environment.metrics().register(name(CpuUsageGauge.class, "cpu"), new CpuUsageGauge(3, TimeUnit.SECONDS));
|
||||||
environment.metrics().register(name(FreeMemoryGauge.class, "free_memory"), new FreeMemoryGauge());
|
environment.metrics().register(name(FreeMemoryGauge.class, "free_memory"), new FreeMemoryGauge());
|
||||||
|
|
|
@ -5,8 +5,13 @@
|
||||||
|
|
||||||
package org.whispersystems.textsecuregcm.metrics;
|
package org.whispersystems.textsecuregcm.metrics;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
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;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,4 +24,25 @@ class MetricsUtilTest {
|
||||||
assertEquals("chat.MetricsUtilTest.namespace.metric",
|
assertEquals("chat.MetricsUtilTest.namespace.metric",
|
||||||
MetricsUtil.name(MetricsUtilTest.class, "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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue