Skip to content

Commit b422250

Browse files
Allow disabling metrics with data-prepper-config.yaml (#5627)
Add support for disabling metrics via data-prepper-config.yaml Signed-off-by: Siqi Ding <dingdd@amazon.com> Signed-off-by: Siqi Ding <109874435+Davidding4718@users.noreply.github.com>
1 parent d40a066 commit b422250

5 files changed

Lines changed: 138 additions & 14 deletions

File tree

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package org.opensearch.dataprepper.core.parser.config;
2+
3+
import io.micrometer.core.instrument.Meter;
4+
import io.micrometer.core.instrument.config.MeterFilter;
5+
import io.micrometer.core.instrument.config.MeterFilterReply;
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
8+
import org.springframework.util.AntPathMatcher;
9+
import static org.opensearch.dataprepper.metrics.MetricNames.DELIMITER;
10+
11+
12+
import java.util.Collections;
13+
import java.util.List;
14+
15+
public class DisableMetricsFilter implements MeterFilter {
16+
private static final Logger LOG = LoggerFactory.getLogger(DisableMetricsFilter.class);
17+
private final List<String> disabledPatterns;
18+
private static final AntPathMatcher matcher = new AntPathMatcher(DELIMITER);
19+
20+
public DisableMetricsFilter(final List<String> disabledPatterns) {
21+
this.disabledPatterns = disabledPatterns != null ? disabledPatterns : Collections.emptyList();
22+
}
23+
24+
@Override
25+
public MeterFilterReply accept(final Meter.Id id) {
26+
final String metricName = id.getName();
27+
28+
for (final String pattern : disabledPatterns) {
29+
if (matcher.match(pattern, metricName)) {
30+
return MeterFilterReply.DENY;
31+
}
32+
}
33+
return MeterFilterReply.NEUTRAL;
34+
}
35+
36+
}

data-prepper-core/src/main/java/org/opensearch/dataprepper/core/parser/config/MetricsConfig.java

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -82,16 +82,20 @@ public JvmMemoryAggregateMetrics jvmMemoryAggregateMetrics() {
8282

8383
private void configureMetricRegistry(final Map<String, String> metricTags,
8484
final List<MetricTagFilter> metricTagFilters,
85-
final MeterRegistry meterRegistry) {
85+
final List<String> disabledMetrics,
86+
final MeterRegistry meterRegistry){
87+
meterRegistry.config().meterFilter(new DisableMetricsFilter(disabledMetrics));
8688
meterRegistry.config().meterFilter(new CustomTagsMeterFilter(metricTags, metricTagFilters));
8789
}
8890

91+
8992
@Bean
9093
public PrometheusMeterRegistry prometheusMeterRegistry(final DataPrepperConfiguration dataPrepperConfiguration) {
9194
if (dataPrepperConfiguration.getMetricRegistryTypes().contains(MetricRegistryType.Prometheus)) {
9295
final PrometheusMeterRegistry meterRegistry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);
9396
configureMetricRegistry(
94-
dataPrepperConfiguration.getMetricTags(), dataPrepperConfiguration.getMetricTagFilters(), meterRegistry
97+
dataPrepperConfiguration.getMetricTags(), dataPrepperConfiguration.getMetricTagFilters(),
98+
dataPrepperConfiguration.getDisabledMetrics(), meterRegistry
9599
);
96100

97101
return meterRegistry;
@@ -127,7 +131,8 @@ public MeterRegistry cloudWatchMeterRegistry(
127131
try {
128132
final CloudWatchMeterRegistry meterRegistry = cloudWatchMeterRegistryProvider.getCloudWatchMeterRegistry();
129133
configureMetricRegistry(
130-
dataPrepperConfiguration.getMetricTags(), dataPrepperConfiguration.getMetricTagFilters(), meterRegistry
134+
dataPrepperConfiguration.getMetricTags(), dataPrepperConfiguration.getMetricTagFilters(),
135+
dataPrepperConfiguration.getDisabledMetrics(), meterRegistry
131136
);
132137

133138
return meterRegistry;
@@ -146,7 +151,8 @@ public EMFLoggingMeterRegistry emfLoggingMeterRegistry(final DataPrepperConfigur
146151
if (dataPrepperConfiguration.getMetricRegistryTypes().contains(MetricRegistryType.EmbeddedMetricsFormat)) {
147152
final EMFLoggingMeterRegistry meterRegistry = new EMFLoggingMeterRegistry();
148153
configureMetricRegistry(
149-
dataPrepperConfiguration.getMetricTags(), dataPrepperConfiguration.getMetricTagFilters(), meterRegistry
154+
dataPrepperConfiguration.getMetricTags(), dataPrepperConfiguration.getMetricTagFilters(),
155+
dataPrepperConfiguration.getDisabledMetrics(), meterRegistry
150156
);
151157
return meterRegistry;
152158
} else {
@@ -157,18 +163,25 @@ public EMFLoggingMeterRegistry emfLoggingMeterRegistry(final DataPrepperConfigur
157163
@Bean
158164
public CompositeMeterRegistry systemMeterRegistry(
159165
final List<MeterBinder> meterBinders,
160-
final List<MeterRegistry> meterRegistries
166+
final List<MeterRegistry> meterRegistries,
167+
final DataPrepperConfiguration dataPrepperConfiguration
161168
) {
162169
final CompositeMeterRegistry compositeMeterRegistry = new CompositeMeterRegistry();
163170

164-
LOG.debug("{} Meter Binder beans registered.", meterBinders.size());
165-
meterBinders.forEach(binder -> binder.bindTo(compositeMeterRegistry));
166-
167171
meterRegistries.forEach(meterRegistry -> {
168-
compositeMeterRegistry.add(meterRegistry);
172+
configureMetricRegistry(
173+
dataPrepperConfiguration.getMetricTags(),
174+
dataPrepperConfiguration.getMetricTagFilters(),
175+
dataPrepperConfiguration.getDisabledMetrics(),
176+
meterRegistry
177+
);
169178
Metrics.addRegistry(meterRegistry);
179+
compositeMeterRegistry.add(meterRegistry);
170180
});
171181

182+
meterBinders.forEach(binder -> binder.bindTo(compositeMeterRegistry));
183+
172184
return compositeMeterRegistry;
173185
}
186+
174187
}

data-prepper-core/src/main/java/org/opensearch/dataprepper/core/parser/model/DataPrepperConfiguration.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ public class DataPrepperConfiguration implements ExtensionsConfiguration, EventC
5454
private EventConfiguration eventConfiguration;
5555
private Map<String, String> metricTags = new HashMap<>();
5656
private List<MetricTagFilter> metricTagFilters = new LinkedList<>();
57+
private List<String> disabledMetrics = new LinkedList<>();
5758
private PeerForwarderConfiguration peerForwarderConfiguration;
5859
private Duration processorShutdownTimeout;
5960
private Duration sinkShutdownTimeout;
@@ -88,6 +89,8 @@ public DataPrepperConfiguration(
8889
final Map<String, String> metricTags,
8990
@JsonProperty("metric_tag_filters")
9091
final List<MetricTagFilter> metricTagFilters,
92+
@JsonProperty("disabled_metrics")
93+
final List<String> disabledMetrics,
9194
@JsonProperty("peer_forwarder") final PeerForwarderConfiguration peerForwarderConfiguration,
9295
@JsonProperty("processor_shutdown_timeout")
9396
@JsonAlias("processorShutdownTimeout")
@@ -120,6 +123,7 @@ public DataPrepperConfiguration(
120123
setMetricTagFilters(metricTagFilters);
121124
setServerPort(serverPort);
122125
this.peerForwarderConfiguration = peerForwarderConfiguration;
126+
this.disabledMetrics = disabledMetrics;
123127

124128
this.processorShutdownTimeout = processorShutdownTimeout != null ? processorShutdownTimeout : DEFAULT_SHUTDOWN_DURATION;
125129
if (this.processorShutdownTimeout.isNegative()) {
@@ -167,6 +171,11 @@ public List<MetricTagFilter> getMetricTagFilters() {
167171
return metricTagFilters;
168172
}
169173

174+
public List<String> getDisabledMetrics() {
175+
return disabledMetrics != null ? disabledMetrics : Collections.emptyList();
176+
}
177+
178+
170179
private void setSsl(final Boolean ssl) {
171180
if (ssl != null) {
172181
this.ssl = ssl;
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package org.opensearch.dataprepper.core.parser.config;
2+
3+
import io.micrometer.core.instrument.Meter.Id;
4+
import io.micrometer.core.instrument.Meter.Type;
5+
import io.micrometer.core.instrument.Tags;
6+
import io.micrometer.core.instrument.config.MeterFilterReply;
7+
import org.junit.jupiter.params.ParameterizedTest;
8+
import org.junit.jupiter.params.provider.CsvSource;
9+
10+
import java.util.List;
11+
12+
import static org.junit.jupiter.api.Assertions.assertEquals;
13+
14+
public class DisableMetricsFilterTest {
15+
16+
@ParameterizedTest
17+
@CsvSource({
18+
"jvm.gc.max.data.size, jvm.gc.max.data.size, DENY",
19+
"jvm.gc.max.data.size, jvm.gc.**, DENY",
20+
"test-pipeline.http.successRequests, **.http.successRequests, DENY",
21+
"test-pipeline.http.successRequests, jvm.gc.**, NEUTRAL",
22+
"metric.allowed, jvm.gc.max.data.size, NEUTRAL"
23+
})
24+
void testDisabledMetricsFilter(String metricName, String pattern, MeterFilterReply expectedReply) {
25+
final DisableMetricsFilter filter = new DisableMetricsFilter(List.of(pattern));
26+
27+
final Id id = new Id(metricName, Tags.empty(), null, null, Type.COUNTER);
28+
final MeterFilterReply result = filter.accept(id);
29+
30+
assertEquals(expectedReply, result);
31+
}
32+
}

data-prepper-core/src/test/java/org/opensearch/dataprepper/core/parser/config/MetricsConfigTest.java

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics;
2020
import io.micrometer.core.instrument.binder.system.ProcessorMetrics;
2121
import io.micrometer.core.instrument.composite.CompositeMeterRegistry;
22+
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
2223
import io.micrometer.prometheus.PrometheusMeterRegistry;
2324
import org.junit.jupiter.api.AfterAll;
2425
import org.junit.jupiter.api.BeforeAll;
@@ -155,6 +156,25 @@ public void testGivenConfigWithNoCloudWatchMeterRegistryThenNoMeterRegistryCreat
155156
assertThat(meterRegistry, is(nullValue()));
156157
}
157158

159+
@Test
160+
public void testGivenDisabledMetricsThenDisabledMetricsFilterDeniesMatchingMetric() {
161+
final DataPrepperConfiguration config = mock(DataPrepperConfiguration.class);
162+
163+
when(config.getMetricRegistryTypes())
164+
.thenReturn(Collections.singletonList(MetricRegistryType.Prometheus));
165+
when(config.getMetricTags()).thenReturn(Collections.emptyMap());
166+
when(config.getMetricTagFilters()).thenReturn(Collections.emptyList());
167+
when(config.getDisabledMetrics()).thenReturn(List.of("test.metric.blocked"));
168+
169+
final MeterRegistry registry = metricsConfig.prometheusMeterRegistry(config);
170+
final Counter blockedCounter = registry.counter("test.metric.blocked");
171+
final Counter allowedCounter = registry.counter("test.metric.allowed");
172+
173+
assertThat(blockedCounter.count(), equalTo(0.0));
174+
allowedCounter.increment();
175+
assertThat(allowedCounter.count(), equalTo(1.0));
176+
}
177+
158178
@Test
159179
public void testGivenConfigWithCloudWatchMeterRegistryThenNoMeterRegistryCreated() {
160180
final CloudWatchMeterRegistryProvider provider = mock(CloudWatchMeterRegistryProvider.class);
@@ -231,31 +251,45 @@ public void testGivenListOfMeterBindersWhenSystemMeterRegistryThenAllMeterBinder
231251
final MeterBinder binder = mock(MeterBinder.class);
232252
final List<MeterBinder> meterBinders = Collections.nCopies(copies, binder);
233253

234-
final MeterRegistry meterRegistryMock = mock(MeterRegistry.class);
235-
final List<MeterRegistry> meterRegistries = Collections.nCopies(1, meterRegistryMock);
254+
final MeterRegistry realRegistry = new SimpleMeterRegistry();
255+
final List<MeterRegistry> meterRegistries = Collections.singletonList(realRegistry);
256+
257+
final DataPrepperConfiguration config = mock(DataPrepperConfiguration.class);
258+
when(config.getMetricTags()).thenReturn(Collections.emptyMap());
259+
when(config.getMetricTagFilters()).thenReturn(Collections.emptyList());
260+
when(config.getDisabledMetrics()).thenReturn(Collections.emptyList());
236261

237262
final CompositeMeterRegistry meterRegistry = metricsConfig.systemMeterRegistry(
238263
meterBinders,
239-
meterRegistries);
264+
meterRegistries,
265+
config);
240266

241267
assertThat(meterRegistry, isA(CompositeMeterRegistry.class));
242268
verify(binder, times(copies)).bindTo(any(MeterRegistry.class));
243269
}
244270

271+
245272
@Test
246273
public void testGivenEmptyListOfMeterBindersWhenSystemMeterRegistryThenNoMeterBindersRegistered() {
247274
final List<MeterBinder> meterBinders = Collections.emptyList();
248275

249-
final MeterRegistry meterRegistryMock = mock(MeterRegistry.class);
276+
final MeterRegistry meterRegistryMock = new SimpleMeterRegistry();
250277
final List<MeterRegistry> meterRegistries = Collections.nCopies(1, meterRegistryMock);
251278

279+
final DataPrepperConfiguration config = mock(DataPrepperConfiguration.class);
280+
when(config.getMetricTags()).thenReturn(Collections.emptyMap());
281+
when(config.getMetricTagFilters()).thenReturn(Collections.emptyList());
282+
when(config.getDisabledMetrics()).thenReturn(Collections.emptyList());
283+
252284
final CompositeMeterRegistry meterRegistry = metricsConfig.systemMeterRegistry(
253285
meterBinders,
254-
meterRegistries);
286+
meterRegistries,
287+
config);
255288

256289
assertThat(meterRegistry, isA(CompositeMeterRegistry.class));
257290
}
258291

292+
259293
private static Stream<Arguments> provideMetricRegistryTypesAndCreators() {
260294
return Stream.of(
261295
Arguments.of(MetricRegistryType.EmbeddedMetricsFormat, (Function<DataPrepperConfiguration, MeterRegistry>) metricsConfig::emfLoggingMeterRegistry),

0 commit comments

Comments
 (0)