我们每个人都在追求建立一个无bug的应用程序,但这却是不可能的。所以我们需要随时监控程序中出现的问题,并且立即采取相应措施。一些公司已经试着在解决这个问题:如何能够快速方便的监控错误、解决错误。Bugsnag 可以说是他们中比较优秀的了。Bugsnag的官网地址:https://bugsnag.com

他们所关注的重点:如何提供一个bug监控和通知系统,让你及时感知到错误的发生以及与错误相关的具体内容,帮助你通过多种途径来解决问题。接下来我们将去探索Bugsnag ,我们已经将其集成到一个Laravel框架的应用程序中,你可以从GitHub上下载示例Demo,跟着文章一起来探索。GitHub上下载的地址:https://github.com/Whyounes/bugsnag_demo

安装示例项目

按照下面步骤去创建这个demo程序(前提是你本地已经有PHP的运行环境。这里提供一个参考: )

// clone the repo
git clone [email protected]:Whyounes/bugsnag_demo.git
cd bugsnag_demo
// update dependencies
composer update
// migrate and seed the database
php artisan migrate && php artisan db:seed

在BugSnag上创建账户

在使用BugSnag之前,我们首先需要创建一个账户,同时创建我们的新项目。你能够免费使用30天(现在已经修改为15天),对于是否要切换到付费,则依赖你的项目了。注册成功之后,你就不得不创建新的项目,同时需要指定项目的类型。在我们的例子中,项目类型就是PHP。

添加BugSnag到我们的项目

Bugsnag针对不同的项目类型提供了一个通知列表。我们需要安装配置PHP的通知包。另外, 因为提供的Demo是使用Laravel 4版本开发,但你可能使用了这个Laravel版本的安装包,轻轻松松通过这个集成指导创建了你自己的项目。因为你安装的版本是5.0+,所以在这种的情况下,我们尽量   使用跟框架无关的方法。

安装Bugsnag包

$ composer require bugsnag/bugsnag:2.*

在bugsnag的控制面板里选择Settings > Project Settings,获取项目的API key。可以将key存储为一个环境变量,或者存放在程序的配置文件中。项目中我们将它添加到app/config/app.php文件中。

// app/config/app.php
return array(
    // ...
    'bugsnag_api_key'   => 'YOUR KEY'
    // ...
);

在app/start/global.php文件中,我们将项目和bugsnag客户端进行绑定并配置bugsnag。

// app/start/global.php
App::singleton('bugsnag', function() {
    $bugsnag = new Bugsnag_Client( Config::get('app.bugsnag_api_key') );
    return $bugsnag;
});
// ...

Bugsnag依赖注入的设置会发生变化,这取决于的你的应用程序配置。上面的代码案例对于Laravel 框架的项目非常普遍。此外,你也可以设置一个监控的发版阶段,比如开发阶段或者生产阶段。

$bugsnag->setReleaseStage(App::environment());

使用上述代码,bugsnag就只会记录应用程序在指定发版阶段的问题。

创建了Bugsnag客户端之后,需要将其和程序中的错误处理相关联,这也取决于程序中处理异常和错误的机制。Laravel提供了fatal和error方来来接受回调的处理函数(即当错误发生是调用的处理函数),同时你也可以使用PHP的set_exeception_handle和set_error_handle方法。

// app/start/global.php
App::error(function($exception) {
    App::make('bugsnag')->notifyException($exception, null, "error");
});
App::fatal(function($exception) {
    App::make('bugsnag')->notifyException($exception, null, "error");
});

上述notifyException方法可以接收附加的元数据作为第二个参数。第三个参数是错误的等级,默认为warning。如果你想将其直接关联到PHP的错误和异常处理的话,也可以执行如下操作:

$bugsnag = App::make('bugsnag');
set_error_handler(array($bugsnag, 'errorHandler'));
set_exception_handler(array($bugsnag, 'exceptionHandler'));

配置Bugsnag

将用户的详细信息添加到error记录中。

默认情况下,Bugsnag的记录中会有登录用户的唯一标识,但是你可以通过修改Bugsnag客户端实例来改变。

// app/start/global.php
App::make('bugsnag')->setUser([
    'email' => Auth::check() ? Auth::user()->email : 'Guest user'
]);

选择user标签,在错误的详细信息里,可以看到用户的标识了。(下面记录的信息是用户的邮箱)

User details

在向服务器发送ERROR对象之前,通过调用setBeforeNotifyFunction函数可以对其进行修改,该方法接受一个回调函数作为参数。

// app/start/global.php
App::make('bugsnag')->setBeforeNotifyFunction(function($error) {
    $error->setMetaData([
        "user" => [
            "username" => Auth::check() ? Auth::user()->username : 'Guest user'
        ],
        "metrics" => [
            "Metric 1" => "Some data here"
        ]
    ]);
});

看下面的截屏就会发现,我们使用标签列表对错误的详细信息进行了分组。你可以更新这些标签,或者添加一个新标签。

