跳转至

Sentry的平替!GlitchTip部署过程及使用感受

最近FastAPI项目想上一个错误追踪,Sentry非常好,但是翻不过巨大的墙。找了一圈发现了GlitchTip,他完全兼容Sentry的SDK,并且开源、可自托管、集成uptime监控与接口响应时间统计,非常好,就他了!

logo

部署过程

GlitchTip首推Docker Compose安装,让我们来看看官网例子:docker-compose.sample.yml

YAML
# Uncomment version if using an older version of docker compose
# version: "3.8"
x-environment:
  &default-environment
  DATABASE_URL: postgres://postgres:postgres@postgres:5432/postgres
  SECRET_KEY: change_me_to_something_random # best to run openssl rand -hex 32
  PORT: 8000
  EMAIL_URL: consolemail:// # Example smtp://email:password@smtp_url:port https://glitchtip.com/documentation/install#configuration
  GLITCHTIP_DOMAIN: https://app.glitchtip.com # Change this to your domain
  DEFAULT_FROM_EMAIL: email@glitchtip.com # Change this to your email
  CELERY_WORKER_AUTOSCALE: "1,3"  # Scale between 1 and 3 to prevent excessive memory usage. Change it or remove to set it to the number of cpu cores.
  CELERY_WORKER_MAX_TASKS_PER_CHILD: "10000"

x-depends_on:
  &default-depends_on
  - postgres
  - redis

services:
  postgres:
    image: postgres:16
    environment:
      POSTGRES_HOST_AUTH_METHOD: "trust"  # Consider removing this and setting a password
    restart: unless-stopped
    volumes:
      - pg-data:/var/lib/postgresql/data
  redis:
    image: redis
    restart: unless-stopped
  web:
    image: glitchtip/glitchtip
    depends_on: *default-depends_on
    ports:
      - "8000:8000"
    environment: *default-environment
    restart: unless-stopped
    volumes: 
      - uploads:/code/uploads
  worker:
    image: glitchtip/glitchtip
    command: ./bin/run-celery-with-beat.sh
    depends_on: *default-depends_on
    environment: *default-environment
    restart: unless-stopped
    volumes: 
      - uploads:/code/uploads
  migrate:
    image: glitchtip/glitchtip
    depends_on: *default-depends_on
    command: "./manage.py migrate"
    environment: *default-environment

volumes:
  pg-data:
  uploads:

看起来我服务器上的Docker Compose版本不足以运行这个例子,docker-compose.yml得进行修改一下:

YAML
# docker-compose.yml file
version: "3.3"
services:
  postgres:
    image: postgres:16
    environment:
      POSTGRES_HOST_AUTH_METHOD: "trust"
    restart: unless-stopped
    volumes:
      - ${VOLUME_PGDATA}:/var/lib/postgresql/data
  redis:
    image: redis:latest
    restart: unless-stopped
  web:
    image: glitchtip/glitchtip:latest
    depends_on:
      - postgres
      - redis
    ports:
      - "8555:8000" # 这里我使用外部8555端口
    environment:
      DATABASE_URL: ${DATABASE_URL}
      SECRET_KEY: ${SECRET_KEY}
      PORT: ${PORT}
      EMAIL_URL: ${EMAIL_URL}
      GLITCHTIP_DOMAIN: ${GLITCHTIP_DOMAIN}
      DEFAULT_FROM_EMAIL: ${DEFAULT_FROM_EMAIL}
      CELERY_WORKER_AUTOSCALE: ${CELERY_WORKER_AUTOSCALE}
      CELERY_WORKER_MAX_TASKS_PER_CHILD: ${CELERY_WORKER_MAX_TASKS_PER_CHILD}
      I_PAID_FOR_GLITCHTIP: ${I_PAID_FOR_GLITCHTIP}
      ENABLE_USER_REGISTRATION: ${ENABLE_USER_REGISTRATION}
    restart: unless-stopped
    volumes: 
      - ${VOLUME_UPLOADS}:/code/uploads
  worker:
    image: glitchtip/glitchtip
    command: ./bin/run-celery-with-beat.sh
    depends_on:
      - postgres
      - redis
    environment:
      DATABASE_URL: ${DATABASE_URL}
      SECRET_KEY: ${SECRET_KEY}
      PORT: ${PORT}
      EMAIL_URL: ${EMAIL_URL}
      GLITCHTIP_DOMAIN: ${GLITCHTIP_DOMAIN}
      DEFAULT_FROM_EMAIL: ${DEFAULT_FROM_EMAIL}
      CELERY_WORKER_AUTOSCALE: ${CELERY_WORKER_AUTOSCALE}
      CELERY_WORKER_MAX_TASKS_PER_CHILD: ${CELERY_WORKER_MAX_TASKS_PER_CHILD}
      I_PAID_FOR_GLITCHTIP: ${I_PAID_FOR_GLITCHTIP}
      ENABLE_USER_REGISTRATION: ${ENABLE_USER_REGISTRATION}
    restart: unless-stopped
    volumes: 
      - ${VOLUME_UPLOADS}:/code/uploads
  migrate:
    image: glitchtip/glitchtip
    depends_on:
      - postgres
      - redis
    command: "./manage.py migrate"
    environment:
      DATABASE_URL: ${DATABASE_URL}
      SECRET_KEY: ${SECRET_KEY}
      PORT: ${PORT}
      EMAIL_URL: ${EMAIL_URL}
      GLITCHTIP_DOMAIN: ${GLITCHTIP_DOMAIN}
      DEFAULT_FROM_EMAIL: ${DEFAULT_FROM_EMAIL}
      CELERY_WORKER_AUTOSCALE: ${CELERY_WORKER_AUTOSCALE}
      CELERY_WORKER_MAX_TASKS_PER_CHILD: ${CELERY_WORKER_MAX_TASKS_PER_CHILD}
      I_PAID_FOR_GLITCHTIP: ${I_PAID_FOR_GLITCHTIP}
      ENABLE_USER_REGISTRATION: ${ENABLE_USER_REGISTRATION}

