< Summary

Information
Class: Elsa.Diagnostics.StructuredLogs.ShellFeatures.StructuredLogsFeature
Assembly: Elsa.Diagnostics.StructuredLogs
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Diagnostics.StructuredLogs/ShellFeatures/StructuredLogsFeature.cs
Line coverage
90%
Covered lines: 18
Uncovered lines: 2
Coverable lines: 20
Total lines: 108
Line coverage: 90%
Branch coverage
100%
Covered branches: 4
Total branches: 4
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%11100%
get_RecentLogCapacity()100%11100%
get_SubscriberChannelCapacity()100%11100%
get_MaxRecentLogQuerySize()100%11100%
get_SourceHeartbeatTimeout()100%11100%
get_IncludeStructuredLogsInternalLogs()100%11100%
get_SensitiveNames()100%11100%
get_SensitiveTextPatterns()100%11100%
ConfigureServices(...)100%11100%
MapEndpoints(...)100%210%
ConfigureOptions(...)100%44100%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Diagnostics.StructuredLogs/ShellFeatures/StructuredLogsFeature.cs

#LineLine coverage
 1using CShells.AspNetCore.Features;
 2using CShells.FastEndpoints.Features;
 3using CShells.Features;
 4using Elsa.Diagnostics.StructuredLogs.Extensions;
 5using Elsa.Diagnostics.StructuredLogs.Options;
 6using Elsa.ShellFeatures;
 7using Elsa.Platform.PackageManifest.Generator.Hints;
 8using JetBrains.Annotations;
 9using Microsoft.AspNetCore.Routing;
 10using Microsoft.Extensions.DependencyInjection;
 11using Microsoft.Extensions.Hosting;
 12
 13namespace Elsa.Diagnostics.StructuredLogs.ShellFeatures;
 14
 15/// <summary>
 16/// Provides live structured log streaming over REST and SignalR.
 17/// </summary>
 18[ManifestFeatureCategory("Diagnostics")]
 19[ShellFeature(
 20    DisplayName = "Structured Logs",
 21    Description = "Provides live structured log streaming over REST and SignalR",
 22    DependsOn = [typeof(ElsaFastEndpointsFeature)])]
 23[UsedImplicitly]
 24public class StructuredLogsFeature : IFastEndpointsShellFeature, IWebShellFeature
 25{
 26    private const string SensitiveNamesDefaultValue = "authorization, token, password, secret, api-key, apikey, cookie, 
 27    private const string SensitiveTextPatternsDefaultValue = "(?i)bearer\\s+[A-Za-z0-9._~+/=-]+; (?i)(password|secret|to
 128    private static readonly StructuredLogsOptions DefaultOptions = new();
 29
 30    [ManifestSetting(
 31        DisplayName = "Recent Log Capacity",
 32        Description = "Maximum number of recent log events retained in memory.",
 33        Category = "Diagnostics",
 34        DefaultValue = "5000",
 35        RestartRequired = true)]
 436    public int RecentLogCapacity { get; set; } = DefaultOptions.RecentLogCapacity;
 37
 38    [ManifestSetting(
 39        DisplayName = "Subscriber Channel Capacity",
 40        Description = "Maximum number of queued log events per streaming subscriber.",
 41        Category = "Diagnostics",
 42        DefaultValue = "1000",
 43        RestartRequired = true)]
 444    public int SubscriberChannelCapacity { get; set; } = DefaultOptions.SubscriberChannelCapacity;
 45
 46    [ManifestSetting(
 47        DisplayName = "Maximum Recent Log Query Size",
 48        Description = "Maximum number of recent log events returned by a query.",
 49        Category = "Diagnostics",
 50        DefaultValue = "1000",
 51        RestartRequired = true)]
 452    public int MaxRecentLogQuerySize { get; set; } = DefaultOptions.MaxRecentLogQuerySize;
 53
 54    [ManifestSetting(
 55        DisplayName = "Source Heartbeat Timeout",
 56        Description = "Time after which a structured log source is considered inactive.",
 57        Category = "Diagnostics",
 58        DefaultValue = "00:00:30",
 59        RestartRequired = true)]
 460    public TimeSpan SourceHeartbeatTimeout { get; set; } = DefaultOptions.SourceHeartbeatTimeout;
 61
 62    [ManifestSetting(
 63        DisplayName = "Include Internal Structured Logs",
 64        Description = "Include log events produced by the structured logs subsystem itself.",
 65        Category = "Diagnostics",
 66        DefaultValue = "false",
 67        Advanced = true,
 68        RestartRequired = true)]
 469    public bool IncludeStructuredLogsInternalLogs { get; set; } = DefaultOptions.IncludeStructuredLogsInternalLogs;
 70
 71    [ManifestSetting(
 72        DisplayName = "Sensitive Names",
 73        Description = "Property names whose values should be redacted from structured log events.",
 74        Category = "Redaction",
 75        DefaultValue = SensitiveNamesDefaultValue,
 76        RestartRequired = true)]
 477    public ICollection<string> SensitiveNames { get; set; } = [..DefaultOptions.SensitiveNames];
 78
 79    [ManifestSetting(
 80        DisplayName = "Sensitive Text Patterns",
 81        Description = "Text patterns whose values should be redacted from structured log events.",
 82        Category = "Redaction",
 83        DefaultValue = SensitiveTextPatternsDefaultValue,
 84        Advanced = true,
 85        RestartRequired = true)]
 486    public ICollection<string> SensitiveTextPatterns { get; set; } = [..DefaultOptions.SensitiveTextPatterns];
 87
 88    public void ConfigureServices(IServiceCollection services)
 89    {
 190        services.AddStructuredLogsServices(ConfigureOptions);
 191    }
 92
 93    public void MapEndpoints(IEndpointRouteBuilder endpoints, IHostEnvironment? environment)
 94    {
 095        endpoints.MapStructuredLogsHub();
 096    }
 97
 98    private void ConfigureOptions(StructuredLogsOptions options)
 99    {
 1100        options.RecentLogCapacity = RecentLogCapacity;
 1101        options.SubscriberChannelCapacity = SubscriberChannelCapacity;
 1102        options.MaxRecentLogQuerySize = MaxRecentLogQuerySize;
 1103        options.SourceHeartbeatTimeout = SourceHeartbeatTimeout;
 1104        options.IncludeStructuredLogsInternalLogs = IncludeStructuredLogsInternalLogs;
 1105        options.SensitiveNames = [..SensitiveNames];
 1106        options.SensitiveTextPatterns = [..SensitiveTextPatterns];
 1107    }
 108}