Sentry错误日志监控系统

1、业务场景

错误日志监控也可称为业务逻辑监控,,旨在对业务系统运行过程中产生的错误日志进行收集归纳和监控告警,说到底就是“APM应用性能监控”。但它又与APM不同,APM系统主要注重应用层的行为分析,收集的更多是运营方向的数据。而Sentry所做的是收集应用底层代码的崩溃信息,便于排查代码异常。随着运维自动化流程的推进,,各类运维工具和系统也像雨后春笋般涌现.。目前我们自主开发的运维系统的数量已经接近两位数.。这些系统部署在多台机器上,,通常还配套一批后台运行的脚本.。web端如果出现异常, 开发人员可以及时得到反馈进行修复. 而脚本因为没有交互, 可能会出现发生重大故障时才定位到问题的情况。

2、常用方案

1、后端和脚本用Python内置的日志模块记录程序中间状态,,同时也将两者的输出重定向到指定文件, 以获取未捕获的异常信息;

2、同台服务器上多个系统的日志集中存放到同个目录;

3、使用rsync定时从多台服务器中拉取日志文件;

4、对日志文件进行关键字匹配, 并将过滤结果通过邮件发送给运维开发人员。

上面的操作部分解决了脚本运行状态监控盲区的问题, 但还存在如下问题:

1、无法第一时间感知错误:脚本日志的拉取不是实时的,,web端用户的反馈也往往存在滞后。出现问题到解决问题的周期太长,容易导致工作陷入被动。

2、错误信息的获取相对低效:用户反馈和邮件告警包含的错误信息非常有限,,最终都不得不在大量的日志中上下翻看关联的信息.。可能还需要在测试环境下给代码埋点多获取一些中间变量数据,给定位问题带来很多麻烦。

3、日志的处理方式不够灵活:通常来说,除了程序运行出错,我们还关心其他异常情况,比如数据污染,非法请求,第三方API调用异常等。如果将此类等同错误记录下来,很容易造成告警滥发,而如果不处理此类异常,久而久之可能导致严重的问题。我们希望同样的日志内容可以根据场景不同灵活处理。

4、监控覆盖面有限:完整的监控应该涵盖脚本,后端以及前端三个部分。特别是我们新的运维系统实现了前后端分离之后,很多前端的问题无法被统一记录下来。

3、Sentry

Sentry 是一个开源的实时错误追踪系统,可以帮助开发者实时监控并修复异常问题。其专注于错误监控以及提取一切事后处理所需的信息;支持几乎所有主流开发语言( JS/Java/Python/php )和平台, 并提供了web界面来展示输出错误。Sentry 分为服务端和客户端 SDK,前者可以直接使用它家提供的在线服务,也可以本地自行搭建;后者提供了对多种主流语言和框架的支持,包括 React、Angular、Node、Django、RoR、PHP、Laravel、Android、.NET、JAVA 等。同时它可提供了和其他流行服务集成的方案,例如 GitHub、GitLab、bitbuck、heroku、slack、Trello 等。

Sentry官网: https://sentry.io/

Github项目地址: https://github.com/getsentry/onpremise

Sentry 官方提供免费版和收费版的服务,如果不想搭建本地服务的话直接用官方服务好了。Sentry是个开源的工具可以自行搭建(推荐使用Docker搭建);Sentry支持几乎所有主流开发语言和平台, 并提供了现代化UI, 如下图:

img

与ELK,,splunk不同,,Sentry专注于应用程序产生的错误日志的聚合和监控.,官方提供了多个语言的SDK;以及很多种集成方式,让开发者第一时间获悉错误信息, 并方便的整合进自己和团队的工作流中。

img

img

总之:Sentry有很多优秀的地方、这里就不再一一举例了。

4、关于Sentry的几个概念

使用Sentry, 需要弄清楚几个概念:

  • event:直译是”事件”, 是可操作数据的基本单位. 每一次日志输出就产生一个event. event并不一定就是错误, 如果日志记录级别设置很低, 那么后台会产生很多的event, 所以正确的设置日志级别很重要。

  • issue:直译是”工单”或者”问题”, 是同一类event的聚合. 某一个错误可能因为重复执行而被记录多出, 在sentry会自动聚合到一起, 方便处理. 通常我们操作的对象就是issue

  • DSN:DSN即客户端密钥, 用来进行客户端和服务器的通信. DSN是一个url, 包含一个公钥一个私钥, 项目标记和服务器地址, 比如https://1703147af2094458bevb1bfadcfa1c2:7e00a1d4cbd745c0b780451c3586d7f4@sentry.io/1545. 这类DSN是私密的, 还有一类是非私密的, 在Sentry后台中显示为DSN(public), 给前端项目使用.

  • Raven:整个错误日志监控系统包括客户端和服务端, Sentry是服务端的名称, 客户端名称是Raver, 需要两者配合才能工作.

5、通过Docker安装Sentry(CentOS7)

卸载已有Docker

yum remove docker docker-common docker-selinux docker-engine

安装Docker的依赖

yum install -y yum-utils device-mapper-persistent-data lvm2

安装Docker-CE

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce

启动Docker后台服务

systemctl start docker

测试运行

docker run hello-world

设置开机启动

systemctl enable docker

注:安装过程如果特别慢,请稍安勿躁;也可以切换为国内源进行安装。

6、安装docker-compose

这里安装1.25版本、也可以到官方网站下载安装指定版本https://www.docker.com/

curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

测试
docker-compose version

7、安装Sentry

安装git

yum install git

下载onpremise

git clone https://github.com/getsentry/onpremise.git

安装

安装的过程中会下载如下docker镜像、安装是否成功就看这一步了(如果镜像下载很慢、请稍安勿躁、耐心等待、本人安装了3个多小时。)

cd onpremise
./install.sh

img

启动

docker-compose up -d

启动成功之后我们通过docker ps命令可以看到、Sentry以及相关依赖已经启动完成,监听端口9000已经正常、这时我们就可以通过浏览器去访问Sentry了。

img

img

创建账号

docker-compose run --rm web createuser

img

打开浏览器输入IP地址+端口号9000就可以访问Sentry登录界面了。

img

至此,Sentry错误日志监控系统介绍以及通过docker的方案安装已经完成,下一节我们来看看如何配置Sentry并成功的对接Django项目。

推荐文章