池偏一 | 博客 DEDICATED OPERATION AND MAINTENANCE DEVELOPMENT.
登录
X
X
  • sentry 安装部署
  • 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无法正常启动。


  • posted @ 2019-05-14 by 池偏一 阅读(462) 评论(0)
  • 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,添加项目使用钉钉监控

    image.png

    image.png

    image.png


    如果该处dns 为控的话,说明sentry的管理地址填写错误,该处错误,访问页面时一直有弹窗让填写联系邮箱和访问url



    在需要监控的项目中写入sdk配置

    image.png

    image.png

    image.png

    image.png

    此处填上钉钉机器人的access token即可,开启钉钉机器人请自行百度


    最后在项目中自定义一段错误访问,查看顶顶报警是否成功

    image.png

    image.png 

    image.png


  • posted @ 2019-05-14 by 池偏一 阅读(2324) 评论(0)
  • sentry 项目异常测试
  • 一、JS项目测试

        1.  新建任意项目

    image.png


        2.  浏览器打开sentry测试异常发送是否成功

    image.png


    初始化sentry 项目DSN
    Sentry.init({ dsn: 'https://xxxxxxxxxxxxxx@sentry.namibox.com/29' });
    自定义引发一个异常
    Sentry.captureException(new Error("测试一下出错是否成功"));

    image.png


        3. 返回sentry 查看项目中异常捕获情况

    image.png


    二、 python 项目测试

    image.png

    image.png

    image.png

  • posted @ 2019-06-04 by 池偏一 阅读(254) 评论(0)
© 2017 池偏一 | 赣ICP备 17014207号