python方式部署sentry
1.sentry介绍
Sentry是一个开源的实时错误收集报告工具,支持web前后端、移动应用以及游戏等,支持Python、JavaScript、Java、Go、Nodejs、Django、PHP等主流编程语言和框架平台,还提供了对GitHub、Gitlab等常见开发工具的集成及Mail邮件通知(收集到的错误告警),除此之外我们还可以自主开发插件以满足项目需求。
2.部署方式
- 部署方式分俩种:docker方式和python方式。
- docker方式部署操作比较简单,也是【Sentry官方】比较推崇的方式,直接按【Sentry On-Premise】提供的方式按部就班部署就好了。或者可直接参考【Docker部署Sentry监控Django应用并使用email+钉钉通知】即可。
- 插入一句题外话,最初我也是使用docker方式部署在机器上的也成功部署和配置好了,当时考虑到使用docker部署的不可控风险等系列问题,加之项目工作需要转而改用python虚拟环境部署。
- python方式部署相对比较麻烦但还是比较稳妥,可参考:【sentry官方提供的python安装方式】。下面我就以我后来使用的python方式部署sentry的过程做个详细介绍供他人借鉴。
3.python方式部署sentry具体过程
1.本文使用python虚拟环境的说明:如果我们要同时开发多个应用程序,每个应用可能需要各自拥有一套“独立”的python运行环境,我们可以使用virtualenv来解决这个问题,它可以为一个应用创建一套“隔离”的python运行环境以免相互影响干扰。
2.本文介绍具体过程的前提:
- 涉及的环境工具:
- Linux服务器(虚拟机安装一个即可。例如本人使用服务器:10.80.80.238)
- python虚拟环境
- Postgresql或者MySQL(本文使用MySQL)
- Redis
- 邮箱账号密码(用于配置邮件通知,如果需要配置邮件通知的话,就需要,否则不需要。本文是会进行配置的。)
- 钉钉群机器人的webhook(用于配置钉钉通知)。具体如何获取配置钉钉群机器人的webhook:参考【获取自定义机器人webhook】
- 说明:需保持本地网络通畅连接Internet。
3.具体安装配置步骤:
- 1)安装常用开发工具:
$yum -y groupinstall "Development Tools"
- 2)安装redis,可参考:【Redis的安装和部署】和【在CentOS 7下安装Redis】。或者参考以下:
$yum -y install tcl
$wget http://download.redis.io/releases/redis-3.2.5.tar.gz
$tar -zxvf redis-3.2.5.tar.gz
$cd redis-3.2.5/src/
$make test
$ls /usr/local/bin/ ##结果:redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server
$vim /etc/profile
添加内容:
##HISTSIZE
HISTSIZE=100000 #修改默认保存1000条history历史命令为100000条。
##redis
export PATH=$PATH:/usr/local/bin
$source /etc/profile
$redis-server & #后台运行redis服务
- 3)安装一套python虚拟环境:
$pip install -U virtualenv #安装一套python虚拟环境
$pip install virtualenvwrapper #方便后续用来建立一个虚拟环境安装的存储目录
$mkdir -p /www #/www:虚拟环境存储目录
$vim /etc/profile
添加内容:
##配置python虚拟环境存储目录等
#if [ `id -u` != '0' ]; then
#若id -u为0表示是root用户
export VIRTUALENV_USE_DISTRIBUTE=1 # <-- Always use pip/distribute
export WORKON_HOME=/www # <-- Where all virtualenvs will be stored
source /usr/bin/virtualenvwrapper.sh
export PIP_VIRTUALENV_BASE=$WORKON_HOME
export PIP_RESPECT_VIRTUALENV=true
#fi
$source /etc/profile
$#vim /usr/bin/virtualenvwrapper.sh查看发现:(1)mkvirtualenv envDirName 创建虚拟环境(虚拟环境目录为envDirName)(1)workon 列举虚拟环境(2)workon envDirName 激活envDirName虚拟环境
$#/usr/bin/virtualenvwrapper.sh具体内容可参考:https://bitbucket.org/dhellmann/virtualenvwrapper/src/67108f0e2abdda349cb22997612b3e22a9178ab3/virtualenvwrapper.sh?at=master&fileviewer=file-view-default
$#事实上virtualenvwrapper是对virtualenv的一次封装
$virtualenv /www/sentry/ #/www/sentry:python虚拟环境工作空间(用于安装sentry),即创建sentry虚拟环境
$source /www/sentry/bin/activate #激活进入sentry虚拟环境
$deactivate #退出当前运行的虚拟环境。
$workon #列举所有虚拟环境
$workon sentry #激活进入sentry虚拟环境,相当于source /www/sentry/bin/activate
$deactivate #退出当前运行的虚拟环境。
- 4)安装sentry:
$workon sentry #安装sentry前,得进入sentry虚拟环境
$yum -y install python-devel
$pip install -U sentry #sentry源码位于:/www/sentry/lib/python2.7/site-packages/sentry/
$#sentry官方源码位于:https://github.com/getsentry/sentry/tree/master/src/sentry
$sentry help #查看sentry可用命令的使用帮助
$mkdir -p /www/sentry/etc/sentry/ #sentry初始化配置文件的存放目录
$#/www/sentry/etc/sentry下:#里面有【config.yml、sentry.conf.py】俩个配置文件,依据官方文档看,config.yml以后会慢慢替代sentry.conf.py的,看来咧是以config.yml为主的,只是目前sentry.conf.py的有些配置还不能被config.yml所替代。
- 5)安装MySQL,请自行安装。或者可参考以下:
- 6)编辑【config.yml】、【sentry.conf.py】俩配置文件以配置sentry:
$yum -y install mysql-devel #【django.db.backends.mysql】需要的依赖
$pip install mysql-python #mysql-python :mysql的C语言的驱动
$vim /www/sentry/etc/sentry/sentry.conf.py
编辑:
# ~/.sentry/sentry.conf.py
# for more information on DATABASES, see the Django configuration at:
# https://docs.djangoproject.com/en/stable/ref/databases/
# This documentation refers to a newer Django version than what
# Sentry uses, so there may be some discrepancies.
#数据库的配置
#DATABASES = {
# 'default': {
# 'ENGINE': 'sentry.db.postgres', #使用postgres数据库 #如果用MySQL,则:'ENGINE': 'django.db.backends.mysql',
# #坑:#mysql的坑:【sentry默认使用 PostgreSQL。我用的是 mysql。运行 sentry upgrade的时候,发现运行到db migration的时候抛了异常,查阅发现我这里MySQL存储引擎使用的是MyISAM,不支持transaction事务操作导致的。这里需要注意下,我将存储引擎改为InnoDB后,执行migration的时候错误消失。】
# 'NAME': 'sentry', #数据库名
# 'USER': 'postgres',#用户名
# 'PASSWORD': 'xxx',#密码
# 'HOST': 'xxx',#主机
# 'PORT': 'xxx',#连接端口
# }
#}
DATABASES = {
'default': {
# 'ENGINE': 'sentry.db.postgres',
# 'NAME': 'xxx',
# 'USER': 'xxx',
# 'PASSWORD': 'xxx',
# 'HOST': 'xxx',
# 'PORT': 'xxx',
# 'AUTOCOMMIT': True,
# 'ATOMIC_REQUESTS': False,
#更换为MySQL
#xxx数据库
#'NAME': 'xxx',
#xxx数据库
'ENGINE': 'django.db.backends.mysql',
'NAME': 'xxx',
'USER': 'xxx',
'PASSWORD': 'xxx',
'HOST': '127.0.0.1',
'PORT': '3306',
'AUTOCOMMIT': True,
'ATOMIC_REQUESTS': False,
#CONN_MAX_AGE设置成小于【MySQL配置变量wait_timeout】的数值。这里设置成3600秒。
#最大连接时长,避免sentry连接MySQL超时使得连接断开出现(ERROR : (2006, 'MySQL server has gone away') )
'CONN_MAX_AGE': 3600
#'CONN_MAX_AGE': 3600
}
}
#redis配置
redis.clusters:
default:
hosts:
0:
host: 127.0.0.1
port: 6379
# password: "my-secret-password"
$vim /www/sentry/etc/config.yml
编辑:
mail.backend: 'dummy' #dummy:表示禁用邮件。#如果使用SSL邮件,则mail.backend: 'django_smtp_ssl.SSLEmailBackend'
#mail.backend: 'dummy' #dummy:表示禁用邮件。
#如果使用SSL邮件,则mail.backend: 'django_smtp_ssl.SSLEmailBackend'
#前提需要安装django-smtp-ssl插件。即在sentry虚拟环境中的操作步骤:pip install django-smtp-ssl
mail.host: 'smtp.xxx.com' # 企业邮箱SMTP服务器
mail.port: 465
mail.username: 'xxx@xxx.com' #发件人邮箱地址
mail.password: 'xxx' #邮箱授权码
mail.use-tls: false #需设为 false
mail.from: 'xxx@xxx.com' #mail.from 必须与 mail.username 一致,可能受服务商影响
- 7)可选步骤(创建sentry数据库):
$createdb -E utf-8 sentry
$##If you kept the database ``NAME`` as ``sentry``:也就是说要创建的数据库库名是sentry 。
$#如果在sentry俩配置文件中已经配置好了数据库连接的,就不用再创建数据库了。
$#Once done, you can create the initial schema using the upgrade command:创建初始化数据库模式
$SENTRY_CONF=/etc/sentry sentry upgrade
- 8)创建超级管理员:
$#/www/sentry/etc/sentry:config.yml、sentry.conf.py所在目录
$SENTRY_CONF=/www/sentry/etc/sentry sentry createuser #新创建一个sentry应用用户。主要用来创建超级管理员。当中提示输入是否创建超级管理员、超级管理员邮箱(其实当作超级管理员用户名)、超级管理员密码
$pip install redis==2.10.3 #安装redis
$pip install redis-py-cluster==1.3.4 #安装redis-py-cluster操作redis集群。指定版本以便后续安装【sentry-dingding钉钉通知插件】
- 9)启动服务:
(sentry) [xxx@xxx ~]$ sentry run
Usage: sentry run [OPTIONS] COMMAND [ARGS]...
Run a service.
Options:
--help Show this message and exit.
Commands:
cron Run periodic task dispatcher.
smtp Run inbound email service.
web Run web service.
worker Run background worker instance.
$SENTRY_CONF=/etc/sentry sentry run web #启动sentry网页服务 #默认端口:9000
$SENTRY_CONF=/etc/sentry sentry run worker #启动sentry的处理后台逻辑的worker进程
$##坑:【页面打开后,提示 worker 没有正常运行。发现没有启动 worker。我们手动启动下 worker,启动时,需要在系统中将 C_FORCE_ROOT 设置为 true。详细点击:https://stackoverflow.com/questions/20346851/running-celery-as-root】
$SENTRY_CONF=/etc/sentry sentry run cron #启动sentry的cron定时任务
$#【访问sentry web网页界面】:ip+port,例如我的是http://10.80.80.238:9000/
- 10)可使用【Supervisor】工具来简化管理sentry的所有服务跟进程(配置supervisord服务;这里相当于把sentry当作一个服务来管理)。可参考:
1.http://supervisord.org/installing.html#installing-to-a-system-with-internet-access
2.http://supervisord.org/running.html#running
3.
4.https://stackoverflow.com/questions/18859063/supervisor-socket-error-issue
5.https://www.jianshu.com/p/c28f3914fa2d
6.https://www.jianshu.com/p/5c3922fa97c0
配置示例比如:
[program:sentry-web]
directory=/www/sentry/
environment=SENTRY_CONF="/www/sentry/etc/sentry"
command=/www/sentry/bin/sentry run web
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=syslog
stderr_logfile=syslog
[program:sentry-worker]
directory=/www/sentry/
environment=SENTRY_CONF="/www/sentry/etc/sentry"
command=/www/sentry/bin/sentry run worker
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=syslog
stderr_logfile=syslog
[program:sentry-cron]
directory=/www/sentry/
environment=SENTRY_CONF="/www/sentry/etc/sentry"
command=/www/sentry/bin/sentry run cron
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=syslog
stderr_logfile=syslog
- 11)定时清理数据:
$crontab -e
内容(每隔30天定期清理旧数据):
0 3 * * * sentry cleanup --days=30
- 12)配置钉钉通知:
$pip install sentry-dingding #在python虚拟环境中执行
$#源码位于:/www/sentry/lib/python2.7/site-packages/sentry_dingding
$#GitHub源码:https://github.com/anshengme/sentry-dingding
$vim /www/sentry/etc/sentry/sentry.conf.py #对它末尾添加上内容:
###新添加的配置:添加刚安装的钉钉通知插件
#INSTALLED_APPS += ('sentry_dingding','sentry_plugins','sentry_dingtalk')
INSTALLED_APPS += ("sentry_dingding",)
- 重启sentry应用。
- 前往sentry web界面的项目集成插件处开启钉钉插件并配置上access_token然后就可以通过钉钉发送通知啦。
- 1.登录:
- 2.配置钉钉Access_Token:
进入web页面: http://10.80.80.238:9000/settings/sentry/internal/plugins/DingDing/
例如,我的钉钉机器人webhook:https://oapi.dingtalk.com/robot/send?access_token=22bbd4213988cc0babe71a725919a35176b6086745efd4cf5109ff4d108d4f68,当需要配置填写Access_Token时就只需填写22bbd4213988cc0babe71a725919a35176b6086745efd4cf5109ff4d108d4f68而不是整个url(自己踩坑发现的?)
- 1
钉钉通知效果
- 13)手动配置启动脚本和日志输出。
$mkdir -p /www/sentry/logs #存放sentry日志
$mkdir -p /www/sentry/myShellDir #存放sentry启动脚本
$vim /www/sentry/myShellDir/startSentry.sh #内容示例如下:
#!/bin/bash
#功能:启动python虚拟环境并启动运行sentry.
if [ ! -d /www/sentry/etc/sentry/ -o ! -d /www/sentry/logs/ ];then
echo "!!!【目录:/www/sentry/etc/sentry/或者/www/sentry/logs/没有,请先创建好再来】!!!"
exit 10
fi
source /etc/profile
workon sentry
#初始化配置文件
#sentry init /www/sentry/etc/sentry/
#运行web服务,输出日志
SENTRY_CONF=/www/sentry/etc/sentry/ sentry run web &>/www/sentry/logs/`date '+%Y-%m-%d_%H-%M-%S'`.web.log &
#运行后台异步实例任务,输出日志
SENTRY_CONF=/www/sentry/etc/sentry/ sentry run worker &>/www/sentry/logs/`date '+%Y-%m-%d_%H-%M-%S'`.worker.log &
#运行定时任务,输出日志
SENTRY_CONF=/www/sentry/etc/sentry/ sentry run cron &>/www/sentry/logs/`date '+%Y-%m-%d_%H-%M-%S'`.cron.log &
#SENTRY_CONF=/www/sentry/etc/sentry sentry run worker &
#SENTRY_CONF=/www/sentry/etc/sentry sentry run cron &
#SENTRY_CONF=/www/sentry/etc/sentry sentry run web &
$ls /www/sentry/logs/ #会有如下示例日志:
2019-01-09_14-45-34.cron.log
2019-01-09_14-45-34.web.log
2019-01-09_14-45-34.worker.log
- 13)sentry项目运行过程中涉及进程如下(8个):
[dev@xxx /www/sentry/logs]$ ps -ef|grep Sentry
dev 90479 1 0 14:45 pts/2 00:00:04 [Sentry] uWSGI master #启动web界面服务的主进程
dev 90513 90479 0 14:45 pts/2 00:00:04 [Sentry] uWSGI worker 1 #启动web界面服务的子进程
dev 90514 90479 0 14:45 pts/2 00:00:04 [Sentry] uWSGI worker 2 #启动web界面服务的子进程
dev 90515 90479 0 14:45 pts/2 00:00:04 [Sentry] uWSGI worker 3 #启动web界面服务的子进程
[dev@xxx /www/sentry/logs]$ ps -ef|grep Worker
dev 90548 90480 0 14:45 pts/2 00:00:03 [celeryd: celery@xxx:Worker-1] #处理sentry后台逻辑的worker子进程
dev 90549 90480 0 14:45 pts/2 00:00:06 [celeryd: celery@xxx:Worker-2] #处理sentry后台逻辑的worker子进程
[dev@xxx /www/sentry/logs]$ ps -ef|grep MainProcess
dev 90480 1 0 14:45 pts/2 00:00:05 [celeryd: celery@xxx:MainProcess] -active- #处理sentry后台逻辑的worker主进程
[dev@xxx /www/sentry/logs]$ ps -ef|grep cron
dev 90481 1 0 14:45 pts/2 00:00:08 [celery beat] run cron #sentry的定时任务进程
4.补充:
1.sentry官方:
- 【getsentry/sentry:python方式安装的官方源码】
- Installation with Python【sentry官方文档】
- 【getsentry/onpremise:docker方式安装的官方源码】
- Installation with Docker【sentry官方文档】
2.postgresql相关:
- 【PostgreSQL官方网站】
- 【PostgreSQL官方手册】
- PostgreSQL:psql工具的使用【psql】
- postgresql的导入导出数据库表及结构【pg_dump和psql】
- postgresql数据库的数据导出【pg_dump和pg_restore】
- 【PostgreSQL 9.3.1 中文手册】
- postgresql中文社区
- postgresql中文社区【文档手册】
- CentOS7下初始化PostgreSQL
- PostgreSQL安装与配置介绍
- 备份基于Docker的PostgreSQL数据库
3.sentry安装配置相关:
- Docker部署Sentry监控Django应用并使用email+钉钉通知【docker方式-推荐使用】
- linux下【docker+sentry】安装配置
- Sentry的安装搭建与使用【python方式】
- 利用sentry收集django的日志【python方式】
- Python 实时日志平台Sentry【python方式】
- 在生产环境部署sentry进行错误收集和提醒【python方式】
- jqlblue/sentry.conf.py【sentry.conf.py配置示例】
- sentry安装手册【python方式-详细】
- 运维开发实践——基于Sentry搭建错误日志监控系统【介绍sentry】
- 搭建sentry(一个分布式日志聚合系统)【python方式】
- Background workers haven’t checked in recently. This is likely an issue with your configuration o…【sentry进程问题】
- Node.js集成Sentry【配置客户端】
4.redis相关:
- 在CentOS 7下安装Redis
- Redis的安装和部署
5.supervisor相关:
- Supervisor: A Process Control System【Supervisor官方手册】
- 【supervisor 从安装到使用】
6.MySQL相关:
- django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named MySQLdb【sudo pip install mysql-python解决】
- centos7 安装mysql–python模块出现EnvironmentError: mysql_config not found和error: command ‘gcc’ failed with exit status 1【yum -y install mysql-devel解决】
- 【MySQL server has gone away 问题的解决方法】
- OperationalError: (2006, ‘MySQL server has gone away’)
- 【问题解决】【Python】解决 django 中 mysql gone away 的问题
- #2006 - MySQL server has gone away 问题解决方法
7.sentry的钉钉插件:
- Sentry-DingDing钉钉插件【anshengme/sentry-dingding:推荐使用】
8.Linux防火墙相关:
- 【CentOS7使用firewalld打开关闭防火墙与端口】
- CentOS7开启端口(永久)
9.xampp相关:
- 在Centos 7 上搭建XAMPP环境【安装xampp】
10.django相关:
- django/django【GitHub-django源码-数据库连接】
11.Linux命令相关:
- linux查找文件夹命令:find
- Linux 技巧:让进程在后台可靠运行的几种方法【nohup、setsid、&】
12.python相关:
- 我们的Web开发与部署 – 一名python党
13.svn文档:
- svn中文参考手册【服务端+客户端】
14.docker相关:
- docker/docker-ce【GitHub:docker-ce源码】
- Docker — 从入门到实践【语雀】
15.钉钉相关:
- 获取自定义机器人webhook【钉钉开发平台示例文档】