Skip to content

Commit 842b993

Browse files
committed
__name__ can't be used in labels
Signed-off-by: Gregor Zeitlinger <[email protected]>
1 parent a928ea7 commit 842b993

File tree

2 files changed

+19
-32
lines changed

2 files changed

+19
-32
lines changed

prometheus-metrics-model/src/main/java/io/prometheus/metrics/model/snapshots/PrometheusNaming.java

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@ public class PrometheusNaming {
3030
*/
3131
public static final String ESCAPING_KEY = "escaping";
3232

33-
private static final String METRIC_NAME_LABEL = "__name__";
34-
3533
private static final Pattern METRIC_NAME_PATTERN = Pattern.compile("^[a-zA-Z_:][a-zA-Z0-9_:]*$");
3634

3735
/** Legal characters for label names. */
@@ -290,19 +288,15 @@ public static MetricSnapshot escapeMetricSnapshot(MetricSnapshot v, EscapingSche
290288
List<DataPointSnapshot> outDataPoints = new ArrayList<>();
291289

292290
for (DataPointSnapshot d : v.getDataPoints()) {
293-
if (!metricNeedsEscaping(d)) {
291+
if (!metricNeedsEscaping(d, scheme)) {
294292
outDataPoints.add(d);
295293
continue;
296294
}
297295

298296
Labels.Builder outLabelsBuilder = Labels.builder();
299297

300298
for (Label l : d.getLabels()) {
301-
if (METRIC_NAME_LABEL.equals(l.getName())) {
302-
outLabelsBuilder.label(l.getName(), escapeName(l.getValue(), scheme));
303-
} else {
304-
outLabelsBuilder.label(escapeName(l.getName(), scheme), l.getValue());
305-
}
299+
outLabelsBuilder.label(escapeName(l.getName(), scheme), l.getValue());
306300
}
307301

308302
Labels outLabels = outLabelsBuilder.build();
@@ -314,13 +308,10 @@ public static MetricSnapshot escapeMetricSnapshot(MetricSnapshot v, EscapingSche
314308
v, escapeName(v.getMetadata().getName(), scheme), outDataPoints);
315309
}
316310

317-
static boolean metricNeedsEscaping(DataPointSnapshot d) {
311+
static boolean metricNeedsEscaping(DataPointSnapshot d, EscapingScheme scheme) {
318312
Labels labels = d.getLabels();
319313
for (Label l : labels) {
320-
if (l.getName().equals(METRIC_NAME_LABEL) && !isValidLegacyMetricName(l.getValue())) {
321-
return true;
322-
}
323-
if (!isValidLegacyMetricName(l.getName())) {
314+
if (needsEscaping(l.getName(), scheme)) {
324315
return true;
325316
}
326317
}
@@ -479,11 +470,7 @@ private static MetricSnapshot createEscapedMetricSnapshot(
479470
* which by definition is a noop). This method does not do any validation of the name.
480471
*/
481472
public static String escapeName(String name, EscapingScheme scheme) {
482-
boolean noEscapeNeeded =
483-
isValidLegacyMetricName(name)
484-
&& !(scheme == EscapingScheme.DOTS_ESCAPING
485-
&& (name.contains(".") || name.contains("_")));
486-
if (name.isEmpty() || noEscapeNeeded) {
473+
if (name.isEmpty() || !needsEscaping(name, scheme)) {
487474
return name;
488475
}
489476

@@ -547,6 +534,11 @@ public static String escapeName(String name, EscapingScheme scheme) {
547534
}
548535
}
549536

537+
private static boolean needsEscaping(String name, EscapingScheme scheme) {
538+
return !isValidLegacyMetricName(name)
539+
|| (scheme == EscapingScheme.DOTS_ESCAPING && (name.contains(".") || name.contains("_")));
540+
}
541+
550542
/**
551543
* Unescapes the incoming name according to the provided escaping scheme if possible. Some schemes
552544
* are partially or totally non-roundtripable. If any error is encountered, returns the original

prometheus-metrics-model/src/test/java/io/prometheus/metrics/model/snapshots/PrometheusNamingTest.java

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,7 @@ public void testEmptyUnitName() {
104104

105105
@ParameterizedTest
106106
@MethodSource("nameIsValid")
107-
public void testLabelNameIsValidUtf8(
108-
String labelName, boolean utf8Valid) {
107+
public void testLabelNameIsValidUtf8(String labelName, boolean utf8Valid) {
109108
assertMetricName(labelName, utf8Valid);
110109
assertLabelName(labelName, utf8Valid);
111110
}
@@ -128,13 +127,13 @@ static Stream<Arguments> nameIsValid() {
128127
Arguments.of("Avalid_23name", true),
129128
Arguments.of("_Avalid_23name", true),
130129
Arguments.of("1valid_23name", true),
131-
Arguments.of("avalid_23name", true),
132-
Arguments.of("Ava:lid_23name", true),
130+
Arguments.of("avalid_23name", true),
131+
Arguments.of("Ava:lid_23name", true),
133132
Arguments.of("a lid_23name", true),
134-
Arguments.of(":leading_colon", true),
135-
Arguments.of("colon:in:the:middle",true),
133+
Arguments.of(":leading_colon", true),
134+
Arguments.of("colon:in:the:middle", true),
136135
Arguments.of("aΩz", true),
137-
Arguments.of("a\ud800z", false));
136+
Arguments.of("a\ud800z", false));
138137
}
139138

140139
@ParameterizedTest
@@ -369,27 +368,23 @@ private void testEscapeMetricSnapshot(
369368

370369
DataPointSnapshot escapedData = got.getDataPoints().get(0);
371370
assertThat((Iterable<? extends Label>) escapedData.getLabels())
372-
.isEqualTo(
373-
Labels.builder()
374-
.label("__name__", expectedName)
375-
.label(expectedLabelName, expectedLabelValue)
376-
.build());
371+
.isEqualTo(Labels.builder().label(expectedLabelName, expectedLabelValue).build());
377372

378373
assertThat(original.getMetadata().getName()).isEqualTo(name);
379374
assertThat(original.getMetadata().getHelp()).isEqualTo("some help text");
380375
assertThat(original.getDataPoints()).hasSize(1);
381376

382377
DataPointSnapshot originalData = original.getDataPoints().get(0);
383378
assertThat((Iterable<? extends Label>) originalData.getLabels())
384-
.isEqualTo(Labels.builder().label("__name__", name).label(labelName, labelValue).build());
379+
.isEqualTo(Labels.builder().label(labelName, labelValue).build());
385380
}
386381

387382
private MetricSnapshot createTestSnapshot(
388383
String name,
389384
String labelName,
390385
String labelValue,
391386
Class<? extends MetricSnapshot> snapshotType) {
392-
Labels labels = Labels.builder().label("__name__", name).label(labelName, labelValue).build();
387+
Labels labels = Labels.builder().label(labelName, labelValue).build();
393388

394389
if (snapshotType.equals(CounterSnapshot.class)) {
395390
return CounterSnapshot.builder()

0 commit comments

Comments
 (0)