I’d like to get an alert if a service dies or is unreachable.
One way of doing this would be to set up a
cron job to periodically ping MariaDB and send an e-mail to a specified address based on that ping status.
Allow outgoing emails in environment configuration (if necessary)
Email support can be set up in each environment, and by default it is already enabled on
master and disabled elsewhere. You can enable email through the environment configuration settings in the Web UI, or by using the Platform.sh CLI:
$ platform environment:info enable_smtp true
Set up a cron job in
.platform.app.yaml to ping MariaDB
.platform.app.yaml set up a
cron job for the service you want to check the status of. Here an exit code
0 means our ping was successful and MariaDB is running fine.
# proj_dir/.platform.app.yaml ... crons: # Check MySQL/MariaDB status mysql_status: # Runs every 10 minutes spec: '*/10 * * * *' cmd: | # Pings MySQL/MariaDB, retrieves status message status=$(mysqladmin -h mysql.internal ping) # Saves the exit code check=$? if [ $check = 0 ]; then # Run mail php file, passing service and status message php notifications/service_notify.php --service "MySQL" --status "$status" fi relationships: mysql: "mysql:mysql" ...
If you named your relationships differently, you will need to modify
mysql.internal to the correct name. (For example,
ping() may not be the most robust test case, and is only used here for a simple example. Check the
mysqladmin documentation to find the test that best suits your needs.
Write a php file that handles
mail() for the
In the project directory, create a subdirectory called
notifications, and within that subdirectory write a
// proj_dir/notifications/service_notify.php <?php // Retrieve opts $shortopts = ""; $longopts = array( "service:", "status:", ); $options = getopt($shortopts, $longopts); $service = $options["service"]; $status = $options["status"]; // Project environment variables $projectid = getenv('PLATFORM_PROJECT'); $environment = getenv('PLATFORM_ENVIRONMENT'); $app = getenv('PLATFORM_APPLICATION_NAME'); // Mail Contents $to = 'email@example.com'; $subject = sprintf('Platform.sh Service Status Update: %s DOWN on Project %s', $service, $projectid); $headers = 'From: firstname.lastname@example.org' . "\r\n" . 'X-Mailer: PHP/' . phpversion(); // Create the message $message = <<<EOT There has been a change in a service status: * Service: $service * Status: $status on * Project: $projectid * Application: $app * Environment: $environment EOT; // Send it mail($to, $subject, $message, $headers); ?>
Our project is set up to email
email@example.com with the status of a successful
mysql.internal every 10 minutes. That status email will look like this.
firstname.lastname@example.org Platform.sh Service Status Update: MySQL DOWN on Project <project ID> To: email@example.com -------------------------------------------------------------------------- There has been a change in a service status: * Service: MySQL * Status: mysqld is alive on * Project: <project ID> * Application: app * Environment: master-7rqtwti
Set up MySQL down notifications
The preceeding steps send out an e-mail that includes the status message of a successful ping on
mysql.internal. That is, it will e-mail us every ten minutes to let us know everything is fine.
To modify the notification to let us know that MySQL has died or is unreachable, modify the if statement in
cron job to:
# If not successful (1) if [ $check != 0 ]; then # Run mail php file, passing service and status message php notifications/service_notify.php --service "MySQL" --status "$status" fi
This way, when a ping delivers an exit code of
1, an email is sent!