Azis Hapidin
Notifikasi ke Slack ketika error di Laravel

Dalam proses development aplikasi (bahkan saat sudah Live), adanya error atau bugs adalah hal yang sangat biasa. Baik itu error syntax, error logical ataupun error saat runtime. Yang penting bagi kita sebagai developer adalah bagaimana ketika ada error pada aplikasi kita bisa segera tau apa errornya dan dimana letak errornya, kalau bisa tanpa menunggu laporan dari user yang mengalamai error tersebut 😀 . Apakah memungkinkan? Yaps, jawabannya sangat mungkin.

Kalau kita develop aplikasi Android/iOS kita bisa menggunakan Crashlytics, nah pertanyaannya bagaimana jika kita develop apikasi menggunakan PHP (dalam kasus ini Laravel)? Solusinya kita bisa mengakali dengan memasang sebuah script di exception Handler nya.

Teknisnya kita nanti bisa menggunakan aplikasi chat apa saja selama aplikasi tersebut menyediakan incoming webhook, artinya kita bisa mengirim pesan ke aplikasi tersebut melalui webhook. Tapi pada contoh ini kita akan menggunakan Slack saja.

Oh iya saya asumsikan disini Anda sudah punya akun Slack dan juga sudah tergabung ke sebuah workspace.

Membuat Channel dan Aktivasi WebHook di Slack

Oke langkah pertama kita harus buat dahulu channel di Slack untuk notifikasi error, walaupun sebetulnya nanti kita bisa mengirim secara private ke akun kita. Tapi saya lebih suka mengirimnya ke channel agar bisa dilihat developer lain bahwa sedang ada bugs di aplikasi.

Lihat pada bagian Channels, klik icon + untuk membuat Channel.

Kemudian kita masukan informasi Channel-nya mulai dari pengaturan apakah publik atau tidak, nama channel, deskripsi dan juga orang yang ingin diundang masuk ke Channel. Sebagai contoh disini saya memasukan Arif sebagai member.

Setelah channel terbuat, silahkan cari tombol gear dibagian atas didekat kolom pencarian. Kemudian klik tombol Add an App.

Kemudian dikolom pencarian cari Incoming WebHooks kemudian klik Add Configuration.

Cari bagian Post to Channel kemudian pilih nama channel yang sudah kita buat tadi dan klik Add Incoming WebHooks integration.

Kemudian kita diarahkan ke halaman penggunaan WebHooks ini, cari lalu amankan/catat Webhook URL yang kita dapat.

Pada halaman ini kita bisa melihat cara penggunaan Incoming WebHook slack ini, silahkan baca-baca dulu intruksi yang ada disana sebelum berlanjut membaca artikel ini.

Tes Incoming WebHooks Slack

Untuk nge-tes apakah webhook sudah bisa digunakan atau tidak silahkan jalankan script PHP berikut:

<?php

$message = "Tes kirim ke Slack :)";  
$data = "payload=" . json_encode(array(  
    "channel"       => "#error_notifications",  
    "text"          => $message,  
    "username"      => 'Pemberi Tahu',  
    "icon_url"      => 'URL Foto/Icon'  
));

$ch = curl_init("URL WebHook");  
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");  
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
$result = curl_exec($ch);  
curl_close($ch);

Silahkan ganti URL Foto/Icon menggunakan url gambar yang diinginkan, disini saya menggunakan foto saya sendiri. Jangan lupa juga ganti URL WebHook dengan webhook yang sudah kita dapatkan tadi. Jika tidak ada masalah, maka harusnya pesan akan terkirim ke channel yang kita buat.

Kirim notifikasi ke Slack ketika Error di Laravel

Selanjutnya kita masuk ke bagian yang ditunggu-tunggu 😀 Intinya kita harus menangkap exception message di Laravel dan mengirimkannya ke webhook slack tadi. Buka file app/Exceptions/Handler.php kemudian ubah method report() menjadi seperti dibawah.

/*  
 * Report or log an exception.  
 *  
 * This is a great spot to send exceptions to Sentry, Bugsnag, etc.  
 *  
 * [@param](http://twitter.com/param "Twitter profile for @param")  \Exception  $exception  
 * [@return](http://twitter.com/return "Twitter profile for @return") void  
 */  
public function report(Exception $exception)  
{  
    if (!$this->shouldntReport($exception)) {  
        $message = $exception->getMessage() . '(' . $exception->getCode() . ')';  
        $message .= ' => ' . $exception->getFile()  . ':' . $exception->getline();  
        $data = "payload=" . json_encode(array(  
            "channel"       => "#error_notifications",  
            "text"          => $message,  
            "username"      => 'Pemberi tahu',  
            "icon_url"      => '[https://media.giphy.com/media/LF8plQNlgYwnK/giphy.gif'](https://media.giphy.com/media/LF8plQNlgYwnK/giphy.gif%27)  
        ));  
          
        $ch = curl_init("WebHook URL");  
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");  
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);  
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
        $result = curl_exec($ch);  
        curl_close($ch);  
    }  
      
    parent::report($exception);  
}

Pada script diatas kita sengaja melakukan pengkondisian karena tentunya kita juga tidak ingin setiap ada error langsung ada notifikasi ke Slack. Untuk menambah pengecualian kita bisa register Exception Class-nya di property $dontReport pada file yang sama.

Setelah itu coba buat sebuah error di project Laravel kita, contoh disini saya sengaja menghapus titik koma (;) pada routes/web.php, maka ketika web dibuka maka otomatis akan ada notifikasi di Slack kurang lebih seperti ini:

Oke sekian tutorial kali ini, semoga bermanfaat. Mohon maaf jika ada kesalahan.
Terima kasih