使用docker-compose运行错误收集工具Sentry

Use exceptions for exceptional problems. Exceptions can suffer from all the readability and maintainability problems of classic spaghetti code. Reserve exceptions for exceptional things.

最近在尝试搭建错误日志收集工具Sentry,发现用docker-compose工具运行起来非常方便。 目前的项目捕捉异常比较简陋,一般代码发生异常之后,写个函数发一封邮件把异常信息附上。 一开始只是在邮件附带了异常消息,但是没有加上函数调用的参数和变量值,导致问题排查起来比较困难。 后来函数加上了个locals()返回的字典返回当前函数内部变量信息,算是方便了一点。不过最近发现了神器 Sentry, Sentry’s real-time error tracking gives you insight into production deployments and information to reproduce and fix crashes.

在ubuntu server上搭建个一个尝试了一下(也可以直接用官方提供的服务),感觉还是非常强大的,界面也比较漂亮。

用Sentry来记录异常信息是个不错的选择,记录日志可能还有些问题,一旦log过多sentry本身可能就会有性能问题,但是一般异常发生的次数还是很少的(代码还可以的话),用来记录异常不用担心性能问题。 Sentry除了支持python之外,还支持js,go,php,java,ruby等很多编程语言和web框架。 Sentry本身使用django写成,好吧,又对django多了些好感,django确实出来过很多杀手级项目(sentry,pinterest,Instagram等)。

安装docker和docker-compose

使用了阿里云的ubuntu14.04服务器版本,使用docker-compose运行起来特别方便,傻瓜化

# ubuntu14.04 install docker
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates
sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
sudo echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" > /etc/apt/sources.list.d/docker.list
sudo apt-get update
sudo apt-get install docker-engine
sudo service docker start


# install docker-compose
sudo pip install docker-compose

克隆Dockerfile文件

官方给出了一个项目dockerfile,可以直接clone下来使用。请在服务器预留足够内存,否则运行docker-compose之后可能会出现PostgreSQL崩溃的情况。

1
2
3
4
5
6
7
8
9
10
11
12
git clone https://github.com/getsentry/onpremise
cd onpremise
# https://docs.sentry.io/server/installation/docker/
# 上面有使用docker安装的过程,不过docker-compose的教程目前还没merge到master,暂时看不到,不过用
# docker-compose非常方便
make build
mkdir -p data/{sentry,postgres} # Make our local database and sentry config directories.`
docker-compose run --rm web config generate-secret-key # Generate a secret key.
# Add it to `docker-compose.yml` in `base` as `SENTRY_SECRET_KEY`.(把上一步key写到docker-compose.yml里)
# 中间会提示要不要创建超级用户,选填
docker-compose run --rm web upgrade # Build the database. Use the interactive prompts to create a user account.
docker-compose up -d # - Lift all services (detached/background mode).

现在访问你的 http://your-vps-host:9000 就可以访问sentry了.界面如下
Sentry登录

在flask中使用sentry

用一个很简单的例子演示下使用方式。登录后右上角选择New Project,创建一个新项目,比如名字就叫做testflask,然后选择框架选择flask项目,之后会生成一个配置界面提示你怎么用。 首先安装依赖库pip install raven[flask] 之后写个简单的flask文件app.py:

#!/usr/bin/env python
# -*- coding:utf-8 -*-


from flask import Flask
from raven.contrib.flask import Sentry
app = Flask(__name__)

sentry = Sentry(
    app,
    dsn=''    # 在这里填上sentry给你生成的dsn
)


@app.route('/')
def hello():
    # 随意写上一些变量
    a = 1
    b = 0
    d = dict(a=1, b=2)
    l = [1, 2, 3]
    try:
        a / b
    except Exception:
        sentry.captureException()
    return 'hello'

if __name__ == '__main__':
    app.run(port=8888)

之后python app.py然后访问 http://localhost:8888首先可以看到看板里多出了一条异常记录:

看板记录

点进去以后我们可以看到该异常的具体信息, 包括调用栈信息和用户访问的浏览器信息等,对于排查代码异常还是很有帮助的。

异常具体信息

此外我们还可以在Sentry里建立组和不同的项目,对异常信息进行统计等。感兴趣的人可以在项目中尝试一下这个好用的工具。如果你们项目有类似的日志和错误收集经验,也可以留言分享下^_^