Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,41 @@ static StringBuilder CreateStringBuilder(string name)
}
}

internal static string SanitizeUnitName(string unit)
{
if (string.IsNullOrEmpty(unit))
{
return string.Empty;
}

var sb = new StringBuilder(unit.Length);
var lastCharUnderscore = false;

for (var i = 0; i < unit.Length; i++)
{
var c = unit[i];

if (char.IsLetterOrDigit(c))
{
sb.Append(c);
lastCharUnderscore = false;
}
else if (!lastCharUnderscore && sb.Length > 0)
{
sb.Append('_');
lastCharUnderscore = true;
}
}

// Strip trailing underscore
if (sb.Length > 0 && sb[sb.Length - 1] == '_')
{
sb.Length--;
}

return sb.Length == 0 ? string.Empty : sb.ToString();
}

internal static string RemoveAnnotations(string unit)
{
// UCUM standard says the curly braces shouldn't be nested:
Expand Down Expand Up @@ -208,6 +243,7 @@ private static string GetUnit(string unit)
updatedUnit = MapUnit(updatedUnit.AsSpan());
}

updatedUnit = SanitizeUnitName(updatedUnit);
return updatedUnit;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,42 @@ public void GetPrometheusType_MapsOpenTelemetryMetricsTypeToPrometheus(MetricsMa
[Fact]
public void Name_EmptyUnit_NoSuffixAdded() => AssertName("metric", string.Empty, PrometheusType.Gauge, false, "metric");

[Fact]
public void Name_MalformedUnit_HashRU_Sanitized()
=> AssertName("metric", "# RU", PrometheusType.Gauge, false, "metric_RU");

[Fact]
public void Name_MalformedUnit_HashOnly_Unitless()
=> AssertName("metric", "#", PrometheusType.Gauge, false, "metric");

[Fact]
public void Name_MalformedUnit_HashSpaceHash_Unitless()
=> AssertName("metric", "# #", PrometheusType.Gauge, false, "metric");

[Fact]
public void Name_MalformedUnit_HashUnderscoreRDotUDot_Sanitized()
=> AssertName("metric", "#_R.U.", PrometheusType.Gauge, false, "metric_R_U");

[Fact]
public void SanitizeUnitName_Valid()
=> Assert.Equal("bytes", PrometheusMetric.SanitizeUnitName("bytes"));

[Fact]
public void SanitizeUnitName_WithInvalidChars()
=> Assert.Equal("RU", PrometheusMetric.SanitizeUnitName("# RU"));

[Fact]
public void SanitizeUnitName_OnlyInvalidChars_ReturnsEmpty()
=> Assert.Equal(string.Empty, PrometheusMetric.SanitizeUnitName("#"));

[Fact]
public void SanitizeUnitName_Empty_ReturnsEmpty()
=> Assert.Equal(string.Empty, PrometheusMetric.SanitizeUnitName(string.Empty));

[Fact]
public void SanitizeUnitName_DotsCollapsed()
=> Assert.Equal("R_U", PrometheusMetric.SanitizeUnitName("R.U."));

[Fact]
public void Name_NullUnit_NoSuffixAdded()
{
Expand Down Expand Up @@ -361,7 +397,7 @@ public void GetPrometheusType_HistogramVariants_ReturnsHistogram(int metricTypeV

[Fact]
public void Name_MultipleSlashesInUnit_FirstSlashProcessed()
=> AssertName("metric", "req/s/extra", PrometheusType.Gauge, false, "metric_req_per_s/extra"); // // Multiple slashes
=> AssertName("metric", "req/s/extra", PrometheusType.Gauge, false, "metric_req_per_s_extra"); // Multiple slashes

[Theory]
[InlineData(PrometheusType.Counter)]
Expand Down