< Summary

Information
Class: Elsa.Hosting.Management.ShellFeatures.ClusteringFeature
Assembly: Elsa.Hosting.Management
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Hosting.Management/ShellFeatures/ClusteringFeature.cs
Line coverage
100%
Covered lines: 13
Uncovered lines: 0
Coverable lines: 13
Total lines: 53
Line coverage: 100%
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
get_InstanceNameProvider()100%11100%
.ctor()100%11100%
get_HeartbeatOptions()100%11100%
get_ApplicationInstanceOptions()100%11100%
ConfigureServices(...)100%11100%

File(s)

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

#LineLine coverage
 1using CShells.Features;
 2using Elsa.Hosting.Management.Contracts;
 3using Elsa.Hosting.Management.HostedServices;
 4using Elsa.Hosting.Management.Options;
 5using Elsa.Hosting.Management.Services;
 6using JetBrains.Annotations;
 7using Microsoft.Extensions.DependencyInjection;
 8
 9namespace Elsa.Hosting.Management.ShellFeatures;
 10
 11/// <summary>
 12/// Installs and configures the clustering feature.
 13/// </summary>
 14[ShellFeature(
 15    DisplayName = "Clustering",
 16    Description = "Provides clustering and heartbeat capabilities for distributed Elsa deployments")]
 17[UsedImplicitly]
 18public class ClusteringFeature : IShellFeature
 19{
 20    /// <summary>
 21    /// A factory that instantiates an <see cref="IApplicationInstanceNameProvider"/>.
 22    /// </summary>
 23    /// <remarks>
 24    /// Defaults to <see cref="ConfiguredApplicationInstanceNameProvider"/>, which honors
 25    /// <see cref="ApplicationInstanceOptions"/> for a stable instance name and falls back to a random
 26    /// name when none is configured (preserving the previous default behaviour).
 27    /// </remarks>
 228    public Func<IServiceProvider, IApplicationInstanceNameProvider> InstanceNameProvider { get; set; } = sp =>
 129    {
 130        return ActivatorUtilities.CreateInstance<ConfiguredApplicationInstanceNameProvider>(sp);
 131    };
 32
 33    /// <summary>
 34    /// Represents the options for heartbeat feature.
 35    /// </summary>
 236    public Action<HeartbeatOptions> HeartbeatOptions { get; set; } = _ => { };
 37
 38    /// <summary>
 39    /// Configures how the application instance name is determined. Set a stable name (for example from
 40    /// the pod name) to avoid accumulating orphaned per-instance transport entities across restarts.
 41    /// </summary>
 342    public Action<ApplicationInstanceOptions> ApplicationInstanceOptions { get; set; } = _ => { };
 43
 44    public void ConfigureServices(IServiceCollection services)
 45    {
 146        services.Configure(HeartbeatOptions)
 147            .Configure(ApplicationInstanceOptions)
 148            .AddSingleton(InstanceNameProvider)
 149            .AddSingleton<RandomIntIdentityGenerator>()
 150            .AddHostedService<InstanceHeartbeatService>()
 151            .AddHostedService<InstanceHeartbeatMonitorService>();
 152    }
 53}