Skip to content

Commit f3e91d2

Browse files
janhoymlbiscocchan-dx
authored
SOLR-18165 Use dot separated metric names (#4223)
Co-authored-by: Matthew Biscocho <[email protected]> Co-authored-by: Chan Chan <[email protected]>
1 parent a9e25b6 commit f3e91d2

File tree

21 files changed

+136
-94
lines changed

21 files changed

+136
-94
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
title: Use dot-separated OTel metric names for OTLP export. This is a back-compat break from version 10.0
2+
type: changed
3+
authors:
4+
- name: Jan Høydahl
5+
url: https://home.apache.org/phonebook.html?uid=janhoy
6+
- name: Matthew Biscocho
7+
links:
8+
- name: SOLR-18165
9+
url: https://issues.apache.org/jira/browse/SOLR-18165

solr/core/src/java/org/apache/solr/core/CoreContainer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -814,7 +814,7 @@ private void loadInternal() {
814814
caffeineCache.initializeMetrics(
815815
solrMetricsContext,
816816
Attributes.builder().put(NAME_ATTR, cacheName).build(),
817-
"solr_node_cache");
817+
"solr.node.cache");
818818
}
819819
m.put(cacheName, c);
820820
}
@@ -957,7 +957,7 @@ private void loadInternal() {
957957
ExecutorUtil.newMDCAwareFixedThreadPool(
958958
cfg.getCoreLoadThreadCount(isZooKeeperAware()),
959959
new SolrNamedThreadFactory("coreLoadExecutor")),
960-
"solr_node_executor",
960+
"solr.node.executor",
961961
"coreLoadExecutor",
962962
SolrInfoBean.Category.CONTAINER);
963963

solr/core/src/java/org/apache/solr/core/SolrCore.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1323,47 +1323,47 @@ public void initializeMetrics(SolrMetricsContext parentContext, Attributes attri
13231323
newSearcherCounter =
13241324
new AttributedLongCounter(
13251325
parentContext.longCounter(
1326-
"solr_core_searcher_new", "Total number of new searchers opened"),
1326+
"solr.core.searcher.new", "Total number of new searchers opened"),
13271327
baseSearcherAttributes);
13281328

13291329
newSearcherMaxReachedCounter =
13301330
new AttributedLongCounter(
13311331
parentContext.longCounter(
1332-
"solr_core_searcher_warming_max",
1332+
"solr.core.searcher.warming_max",
13331333
"Total number of maximum concurrent warming searchers reached"),
13341334
baseSearcherAttributes);
13351335

13361336
newSearcherOtherErrorsCounter =
13371337
new AttributedLongCounter(
13381338
parentContext.longCounter(
1339-
"solr_core_searcher_errors", "Total number of searcher errors"),
1339+
"solr.core.searcher.errors", "Total number of searcher errors"),
13401340
baseSearcherAttributes);
13411341

13421342
newSearcherTimer =
13431343
new AttributedLongTimer(
13441344
parentContext.longHistogram(
1345-
"solr_core_indexsearcher_open_time",
1345+
"solr.core.indexsearcher.open.time",
13461346
"Time to open new searchers",
13471347
OtelUnit.MILLISECONDS),
13481348
baseSearcherAttributes);
13491349

13501350
newSearcherWarmupTimer =
13511351
new AttributedLongTimer(
13521352
parentContext.longHistogram(
1353-
"solr_core_indexsearcher_open_warmup_time",
1353+
"solr.core.indexsearcher.open.warmup.time",
13541354
"Time to warmup new searchers",
13551355
OtelUnit.MILLISECONDS),
13561356
baseSearcherAttributes);
13571357

13581358
parentContext.observableLongGauge(
1359-
"solr_core_ref_count",
1359+
"solr.core.ref_count",
13601360
"The current number of active references to a Solr core",
13611361
(observableLongMeasurement -> {
13621362
observableLongMeasurement.record(getOpenCount(), baseGaugeCoreAttributes);
13631363
}));
13641364

