2016-12-01 11 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

私はコードをチェックして回答します。 config/slack.phpでエンドポイント(Webフック)がハードコーディングされている1つのスラックチャンネルにのみ送信します。しかし、私はどのようにそれを無効にするか分かりません。助言がありますか? –

関連する問題