不只是日志收集,项目监控工具Sentry的安装、配置、使用

优采云 发布时间: 2022-07-24 12:23

  不只是日志收集,项目监控工具Sentry的安装、配置、使用

  前言

  上一篇文章介绍了ExceptionLess这个日志收集系统:

  由于ExceptionLess官方提供的客户端只有.Net/.NetCore平台和js的,本文继续介绍另一个日志收集系统:Sentry

  Sentry 是一个实时事件日志记录和聚合平台。(官方说的是错误监控 Error Monitor)它专门用于监视错误和提取执行适当的事后操作所需的所有信息,而无需使用标准用户反馈循环的任何麻烦。

  Sentry使用Python(Django)开发,功能非常丰富,相比起ExceptionLess来说也重得多(这也是我们在.NetCore平台使用ExceptionLess的原因),其支持的平台很全,基本主流编程语言/框架都有,看图

  image

  除了.NetCore项目,其他的我都使用Sentry来收集日志和报错信息,整体使用下来还是非常不错的,(就是有点耗内存),请准备好一台内存足够大的服务器,起码8G吧~

  安装

  和ExceptionLess一样,Sentry也可以在线使用,只需要注册一个账号就行了

  不过既然是开源免费的,还是自己部署一套比较自由,速度也比较快(Sentry服务器在国外)

  老规矩,使用docker做本地部署,最开始用这玩意的时候安装折腾得很,后来官方自己出了个方便的安装脚本,现在安装应该是很容易了。

  首先拉取这个项目到本地:

  然后进入项目目录,执行./install.sh,经过漫长的pull和build,根据提示输入管理员的用户名和密码,就完事了

  官方提供的这个方案也是通过docker-compose管理容器的,以后我们也可以通过docker-compose相关的命令来手动启停系统。

  跑起来后访问:9000就可以看到登录界面(端口根据实际配置可能不一样)

  image

  用刚才创建的用户名密码登录就行了

  配置

  Sentry的配置项是真的多,到现在大部分我都还没搞清楚,我只是简单的配置了邮件、端口这些,就可以用得飞起了

  接上面的,把官方提供的那个self-host项目clone下来之后,可以看到里面有个sentry文件夹,配置文件就在这目录里。

  邮件配置在config.yml文件中,(比ExceptionLess好的一点是邮箱地址终于不需要转义了)

  这里以腾讯企业邮箱配置为例,在配置中找到# Mail Server #这个“节点”

  mail.backend: 'smtp'  # Use dummy if you want to disable email entirely<br />mail.host: 'smtp.exmail.qq.com'<br />mail.port: 465<br />mail.username: 'demo@demo.com'<br />mail.password: 'password'<br />mail.use-tls: false<br /># mail.use-ssl: false<br />mail.from: 'demo@demo.com'<br />

  这样就可以正常发邮件了~

  那么端口要怎么改呢,旧版的onpremise(也就是这个self-host项目)是直接在docker-compose.yml里改的,不过现在不推荐修改这个文件了(官方的这个compose配置文件我甚至看不懂)

  现在通过环境变量设置,使用ll -a列出项目目录下所有文件,可以发现有个.env文件,环境变量就在这文件里配置,里面有一行配置端口的

  SENTRY_BIND=9000<br />

  

  直接修改就完事了~

  使用

  Sentry的界面比ExceptionLess的复杂很多,里面的信息也更多,让人看得眼花缭乱

  作为日志收集工具的话,主要就是看“问题”页面,可以筛选某个项目,也可以看全部,这点比ExceptionLess直观一些

  image

  点击某一个问题进去可以看到错误详情

  image

  如果是Python这类动态语言,甚至可以直接看到是哪段代码报错,太方便了

  image

  然后性能页面可以细化到每个请求的相应时间、错误频率、访问的用户数量等

  image

  然后再点进去某一个URL还能看到访问这个URL的用户的一些信息,包括IP地址,用户名(如果已登录),页面停留时间,用户都是哪些时间段访问啥的,指标太多了,有些不太懂,反正功能是很强的就对了~

  image

  大概就这些吧,其他功能我还没有深入,等后续继续学习后再来更新博客。

  项目集成

  首先可以看官网文档,还是比较全的,而且大部分语言都提供了集成的Demo。

  文档地址:

  一些Demo:

  直接上几个项目集成的例子吧

  本身在Sentry中创建项目时,系统也会显示一个简单的集成指引,这里把我魔改的代码放上来

  Django项目

  首先根据指引需要安装一个pip包

  pip install sentry-sdk<br />

  我习惯将项目配置settings.py放在config包下,然后把拆分出来的配置一个个都列在这个包中,方便管理

  

  在config下创建sentry.py,代码如下

  import logging<br /><br />import sentry_sdk<br />from sentry_sdk.integrations.django import DjangoIntegration<br />from sentry_sdk.integrations.logging import LoggingIntegration<br />from sentry_sdk.integrations.redis import RedisIntegration<br /><br />sentry_logging = LoggingIntegration(<br />    level=logging.INFO,  # Capture info and above as breadcrumbs<br />    event_level=logging.ERROR  # Send errors as events<br />)<br /><br />sentry_sdk.init(<br />    # 反正dsn这行无脑复制sentry上显示的就行<br />    dsn="http://key@sentry地址/id",<br />    integrations=[DjangoIntegration(), RedisIntegration(), sentry_logging],<br /><br />    # 这里设置为1代表捕捉100%的transaction 用于性能监控<br />    traces_sample_rate=1,<br />    send_default_pii=True,<br />)<br />

  然后在settings.py里引入就完事了

  from config import sentry<br />

  Flutter项目

  根据指引首先要添加依赖

  dependencies:<br />  sentry_flutter: ^5.1.0<br />

  PS:现在这个依赖出了6.x版本了,初始化的时候是用异步操作的,我还没更新,就先用5.x版本了

  这是原本main.dart中的App初始化代码

  void main() {<br />  WidgetsFlutterBinding.ensureInitialized();<br />  if (Platform.isAndroid) {<br />      // 以下两行 设置android状态栏为透明的沉浸。<br />      SystemUiOverlayStyle systemUiOverlayStyle = SystemUiOverlayStyle(statusBarColor: Colors.transparent);<br />      SystemChrome.setSystemUIOverlayStyle(systemUiOverlayStyle);<br />  }<br />  Global.init().then((value) => runApp(MyApp()));<br />}<br />

  引入Sentry之后,需要包装一层

  import 'package:sentry_flutter/sentry_flutter.dart';<br /><br />void main() {<br />  WidgetsFlutterBinding.ensureInitialized();<br /><br />  SentryFlutter.init(<br />    (options) {<br />      options.dsn = 'http://1335793bf7684f21918248b11cebbf9c@sentry.sblt.deali.cn:9800/9';<br />    },<br />    appRunner: () {<br />      if (Platform.isAndroid) {<br />        SystemUiOverlayStyle systemUiOverlayStyle = SystemUiOverlayStyle(statusBarColor: Colors.transparent);<br />        SystemChrome.setSystemUIOverlayStyle(systemUiOverlayStyle);<br />      }<br />      Global.init().then((value) => runApp(MyApp()));<br />    }<br />  );<br />}<br />

  也就是把原本启动App的代码放在SentryFlutter的appRunner里执行。

  AspNetCore项目

  虽然AspNetCore项目我们使用ExceptionLess来采集日志,不过在切换到ExceptionLess之前,也用了一段时间的Sentry,Sentry支持的平台那么丰富,在AspNetCore中使用自然也是没问题的。

  根据官方指引首先安装依赖

  dotnet add package Sentry.AspNetCore -v 3.19.0<br />

  然后将sentry的配置写在appsettings.json中

  "Sentry": {<br />  "Dsn": "https://examplePublicKey@o0.ingest.sentry.io/0",<br />  "MaxRequestBodySize": "Always",<br />  "SendDefaultPii": true,<br />  "MinimumBreadcrumbLevel": "Debug",<br />  "MinimumEventLevel": "Warning",<br />  "AttachStackTrace": true,<br />  "Debug": true,<br />  "DiagnosticsLevel": "Error"<br />}<br />

  跟ExceptionLess不同,sentry不用注册服务和添加中间件的方式,而是实现了IWebHostBuilder的扩展方法,在ConfigureWebHostDefaults时就hook到系统中,理论上功能会更强,ExceptionLess通过中间件只能捕捉到类似URL不存在这类HTTP异常,如果是程序中报错是需要手动catch后submit的;而sentry是采用hook的形式(官网说的),可以捕捉到未处理的异常并且上报。(根据微软文档中AspNetCore的启动过程推测出的,理解得不深如果有错误请大佬们指正~)

  所以对于AspNetCore3.1项目,修改Program.cs文件,添加一行代码 webBuilder.UseSentry();

  public static IHostBuilder CreateHostBuilder(string[] args) =><br />  Host.CreateDefaultBuilder(args)<br />  .ConfigureWebHostDefaults(webBuilder => {<br />    webBuilder.UseSentry();<br />    webBuilder.UseStartup();<br />  });<br />

  对于AspNetCore6项目,也是Program.cs文件(.Net6也只有这文件)

  var builder = WebApplication.CreateBuilder(args);<br />builder.WebHost.UseSentry();<br />

  搞定,然后sentry就会捕捉异常并提交

  也可以手动提交,比如

  void Demo([FromServices] IHub sentry) {<br />  // 提交普通信息<br />  sentry.CaptureMessage("hello", SentryLevel.Debug);<br />  <br />  try {<br />    // 会出错的代码<br />  }<br />  catch (Exception err) {<br />      sentry.CaptureException(err);<br />  }<br />}<br />

  当然根据文档也可以不用依赖注入

  using Sentry;<br /><br />try {<br />    // 会出错的代码<br />}<br />catch (Exception err) {<br />    SentrySdk.CaptureException(err);<br />}<br />

  OK,先这些吧,其他例子直接看官网就行~

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线