Skip to content

Commit 113e5b8

Browse files
[Instrumentation.AspNet][Instrumentation.Owin] Redact query parameters (#1656)
1 parent 3085772 commit 113e5b8

File tree

14 files changed

+356
-111
lines changed

14 files changed

+356
-111
lines changed

opentelemetry-dotnet-contrib.sln

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,8 +280,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{1FCC8E
280280
src\Shared\ListenerHandler.cs = src\Shared\ListenerHandler.cs
281281
src\Shared\MultiTypePropertyFetcher.cs = src\Shared\MultiTypePropertyFetcher.cs
282282
src\Shared\NullableAttributes.cs = src\Shared\NullableAttributes.cs
283-
src\Shared\PropertyFetcher.cs = src\Shared\PropertyFetcher.cs
284283
src\Shared\PropertyFetcher.AOT.cs = src\Shared\PropertyFetcher.AOT.cs
284+
src\Shared\PropertyFetcher.cs = src\Shared\PropertyFetcher.cs
285+
src\Shared\RedactionHelper.cs = src\Shared\RedactionHelper.cs
285286
src\Shared\ResourceSemanticConventions.cs = src\Shared\ResourceSemanticConventions.cs
286287
src\Shared\SemanticConventions.cs = src\Shared\SemanticConventions.cs
287288
src\Shared\SpanAttributeConstants.cs = src\Shared\SpanAttributeConstants.cs

src/OpenTelemetry.Instrumentation.AspNet/AspNetTraceInstrumentationOptions.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System;
55
using System.Diagnostics;
66
using System.Web;
7+
using OpenTelemetry.Instrumentation.AspNet.Implementation;
78

89
namespace OpenTelemetry.Instrumentation.AspNet;
910

@@ -12,6 +13,27 @@ namespace OpenTelemetry.Instrumentation.AspNet;
1213
/// </summary>
1314
public class AspNetTraceInstrumentationOptions
1415
{
16+
private const string DisableQueryRedactionEnvVar = "OTEL_DOTNET_EXPERIMENTAL_ASPNET_DISABLE_URL_QUERY_REDACTION";
17+
18+
/// <summary>
19+
/// Initializes a new instance of the <see cref="AspNetTraceInstrumentationOptions"/> class.
20+
/// </summary>
21+
public AspNetTraceInstrumentationOptions()
22+
{
23+
try
24+
{
25+
var disableQueryRedaction = Environment.GetEnvironmentVariable(DisableQueryRedactionEnvVar);
26+
if (disableQueryRedaction != null && disableQueryRedaction.Equals("true", StringComparison.OrdinalIgnoreCase))
27+
{
28+
this.DisableUrlQueryRedaction = true;
29+
}
30+
}
31+
catch (Exception ex)
32+
{
33+
AspNetInstrumentationEventSource.Log.FailedToReadEnvironmentVariable(DisableQueryRedactionEnvVar, ex);
34+
}
35+
}
36+
1537
/// <summary>
1638
/// Gets or sets a filter callback function that determines on a per
1739
/// request basis whether or not to collect telemetry.
@@ -46,4 +68,14 @@ public class AspNetTraceInstrumentationOptions
4668
/// See: <see href="https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/exceptions.md"/>.
4769
/// </remarks>
4870
public bool RecordException { get; set; }
71+
72+
/// <summary>
73+
/// Gets or sets a value indicating whether the url query value should be redacted or not.
74+
/// </summary>
75+
/// <remarks>
76+
/// The query parameter values are redacted with value set as Redacted.
77+
/// e.g. `?key1=value1` is set as `?key1=Redacted`.
78+
/// The redaction can be disabled by setting this property to <see langword="true" />.
79+
/// </remarks>
80+
internal bool DisableUrlQueryRedaction { get; set; }
4981
}

src/OpenTelemetry.Instrumentation.AspNet/CHANGELOG.md

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

3-
## Unreleased
3+
## 1.8.0-beta.2
4+
5+
Released 2024-Apr-17
6+
7+
* **Breaking Change**: Fixed tracing instrumentation so that by default any
8+
values detected in the query string component of requests are replaced with
9+
the text `Redacted` when building the `url.query` attribute. For example,
10+
`?key1=value1&key2=value2` becomes `?key1=Redacted&key2=Redacted`. You can
11+
disable this redaction by setting the environment variable
12+
`OTEL_DOTNET_EXPERIMENTAL_ASPNET_DISABLE_URL_QUERY_REDACTION` to `true`.
13+
([#1656](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/1656))
414

515
## 1.8.0-beta.1
616

src/OpenTelemetry.Instrumentation.AspNet/Implementation/AspNetInstrumentationEventSource.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,15 @@ public void EnrichmentException(string eventName, Exception ex)
3333
}
3434
}
3535

36+
[NonEvent]
37+
public void FailedToReadEnvironmentVariable(string envVarName, Exception ex)
38+
{
39+
if (this.IsEnabled(EventLevel.Error, EventKeywords.All))
40+
{
41+
this.EnrichmentException(envVarName, ex.ToInvariantString());
42+
}
43+
}
44+
3645
[Event(1, Message = "Request is filtered out and will not be collected. Operation='{0}'", Level = EventLevel.Verbose)]
3746
public void RequestIsFilteredOut(string operationName)
3847
{
@@ -50,4 +59,10 @@ public void EnrichmentException(string eventName, string exception)
5059
{
5160
this.WriteEvent(3, eventName, exception);
5261
}
62+
63+
[Event(4, Message = "Failed to read environment variable='{0}': {1}", Level = EventLevel.Error)]
64+
public void FailedToReadEnvironmentVariable(string envVarName, string exception)
65+
{
66+
this.WriteEvent(4, envVarName, exception);
67+
}
5368
}

src/OpenTelemetry.Instrumentation.AspNet/Implementation/HttpInListener.cs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -91,14 +91,8 @@ private void OnStartActivity(Activity activity, HttpContext context)
9191
var query = url.Query;
9292
if (!string.IsNullOrEmpty(query))
9393
{
94-
if (query.StartsWith("?", StringComparison.InvariantCulture))
95-
{
96-
activity.SetTag(SemanticConventions.AttributeUrlQuery, query.Substring(1));
97-
}
98-
else
99-
{
100-
activity.SetTag(SemanticConventions.AttributeUrlQuery, query);
101-
}
94+
var queryString = query.StartsWith("?", StringComparison.InvariantCulture) ? query.Substring(1) : query;
95+
activity.SetTag(SemanticConventions.AttributeUrlQuery, this.options.DisableUrlQueryRedaction ? queryString : RedactionHelper.GetRedactedQueryString(queryString));
10296
}
10397

10498
var userAgent = request.UserAgent;

src/OpenTelemetry.Instrumentation.AspNet/OpenTelemetry.Instrumentation.AspNet.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
<Compile Include="$(RepoRoot)\src\Shared\ExceptionExtensions.cs" Link="Includes\ExceptionExtensions.cs" />
1818
<Compile Include="$(RepoRoot)\src\Shared\Guard.cs" Link="Includes\Guard.cs" />
1919
<Compile Include="$(RepoRoot)\src\Shared\PropertyFetcher.AOT.cs" Link="Includes\PropertyFetcher.AOT.cs" />
20+
<Compile Include="$(RepoRoot)\src\Shared\RedactionHelper.cs" Link="Includes\RedactionHelper.cs" />
2021
<Compile Include="$(RepoRoot)\src\Shared\SemanticConventions.cs" Link="Includes\SemanticConventions.cs" />
2122
<Compile Include="$(RepoRoot)\src\Shared\SpanHelper.cs" Link="Includes\SpanHelper.cs" />
2223
</ItemGroup>

src/OpenTelemetry.Instrumentation.Owin/CHANGELOG.md

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

3-
## Unreleased
3+
## 1.0.0-rc.5
4+
5+
Released 2024-Apr-17
6+
7+
* **Breaking Change**: Fixed tracing instrumentation so that by default any
8+
values detected in the query string component of requests are replaced with
9+
the text `Redacted` when building the `http.url` tag. For example,
10+
`?key1=value1&key2=value2` becomes `?key1=Redacted&key2=Redacted`. You can
11+
disable this redaction by setting the environment variable
12+
`OTEL_DOTNET_EXPERIMENTAL_OWIN_DISABLE_URL_QUERY_REDACTION` to `true`.
13+
([#1656](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/1656))
414

515
* `ActivitySource.Version` and `Meter.Version` are set to NuGet package version.
616
([#1624](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/1624))

src/OpenTelemetry.Instrumentation.Owin/Implementation/DiagnosticsMiddleware.cs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using Microsoft.Owin;
1010
using OpenTelemetry.Context.Propagation;
1111
using OpenTelemetry.Instrumentation.Owin.Implementation;
12+
using OpenTelemetry.Internal;
1213
using OpenTelemetry.Trace;
1314

1415
namespace OpenTelemetry.Instrumentation.Owin;
@@ -114,7 +115,7 @@ private static void BeginRequest(IOwinContext owinContext)
114115

115116
activity.SetTag(SemanticConventions.AttributeHttpMethod, request.Method);
116117
activity.SetTag(SemanticConventions.AttributeHttpTarget, request.Uri.AbsolutePath);
117-
activity.SetTag(SemanticConventions.AttributeHttpUrl, GetUriTagValueFromRequestUri(request.Uri));
118+
activity.SetTag(SemanticConventions.AttributeHttpUrl, GetUriTagValueFromRequestUri(request.Uri, OwinInstrumentationActivitySource.Options.DisableUrlQueryRedaction));
118119

119120
if (request.Headers.TryGetValue("User-Agent", out string[] userAgent) && userAgent.Length > 0)
120121
{
@@ -228,13 +229,15 @@ private static void RequestEnd(IOwinContext owinContext, Exception? exception, l
228229
/// </summary>
229230
/// <param name="uri"><see cref="Uri"/>.</param>
230231
/// <returns>Span uri value.</returns>
231-
private static string GetUriTagValueFromRequestUri(Uri uri)
232+
private static string GetUriTagValueFromRequestUri(Uri uri, bool disableQueryRedaction)
232233
{
233-
if (string.IsNullOrEmpty(uri.UserInfo))
234+
if (string.IsNullOrEmpty(uri.UserInfo) && disableQueryRedaction)
234235
{
235-
return uri.ToString();
236+
return uri.OriginalString;
236237
}
237238

238-
return string.Concat(uri.Scheme, Uri.SchemeDelimiter, uri.Authority, uri.PathAndQuery, uri.Fragment);
239+
var query = disableQueryRedaction ? uri.Query : RedactionHelper.GetRedactedQueryString(uri.Query);
240+
241+
return string.Concat(uri.Scheme, Uri.SchemeDelimiter, uri.Authority, uri.AbsolutePath, query, uri.Fragment);
239242
}
240243
}

src/OpenTelemetry.Instrumentation.Owin/Implementation/OwinInstrumentationEventSource.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,16 +45,32 @@ public void EnrichmentException(Exception exception)
4545
}
4646
}
4747

48+
[NonEvent]
49+
public void FailedToReadEnvironmentVariable(string envVarName, Exception ex)
50+
{
51+
if (this.IsEnabled(EventLevel.Error, EventKeywords.All))
52+
{
53+
this.FailedToReadEnvironmentVariable(envVarName, ex.ToInvariantString());
54+
}
55+
}
56+
4857
[Event(EventIds.EnrichmentException, Message = "Enrichment threw exception. Exception {0}.", Level = EventLevel.Error)]
4958
public void EnrichmentException(string exception)
5059
{
5160
this.WriteEvent(EventIds.EnrichmentException, exception);
5261
}
5362

63+
[Event(EventIds.FailedToReadEnvironmentVariable, Message = "Failed to read environment variable='{0}': {1}", Level = EventLevel.Error)]
64+
public void FailedToReadEnvironmentVariable(string envVarName, string exception)
65+
{
66+
this.WriteEvent(4, envVarName, exception);
67+
}
68+
5469
private class EventIds
5570
{
5671
public const int RequestIsFilteredOut = 1;
5772
public const int RequestFilterException = 2;
5873
public const int EnrichmentException = 3;
74+
public const int FailedToReadEnvironmentVariable = 4;
5975
}
6076
}

src/OpenTelemetry.Instrumentation.Owin/OpenTelemetry.Instrumentation.Owin.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
<Compile Include="$(RepoRoot)\src\Shared\AssemblyVersionExtensions.cs" Link="Includes\AssemblyVersionExtensions.cs" />
1111
<Compile Include="$(RepoRoot)\src\Shared\ExceptionExtensions.cs" Link="Includes\ExceptionExtensions.cs" />
1212
<Compile Include="$(RepoRoot)\src\Shared\Guard.cs" Link="Includes\Guard.cs" />
13+
<Compile Include="$(RepoRoot)\src\Shared\RedactionHelper.cs" Link="Includes\RedactionHelper.cs" />
1314
<Compile Include="$(RepoRoot)\src\Shared\SemanticConventions.cs" Link="Includes\SemanticConventions.cs"/>
1415
<Compile Include="$(RepoRoot)\src\Shared\SpanHelper.cs" Link="Includes\SpanHelper.cs" />
1516
</ItemGroup>

0 commit comments

Comments
 (0)