Sentry 是一款开源的错误耿总工具,可实时监控系统报错发出报警或修复系统崩溃。对于客户端来说经常会出现不可重现的报错,需要依赖用户给出反馈再查找问题,这显得特别被动,所以sentry在前端表现比后端表现更为明显。官方文档详见:https://docs.sentry.io/
Sentry 主要有三个进程:
worker: 异步工作服务,sentry自带内置队列,以异步的方式处理任务,当事件进入不会立马写入数据库,它先将任务传输到redis(如果负载量很高比较适合使用sentry 支持的rabbitmq),这时候系统服务从队列中取出事件进行处理,展示。
cron: 附属于异步服务的定时任务。
sentry: 启动sentry的django项目,里面包含web 和sentry的系统配置等(该项目可指定自定义数据库,但经测试指定mysql会有意想不到的字段错误)
一 、sentry 安装部署:
1. 拉取镜像文件
docker pull sentry docker pull redis docker pull postgres
2. 启动redis和postgres
docker run -d --name sentry-redis redis docker run -d --name sentry-postgres \ -e POSTGRES_PASSWORD=sentry \ -e POSTGRES_USER=sentry postgres
3. 生成认证key
docker run --rm sentry config generate-secret-key
4. 初始化数据库和缓存(交互式输入用户名用于系统登录)
采用--link 将数据库以别名的方式打通不同的container通信。因为sentry中默认使用的postgres 数据库连接地址就是postgres ,redis 数据库地址就是redis://redis:6379,所以在生成数据表之前仍然使用--link方式,后续启动可以自定义网络或者用docker service_name 连接。
docker run -it --rm -e SENTRY_SECRET_KEY='<自己生成的认证key>' \ --link sentry-postgres:postgres \ --link sentry-redis:redis sentry upgrade
到此sentry数据库的初始化工作已经完成,如果希望启动sentry,有以下两种方式,一种使用命令行方式启动,另一种使用docker-compose文件启动
二、启动sentry服务
2.1 命令行方式:
#启动sentry 主服务
docker run -d -p 9000:9000 --name sentry -e SENTRY_SECRET_KEY='<自己生成的认证key>' \ --link sentry-redis:redis \ --link sentry-postgres:postgres sentry
#启动sentry worker服务
docker run -d --name sentry-worker -e SENTRY_SECRET_KEY='<自己生成的认证key>' \ --link sentry-redis:redis \ --link sentry-postgres:postgres sentry run worker
#启动sentry cron
docker run -d --name sentry-worker -e SENTRY_SECRET_KEY='<自己生成的认证key>' \ --link sentry-redis:redis \ --link sentry-postgres:postgres sentry run cron
2.2 不暴露端口,采用traefik代理方式启动
# 编写compose 文件
vim ./traefik-sentry.yml
version: '3' services: redis: image: redis:latest container_name: sentry-redis restart: always deploy: mode: replicated replicas: 1 placement: constraints: [node.role == manager] networks: - traefik-net # 用mysql连接有点问题,还是保留源码默认数据库postgres postgres: image: postgres:latest container_name: sentry-postgres restart: always environment: - POSTGRES_USER=sentry - POSTGRES_PASSWORD=sentry - POSTGRES_DBNAME=sentry - POSTGRES_DBUSER=sentry - POSTGRES_DBPASS=secret volumes: - postgres_data:/var/lib/postgresql/data deploy: mode: replicated replicas: 1 placement: constraints: [node.role == manager] networks: - traefik-net sentry: image: sentry:latest container_name: sentry links: - redis - postgres # ports: # - 9000:9000 environment: SENTRY_SECRET_KEY: '<自己生成的认证key>' SENTRY_POSTGRES_HOST: postgres SENTRY_DB_USER: sentry SENTRY_DB_PASSWORD: sentry SENTRY_REDIS_HOST: redis SENTRY_REDIS_PASSWORD: redispass deploy: labels: - "traefik.enable=true" - "traefik.frontend.rule=Host:sentry.namibox.com" - "traefik.port=9000" mode: replicated replicas: 1 placement: constraints: [node.role == manager] networks: - traefik-net cron: image: sentry:latest container_name: sentry-cron links: - redis - postgres command: "sentry run cron" environment: SENTRY_SECRET_KEY: '<自己生成的认证key>' SENTRY_POSTGRES_HOST: postgres SENTRY_DB_USER: sentry SENTRY_DB_PASSWORD: sentry SENTRY_REDIS_HOST: redis SENTRY_REDIS_PASSWORD: redispass deploy: mode: replicated replicas: 1 placement: constraints: [node.role == manager] networks: - traefik-net worker: image: sentry:latest container_name: sentry-worker links: - redis - postgres command: "sentry run worker" environment: SENTRY_SECRET_KEY: '<自己生成的认证key>' SENTRY_POSTGRES_HOST: postgres SENTRY_DB_USER: sentry SENTRY_DB_PASSWORD: sentry SENTRY_REDIS_HOST: redis SENTRY_REDIS_PASSWORD: redispass deploy: mode: replicated replicas: 1 placement: constraints: [node.role == manager] networks: - traefik-net networks: traefik-net: driver: overlay external: true volumes: postgres_data: external: true
docker stack deploy -c ./traefik-sentry.yml sentry # 使用stack方式启动sentry docker exec -it <sentry_container_id> sentry upgrade # 初始化数据库,该compose文件直接在新环境使用可能会存在问题,是因为第一次部署时, #sentry数据库没有初始化,所以sentry无法正常启动。
一. 进入sentry container 中下载sentry 的钉钉插件
docker exec -it `docker ps |grep sentry_sentry | awk '{print $1}'` /bin/bash git clone https://github.com/anshengme/sentry-dingding.git pip install sentry-dingding
二. 由于container 安装好钉钉插件后需要重启服务才能识别,但重启container 刚装好的插件不会保存到image中,所以需要将安装好插件的正在运行的container commit成image文件,下一次直接从该image 启动服务即可。
docker commit `docker ps |grep sentry_sentry | awk '{print $1}'` sentry-dingding:latest
三. 修改compose文件,将源image 改成带有钉钉插件的image
vim ./traefik-sentry.yml
version: '3' services: redis: image: redis:latest container_name: sentry-redis restart: always deploy: mode: replicated replicas: 1 placement: constraints: [node.role == manager] networks: - traefik-net # 用mysql连接有点问题,还是保留源码默认数据库postgres postgres: image: postgres:latest container_name: sentry-postgres restart: always environment: - POSTGRES_USER=sentry - POSTGRES_PASSWORD=sentry - POSTGRES_DBNAME=sentry - POSTGRES_DBUSER=sentry - POSTGRES_DBPASS=secret volumes: - postgres_data:/var/lib/postgresql/data deploy: mode: replicated replicas: 1 placement: constraints: [node.role == manager] networks: - traefik-net sentry: image: sentry-dingding:latest container_name: sentry links: - redis - postgres # ports: # - 9000:9000 environment: SENTRY_SECRET_KEY: '<自己生成的认证key>' SENTRY_POSTGRES_HOST: postgres SENTRY_DB_USER: sentry SENTRY_DB_PASSWORD: sentry SENTRY_REDIS_HOST: redis SENTRY_REDIS_PASSWORD: redispass deploy: labels: - "traefik.enable=true" - "traefik.frontend.rule=Host:sentry.namibox.com" - "traefik.port=9000" mode: replicated replicas: 1 placement: constraints: [node.role == manager] networks: - traefik-net cron: image: sentry-dingding:latest container_name: sentry-cron links: - redis - postgres command: "sentry run cron" environment: SENTRY_SECRET_KEY: '<自己生成的认证key>' SENTRY_POSTGRES_HOST: postgres SENTRY_DB_USER: sentry SENTRY_DB_PASSWORD: sentry SENTRY_REDIS_HOST: redis SENTRY_REDIS_PASSWORD: redispass deploy: mode: replicated replicas: 1 placement: constraints: [node.role == manager] networks: - traefik-net worker: image: sentry-dingding:latest container_name: sentry-worker links: - redis - postgres command: "sentry run worker" environment: SENTRY_SECRET_KEY: '<自己生成的认证key>' SENTRY_POSTGRES_HOST: postgres SENTRY_DB_USER: sentry SENTRY_DB_PASSWORD: sentry SENTRY_REDIS_HOST: redis SENTRY_REDIS_PASSWORD: redispass deploy: mode: replicated replicas: 1 placement: constraints: [node.role == manager] networks: - traefik-net networks: traefik-net: driver: overlay external: true volumes: postgres_data: external: true
4. 启动stack 运行修改后的容器
docker stack deploy -c ./traefik-sentry.yml sentry
5. 打开web页面访问sentry,添加项目使用钉钉监控
如果该处dns 为控的话,说明sentry的管理地址填写错误,该处错误,访问页面时一直有弹窗让填写联系邮箱和访问url
在需要监控的项目中写入sdk配置
此处填上钉钉机器人的access token即可,开启钉钉机器人请自行百度
最后在项目中自定义一段错误访问,查看顶顶报警是否成功
一、JS项目测试
1. 新建任意项目
2. 浏览器打开sentry测试异常发送是否成功
初始化sentry 项目DSN Sentry.init({ dsn: 'https://xxxxxxxxxxxxxx@sentry.namibox.com/29' }); 自定义引发一个异常 Sentry.captureException(new Error("测试一下出错是否成功"));
3. 返回sentry 查看项目中异常捕获情况
二、 python 项目测试