From 143b1b8364898655130b1b07f516dc4f7a4bcfe4 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Sat, 3 Feb 2024 21:19:26 +0100 Subject: [PATCH] Refactor logging to exclude activity state Logging throughout the application, specifically in ActivityExecutionContextExtensions.cs, SendEmail.cs, and more, has been refactored to exclude activity state from log entries. There have also been updates to other files, such as introducing JetBrains.Annotations and modifying certain methods. Additionally, the IHttpMessageHandlerProvider.cs file has been removed. --- src/bundles/Elsa.Server.Web/Program.cs | 1 + .../Contracts/IHttpMessageHandlerProvider.cs | 12 ------------ .../Models/ActivityExecutionRecord.cs | 2 ++ src/modules/Elsa.Email/Activities/SendEmail.cs | 2 +- .../Contexts/ActivityExecutionContext.Cancel.cs | 2 +- .../ActivityExecutionContext.ExecutionLogEntry.cs | 7 ++----- .../Extensions/ActivityExecutionContextExtensions.cs | 4 ++-- .../Middleware/Activities/ExecutionLogMiddleware.cs | 7 ++++--- .../Models/WorkflowExecutionLogEntry.cs | 2 +- .../Providers/ClrWorkflowProvider.cs | 4 +++- 10 files changed, 17 insertions(+), 26 deletions(-) delete mode 100644 src/clients/Elsa.Api.Client/Contracts/IHttpMessageHandlerProvider.cs diff --git a/src/bundles/Elsa.Server.Web/Program.cs b/src/bundles/Elsa.Server.Web/Program.cs index 7dc88b704..2c8ec0f96 100644 --- a/src/bundles/Elsa.Server.Web/Program.cs +++ b/src/bundles/Elsa.Server.Web/Program.cs @@ -87,6 +87,7 @@ services identity.IdentityOptions = options => identitySection.Bind(options); identity.TokenOptions = options => identityTokenSection.Bind(options); + identity.UseStoreBasedApplicationProvider(); identity.UseConfigurationBasedUserProvider(options => identitySection.Bind(options)); identity.UseConfigurationBasedApplicationProvider(options => identitySection.Bind(options)); identity.UseConfigurationBasedRoleProvider(options => identitySection.Bind(options)); diff --git a/src/clients/Elsa.Api.Client/Contracts/IHttpMessageHandlerProvider.cs b/src/clients/Elsa.Api.Client/Contracts/IHttpMessageHandlerProvider.cs deleted file mode 100644 index 1eea665d4..000000000 --- a/src/clients/Elsa.Api.Client/Contracts/IHttpMessageHandlerProvider.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Elsa.Api.Client.Contracts; - -/// -/// Provides an instance. -/// -public interface IHttpMessageHandlerProvider -{ - /// - /// Returns an instance. - /// - HttpMessageHandler GetHandler(); -} \ No newline at end of file diff --git a/src/clients/Elsa.Api.Client/Resources/ActivityExecutions/Models/ActivityExecutionRecord.cs b/src/clients/Elsa.Api.Client/Resources/ActivityExecutions/Models/ActivityExecutionRecord.cs index f0c03f6ca..6102fc078 100644 --- a/src/clients/Elsa.Api.Client/Resources/ActivityExecutions/Models/ActivityExecutionRecord.cs +++ b/src/clients/Elsa.Api.Client/Resources/ActivityExecutions/Models/ActivityExecutionRecord.cs @@ -1,11 +1,13 @@ using Elsa.Api.Client.Resources.WorkflowInstances.Models; using Elsa.Api.Client.Shared.Models; +using JetBrains.Annotations; namespace Elsa.Api.Client.Resources.ActivityExecutions.Models; /// /// Represents a single workflow execution, associated with an individual activity instance. /// +[UsedImplicitly] public class ActivityExecutionRecord : Entity { /// diff --git a/src/modules/Elsa.Email/Activities/SendEmail.cs b/src/modules/Elsa.Email/Activities/SendEmail.cs index 546f7f26a..aa9657d44 100644 --- a/src/modules/Elsa.Email/Activities/SendEmail.cs +++ b/src/modules/Elsa.Email/Activities/SendEmail.cs @@ -120,7 +120,7 @@ public class SendEmail : Activity catch (Exception e) { logger.LogWarning(e, "Error while sending email message"); - context.AddExecutionLogEntry("Error", e.Message, payload: new { e.StackTrace }, includeActivityState: true); + context.AddExecutionLogEntry("Error", e.Message, payload: new { e.StackTrace }); await context.ScheduleActivityAsync(Error, OnErrorCompletedAsync); } } diff --git a/src/modules/Elsa.Workflows.Core/Contexts/ActivityExecutionContext.Cancel.cs b/src/modules/Elsa.Workflows.Core/Contexts/ActivityExecutionContext.Cancel.cs index 19882ba13..082935672 100644 --- a/src/modules/Elsa.Workflows.Core/Contexts/ActivityExecutionContext.Cancel.cs +++ b/src/modules/Elsa.Workflows.Core/Contexts/ActivityExecutionContext.Cancel.cs @@ -34,7 +34,7 @@ public partial class ActivityExecutionContext WorkflowExecutionContext.Bookmarks.RemoveWhere(x => x.ActivityNodeId == NodeId); // Add an execution log entry. - AddExecutionLogEntry("Canceled", payload: JournalData, includeActivityState: true); + AddExecutionLogEntry("Canceled", payload: JournalData); await _cancellationRegistration.DisposeAsync(); await this.SendSignalAsync(new CancelSignal()); diff --git a/src/modules/Elsa.Workflows.Core/Contexts/ActivityExecutionContext.ExecutionLogEntry.cs b/src/modules/Elsa.Workflows.Core/Contexts/ActivityExecutionContext.ExecutionLogEntry.cs index a7ce2cffb..e05a262c6 100644 --- a/src/modules/Elsa.Workflows.Core/Contexts/ActivityExecutionContext.ExecutionLogEntry.cs +++ b/src/modules/Elsa.Workflows.Core/Contexts/ActivityExecutionContext.ExecutionLogEntry.cs @@ -12,12 +12,9 @@ public partial class ActivityExecutionContext /// The message of the event. /// The source of the activity. For example, the source file name and line number in case of composite activities. /// Any contextual data related to this event. - /// True to include activity state with this event, false otherwise. /// Returns the created . - public WorkflowExecutionLogEntry AddExecutionLogEntry(string eventName, string? message = default, string? source = default, object? payload = default, bool includeActivityState = false) + public WorkflowExecutionLogEntry AddExecutionLogEntry(string eventName, string? message = default, string? source = default, object? payload = default) { - var activityState = includeActivityState ? ActivityState : default; - var logEntry = new WorkflowExecutionLogEntry( Id, ParentActivityExecutionContext?.Id, @@ -26,7 +23,7 @@ public partial class ActivityExecutionContext Activity.Version, Activity.Name, NodeId, - activityState, + null, _systemClock.UtcNow, WorkflowExecutionContext.ExecutionLogSequence++, eventName, diff --git a/src/modules/Elsa.Workflows.Core/Extensions/ActivityExecutionContextExtensions.cs b/src/modules/Elsa.Workflows.Core/Extensions/ActivityExecutionContextExtensions.cs index 6a5ef5c36..4d934abcf 100644 --- a/src/modules/Elsa.Workflows.Core/Extensions/ActivityExecutionContextExtensions.cs +++ b/src/modules/Elsa.Workflows.Core/Extensions/ActivityExecutionContextExtensions.cs @@ -469,7 +469,7 @@ public static class ActivityExecutionContextExtensions } // Add an execution log entry. - context.AddExecutionLogEntry("Completed", payload: context.JournalData, includeActivityState: true); + context.AddExecutionLogEntry("Completed", payload: context.JournalData); // Send a signal. await context.SendSignalAsync(new ActivityCompleted(result)); @@ -563,7 +563,7 @@ public static class ActivityExecutionContextExtensions context.WorkflowExecutionContext.Bookmarks.RemoveWhere(x => x.ActivityNodeId == context.NodeId); // Add an execution log entry. - context.AddExecutionLogEntry("Canceled", payload: context.JournalData, includeActivityState: true); + context.AddExecutionLogEntry("Canceled", payload: context.JournalData); await context.SendSignalAsync(new CancelSignal()); await publisher.SendAsync(new ActivityCancelled(context)); diff --git a/src/modules/Elsa.Workflows.Core/Middleware/Activities/ExecutionLogMiddleware.cs b/src/modules/Elsa.Workflows.Core/Middleware/Activities/ExecutionLogMiddleware.cs index fc5a2405c..db14fe43c 100644 --- a/src/modules/Elsa.Workflows.Core/Middleware/Activities/ExecutionLogMiddleware.cs +++ b/src/modules/Elsa.Workflows.Core/Middleware/Activities/ExecutionLogMiddleware.cs @@ -2,6 +2,7 @@ using Elsa.Extensions; using Elsa.Workflows.Contracts; using Elsa.Workflows.Models; using Elsa.Workflows.Pipelines.ActivityExecution; +using JetBrains.Annotations; namespace Elsa.Workflows.Middleware.Activities; @@ -19,6 +20,7 @@ public static class ExecutionLogMiddlewareExtensions /// /// An activity execution middleware component that extracts execution details as objects. /// +[UsedImplicitly] public class ExecutionLogMiddleware : IActivityExecutionMiddleware { private readonly ActivityMiddlewareDelegate _next; @@ -34,7 +36,7 @@ public class ExecutionLogMiddleware : IActivityExecutionMiddleware /// public async ValueTask InvokeAsync(ActivityExecutionContext context) { - context.AddExecutionLogEntry(IsActivityBookmarked(context) ? "Resumed" : "Started", includeActivityState: true); + context.AddExecutionLogEntry(IsActivityBookmarked(context) ? "Resumed" : "Started"); try { @@ -43,13 +45,12 @@ public class ExecutionLogMiddleware : IActivityExecutionMiddleware if (context.Status == ActivityStatus.Running) { if (IsActivityBookmarked(context)) - context.AddExecutionLogEntry("Suspended", payload: context.JournalData, includeActivityState: true); + context.AddExecutionLogEntry("Suspended", payload: context.JournalData); } } catch (Exception exception) { context.AddExecutionLogEntry("Faulted", - includeActivityState: true, message: exception.Message, payload: new { diff --git a/src/modules/Elsa.Workflows.Core/Models/WorkflowExecutionLogEntry.cs b/src/modules/Elsa.Workflows.Core/Models/WorkflowExecutionLogEntry.cs index db3983d75..dcad33b5b 100644 --- a/src/modules/Elsa.Workflows.Core/Models/WorkflowExecutionLogEntry.cs +++ b/src/modules/Elsa.Workflows.Core/Models/WorkflowExecutionLogEntry.cs @@ -11,7 +11,7 @@ public record WorkflowExecutionLogEntry( int ActivityTypeVersion, string? ActivityName, string NodeId, - IDictionary? ActivityState, + [property: Obsolete("USe ActivityInstanceId instead to locate activity state from ActivityExecutionLog")]IDictionary? ActivityState, DateTimeOffset Timestamp, long Sequence, string? EventName, diff --git a/src/modules/Elsa.Workflows.Runtime/Providers/ClrWorkflowProvider.cs b/src/modules/Elsa.Workflows.Runtime/Providers/ClrWorkflowProvider.cs index 26f2334f0..c20d8cbdd 100644 --- a/src/modules/Elsa.Workflows.Runtime/Providers/ClrWorkflowProvider.cs +++ b/src/modules/Elsa.Workflows.Runtime/Providers/ClrWorkflowProvider.cs @@ -4,6 +4,7 @@ using Elsa.Workflows.Runtime.Contracts; using Elsa.Workflows.Runtime.Features; using Elsa.Workflows.Runtime.Models; using Elsa.Workflows.Runtime.Options; +using JetBrains.Annotations; using Microsoft.Extensions.Options; namespace Elsa.Workflows.Runtime.Providers; @@ -11,6 +12,7 @@ namespace Elsa.Workflows.Runtime.Providers; /// /// Provides workflows to the system that are registered with /// +[UsedImplicitly] public class ClrWorkflowProvider : IWorkflowProvider { private readonly IWorkflowBuilderFactory _workflowBuilderFactory; @@ -18,7 +20,7 @@ public class ClrWorkflowProvider : IWorkflowProvider private readonly RuntimeOptions _options; /// - /// Constructor. + /// Initializes a new instance of the class. /// public ClrWorkflowProvider( IOptions options,