13651365
parentContext.observableDoubleGauge(
1366-
"solr_core_disk_space",
1366+
"solr.core.disk_space",
13671367
"Solr core disk space metrics",
13681368
(observableDoubleMeasurement -> {
13691369

@@ -1397,7 +1397,7 @@ public void initializeMetrics(SolrMetricsContext parentContext, Attributes attri
13971397
OtelUnit.MEGABYTES);
13981398

13991399
parentContext.observableDoubleGauge(
1400-
"solr_core_index_size",
1400+
"solr.core.index.size",
14011401
"Index size for a Solr core",
14021402
(observableDoubleMeasurement -> {
14031403
if (!isClosed())
@@ -1407,7 +1407,7 @@ public void initializeMetrics(SolrMetricsContext parentContext, Attributes attri
14071407
OtelUnit.MEGABYTES);
14081408

14091409
parentContext.observableLongGauge(
1410-
"solr_core_segments",
1410+
"solr.core.segments",
14111411
"Number of segments in a Solr core",
14121412
(observableLongMeasurement -> {
14131413
if (isReady())
@@ -1416,7 +1416,7 @@ public void initializeMetrics(SolrMetricsContext parentContext, Attributes attri
14161416

14171417
if (coreContainer.isZooKeeperAware())
14181418
parentContext.observableLongGauge(
1419-
"solr_core_is_leader",
1419+
"solr.core.is_leader",
14201420
"Indicates whether this Solr core is currently the leader",
14211421
(observableLongMeasurement -> {
14221422
observableLongMeasurement.record(

solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -879,55 +879,55 @@ public void initializeMetrics(SolrMetricsContext parentContext, Attributes attri
879879

880880
ObservableDoubleMeasurement indexSizeMetric =
881881
solrMetricsContext.doubleGaugeMeasurement(
882-
"solr_core_replication_index_size",
882+
"solr.core.replication.index.size",
883883
"Size of the index in megabytes",
884884
OtelUnit.MEGABYTES);
885885

886886
ObservableLongMeasurement indexVersionMetric =
887887
solrMetricsContext.longGaugeMeasurement(
888-
"solr_core_replication_index_version", "Current index version");
888+
"solr.core.replication.index.version", "Current index version");
889889

890890
ObservableLongMeasurement indexGenerationMetric =
891891
solrMetricsContext.longGaugeMeasurement(
892-
"solr_core_replication_index_generation", "Current index generation");
892+
"solr.core.replication.index.generation", "Current index generation");
893893

894894
ObservableLongMeasurement isLeaderMetric =
895895
solrMetricsContext.longGaugeMeasurement(
896-
"solr_core_replication_is_leader", "Whether this node is a leader (1) or not (0)");
896+
"solr.core.replication.is_leader", "Whether this node is a leader (1) or not (0)");
897897

898898
ObservableLongMeasurement isFollowerMetric =
899899
solrMetricsContext.longGaugeMeasurement(
900-
"solr_core_replication_is_follower", "Whether this node is a follower (1) or not (0)");
900+
"solr.core.replication.is_follower", "Whether this node is a follower (1) or not (0)");
901901

902902
ObservableLongMeasurement replicationEnabledMetric =
903903
solrMetricsContext.longGaugeMeasurement(
904-
"solr_core_replication_is_enabled", "Whether replication is enabled (1) or not (0)");
904+
"solr.core.replication.is_enabled", "Whether replication is enabled (1) or not (0)");
905905

906906
ObservableLongMeasurement isPollingDisabledMetric =
907907
solrMetricsContext.longGaugeMeasurement(
908-
"solr_core_replication_is_polling_disabled",
908+
"solr.core.replication.is_polling_disabled",
909909
"Whether polling is disabled (1) or not (0)");
910910

911911
ObservableLongMeasurement isReplicatingMetric =
912912
solrMetricsContext.longGaugeMeasurement(
913-
"solr_core_replication_is_replicating",
913+
"solr.core.replication.is_replicating",
914914
"Whether replication is in progress (1) or not (0)");
915915

916916
ObservableLongMeasurement timeElapsedMetric =
917917
solrMetricsContext.longGaugeMeasurement(
918-
"solr_core_replication_time_elapsed",
918+
"solr.core.replication.time_elapsed",
919919
"Time elapsed during replication in seconds",
920920
OtelUnit.SECONDS);
921921

922922
ObservableLongMeasurement bytesDownloadedMetric =
923923
solrMetricsContext.longGaugeMeasurement(
924-
"solr_core_replication_downloaded_size",
924+
"solr.core.replication.downloaded_size",
925925
"Total bytes downloaded during replication",
926926
OtelUnit.BYTES);
927927

928928
ObservableLongMeasurement downloadSpeedMetric =
929929
solrMetricsContext.longGaugeMeasurement(
930-
"solr_core_replication_download_speed", "Download speed in bytes per second");
930+
"solr.core.replication.download_speed", "Download speed in bytes per second");
931931

932932
solrMetricsContext.batchCallback(
933933
() -> {

solr/core/src/java/org/apache/solr/handler/RequestHandlerBase.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -187,27 +187,27 @@ public HandlerMetrics(
187187

188188
requests =
189189
factory.attributedLongCounter(
190-
"solr_core_requests", "HTTP Solr requests", Attributes.empty());
190+
"solr.core.requests", "HTTP Solr requests", Attributes.empty());
191191

192192
numServerErrors =
193193
factory.attributedLongCounter(
194-
"solr_core_requests_errors",
194+
"solr.core.requests.errors",
195195
"HTTP Solr request errors",
196196
Attributes.of(SOURCE_ATTR, "server"));
197197

198198
numClientErrors =
199199
factory.attributedLongCounter(
200-
"solr_core_requests_errors",
200+
"solr.core.requests.errors",
201201
"HTTP Solr request errors",
202202
Attributes.of(SOURCE_ATTR, "client"));
203203

204204
numTimeouts =
205205
factory.attributedLongCounter(
206-
"solr_core_requests_timeout", "HTTP Solr request timeouts", Attributes.empty());
206+
"solr.core.requests.timeout", "HTTP Solr request timeouts", Attributes.empty());
207207

208208
requestTimes =
209209
factory.attributedLongTimer(
210-
"solr_core_requests_times",
210+
"solr.core.requests.times",
211211
"HTTP Solr request times",
212212
OtelUnit.MILLISECONDS,
213213
Attributes.empty());

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,14 +132,14 @@ public void initializeMetrics(SolrMetricsContext parentContext, Attributes attri
132132
coreAdminAsyncTracker.standardExecutor =
133133
solrMetricsContext.instrumentedExecutorService(
134134
coreAdminAsyncTracker.standardExecutor,
135-
"solr_node_executor",
135+
"solr.node.executor",
136136
"asyncCoreAdminExecutor",
137137
getCategory());
138138

139139
coreAdminAsyncTracker.expensiveExecutor =
140140
solrMetricsContext.instrumentedExecutorService(
141141
coreAdminAsyncTracker.expensiveExecutor,
142-
"solr_node_expensive_executor",
142+
"solr.node.expensive.executor",
143143
"asyncCoreExpensiveAdminExecutor",
144144
getCategory());
145145
}

solr/core/src/java/org/apache/solr/handler/component/HttpShardHandlerFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,6 @@ public void initializeMetrics(SolrMetricsContext parentContext, Attributes attri
439439
httpListenerFactory.initializeMetrics(solrMetricsContext, Attributes.empty());
440440
commExecutor =
441441
solrMetricsContext.instrumentedExecutorService(
442-
commExecutor, "solr_core_executor", "httpShardExecutor", SolrInfoBean.Category.QUERY);
442+
commExecutor, "solr.core.executor", "httpShardExecutor", SolrInfoBean.Category.QUERY);
443443
}
444444
}

solr/core/src/java/org/apache/solr/handler/component/SuggestComponent.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -387,9 +387,8 @@ public void initializeMetrics(SolrMetricsContext parentContext, Attributes attri
387387
super.initializeMetrics(parentContext, attributes);
388388
var suggesterAttributes =
389389
attributes.toBuilder().put(CATEGORY_ATTR, getCategory().toString()).build();
390-
391390
this.solrMetricsContext.observableLongGauge(
392-
"solr_core_suggester_total_size",
391+
"solr.core.suggester.total.size",
393392
"Total memory size in bytes of all suggester",
394393
(observableLongMeasurement) -> {
395394
observableLongMeasurement.record(ramBytesUsed(), suggesterAttributes);

solr/core/src/java/org/apache/solr/metrics/otel/FilterablePrometheusMetricReader.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,9 @@ public MetricSnapshots collect(
6565
return super.collect();
6666
}
6767

68-
// Prometheus appends a suffix to the metrics depending on the metric type. We need to sanitize
69-
// the suffix off if they filter by Prometheus name instead of OTEL name.
68+
// Users may filter by Prometheus-format names (e.g. "solr_core_requests") or with a
69+
// Prometheus type suffix (e.g. "solr_core_requests_total"). Strip any such suffix so we can
70+
// compare against the Prometheus base name returned by getMetadata().getPrometheusName().
7071
Set<String> sanitizedNames =
7172
includedNames.stream()
7273
.map(
@@ -84,7 +85,18 @@ public MetricSnapshots collect(
8485
if (sanitizedNames.isEmpty()) {
8586
snapshotsToFilter = super.collect();
8687
} else {
87-
snapshotsToFilter = super.collect(sanitizedNames::contains);
88+
// We collect all metrics and filter by Prometheus name rather than using
89+
// super.collect(Predicate) which matches on OTel internal names. This avoids a mismatch
90+
// when OTel names use dot-separators (e.g. "solr.core.requests") but users filter by the
91+
// Prometheus underscore-format name they see in the output (e.g. "solr_core_requests").
92+
MetricSnapshots all = super.collect();
93+
MetricSnapshots.Builder nameFiltered = MetricSnapshots.builder();
94+
for (MetricSnapshot snapshot : all) {
95+
if (sanitizedNames.contains(snapshot.getMetadata().getPrometheusName())) {
96+
nameFiltered.metricSnapshot(snapshot);
97+
}
98+
}
99+
snapshotsToFilter = nameFiltered.build();
88100
}
89101

90102
// Return named filtered snapshots if not label filters provided

solr/core/src/java/org/apache/solr/metrics/otel/instruments/AttributedInstrumentFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ public AttributedLongTimer attributedLongTimer(
133133

134134
/** Replace core metric name prefix to node prefix */
135135
private String toNodeMetricName(String coreMetricName) {
136-
return coreMetricName.replace("solr_core", "solr_node");
136+
return coreMetricName.replace("solr.core", "solr.node");
137137
}
138138

139139
/** Filter out core attributes and keep all others for node-level metrics */

0 commit comments

Comments
 (0)