posixpascal/spark-alarm

简单易用的服务器监控库,带有自定义警报和通知。

1.0 2017-04-07 13:26 UTC

This package is not auto-updated.

Last update: 2024-09-29 01:07:30 UTC


README

Build Status Latest Stable Version Total Downloads License Code Climate

Spark是一个非常简单的监控工具,具有非常灵活的架构。您可以创建自定义警报,在您代表的情况下触发,并发送自定义通知。实现细节是有意为之的简约风格,以便Spark适应您的平台。

它被设计成既可以作为一个CLI应用程序,也可以作为一个常规的shell脚本,这样您就可以添加一个cronjob,在您需要时运行Spark。

它也与许多低价VPS托管商提供的"cronjob工具"兼容,在这些托管商那里,您只能通过URL调用远程PHP脚本。

如果您需要自定义服务器监控、自定义通知,或者您被绑定在低价VPS托管商那里 – Spark正是您所需要的。

安装

使用composer安装

composer require "posixpascal/spark-alarm"

使用方法

Spark遵循自定义Alarm类概念,这些类包含一个简单的test()方法和可选的错误/成功处理器。一旦您有了自己的警报类,您可以将其添加到Spark实例中并运行它。

<?php

use Spark\SparkAlarm;
use Spark\Spark;

class AlertIfCPULoadIsHigh extends SparkAlarm {
    public function test(){
       return !($this->getCPULoadAverage() > 80); // not higher than 80
    }
}


class AlertIfCPULoadIsSuperHigh extends SparkAlarm {
    public function test(){
       return !$this->getCPULoadAverage() > 95; // not higher than 95
    }
    
    public function error(){ // CPU is above 95%
        mail("posixpascal@gmail.com", "CPU for server is above 95%", "Be aware, your CPU resources are low...");
    }
}


$spark = new Spark();
$spark
    ->addAlarm(new AlertIfCPULoadIsHigh())
    ->addAlarm(new AlertIfCPULoadIsSuperHigh())
    ->run();

现在将此脚本添加到您的crontab文件中,您就已经添加了第一个服务器监控工具。

以下是一个检查特定网站是否可访问的警报

<?php

use Spark\SparkAlarm;
use Spark\Spark;

class AlertIfWebsiteNotReachable extends SparkAlarm {
    public function test(){
         $ch = curl_init("https://google.de");
         curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
         curl_setopt($ch, CURLOPT_HEADER, true);
         curl_setopt($ch, CURLOPT_NOBODY, true);
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
         
         $response = curl_exec($ch);
         curl_close($ch);
         return !$response;
    }
    
    public function success(){
    	// website is reachable, lets log it or do sth else.
    }
    
    public function error(){ 
    	// website if off, mail here or let notifier handle the rest.
    }
}

$spark = new Spark();
$spark
    ->addAlarm(new AlertIfWebsiteNotReachable())
    ->run();

如果您想定期检查警报,您可以告诉Spark像这样保持其存活

<?php 

$spark
->addAlarm(new AlertIfCPULoadIsHigh())
->addAlarm(new AlertIfCPULoadIsSuperHigh())
->keepAlive(true)
->run();

现在该脚本将定期检查您的警报,并在任何条件失败时通知您。默认情况下,Spark在每个警报检查后暂停5分钟,您可以通过向spark实例传递->interval(<seconds>)来更改此延迟。

在每次运行结束时,spark将使用所谓的Notifier来通知您测试结果,默认情况下,内置的Notifier仅将失败的警报记录到控制台,但您可以轻松地编写自己的Notifier,如下面的示例所示

<?php

use Spark\Notifier;
use Spark\AlarmStatus;

class MyCustomNotifier implements Notifier {
  /**
   * in this example I build a string summary and publish it to a logfile. 
   * @param $alarms array holds every failed alarm class, you can attach custom functions to your alarmclass as well.
   */
   public function send(array $alarms){
     $str = "Test results:\n";
     foreach ($alarms as $alarm){
        if ($alarm->status == AlarmStatus::SUCCESS){
        	$str .= get_class($alarm).": executed successfully @".date("Y-m-d H:i:s");
        } else {
        	$str .= get_class($alarm).": failed @".date("Y-m-d H:i:s");
        }
        $str .= "\n";
     }
     file_put_contents("/var/log/spark.log", $str);
   }
}

$spark
->notifier(new MyCustomNotifier())
->run();

如前所述,Spark仅将失败的警报传递给Notifier,如果您想接收所有警报,您可以选择全局设置如下

$spark->sendNotificationOnSuccess(true)

或者在单个警报中通过设置sendNotificationOnSuccess为true

<?php 
use Spark\SparkAlarm;

class AlertIfCPULoadIsHigh extends SparkAlarm  {
   public $sendNotificationOnSuccess = true;
}

如果您正在使用->keepAlive运行检查,您可能不希望Notifier发送摘要。您还可以使用->throttle(<seconds>)方法设置notifier之间的最小延迟。

使用throttle和interval,您可以保持检查警报并按指定间隔执行其错误函数,但仅在throttle后发送通知。

我通常这样使用它

$spark
->throttle(60 * 60) // send summaries of failed alerts every hour
->interval(60) // execute alarm tests every minute

由于您可以在Notifier类中访问失败的警报,您可以构建相当详细的摘要,例如,您不仅可以将服务器1的CPU使用率超过95%通知用户,还可以通过将此类方法添加到警报并在Notifier中调用它来列出消耗最多CPU的进程。

助手

SparkAlarm是警报的基类,包括许多获取系统资源的实用方法。这些方法仅在Linux机器上工作,但并非您的警报工作所必需。它们包括

<?php 
    interface SparkAlarmHelper {
	    // cpu
	    public function getCPULoadAverage();
	    
	    // disk space
	    public function getFreeDiskSpace();
	    public function getTotalDiskSpace();
	    public function getFreeDiskSpaceInPercentage();
	    
	    // memory
	    public function getTotalMemory();
	    public function getFreeMemory();
	    public function getFreeMemoryInPercentage();
	}

为什么

为了一个个人项目,我需要一个可靠的服务器监控工具,并且我不想为任何现有的解决方案付费。GitHub上的大多数服务器监控工具都包括诸如统计信息、数据库设置、管理后端等功能,这些功能对于小型个人网站来说太沉重了。

待办事项

我将来想实现许多功能,但我个人在这个库上投入不多。目前它相当简陋,但我计划在需要时添加以下功能

  • 默认添加带有良好模板的邮件通知器
  • 为内置SparkAlarm Helper添加Windows和mac支持
  • 可选使警报依赖于另一个
  • 默认情况下保留日志文件

许可协议

MIT 协议