兼容sentry協(xié)議的輕量級(jí)監(jiān)控: glitchtip
共 6984字,需瀏覽 14分鐘
·
2024-07-23 09:58
前言
上一篇文章說(shuō)了重啟 sentry 的事
因?yàn)檫^(guò)程太折騰了,一度想過(guò)放棄 sentry 換成其他比較輕量級(jí)的開源監(jiān)控系統(tǒng)
這不就給我找到了另外倆個(gè)
-
https://glitchtip.com/ -
https://www.highlight.io/
這次就來(lái)試試這個(gè) glitchtip
用了之后才發(fā)現(xiàn),這個(gè)也是用 Django 開發(fā)的,而且兼容 sentry 協(xié)議,連 SDK 都用的 sentry 的…
就是個(gè) sentry 的輕量級(jí)平替版
環(huán)境準(zhǔn)備
相比起 sentry ,glitchtip 非常的輕量,只用到了 redis 和 celery
日志數(shù)據(jù)是存在 PostgreSQL 里的
這就很舒服了,部署起來(lái)比 sentry 這種重量級(jí)的框架簡(jiǎn)單多了
本文的部署基于官方的 docker-compose 配置修改而來(lái)
PostgreSQL
首先準(zhǔn)備數(shù)據(jù)庫(kù)
官方的 compose 里帶有一個(gè)數(shù)據(jù)庫(kù),不過(guò)我服務(wù)器上已經(jīng)有數(shù)據(jù)庫(kù)了,就不要重復(fù)搞那么多容器
services:
db:
image: postgres
container_name: pgsql
restart: unless-stopped
environment:
- POSTGRES_PASSWORD=數(shù)據(jù)庫(kù)管理員密碼
expose:
- 5432
ports:
- 5432:5432
volumes:
- ./data:/var/lib/postgresql/data
networks:
- default
networks:
default:
name: pgsql
把pgsql啟動(dòng)之后,先來(lái)創(chuàng)建 glitchtip 用到的數(shù)據(jù)庫(kù)和用戶
-- 創(chuàng)建用戶: 使用 CREATE ROLE 或 CREATE USER 命令來(lái)創(chuàng)建一個(gè)新用戶。
CREATE USER glitchtip WITH PASSWORD 'glitchtip用戶密碼';
-- 賦予權(quán)限: 要確保 glitchtip 用戶只能訪問(wèn) glitchtip 數(shù)據(jù)庫(kù),你需要為該用戶設(shè)置適當(dāng)?shù)臋?quán)限。
GRANT ALL PRIVILEGES ON DATABASE glitchtip TO glitchtip;
-- 授予在 public 模式中創(chuàng)建表的權(quán)限
GRANT CREATE ON SCHEMA public TO glitchtip;
-- 授予在 public 模式中使用的權(quán)限
GRANT USAGE ON SCHEMA public TO glitchtip;
這里數(shù)據(jù)庫(kù)的就搞定了
擴(kuò)展:adminer
如果想在網(wǎng)頁(yè)上管理數(shù)據(jù)庫(kù),可以啟動(dòng)一個(gè) adminer 服務(wù)
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
啟動(dòng)之后在 swag 做一下8000端口的反代即可。
Redis
redis 比較輕,建議使用 glitchtip 里的即可,不需要使用共用的 Redis
除非搭了集群
安裝 glitchtip
我修改了一下官方提供的 compose 配置
有幾點(diǎn)需要注意:
-
郵箱地址和密碼需要使用 urllib.parse.quote()轉(zhuǎn)義,我這里依然使用企業(yè)郵箱,不過(guò)試了smtp://和smtps://前綴都沒法發(fā)送成功 -
把官方的頂層volumes去掉了,把數(shù)據(jù)放在當(dāng)前目錄下,方便管理。如果有大量數(shù)據(jù)可以考慮換 OSS -
使用我們前面部署的 PostgreSQL 數(shù)據(jù)庫(kù),而不是 compose 里另外起一個(gè)
x-environment: &default-environment
DATABASE_URL: postgres://glitchtip:glitchtip用戶密碼@pgsql:5432/glitchtip
SECRET_KEY: 建議32位隨機(jī)密碼 # 可以使用命令生成 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
啟動(dòng)就完事了
首次啟動(dòng)后需要 migrate ,這時(shí)候 worker 會(huì)報(bào)錯(cuò),沒事,等 migrate 完成就好了。
登錄后注冊(cè)、創(chuàng)建一個(gè)新組織,就可以正常使用了。
代碼里使用
僅使用glitchtip
如果單純用 glitchtip,當(dāng)成 sentry 來(lái)用就行了
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",
)
就這么樸實(shí)無(wú)華
與 sentry 同時(shí)使用
?PS: 話說(shuō)為什么要和sentry同時(shí)使用?
sentry_sdk 默認(rèn)不支持同時(shí)初始化多個(gè)實(shí)例
所以通過(guò)一些額外的邏輯來(lái)實(shí)現(xiàn)這個(gè)功能
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://[email protected]/1')
搞定了
小結(jié)
簡(jiǎn)單體驗(yàn)下來(lái),glitchtip真的簡(jiǎn)陋很多
不過(guò)最基本的錯(cuò)誤收集功能還是有的
如果服務(wù)器性能不夠的話,作為sentry的平替還是不錯(cuò)的。
還有個(gè) highlight 我還沒部署上,里面的配置有點(diǎn)復(fù)雜。
