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.
'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.
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:
$model->setCustomProperty('key', 'value');
$model->getCustomProperty('key');
$model->forgetCustomProperty('key');
$model->getCustomProperty('key');
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');
...
}