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

/// <summary>
/// Maximum length for metric tag values to prevent
/// cardinality explosion via externally controlled
/// baggage or tag values.
/// </summary>
private const int MaxMetricTagValueLength = 256;

public ActivityMetricsSender(
IExecutionContext executionContext,
IHostEnvironment hostEnvironment,
Expand Down Expand Up @@ -68,7 +75,11 @@ public void SendActivityMetric(Activity activity)
string? baggageItem = activity.GetBaggageItem(dimension);
if (!string.IsNullOrWhiteSpace(baggageItem))
{
tagList.Add(dimension, baggageItem);
// Truncate to prevent metrics cardinality explosion
// via externally controlled W3C baggage header values
tagList.Add(dimension, baggageItem.Length > MaxMetricTagValueLength
? baggageItem[..MaxMetricTagValueLength]
: baggageItem);
}
}

Expand All @@ -77,7 +88,12 @@ public void SendActivityMetric(Activity activity)
object? tagItem = activity.GetTagItem(dimension);
if (tagItem != null)
{
tagList.Add(dimension, tagItem);
// Truncate string representation to prevent
// cardinality explosion via high-cardinality tag values
string tagValue = tagItem.ToString() ?? string.Empty;
tagList.Add(dimension, tagValue.Length > MaxMetricTagValueLength
? tagValue[..MaxMetricTagValueLength]
: tagValue);
}
}

Expand All @@ -95,4 +111,4 @@ public void SendActivityMetric(Activity activity)

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