为了比较方便的维护,增加一个.env文件进行参数映射,与docker-compose.yml在同一目录下。

INI
VOLUME_PGDATA=/data/glitchtip/pg-data # 自定义地址
VOLUME_UPLOADS=/data/glitchtip/uploads # 自定义地址
DATABASE_URL=postgres://postgres:postgres@postgres:5432/postgres # postgres通信,无需更改
SECRET_KEY=6c39061aa... # 随意,这里使用openssl rand -hex 32生成
PORT=8000 # 这个端口为容器内部端口,无需更改
EMAIL_URL=smtp+ssl://no-reply%40qqays.xyz:password@smtp.mail.com:465 # SMTP设置
GLITCHTIP_DOMAIN=http://glitchtip.domain.com:8555 # 你的外部访问地址
DEFAULT_FROM_EMAIL=no-reply@qqays.xyz # 与上方SMTP登陆用户一致
CELERY_WORKER_AUTOSCALE=1,3 # CPU资源配置
CELERY_WORKER_MAX_TASKS_PER_CHILD=10000
I_PAID_FOR_GLITCHTIP=false # 捐赠状态
ENABLE_USER_REGISTRATION=true # 是否允许用户注册

上方.env文件需要注意的是:

  1. EMAIL_URL遵循django-environ中设置,格式为:连接方式://用户名:密码@smtp地址:端口

    如果你使用的smtp端口为465,说明启用了ssl,连接方式需改为smtp+ssl://

    假设你的smtp用户名为no-reply@qqays.xyz,需要将用户名中的@转换为URL编码%40,示例如下:smtp+ssl://no-reply%40qqays.xyz:password@smtp.mail.com:465

  2. DEFAULT_FROM_EMAIL需与上方设置的smtp用户名一致,只不过不需要进行URL编码。

  3. I_PAID_FOR_GLITCHTIP为捐赠状态,设置详见:glitchtip的可选参数
  4. 如果你是首次启动,ENABLE_USER_REGISTRATION需要设置为true,你可以在注册完成后将容器关闭并进行修改为false,以防止他人注册使用。

配置完成,可以使用docker-compose up -d来启动这些容器,并使用你设置的域名和端口进行访问。

如果你认为上方都正确设置却无法启动,可以使用docker-compose up前台启动或docker logs -f [容器名称]来看看报错信息。

使用示例

GlitchTip可以添加各种各样的项目: Snipaste_2024-05-11_11-22-47.png

创建项目

项目使用的FastAPI,但GlitchTip没有该选项,这里我直接选Flask进行创建,其余信息根据实际情况填写。 Snipaste_2024-05-11_11-27-35.png

使用SDK

在创建完成项目后下方会得到使用方法,我们直接在项目中引用,这里的DSN填写上方图中右侧的DSN链接即可。

在GlitchTip官方的例子中是直接使用Sentry的SDK,因为GlitchTip是完全兼容的。

SDK接入

检测连通性

我们手动创建一个异常路由,直接触发值异常。访问这个路由,GlitchTip捕获到了这个异常,并列出了栈跟踪结果,这对bug调试非常有利,能够快速定位问题位置并着手解决。

异常路由 异常捕获 栈跟踪

接口性能与uptime监控

除上述错误跟踪外,GlitchTip还支持接口响应时间监控和uptime监控。

uptime监控 接口响应时间监控

通知

GlitchTip支持邮件通知、webhook等通知方式,可以在追踪到错误或者失去心跳时进行通知。 Snipaste_2024-05-11_11-55-23.png

使用感受

为什么我说是Sentry的平替,因为国内需要访问Sentry的SDK需要过墙(除非建立转发或代理);对于轻量级别的项目,GlitchTip完全够用。

评论