< Summary

Information
Class: Elsa.Hosting.Management.Features.ClusteringFeature
Assembly: Elsa.Hosting.Management
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Hosting.Management/Features/ClusteringFeature.cs
Line coverage
81%
Covered lines: 13
Uncovered lines: 3
Coverable lines: 16
Total lines: 60
Line coverage: 81.2%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
get_InstanceNameProvider()100%11100%
get_HeartbeatOptions()100%11100%
get_ApplicationInstanceOptions()100%11100%
ConfigureHostedServices()100%210%
Apply()100%11100%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Hosting.Management/Features/ClusteringFeature.cs

#LineLine coverage
 1using Elsa.Features.Abstractions;
 2using Elsa.Features.Services;
 3using Elsa.Hosting.Management.Contracts;
 4using Elsa.Hosting.Management.HostedServices;
 5using Elsa.Hosting.Management.Options;
 6using Elsa.Hosting.Management.Services;
 7using Microsoft.Extensions.DependencyInjection;
 8
 9namespace Elsa.Hosting.Management.Features;
 10
 11/// <summary>
 12/// Installs and configures the clustering feature.
 13/// </summary>
 14public class ClusteringFeature : FeatureBase
 15{
 16    /// <inheritdoc />
 117    public ClusteringFeature(IModule module) : base(module)
 18    {
 119    }
 20
 21    /// <summary>
 22    /// A factory that instantiates an <see cref="IApplicationInstanceNameProvider"/>.
 23    /// </summary>
 24    /// <remarks>
 25    /// Defaults to <see cref="ConfiguredApplicationInstanceNameProvider"/>, which honors
 26    /// <see cref="ApplicationInstanceOptions"/> for a stable instance name and falls back to a random
 27    /// name when none is configured (preserving the previous default behaviour).
 28    /// </remarks>
 229    public Func<IServiceProvider, IApplicationInstanceNameProvider> InstanceNameProvider { get; set; } = sp =>
 130    {
 131        return ActivatorUtilities.CreateInstance<ConfiguredApplicationInstanceNameProvider>(sp);
 132    };
 33
 34    /// <summary>
 35    /// Represents the options for heartbeat feature.
 36    /// </summary>
 237    public Action<HeartbeatOptions> HeartbeatOptions { get; set; } = _ => { };
 38
 39    /// <summary>
 40    /// Configures how the application instance name is determined. Set a stable name (for example from
 41    /// the pod name) to avoid accumulating orphaned per-instance transport entities across restarts.
 42    /// </summary>
 343    public Action<ApplicationInstanceOptions> ApplicationInstanceOptions { get; set; } = _ => { };
 44
 45    /// <inheritdoc />
 46    public override void ConfigureHostedServices()
 47    {
 048        Module.ConfigureHostedService<InstanceHeartbeatService>();
 049        Module.ConfigureHostedService<InstanceHeartbeatMonitorService>();
 050    }
 51
 52    /// <inheritdoc />
 53    public override void Apply()
 54    {
 155        Services.Configure(HeartbeatOptions)
 156            .Configure(ApplicationInstanceOptions)
 157            .AddSingleton(InstanceNameProvider)
 158            .AddSingleton<RandomIntIdentityGenerator>();
 159    }
 60}