《运维开发实践:基于Sentry搭建错误日志监控系统》要点:
本文介绍了运维开发实践:基于Sentry搭建错误日志监控系统,希望对您有用。如果有疑问,可以联系我们。
错误日志监控也可称为业务逻辑监控, 旨在对业务系统运行过程中产生的错误日志进行收集归纳和监控告警.似乎有那么点曾相识?没错… 就是上一篇文章提到的“APM应用性能监控”.但它又与APM不同,APM系统主要注重应用层的行为分析,收集的更多是运营方向的数据.而sentry所做的是收集应用底层代码的崩溃信息,便于码侬们排查代码异常.简单来说它就是一个面向技术码侬的排障工具.
随着运维自动化流程的推进, 各类运维工具和系统也像雨后春笋般涌现. 目前我们自主开发的运维系统的数量已经接近两位数. 这些系统部署在多台机器上, 通常还配套一批后台运行的脚本. web端如果出现异常, 开发人员可以及时得到反馈进行修复. 而脚本因为没有交互, 可能会出现发生重大故障时才定位到问题的情况.
最终整合的通知邮件如图
上面的操作部分解决了脚本运行状态监控盲区的问题, 但还存在如下问题
鉴于此, 我们了解了一些日志收集和监控方案, 选择了sentry.
sentry是一个现代化的错误日志记录和聚合平台.支持几乎所有主流开发语言和平台, 并提供了现代化UI, 如图
与ELK, splunk不同, sentry专注于应用程序产生的错误日志的聚合和监控. 官方提供了多个语言的SDK.
多达30种集成方式
让开发者第一时间获悉错误信息, 并方便的整合进自己和团队的工作流中.
为了直观的展示sentry的强大, 这里模拟一个常见的场景, 如有雷同, 纯属巧合.
接入sentry前
接入后
接入sentry前
接入后
sentry官方提供了详细的部署文档, 网上也可以搜索到中文的安装教程, 安装过程不赘述. 想要尝鲜的小伙伴也可以直接使用sentry官方提供的saas, 免费版支持每天5000个event. 地址是 https://sentry.io
使用sentry, 需要弄清楚几个概念:
sentry服务端的配置主要是名称, 告警规则等, 至于被监控项目是前端还是后端区别不大.
告警规则的配置相当灵活, 且可以对多个条件进行与或判断
邮件服务器的配置请参考官方文档, 自己搭建的sentry服务器如果发现集成类型很少, 可以安装官方或第三方插件进行扩展
在服务端配置结束后, 可以开始配置客户端.
因为我们的系统主要用python开发, 在此以python为例.
python接入sentry十分简单. 官方提供了十几种python环境(框架)下使用sentry的例子, 比如在celery中
from raven import Client from raven.contrib.celery import register_signal, register_logger_signal client = Client(DSN) # register a custom filter to filter out duplicate logs register_logger_signal(client) # The register_logger_signal function can also take an optional argument # `loglevel` which is the level used for the handler created. # Defaults to `logging.ERROR` register_logger_signal(client, loglevel=logging.INFO) # hook into the Celery error handler register_signal(client) # The register_signal function can also take an optional argument # `ignore_expected` which causes exception classes specified in Task.throws # to be ignored register_signal(client, ignore_expected=True)
个人推荐借鉴logging使用的例子, 原因是通常开发者会根据logging模块定制自己的日志配置, 不直接使用框架内的日志模块. 如果你在应用程序中只用了logging模块, 那么接入sentry对已存在的代码来说是透明的, 无需多加修改.
用logging模块接入sentry只需两步:
pip install raven
在应用程序的入口文件(tornado中的app.py等)中, 或者自定义的日志模块中, 插入如下代码
from raven.handlers.logging import SentryHandler from raven.conf import setup_logging handler = SentryHandler(DSN) handler.setLevel(logging.ERROR) setup_logging(handler)
完成了这两步操作之后, 就可以像之前那样使用logging模块
import logging logger = logging.getLogger(__name__) logger.info(‘This is a test message’)
当上面的代码被执行时, 除了原有的打log操作之外, raven还会向sentry服务器发送日志内容, 并向标准输出添加
Sending message of length xxx to https://xxxx
如果希望向sentry发送更多上下文信息, 可以带上extra参数
logger.error(‘This is a test message’, extra={‘stack’: True})
最终显示在后台的日志信息如图
包含了日志级别, python环境信息, SDK信息, 栈调用, 前后n次日志输出, 相关的其他事件等等, 如果是未捕获的异常或带上extra参数, 还会显示中间变量的值, 很方便的定位到出错的位置和数据, 无需再去代码埋点.
前端的接入相对来说复杂一些
第一, 需要对sentry服务器的域名进行解析. 内部的系统, 后端监控可以给线上机器添加hosts指定sentry服务器的IP. 而前端, 因为错误日志是从用户浏览器发出的, 需要用户能自动解析sentry服务器的域名
第二, 如果前端项目用到了打包工具, 而通常打包工具会对代码进行压缩甚至混淆, 就会出现sentry收集到的日志无法准确定位问题代码的情况 所幸, sentry支持导入sourcemap自动解析和还原代码, 让开发者在后台能看到development环境一样详细的栈调用. (当然如果没有用打包工具可以忽略这一步)
前端的接入这里以reactjs为例
npm i raven-js –save
在index.js文件(入口文件)中,
import Raven from ‘raven-js’; # 在适当的地方加入, 尽可能让它早执行 Raven.config(DSN(public)).install();
其他前端框架的接入请参考官方文档
https://docs.sentry.io/clients/javascript
提前生成好sourcemap文件, 实测source-map级别可以完美工作, cheap-source-map能定位到, 但显示不友好. 当然, 最推荐的是cheap-module-source-map
# 安装 npm i -g sentry-cli-binary # 登录sentry sentry-cli –url SENTRY_URL login # SENTRY_URL指自建服务或官方saas地址, 执行命令后会访问API TOKEN创建页面, 生成一个TOKEN, 拷贝进来, 成功后TOKEN会被保留到系统用户某个配置目录下, 后续的请求都会重复使用这个TOKEN # 创建一个release sentry-cli releases -o sentry -p 7d04f2c51f32 new test01 –finalize # 这里的sentry 和7d04f2c51f32 是指 组织名称和项目名称, 均指*简称*, 与sentry页面上默认显示的不同, 需要到配置页面查看 # 上传dist目录下的文件 sentry-cli releases -o sentry -p 7d04f2c51f32 files test01 upload-sourcemaps dist # 删除旧的release下的所有文件 sentry-cli releases -o sentry -p 7d04f2c51f32 files test01 delete –all # 当然这个命令是不想要release上的文件的时候执行的
注意, 生成的map文件与上传的相对路径需要一致. 比如, dist目录是打包后的文件存放目录, map文件为sourcemap/[file].map, 则sentry-cli上传目录应该是dist, 这样map文件才会显示在sentry后台的~/sourcemap/目录下.
这样的webpack配置
devtool = ‘source-map’; output.path: ‘dist’; output.sourceMapFilename = ‘sourcemap/[file].map’;
则对应这样的命令
sentry-cli releases -o sentry -p 7d04f2c51f32 files test02 upload-sourcemaps dist
另外, sentry-cli提供了一个参数–url-prefix, 可以为上传的map文件添加前缀, 默认是~/, 有兴趣的同学可以试试看
再补充一点, sentry需要根据js文件的sourceMappingURL来解析map文件路径, 所以sourcemap级别不能用hide-source-map或者类似的.
代码上传完毕后, 在版本->工件页面可以看到该release上的文件, 如图
最终错误日志效果如图
篇幅所限, sentry后台的使用简要讲几点
第一,自定义过滤
sentry提供了丰富的过滤选项, 默认过滤条件是”Unresolved Issues”, 用户也可以自己组合过滤条件, 并保存成个人或团队的默认选项
第二,页面实时更新
上图中间的按钮可以开启或关闭issues页面的实时刷新,
第三,统计和概览
上图是系统管理员页面, 可以看到系统调用, 等待中的任务队列等的情况, 在个人帐号首页也能看到项目的统计信息.
文章来自微信公众号:运维军团
转载请注明本页网址:
http://www.vephp.com/jiaocheng/1963.html