前言
上一篇文章说了重启 sentry 的事
因为过程太折腾了,一度想过放弃 sentry 换成其他比较轻量级的开源监控系统
这不就给我找到了另外俩个
这次就来试试这个 glitchtip
用了之后才发现,这个也是用 Django 开发的,而且兼容 sentry 协议,连 SDK 都用的 sentry 的…
就是个 sentry 的轻量级平替版
环境准备
相比起 sentry ,glitchtip 非常的轻量,只用到了 redis 和 celery
日志数据是存在 PostgreSQL 里的
这就很舒服了,部署起来比 sentry 这种重量级的框架简单多了
本文的部署基于官方的 docker-compose 配置修改而来
PostgreSQL
首先准备数据库
官方的 compose 里带有一个数据库,不过我服务器上已经有数据库了,就不要重复搞那么多容器
services: db: image: postgres container_name: pgsql restart: unless-stopped environment: - POSTGRES_PASSWORD=数据库管理员密码 expose: - 5432 ports: - 5432:5432 volumes: - ./data:/var/lib/postgresql/data networks: - defaultnetworks: default: name: pgsql
把pgsql启动之后,先来创建 glitchtip 用到的数据库和用户
-- 创建用户: 使用 CREATE ROLE 或 CREATE USER 命令来创建一个新用户。CREATE USER glitchtip WITH PASSWORD 'glitchtip用户密码';-- 赋予权限: 要确保 glitchtip 用户只能访问 glitchtip 数据库,你需要为该用户设置适当的权限。GRANT ALL PRIVILEGES ON DATABASE glitchtip TO glitchtip;-- 授予在 public 模式中创建表的权限GRANT CREATE ON SCHEMA public TO glitchtip;-- 授予在 public 模式中使用的权限GRANT USAGE ON SCHEMA public TO glitchtip;
这里数据库的就搞定了
扩展:adminer
如果想在网页上管理数据库,可以启动一个 adminer 服务
services: adminer: image: adminer container_name: adminer restart: always networks: - swag - pgsql - mysqlnetworks: swag: name: swag external: true pgsql: name: pgsql external: true mysql: name: mysql external: true
启动之后在 swag 做一下8000端口的反代即可。
Redis
redis 比较轻,建议使用 glitchtip 里的即可,不需要使用共用的 Redis
除非搭了集群
安装 glitchtip
我修改了一下官方提供的 compose 配置
有几点需要注意:
- 邮箱地址和密码需要使用
urllib.parse.quote()
转义,我这里依然使用企业邮箱,不过试了smtp://
和smtps://
前缀都没法发送成功 - 把官方的顶层volumes去掉了,把数据放在当前目录下,方便管理。如果有大量数据可以考虑换 OSS
- 使用我们前面部署的 PostgreSQL 数据库,而不是 compose 里另外起一个
x-environment: &default-environment DATABASE_URL: postgres://glitchtip:glitchtip用户密码@pgsql:5432/glitchtip SECRET_KEY: 建议32位随机密码 # 可以使用命令生成 openssl rand -hex 32 PORT: 8000 EMAIL_URL: smtp://邮箱地址:邮箱密码@smtp.exmail.qq.com:465 GLITCHTIP_DOMAIN: https://glitchtip.example.com DEFAULT_FROM_EMAIL: 邮箱地址 CELERY_WORKER_AUTOSCALE:"1,3" CELERY_WORKER_MAX_TASKS_PER_CHILD:"10000"x-depends_on: &default-depends_on - redisservices: redis: image: redis restart: unless-stopped networks: - default web: image: glitchtip/glitchtip depends_on: *default-depends_on ports: -"8000:8000" environment: *default-environment restart: unless-stopped volumes: - ./uploads:/code/uploads networks: - default - pgsql - swag 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 networks: - default - pgsql migrate: image: glitchtip/glitchtip depends_on: *default-depends_on command:"./manage.py migrate" environment: *default-environment networks: - pgsql - defaultnetworks: default: name: glitchtip swag: name: swag external: true pgsql: name: pgsql external: true
启动就完事了
首次启动后需要 migrate ,这时候 worker 会报错,没事,等 migrate 完成就好了。
登录后注册、创建一个新组织,就可以正常使用了。
代码里使用
仅使用glitchtip
如果单纯用 glitchtip,当成 sentry 来用就行了
import sentry_sdkfrom sentry_sdk.integrations.django import DjangoIntegrationsentry_sdk.init( dsn="YOUR-GLITCHTIP-DSN-HERE", integrations=[DjangoIntegration()], auto_session_tracking=False, traces_sample_rate=0.01, release="1.0.0", environment="production",)
就这么朴实无华
与 sentry 同时使用
PS:
话说为什么要和sentry同时使用?
sentry_sdk 默认不支持同时初始化多个实例
所以通过一些额外的逻辑来实现这个功能
class GlitchtipSentrySdk: def __init__(self, dsn): self.client = sentry_sdk.Hub(sentry_sdk.Client(dsn)) def capture_exception(self, exc): with self.client: sentry_sdk.capture_exception(exc)glitchtip = GlitchtipSentrySdk('https://balabalaba@glitchtip.example.com/1')
搞定了
小结
简单体验下来,glitchtip真的简陋很多
不过最基本的错误收集功能还是有的
如果服务器性能不够的话,作为sentry的平替还是不错的。
还有个 highlight 我还没部署上,里面的配置有点复杂。