NAME

    HealthCheck::Parallel - A HealthCheck that uses parallelization for
    running checks

VERSION

    version v0.2.0

SYNOPSIS

        use HealthCheck::Parallel;
    
        my $hc = HealthCheck::Parallel->new(
            max_procs  => 4,      # default
            timeout    => 120,    # default, global timeout in seconds
            tempdir    => '/tmp', # override Parallel::ForkManager default
            child_init => sub { warn "Will run at start of child process check" },
            checks     => [
                sub { sleep 5; return { id => 'slow1', status => 'OK' } },
                sub { sleep 5; return { id => 'slow2', status => 'OK' } },
            ],
        );
    
        # Takes 5 seconds to run both checks instead of 10.
        my $res = $hc->check;
    
        # These checks will not use parallelization.
        $res = $hc->check( max_procs => 0 );
    
        # Neither will these.
        $res = $hc->check( max_procs => 1 );
    
        # Override timeout for specific check.
        $res = $hc->check( timeout => 60 );

DESCRIPTION

    This library inherits HealthCheck so that the provided checks are run
    in parallel.

METHODS

 new

    Overrides the "new" in HealthCheck constructor to additionally allow
    "max_procs" and "timeout" arguments for controlling parallelization and
    global timeout behavior.

ATTRIBUTES

 max_procs

    A positive integer (or coderef returning one) specifying the maximum
    number of processes that should be run in parallel when executing the
    checks. No parallelization will be used unless given a value that is
    greater than 1. Defaults to 4.

    If provided as a coderef, it will be called at runtime to determine the
    value, allowing dynamic adjustment:

        my $hc = HealthCheck::Parallel->new(
            max_procs => sub { int(rand(10)) },
            checks    => [ ... ],
        );

 child_init

    An optional coderef which will be run when the child process of a check
    is created. A possible important use case is making sure child
    processes don't try to make use of STDOUT if these checks are running
    under FastCGI envrionment:

        my $hc = HealthCheck::Parallel->new(
            child_init => sub {
                untie *STDOUT;
                { no warnings; *FCGI::DESTROY = sub {}; }
            },
        );

 tempdir

    Sets the tempdir value to use in Parallel::ForkManager for IPC.

 timeout

    A positive integer (or coderef returning one) specifying the maximum
    number of seconds to wait for all parallelized checks to complete. If
    the timeout is exceeded, all running child processes will be terminated
    and CRITICAL results will be returned for affected checks. Defaults to
    120 seconds.

    If provided as a coderef, it will be called at runtime to determine the
    value, allowing dynamic adjustment:

        my $hc = HealthCheck::Parallel->new(
            timeout => sub { int(rand(10)) },
            checks  => [ ... ],
        );

    Note: The timeout only applies when parallelization is enabled
    (max_procs > 1). When max_procs is 0 or 1, checks run in the parent
    process and the timeout is not used.

    The timeout is implemented using a non-blocking polling loop instead of
    using any signal-based timeouts to potentially avoiding conflicting
    with others.

DEPENDENCIES

      * Perl 5.10 or higher.

      * HealthCheck

      * Parallel::ForkManager

SEE ALSO

      * HealthCheck::Diagnostic

      * The GSG Health Check Standard
      <https://grantstreetgroup.github.io/HealthCheck.html>.

AUTHOR

    Grant Street Group <developers@grantstreet.com>

COPYRIGHT AND LICENSE

    This software is Copyright (c) 2023 - 2025 by Grant Street Group.

    This is free software, licensed under:

      The Artistic License 2.0 (GPL Compatible)