This is an automated email from the ASF dual-hosted git repository.
janhoy pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git
The following commit(s) were added to refs/heads/main by this push:
new 193b2e56bec SOLR-18165 Complete dot-separated metric name migration
(#4284)
193b2e56bec is described below
commit 193b2e56bec6e5e7b4916d8cb6b5b05b5fe33d8e
Author: Jan Høydahl <[email protected]>
AuthorDate: Tue May 19 13:52:08 2026 +0200
SOLR-18165 Complete dot-separated metric name migration (#4284)
---
.../SOLR-18165-More-dot-separated-metric-names.yml | 8 ++++++++
.../src/java/org/apache/solr/core/ZkContainer.java | 22 +++++++---------------
.../java/org/apache/solr/search/CaffeineCache.java | 12 ++++++------
.../apache/solr/security/AuditLoggerPlugin.java | 14 +++++++-------
.../solr/metrics/SolrMetricsIntegrationTest.java | 13 ++-----------
.../solr/crossdc/manager/consumer/OtelMetrics.java | 20 ++++++++++----------
.../manager/SolrAndKafkaIntegrationTest.java | 2 +-
.../crossdc/update/processor/ProducerMetrics.java | 18 +++++++++---------
.../pages/major-changes-in-solr-10.adoc | 13 ++++++++++---
9 files changed, 60 insertions(+), 62 deletions(-)
diff --git
a/changelog/unreleased/SOLR-18165-More-dot-separated-metric-names.yml
b/changelog/unreleased/SOLR-18165-More-dot-separated-metric-names.yml
new file mode 100644
index 00000000000..e73385037b4
--- /dev/null
+++ b/changelog/unreleased/SOLR-18165-More-dot-separated-metric-names.yml
@@ -0,0 +1,8 @@
+title: Complete dot-separated metric name migration
+type: changed
+authors:
+ - name: Jan Høydahl
+ url: https://home.apache.org/phonebook.html?uid=janhoy
+links:
+ - name: SOLR-18165
+ url: https://issues.apache.org/jira/browse/SOLR-18165
diff --git a/solr/core/src/java/org/apache/solr/core/ZkContainer.java
b/solr/core/src/java/org/apache/solr/core/ZkContainer.java
index 810eac98faa..a0c2ae569d5 100644
--- a/solr/core/src/java/org/apache/solr/core/ZkContainer.java
+++ b/solr/core/src/java/org/apache/solr/core/ZkContainer.java
@@ -155,7 +155,7 @@ public class ZkContainer {
var metricsListener = zkController.getZkClient().getMetrics();
ctx.observableLongCounter(
- "solr_zk_ops",
+ "solr.zk.ops",
"Total number of ZooKeeper operations",
measurement -> {
measurement.record(
@@ -176,7 +176,7 @@ public class ZkContainer {
});
ctx.observableLongCounter(
- "solr_zk_read",
+ "solr.zk.read",
"Total bytes read from ZooKeeper",
measurement -> {
measurement.record(metricsListener.getBytesRead(),
attributes);
@@ -184,14 +184,14 @@ public class ZkContainer {
OtelUnit.BYTES);
ctx.observableLongCounter(
- "solr_zk_watches_fired",
+ "solr.zk.watches_fired",
"Total number of ZooKeeper watches fired",
measurement -> {
measurement.record(metricsListener.getWatchesFired(),
attributes);
});
ctx.observableLongCounter(
- "solr_zk_written",
+ "solr.zk.written",
"Total bytes written to ZooKeeper",
measurement -> {
measurement.record(metricsListener.getBytesWritten(),
attributes);
@@ -199,26 +199,18 @@ public class ZkContainer {
OtelUnit.BYTES);
ctx.observableLongCounter(
- "solr_zk_cumulative_multi_ops_total",
+ "solr.zk.cumulative.multi_ops.total",
"Total cumulative multi-operations count",
measurement -> {
measurement.record(metricsListener.getCumulativeMultiOps(), attributes);
});
ctx.observableLongCounter(
- "solr_zk_child_fetches",
- "Total number of ZooKeeper child node fetches",
+ "solr.zk.get_children.ops",
+ "Total number of ZooKeeper getChildren calls",
measurement -> {
measurement.record(metricsListener.getChildFetches(),
attributes);
});
-
- ctx.observableLongCounter(
- "solr_zk_cumulative_children_fetched",
- "Total cumulative children fetched count",
- measurement -> {
- measurement.record(
- metricsListener.getCumulativeChildrenFetched(),
attributes);
- });
}
@Override
diff --git a/solr/core/src/java/org/apache/solr/search/CaffeineCache.java
b/solr/core/src/java/org/apache/solr/search/CaffeineCache.java
index 0cda3c59ba1..e43acb704cc 100644
--- a/solr/core/src/java/org/apache/solr/search/CaffeineCache.java
+++ b/solr/core/src/java/org/apache/solr/search/CaffeineCache.java
@@ -469,7 +469,7 @@ public class CaffeineCache<K, V> extends SolrCacheBase
@Override
public void initializeMetrics(SolrMetricsContext parentContext, Attributes
attributes) {
- initializeMetrics(parentContext, attributes, "solr_caffeine_cache");
+ initializeMetrics(parentContext, attributes, "solr.caffeine_cache");
}
public void initializeMetrics(
@@ -480,23 +480,23 @@ public class CaffeineCache<K, V> extends SolrCacheBase
ObservableLongMeasurement cacheLookupsMetric =
solrMetricsContext.longCounterMeasurement(
- metricName + "_lookups", "Number of cumulative cache lookup
results (hits and misses)");
+ metricName + ".lookups", "Number of cumulative cache lookup
results (hits and misses)");
ObservableLongMeasurement cacheOperationMetric =
solrMetricsContext.longCounterMeasurement(
- metricName + "_ops", "Number of cumulative cache operations
(inserts and evictions)");
+ metricName + ".ops", "Number of cumulative cache operations
(inserts and evictions)");
ObservableLongMeasurement sizeMetric =
solrMetricsContext.longGaugeMeasurement(
- metricName + "_size", "Current number cache entries");
+ metricName + ".size", "Current number of cache entries");
ObservableLongMeasurement ramBytesUsedMetric =
solrMetricsContext.longGaugeMeasurement(
- metricName + "_ram_used", "RAM bytes used by cache",
OtelUnit.BYTES);
+ metricName + ".ram_used", "RAM bytes used by cache",
OtelUnit.BYTES);
ObservableLongMeasurement warmupTimeMetric =
solrMetricsContext.longGaugeMeasurement(
- metricName + "_warmup_time", "Cache warmup time (most recent)",
OtelUnit.MILLISECONDS);
+ metricName + ".warmup_time", "Cache warmup time (most recent)",
OtelUnit.MILLISECONDS);
solrMetricsContext.batchCallback(
() -> {
diff --git a/solr/core/src/java/org/apache/solr/security/AuditLoggerPlugin.java
b/solr/core/src/java/org/apache/solr/security/AuditLoggerPlugin.java
index ec0ee1acd0d..cf46b3e13be 100644
--- a/solr/core/src/java/org/apache/solr/security/AuditLoggerPlugin.java
+++ b/solr/core/src/java/org/apache/solr/security/AuditLoggerPlugin.java
@@ -276,31 +276,31 @@ public abstract class AuditLoggerPlugin implements
Closeable, Runnable, SolrInfo
numLogged =
new AttributedLongCounter(
solrMetricsContext.longCounter(
- "solr_auditlogger_count",
+ "solr.auditlogger.count",
"The number of audit events that were successfully logged."),
attrsWithCategory);
numErrors =
new AttributedLongCounter(
solrMetricsContext.longCounter(
- "solr_auditlogger_errors", "The number of audit events that
resulted in errors."),
+ "solr.auditlogger.errors", "The number of audit events that
resulted in errors."),
attrsWithCategory);
numLost =
new AttributedLongCounter(
solrMetricsContext.longCounter(
- "solr_auditlogger_lost",
+ "solr.auditlogger.lost",
"The number of audit events that were lost due to async queue
being full."),
attrsWithCategory);
requestTimes =
new AttributedLongTimer(
this.solrMetricsContext.longHistogram(
- "solr_auditlogger_request_times",
+ "solr.auditlogger.request_times",
"Distribution of audit event request durations",
OtelUnit.NANOSECONDS),
attrsWithCategory);
if (async) {
solrMetricsContext.observableLongGauge(
- "solr_auditlogger_queue",
+ "solr.auditlogger.queue",
"Metrics around the audit logger queue when running in async mode",
(observableLongMeasurement -> {
observableLongMeasurement.record(
@@ -313,7 +313,7 @@ public abstract class AuditLoggerPlugin implements
Closeable, Runnable, SolrInfo
queuedTime =
new AttributedLongTimer(
solrMetricsContext.longHistogram(
- "solr_auditlogger_queued_time",
+ "solr.auditlogger.queued_time",
"Distribution of time events spend queued before processing",
OtelUnit.NANOSECONDS),
attrsWithCategory);
@@ -322,7 +322,7 @@ public abstract class AuditLoggerPlugin implements
Closeable, Runnable, SolrInfo
AttributedLongGauge asyncEnabledGauge =
new AttributedLongGauge(
solrMetricsContext.longGauge(
- "solr_auditlogger_async_enabled",
+ "solr.auditlogger.async_enabled",
"Whether the audit logger is running in async mode (1) or not
(0)"),
attrsWithCategory);
asyncEnabledGauge.set(async ? 1L : 0L);
diff --git
a/solr/core/src/test/org/apache/solr/metrics/SolrMetricsIntegrationTest.java
b/solr/core/src/test/org/apache/solr/metrics/SolrMetricsIntegrationTest.java
index 723b4f681e4..ad9bcf5a479 100644
--- a/solr/core/src/test/org/apache/solr/metrics/SolrMetricsIntegrationTest.java
+++ b/solr/core/src/test/org/apache/solr/metrics/SolrMetricsIntegrationTest.java
@@ -126,12 +126,8 @@ public class SolrMetricsIntegrationTest extends
SolrTestCaseJ4 {
try (SolrClient solrClient = j.newClient()) {
assertNotNull(solrClient);
HttpClient httpClient = j.getSolrClient().getHttpClient();
- var initialChildrenFetched =
- SolrMetricTestUtils.getCounterDatapoint(
- reader, "solr_zk_cumulative_children_fetched", baseLabels)
- .getValue();
var initialChildFetches =
- SolrMetricTestUtils.getCounterDatapoint(reader,
"solr_zk_child_fetches", baseLabels)
+ SolrMetricTestUtils.getCounterDatapoint(reader,
"solr_zk_get_children_ops", baseLabels)
.getValue();
var initialExistsOp =
SolrMetricTestUtils.getCounterDatapoint(
@@ -141,19 +137,14 @@ public class SolrMetricsIntegrationTest extends
SolrTestCaseJ4 {
// Send GET request to trigger some metrics
httpClient.GET(j.getBaseURLV2() +
"/cluster/zookeeper/children/live_nodes");
- var childrenFetched =
- SolrMetricTestUtils.getCounterDatapoint(
- reader, "solr_zk_cumulative_children_fetched", baseLabels)
- .getValue();
var childFetches =
- SolrMetricTestUtils.getCounterDatapoint(reader,
"solr_zk_child_fetches", baseLabels)
+ SolrMetricTestUtils.getCounterDatapoint(reader,
"solr_zk_get_children_ops", baseLabels)
.getValue();
var existsOp =
SolrMetricTestUtils.getCounterDatapoint(
reader, "solr_zk_ops", builder.label("ops",
"exists").build())
.getValue();
- assertTrue(childrenFetched - initialChildrenFetched >= 3.0);
assertTrue(childFetches - initialChildFetches >= 1.0);
assertTrue(existsOp - initialExistsOp >= 4.0);
}
diff --git
a/solr/cross-dc-manager/src/java/org/apache/solr/crossdc/manager/consumer/OtelMetrics.java
b/solr/cross-dc-manager/src/java/org/apache/solr/crossdc/manager/consumer/OtelMetrics.java
index 1c0fcd5bc77..3e5edbea216 100644
---
a/solr/cross-dc-manager/src/java/org/apache/solr/crossdc/manager/consumer/OtelMetrics.java
+++
b/solr/cross-dc-manager/src/java/org/apache/solr/crossdc/manager/consumer/OtelMetrics.java
@@ -32,8 +32,8 @@ import org.apache.solr.opentelemetry.OtlpExporterFactory;
public class OtelMetrics implements ConsumerMetrics {
- public static final String REGISTRY = "crossdc.consumer.registry";
- public static final String NAME_PREFIX = "crossdc_consumer_";
+ public static final String REGISTRY = "solr.crossdc.consumer.registry";
+ public static final String NAME_PREFIX = "solr.crossdc.consumer.";
public static final String ATTR_TYPE = "type";
public static final String ATTR_SUBTYPE = "subtype";
public static final String ATTR_RESULT = "result";
@@ -61,36 +61,36 @@ public class OtelMetrics implements ConsumerMetrics {
inputMsg =
metricsContext.longCounter(
- NAME_PREFIX + "input_msg_total", "Total number of input Kafka
messages");
+ NAME_PREFIX + "input.msg.total", "Total number of input Kafka
messages");
inputReq =
metricsContext.longCounter(
- NAME_PREFIX + "input_req_total", "Total number of input Solr
requests");
+ NAME_PREFIX + "input.req.total", "Total number of input Solr
requests");
collapsed =
metricsContext.longCounter(
- NAME_PREFIX + "collapsed_total", "Total number of collapsed update
requests");
+ NAME_PREFIX + "collapsed.total", "Total number of collapsed update
requests");
output =
- metricsContext.longCounter(NAME_PREFIX + "output_total", "Total number
of output requests");
+ metricsContext.longCounter(NAME_PREFIX + "output.total", "Total number
of output requests");
outputBatchSizeHistogram =
metricsContext.longHistogram(
- NAME_PREFIX + "output_batch_size", "Histogram of output batch
sizes");
+ NAME_PREFIX + "output.batch_size", "Histogram of output batch
sizes");
outputBackoffHistogram =
metricsContext.longHistogram(
- NAME_PREFIX + "output_backoff_time", "Histogram of output backoff
sleep times");
+ NAME_PREFIX + "output.backoff_time", "Histogram of output backoff
sleep times");
outputTimeHistogram =
metricsContext.longHistogram(
- NAME_PREFIX + "output_time",
+ NAME_PREFIX + "output.time",
"Histogram of output request times",
OtelUnit.MILLISECONDS);
outputFirstAttemptHistogram =
metricsContext.longHistogram(
- NAME_PREFIX + "output_first_attempt_time",
+ NAME_PREFIX + "output.first_attempt_time",
"Histogram of first attempt request times",
OtelUnit.MILLISECONDS);
}
diff --git
a/solr/cross-dc-manager/src/test/org/apache/solr/crossdc/manager/SolrAndKafkaIntegrationTest.java
b/solr/cross-dc-manager/src/test/org/apache/solr/crossdc/manager/SolrAndKafkaIntegrationTest.java
index 73b6bd8abd5..8e8b31d69d2 100644
---
a/solr/cross-dc-manager/src/test/org/apache/solr/crossdc/manager/SolrAndKafkaIntegrationTest.java
+++
b/solr/cross-dc-manager/src/test/org/apache/solr/crossdc/manager/SolrAndKafkaIntegrationTest.java
@@ -549,7 +549,7 @@ public class SolrAndKafkaIntegrationTest extends
SolrCloudTestCase {
String content =
IOUtils.toString(
(InputStream) rsp.get(InputStreamResponseParser.STREAM_KEY),
StandardCharsets.UTF_8);
- assertTrue(content, content.contains("crossdc_consumer_output_total"));
+ assertTrue(content,
content.contains("solr_crossdc_consumer_output_total"));
// test the healtcheck endpoint
req = new GenericSolrRequest(SolrRequest.METHOD.GET, "/health");
diff --git
a/solr/modules/cross-dc/src/java/org/apache/solr/crossdc/update/processor/ProducerMetrics.java
b/solr/modules/cross-dc/src/java/org/apache/solr/crossdc/update/processor/ProducerMetrics.java
index b456fd0d48c..15af5478219 100644
---
a/solr/modules/cross-dc/src/java/org/apache/solr/crossdc/update/processor/ProducerMetrics.java
+++
b/solr/modules/cross-dc/src/java/org/apache/solr/crossdc/update/processor/ProducerMetrics.java
@@ -24,7 +24,7 @@ import org.apache.solr.metrics.otel.OtelUnit;
import org.apache.solr.metrics.otel.instruments.AttributedLongCounter;
import org.apache.solr.metrics.otel.instruments.AttributedLongHistogram;
-/** Metrics presented for each SolrCore using `crossdc.producer.` path. */
+/** Metrics presented for each SolrCore using `solr.crossdc.producer.` path. */
public class ProducerMetrics {
private final AttributedLongCounter local;
@@ -47,36 +47,36 @@ public class ProducerMetrics {
var localProcessed =
solrMetricsContext.longCounter(
- "solr.core.crossdc.producer.local.processed",
+ "solr.crossdc.producer.local.processed",
"The number of local documents processed (success or error)");
var localSubmitted =
solrMetricsContext.longCounter(
- "solr.core.crossdc.producer.submitted",
+ "solr.crossdc.producer.submitted",
"The number of documents submitted to the Kafka topic (success or
error)");
var localSubmittedAdd =
solrMetricsContext.longCounter(
- "solr.core.crossdc.producer.submitted.add",
+ "solr.crossdc.producer.submitted.add",
"The number of add requests submitted to the Kafka topic (success
or error)");
var localSubmittedDbi =
solrMetricsContext.longCounter(
- "solr.core.crossdc.producer.submitted.delete_by_id",
+ "solr.crossdc.producer.submitted.delete_by_id",
"The number of Delete-By-Id requests submitted to the Kafka topic
(success or error)");
var localSubmittedDbq =
solrMetricsContext.longCounter(
- "solr.core.crossdc.producer.submitted.delete_by_query",
+ "solr.crossdc.producer.submitted.delete_by_query",
"The number of Delete-By-Query requests submitted to the Kafka
topic (success or error)");
var localSubmittedCommit =
solrMetricsContext.longCounter(
- "solr.core.crossdc.producer.submitted.commit",
+ "solr.crossdc.producer.submitted.commit",
"The number of standalone Commit requests submitted to the Kafka
topic (success or error)");
var histogramDocSizes =
solrMetricsContext.longHistogram(
- "solr.core.crossdc.producer.document_size",
+ "solr.crossdc.producer.document_size",
"Histogram of the processed document sizes processed",
OtelUnit.BYTES);
var tooLargeErrors =
solrMetricsContext.longCounter(
- "solr.core.crossdc.producer.doc_too_large_errors",
+ "solr.crossdc.producer.doc_too_large_errors",
"The number of documents that were too large to send to the Kafka
topic");
this.local =
diff --git
a/solr/solr-ref-guide/modules/upgrade-notes/pages/major-changes-in-solr-10.adoc
b/solr/solr-ref-guide/modules/upgrade-notes/pages/major-changes-in-solr-10.adoc
index e9f0a7d2908..9dcec0644e9 100644
---
a/solr/solr-ref-guide/modules/upgrade-notes/pages/major-changes-in-solr-10.adoc
+++
b/solr/solr-ref-guide/modules/upgrade-notes/pages/major-changes-in-solr-10.adoc
@@ -355,10 +355,17 @@ For example, `solr_core_requests` is now
`solr.core.requests`, and `solr_node_ex
*Workaround for OTLP consumers depending on the old names:*
Users who consume Solr metrics via OTLP and rely on the 10.0 underscore-format
names can use metric renaming or transformation features in their OpenTelemetry
Collector pipeline to convert the new dot-separated names back to the old
format during the transition.
-==== Metric `solr_core_indexsearcher_open_warmup_time` removed
+==== Metric that are Removed or Changed
-The metric `solr_core_indexsearcher_open_warmup_time` has been removed as it
duplicated `solr_core_indexsearcher_warmup_time`.
-Update your dashboards to use `solr_core_indexsearcher_warmup_time` instead.
+* The metric `solr_core_indexsearcher_open_warmup_time` has been removed as it
duplicated `solr_core_indexsearcher_warmup_time`
+* The metric `solr.zk.cumulative.children_fetched` has been removed
+* The metric `solr.zk.child.fetches` is now `solr.zk.get_children.ops`
+* All CrossDC consumer metrics have been renamed: `crossdc.consumer.*` →
`solr.crossdc.consumer.*`
+ (e.g., `crossdc.consumer.output.total` →
`solr.crossdc.consumer.output.total`)
+* All CrossDC producer metrics have been renamed:
`solr.core.crossdc.producer.*` → `solr.crossdc.producer.*`
+ (e.g., `solr.core.crossdc.producer.submitted` →
`solr.crossdc.producer.submitted`)
+
+Update your dashboards or other metrics consumers accordingly.
==== Overseer Status Metrics Removed