Skip to content

Commit 796b788

Browse files
authored
SOLR-17587: wt=prometheus fix duplicate TYPE information (#2902)
Metrics: Prometheus response writer fix for non-compliant exposition format containing duplicate TYPE lines
1 parent 35b27d3 commit 796b788

16 files changed

Lines changed: 143 additions & 101 deletions

solr/CHANGES.txt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,8 @@ Optimizations
166166

167167
Bug Fixes
168168
---------------------
169-
* PR#2680: Improve reliablity of NpmTasks finding needed files/commands. (Tyler Bertrand via Eric Pugh)
169+
* SOLR-17587: Metrics: wt=prometheus fix for non-compliant exposition format containing duplicate TYPE lines.
170+
(Matthew Biscocho via David Smiley)
170171

171172
Dependency Upgrades
172173
---------------------
@@ -180,6 +181,8 @@ Other Changes
180181
* GITHUB#2869: SolrTestCase now supports @LogLevel annotations (as SolrTestCaseJ4 has). Added LogLevelTestRule
181182
for encapsulation and reuse. (David Smiley)
182183

184+
* GITHUB#2680: Improve reliablity of NpmTasks finding needed files/commands. (Tyler Bertrand via Eric Pugh)
185+
183186
================== 9.8.0 ==================
184187
New Features
185188
---------------------

solr/core/src/java/org/apache/solr/handler/admin/MetricsHandler.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,10 +186,20 @@ private NamedList<Object> handlePrometheusExport(SolrParams params) {
186186
List<MetricType> metricTypes = parseMetricTypes(params);
187187
List<MetricFilter> metricFilters =
188188
metricTypes.stream().map(MetricType::asMetricFilter).collect(Collectors.toList());
189+
189190
Set<String> requestedRegistries = parseRegistries(params);
191+
MetricRegistry mergedCoreRegistries = new MetricRegistry();
190192

191193
for (String registryName : requestedRegistries) {
192194
MetricRegistry dropwizardRegistry = metricManager.registry(registryName);
195+
196+
// Merge all core registries into a single registry and
197+
// append the core name to the metric to avoid duplicate metrics name
198+
if (registryName.startsWith("solr.core")) {
199+
mergedCoreRegistries.registerAll(getCoreNameFromRegistry(registryName), dropwizardRegistry);
200+
continue;
201+
}
202+
193203
PrometheusResponseWriter.toPrometheus(
194204
dropwizardRegistry,
195205
registryName,
@@ -203,6 +213,22 @@ private NamedList<Object> handlePrometheusExport(SolrParams params) {
203213
response.add(registryName, registry);
204214
});
205215
}
216+
217+
if (!mergedCoreRegistries.getMetrics().isEmpty()) {
218+
PrometheusResponseWriter.toPrometheus(
219+
mergedCoreRegistries,
220+
"solr.core",
221+
metricFilters,
222+
mustMatchFilter,
223+
propertyFilter,
224+
false,
225+
false,
226+
true,
227+
(registry) -> {
228+
response.add("solr.core", registry);
229+
});
230+
}
231+
206232
return response;
207233
}
208234

@@ -523,6 +549,11 @@ private List<MetricType> parseMetricTypes(SolrParams params) {
523549
return metricTypes;
524550
}
525551

552+
private String getCoreNameFromRegistry(String registryName) {
553+
String coreName = registryName.substring(registryName.indexOf('.') + 1);
554+
return coreName.replace(".", "_");
555+
}
556+
526557
@Override
527558
public String getDescription() {
528559
return "A handler to return all the metrics gathered by Solr";

solr/core/src/java/org/apache/solr/metrics/prometheus/core/PrometheusCoreFormatterInfo.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616
*/
1717
package org.apache.solr.metrics.prometheus.core;
1818

19-
import java.util.regex.Pattern;
20-
2119
public interface PrometheusCoreFormatterInfo {
2220
/** Category of prefix Solr Core dropwizard handler metric names */
2321
enum CoreCategory {
@@ -32,6 +30,4 @@ enum CoreCategory {
3230
INDEX,
3331
CORE
3432
}
35-
36-
Pattern CLOUD_CORE_PATTERN = Pattern.compile("^core_(.*)_(shard[0-9]+)_(replica_.[0-9]+)$");
3733
}

solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreCacheMetric.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,8 @@
2424
public class SolrCoreCacheMetric extends SolrCoreMetric {
2525
public static final String CORE_CACHE_SEARCHER_METRICS = "solr_metrics_core_cache";
2626

27-
public SolrCoreCacheMetric(
28-
Metric dropwizardMetric, String coreName, String metricName, boolean cloudMode) {
29-
super(dropwizardMetric, coreName, metricName, cloudMode);
27+
public SolrCoreCacheMetric(Metric dropwizardMetric, String metricName) {
28+
super(dropwizardMetric, metricName);
3029
}
3130

3231
/*

solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreHandlerMetric.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,8 @@ public class SolrCoreHandlerMetric extends SolrCoreMetric {
3030
public static final String CORE_REQUESTS_TOTAL_TIME = "solr_metrics_core_requests_time";
3131
public static final String CORE_REQUEST_TIMES = "solr_metrics_core_average_request_time";
3232

33-
public SolrCoreHandlerMetric(
34-
Metric dropwizardMetric, String coreName, String metricName, boolean cloudMode) {
35-
super(dropwizardMetric, coreName, metricName, cloudMode);
33+
public SolrCoreHandlerMetric(Metric dropwizardMetric, String metricName) {
34+
super(dropwizardMetric, metricName);
3635
}
3736

3837
/*

solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreHighlighterMetric.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,8 @@
2424
public class SolrCoreHighlighterMetric extends SolrCoreMetric {
2525
public static final String CORE_HIGHLIGHER_METRICS = "solr_metrics_core_highlighter_requests";
2626

27-
public SolrCoreHighlighterMetric(
28-
Metric dropwizardMetric, String coreName, String metricName, boolean cloudMode) {
29-
super(dropwizardMetric, coreName, metricName, cloudMode);
27+
public SolrCoreHighlighterMetric(Metric dropwizardMetric, String metricName) {
28+
super(dropwizardMetric, metricName);
3029
}
3130

3231
/*

solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreIndexMetric.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,8 @@
2424
public class SolrCoreIndexMetric extends SolrCoreMetric {
2525
public static final String CORE_INDEX_METRICS = "solr_metrics_core_index_size_bytes";
2626

27-
public SolrCoreIndexMetric(
28-
Metric dropwizardMetric, String coreName, String metricName, boolean cloudMode) {
29-
super(dropwizardMetric, coreName, metricName, cloudMode);
27+
public SolrCoreIndexMetric(Metric dropwizardMetric, String metricName) {
28+
super(dropwizardMetric, metricName);
3029
}
3130

3231
/*

solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreMetric.java

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,37 +16,41 @@
1616
*/
1717
package org.apache.solr.metrics.prometheus.core;
1818

19-
import static org.apache.solr.metrics.prometheus.core.PrometheusCoreFormatterInfo.CLOUD_CORE_PATTERN;
20-
2119
import com.codahale.metrics.Metric;
2220
import java.util.regex.Matcher;
21+
import java.util.regex.Pattern;
2322
import org.apache.solr.common.SolrException;
2423
import org.apache.solr.metrics.prometheus.SolrMetric;
2524

2625
/** Base class is a wrapper to export a solr.core {@link com.codahale.metrics.Metric} */
2726
public abstract class SolrCoreMetric extends SolrMetric {
28-
public String coreName;
2927

30-
public SolrCoreMetric(
31-
Metric dropwizardMetric, String coreName, String metricName, boolean cloudMode) {
32-
super(dropwizardMetric, metricName);
33-
this.coreName = coreName;
34-
labels.put("core", coreName);
35-
if (cloudMode) {
36-
appendCloudModeLabels();
37-
}
38-
}
28+
public static Pattern CLOUD_CORE_PATTERN =
29+
Pattern.compile(
30+
"(?<core>^core_(?<collection>.*)_(?<shard>shard[0-9]+)_(?<replica>replica_.[0-9]+)).(.*)$");
31+
public static Pattern STANDALONE_CORE_PATTERN = Pattern.compile("^core_(?<core>.*?)\\.(.*)$");
32+
33+
public String coreName;
3934

40-
private void appendCloudModeLabels() {
41-
Matcher m = CLOUD_CORE_PATTERN.matcher(coreName);
42-
if (m.find()) {
43-
labels.put("collection", m.group(1));
44-
labels.put("shard", m.group(2));
45-
labels.put("replica", m.group(3));
35+
public SolrCoreMetric(Metric dropwizardMetric, String metricName) {
36+
// Remove Core Name prefix from metric as it is no longer needed for tag parsing from this point
37+
super(dropwizardMetric, metricName.substring(metricName.indexOf(".") + 1));
38+
Matcher cloudPattern = CLOUD_CORE_PATTERN.matcher(metricName);
39+
Matcher standalonePattern = STANDALONE_CORE_PATTERN.matcher(metricName);
40+
if (cloudPattern.find()) {
41+
coreName = cloudPattern.group("core");
42+
cloudPattern
43+
.namedGroups()
44+
.forEach((key, value) -> labels.put(key, cloudPattern.group(value)));
45+
} else if (standalonePattern.find()) {
46+
coreName = standalonePattern.group("core");
47+
standalonePattern
48+
.namedGroups()
49+
.forEach((key, value) -> labels.put(key, standalonePattern.group(value)));
4650
} else {
4751
throw new SolrException(
4852
SolrException.ErrorCode.SERVER_ERROR,
49-
"Core name does not match pattern for parsing " + coreName);
53+
"Core name does not match pattern for parsing in metric " + metricName);
5054
}
5155
}
5256
}

solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreSearcherMetric.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,8 @@ public class SolrCoreSearcherMetric extends SolrCoreMetric {
2929
public static final String CORE_SEARCHER_METRICS = "solr_metrics_core_searcher_documents";
3030
public static final String CORE_SEARCHER_TIMES = "solr_metrics_core_average_searcher_warmup_time";
3131

32-
public SolrCoreSearcherMetric(
33-
Metric dropwizardMetric, String coreName, String metricName, boolean cloudMode) {
34-
super(dropwizardMetric, coreName, metricName, cloudMode);
32+
public SolrCoreSearcherMetric(Metric dropwizardMetric, String metricName) {
33+
super(dropwizardMetric, metricName);
3534
}
3635

3736
/*

solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreTlogMetric.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,8 @@
2424
public class SolrCoreTlogMetric extends SolrCoreMetric {
2525
public static final String CORE_TLOG_METRICS = "solr_metrics_core_tlog";
2626

27-
public SolrCoreTlogMetric(
28-
Metric dropwizardMetric, String coreName, String metricName, boolean cloudMode) {
29-
super(dropwizardMetric, coreName, metricName, cloudMode);
27+
public SolrCoreTlogMetric(Metric dropwizardMetric, String metricName) {
28+
super(dropwizardMetric, metricName);
3029
}
3130

3231
/*

0 commit comments

Comments
 (0)