Before notif

为避免泄露用户或应用程序的敏感数据,可以在Bugsnag实例中添加你要过滤的属性列表。这些属性的值在控制面板上就会替代为FILTERRD。(下面是过滤了password的代码)

// app/start/global.php
App::singleton('bugsnag', function() {
    $bugsnag = new Bugsnag_Client( Config::get('app.bugsnag_api_key') );
    $bugsnag->setFilters([
        'password'
    ]);
    return $bugsnag;
});
// ...

Bugsnag的控制面板

在我们创建了Bugsnag账户并将它关联到我们的程序之后,我们需要去访问控制面板来探索Bugsnag所提供的不同组件功能。我们选择Inbox视图的话,会显示一个错误列表,并可以对其进行筛选。我们还可以切换到timeline 图表页,可以通过查看文档来获取更多的详细信息。

Timeline Graph

生成一些错误

在问题视图模板内部,显示了发生问题的用户名。该用户被删除将会引起一个问题,抛出一个错误(试图去获取非对象的属性)。如果大量的用户访问了这个问题页(可以通过多次访问同一个页面来模拟这种情况),太多相同的错误会将控制面板弄得凌乱不堪。如果你使用artisan db:seed 命令来填充数据库,你将一个问题分配给一个用户通过数据库中不存在的id。

Grouping errors

Error details

其实我们并不用担心:控制面板上会显示那么多重复的错误,需要我们专门给错误进行分组。Bugsnag在解析完错误之后,将会自动判断他所处理的错误是重复的错误还是新错误。

我们可以在访问对象的用户名属性时,通过增加一个简单的判断,来修复这个错误。

// app/views/user/questions.blade.php
// ...
{{ isset($question->user) ? $question->user->username : 'User deleted' }}
//...

过滤

为了能够调查发生的问题,Bugsnag提供给了我们一组过滤器来向下钻取数据并收集有关该问题根源的具体细节信息

通过顶部过滤条中的日期范围选择器,你能够按照时间对错误进行过滤。或者选择all来查看所有的错误。

通过数据来过滤错误是一个比较好的途径,像用户,错误状态,严重程度,指派给谁等。你可以检查Bugsnag文档查看支持的过滤器列表。Bugsnag会解析你发送的错误信息,这也有助于自动完成要搜索的条目,比如主机名,发版阶段等。

Filters

添加合作开发者

这将是一个好的机会,对于你的项目或者你管理的项目,你都不是一个人在工作。通过点击页面右上角的collaborators 链接,你就可以添加项目的合作开发者了。

Collaborators

Bugsnag会解析错误,并对错误进行分组来避免出现重复的错误列表。选择一个错误后,你可以将它指派给一个已经存在的合作开发者,或者邀请一个新的合作开发者。

Assign to collaborator

错误状态

在控制面的左侧边栏显示了通过状态进行分组的错误列表(打开,处理中,已修复,延后处理,忽略)。选中其中一个错误,你就可以对它的状态进行修改了。

Error status

默认情况下,Bugsnag将仅仅显示处于打开状态的错误,来帮助我们确定目前活跃的错误。通过使用前面提到的过滤器,你也可以改变这一点。

延期和忽略错误

如果你有一个错误频繁发生,你的团队正在对它做修复。你能够修改触发该错误的频率或者指定一个条件来触发该错误。

Snoozing errors

如果你想去忽略这个错误,你可以使用操作菜单上snooze选项旁边的ignore按钮来实现。但是并不推荐你这么做。

第三方通知

项目团队在开发过程中经常会使用多个应用程序和服务。Bugsnag提供了一个通知插件列表,我们能够配置其为不同类型的错误发送通知。你能够在Slack上通知你的团队,在Github创建问题,提交到你服务的webhook上等。

Slack通知

导航到项目的Settings ,点击 Team Notifications链接,会显示一个已经集成的列表,然后选择Slack。

我们需要指定什么时候应该通知我们和错误发生的频率。然后我们需要通过点击输入框上边的link,来获取我们的Slack webhook URL,复制URL链接到文本框,点击测试。

Slack notification

在Github上创建问题

另一种作用于错误通知的方式就是创建一个新的Github问题。导航到Settings,点击Issue Tracker 链接,显示已经集成的列表,选择其中的Github issues

Github Issue

Github Issue Test

总结

Bugsnag提供了一个很好的平台,实现了错误的自动跟踪,节省了我们花费在处理日志和创建监控的脚本上的时间等。你可以在专注于构建应用程序的同时,密切关注你发布版本的情况。

Bugsnag已经吸引了一些大公司,比如Github, Cisco, Linkedln等。你可以通过15天的免费使用来探索其可用的功能。如果你真的喜欢它,可以考虑付费服务。如果你正在使用别的错误监控平台,或者你已经尝试过了Bugsnag,也请你知道我们你的看法。

你可能感兴趣的内容
0条评论

dexcoder

这家伙太懒了 <( ̄ ﹌  ̄)>
Owner