搭建错误日志收集警报系统--sentry

关键词:sentry,警报系统

概念简介

无论测试如何完善的程序,bug总是免不了会存在的,有些bug不是每次都会出现,测试时运行好好的代码可能在某个用户使用时就可能出现问题。程序每天每时都在产生大量的日志,而且分布在各个服务器上,并且如果你有多个服务在维护的话,日志的数量巨大,无法一一排查,并且缺少上下文,不知道用户什么操作导致的异常,异常太多不知如何下手。

Sentry就可以解决这个痛点,他是一款基于Django的应用,目的在于帮助开发人员从散落在多个不同服务器上毫无头绪的日志文件里发掘活跃的异常。

Sentry是一个错误日志收集与警报平台, 它分为客户端和服务端,客户端(目前客户端有java, golang, python等等多种语言)就嵌入在你的应用程序中间,程序出现异常就向服务端发送消息,服务端可以使用sentry自己童工的web服务界面,也可以自己搭建(国内建议自己搭建)。服务端将消息记录到数据库中并提供可供查看的web界面。Sentrypython编写,源码开放,性能卓越,易于扩展。

依赖

Sentry构建依赖于Python, Django, Mysql/Postgresql, memcache, RabbitMQ/Redis等。

sentry提供的服务端

基本介绍

如果不想自己搭建Sentry,可以用官方提供的服务,地址是点这里, 登陆界面(名字是我自己项目的名字):

也可以使用GitHub等登陆,第一次登陆会让你填写organization名称,然后进去后登陆后新建一个project,新建完成之后,我们得到了一个Sentry DSN(在初始化的时候会用到,重要,后面讲到如何获取)。然后我们可以把这个DSN放到我们的客户端里(即集成到需要监控的代码的SDK中)至此,sentry就完成了与项目的整合,之后就可以捕获异常并发送到sentry,我们可以在sentry监控web页,我们可以在(https://sentry.io/组织名/项目名/)这个地址看到具体的异常信息。

层次分级

1
2
3
4
5
graph TD
settings -->|这里是设置的总入口|organization
organization-->|一个组织下面有多个项目|project
organization-->|一个组织下面有多个团队|team
organization-->|一个组织下面有多个成员|member

警报日志收集与显示

当我们在代码中集成了SDK之后,就可以在代码中想记录的地方进行错误日志的收集和警报了(客户端的设置请看下一节的讲解),具体的错误日志收集之后,在我们的web界面上显示如下。可以点开来面的每一条来查看对应的堆栈信息。

客户端简介

这里以python的客户端为例简介下如何在代码中集成,并且一旦有上报,web界面如何显示(服务端的内容,见上一节的web界面显示)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from raven import Client
# 在这里配置对应的DSN,也就是上一节介绍的那个重要的点
client = Client("http://1391cee6704746948cf640b9e2fb9c01:[email protected]:9000/1")
# 使用client对象捕获异常并上报错误日志
def exception_demo():
try:
1 / 0
except:
client.captureException()
def do_capture_msg2():
for i in range(1000):
client.captureMessage(str(i) + 'hello world! from do_capture_msg2')
exception_demo()
do_capture_msg2()

我们就是利用这种方式进行错误日志的收集与查看的。

权限相关

关于sentry里组织(organization),项目(project),团队(team)成员(member)之间的关系,有如下的权限可以尽心控制。各个类型用户的权限:

  • 超级管理员: 能创建各种用户, team和project只能由超级管理员创建。项目的一些设置比如改变Owner, 数据公开可见与否(设为public的数据可以通过url不登陆也能查看)以及客户端domain限制的设定。另外还有管理项目的api key(客户端只有得到此api key才能向Sentry发送消息)的权限等等。
  • 管理员: 能创建用户, team和项目设定中除改变owner之外的权限, 可以对项目中具体数据做resolve, bookmark, public/public和remove操作。
  • 普通用户: 无Team界面,只能对项目中具体数据做resolve, bookmark, public/unpublic和remove操作。

  • System agents: 无Team界面,只能对项目中具体数据做bookmark, unpublic和remove操作。

权限和实体设置对应:

  • 如果一个团队负责多个项目,可以通过一个Team多个项目方式来实现。
  • 如果一个人参与多个团队, 可以将该用户添加到多个team中去。
  • 一个team或project设置相应的Owner,则可以由此人负责该team或project内的活动。(唯一的缺点是team owner不可以创建project)

  • 一个team或项目的分工应该是有一个管理者来设定项目的基本设定,管理api key, 并将api key分发给项目开发者,项目开发者以普通用户身份登陆Sentry查看错误和resolve错误, 运维以System agents身份登陆Sentry查看系统运行状态。

界面展示

搭建自己的sentry系统

我们可以使用sentry直接提供的服务来进行警报日志的收集与查看,同时我们也可以自己搭建我们自己的错误日志收集系统。我们推荐使用docker方式来进行系统的搭建,搭建完成后,配置NGINX可以提供自己团队的sentry服务。

GitHub上有集成好的项目,地址

Official bootstrap for running your own Sentry with Docker.

将流程大概翻译一下:

依赖

  • Docker 1.10.0+
  • Compose 1.6.0+ (可选)

部署并运行

克隆这个仓库,然后按照如下的步骤,我们将会成功的部署并将此项目运行

下面这个流程仅仅是一个普通的指导,如果你需要进行个人定制,你需要修改 docker-compose.yml 来适应你的额外需求和不同的平台环境。

  1. docker volume create --name=sentry-data && docker volume create --name=sentry-postgres - Make our local database and sentry volumes Docker volumes have to be created manually, as they are declared as external to be more durable.
  2. cp -n .env.example .env - 新建环境配置文件 create env config file
  3. docker-compose build - 构建我们的docker服务 Build and tag the Docker services
  4. docker-compose run --rm web config generate-secret-key - 生成秘钥,然后将此秘钥加入到 .env 文件中,作为 SENTRY_SECRET_KEY的值.
  5. docker-compose run --rm web upgrade - 构建数据库,此过程会让你新建一个超级管理员,填写对应的邮箱和密码即可.
  6. docker-compose up -d - 启动所有服务 (detached/background mode).
  7. 登陆本地地址查看服务 localhost:9000!

Sentry的SSL/TLS安全性

如果想保护我们的sentry服务,我们可以安装SSL/TLS, there are fantastic SSL/TLS proxies like HAProxy and Nginx.

更新 Sentry

使用compose来更新我们的sentry十分简单,只需要按照如下的步骤进行即可

确保使用这个仓库的最近版本

当你更新完这个仓库和dockerfile后,执行如下的步骤即可

1
2
3
docker-compose build # Build the services again after updating
docker-compose run --rm web upgrade # Run new migrations
docker-compose up -d # Recreate the services

参考来源

推送信息给slack

pass


参考资料与推荐项目:

sentry sdk

Docker-compose

Markdown 流程图

Sentry 自己搭建教程

邮箱授权码相关

Slack 配置相关