Skip to content

Commit 290f030

Browse files
author
Pratik Bhattacharya
committed
fix: made telememtry extensions build extensive and added refacted headers in custom filters
updated pacage version to 1.0.3
1 parent ef4828e commit 290f030

6 files changed

+50
-44
lines changed

sample/Startup.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public Startup(IConfiguration configuration)
2323
// This method gets called by the runtime. Use this method to add services to the container.
2424
public void ConfigureServices(IServiceCollection services)
2525
{
26-
services.AddEnterpriseLogger(Configuration, new CustomStaticInitializer());
26+
services.AddEnterpriseTelemetry(Configuration, new CustomStaticInitializer());
2727
services.AddSingleton<IGlobalExceptionHandler, CustomExceptionHandler>();
2828
services.AddMvc(options =>
2929
{

src/AppInsights.EnterpriseTelemetry.AspNetCore.Extension.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
44
<PackageId>AppInsights.EnterpriseTelemetry.AspNetCore.Extension</PackageId>
55
<Title>AppInsights.EnterpriseTelemetry.AspNetCore.Extension</Title>
6-
<Version>1.0.2</Version>
6+
<Version>1.0.3</Version>
77
<Authors>Pratik Bhattacharya</Authors>
88
<Company>Microsoft</Company>
99
<PackageDescription>Library for capturing enterprise level telemetry in an Web application built on ASP.NET Core 2 and above</PackageDescription>

src/EnterpriseTelemetryExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ private static ITelemetryExtensionsBuilder GetBuilder(IConfiguration config, par
2929
{
3030
return extensionBuilder;
3131
}
32-
extensionBuilder = TelemetryExtensionsBuilder.Create(config, customTelemetryInitializers);
32+
extensionBuilder = new TelemetryExtensionsBuilder(config, customTelemetryInitializers);
3333
return extensionBuilder;
3434
}
3535
}
@@ -52,7 +52,7 @@ public static ILogger CreateLogger(IConfiguration config, params ITelemetryIniti
5252
/// <param name="services"></param>
5353
/// <param name="config" cref="IConfiguration">Configuration</param>
5454
/// <param name="customTelemetryInitializer" cref="ITelemetryInitializer[]">App specific additional telemetry initializers</param>
55-
public static void AddEnterpriseLogger(this IServiceCollection services, IConfiguration config, params ITelemetryInitializer[] customTelemetryInitializers)
55+
public static void AddEnterpriseTelemetry(this IServiceCollection services, IConfiguration config, params ITelemetryInitializer[] customTelemetryInitializers)
5656
{
5757
ITelemetryExtensionsBuilder builder = GetBuilder(config, customTelemetryInitializers);
5858
builder.AddEnterpriseTelemetry(services);

src/Filters/RequestResponseLoggerFilterAttribute.cs

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,25 +25,32 @@ public sealed class RequestResponseLoggerFilterAttribute : ActionFilterAttribute
2525
private readonly string _correlationIdHeaderKey;
2626
private readonly string _transactionIdHeaderKey;
2727
private readonly string _endToEndHeaderKey;
28+
private readonly List<string> _redactedHeaders;
2829

2930
public RequestResponseLoggerFilterAttribute(IConfiguration config, ILogger logger)
30-
:this(logger,
31+
: this(logger,
3132
config.GetValue<string>("Logging:LogLevel:Default") == "Trace" || config.GetValue<string>("Logging:LogLevel:Default") == "Debug",
3233
config.GetValue<bool>("Logging:EnableHttpContextBodyLogging"),
33-
config.GetValue<string>("Application:CorrelationIdHeaderKey"),
34-
config.GetValue<string>("Application:TransactionIdHeaderKey"),
35-
config.GetValue<string>("Application:EndToEndTrackingHeaderKey"))
36-
{
37-
}
34+
config.GetValue<string>("Application:CorrelationIdHeaderKey") ?? config.GetValue<string>("ItTelemetryExtensions:CorrelationKey") ?? TelemetryConstant.HEADER_DEFAULT_CORRELATION_KEY,
35+
config.GetValue<string>("Application:TransactionIdHeaderKey") ?? config.GetValue<string>("ItTelemetryExtensions:TransactionKey") ?? TelemetryConstant.HEADER_DEFAULT_TRANSACTION_KEY,
36+
config.GetValue<string>("Application:EndToEndTrackingHeaderKey") ?? config.GetValue<string>("ItTelemetryExtensions:EndToEndKey") ?? TelemetryConstant.HEADER_DEFAULT_E2E_KEY,
37+
config.GetValue<string>("Logging:RedactedHeaders"))
38+
{ }
3839

39-
private RequestResponseLoggerFilterAttribute(ILogger logger, bool isVerboseLoggingEnabled, bool isHttpContextBodyLoggingEnabled, string correlationIdHeaderKey, string transactionIdHeaderKey, string e2eTrackingIdHeaderKey)
40+
private RequestResponseLoggerFilterAttribute(ILogger logger, bool isVerboseLoggingEnabled, bool isHttpContextBodyLoggingEnabled, string correlationIdHeaderKey, string transactionIdHeaderKey, string e2eTrackingIdHeaderKey, string redactedHeaders)
4041
{
4142
_logger = logger;
4243
_isVerboseLoggingEnabled = isVerboseLoggingEnabled;
4344
_isHttpContextBodyLoggingEnabled = isHttpContextBodyLoggingEnabled;
4445
_correlationIdHeaderKey = correlationIdHeaderKey;
4546
_transactionIdHeaderKey = transactionIdHeaderKey;
4647
_endToEndHeaderKey = e2eTrackingIdHeaderKey;
48+
_redactedHeaders = new List<string>() { "Authorization" };
49+
if (!string.IsNullOrWhiteSpace(redactedHeaders))
50+
{
51+
string[] splitRedactedHeaders = redactedHeaders.Split(',');
52+
_redactedHeaders.AddRange(splitRedactedHeaders);
53+
}
4754
}
4855

4956
public override void OnActionExecuting(ActionExecutingContext context)
@@ -125,16 +132,16 @@ private Dictionary<string, string> GetLogPropertiesFromRequest(HttpRequest reque
125132

126133
foreach (var header in request.Headers)
127134
{
128-
if (header.Key == "Authorization")
135+
if (_redactedHeaders != null && _redactedHeaders.Contains(header.Key))
129136
logProperties.AddOrUpdate($"Request:Header:{header.Key}", TelemetryConstant.REDACTED);
130137
else
131138
logProperties.AddOrUpdate($"Request:Header:{header.Key}", string.Join(",", header.Value));
132139
}
133-
logProperties.AddOrUpdate("Request:Method", request.Method);
134-
logProperties.AddOrUpdate("Request:Protocol", request.Protocol);
135-
logProperties.AddOrUpdate("Request:Scheme", request.Scheme);
136-
logProperties.AddOrUpdate("Request:Host", request.Host.Value);
137-
logProperties.AddOrUpdate("Request:Path", request.Path.Value);
140+
logProperties.AddOrUpdate("Request:Method", request.Method);
141+
logProperties.AddOrUpdate("Request:Protocol", request.Protocol);
142+
logProperties.AddOrUpdate("Request:Scheme", request.Scheme);
143+
logProperties.AddOrUpdate("Request:Host", request.Host.Value);
144+
logProperties.AddOrUpdate("Request:Path", request.Path.Value);
138145
logProperties.AddOrUpdate("Request:QueryString", request.QueryString.HasValue ? request.QueryString.Value : string.Empty);
139146

140147
if (request.Method != HttpMethod.Get.ToString() && _isHttpContextBodyLoggingEnabled)

src/Filters/ResponseLoggerFilterAttribute.cs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,32 +12,39 @@
1212

1313
#pragma warning disable CA1031 // Do not catch general exception types
1414
namespace AppInsights.EnterpriseTelemetry.Web.Extension.Filters
15-
{
15+
{
1616
public sealed class ResponseLoggerFilterAttribute : ActionFilterAttribute
1717
{
1818
private readonly ILogger _logger;
1919
private readonly bool _isHttpContextBodyLoggingEnabled;
2020
private readonly string _correlationIdHeaderKey;
2121
private readonly string _transactionIdHeaderKey;
2222
private readonly string _endToEndHeaderKey;
23+
private readonly List<string> _redactedHeaders;
2324

2425
public ResponseLoggerFilterAttribute(ILogger logger, IConfiguration config)
2526
: this(
2627
logger,
2728
config.GetValue<bool>("Logging:ResponseBodyTrackingEnabled"),
2829
config.GetValue<string>("Application:CorrelationIdHeaderKey") ?? config.GetValue<string>("ItTelemetryExtensions:CorrelationKey") ?? TelemetryConstant.HEADER_DEFAULT_CORRELATION_KEY,
2930
config.GetValue<string>("Application:TransactionIdHeaderKey") ?? config.GetValue<string>("ItTelemetryExtensions:TransactionKey") ?? TelemetryConstant.HEADER_DEFAULT_TRANSACTION_KEY,
30-
config.GetValue<string>("Application:EndToEndTrackingHeaderKey") ?? config.GetValue<string>("ItTelemetryExtensions:EndToEndKey") ?? TelemetryConstant.HEADER_DEFAULT_E2E_KEY
31-
)
31+
config.GetValue<string>("Application:EndToEndTrackingHeaderKey") ?? config.GetValue<string>("ItTelemetryExtensions:EndToEndKey") ?? TelemetryConstant.HEADER_DEFAULT_E2E_KEY,
32+
config.GetValue<string>("Logging:RedactedHeaders"))
3233
{ }
3334

34-
private ResponseLoggerFilterAttribute(ILogger logger, bool isHttpContextBodyLoggingEnabled, string correlationIdHeaderKey, string transactionIdHeaderKey, string e2eTrackingIdHeaderKey)
35+
private ResponseLoggerFilterAttribute(ILogger logger, bool isHttpContextBodyLoggingEnabled, string correlationIdHeaderKey, string transactionIdHeaderKey, string e2eTrackingIdHeaderKey, string redactedHeaders)
3536
{
3637
_logger = logger;
3738
_isHttpContextBodyLoggingEnabled = isHttpContextBodyLoggingEnabled;
3839
_correlationIdHeaderKey = correlationIdHeaderKey;
3940
_transactionIdHeaderKey = transactionIdHeaderKey;
4041
_endToEndHeaderKey = e2eTrackingIdHeaderKey;
42+
_redactedHeaders = new List<string>() { "Authorization" };
43+
if (!string.IsNullOrWhiteSpace(redactedHeaders))
44+
{
45+
string[] splitRedactedHeaders = redactedHeaders.Split(',');
46+
_redactedHeaders.AddRange(splitRedactedHeaders);
47+
}
4148
}
4249

4350
public override void OnActionExecuted(ActionExecutedContext context)
@@ -90,7 +97,7 @@ private Dictionary<string, string> GetLogPropertiesFromRequest(HttpRequest reque
9097

9198
foreach (var header in request.Headers)
9299
{
93-
if (header.Key == "Authorization")
100+
if (_redactedHeaders != null && _redactedHeaders.Contains(header.Key))
94101
logProperties.AddOrUpdate($"Request:Header:{header.Key}", TelemetryConstant.REDACTED);
95102
else
96103
logProperties.AddOrUpdate($"Request:Header:{header.Key}", string.Join(",", header.Value));
@@ -124,8 +131,10 @@ private Dictionary<string, string> GetLogPropertiesFromResponse(HttpResponse res
124131

125132
foreach (var header in response.Headers)
126133
{
127-
logProperties.AddOrUpdate($"Response:Header:{header.Key}", string.Join(",", header.Value));
128-
Console.WriteLine($"Response:Header:{header.Key} - " + string.Join(",", header.Value));
134+
if (_redactedHeaders != null && _redactedHeaders.Contains(header.Key))
135+
logProperties.AddOrUpdate($"Response:Header:{header.Key}", TelemetryConstant.REDACTED);
136+
else
137+
logProperties.AddOrUpdate($"Response:Header:{header.Key}", string.Join(",", header.Value));
129138
}
130139
logProperties.AddOrUpdate("Response:StatusCode", response.StatusCode.ToString());
131140
return logProperties;

src/TelemetryExtensionsBuilder.cs

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Linq;
3+
using System.Collections.Generic;
34
using Microsoft.AspNetCore.Builder;
45
using Microsoft.Extensions.Configuration;
56
using Microsoft.Extensions.DependencyInjection;
@@ -16,34 +17,23 @@ public class TelemetryExtensionsBuilder : ITelemetryExtensionsBuilder
1617
protected readonly IConfiguration _configuration;
1718
protected readonly IAppInsightsConfigurationResolver _appInsightsConfigurationResolver;
1819
protected readonly IAppMetadataConfigurationResolver _appMetadataConfigurationResolver;
19-
protected readonly ITelemetryInitializer[] _telemetryInitializers;
20+
protected readonly IList<ITelemetryInitializer> _telemetryInitializers;
2021

21-
private ILogger _logger;
22-
private static TelemetryExtensionsBuilder _instance = null;
23-
private static readonly object _lock = new object();
22+
protected ILogger _logger;
23+
protected static readonly object _lock = new object();
2424

25-
private TelemetryExtensionsBuilder(IConfiguration configuration, params ITelemetryInitializer[] telemetryInitializers)
25+
public TelemetryExtensionsBuilder() { }
26+
27+
public TelemetryExtensionsBuilder(IConfiguration configuration, params ITelemetryInitializer[] telemetryInitializers)
2628
{
2729
_configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
2830
_appInsightsConfigurationResolver = new AppInsightsConfigurationResolver(configuration, telemetryInitializers);
2931
_appMetadataConfigurationResolver = new AppMetadataConfigurationResolver(configuration);
30-
_telemetryInitializers = telemetryInitializers;
32+
_telemetryInitializers = telemetryInitializers ?? Array.Empty<ITelemetryInitializer>();
3133
CreateLogger();
3234
}
3335

34-
public static TelemetryExtensionsBuilder Create(IConfiguration configuration, params ITelemetryInitializer[] telemetryInitializers)
35-
{
36-
lock (_lock)
37-
{
38-
if (_instance == null)
39-
{
40-
_instance = new TelemetryExtensionsBuilder(configuration, telemetryInitializers);
41-
}
42-
return _instance;
43-
}
44-
}
45-
46-
public ILogger CreateLogger()
36+
public virtual ILogger CreateLogger()
4737
{
4838
lock (_lock)
4939
{

0 commit comments

Comments
 (0)