Skip to content

Commit 1ea7427

Browse files
Added sanitization for Metric Units (#3151)
1 parent 6cdba66 commit 1ea7427

File tree

4 files changed

+31
-1
lines changed

4 files changed

+31
-1
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changelog
22

3+
## Unreleased
4+
5+
### Fixes
6+
7+
- Metric unit names are now sanitized correctly. This was preventing some built in metrics from showing in the Sentry dashboard ([#3151](https://github.com/getsentry/sentry-dotnet/pull/3151))
8+
39
## 4.1.1
410

511
### Fixes

src/Sentry/MetricHelper.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ internal static partial class MetricHelper
88
private const int RollupInSeconds = 10;
99
private const string InvalidKeyCharactersPattern = @"[^a-zA-Z0-9_/.-]+";
1010
private const string InvalidValueCharactersPattern = @"[^\w\d_:/@\.\{\}\[\]$-]+";
11+
// See https://docs.sysdig.com/en/docs/sysdig-monitor/integrations/working-with-integrations/custom-integrations/integrate-statsd-metrics/#characters-allowed-for-statsd-metric-names
12+
private const string InvalidMetricUnitCharactersPattern = @"[^a-zA-Z0-9_/.]+";
1113

1214
#if NET6_0_OR_GREATER
1315
private static readonly DateTimeOffset UnixEpoch = DateTimeOffset.UnixEpoch;
@@ -48,10 +50,18 @@ internal static DateTimeOffset GetCutoff() => DateTimeOffset.UtcNow
4850
[GeneratedRegex(InvalidValueCharactersPattern, RegexOptions.Compiled)]
4951
private static partial Regex InvalidValueCharacters();
5052
internal static string SanitizeValue(string input) => InvalidValueCharacters().Replace(input, "_");
53+
54+
[GeneratedRegex(InvalidMetricUnitCharactersPattern, RegexOptions.Compiled)]
55+
private static partial Regex InvalidMetricUnitCharacters();
56+
internal static string SanitizeMetricUnit(string input) => InvalidMetricUnitCharacters().Replace(input, "_");
5157
#else
5258
private static readonly Regex InvalidKeyCharacters = new(InvalidKeyCharactersPattern, RegexOptions.Compiled);
5359
internal static string SanitizeKey(string input) => InvalidKeyCharacters.Replace(input, "_");
60+
5461
private static readonly Regex InvalidValueCharacters = new(InvalidValueCharactersPattern, RegexOptions.Compiled);
5562
internal static string SanitizeValue(string input) => InvalidValueCharacters.Replace(input, "_");
63+
64+
private static readonly Regex InvalidMetricUnitCharacters = new(InvalidMetricUnitCharactersPattern, RegexOptions.Compiled);
65+
internal static string SanitizeMetricUnit(string input) => InvalidMetricUnitCharacters.Replace(input, "_");
5666
#endif
5767
}

src/Sentry/Protocol/Metrics/Metric.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,10 @@ public async Task SerializeAsync(Stream stream, IDiagnosticLogger? logger, Cance
108108
var metricName = MetricHelper.SanitizeKey(Key);
109109
await Write($"{metricName}@").ConfigureAwait(false);
110110
var unit = Unit ?? MeasurementUnit.None;
111+
var sanitizedUnit = MetricHelper.SanitizeMetricUnit(unit.ToString());
111112
// We don't need ConfigureAwait(false) here as ConfigureAwait on metricName above avoids capturing the ExecutionContext.
112113
#pragma warning disable CA2007
113-
await Write(unit.ToString());
114+
await Write(sanitizedUnit);
114115

115116
foreach (var value in SerializedStatsdValues())
116117
{

test/Sentry.Tests/MetricHelperTests.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,17 @@ public void SanitizeValue_ShouldReplaceInvalidCharactersWithUnderscore(string in
4747
// Assert
4848
result.Should().Be(expected);
4949
}
50+
51+
[Theory]
52+
[InlineData("Test123_.", "Test123_.")] // Valid characters
53+
[InlineData("test{value}", "test_value_")]
54+
[InlineData("test-value", "test_value")]
55+
public void SanitizeMetricUnit_ShouldReplaceInvalidCharactersWithUnderscore(string input, string expected)
56+
{
57+
// Act
58+
var result = MetricHelper.SanitizeMetricUnit(input);
59+
60+
// Assert
61+
result.Should().Be(expected);
62+
}
5063
}

0 commit comments

Comments
 (0)