From cdcc58cb87cd9ae546f285aa9e53428db1c7f9d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20St=C3=A4ber?= Date: Tue, 28 May 2024 18:50:04 +0200 Subject: [PATCH] Update the Prometetheus metrics library (#6473) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fabian Stäber --- dependencyManagement/build.gradle.kts | 2 +- .../prometheus/Otel2PrometheusConverter.java | 3 +-- .../prometheus/PrometheusUnitsHelper.java | 18 +++++++++++++++--- .../Otel2PrometheusConverterTest.java | 6 +++--- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/dependencyManagement/build.gradle.kts b/dependencyManagement/build.gradle.kts index 0540139e7cf..7849fd34d7f 100644 --- a/dependencyManagement/build.gradle.kts +++ b/dependencyManagement/build.gradle.kts @@ -70,7 +70,7 @@ val DEPENDENCIES = listOf( "io.opentelemetry.proto:opentelemetry-proto:1.2.0-alpha", "io.opentracing:opentracing-api:0.33.0", "io.opentracing:opentracing-noop:0.33.0", - "io.prometheus:prometheus-metrics-exporter-httpserver:1.2.1", + "io.prometheus:prometheus-metrics-exporter-httpserver:1.3.1", "junit:junit:4.13.2", "nl.jqno.equalsverifier:equalsverifier:3.16.1", "org.awaitility:awaitility:4.2.1", diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverter.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverter.java index 72dbaa446f5..e1cb84d9766 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverter.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverter.java @@ -537,8 +537,7 @@ private static MetricMetadata convertMetadata(MetricData metricData) { String help = metricData.getDescription(); Unit unit = PrometheusUnitsHelper.convertUnit(metricData.getUnit()); if (unit != null && !name.endsWith(unit.toString())) { - // Need to re-sanitize metric name since unit may contain illegal characters - name = sanitizeMetricName(name + "_" + unit); + name = name + "_" + unit; } // Repeated __ are not allowed according to spec, although this is allowed in prometheus while (name.contains("__")) { diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusUnitsHelper.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusUnitsHelper.java index db0503eb3fb..b2a9c856992 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusUnitsHelper.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusUnitsHelper.java @@ -5,6 +5,7 @@ package io.opentelemetry.exporter.prometheus; +import io.prometheus.metrics.model.snapshots.PrometheusNaming; import io.prometheus.metrics.model.snapshots.Unit; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -86,11 +87,22 @@ static Unit convertUnit(String otelUnit) { String part1 = pluralNames.getOrDefault(parts[0], parts[0]).trim(); String part2 = singularNames.getOrDefault(parts[1], parts[1]).trim(); if (part1.isEmpty()) { - return new Unit("per_" + part2); + return unitOrNull("per_" + part2); } else { - return new Unit(part1 + "_per_" + part2); + return unitOrNull(part1 + "_per_" + part2); } } - return new Unit(otelUnit); + return unitOrNull(otelUnit); + } + + @Nullable + private static Unit unitOrNull(String name) { + try { + return new Unit(PrometheusNaming.sanitizeUnitName(name)); + } catch (IllegalArgumentException e) { + // This happens if the name cannot be converted to a valid Prometheus unit name, + // for example if name is "total". + return null; + } } } diff --git a/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverterTest.java b/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverterTest.java index 26466c1e393..5b8dd270548 100644 --- a/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverterTest.java +++ b/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverterTest.java @@ -283,9 +283,9 @@ private static Stream metricMetadataArgs() { // if metric name ends with unit the unit is omitted - order matters Arguments.of( createSampleMetricData("metric_total_hertz", "hertz_total", MetricDataType.LONG_SUM), - "metric_total_hertz_hertz_total counter", - "metric_total_hertz_hertz_total description", - "metric_total_hertz_hertz_total"), + "metric_total_hertz_total counter", + "metric_total_hertz_total description", + "metric_total_hertz_total"), // metric name cannot start with a number Arguments.of( createSampleMetricData("2_metric_name", "By", MetricDataType.SUMMARY),