WorkflowForge.Extensions.Observability.Performance
2.0.0
dotnet add package WorkflowForge.Extensions.Observability.Performance --version 2.0.0
NuGet\Install-Package WorkflowForge.Extensions.Observability.Performance -Version 2.0.0
<PackageReference Include="WorkflowForge.Extensions.Observability.Performance" Version="2.0.0" />
<PackageVersion Include="WorkflowForge.Extensions.Observability.Performance" Version="2.0.0" />
<PackageReference Include="WorkflowForge.Extensions.Observability.Performance" />
paket add WorkflowForge.Extensions.Observability.Performance --version 2.0.0
#r "nuget: WorkflowForge.Extensions.Observability.Performance, 2.0.0"
#:package WorkflowForge.Extensions.Observability.Performance@2.0.0
#addin nuget:?package=WorkflowForge.Extensions.Observability.Performance&version=2.0.0
#tool nuget:?package=WorkflowForge.Extensions.Observability.Performance&version=2.0.0
WorkflowForge.Extensions.Observability.Performance
<p align="center"> <img src="https://raw.githubusercontent.com/animatlabs/workflow-forge/main/icon.png" alt="WorkflowForge" width="120" height="120"> </p>
Performance monitoring extension for WorkflowForge with operation timing and metrics collection.
Zero Dependencies - Zero Conflicts
This extension has ZERO external dependencies. This means:
- NO DLL Hell - No third-party dependencies to conflict with
- NO Version Conflicts - Works with any versions of your application dependencies
- Clean Deployment - Pure WorkflowForge extension
Lightweight architecture: Built entirely on WorkflowForge core with no external libraries.
Installation
dotnet add package WorkflowForge.Extensions.Observability.Performance
Requires: .NET Standard 2.0 or later
Quick Start
using WorkflowForge.Extensions.Observability.Performance;
// Add timing middleware
using var foundry = WorkflowForge.CreateFoundry("PerformanceMonitored");
foundry.AddMiddleware(new TimingMiddleware(logger));
// Timing data is logged per operation
await smith.ForgeAsync(workflow, foundry);
// Output:
// [INF] Operation 'CalculateTotal' started
// [INF] Operation 'CalculateTotal' completed in 23.4ms
Key Features
- Operation Timing: Precise timing for each operation
- Middleware-Based: Non-intrusive timing collection
- Automatic Logging: Integrates with foundry logger
- Memory Tracking: Optional memory allocation tracking
- Configurable Thresholds: Alert on slow operations
- Zero Overhead: Minimal performance impact
Configuration
This extension requires NO configuration. Simply add the middleware to your foundry:
using var foundry = WorkflowForge.CreateFoundry("PerformanceMonitored");
foundry.AddMiddleware(new TimingMiddleware(logger));
The extension works out-of-the-box with sensible defaults. See Configuration Guide for more information.
Advanced Usage
Custom Timing Middleware
public class DetailedTimingMiddleware : IWorkflowOperationMiddleware
{
private readonly IWorkflowForgeLogger _logger;
private readonly TimeSpan _slowThreshold;
public DetailedTimingMiddleware(IWorkflowForgeLogger logger, TimeSpan slowThreshold)
{
_logger = logger;
_slowThreshold = slowThreshold;
}
public async Task<object?> ExecuteAsync(
Func<Task<object?>> next,
IWorkflowOperation operation,
IWorkflowFoundry foundry,
CancellationToken cancellationToken)
{
var sw = Stopwatch.StartNew();
try
{
var result = await next();
sw.Stop();
if (sw.Elapsed > _slowThreshold)
{
_logger.LogWarning(
"SLOW: Operation {Name} took {Duration}ms (threshold: {Threshold}ms)",
operation.Name,
sw.Elapsed.TotalMilliseconds,
_slowThreshold.TotalMilliseconds);
}
else
{
_logger.LogInformation(
"Operation {Name} completed in {Duration}ms",
operation.Name,
sw.Elapsed.TotalMilliseconds);
}
return result;
}
catch (Exception ex)
{
sw.Stop();
_logger.LogError(ex,
"Operation {Name} failed after {Duration}ms",
operation.Name,
sw.Elapsed.TotalMilliseconds);
throw;
}
}
}
Memory Tracking
public class MemoryTrackingMiddleware : IWorkflowOperationMiddleware
{
public async Task<object?> ExecuteAsync(
Func<Task<object?>> next,
IWorkflowOperation operation,
IWorkflowFoundry foundry,
CancellationToken cancellationToken)
{
var gen0Before = GC.CollectionCount(0);
var memoryBefore = GC.GetTotalMemory(false);
var result = await next();
var gen0After = GC.CollectionCount(0);
var memoryAfter = GC.GetTotalMemory(false);
foundry.Logger.LogInformation(
"Operation {Name}: Memory delta {MemoryDelta} bytes, Gen0 collections: {Gen0Collections}",
operation.Name,
memoryAfter - memoryBefore,
gen0After - gen0Before);
return result;
}
}
Performance Metrics
The extension tracks:
- Operation Duration: Precise timing for each operation
- Workflow Duration: Total workflow execution time
- Slow Operations: Operations exceeding threshold
- Memory Allocation: Optional memory tracking
- GC Collections: Garbage collection metrics
Documentation
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- System.ComponentModel.Annotations (>= 5.0.0)
- System.Diagnostics.DiagnosticSource (>= 10.0.2)
- WorkflowForge (>= 2.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Major release v2.0.0:
- Dependencies internalized via ILRepack (where applicable)
- Users can avoid third-party version conflicts
- ISystemTimeProvider integrated for testability
- Enhanced documentation and samples
- Enterprise-ready for production workflows