Sentry的平替!GlitchTip部署过程及使用感受
最近FastAPI项目想上一个错误追踪,Sentry非常好,但是翻不过巨大的墙。找了一圈发现了GlitchTip,他完全兼容Sentry的SDK,并且开源、可自托管、集成uptime监控与接口响应时间统计,非常好,就他了!
部署过程
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
文件需要注意的是:
-
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
-
DEFAULT_FROM_EMAIL需与上方设置的smtp用户名一致,只不过不需要进行URL编码。
- I_PAID_FOR_GLITCHTIP为捐赠状态,设置详见:glitchtip的可选参数
- 如果你是首次启动,ENABLE_USER_REGISTRATION需要设置为
true
,你可以在注册完成后将容器关闭并进行修改为false
,以防止他人注册使用。
配置完成,可以使用docker-compose up -d
来启动这些容器,并使用你设置的域名和端口进行访问。
如果你认为上方都正确设置却无法启动,可以使用docker-compose up
前台启动或docker logs -f [容器名称]
来看看报错信息。
使用示例
GlitchTip可以添加各种各样的项目:
创建项目
项目使用的FastAPI,但GlitchTip没有该选项,这里我直接选Flask进行创建,其余信息根据实际情况填写。
使用SDK
在创建完成项目后下方会得到使用方法,我们直接在项目中引用,这里的DSN填写上方图中右侧的DSN链接即可。
在GlitchTip官方的例子中是直接使用Sentry的SDK,因为GlitchTip是完全兼容的。
检测连通性
我们手动创建一个异常路由,直接触发值异常。访问这个路由,GlitchTip捕获到了这个异常,并列出了栈跟踪结果,这对bug调试非常有利,能够快速定位问题位置并着手解决。
接口性能与uptime监控
除上述错误跟踪外,GlitchTip还支持接口响应时间监控和uptime监控。
通知
GlitchTip支持邮件通知、webhook等通知方式,可以在追踪到错误或者失去心跳时进行通知。
使用感受
为什么我说是Sentry的平替,因为国内需要访问Sentry的SDK需要过墙(除非建立转发或代理);对于轻量级别的项目,GlitchTip完全够用。