Writing your own checks

Writing your own checks is very easy. Let's create a check that'll verify if nginx is running.

Let's take a look at how to manually verify if Nginx is running. The easiest way is to run systemctl is-active nginx. This command outputs active if Nginx is running.

Let's create an automatic check using that command.

The first thing you must to do is create a class that extends from Spatie\ServerMonitor\CheckDefinitions\CheckDefinition. Here's an example implementation.

namespace App\MyChecks;

use Spatie\ServerMonitor\CheckDefinitions\CheckDefinition;
use Symfony\Component\Process\Process;

class Nginx extends CheckDefinition
{
    public $command = 'systemctl is-active nginx';

    public function resolve(Process $process)
    {
        if (trim($process->getOutput()) === 'active') {
            $this->check->succeed('is running');

            return;
        }

        $this->check->fail('is not running');
    }
}

Let's go over this code in detail. The command to be executed on the server is specified in the $command property of the class.

The resolve function that accepts an instance of Symfony\Component\Process\Process. The output of that process can be inspected using $process->getOutput(). If the output contains active we'll call $this->check->succeeded which will mark the check successful. If it does not contain that string $this->check->fail will be called and the check marked as failed. By default the package sends you a notification whenever a check fails. The string that is passed to $this->check->failed will be displayed in the notification.

After creating this class you must register your class in the config file.

// config/server-monitor.php
'checks' => [
    ...
    'nginx' => App\MyChecks\Nginx::class,
],

Determining when a check will run the next

If you scheduled php artisan server-monitor:run-checks, like we recommended, to run every minute a successful check will run again 10 minutes later. If it fails it'll be run again the next minute.

This behaviour is defined on the Spatie\ServerMonitor\CheckDefinitions\CheckDefinition class where all CheckDefinitions are extending from.

// in class Spatie\ServerMonitor\CheckDefinitions\CheckDefinition

public function performNextRunInMinutes(): int
{
    if ($this->check->hasStatus(CheckStatus::SUCCESS)) {
        return 10;
    }

    return 0;

You may override that function in your own check.

Setting the timeout of a command

When executing a command on the server a timeout of 10 seconds will be used. If a command takes longer than that the check will be marked as failed.

This behaviour is defined in the Spatie\ServerMonitor\CheckDefinitions\CheckDefinition class from which all CheckDefinitions are extended.

public function timeoutInSeconds(): int
{
    return 10;
}

Need a different timeout? Just override the timeoutInSeconds function in your own check.

Handling failed commands

Whenever your command fails, e.g. because a connection to the host can't be made or your command is invalid, handleFailedProcess will be called.

This is the default implementation on Spatie\ServerMonitor\CheckDefinitions\CheckDefinition:

public function handleFailedProcess(Process $process)
{
    $this->check->failed("failed to run: {$process->getErrorOutput()}");
}

Again, if you which to customize this behaviour, you can override that function in your own check.

Using custom properties

Both the check and the host can retrieve and store custom properties. These properties are stored as json in the custom_properties field in the checks and hosts tables.

Here's how to work with custom properties:

// a $model can be instance of `host` or `check`
$model->setCustomProperty('key', 'value');
$model->getCustomProperty('key'); // returns 'value'

$model->forgetCustomProperty('key');
$model->getCustomProperty('key'); // returns null

You can retrieve custom properties from your checks like this:

public function handleFailedProcess(Process $process)
{
    ...

    $customValueStoredOnCheck = $this->check->getCustomProperty('key');
    
    $customValueStoredOnHost = $this->check->host->getCustomProperty('key');
    
    ...
}