Skip to content

Commit

Permalink
Merge pull request #2 from CorrelatorSharp/feature-parent-id-header
Browse files Browse the repository at this point in the history
add the parent ID as a specified header/field value
  • Loading branch information
jasond-s authored Nov 1, 2018
2 parents 8f684af + 002f2a0 commit fd7f3c8
Show file tree
Hide file tree
Showing 6 changed files with 64 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.5" />
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.9" />
</ItemGroup>

<ItemGroup>
Expand Down
10 changes: 4 additions & 6 deletions CorrelatorSharp.AspNetCore.Mvc.Sample/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,11 @@ namespace CorrelatorSharp.AspNetCore.Mvc.Sample
{
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static void Main(string[] args)
=> BuildWebHost(args).Run();

public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
public static IWebHost BuildWebHost(string[] args)
=> WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
Expand Down
22 changes: 9 additions & 13 deletions CorrelatorSharp.AspNetCore.Mvc.Sample/Startup.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,23 @@
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using CorrelatorSharp.AspNetCore.Mvc;

namespace CorrelatorSharp.AspNetCore.Mvc.Sample
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public Startup(IConfiguration configuration)
=> Configuration = configuration;

public IConfiguration Configuration { get; }

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(configuration =>
{
configuration.Filters.Add(new CorrelationIdActionFilter());
});
}

=> services.AddMvc(configuration
=>
{
configuration.Filters.Add(new CorrelationIdActionFilter());
});

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
Expand Down
50 changes: 46 additions & 4 deletions CorrelatorSharp.AspNetCore.Mvc/CorrelationIdActionFilter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,30 +7,72 @@ namespace CorrelatorSharp.AspNetCore.Mvc
public class CorrelationIdActionFilter : IAsyncActionFilter
{
private static readonly string CorrelationIdHttpHeader = Headers.CorrelationId;
private static readonly string CorrelationParentIdHttpHeader = Headers.CorrelationParentId;
private static readonly string CorrelationNameHttpHeader = Headers.CorrelationName;

public bool AllowMultiple => false;
public bool AllowMultiple
=> false;

public async Task OnActionExecutionAsync(ActionExecutingContext actionContext, ActionExecutionDelegate next)
{
string correlationScopeName = null;
string correlationId = null;
string parentCorrelationId = null;

var headers = actionContext.HttpContext.Request?.Headers;
if (headers != null && headers.TryGetValue(CorrelationIdHttpHeader, out var correlationHeaderValue))
if (headers != null)
{
correlationId = correlationHeaderValue;
if (headers.TryGetValue(CorrelationIdHttpHeader, out var correlationHeaderValue))
{
correlationId = correlationHeaderValue;
}

if (headers.TryGetValue(CorrelationParentIdHttpHeader, out var correlationParentHeaderValue))
{
parentCorrelationId = correlationParentHeaderValue;
}

if (headers.TryGetValue(CorrelationNameHttpHeader, out var correlationNameHeaderValue))
{
correlationScopeName = correlationNameHeaderValue;
}
}

if (string.IsNullOrWhiteSpace(correlationId))
{
correlationId = Guid.NewGuid().ToString();
}

using (var scope = ActivityScope.New(null, correlationId))
if (string.IsNullOrWhiteSpace(parentCorrelationId) == false)
{
await InvokeWithParentScope(next, correlationScopeName, correlationId, parentCorrelationId);
}
else
{
await InvokeWithNewScope(next, correlationScopeName, correlationId);
}
}

private static async Task InvokeWithNewScope(ActionExecutionDelegate next, string correlationScopeName, string correlationId)
{
using (var scope = ActivityScope.Create(correlationScopeName, correlationId))
{
var actionResult = await next.Invoke();

actionResult.HttpContext.Response.Headers.Add(CorrelationIdHttpHeader, scope.Id);
}
}

private static async Task InvokeWithParentScope(ActionExecutionDelegate next, string correlationScopeName, string correlationId, string parentCorrelationId)
{
using (var parent = ActivityScope.Create(null, parentCorrelationId))
using (var child = ActivityScope.Child(correlationScopeName, correlationId))
{
var actionResult = await next.Invoke();

actionResult.HttpContext.Response.Headers.Add(CorrelationParentIdHttpHeader, parent.Id);
actionResult.HttpContext.Response.Headers.Add(CorrelationIdHttpHeader, child.Id);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<PackageId>CorrelatorSharp.AspNetCore.Mvc</PackageId>

<Version>1.0.0</Version>
<Version>1.1.0</Version>

<!--Bump the assembly version only on major releases-->
<AssemblyVersion>1.1.0.0</AssemblyVersion>
Expand All @@ -18,7 +18,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="CorrelatorSharp" Version="[1.4.0,2)" />
<PackageReference Include="CorrelatorSharp" Version="1.5.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Core" Version="[2.0,3)" />
</ItemGroup>

Expand Down
2 changes: 1 addition & 1 deletion appveyor.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
environment:
package_version: '1.0.0'
package_version: '1.1.0'
assembly_version: '1.1.0.0'

version: '$(package_version)+{build}'
Expand Down

0 comments on commit fd7f3c8

Please sign in to comment.