简介
Sentry是一个开源错误跟踪工具,可帮助您实时监控和修复bug。支持 Python、OC、Java、Go、Node、Django、RoR 等主流编程语言和框架,还提供了 GitHub、Slack、Trello 等常见开发工具的集成。
用户及权限管理
用户管理
Sentry以组织的形式对用户进行管理,为每个用户建立一个独立的账户,每个用户可以加入多个不同的组织(类似于)。Sentry官方对于用户根据权限的不同划分为以下5种角色:
- Owner:拥有者
- Manager:超级管理员
- Admin:普通管理员
- Member:普通用户
- Billing:访客
权限管理
不同用户的权限对应如下表格:
行动 | Billing | Member | Admin | Manager | Owner |
---|---|---|---|---|---|
可以查看/编辑结算信息和订阅详细信息 | X | X | |||
可以查看和处理问题,例如分配/解析/等。 | X | X | X | X | |
可以加入和离开团队。 | X | X | X | X | |
可以更改项目设置 | X | X | X | ||
可以添加/删除项目 | X | X | X | ||
可以编辑全局集成 | X | X | |||
可以添加/删除/更改成员 | X | X | |||
可以添加/删除团队 | X | X | |||
可以添加存储库 | X | X | |||
可以更改组织设置 | X | X | |||
可以删除组织 | X |
访问控制
- 对组织的访问由角色决定,角色的范围是整个组织。
- 对项目的访问仅限于拥有该项目的团队。但是,任何会员,管理员,经理或所有者都可以加入团队。
- 可以通过管理员或所有者的邀请来访问团队,从而控制对团队的访问。
事件及通知管理
-
事件管理:
-
通知管理:
安装
sentry官方提供了两种方式来安装sentry:docker、python。在此使用传统的python环境进行安装。
环境依赖
- 基于Unix的操作系统;
- python 2.7+
- pip 8.1+
- 基础包:
python-setuptools
、python-devel
、libxslt1-devel
、gcc
、libffi-devel
、libjpeg-devel
、libxml2-devel
、libxslt-devel
、libyaml-devel
、libpq-devel
(yum安装)
系统环境
环境 | 版本 |
---|---|
系统 | centos 7.4 |
python | 2.7.5 |
pip | 18.1 |
部署位置 | 192.168.228.129 |
新版本sentry不再支持mysql, 官方给的解释:"Due to numerous issues over the years and recent discoveries that nearly all schema migration was broken in MySQL (due to some behavior in our migration tool), we've made the decision to no longer support MySQL. It is possible to bring the schema up to date on a MySQL machine, but Sentry's automated migrations will likely not work and require DBA assistance. Postgres is now the only supported production database."
postgresql
使用yum安装postgresql
-
安装postgresql-10,rpm包
# 配置rpm源$ rpm -Uvh https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-2.noarch.rpm# 安装$ yum install -y postgresql10-server postgresql10# 初始化数据库$ /usr/pgsql-10/bin/postgresql-10-setup initdb
配置
Note: postgresql的配置文件在 /var/lib/pgsql/10/data/
。
-
编辑
/var/lib/pgsql/10/data/pg_hba.conf 82行
,允许本地连接:host all all 127.0.0.1/32 trust
-
编辑
/var/lib/pgsql/10/data/postgresql.conf
,更改监听ip:listen_addresses = '127.0.0.1'
-
启动postgresql:
$ systemctl start postgresql-10
-
检测启动状态(默认监听5432端口):
$ netstat -lntp |grep posttcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 25242/postmaster tcp6 0 0 ::1:5432 :::* LISTEN 25242/postmaster
-
更改数据库初始密码:
$ su - postgres # 切换到数据库用户(安装postgresql时默认创建)$ psql # 登录数据库# 为postgres用户设置密码postgres=# \password postgres123456# 退出数据库postgres=# \q
-
参考:
安装sentry
部署系统基础环境
# 安装基础包$ yum install -y python-setuptools python-devel libxslt1-devel gcc libffi-devel libjpeg-devel libxml2-devel libxslt-devel libyaml-devel libpq-devel
创建python虚拟环境
# 安装virtualenv$ pip install -U virtualenv$ su - chunyu# 创建虚拟环境部署位置:/home/chunyu$ virtualenv /home/chunyu/workspace/ENV_sentry/# 进入虚拟环境$ source /home/chunyu/workspace/ENV_sentry/bin/activate$ (sentry) [root@host2 sentry]# ## (sentry)标记表示进入了虚拟环境
安装sentry
在虚拟环境执行:
$ pip install -U sentry
该过程安装依赖比较多,遇到问题如下:
-
问题1:
-
报错:
gcc: error trying to exec 'cc1plus': execvp: No such file or directory
-
解决办法:系统缺少gcc-c++包,退出虚拟环境安装
$ yum install -y gcc-c++
-
-
问题2:
-
报错:
redis-py-cluster 1.3.5 has requirement redis>=2.10.6, but you'll have redis 2.10.5 which is incompatible.
-
解决办法:sentry 9.0.0依赖redis 2.10.5,redis-py-cluster 1.3.5依赖redis>=2.10.6,降级redis-py-cluster
$ pip install redis-py-cluster==1.3.4
-
检查安装结果
# 执行sentry命令,输出结果如下:$ sentryUsage: sentry [OPTIONS] COMMAND [ARGS]... Sentry is cross-platform crash reporting built with love. The configuration file is looked up in the `~/.sentry` config directory but this can be overridden with the `SENTRY_CONF` environment variable or be explicitly provided through the `--config` parameter.... ...
配置sentry
初始化配置文件
$ sentry init /home/chunyu/workspace/sentry# 从8.0版本后初始化会生成两个文件,如下,config.yml会在后续的版本强制取代sentry.conf.py$ ls /home/chunyu/workspace/sentry/ config.yml sentry.conf.py
更新sentry配置文件位置
# 为sentry指定配置文件路径$ vim /home/chunyu/workspace/ENV_sentry/lib/python2.7/site-packages/sentry/runner/settings.pyDEFAULT_SETTINGS_CONF = '/home/chunyu/workspace/sentry/config.yml'DEFAULT_SETTINGS_OVERRIDE = '/home/chunyu/workspace/sentry/sentry.conf.py'
数据库配置
# ~/.sentry/sentry.conf.pyDATABASES = { 'default': { 'ENGINE': 'sentry.db.postgres', 'NAME': 'sentry', 'USER': 'sentry', 'PASSWORD': '123456', 'HOST': '127.0.0.1', 'PORT': '5432', }}
部署Redis
$ yum install -y redis$ vim /etc/redis.confbind 127.0.0.1port 6379requirepass 123456$ systemctl start redis
sentry配置redis(缓存/缓冲)
-
sentry使用config.yml配置:
redis.clusters: default: hosts: 0: host: 127.0.0.1 port: 6379 password: "123456" db: 0
邮件配置
-
confi.yml:
mail.backend: 'smtp' # Use dummy if you want to disable email entirelymail.host: 'localhost'mail.port: 25mail.username: ''mail.password: ''mail.use-tls: falsemail.from: 'sentry@localhost'
-
禁用mail服务:
mail.backend: 'dummy'
初始化数据库
$ source /home/chunyu/workspace/ENV_sentry/bin/activite# 创建sentry数据库$ createdb -E utf-8 sentry# 初始化数据结构$ sentry upgrade# 创建数据库管理员用户$ sentry createuserchunyu# 测试:登录数据库$ psql -Uchunyu -h127.0.0.1 -p5432 -dsentry -W用户 chunyu 的口令:123psql (10.6)输入 "help" 来获取帮助信息.sentry=# (登录成功)
配置nginx反向代理
server { listen 80; server_name sentry.chunyu.club; location / { proxy_pass http://192.168.228.129:9000; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }}
参考:
加入supervisord管理
sentry运行三个进程,sentry-web、sentry-worker、sentry-cron,将其加入supervisord更便于管理:
-
安装supervisor:
(sentry_env) $ pip install supervisor
-
sentry-web:为sentry提供web管理界面
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') # 支持SSL协议SESSION_COOKIE_SECURE = TrueCSRF_COOKIE_SECURE = TrueSENTRY_WEB_HOST = '0.0.0.0'SENTRY_WEB_PORT = 9000SENTRY_WEB_OPTIONS = { 'workers': 3, # the number of web workers #'protocol': 'uwsgi', # Enable uwsgi protocol instead of http}
-
sentry-worker:sentry的后台进程;
-
sentry-cron:sentry定时任务
supervisord配置文件:
[unix_http_server]file=/home/chunyu/workspace/sentry/supervisor.sock[supervisord]logfile=/home/chunyu/workspace/sentry/logs/supervisord.log ; main log file; default $CWD/supervisord.loglogfile_maxbytes=50MB ; max main logfile bytes b4 rotation; default 50MBlogfile_backups=10 ; # of main logfile backups; 0 means none, default 10loglevel=info ; log level; default info; others: debug,warn,tracepidfile=/home/chunyu/workspace/sentry/supervisord.pid ; supervisord pidfile; default supervisord.pidnodaemon=false ; start in foreground if true; default falseminfds=1024 ; min. avail startup file descriptors; default 1024minprocs=200 ; min. avail process descriptors;default 200user=chunyu[rpcinterface:supervisor]supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface[supervisorctl]serverurl=unix:///home/chunyu/workspace/sentry/supervisor.sock ; use a unix:// URL for a unix socketautostart=trueautorestart=trueredirect_stderr=truestdout_logfile=/home/chunyu/workspace/sentry/logs/sentry.slogstdout_logfile_maxbytes=50MBstdout_logfile_backups=3[program:sentry-web]directory=/home/chunyu/workspace/sentry/environment=SENTRY_CONF="/etc/sentry"command=/home/chunyu/workspace/ENV_sentry/bin/sentry run webautostart=trueautorestart=trueredirect_stderr=truestdout_logfile=/home/chunyu/workspace/sentry/logs/sentry-web.slog[program:sentry-worker]directory=/home/chunyu/workspace/sentry/environment=SENTRY_CONF="/etc/sentry"command=/home/chunyu/workspace/ENV_sentry/bin/sentry run workerautostart=trueautorestart=trueredirect_stderr=truestdout_logfile=/home/chunyu/workspace/sentry/logs/sentry-worker.slog[program:sentry-cron]directory=/home/chunyu/workspace/sentry/environment=SENTRY_CONF="/etc/sentry"command=/home/chunyu/workspace/ENV_sentry/bin/sentry run cronautostart=trueautorestart=trueredirect_stderr=truestdout_logfile=/home/chunyu/workspace/sentry/logs/sentry-cron.slog
-
启动脚本;
#!/bin/sh/home/chunyu/workspace/ENV_sentry/bin/supervisord -c /home/chunyu/workspace/sentry/supervisord.conf
-
停止脚本:
#!/bin/sh/home/chunyu/workspace/ENV_sentry/bin/supervisorctl -c /home/chunyu/workspace/sentry/supervisord.conf shutdown
-
进程管理:
#!/bin/sh/home/chunyu/workspace/ENV_sentry/bin/supervisorctl -c /home/chunyu/workspace/sentry/supervisord.conf
空间回收
定期清理历史数据,释放存储资源。
# 每天凌晨3点,删除1周前的sentry0 3 * * * /home/chunyu/workspace/ENV_sentry/bin/sentry cleanup --days=7
参考:
参考
- 安装:
- 插件:
插件管理
LDAP集成
ldap集成依赖于第三方提供的插件,具体配置方法参考链接:
官方插件管理
插件管理:
注意: 所有的插件都是以最新版本的sentry进行的测试,不保证对旧版本的sentry完全兼容,部署插件的时候注意调研测试。
web配置示例
项目管理
- 创建项目组:
- 管理项目组:创建项目、项目组权限管理
- 进入项目组管理界面:
- 功能介绍:
- 项目管理:
- 使用(sentry客户端集成): 项目创建完成后,赋予项目负责人管理员权限,根据 文档由开发将API_Keys集成到项目中即可采集项目日志信息。
通知管理
公司项目很多,并不是每个开发人员都负责所有的项目,默认情况下是接收所有项目的通知,如果想取消某项目的通知,操作如下:
- 账户管理:
- 通知管理:
- 项目筛选:
sentry监控配置
通过mysql监控sentry
监控脚本
# sentry机器* * * * * root /usr/bin/python /root/scripts/sentry_monitor.py
通过nginx日志监控sentry
因为sentry使用nginx做的代理,所有请求都会通过nginx转发,所以可以通过nginx日志来对sentry数量进行统计,每个项目对应的API接口是唯一的,所以通过API接口进行过滤,将数据上报到Open-falcon,配置告警策略。接口对应如下:
项目名称 | API接口号 |
---|---|
medweb | 3 |
op | 24 |
事件采集脚本如下:
#!/bin/bash#sentry数量统计apis="3 24"for api in $apis;do ts=`date +%s`; t=`LC_ALL=en_US.UTF-8 date '+%d/%b/%Y:%H:%M' -d "-1 minute"` # 每分钟采集一次日志 if [ $api -eq 3 ];then project=medweb_online elif [ $api -eq 24 ];then project=op fi valus=`tail -1000000 /usr/local/nginx/logs/access.log |egrep 'sentry.chunyu.me' |egrep $t |egrep 'POST'|egrep "/api/$api/" |wc -l` curl -X POST -d "[{\"metric\": \"sentry\", \"endpoint\": \"sentry\", \"timestamp\": $ts,\"step\": 60,\"value\": $valus,\"type\":\"sentry\",\"counterType\": \"GAUGE\",\"tags\": \"project=$project\"}]" http://127.0.0.1:1988/v1/push