Skip to content

Commit 4a47ac3

Browse files
authored
Merge pull request #2340 from atlanhq/PLT-1879
PLT-1879: enable method level metrics in metastore to show in prometheus
2 parents df50f16 + 4132a73 commit 4a47ac3

File tree

3 files changed

+29
-27
lines changed

3 files changed

+29
-27
lines changed

common/src/main/java/org/apache/atlas/service/metrics/MetricsRegistryServiceImpl.java

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package org.apache.atlas.service.metrics;
22

3-
import io.micrometer.core.instrument.Meter;
43
import io.micrometer.core.instrument.Metrics;
54
import io.micrometer.core.instrument.Tags;
6-
import io.micrometer.core.instrument.binder.BaseUnits;
7-
import io.micrometer.core.instrument.distribution.DistributionStatisticConfig;
5+
import io.micrometer.core.instrument.Timer;
86
import io.micrometer.prometheus.PrometheusMeterRegistry;
97
import org.apache.atlas.ApplicationProperties;
108
import org.apache.atlas.AtlasException;
@@ -16,7 +14,10 @@
1614
import javax.inject.Inject;
1715
import java.io.IOException;
1816
import java.io.PrintWriter;
19-
import java.time.Duration;
17+
import java.util.Arrays;
18+
import java.util.List;
19+
import java.util.concurrent.TimeUnit;
20+
import java.util.stream.Collectors;
2021

2122
import static org.apache.atlas.service.metrics.MetricUtils.getMeterRegistry;
2223

@@ -29,20 +30,13 @@ public class MetricsRegistryServiceImpl implements MetricsRegistry {
2930
private static final String NAME = "name";
3031
private static final String METHOD_DIST_SUMMARY = "method_dist_summary";
3132
private static final double[] PERCENTILES = {0.99};
32-
private static final int SEC_MILLIS_SCALE = 1;
3333
private static final String METHOD_LEVEL_METRICS_ENABLE = "atlas.metrics.method_level.enable";
34-
35-
private final DistributionStatisticConfig distributionStatisticConfig;
34+
private static final String ATLAS_METRICS_METHOD_PATTERNS = "atlas.metrics.method_patterns";
35+
private final List<String> filteredMethods;
3636

3737
@Inject
38-
public MetricsRegistryServiceImpl() {
39-
this.distributionStatisticConfig = DistributionStatisticConfig.builder().percentilePrecision(2)
40-
.percentiles(PERCENTILES)
41-
.bufferLength(3)
42-
.percentilesHistogram(false)
43-
.minimumExpectedValue(1.0)
44-
.maximumExpectedValue(Double.MAX_VALUE)
45-
.expiry(Duration.ofMinutes(2)).build();
38+
public MetricsRegistryServiceImpl() throws AtlasException {
39+
this.filteredMethods = Arrays.stream(ApplicationProperties.get().getStringArray(ATLAS_METRICS_METHOD_PATTERNS)).collect(Collectors.toList());
4640
}
4741

4842
@Override
@@ -51,17 +45,18 @@ public void collect(String requestId, AtlasPerfMetrics metrics) {
5145
if (!ApplicationProperties.get().getBoolean(METHOD_LEVEL_METRICS_ENABLE, false)) {
5246
return;
5347
}
54-
} catch (AtlasException e) {
55-
LOG.error("Failed to read {} property from atlas config", METHOD_LEVEL_METRICS_ENABLE, e);
48+
49+
for (String name : this.filteredMethods) {
50+
if(metrics.hasMetric(name)) {
51+
AtlasPerfMetrics.Metric metric = metrics.getMetric(name);
52+
Timer.builder(METHOD_DIST_SUMMARY).tags(Tags.of(NAME, metric.getName())).publishPercentiles(PERCENTILES)
53+
.register(getMeterRegistry()).record(metric.getTotalTimeMSecs(), TimeUnit.MILLISECONDS);
54+
}
55+
}
56+
} catch (Exception e) {
57+
LOG.error("Failed to collect metrics", e);
5658
return;
5759
}
58-
for (String name : metrics.getMetricsNames()) {
59-
AtlasPerfMetrics.Metric metric = metrics.getMetric(name);
60-
getMeterRegistry().newDistributionSummary(new Meter.Id(METHOD_DIST_SUMMARY,
61-
Tags.of(NAME, metric.getName()), BaseUnits.MILLISECONDS, METHOD_DIST_SUMMARY,
62-
Meter.Type.TIMER), distributionStatisticConfig, SEC_MILLIS_SCALE)
63-
.record(metric.getTotalTimeMSecs());
64-
}
6560
}
6661

6762
@Override
@@ -72,7 +67,7 @@ public void scrape(PrintWriter writer) {
7267
writer.flush();
7368
} catch (IOException e) {
7469
LOG.warn("Failed to write metrics while scraping", e);
75-
}finally {
70+
} finally {
7671
writer.close();
7772
}
7873
});

common/src/main/java/org/apache/atlas/utils/AtlasPerfMetrics.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ public Metric getMetric(String name) {
6565
return metrics.get(name);
6666
}
6767

68+
public boolean hasMetric(String name) {
69+
return metrics.containsKey(name);
70+
}
71+
6872
@Override
6973
public String toString() {
7074
StringBuilder sb = new StringBuilder();

repository/src/main/java/org/apache/atlas/discovery/EntityDiscoveryService.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
import org.apache.atlas.util.AtlasGremlinQueryProvider.AtlasGremlinQuery;
5454
import org.apache.atlas.util.SearchPredicateUtil;
5555
import org.apache.atlas.util.SearchTracker;
56+
import org.apache.atlas.utils.AtlasPerfMetrics;
5657
import org.apache.commons.collections.CollectionUtils;
5758
import org.apache.commons.collections.Predicate;
5859
import org.apache.commons.collections4.IteratorUtils;
@@ -933,7 +934,9 @@ private void scrubSearchResults(AtlasSearchResult result) throws AtlasBaseExcept
933934
}
934935

935936
private void scrubSearchResults(AtlasSearchResult result, boolean suppressLogs) throws AtlasBaseException {
937+
AtlasPerfMetrics.MetricRecorder scrubSearchResultsMetrics = RequestContext.get().startMetricRecord("scrubSearchResults");
936938
AtlasAuthorizationUtils.scrubSearchResults(new AtlasSearchResultScrubRequest(typeRegistry, result), suppressLogs);
939+
RequestContext.get().endMetricRecord(scrubSearchResultsMetrics);
937940
}
938941

939942
private Set<String> getAggregationFields() {
@@ -993,9 +996,9 @@ public AtlasSearchResult directIndexSearch(SearchParams searchParams) throws Atl
993996
String indexName = getIndexName(params);
994997

995998
indexQuery = graph.elasticsearchQuery(indexName);
996-
999+
AtlasPerfMetrics.MetricRecorder elasticSearchQueryMetric = RequestContext.get().startMetricRecord("elasticSearchQuery");
9971000
DirectIndexQueryResult indexQueryResult = indexQuery.vertices(searchParams);
998-
1001+
RequestContext.get().endMetricRecord(elasticSearchQueryMetric);
9991002
prepareSearchResult(ret, indexQueryResult, resultAttributes, true);
10001003

10011004
ret.setAggregations(indexQueryResult.getAggregationMap());

0 commit comments

Comments
 (0)