Lara exception notifier – Package gửi thông báo khi có exception trong dự án Laravel

56

I. Giới thiệu

Trên blog của mình có bài viết Thông báo lỗi realtime tới Slack trong dự án Laravel được khá nhiều bạn quan tâm. Mặt khác, mình cũng hay tích hợp cơ chế này trong các pet project của mình, vậy để tiện sử dụng hơn thì mình có viết thành một package gửi thông báo tới slack khi dự án laravel có exception.

Thông tin chi tiết

II. Cài đặt

Bước 1: Cài đặt vào project bằng composer

composer require phambinh/lara-exception-notifier

Bước 2: Publish các files của package lara-exception-notifier vừa cài đặt

php artisan vendor:publish --provider=Phambinh\LaraExceptionNotifier\ServiceProvider

Bước 3: Mở file config/notification.php và cấu hình các thông tin phù hợp với dự án hiện tại của bạn

<?php

return [
    'exception_notifier' => [
        // allow true or false
        // true is enable notify when have exception
        // false is disable notify
        'enable' => true, // recommend env('APP_ENV') == 'production'

        // The channel you want to nofity
        // Now, support only slack :D
        'channel' => ['slack'],

        // Your slack web hook
        // more information about slack web hook: https://api.slack.com/incoming-webhooks
        'slack_web_hook_url' => ''
    ]
];

Hiện tại package này của mình mới chỉ đang hỗ trợ gửi thông báo tới Slack thôi, nếu bạn nào chưa biết cách đăng ký Slack Incomming Webhooks thì xem lại bài Thông báo lỗi realtime tới Slack trong dự án Laravel của mình nhé.

III. Cách sử dụng

3.1 Sử dụng thông thường

Bạn mở App/Exceptions/Handler, tìm đến method report sửa lại thành:

<?php

// use Phambinh\LaraExceptionNotifier\Events\HasExceptionEvent;

public function report(Exception $exception)
{
    parent::report($exception);

    if ($this->shouldReport($exception)) {
        event(new HasExceptionEvent($exception));
    }
}

3.2 Sử dụng khi try/catch

Trong một số trường hợp khi chúng ta sử dụng try/catch nhưng vẫn muốn nhận được thông báo khi rơi vào trường hợp catch, thì bạn có thể làm như sau:

<?php

use Phambinh\LaraExceptionNotifier\Events\HasExceptionEvent;

class MyController extends Controller
{
    public function index()
    {
        try {
            // your code here
        } catch (\Exception $e) {
            // Không throw exception nên Laravel sẽ không log vào file laravel.log
            // Nhưng bạn sẽ vẫn nhận được thông báo về exception trên Slack
            event(new HasExceptionEvent($e));
        }
    }
}

3.3 Gửi thông báo kèm theo các message của riêng bạn

Nếu bạn cảm thấy những thông tin từ exception chưa đầy đủ, muốn bổ sung thêm để tiện cho việc debug, thì bạn có thể sử dụng tham số thứ 2 khi khởi tạo HasExceptionEvent. Như ví dụ sau đây:

<?php

use Phambinh\LaraExceptionNotifier\Events\HasExceptionEvent;
use Phambinh\LaraExceptionNotifier\Exceptions\QuietException;

class MyController extends Controller
{
    public function index()
    {
        $a = 1;
        $b = 0;

        try {
            $c = $a/$b;
        } catch (\Exception $e) {
            // Bổ sung thêm thông tin về giá trị của 2 biến $a và $b
            // khi gửi message tới Slack
            event(new HasExceptionEvent($e, [
                'a' => $a,
                'b' => $b,
            ]));
            // throw ra QuietException thay vì throw $e hay bất kỳ exception nào khác
            // nếu không Slack sẽ nhận được 2 message trùng nhau
            throw new QuietException($e);
        }
    }
}

IV. Kết quả

Sau khi cài đặt và cấu hình thành công, nếu dự án của bạn có exception thì trên Slack sẽ nhận được thông báo kiểu như

Bạn cũng nên cài đặt app Slack trên cả điện thoại và máy tính để có thể dễ dàng nhận được thông báo hơn.

IV. Lời kết

Cơ chế gửi thông báo khi có exception này thật sự rất cần thiết đối với dự án chạy trên production, nhờ có vậy mà mình có thể vá kịp thời những bugs mà mình còn bỏ sót. Nếu dự án của bạn chưa có cơ chế nào tương tự, thì mình khuyên thật lòng bạn nên tích hợp ngay.

Bài viết lần này mình chỉ trình bày ngắn gọn vậy thôi, vì những gì cần nói mình đã nói hết ở bài viết lần trước rồi. Nếu quan tâm bạn có thể đọc lại bài viết đấy tại đây để hiểu rõ hơn.

À mà nếu có ghé qua repo github thì để lại cho mình 1 star nhé :p.

Chào tạm biệt. Hẹn gặp lại các bạn trong những bài viết lần sau.


(*) pet project: Ý chỉ những dự án nhỏ, dự án thử nghiệm, dự án làm chơi của mình