sentry搭建与配置邮件提醒

sentry是什么?

sentry是一个用来收集项目报错信息的系统, 支持多种编程语言, 包括web项目或者脚本项目.

搭建要求

服务器要求配置很高, 最好是4核8G内存

如何搭建

  1. 安装docker
    sudo apt-get update $ sudo apt-get install wget
    wget -qO- https://get.docker.com/ | sh
    curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://4031ebb7.m.daocloud.io
    sudo service docker restart
    
  2. 安装docker-compose
    sudo pip install -U docker-compose
    
  3. 搭建sentry
    git clone https://github.com/getsentry/onpremise.git
    cd onpremise
    mkdir -p data/{sentry,postgres}
    cp -n .env.example .env
    
  4. 退出终端 再进去 否则会报错DOCKER_HOST有问题 5.
    docker-compose build
    docker-compose run --rm web config generate-secret-key
    # 如果执行报错, 根据报错信息执行 docker volume create --name=sentry-postgres    docker volume create --name=sentry-data
    
  5. 将最后一步生成的secret-key放到vim docker-compose.yml. 注意缩进 同时配置通知电子邮件的发件人
    environment:
      SENTRY_SECRET_KEY: otw&skv58ov570sd3z5vke*kn#m4r-aqgaue*903q&r1m4unbt
      SENTRY_MEMCACHED_HOST: memcached
      SENTRY_REDIS_HOST: redis
      SENTRY_POSTGRES_HOST: postgres
      SENTRY_EMAIL_HOST: smtp
      SENTRY_SERVER_EMAIL: ' your username'
      SENTRY_EMAIL_HOST: 'smtp.partner.outlook.cn' # 发件的smtp地址
      SENTRY_EMAIL_PORT: 25
      SENTRY_EMAIL_USER: 'your username'
      SENTRY_EMAIL_PASSWORD: 'your password'
      SENTRY_EMAIL_USE_TLS: 'true'
    
  6. 配置url-prefix地址, 防止后面DSN为空. vim config.yml. 添加地址
      system.url-prefix: http://10.10.41.106:9000
    
  7. 启动
     docker-compose run --rm web upgrade
     docker-compose up -d
    

其他QA

Q: 现在每个报错和error级别的日志都会被sentry捕获, 如果想忽略某个logger怎么办?

A: 想忽略的文件可以用

 import logging
 logger = logging.getLogger("app.xxx")

通过sentry_sdk可以设置忽略什么样的logger

 from sentry_sdk.integrations.logging import ignore_logger
 ignore_logger("app.xxx")

Q: 如果项目触发某个异常, 想忽略某个特定的异常怎么办? 或者想忽略本地开发环境触发的异常?

A: 可以设置一个自定义函数来解决.

import sentry_sdk


def is_debuging():
    return len(sys.argv) == 1 and sys.argv[0].startswith('/Users/chenzhang/PycharmProjects')
  
def before_send(event, hint):
    if 'exc_info' in hint:
        exc_type, exc_value, tb = hint['exc_info']
        # 设置忽略自定义异常
        if isinstance(exc_value, Response502Exception):
            return None
        # 设置忽略本地开发环境
        if is_debuging():
            return None
    return event

sentry_sdk.init("http://35ba31f3dfde490d8c896ad688217cb9@10.10.41.106:9000/11",before_send=before_send)