Skip to content

Commit 38356d7

Browse files
authored
Ignore compiled cshtml DLLs from telemetry (#7212)
## Summary of changes Adds logic when we report loaded DLLs to telemetry to ignore anything that is a compiled `.cshtml` DLL as we don't really care about them. Also ignores `Anonymously Hosted DynamicMethods Assembly` that we found when attempting to reproduce. ## Reason for change We don't really want to report them. ## Implementation details Copied the format from others. ## Test coverage Added some tests to just validate these cases. ## Other details <!-- Fixes #{issue} --> Unsure exactly how to create these DLLs in the first place 🤷 <!-- ⚠️ Note: where possible, please obtain 2 approvals prior to merging. Unless CODEOWNERS specifies otherwise, for external teams it is typically best to have one review from a team member, and one review from apm-dotnet. Trivial changes do not require 2 reviews. -->
1 parent b362404 commit 38356d7

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

tracer/src/Datadog.Trace/Telemetry/Collectors/DependencyTelemetryCollector.cs

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ internal void AssemblyLoaded(AssemblyName assembly, string moduleVersionId)
4242
if (assemblyName is null or ""
4343
|| assembly.Version is null
4444
|| IsTempPathPattern(assemblyName)
45+
|| IsCompiledRazorViewPattern(assemblyName)
4546
|| (assemblyName[0] == 'A'
4647
&& (assemblyName.StartsWith("App_Web_", StringComparison.Ordinal)
4748
|| assemblyName.StartsWith("App_Theme_", StringComparison.Ordinal)
@@ -50,7 +51,8 @@ internal void AssemblyLoaded(AssemblyName assembly, string moduleVersionId)
5051
|| assemblyName.StartsWith("App_global.asax.", StringComparison.Ordinal)
5152
|| assemblyName.StartsWith("App_Code.", StringComparison.Ordinal)
5253
|| assemblyName.StartsWith("App_Browsers.", StringComparison.Ordinal)
53-
|| assemblyName.StartsWith("App_WebReferences.", StringComparison.Ordinal)))
54+
|| assemblyName.StartsWith("App_WebReferences.", StringComparison.Ordinal)
55+
|| assemblyName.StartsWith("Anonymously Hosted DynamicMethods Assembly", StringComparison.Ordinal)))
5456
|| assemblyName.StartsWith("CompiledRazorTemplates.Dynamic.RazorEngine_", StringComparison.Ordinal)
5557
|| assemblyName.StartsWith("EntityFrameworkDynamicProxies-", StringComparison.Ordinal)
5658
|| assemblyName.StartsWith("expression_host_", StringComparison.Ordinal)
@@ -125,6 +127,34 @@ private static bool IsTempPathPattern(string assemblyName)
125127
&& IsBase32Char(assemblyName[11]);
126128
}
127129

130+
private static bool IsCompiledRazorViewPattern(string assemblyName)
131+
{
132+
// Pattern: xxxxxxxx.xxx.cshtml (19 characters total)
133+
// e.g. 01234abc.def.cshtml
134+
// where "x" is a base32 character (a-z, 0-5) and "." is a literal dot
135+
// Note: This is very similar to the temp path pattern, keeping it separate for now though
136+
return assemblyName.Length == 19
137+
&& assemblyName[8] == '.'
138+
&& assemblyName[12] == '.'
139+
&& assemblyName[13] == 'c'
140+
&& assemblyName[14] == 's'
141+
&& assemblyName[15] == 'h'
142+
&& assemblyName[16] == 't'
143+
&& assemblyName[17] == 'm'
144+
&& assemblyName[18] == 'l'
145+
&& IsBase32Char(assemblyName[0])
146+
&& IsBase32Char(assemblyName[1])
147+
&& IsBase32Char(assemblyName[2])
148+
&& IsBase32Char(assemblyName[3])
149+
&& IsBase32Char(assemblyName[4])
150+
&& IsBase32Char(assemblyName[5])
151+
&& IsBase32Char(assemblyName[6])
152+
&& IsBase32Char(assemblyName[7])
153+
&& IsBase32Char(assemblyName[9])
154+
&& IsBase32Char(assemblyName[10])
155+
&& IsBase32Char(assemblyName[11]);
156+
}
157+
128158
private static bool IsZxPattern(string assemblyName)
129159
{
130160
// zx_01aab0f40246424bb7ebaaf80635953b

tracer/test/Datadog.Trace.Tests/Telemetry/Collectors/DependencyTelemetryCollectorTests.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ public void DoesNotHaveChangesWhenSameAssemblyAddedTwice()
111111
[InlineData("ℛ*1887feb5-1546-46da-a64e-07cba2cb32fa#112-0")]
112112
[InlineData("ℛ*bcd9d48c-2728-46f5-bd56-bfb58cb0bb22#1156-0")]
113113
[InlineData("OK_IM_NO-GUID-BUUT-NOT_-THAT_FAR_OFF")]
114+
[InlineData("01234abc.def.cshtml")] // compiled Razor view assembly
115+
[InlineData("Anonymously Hosted DynamicMethods Assembly")] // compiled Razor view assembly (maybe)
114116
public void DoesNotHaveChangesWhenAssemblyNameIsIgnoredAssembly(string assemblyName)
115117
{
116118
var ignoredName = CreateAssemblyName(new Version(1, 0), name: assemblyName);
@@ -245,6 +247,24 @@ public void HasChangesWhenAddingSameAssemblyWithDifferentHash()
245247
.And.OnlyHaveUniqueItems();
246248
}
247249

250+
[Theory]
251+
[InlineData("01234abc.def.cshtm")] // Wrong extension
252+
[InlineData("01234abc.de.cshtml")] // Too short middle section
253+
[InlineData("01234abc.defg.cshtml")] // Too long middle section
254+
[InlineData("01234abcd.def.cshtml")] // Too long first section
255+
[InlineData("01234ab.def.cshtml")] // Too short first section
256+
[InlineData("01234abc-def.cshtml")] // Wrong separator
257+
[InlineData("01234abc.DEF.cshtml")] // Uppercase (not Base32)
258+
public void HasChangesWhenAssemblyNameIsNotValidCompiledRazorViewPattern(string assemblyName)
259+
{
260+
var validName = CreateAssemblyName(new Version(0, 0, 0, 0), name: assemblyName);
261+
262+
var collector = new DependencyTelemetryCollector();
263+
collector.AssemblyLoaded(validName, "some-guid");
264+
265+
collector.HasChanges().Should().BeTrue($"{assemblyName} should not be filtered out as it doesn't match the exact Razor view pattern");
266+
}
267+
248268
private static AssemblyName CreateAssemblyName(Version version = null, string name = null)
249269
{
250270
return new AssemblyName()

0 commit comments

Comments
 (0)