diff --git a/Framework/Azure/Cqrs.Azure.ConfigurationManager/Cqrs.Azure.ConfigurationManager.csproj b/Framework/Azure/Cqrs.Azure.ConfigurationManager/Cqrs.Azure.ConfigurationManager.csproj index 81e2e1e8d..be4d3a06a 100644 --- a/Framework/Azure/Cqrs.Azure.ConfigurationManager/Cqrs.Azure.ConfigurationManager.csproj +++ b/Framework/Azure/Cqrs.Azure.ConfigurationManager/Cqrs.Azure.ConfigurationManager.csproj @@ -70,7 +70,7 @@ - + diff --git a/Framework/Azure/Cqrs.Azure.Functions.Isolated/Configuration/IsolatedFunctionHostModule.cs b/Framework/Azure/Cqrs.Azure.Functions.Isolated/Configuration/IsolatedFunctionHostModule.cs index c2c7847ae..6c71945ef 100644 --- a/Framework/Azure/Cqrs.Azure.Functions.Isolated/Configuration/IsolatedFunctionHostModule.cs +++ b/Framework/Azure/Cqrs.Azure.Functions.Isolated/Configuration/IsolatedFunctionHostModule.cs @@ -19,6 +19,8 @@ using Cqrs.Services; using Cqrs.DependencyInjection.Modules; using Microsoft.Extensions.DependencyInjection; +using Microsoft.ApplicationInsights; +using Microsoft.ApplicationInsights.Extensibility; #if NET6_0 using Microsoft.Extensions.Configuration; @@ -38,10 +40,10 @@ public class IsolatedFunctionHostModule : ResolvableModule /// public override void Load(IServiceCollection services) { - RegisterBasicHelpers(services); RegisterAzureConfigurations(services); RegisterBasicServices(services); RegisterWebBit(services); + RegisterBasicHelpers(services); } #endregion @@ -87,21 +89,52 @@ protected virtual void RegisterBasicHelpers(IServiceCollection services) { RegisterContextItemCollectionFactory(services); + bool isTelemetryClientBound = IsRegistered(services); + if (!isTelemetryClientBound) + { + services.AddSingleton + ( + new TelemetryClient(new TelemetryConfiguration() + { + ConnectionString = DependencyResolver.ConfigurationManager.GetConnectionString("Cqrs.Hosts.ApplicationInsights.ConnectionString") + }) + ); + } + bool isTelemetryHelperBound = IsRegistered(services); + TelemetryHelper helper = null; if (!isTelemetryHelperBound) { - services.AddSingleton(); + services.AddSingleton(p => { + var telemetryHelper = new TelemetryHelper + ( + Resolve(services), + Resolve(services), + Resolve(services) + ); + + if (DependencyResolver.ConfigurationManager.TryGetSetting("Cqrs.Hosts.ApplicationInsights.CloudRoleName", out string cloudRoleName) && !string.IsNullOrWhiteSpace(cloudRoleName)) + telemetryHelper.GetCloudRoleName = () => { return cloudRoleName; }; + if (DependencyResolver.ConfigurationManager.TryGetSetting("Cqrs.Hosts.ApplicationInsights.OperationName", out string operationName) && !string.IsNullOrWhiteSpace(operationName)) + telemetryHelper.GetOperationName = () => { return operationName; }; + + return telemetryHelper; + }); } else { var obj = Resolve(services); - if (!(obj is TelemetryHelper)) + helper = obj as TelemetryHelper; + if (helper == null) { Unbind(services); services.AddSingleton(); + obj = Resolve(services); + helper = obj as TelemetryHelper; } } } + /// /// Registers the required. /// diff --git a/Framework/Azure/Cqrs.Azure.Functions.Isolated/Cqrs.Azure.Functions.Isolated.csproj b/Framework/Azure/Cqrs.Azure.Functions.Isolated/Cqrs.Azure.Functions.Isolated.csproj index c0c162cc2..824453110 100644 --- a/Framework/Azure/Cqrs.Azure.Functions.Isolated/Cqrs.Azure.Functions.Isolated.csproj +++ b/Framework/Azure/Cqrs.Azure.Functions.Isolated/Cqrs.Azure.Functions.Isolated.csproj @@ -56,8 +56,8 @@ - - + + diff --git a/Framework/Azure/Cqrs.Azure.Functions.ServiceBus.Isolated/Cqrs.Azure.Functions.ServiceBus.Isolated.csproj b/Framework/Azure/Cqrs.Azure.Functions.ServiceBus.Isolated/Cqrs.Azure.Functions.ServiceBus.Isolated.csproj index eec7cbe95..6f15e6ca9 100644 --- a/Framework/Azure/Cqrs.Azure.Functions.ServiceBus.Isolated/Cqrs.Azure.Functions.ServiceBus.Isolated.csproj +++ b/Framework/Azure/Cqrs.Azure.Functions.ServiceBus.Isolated/Cqrs.Azure.Functions.ServiceBus.Isolated.csproj @@ -62,7 +62,7 @@ - + diff --git a/Framework/Azure/Cqrs.Azure.Functions.ServiceBus/Cqrs.Azure.Functions.ServiceBus.csproj b/Framework/Azure/Cqrs.Azure.Functions.ServiceBus/Cqrs.Azure.Functions.ServiceBus.csproj index 91caa9d3e..5b974f8a3 100644 --- a/Framework/Azure/Cqrs.Azure.Functions.ServiceBus/Cqrs.Azure.Functions.ServiceBus.csproj +++ b/Framework/Azure/Cqrs.Azure.Functions.ServiceBus/Cqrs.Azure.Functions.ServiceBus.csproj @@ -62,7 +62,7 @@ - + diff --git a/Framework/Azure/Cqrs.Azure.Functions/Configuration/FunctionHostModule.cs b/Framework/Azure/Cqrs.Azure.Functions/Configuration/FunctionHostModule.cs index 51ea75cf4..46fece252 100644 --- a/Framework/Azure/Cqrs.Azure.Functions/Configuration/FunctionHostModule.cs +++ b/Framework/Azure/Cqrs.Azure.Functions/Configuration/FunctionHostModule.cs @@ -19,6 +19,9 @@ using Cqrs.Services; using Cqrs.DependencyInjection.Modules; using Microsoft.Extensions.DependencyInjection; +using Microsoft.ApplicationInsights.Extensibility; +using Microsoft.ApplicationInsights; + #if NET6_0 using Microsoft.Extensions.Configuration; @@ -38,10 +41,10 @@ public class FunctionHostModule : ResolvableModule /// public override void Load(IServiceCollection services) { - RegisterBasicHelpers(services); RegisterAzureConfigurations(services); RegisterBasicServices(services); RegisterWebBit(services); + RegisterBasicHelpers(services); } #endregion @@ -87,21 +90,52 @@ protected virtual void RegisterBasicHelpers(IServiceCollection services) { RegisterContextItemCollectionFactory(services); + bool isTelemetryClientBound = IsRegistered(services); + if (!isTelemetryClientBound) + { + services.AddSingleton + ( + new TelemetryClient(new TelemetryConfiguration() + { + ConnectionString = DependencyResolver.ConfigurationManager.GetConnectionString("Cqrs.Hosts.ApplicationInsights.ConnectionString") + }) + ); + } + bool isTelemetryHelperBound = IsRegistered(services); + TelemetryHelper helper = null; if (!isTelemetryHelperBound) { - services.AddSingleton(); + services.AddSingleton(p => { + var telemetryHelper = new TelemetryHelper + ( + Resolve(services), + Resolve(services), + Resolve(services) + ); + + if (DependencyResolver.ConfigurationManager.TryGetSetting("Cqrs.Hosts.ApplicationInsights.CloudRoleName", out string cloudRoleName) && !string.IsNullOrWhiteSpace(cloudRoleName)) + telemetryHelper.GetCloudRoleName = () => { return cloudRoleName; }; + if (DependencyResolver.ConfigurationManager.TryGetSetting("Cqrs.Hosts.ApplicationInsights.OperationName", out string operationName) && !string.IsNullOrWhiteSpace(operationName)) + telemetryHelper.GetOperationName = () => { return operationName; }; + + return telemetryHelper; + }); } else { var obj = Resolve(services); - if (!(obj is TelemetryHelper)) + helper = obj as TelemetryHelper; + if (helper == null) { Unbind(services); services.AddSingleton(); + obj = Resolve(services); + helper = obj as TelemetryHelper; } } } + /// /// Registers the required. /// diff --git a/Framework/Azure/Cqrs.Azure.Functions/Cqrs.Azure.Functions.csproj b/Framework/Azure/Cqrs.Azure.Functions/Cqrs.Azure.Functions.csproj index 1e33b3b0d..0d833f2a4 100644 --- a/Framework/Azure/Cqrs.Azure.Functions/Cqrs.Azure.Functions.csproj +++ b/Framework/Azure/Cqrs.Azure.Functions/Cqrs.Azure.Functions.csproj @@ -55,8 +55,8 @@ - - + + diff --git a/Framework/Azure/Cqrs.Azure.ServiceBus/AzureCommandBusReceiver.cs b/Framework/Azure/Cqrs.Azure.ServiceBus/AzureCommandBusReceiver.cs index 2abaff74d..3795b21b7 100644 --- a/Framework/Azure/Cqrs.Azure.ServiceBus/AzureCommandBusReceiver.cs +++ b/Framework/Azure/Cqrs.Azure.ServiceBus/AzureCommandBusReceiver.cs @@ -467,6 +467,7 @@ void ReceiveCommand(IMessageReceiver Guid? guidAuthenticationToken = null; string stringAuthenticationToken = null; int? intAuthenticationToken = null; + string commandType = null; IDictionary telemetryProperties = ExtractTelemetryProperties(message, "Azure/Servicebus"); TelemetryHelper.TrackMetric("Cqrs/Handle/Command", CurrentHandles++, telemetryProperties); @@ -498,7 +499,7 @@ await AzureBusHelper.ReceiveCommandAsync( #endif () => { - wasSuccessfull = null; + wasSuccessfull = null; telemetryName = $"Cqrs/Handle/Command/Skipped/{message.MessageId}"; responseCode = "204"; // Remove message from queue @@ -560,7 +561,8 @@ await AzureBusHelper.RefreshLockAsync(serviceBusReceiver, { if (command != null) { - telemetryName = $"{command.GetType().FullName}/{command.Id}"; + commandType = command.GetType().FullName; + telemetryName = $"{commandType}/{command.Id}"; authenticationToken = command.AuthenticationToken as ISingleSignOnToken; if (AuthenticationTokenIsGuid) guidAuthenticationToken = command.AuthenticationToken as Guid?; @@ -750,6 +752,22 @@ await AzureBusHelper.RefreshLockAsync(serviceBusReceiver, TelemetryHelper.TrackMetric("Cqrs/Handle/Command", CurrentHandles--, telemetryProperties); mainStopWatch.Stop(); + + TelemetryHelper.TrackProcessFlow + ( + telemetryName, + new Uri(string.Format("cqrs://{0}", telemetryName)), + "Command", + commandType, + GetType().Name, + null, + mainStopWatch.Elapsed, + responseCode, + wasSuccessfull == null || wasSuccessfull.Value, + null, + telemetryProperties + ); + if (guidAuthenticationToken != null) TelemetryHelper.TrackRequest ( diff --git a/Framework/Azure/Cqrs.Azure.ServiceBus/AzureEventBusReceiver.cs b/Framework/Azure/Cqrs.Azure.ServiceBus/AzureEventBusReceiver.cs index 6e6209cf2..e32b8d433 100644 --- a/Framework/Azure/Cqrs.Azure.ServiceBus/AzureEventBusReceiver.cs +++ b/Framework/Azure/Cqrs.Azure.ServiceBus/AzureEventBusReceiver.cs @@ -479,6 +479,7 @@ void ReceiveEvent(IMessageReceiver Guid? guidAuthenticationToken = null; string stringAuthenticationToken = null; int? intAuthenticationToken = null; + string eventType = null; IDictionary telemetryProperties = ExtractTelemetryProperties(message, "Azure/Servicebus"); TelemetryHelper.TrackMetric("Cqrs/Handle/Event", CurrentHandles++, telemetryProperties); @@ -572,7 +573,8 @@ await AzureBusHelper.RefreshLockAsync(serviceBusReceiver, { if (@event != null) { - telemetryName = $"{@event.GetType().FullName}/{@event.GetIdentity()}/{@event.Id}"; + eventType = @event.GetType().FullName; + telemetryName = $"{eventType}/{@event.GetIdentity()}/{@event.Id}"; authenticationToken = @event.AuthenticationToken as ISingleSignOnToken; if (AuthenticationTokenIsGuid) guidAuthenticationToken = @event.AuthenticationToken as Guid?; @@ -766,6 +768,22 @@ await AzureBusHelper.RefreshLockAsync(serviceBusReceiver, TelemetryHelper.TrackMetric("Cqrs/Handle/Event", CurrentHandles--, telemetryProperties); mainStopWatch.Stop(); + + TelemetryHelper.TrackProcessFlow + ( + telemetryName, + new Uri(string.Format("cqrs://{0}", telemetryName)), + "Event", + eventType, + GetType().Name, + null, + mainStopWatch.Elapsed, + responseCode, + wasSuccessfull == null || wasSuccessfull.Value, + null, + telemetryProperties + ); + if (guidAuthenticationToken != null) TelemetryHelper.TrackRequest ( diff --git a/Framework/Azure/Cqrs.Azure.ServiceBus/Cqrs.Azure.ServiceBus.csproj b/Framework/Azure/Cqrs.Azure.ServiceBus/Cqrs.Azure.ServiceBus.csproj index 17f6d0f9e..f83e8d536 100644 --- a/Framework/Azure/Cqrs.Azure.ServiceBus/Cqrs.Azure.ServiceBus.csproj +++ b/Framework/Azure/Cqrs.Azure.ServiceBus/Cqrs.Azure.ServiceBus.csproj @@ -126,7 +126,7 @@ - + diff --git a/Framework/Azure/Cqrs.Azure.WebJobs/Cqrs.Azure.WebJobs.csproj b/Framework/Azure/Cqrs.Azure.WebJobs/Cqrs.Azure.WebJobs.csproj index 11e8399f1..a7d289bb7 100644 --- a/Framework/Azure/Cqrs.Azure.WebJobs/Cqrs.Azure.WebJobs.csproj +++ b/Framework/Azure/Cqrs.Azure.WebJobs/Cqrs.Azure.WebJobs.csproj @@ -86,7 +86,7 @@ - + diff --git a/Framework/Cqrs/Configuration/ConfigurationExtensions.cs b/Framework/Cqrs/Configuration/ConfigurationExtensions.cs index c934cf96b..41a7a7caa 100644 --- a/Framework/Cqrs/Configuration/ConfigurationExtensions.cs +++ b/Framework/Cqrs/Configuration/ConfigurationExtensions.cs @@ -7,9 +7,11 @@ #endregion using System; -using Chinchilla.Logging; +using System.IO; using System.Reflection; +using Chinchilla.Logging; using Chinchilla.Logging.Configuration; +using Chinchilla.StateManagement; namespace Cqrs.Configuration { @@ -45,23 +47,53 @@ public static ITelemetryHelper CreateTelemetryHelper(this IConfigurationManager if (useApplicationInsightTelemetryHelper) { - ITelemetryHelper helper; - try - { + string assemblyFile = Path.Combine(GetExecutionPath(), "Chinchilla.Logging.Azure.ApplicationInsights.dll"); + ITelemetryHelper helper = null; + Action action = () => { + try + { #if NETSTANDARD2_0 - helper = (ITelemetryHelper)DotNetStandard2Helper.CreateInstanceFrom(string.Format("{0}\\Chinchilla.Logging.Azure.ApplicationInsights.dll", GetExecutionPath()), "Chinchilla.Logging.Azure.ApplicationInsights.TelemetryHelper", false, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.CreateInstance, null, new object[] { correlationIdHelper, DependencyResolver.Current.Resolve() }, null, null); + helper = (ITelemetryHelper)DotNetStandard2Helper.CreateInstanceFrom(assemblyFile, "Chinchilla.Logging.Azure.ApplicationInsights.TelemetryHelper", false, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.CreateInstance, null, new object[] { correlationIdHelper, DependencyResolver.Current.Resolve(), DependencyResolver.Current.Resolve(), false }, null, null); #else - helper = (ITelemetryHelper)Activator.CreateInstanceFrom(string.Format("{0}\\Chinchilla.Logging.Azure.ApplicationInsights.dll", GetExecutionPath()), "Chinchilla.Logging.Azure.ApplicationInsights.TelemetryHelper", false, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.CreateInstance, null, new object[] { correlationIdHelper, DependencyResolver.Current.Resolve() }, null, null).Unwrap(); + helper = (ITelemetryHelper)Activator.CreateInstanceFrom(assemblyFile, "Chinchilla.Logging.Azure.ApplicationInsights.TelemetryHelper", false, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.CreateInstance, null, new object[] { correlationIdHelper, DependencyResolver.Current.Resolve(), DependencyResolver.Current.Resolve(), false }, null, null).Unwrap(); #endif - } - catch - { + } + catch (FileNotFoundException) + { + throw; + } + catch + { #if NETSTANDARD2_0 - helper = (ITelemetryHelper)DotNetStandard2Helper.CreateInstanceFrom(string.Format("{0}\\Chinchilla.Logging.Azure.ApplicationInsights.dll", GetExecutionPath()), "Chinchilla.Logging.Azure.ApplicationInsights.TelemetryHelper", false, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.CreateInstance, null, new object[] { correlationIdHelper }, null, null); + helper = (ITelemetryHelper)DotNetStandard2Helper.CreateInstanceFrom(assemblyFile, "Chinchilla.Logging.Azure.ApplicationInsights.TelemetryHelper", false, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.CreateInstance, null, new object[] { correlationIdHelper, null, DependencyResolver.Current.Resolve(), false }, null, null); #else - helper = (ITelemetryHelper)Activator.CreateInstanceFrom(string.Format("{0}\\Chinchilla.Logging.Azure.ApplicationInsights.dll", GetExecutionPath()), "Chinchilla.Logging.Azure.ApplicationInsights.TelemetryHelper", false, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.CreateInstance, null, new object[] { correlationIdHelper }, null, null).Unwrap(); + helper = (ITelemetryHelper)Activator.CreateInstanceFrom(assemblyFile, "Chinchilla.Logging.Azure.ApplicationInsights.TelemetryHelper", false, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.CreateInstance, null, new object[] { correlationIdHelper, null, DependencyResolver.Current.Resolve(), false }, null, null).Unwrap(); #endif + } + }; + try + { + action(); } + catch (FileNotFoundException) + { + assemblyFile = Path.Combine(GetExecutionPath(), "..", "Chinchilla.Logging.Azure.ApplicationInsights.dll"); + action(); + } + + if (configurationManager.TryGetSetting("Cqrs.Hosts.ApplicationInsights.CloudRoleName", out string cloudRoleName) && !string.IsNullOrWhiteSpace(cloudRoleName)) + { + PropertyInfo getCloudRoleNameProperty = helper.GetType().GetProperty("GetCloudRoleName", BindingFlags.Instance | BindingFlags.Public); + if (getCloudRoleNameProperty != null) + getCloudRoleNameProperty.SetValue(helper, (Func)(() => { return cloudRoleName; }), null); + } + if (configurationManager.TryGetSetting("Cqrs.Hosts.ApplicationInsights.OperationName", out string operationName) && !string.IsNullOrWhiteSpace(operationName)) + { + PropertyInfo getOperationNameProperty = helper.GetType().GetProperty("GetOperationName", BindingFlags.Instance | BindingFlags.Public); + if (getOperationNameProperty != null) + getOperationNameProperty.SetValue(helper, (Func)(() => { return operationName; }), null); + } + return helper; } return new NullTelemetryHelper(); diff --git a/Framework/Cqrs/Cqrs.csproj b/Framework/Cqrs/Cqrs.csproj index 0afc9984f..a8f4f4f0b 100644 --- a/Framework/Cqrs/Cqrs.csproj +++ b/Framework/Cqrs/Cqrs.csproj @@ -157,8 +157,8 @@ - - + + diff --git a/Framework/Ninject/Azure/Cqrs.Ninject.Azure.ServiceBus.CommandBus/Cqrs.Ninject.Azure.ServiceBus.CommandBus.csproj b/Framework/Ninject/Azure/Cqrs.Ninject.Azure.ServiceBus.CommandBus/Cqrs.Ninject.Azure.ServiceBus.CommandBus.csproj index 349592a9f..01654c80b 100644 --- a/Framework/Ninject/Azure/Cqrs.Ninject.Azure.ServiceBus.CommandBus/Cqrs.Ninject.Azure.ServiceBus.CommandBus.csproj +++ b/Framework/Ninject/Azure/Cqrs.Ninject.Azure.ServiceBus.CommandBus/Cqrs.Ninject.Azure.ServiceBus.CommandBus.csproj @@ -74,7 +74,7 @@ - + diff --git a/Framework/Ninject/Azure/Cqrs.Ninject.Azure.ServiceBus.EventBus/Cqrs.Ninject.Azure.ServiceBus.EventBus.csproj b/Framework/Ninject/Azure/Cqrs.Ninject.Azure.ServiceBus.EventBus/Cqrs.Ninject.Azure.ServiceBus.EventBus.csproj index 6364bee80..a4edf2fc3 100644 --- a/Framework/Ninject/Azure/Cqrs.Ninject.Azure.ServiceBus.EventBus/Cqrs.Ninject.Azure.ServiceBus.EventBus.csproj +++ b/Framework/Ninject/Azure/Cqrs.Ninject.Azure.ServiceBus.EventBus/Cqrs.Ninject.Azure.ServiceBus.EventBus.csproj @@ -75,7 +75,7 @@ - + diff --git a/Framework/Ninject/Azure/Cqrs.Ninject.Azure.Wcf/Cqrs.Ninject.Azure.Wcf.csproj b/Framework/Ninject/Azure/Cqrs.Ninject.Azure.Wcf/Cqrs.Ninject.Azure.Wcf.csproj index b8e88171c..9f4bdafb9 100644 --- a/Framework/Ninject/Azure/Cqrs.Ninject.Azure.Wcf/Cqrs.Ninject.Azure.Wcf.csproj +++ b/Framework/Ninject/Azure/Cqrs.Ninject.Azure.Wcf/Cqrs.Ninject.Azure.Wcf.csproj @@ -92,8 +92,8 @@ - - + + diff --git a/Framework/Ninject/Cqrs.Ninject/Cqrs.Ninject.csproj b/Framework/Ninject/Cqrs.Ninject/Cqrs.Ninject.csproj index adcccf243..2828fe3d7 100644 --- a/Framework/Ninject/Cqrs.Ninject/Cqrs.Ninject.csproj +++ b/Framework/Ninject/Cqrs.Ninject/Cqrs.Ninject.csproj @@ -82,7 +82,7 @@ - + diff --git a/Scheduler/Cqrs.Scheduler.SampleReport/EventReceiver.cs b/Scheduler/Cqrs.Scheduler.SampleReport/EventReceiver.cs index 9d9b4a711..01df74237 100644 --- a/Scheduler/Cqrs.Scheduler.SampleReport/EventReceiver.cs +++ b/Scheduler/Cqrs.Scheduler.SampleReport/EventReceiver.cs @@ -1,10 +1,11 @@ +using System; +using System.Threading.Tasks; using Azure.Messaging.ServiceBus; +using Chinchilla.StateManagement; using Cqrs.Azure.Functions.ServiceBus; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.ServiceBus; using Microsoft.Extensions.Logging; -using System; -using System.Threading.Tasks; [ServiceBusAccount("ConnectionStrings:Cqrs.Azure.EventBus.ConnectionString")] public class EventReceiver @@ -13,26 +14,31 @@ public class EventReceiver private readonly AzureFunctionEventBusReceiver _eventReceiver; - public EventReceiver(ILogger log, AzureFunctionEventBusReceiver eventReceiver) + private readonly IContextItemCollection _backChannel; + + public EventReceiver(ILogger log, AzureFunctionEventBusReceiver eventReceiver, IContextItemCollectionFactory contextItemCollectionFactory) { _logger = log; _eventReceiver = eventReceiver; + _backChannel = contextItemCollectionFactory.GetCurrentContext(); } /// /// Receives a from the event bus. /// [FunctionName("SampleReports-Private")] - public async virtual Task ReceiveEventPrivate([ServiceBusTrigger("%Cqrs:Azure:EventBus:PrivateEvent:Topic:Name%", "%Cqrs:Azure:EventBus:PrivateEvent:Topic:Subscription:Name%", AutoCompleteMessages = false)] ServiceBusReceivedMessage message, ServiceBusClient client, ServiceBusMessageActions messageActions) + public async virtual Task ReceiveEventPrivate([ServiceBusTrigger("%Cqrs:Azure:EventBus:PrivateEvent:Topic:Name%", "%Cqrs:Azure:EventBus:PrivateEvent:Topic:Subscription:Name%", AutoCompleteMessages = false)] ServiceBusReceivedMessage message, ServiceBusClient client, ServiceBusMessageActions messageActions, ExecutionContext executionContext) { + _backChannel.SetData("Cqrs.Azure.FunctionName", executionContext?.FunctionName); await _eventReceiver.ReceiveEventAsync(client, messageActions, message); } /// /// Receives a from the event bus. /// [FunctionName("SampleReports-Public")] - public async virtual Task ReceiveEventPublic([ServiceBusTrigger("%Cqrs:Azure:EventBus:PublicEvent:Topic:Name%", "%Cqrs:Azure:EventBus:PublicEvent:Topic:Subscription:Name%", AutoCompleteMessages = false)] ServiceBusReceivedMessage message, ServiceBusClient client, ServiceBusMessageActions messageActions) + public async virtual Task ReceiveEventPublic([ServiceBusTrigger("%Cqrs:Azure:EventBus:PublicEvent:Topic:Name%", "%Cqrs:Azure:EventBus:PublicEvent:Topic:Subscription:Name%", AutoCompleteMessages = false)] ServiceBusReceivedMessage message, ServiceBusClient client, ServiceBusMessageActions messageActions, ExecutionContext executionContext) { + _backChannel.SetData("Cqrs.Azure.FunctionName", executionContext?.FunctionName); await _eventReceiver.ReceiveEventAsync(client, messageActions, message); } } \ No newline at end of file diff --git a/Scheduler/Cqrs.Scheduler.TimeZones/CommandHandlers/PublishTimeZonesCommandHandler.partial.cs b/Scheduler/Cqrs.Scheduler.TimeZones/CommandHandlers/PublishTimeZonesCommandHandler.partial.cs index a73f9ab57..7dd64bc5c 100644 --- a/Scheduler/Cqrs.Scheduler.TimeZones/CommandHandlers/PublishTimeZonesCommandHandler.partial.cs +++ b/Scheduler/Cqrs.Scheduler.TimeZones/CommandHandlers/PublishTimeZonesCommandHandler.partial.cs @@ -40,9 +40,10 @@ public virtual async Task HandleAsync(PublishTimeZonesCommand message) DateTimeOffset processDate = GetNowToTheNearestPrevious15Minutes(); - Logger.LogDebug(string.Format("The calculated time is: '{0}' and the actual time is: '{1}'", processDate, actualDateTime)); + string logMessage = $"The calculated time is: '{processDate}' and the actual time is: '{actualDateTime}'"; + Logger.LogDebug(logMessage); // We Console.WriteLine as this is a WebJob and that will send output to the diagnostic Azure WebJob portal. - Console.WriteLine("The calculated time is: '{0}' and the actual time is: '{1}'", processDate, actualDateTime); + Console.WriteLine(logMessage); await FindAndPublishTimeZones(null, processDate); await FindAndPublishTimeZones(0, processDate); diff --git a/Scheduler/Cqrs.Scheduler.TimeZones/CommandReceiver.cs b/Scheduler/Cqrs.Scheduler.TimeZones/CommandReceiver.cs index 5c54db872..bcb839b55 100644 --- a/Scheduler/Cqrs.Scheduler.TimeZones/CommandReceiver.cs +++ b/Scheduler/Cqrs.Scheduler.TimeZones/CommandReceiver.cs @@ -1,8 +1,10 @@ +using System; +using System.Threading.Tasks; using Azure.Messaging.ServiceBus; +using Chinchilla.StateManagement; using Cqrs.Azure.ServiceBus; +using Microsoft.Azure.Functions.Worker; using Microsoft.Extensions.Logging; -using System; -using System.Threading.Tasks; public class CommandReceiver { @@ -10,26 +12,31 @@ public class CommandReceiver private readonly AzureCommandBusReceiver _commandReceiver; - public CommandReceiver(ILogger log, AzureCommandBusReceiver commandReceiver) + private readonly IContextItemCollection _backChannel; + + public CommandReceiver(ILogger log, AzureCommandBusReceiver commandReceiver, IContextItemCollectionFactory contextItemCollectionFactory) { _logger = log; _commandReceiver = commandReceiver; + _backChannel = contextItemCollectionFactory.GetCurrentContext(); } /// /// Receives a from the command bus. /// [Microsoft.Azure.Functions.Worker.Function("Timzezones.Isolated.Private")] - public async virtual Task ReceiveCommandPrivate([Microsoft.Azure.Functions.Worker.ServiceBusTrigger("Cqrs.Scheduler.Commands-Local.Private", "Cqrs.Timezone-Publisher", Connection = "Cqrs.Azure.CommandBus.ConnectionString")] ServiceBusReceivedMessage message) + public async virtual Task ReceiveCommandPrivate([Microsoft.Azure.Functions.Worker.ServiceBusTrigger("Cqrs.Scheduler.Commands-Local.Private", "Cqrs.Timezone-Publisher", Connection = "Cqrs.Azure.CommandBus.ConnectionString")] ServiceBusReceivedMessage message, FunctionContext executionContext) { + _backChannel.SetData("Cqrs.Azure.FunctionName", executionContext?.Features?.Get()?.Name); await _commandReceiver.ReceiveCommandAsync((ServiceBusReceiver)null, message); } /// /// Receives a from the command bus. /// [Microsoft.Azure.Functions.Worker.Function("Timzezones.Isolated.Public")] - public async virtual Task ReceiveCommandPublic([Microsoft.Azure.Functions.Worker.ServiceBusTrigger("Cqrs.Scheduler.Commands-Local.Public", "Cqrs.Timezone-Publisher", Connection = "Cqrs.Azure.CommandBus.ConnectionString")] ServiceBusReceivedMessage message) + public async virtual Task ReceiveCommandPublic([Microsoft.Azure.Functions.Worker.ServiceBusTrigger("Cqrs.Scheduler.Commands-Local.Public", "Cqrs.Timezone-Publisher", Connection = "Cqrs.Azure.CommandBus.ConnectionString")] ServiceBusReceivedMessage message, FunctionContext executionContext) { + _backChannel.SetData("Cqrs.Azure.FunctionName", executionContext?.Features?.Get()?.Name); await _commandReceiver.ReceiveCommandAsync((ServiceBusReceiver)null, message); } } \ No newline at end of file