当前位置:首页 > 架构 > 正文内容

如何使用sentry进行异常监控

phpmianshi2年前 (2019-04-11)架构271

系统架构中应用程序的监控非常重要。比如你是否遇到过这种问题:当用户向你抛出一个bug(或者说异常),而你却找不到异常出现的原因和时机,也很难去重现这种奇葩的事件,此时你有一种众里寻他千百度,那bug却不知在何处的感觉。所以,利用某种工具去实现系统的异常监控,方便我们及时查看结果,并且作出合理的处理,这对于每个架构师来说都是挺重要的。


一、概念理解:

1、异常与捕获

  • 异常指的是在程序运行过程中发生的异常事件,通常是由外部问题(如硬件错误、输入错误)所导致的。

  • 异常(Exception)都是运行时的。编译时产生的不是异常,而是错误(Error)。需要注意的是,程序设计导致的错误不属于异常(Exception)。

  • 总结:
    Error:系统内部错误,这类错误由系统进行处理,程序本身无需捕获处理;
    Exception:可以处理的异常

  • 捕获:获取异常
    通过try…catch语句进行捕获异常。
    通过throw抛出异常,throws向上一级调用方法抛出异常。

2、DSN(数据源名称)

  • DSN:即Data Source Name

  • Sentry官网是如此描述DSN的:
    完成Sentry项目的设置后,将给您指定一个值,我们称之为DSN或数据源名称。它看起来像标准的URL,但实际上只是Sentry SDKS所需要的配置的表示。

  • 下面就是一个DSN的例子:

    SENTRY_LARAVEL_DSN=http://e74285aba1cb473fa76c284f96baa51c@49.234.111.111:9000/2
  • 可以在你所在的项目中查看你的DSN,把他集成到你的代码中



二、为什么要集成异常监控


即使我们对上线的项目做了大量的测试,但有时候还是会有潜在的bug,这种比较顽固的问题只能通过监控机制才能有效的减少其带来的损失,所以异常捕获和上报很重要。


三、如何安装


参考官网:https://github.com/getsentry/onpremise


这里主要介绍邮件配置中遇到的问题,安装后发现无法发送邮件,解决方案如下:

修改config.yml配置文件:

mail.backend: 'smtp'  

mail.host: 'smtp.exmail.qq.com'

#mail.port: 465  这里端口需要改为587

mail.port: 587

mail.username: 'devops@phpmianshi.com'

mail.password: 'password'

mail.use-tls: true

mail.from: 'devops@phpmianshi.com'


重新启动:

docker-compose down
docker-compose build
docker-compose up -d


主要参考了:

https://github.com/getsentry/onpremise/issues/404

https://stackoverflow.com/questions/47328056/smtpserverdisconnected-connection-unexpectedly-closed-timed-out/47328415#47328415


原因如下:

It seems that currently django.core.mail.backends.smtp.EmailBackend does not support sending emails over ssl and only TSL.

I changed the port to 587 and emails are going through as expected.

四、如何接入异常捕获


本文主要介绍laravel项目如何接入sentry,sentry主要是捕获到你未catch的程序异常,所以如果你用程序去catch了异常,sentry就没有将这个异常上报到服务器了。这时候你可以代码中自己主动上报。


Install the sentry/sentry-laravel package:

$ composer require sentry/sentry-laravel:1.7.1

If you’re on Laravel 5.5 or later the package will be auto-discovered. Otherwise you will need to manually configure it in your config/app.php.

Add Sentry reporting to App/Exceptions/Handler.php.

For Laravel 7.x and later:

public function report(Throwable $exception){
    if (app()->bound('sentry') && $this->shouldReport($exception)) {
        app('sentry')->captureException($exception);
    }

    parent::report($exception);}

For Laravel 5.x and 6.x:

public function report(Exception $exception){
    if (app()->bound('sentry') && $this->shouldReport($exception)) {
        app('sentry')->captureException($exception);
    }

    parent::report($exception);}

Create the Sentry configuration file (config/sentry.php) with this command:

$ php artisan vendor:publish --provider="Sentry\Laravel\ServiceProvider"

Add your DSN to .env:

SENTRY_LARAVEL_DSN=http://e74285aba1cb473fa76c284f96baa51c@49.234.49.108:9000/2

You can easily verify that Sentry is capturing errors in your Laravel application by creating a debug route that will throw an exception:

Route::get('/debug-sentry', function () {
    throw new Exception('My first Sentry error!');});

Visiting this route will trigger an exception that will be captured by Sentry.


接入完毕。


五、选择哪个异常监控工具


1 .腾讯的bugly:比较适合原生APP开发,因为它报告的异常基本都是java端的代码,你很难定位到JavaScript端的代码异常。

2. Bugsnag:聚焦于web端、移动端、服务端程序的错误监控,能自动报告未处理的异常和崩溃,通过崩溃报告日志更好地了解到有关用户的操作情况,也附上了相应的用户信息来确定受崩溃的程度。国内访问bugsnag超级慢且卡,而且收费,排除使用。

3.fundebug 目前暂不支持PHP,而且收费,排除使用。对JS的支持能力很强,貌似还有录屏功能,快速复现出错场景。

4. Sentry:Sentry是一个实时事件日志和聚合平台。它的核心是监视错误和提取所有必要的信息,以便进行正确的事后分析。支持多种语言,且有开源免费版本。不仅支持后端,前端JS,貌似现在也支持ios和android。


六、相关资料



版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

系统架构的演进之路-单体到SOA到微服务

单体系统的困难在微服务出现之前,互联网应用系统主要是单体系统,也就是说一个网站的整个系统由一个应用构成。如果是 Java,就打包成一个 war 包,一个 war 包包含整个应用系统,系统更新的时候,即...

基于rebase的Git工作流

使用Git在多人协作的过程中,我们也会面临如何运用好Git的问题。这种情况下,就出现了各种各样的Git Workflow,而本文将介绍一种基于rebase的工作流,这种工作流也是目前开源社区所比较推崇...

如何实现分布式事务

事务定义简单地说,事务提供一种“要么什么都不做,要么做全套(All or Nothing)”机制。数据库本地事务数据库事务中的四大特性 ACIDA:原子性(Atomicity),一个事务(transa...

如何应对网站流量暴增

如何应对网站流量暴增

按照经验大概出问题地方是DB,磁盘io、CPU、带宽、连接数、内存其中的一个或几个。不同的业务,不同的系统设计,出问题的地方会有所不同。如果流量增大数倍,势必某个资源会在瞬间被榨干,然后所有的服务都会...

微博朋友圈亿级Feed流如何设计

微博朋友圈亿级Feed流如何设计

简介Feed流是Feed + 流,Feed的本意是饲料,Feed流的本意就是有人一直在往一个地方投递新鲜的饲料,如果需要饲料,只需要盯着投递点就可以了,这样就能源源不断获取到新鲜的饲料。 在...

互联网应用可用性的度量

概念业界通常用多少个 9 来说明互联网应用的可用性。示例比如说 QQ 的可用性是 4 个 9,就是说 QQ 的服务 99.99% 可用,这句话的意思是 QQ 的服务要保证在其所有的运行时间里只有 0....

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。