2016-12-01 25 views
1

我的代碼正在正常發送http請求,萬一網站發生故障或響應代碼不是200,它會發送鬆散通知。我現在試圖弄清楚的是,在通知表中我有check_frequencyalert_frequence。如果某個網站停機,而不是使用檢查頻率計算流逝時間,則應使用alert_frequence根據http響應更改警報頻率

namespace App\Http\Controllers; 


use GuzzleHttp\Client; 
use App\Utilities\Reporter; 
use GuzzleHttp\Exception\ClientException; 
use App\Notification; 
use App\Status; 
use App\Setting; 

class GuzzleController extends Controller 
{ 
    private $default_check_frequency; 

    protected $client; 
    protected $reporter; 


    public function __construct() 
    { 
    $this->client = new Client; 

    $this->reporter = new Reporter; 

    $this->default_check_frequency = Setting::defaultCheckFrequency(); 
    } 

    public function status() 
    { 
    $notifications = Notification::where('active', 1)->get(); 

    $status = Status::where('name', 'health')->first(); 

    foreach ($notifications as $notification) { 
     $this->updateStatus($notification, $status); 


    } 
    } 

    private function updateStatus(Notification $notification, Status $status) 
    { 
    $status_health = $notification->status('health'); 



    $frequency = $this->getFrequency($notification); 

    $elapsed_time = \Carbon\Carbon::parse($status_health['timestamp'])->diffInMinutes(); 

    if($elapsed_time >= $frequency) { 

     $response = $this->client->get($notification->website_url, [ 
     'http_errors' => false 
     ]); 


     $resCode = $response->getStatusCode(); 

     $notification->statuses()->attach($status, [ 
     'values' => $resCode === 200 ? 'up' : 'down' 
     ]); 

     if($resCode != 200){ 
     /* how to send slack to different slach channels, now it is sending only to one channel!*/ 

     $this->reporter->slack($notification->website_url.':'.' is down'. ' please check your email for the status code!'.' @- '.$notification->email, 
       $notification->slack_channel); 
     $this->reporter->mail($notification->email,$resCode); 

     } 
    } 

    } 

    private function getFrequency(Notification $notification) 
    { 
    return isset($notification->check_frequency) 
    ? intval($notification->check_frequency) 
    : $this->default_check_frequency; 
    } 
} 

回答

0

我不知道這是你所需要的,但這裏是你可以做從表中選擇一個不同的列,這取決於狀態是什麼:

<?php 

class GuzzleController extends Controller 
{ 
    private $default_check_frequency; 

    protected $client; 
    protected $reporter; 

    public function __construct() 
    { 
     $this->client = new Client; 

     $this->reporter = new Reporter; 

     $this->default_check_frequency = Setting::defaultCheckFrequency(); 
    } 

    public function status() 
    { 
     $notifications = Notification::where('active', 1)->get(); 

     $status = Status::where('name', 'health')->first(); 

     foreach ($notifications as $notification) { 
      $this->updateStatus($notification, $status); 
     } 
    } 

    private function updateStatus(Notification $notification, Status $status) 
    { 
     $status_health = $notification->status('health'); 

     /// move it here 
     $response = $this->client->get($notification->website_url, [ 
      'http_errors' => false 
     ]); 
     $resCode = $response->getStatusCode(); 
     /// --- end 

     $frequency = $this->getFrequency($notification, $resCode); 

     $elapsed_time = \Carbon\Carbon::parse($status_health['timestamp'])->diffInMinutes(); 

     if($elapsed_time >= $frequency) { 
      $notification->statuses()->attach($status, [ 
       'values' => $resCode === 200 ? 'up' : 'down' 
      ]); 

      if($resCode != 200){ 
       /* how to send slack to different slach channels, now it is sending only to one channel!*/ 
       $this->reporter->slack($notification->website_url.':'.' is down'. ' please check your email for the status code!'.' @- '.$notification->email, 
       $notification->slack_channel); 
       $this->reporter->mail($notification->email,$resCode); 
      } 
     } 
    } 

    private function getFrequency(Notification $notification, $resCode) 
    { 
     /// -- select your column here 
     $column = $resCode == '200' ? 'check_frequency' : 'alert_frequence'; 

     return isset($notification->{$column}) 
      ? intval($notification->{$column}) 
      : $this->default_check_frequency; 
    } 
} 

我那麼兇重構它,分離方法問題:

<?php 

use Carbon\Carbon; 

class GuzzleController extends Controller 
{ 
    private $default_check_frequency; 

    protected $client; 

    protected $reporter; 

    public function __construct() 
    { 
     $this->client = new Client; 

     $this->reporter = new Reporter; 

     $this->default_check_frequency = Setting::defaultCheckFrequency(); 
    } 

    private function addStatusToNotification(Notification $notification, Status $status, $resCode) 
    { 
     $notification->statuses()->attach($status, [ 
      'values' => $resCode === 200 
       ? 'up' 
       : 'down' 
     ]); 
    } 

    private function report(Notification $notification, $resCode) 
    { 
     /* how to send slack to different slach channels, now it is sending only to one channel!*/ 
     $this->reporter->slack($notification->website_url . ':' . ' is down' . ' please check your email for the status code!' . ' @- ' . $notification->email, 
           $notification->slack_channel); 

     $this->reporter->mail($notification->email, $resCode); 
    } 

    private function sendNotification(Notification $notification, Status $status, $status_health, $frequency, $resCode) 
    { 
     $elapsed_time = Carbon::parse($status_health['timestamp'])->diffInMinutes(); 

     if ($elapsed_time >= $frequency) { 
      $this->addStatusToNotification($notification, $status, $resCode); 

      if ($resCode != 200) { 
       $this->report($notification, $resCode); 
      } 
     } 
    } 

    public function status() 
    { 
     $notifications = Notification::where('active', 1)->get(); 

     $status = Status::where('name', 'health')->first(); 

     foreach ($notifications as $notification) { 
      $this->updateStatus($notification, $status); 
     } 
    } 

    private function updateStatus(Notification $notification, Status $status) 
    { 
     $resCode = $this->getStatusCode($notification->website_url); 

     $this->sendNotification(
      $notification, 
      $status, 
      $notification->status('health'), 
      $this->getFrequency($notification, $resCode), 
      $resCode 
     ); 
    } 

    private function getFrequency(Notification $notification, $resCode) 
    { 
     $column = $resCode == '200' ? 'check_frequency' : 'alert_frequence'; 

     return isset($notification->{$column}) 
      ? intval($notification->{$column}) 
      : $this->default_check_frequency; 
    } 

    private function getStatusCode($url) 
    { 
     $response = $this->client->get($url, [ 
      'http_errors' => false 
     ]); 

     return $response->getStatusCode(); 
    } 
} 
+0

我會檢查代碼並回復您。你是對的Iam只發送到一個鬆散的通道,其中的終點(網絡鉤子)是硬編碼在config/slack.php。但我不知道如何覆蓋它。有什麼建議麼? –