Skip to content
Open
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
30 changes: 28 additions & 2 deletions src/Activities/Internal/ActivityMetricsSender.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ internal sealed class ActivityMetricsSender : IActivitiesEventSender, IDisposabl
private readonly HashSet<string> m_customTagObjectsDimension;
private readonly bool m_isSetParentNameAsDimensionEnabled;

// Caps metric tag value length to reduce cardinality risk
// from externally controlled baggage or tag values
private const int MaxMetricTagValueLength = 256;

public ActivityMetricsSender(
IExecutionContext executionContext,
IHostEnvironment hostEnvironment,
Expand Down Expand Up @@ -68,7 +72,7 @@ public void SendActivityMetric(Activity activity)
string? baggageItem = activity.GetBaggageItem(dimension);
if (!string.IsNullOrWhiteSpace(baggageItem))
{
tagList.Add(dimension, baggageItem);
tagList.Add(dimension, TruncateSafe(baggageItem, MaxMetricTagValueLength));
}
}

Expand All @@ -77,7 +81,16 @@ public void SendActivityMetric(Activity activity)
object? tagItem = activity.GetTagItem(dimension);
if (tagItem != null)
{
tagList.Add(dimension, tagItem);
// Only truncate string values — preserve original
// type for numeric/bool to avoid breaking exporters
if (tagItem is string stringValue)
{
tagList.Add(dimension, TruncateSafe(stringValue, MaxMetricTagValueLength));
}
else
{
tagList.Add(dimension, tagItem);
}
}
}

Expand All @@ -93,6 +106,19 @@ public void SendActivityMetric(Activity activity)
histogram.Record(durationMs, tagList);
}

// Truncates string to maxLength while avoiding
// splitting UTF-16 surrogate pairs
private static string TruncateSafe(string value, int maxLength)
{
if (value.Length <= maxLength)
return value;

if (char.IsHighSurrogate(value[maxLength - 1]))
return value[..(maxLength - 1)];

return value[..maxLength];
Comment on lines +111 to +119
}

public void Dispose() => m_meter.Dispose();
}
}