日志篇 - Sentry
6.5.1 什么是 Sentry?
Sentry官网的介绍:
Sentry’s real-time error tracking gives you insight into production deployments and information to reproduce and fix crashes.
简而言之:Sentry 是一个开源的实时错误日志收集平台。
6.5.2 安装 Sentry
我们使用 Docker 安装并启动 Sentry,步骤如下:
启动一个 Redis 容器,命名为 sentry-redis:
$ docker run -d --name sentry-redis redis
启动一个 Postgres 容器,命名为 sentry-postgres:
$ docker run -d \
--name sentry-postgres \
-e POSTGRES_PASSWORD=secret \
-e POSTGRES_USER=sentry \
postgres
生成一个 Sentry 的 secret key:
$ docker run --rm sentry config generate-secret-key
将下面的 \ 都替换成上面生成的 secret key。
如果是新的数据库(第 1 次运行),则需要运行 upgrade:
$ docker run -it --rm \
-e SENTRY_SECRET_KEY='<secret-key>' \
--link sentry-postgres:postgres \
--link sentry-redis:redis \
sentry upgrade
按步骤填写自己的信息:
最终创建了一个超级管理员和一个默认的名为 sentry 的组织(organization)。
启动 Sentry,并对外暴露 9000 端口:
$ docker run -d \
--name my-sentry \
-e SENTRY_SECRET_KEY='<secret-key>' \
--link sentry-redis:redis \
--link sentry-postgres:postgres \
-p 9000:9000 \
sentry
启动 Celery cron 和 Celery workers:
$ docker run -d \
--name sentry-cron \
-e SENTRY_SECRET_KEY='<secret-key>' \
--link sentry-postgres:postgres \
--link sentry-redis:redis \
sentry run cron
$ docker run -d \
--name sentry-worker-1 \
-e SENTRY_SECRET_KEY='<secret-key>' \
--link sentry-postgres:postgres \
--link sentry-redis:redis \
sentry run worker
小提示:Celery 是用 Python 写的一个分布式任务调度模块。
完成!
浏览器打开 localhost:9000,就能看到 Sentry 的登录页面了,如下所示:
首次登录时需要填写一些必要信息 ,如下所示:
单击 Continue 进入 Sentry 仪表盘(Dashboard)。单击右上角的 New Project 按钮创建一个项目,选择 Node.js 并填写项目名称为 API,然后单击 Create Project 按钮创建项目。如下所示:
创建成功后进入 Node.js 使用示例页面,我们选择使用 Koa 测试,在右侧选择 Koa:
上图所示是 koa@1 的示例代码,我们以 Paloma(基于 koa@2)为例,编写测试代码:
const Raven = require('raven')
const Paloma = require('paloma')
const app = new Paloma()
Raven.config(DSN).install()
app.on('error', (err) => {
Raven.captureException(err, (err, eventId) => {
console.log('Reported error ' + eventId)
})
})
app.use((ctx) => {
throw new Error('test')
})
app.listen(3000)
小提示:将 DSN 替换为第 10 步截图中的 http://xxx@localhost:9000/2
,DSN 既告诉客户端 Sentry 服务器的地址,也用来当做身份认证的 token。
运行以上测试代码,访问 localhost:3000,错误信息会发送给 Sentry。Sentry 展示如下:
点进去可以看到详细的信息:
Sentry 还有许多功能,比如:错误归类、展示错误的频率柱状图、将错误指派给组织中的某个人、给错误添加标签、查看这类错误事件的历史、标记错误为已解决、在错误下发表评论、警报等等功能。
6.5.3 koa-raven
笔者将 Raven 封装成 Koa 的一个中间件。使用如下:
const raven = require('koa-raven')
const Paloma = require('paloma')
const app = new Paloma()
app.use(raven(DSN))
app.use((ctx) => {
throw new Error('test')
})
app.listen(3000)
或者使用 ctx.raven:
const raven = require('koa-raven')
const Paloma = require('paloma')
const app = new Paloma()
app.use(raven(DSN))
app.use((ctx) => {
try {
throw new Error('test')
} catch (e) {
ctx.raven.captureException(e, { extra: { name: 'tom' } })
ctx.status = 500
ctx.body = e.stack
}
})
app.listen(3000)