前言
上一篇文章說了重啟 sentry 的事
因為過程太折騰了,一度想過放棄 sentry 換成其他比較輕量級的開源監控系統
這不就給我找到了另外倆個
- https://glitchtip.com/
- https://www.highlight.io/
這次就來試試這個 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:
- default
networks:
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
- mysql
networks:
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
- redis
services:
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
- default
networks:
default:
name: glitchtip
swag:
name: swag
external: true
pgsql:
name: pgsql
external: true
啟動就完事了
首次啟動後需要 migrate ,這時候 worker 會報錯,沒事,等 migrate 完成就好了。
登入後註冊、建立一個新組織,就可以正常使用了。
程式碼裡使用
僅使用glitchtip
如果單純用 glitchtip,當成 sentry 來用就行了
import sentry_sdk
from sentry_sdk.integrations.django import DjangoIntegration
sentry_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 我還沒部署上,裡面的配置有點複雜。