ANSHENG'S BLOG
Docker部署Sentry监控Django应用并使用email+钉钉通知
# django# docker# sentrypublishDate · 2018-12-16 / lastEditedTime · 2022-04-06 04:50:00

Sentry是一个开源的程序异常跟踪系统,基本上主流的语言,Sentry都支持,Sentry是用Django+DRF+Celery+Celery-Beat开发的,如果你是Pythoner,并且对这些技术栈都相当熟悉,你可以阅读一下相关的源码,定有不少的收获,这里值得一提的是Sentry在部署的时候只支持Python2,不支持Python3

这篇文章我们将会以Docker的方式部署Sentry,这也是官方推荐的部署方式,并且我们会写一个简单的Django应用,使用email+钉钉的方式进行通知,一旦出现异常,开发人员可以及时收到并处理。

环境

我在vultr上开了一台云服务器供这次测试使用,用的是CentOS7的系统。

初始化操作

安装epel源

$ yum install epel-release -y

更新系统

$ yum update -y

安装一些工具包

$ yum install python-pip vim git -y

建议重启下系统

$ reboot

基本配置

  • 内存
$ free -h total used free shared buff/cache available Mem: 3.7G 95M 3.4G 8.4M 168M 3.4G Swap: 0B 0B 0B
  • CPU
$ cat /proc/cpuinfo | grep processor | wc -l 2

配置也就是2H4G,如果你是1G内存的服务器,貌似我在腾讯云上面跑起来比较艰难,感觉至少还是要2G把。

安装Docker

CentOS系列的安装文档放在:https://docs.docker.com/install/linux/docker-ce/centos/ ,感兴趣的就可以去阅读,我这里就简化一些操作。

  • 安装一些软件包
$ yum install -y yum-utils device-mapper-persistent-data lvm2
  • 添加docker的repo源
$ yum-config-manager --add-repo <https://download.docker.com/linux/centos/docker-ce.repo>
  • 安装docker
$ yum install docker-ce -y
  • 启动docker
$ systemctl start docker
  • 开机自启动
$ systemctl enable docker
  • 查看docker版本
$ docker --version Docker version 18.03.1-ce, build 9ee9f40
  • 运行一个hello-world
$ docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 9db2ca6ccae0: Pull complete Digest: sha256:4b8ff392a12ed9ea17784bd3c9a8b1fa3299cac44aca35a85c90c5e3c7afacdc Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: <https://hub.docker.com/> For more examples and ideas, visit: <https://docs.docker.com/engine/userguide/>

如果你运行之后出现的结果和我一样,那么,OK,docker已经安装完成了.

如果你使用的是国内的服务器,可能在pull镜像的时候,异常的慢,所以官方就提供了国内的docker镜像加速,点我点我,配置好之后一定要记得重启下docker的服务,不然无法加载配置,重启命令如下:

$ systemctl restart docker

安装docker-compose

$ curl -L <https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname> -s`-`uname -m` -o /usr/local/bin/docker-compose $ chmod +x /usr/local/bin/docker-compose

我装的是1.21.2版本,通常你安装的dockerdocker-compose是最新的版本都不会有什么问题,查看一下docker-compose版本

$ docker-compose --version docker-compose version 1.21.2, build a133471

安装Sentry

终于到了关键的步骤,Sentry,官方提供了一整套docker的部署方式来运行Sentry

  • 下载项目
$ cd /opt/ $ git clone <https://github.com/getsentry/onpremise.git> sentry $ cd sentry
  • 创建数据库相关
$ docker volume create --name=sentry-data && docker volume create --name=sentry-postgres
  • cp配置文件
$ cp -n .env.example .env
  • 添加一些依赖库
$ vim requirements.txt # Add plugins here sentry-dingding~=0.0.2 # 钉钉通知插件 django-smtp-ssl~=1.0 # 发邮件支持SSL协议 redis-py-cluster==1.3.4
  • 构建Docker镜像
$ docker-compose build
  • 生成密钥
$ docker-compose run --rm web config generate-secret-key ...... # 最后一行会输出类似如下的秘钥串 kbjodp(id&b0^kbnxijn11&2e6xu&vy1(oini!-zl)pl610n&v

把上面的秘钥添加到.env文件的SENTRY_SECRET_KEY环境变量中

$ vim .env # Run `docker-compose run web config generate-secret-key` # to get the SENTRY_SECRET_KEY value. SENTRY_SECRET_KEY='kbjodp(id&b0^kbnxijn11&2e6xu&vy1(oini!-zl)pl610n&v'
  • 生成数据库表并创建管理员用户
$ docker-compose run --rm web upgrade ...... Would you like to create a user account now? [Y/n]: y # 创建用户 Email: ianshengme@gmail.com # 邮箱 Password: # 密码 Repeat for confirmation: # 确认密码 Should this user be a superuser? [y/N]: y # 为超级管理员用户
  • 启动服务
$ docker-compose up -d

可以通过docker-compose ps查看一下启动了那些容器

$ docker-compose ps Name Command State Ports ------------------------------------------------------------------------------------ sentry_cron_1 /entrypoint.sh run cron Up 9000/tcp sentry_memcached_1 docker-entrypoint.sh memcached Up 11211/tcp sentry_postgres_1 docker-entrypoint.sh postgres Up 5432/tcp sentry_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp sentry_smtp_1 docker-entrypoint.sh tini ... Up 25/tcp sentry_web_1 /entrypoint.sh run web Up 0.0.0.0:9000->9000/tcp sentry_worker_1 /entrypoint.sh run worker Up 9000/tcp

上面的几个服务,介绍如下:

服务启动之后,默认会监听9000端口,如果你想更改,可以在docker-compose.yml中进行更改。

我将我的域名ansheng.me添加了一条A记录,记录值是sentry,指向这台sentry的云服务器,所以可以通过sentry.ansheng.me进行访问。

Sentry的基本设置

浏览器打开http://sentry.ansheng.me:9000/,输入邮箱和密码进行登录

登录成功之后,输入对应的Root URLAdmin Email,然后点击Continue

点击之后就进入了Sentry的主界面

添加一个Python项目

点击右上角的Add new,选择Project

然后创建项目

项目创建完成之后,会出现一个使用的界面

测试Python程序

按照上面的步骤 ,我们来一步一步的操作,我在我这台服务器上面操作,Python版本如下:

$ python -V Python 2.7.5
  • 安装raven
$ pip install raven --upgrade
  • 添加测试代码
$ vim sentry_python_test.py from raven import Client client = Client('<http://ce5502f746a4484f9b2c391a54d2d1c4:bca94f6b330a4dd183e68243b2a1b99c@sentry.ansheng.me:9000/2>') try: 1 / 0 except ZeroDivisionError: client.captureException()
  • 运行
$ python sentry_python_test.py Sentry is attempting to send 1 pending error messages Waiting up to 10 seconds Press Ctrl-C to quit

查看异常

在上面的使用界面中,点击Got it~ Take me to the Issue Stream.进入到项目的Issue页面,也就是错误页面

可以看到已经有一条异常了,这个异常就是我们刚测时捕获的报错,点击ZeroDivisionError大标题,进入异常的详细页面。

在项目页面中我们可以看到MESSAGEEXCEPTION这两块,输出了具体的错误详情

基本上的步骤就像上面一样,流程都差不多

添加Django项目并进行监控

根据上面创建PythonSentry项目的步骤添加一个名为blog,是Django框架的项目,并把DSN的记录值保存下来