This is an automated email from the ASF dual-hosted git repository.
dsmiley pushed a commit to branch branch_9x
in repository https://gitbox.apache.org/repos/asf/solr.git
The following commit(s) were added to refs/heads/branch_9x by this push:
new 13ba24eab0e SOLR-17587: wt=prometheus fix duplicate TYPE information
(#3006)
13ba24eab0e is described below
commit 13ba24eab0eec81cb7e6d99961da1144a4a0c44e
Author: Matthew Biscocho <[email protected]>
AuthorDate: Thu Jan 9 15:03:05 2025 -0500
SOLR-17587: wt=prometheus fix duplicate TYPE information (#3006)
Metrics: Prometheus response writer fix for non-compliant exposition format
containing duplicate TYPE lines
9x backport of main:
* SOLR-17587: wt=prometheus fix duplicate TYPE information (#2902)
---
solr/CHANGES.txt | 5 ++-
.../apache/solr/handler/admin/MetricsHandler.java | 31 +++++++++++++++
.../core/PrometheusCoreFormatterInfo.java | 4 --
.../prometheus/core/SolrCoreCacheMetric.java | 5 +--
.../prometheus/core/SolrCoreHandlerMetric.java | 5 +--
.../prometheus/core/SolrCoreHighlighterMetric.java | 5 +--
.../prometheus/core/SolrCoreIndexMetric.java | 5 +--
.../metrics/prometheus/core/SolrCoreMetric.java | 46 +++++++++++++---------
.../prometheus/core/SolrCoreSearcherMetric.java | 5 +--
.../prometheus/core/SolrCoreTlogMetric.java | 5 +--
.../core/SolrPrometheusCoreFormatter.java | 20 ++++------
.../solr/response/PrometheusResponseWriter.java | 21 +++-------
.../solr/handler/admin/MetricsHandlerTest.java | 6 +--
.../apache/solr/metrics/SolrCoreMetricTest.java | 25 ++++++------
.../solr/metrics/SolrPrometheusFormatterTest.java | 41 ++++++++++++-------
.../response/TestPrometheusResponseWriter.java | 19 ++++++++-
16 files changed, 147 insertions(+), 101 deletions(-)
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index a048351789b..7bf6c07eb0f 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -27,7 +27,8 @@ Optimizations
Bug Fixes
---------------------
-* PR#2680: Improve reliablity of NpmTasks finding needed files/commands.
(Tyler Bertrand via Eric Pugh)
+* SOLR-17587: Metrics: wt=prometheus fix for non-compliant exposition format
containing duplicate TYPE lines.
+ (Matthew Biscocho via David Smiley)
Dependency Upgrades
---------------------
@@ -41,6 +42,8 @@ Other Changes
* GITHUB#2869: SolrTestCase now supports @LogLevel annotations (as
SolrTestCaseJ4 has). Added LogLevelTestRule
for encapsulation and reuse. (David Smiley)
+* GITHUB#2680: Improve reliablity of NpmTasks finding needed files/commands.
(Tyler Bertrand via Eric Pugh)
+
================== 9.8.0 ==================
New Features
---------------------
diff --git
a/solr/core/src/java/org/apache/solr/handler/admin/MetricsHandler.java
b/solr/core/src/java/org/apache/solr/handler/admin/MetricsHandler.java
index 73da8a818e4..4bba3414be9 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/MetricsHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/MetricsHandler.java
@@ -186,10 +186,20 @@ public class MetricsHandler extends RequestHandlerBase
implements PermissionName
List<MetricType> metricTypes = parseMetricTypes(params);
List<MetricFilter> metricFilters =
metricTypes.stream().map(MetricType::asMetricFilter).collect(Collectors.toList());
+
Set<String> requestedRegistries = parseRegistries(params);
+ MetricRegistry mergedCoreRegistries = new MetricRegistry();
for (String registryName : requestedRegistries) {
MetricRegistry dropwizardRegistry = metricManager.registry(registryName);
+
+ // Merge all core registries into a single registry and
+ // append the core name to the metric to avoid duplicate metrics name
+ if (registryName.startsWith("solr.core")) {
+
mergedCoreRegistries.registerAll(getCoreNameFromRegistry(registryName),
dropwizardRegistry);
+ continue;
+ }
+
PrometheusResponseWriter.toPrometheus(
dropwizardRegistry,
registryName,
@@ -203,6 +213,22 @@ public class MetricsHandler extends RequestHandlerBase
implements PermissionName
response.add(registryName, registry);
});
}
+
+ if (!mergedCoreRegistries.getMetrics().isEmpty()) {
+ PrometheusResponseWriter.toPrometheus(
+ mergedCoreRegistries,
+ "solr.core",
+ metricFilters,
+ mustMatchFilter,
+ propertyFilter,
+ false,
+ false,
+ true,
+ (registry) -> {
+ response.add("solr.core", registry);
+ });
+ }
+
return response;
}
@@ -523,6 +549,11 @@ public class MetricsHandler extends RequestHandlerBase
implements PermissionName
return metricTypes;
}
+ private String getCoreNameFromRegistry(String registryName) {
+ String coreName = registryName.substring(registryName.indexOf('.') + 1);
+ return coreName.replace(".", "_");
+ }
+
@Override
public String getDescription() {
return "A handler to return all the metrics gathered by Solr";
diff --git
a/solr/core/src/java/org/apache/solr/metrics/prometheus/core/PrometheusCoreFormatterInfo.java
b/solr/core/src/java/org/apache/solr/metrics/prometheus/core/PrometheusCoreFormatterInfo.java
index baa7be5898b..b80b406d356 100644
---
a/solr/core/src/java/org/apache/solr/metrics/prometheus/core/PrometheusCoreFormatterInfo.java
+++
b/solr/core/src/java/org/apache/solr/metrics/prometheus/core/PrometheusCoreFormatterInfo.java
@@ -16,8 +16,6 @@
*/
package org.apache.solr.metrics.prometheus.core;
-import java.util.regex.Pattern;
-
public interface PrometheusCoreFormatterInfo {
/** Category of prefix Solr Core dropwizard handler metric names */
enum CoreCategory {
@@ -32,6 +30,4 @@ public interface PrometheusCoreFormatterInfo {
INDEX,
CORE
}
-
- Pattern CLOUD_CORE_PATTERN =
Pattern.compile("^core_(.*)_(shard[0-9]+)_(replica_.[0-9]+)$");
}
diff --git
a/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreCacheMetric.java
b/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreCacheMetric.java
index e8352d3575c..d4d9627c222 100644
---
a/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreCacheMetric.java
+++
b/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreCacheMetric.java
@@ -24,9 +24,8 @@ import
org.apache.solr.metrics.prometheus.SolrPrometheusFormatter;
public class SolrCoreCacheMetric extends SolrCoreMetric {
public static final String CORE_CACHE_SEARCHER_METRICS =
"solr_metrics_core_cache";
- public SolrCoreCacheMetric(
- Metric dropwizardMetric, String coreName, String metricName, boolean
cloudMode) {
- super(dropwizardMetric, coreName, metricName, cloudMode);
+ public SolrCoreCacheMetric(Metric dropwizardMetric, String metricName) {
+ super(dropwizardMetric, metricName);
}
/*
diff --git
a/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreHandlerMetric.java
b/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreHandlerMetric.java
index af9641729a9..9273e825759 100644
---
a/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreHandlerMetric.java
+++
b/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreHandlerMetric.java
@@ -30,9 +30,8 @@ public class SolrCoreHandlerMetric extends SolrCoreMetric {
public static final String CORE_REQUESTS_TOTAL_TIME =
"solr_metrics_core_requests_time";
public static final String CORE_REQUEST_TIMES =
"solr_metrics_core_average_request_time";
- public SolrCoreHandlerMetric(
- Metric dropwizardMetric, String coreName, String metricName, boolean
cloudMode) {
- super(dropwizardMetric, coreName, metricName, cloudMode);
+ public SolrCoreHandlerMetric(Metric dropwizardMetric, String metricName) {
+ super(dropwizardMetric, metricName);
}
/*
diff --git
a/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreHighlighterMetric.java
b/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreHighlighterMetric.java
index 52bc1292c25..d3da3d3426f 100644
---
a/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreHighlighterMetric.java
+++
b/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreHighlighterMetric.java
@@ -24,9 +24,8 @@ import
org.apache.solr.metrics.prometheus.SolrPrometheusFormatter;
public class SolrCoreHighlighterMetric extends SolrCoreMetric {
public static final String CORE_HIGHLIGHER_METRICS =
"solr_metrics_core_highlighter_requests";
- public SolrCoreHighlighterMetric(
- Metric dropwizardMetric, String coreName, String metricName, boolean
cloudMode) {
- super(dropwizardMetric, coreName, metricName, cloudMode);
+ public SolrCoreHighlighterMetric(Metric dropwizardMetric, String metricName)
{
+ super(dropwizardMetric, metricName);
}
/*
diff --git
a/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreIndexMetric.java
b/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreIndexMetric.java
index 048fc8d2ca2..e45e1e955bd 100644
---
a/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreIndexMetric.java
+++
b/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreIndexMetric.java
@@ -24,9 +24,8 @@ import
org.apache.solr.metrics.prometheus.SolrPrometheusFormatter;
public class SolrCoreIndexMetric extends SolrCoreMetric {
public static final String CORE_INDEX_METRICS =
"solr_metrics_core_index_size_bytes";
- public SolrCoreIndexMetric(
- Metric dropwizardMetric, String coreName, String metricName, boolean
cloudMode) {
- super(dropwizardMetric, coreName, metricName, cloudMode);
+ public SolrCoreIndexMetric(Metric dropwizardMetric, String metricName) {
+ super(dropwizardMetric, metricName);
}
/*
diff --git
a/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreMetric.java
b/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreMetric.java
index 5010425a023..cb283ea7563 100644
---
a/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreMetric.java
+++
b/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreMetric.java
@@ -16,37 +16,45 @@
*/
package org.apache.solr.metrics.prometheus.core;
-import static
org.apache.solr.metrics.prometheus.core.PrometheusCoreFormatterInfo.CLOUD_CORE_PATTERN;
-
import com.codahale.metrics.Metric;
+import java.util.List;
import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import org.apache.solr.common.SolrException;
import org.apache.solr.metrics.prometheus.SolrMetric;
/** Base class is a wrapper to export a solr.core {@link
com.codahale.metrics.Metric} */
public abstract class SolrCoreMetric extends SolrMetric {
- public String coreName;
- public SolrCoreMetric(
- Metric dropwizardMetric, String coreName, String metricName, boolean
cloudMode) {
- super(dropwizardMetric, metricName);
- this.coreName = coreName;
- labels.put("core", coreName);
- if (cloudMode) {
- appendCloudModeLabels();
- }
- }
+ public static Pattern CLOUD_CORE_PATTERN =
+ Pattern.compile(
+
"(?<core>^core_(?<collection>.*)_(?<shard>shard[0-9]+)_(?<replica>replica_.[0-9]+)).(.*)$");
+ public static Pattern STANDALONE_CORE_PATTERN =
Pattern.compile("^core_(?<core>.*?)\\.(.*)$");
+ public static List<String> CLOUD_LABEL_KEYS = List.of("core", "collection",
"shard", "replica");
+ public static List<String> STANDALONE_LABEL_KEYS = List.of("core");
+ public String coreName;
- private void appendCloudModeLabels() {
- Matcher m = CLOUD_CORE_PATTERN.matcher(coreName);
- if (m.find()) {
- labels.put("collection", m.group(1));
- labels.put("shard", m.group(2));
- labels.put("replica", m.group(3));
+ public SolrCoreMetric(Metric dropwizardMetric, String metricName) {
+ // Remove Core Name prefix from metric as it is no longer needed for tag
parsing from this point
+ super(dropwizardMetric, metricName.substring(metricName.indexOf(".") + 1));
+ Matcher cloudPattern = CLOUD_CORE_PATTERN.matcher(metricName);
+ Matcher standalonePattern = STANDALONE_CORE_PATTERN.matcher(metricName);
+ if (cloudPattern.find()) {
+ coreName = cloudPattern.group("core");
+ CLOUD_LABEL_KEYS.forEach(
+ (key) -> {
+ labels.put(key, cloudPattern.group(key));
+ });
+ } else if (standalonePattern.find()) {
+ coreName = standalonePattern.group("core");
+ STANDALONE_LABEL_KEYS.forEach(
+ (key) -> {
+ labels.put(key, standalonePattern.group(key));
+ });
} else {
throw new SolrException(
SolrException.ErrorCode.SERVER_ERROR,
- "Core name does not match pattern for parsing " + coreName);
+ "Core name does not match pattern for parsing in metric " +
metricName);
}
}
}
diff --git
a/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreSearcherMetric.java
b/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreSearcherMetric.java
index 93071f9b8ad..7ca694d311d 100644
---
a/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreSearcherMetric.java
+++
b/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreSearcherMetric.java
@@ -29,9 +29,8 @@ public class SolrCoreSearcherMetric extends SolrCoreMetric {
public static final String CORE_SEARCHER_METRICS =
"solr_metrics_core_searcher_documents";
public static final String CORE_SEARCHER_TIMES =
"solr_metrics_core_average_searcher_warmup_time";
- public SolrCoreSearcherMetric(
- Metric dropwizardMetric, String coreName, String metricName, boolean
cloudMode) {
- super(dropwizardMetric, coreName, metricName, cloudMode);
+ public SolrCoreSearcherMetric(Metric dropwizardMetric, String metricName) {
+ super(dropwizardMetric, metricName);
}
/*
diff --git
a/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreTlogMetric.java
b/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreTlogMetric.java
index 29b13e1caee..7286c99d986 100644
---
a/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreTlogMetric.java
+++
b/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrCoreTlogMetric.java
@@ -24,9 +24,8 @@ import
org.apache.solr.metrics.prometheus.SolrPrometheusFormatter;
public class SolrCoreTlogMetric extends SolrCoreMetric {
public static final String CORE_TLOG_METRICS = "solr_metrics_core_tlog";
- public SolrCoreTlogMetric(
- Metric dropwizardMetric, String coreName, String metricName, boolean
cloudMode) {
- super(dropwizardMetric, coreName, metricName, cloudMode);
+ public SolrCoreTlogMetric(Metric dropwizardMetric, String metricName) {
+ super(dropwizardMetric, metricName);
}
/*
diff --git
a/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrPrometheusCoreFormatter.java
b/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrPrometheusCoreFormatter.java
index 6b2a49154f3..dd3ed025ddf 100644
---
a/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrPrometheusCoreFormatter.java
+++
b/solr/core/src/java/org/apache/solr/metrics/prometheus/core/SolrPrometheusCoreFormatter.java
@@ -28,13 +28,9 @@ import
org.apache.solr.metrics.prometheus.SolrPrometheusFormatter;
*/
public class SolrPrometheusCoreFormatter extends SolrPrometheusFormatter
implements PrometheusCoreFormatterInfo {
- public final String coreName;
- public final boolean cloudMode;
- public SolrPrometheusCoreFormatter(String coreName, boolean cloudMode) {
+ public SolrPrometheusCoreFormatter() {
super();
- this.coreName = coreName;
- this.cloudMode = cloudMode;
}
@Override
@@ -45,7 +41,7 @@ public class SolrPrometheusCoreFormatter extends
SolrPrometheusFormatter
@Override
public SolrMetric categorizeMetric(Metric dropwizardMetric, String
metricName) {
- String metricCategory = metricName.split("\\.", 2)[0];
+ String metricCategory = metricName.split("\\.", 3)[1];
if (!Enums.getIfPresent(PrometheusCoreFormatterInfo.CoreCategory.class,
metricCategory)
.isPresent()) {
return new SolrNoOpMetric();
@@ -55,17 +51,17 @@ public class SolrPrometheusCoreFormatter extends
SolrPrometheusFormatter
case QUERY:
case UPDATE:
case REPLICATION:
- return new SolrCoreHandlerMetric(dropwizardMetric, coreName,
metricName, cloudMode);
+ return new SolrCoreHandlerMetric(dropwizardMetric, metricName);
case TLOG:
- return new SolrCoreTlogMetric(dropwizardMetric, coreName, metricName,
cloudMode);
+ return new SolrCoreTlogMetric(dropwizardMetric, metricName);
case CACHE:
- return new SolrCoreCacheMetric(dropwizardMetric, coreName, metricName,
cloudMode);
+ return new SolrCoreCacheMetric(dropwizardMetric, metricName);
case SEARCHER:
- return new SolrCoreSearcherMetric(dropwizardMetric, coreName,
metricName, cloudMode);
+ return new SolrCoreSearcherMetric(dropwizardMetric, metricName);
case HIGHLIGHTER:
- return new SolrCoreHighlighterMetric(dropwizardMetric, coreName,
metricName, cloudMode);
+ return new SolrCoreHighlighterMetric(dropwizardMetric, metricName);
case INDEX:
- return new SolrCoreIndexMetric(dropwizardMetric, coreName, metricName,
cloudMode);
+ return new SolrCoreIndexMetric(dropwizardMetric, metricName);
case CORE:
default:
return new SolrNoOpMetric();
diff --git
a/solr/core/src/java/org/apache/solr/response/PrometheusResponseWriter.java
b/solr/core/src/java/org/apache/solr/response/PrometheusResponseWriter.java
index 5c6210603da..8689751a514 100644
--- a/solr/core/src/java/org/apache/solr/response/PrometheusResponseWriter.java
+++ b/solr/core/src/java/org/apache/solr/response/PrometheusResponseWriter.java
@@ -25,12 +25,11 @@ import
io.prometheus.metrics.expositionformats.PrometheusTextFormatWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.invoke.MethodHandles;
-import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Predicate;
-import java.util.stream.Collectors;
+import org.apache.solr.common.SolrException;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.metrics.AggregateMetric;
import org.apache.solr.metrics.prometheus.SolrPrometheusFormatter;
@@ -115,8 +114,10 @@ public class PrometheusResponseWriter extends
RawResponseWriter {
Metric dropwizardMetric = dropwizardMetrics.get(metricName);
formatter.exportDropwizardMetric(dropwizardMetric, metricName);
} catch (Exception e) {
- // Do not fail entirely for metrics exporting. Log and try to
export next metric
- log.warn("Error occurred exporting Dropwizard Metric to
Prometheus", e);
+ throw new SolrException(
+ SolrException.ErrorCode.SERVER_ERROR,
+ "Error occurred exporting Dropwizard Metric to Prometheus",
+ e);
}
});
@@ -124,21 +125,11 @@ public class PrometheusResponseWriter extends
RawResponseWriter {
}
public static SolrPrometheusFormatter getFormatterType(String registryName) {
- String coreName;
- boolean cloudMode = false;
String[] parsedRegistry = registryName.split("\\.");
switch (parsedRegistry[1]) {
case "core":
- if (parsedRegistry.length == 3) {
- coreName = parsedRegistry[2];
- } else if (parsedRegistry.length == 5) {
- coreName =
Arrays.stream(parsedRegistry).skip(1).collect(Collectors.joining("_"));
- cloudMode = true;
- } else {
- coreName = registryName;
- }
- return new SolrPrometheusCoreFormatter(coreName, cloudMode);
+ return new SolrPrometheusCoreFormatter();
case "jvm":
return new SolrPrometheusJvmFormatter();
case "jetty":
diff --git
a/solr/core/src/test/org/apache/solr/handler/admin/MetricsHandlerTest.java
b/solr/core/src/test/org/apache/solr/handler/admin/MetricsHandlerTest.java
index a90e059e03f..4c3709f5ae5 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/MetricsHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/MetricsHandlerTest.java
@@ -725,8 +725,7 @@ public class MetricsHandlerTest extends SolrTestCaseJ4 {
NamedList<?> values = resp.getValues();
assertNotNull(values.get("metrics"));
values = (NamedList<?>) values.get("metrics");
- SolrPrometheusFormatter formatter =
- (SolrPrometheusFormatter) values.get("solr.core.collection1");
+ SolrPrometheusFormatter formatter = (SolrPrometheusFormatter)
values.get("solr.core");
assertNotNull(formatter);
MetricSnapshots actualSnapshots = formatter.collect();
assertNotNull(actualSnapshots);
@@ -1009,8 +1008,7 @@ public class MetricsHandlerTest extends SolrTestCaseJ4 {
NamedList<?> values = resp.getValues();
assertNotNull(values.get("metrics"));
values = (NamedList<?>) values.get("metrics");
- SolrPrometheusFormatter formatter =
- (SolrPrometheusFormatter) values.get("solr.core.collection1");
+ SolrPrometheusFormatter formatter = (SolrPrometheusFormatter)
values.get("solr.core");
assertNotNull(formatter);
MetricSnapshots actualSnapshots = formatter.collect();
assertNotNull(actualSnapshots);
diff --git a/solr/core/src/test/org/apache/solr/metrics/SolrCoreMetricTest.java
b/solr/core/src/test/org/apache/solr/metrics/SolrCoreMetricTest.java
index 19a9fce2cbe..9ee34056e5e 100644
--- a/solr/core/src/test/org/apache/solr/metrics/SolrCoreMetricTest.java
+++ b/solr/core/src/test/org/apache/solr/metrics/SolrCoreMetricTest.java
@@ -26,12 +26,13 @@ import org.junit.Test;
public class SolrCoreMetricTest extends SolrTestCaseJ4 {
@Test
- public void testStandaloneDefaultLabels() throws InterruptedException {
- String expectedCoreName = "test_core";
+ public void testStandaloneDefaultLabels() {
+ String dropwizardMetricName = "core_Core_Name.test_core_metric";
+
+ String expectedCoreName = "Core_Name";
String expectedMetricName = "test_core_metric";
Labels expectedLabels = Labels.of("core", expectedCoreName);
- TestSolrCoreMetric testSolrCoreMetric =
- new TestSolrCoreMetric(null, expectedCoreName, expectedMetricName,
false);
+ TestSolrCoreMetric testSolrCoreMetric = new TestSolrCoreMetric(null,
dropwizardMetricName);
assertEquals(expectedCoreName, testSolrCoreMetric.coreName);
assertEquals(expectedMetricName, testSolrCoreMetric.metricName);
@@ -39,10 +40,12 @@ public class SolrCoreMetricTest extends SolrTestCaseJ4 {
}
@Test
- public void testCloudDefaultLabels() throws InterruptedException {
- String expectedCoreName = "core_test_core_shard1_replica_n1";
+ public void testCloudDefaultLabels() {
+ String dropwizardMetricName =
"core_Collection_Name_shard1_replica_n1.test_core_metric";
+
+ String expectedCoreName = "core_Collection_Name_shard1_replica_n1";
String expectedMetricName = "test_core_metric";
- String expectedCollectionName = "test_core";
+ String expectedCollectionName = "Collection_Name";
String expectedShardName = "shard1";
String expectedReplicaName = "replica_n1";
@@ -56,8 +59,7 @@ public class SolrCoreMetricTest extends SolrTestCaseJ4 {
expectedShardName,
"replica",
expectedReplicaName);
- TestSolrCoreMetric testSolrCoreMetric =
- new TestSolrCoreMetric(null, expectedCoreName, expectedMetricName,
true);
+ TestSolrCoreMetric testSolrCoreMetric = new TestSolrCoreMetric(null,
dropwizardMetricName);
assertEquals(expectedCoreName, testSolrCoreMetric.coreName);
assertEquals(expectedMetricName, testSolrCoreMetric.metricName);
@@ -65,9 +67,8 @@ public class SolrCoreMetricTest extends SolrTestCaseJ4 {
}
static class TestSolrCoreMetric extends SolrCoreMetric {
- public TestSolrCoreMetric(
- Metric dropwizardMetric, String coreName, String metricName, boolean
cloudMode) {
- super(dropwizardMetric, coreName, metricName, cloudMode);
+ public TestSolrCoreMetric(Metric dropwizardMetric, String metricName) {
+ super(dropwizardMetric, metricName);
}
@Override
diff --git
a/solr/core/src/test/org/apache/solr/metrics/SolrPrometheusFormatterTest.java
b/solr/core/src/test/org/apache/solr/metrics/SolrPrometheusFormatterTest.java
index 5c62910b43f..76077385800 100644
---
a/solr/core/src/test/org/apache/solr/metrics/SolrPrometheusFormatterTest.java
+++
b/solr/core/src/test/org/apache/solr/metrics/SolrPrometheusFormatterTest.java
@@ -16,7 +16,8 @@
*/
package org.apache.solr.metrics;
-import static
org.apache.solr.metrics.prometheus.core.PrometheusCoreFormatterInfo.CLOUD_CORE_PATTERN;
+import static
org.apache.solr.metrics.prometheus.core.SolrCoreMetric.CLOUD_CORE_PATTERN;
+import static
org.apache.solr.metrics.prometheus.core.SolrCoreMetric.STANDALONE_CORE_PATTERN;
import com.codahale.metrics.Counter;
import com.codahale.metrics.Gauge;
@@ -146,32 +147,42 @@ public class SolrPrometheusFormatterTest extends
SolrTestCaseJ4 {
@Test
public void testCloudCorePattern() {
- String coreName = "core_test-core_shard2_replica_t123";
- Matcher m = CLOUD_CORE_PATTERN.matcher(coreName);
+ String metricName =
"core_test-core_shard2_replica_t123.TEST./foobar/endpoint";
+ Matcher m = CLOUD_CORE_PATTERN.matcher(metricName);
assertTrue(m.find());
- assertEquals("test-core", m.group(1));
- assertEquals("shard2", m.group(2));
- assertEquals("replica_t123", m.group(3));
+ assertEquals("core_test-core_shard2_replica_t123", m.group("core"));
+ assertEquals("test-core", m.group("collection"));
+ assertEquals("shard2", m.group("shard"));
+ assertEquals("replica_t123", m.group("replica"));
- coreName = "core_foo_bar_shard24_replica_p8";
- m = CLOUD_CORE_PATTERN.matcher(coreName);
+ metricName = "core_foo_bar_shard24_replica_p8.QUERY.random.metric-name";
+ m = CLOUD_CORE_PATTERN.matcher(metricName);
assertTrue(m.matches());
- assertEquals("foo_bar", m.group(1));
- assertEquals("shard24", m.group(2));
- assertEquals("replica_p8", m.group(3));
+ assertEquals("core_foo_bar_shard24_replica_p8", m.group("core"));
+ assertEquals("foo_bar", m.group("collection"));
+ assertEquals("shard24", m.group("shard"));
+ assertEquals("replica_p8", m.group("replica"));
}
@Test
public void testBadCloudCorePattern() {
- String badCoreName = "core_solrtest_shard100_replica_xyz23";
- Matcher m = CLOUD_CORE_PATTERN.matcher(badCoreName);
+ String badMetricName =
"core_solrtest_shard100_replica_xyz23.TEST./foobar/endpoint";
+ Matcher m = CLOUD_CORE_PATTERN.matcher(badMetricName);
assertFalse(m.matches());
- badCoreName = "core_solrtest_shards100_replica_x23";
- m = CLOUD_CORE_PATTERN.matcher(badCoreName);
+ badMetricName =
"core_solrtest_shards100_replica_x23.QUERY.random.metric-name";
+ m = CLOUD_CORE_PATTERN.matcher(badMetricName);
assertFalse(m.matches());
}
+ @Test
+ public void testStandaloneCorePattern() {
+ String metricName = "core_test-core.TEST./foobar/endpoint";
+ Matcher m = STANDALONE_CORE_PATTERN.matcher(metricName);
+ assertTrue(m.find());
+ assertEquals("test-core", m.group(1));
+ }
+
static class TestSolrPrometheusFormatter extends SolrPrometheusFormatter {
@Override
public void exportDropwizardMetric(Metric dropwizardMetric, String
metricName) {}
diff --git
a/solr/core/src/test/org/apache/solr/response/TestPrometheusResponseWriter.java
b/solr/core/src/test/org/apache/solr/response/TestPrometheusResponseWriter.java
index 0e25201cce0..7f15a6ae894 100644
---
a/solr/core/src/test/org/apache/solr/response/TestPrometheusResponseWriter.java
+++
b/solr/core/src/test/org/apache/solr/response/TestPrometheusResponseWriter.java
@@ -23,7 +23,9 @@ import com.codahale.metrics.SettableGauge;
import com.codahale.metrics.SharedMetricRegistries;
import java.lang.invoke.MethodHandles;
import java.util.Arrays;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import java.util.stream.Collectors;
import org.apache.lucene.tests.util.LuceneTestCase;
import org.apache.solr.SolrTestCaseJ4;
@@ -83,8 +85,23 @@ public class TestPrometheusResponseWriter extends
SolrTestCaseJ4 {
NamedList<Object> res = adminClient.request(req);
assertNotNull("null response from server", res);
String output = (String) res.get("response");
+
+ Set<String> seenTypeInfo = new HashSet<>();
+
List<String> filteredResponse =
- output.lines().filter(line ->
!line.startsWith("#")).collect(Collectors.toList());
+ output
+ .lines()
+ .filter(
+ line -> {
+ if (!line.startsWith("#")) {
+ return true;
+ }
+ assertTrue(
+ "Prometheus exposition format cannot have duplicate
TYPE information",
+ seenTypeInfo.add(line));
+ return false;
+ })
+ .collect(Collectors.toList());
filteredResponse.forEach(
(actualMetric) -> {
String actualValue;