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,步骤如下:

  1. 启动一个 Redis 容器,命名为 sentry-redis:

    1. $ docker run -d --name sentry-redis redis
  2. 启动一个 Postgres 容器,命名为 sentry-postgres:

    1. $ docker run -d \
    2. --name sentry-postgres \
    3. -e POSTGRES_PASSWORD=secret \
    4. -e POSTGRES_USER=sentry \
    5. postgres
  3. 生成一个 Sentry 的 secret key:

    1. $ docker run --rm sentry config generate-secret-key

    将下面的 \ 都替换成上面生成的 secret key。

  4. 如果是新的数据库(第 1 次运行),则需要运行 upgrade:

    1. $ docker run -it --rm \
    2. -e SENTRY_SECRET_KEY='<secret-key>' \
    3. --link sentry-postgres:postgres \
    4. --link sentry-redis:redis \
    5. sentry upgrade

    按步骤填写自己的信息:

    Sentry - 图1

    最终创建了一个超级管理员和一个默认的名为 sentry 的组织(organization)。

  5. 启动 Sentry,并对外暴露 9000 端口:

    1. $ docker run -d \
    2. --name my-sentry \
    3. -e SENTRY_SECRET_KEY='<secret-key>' \
    4. --link sentry-redis:redis \
    5. --link sentry-postgres:postgres \
    6. -p 9000:9000 \
    7. sentry
  6. 启动 Celery cron 和 Celery workers:

    1. $ docker run -d \
    2. --name sentry-cron \
    3. -e SENTRY_SECRET_KEY='<secret-key>' \
    4. --link sentry-postgres:postgres \
    5. --link sentry-redis:redis \
    6. sentry run cron
    1. $ docker run -d \
    2. --name sentry-worker-1 \
    3. -e SENTRY_SECRET_KEY='<secret-key>' \
    4. --link sentry-postgres:postgres \
    5. --link sentry-redis:redis \
    6. sentry run worker

    小提示:Celery 是用 Python 写的一个分布式任务调度模块。

  7. 完成!

浏览器打开 localhost:9000,就能看到 Sentry 的登录页面了,如下所示:

Sentry - 图2

首次登录时需要填写一些必要信息 ,如下所示:

Sentry - 图3

单击 Continue 进入 Sentry 仪表盘(Dashboard)。单击右上角的 New Project 按钮创建一个项目,选择 Node.js 并填写项目名称为 API,然后单击 Create Project 按钮创建项目。如下所示:

Sentry - 图4

创建成功后进入 Node.js 使用示例页面,我们选择使用 Koa 测试,在右侧选择 Koa:

Sentry - 图5

上图所示是 koa@1 的示例代码,我们以 Paloma(基于 koa@2)为例,编写测试代码:

  1. const Raven = require('raven')
  2. const Paloma = require('paloma')
  3. const app = new Paloma()
  4. Raven.config(DSN).install()
  5. app.on('error', (err) => {
  6. Raven.captureException(err, (err, eventId) => {
  7. console.log('Reported error ' + eventId)
  8. })
  9. })
  10. app.use((ctx) => {
  11. throw new Error('test')
  12. })
  13. app.listen(3000)

小提示:将 DSN 替换为第 10 步截图中的 http://xxx@localhost:9000/2,DSN 既告诉客户端 Sentry 服务器的地址,也用来当做身份认证的 token。

运行以上测试代码,访问 localhost:3000,错误信息会发送给 Sentry。Sentry 展示如下:

Sentry - 图6

点进去可以看到详细的信息:

Sentry - 图7

Sentry 还有许多功能,比如:错误归类、展示错误的频率柱状图、将错误指派给组织中的某个人、给错误添加标签、查看这类错误事件的历史、标记错误为已解决、在错误下发表评论、警报等等功能。

6.5.3 koa-raven

笔者将 Raven 封装成 Koa 的一个中间件。使用如下:

  1. const raven = require('koa-raven')
  2. const Paloma = require('paloma')
  3. const app = new Paloma()
  4. app.use(raven(DSN))
  5. app.use((ctx) => {
  6. throw new Error('test')
  7. })
  8. app.listen(3000)

或者使用 ctx.raven:

  1. const raven = require('koa-raven')
  2. const Paloma = require('paloma')
  3. const app = new Paloma()
  4. app.use(raven(DSN))
  5. app.use((ctx) => {
  6. try {
  7. throw new Error('test')
  8. } catch (e) {
  9. ctx.raven.captureException(e, { extra: { name: 'tom' } })
  10. ctx.status = 500
  11. ctx.body = e.stack
  12. }
  13. })
  14. app.listen(3000)

6.5.4 参考链接

上一节:6.4 OpenTracing + Jaeger

下一节:7.1 Telegraf + InfluxDB + Grafana(上).md)