相容sentry協議的輕量級監控,glitchtip

程序设计实验室發表於2024-07-23

前言

上一篇文章說了重啟 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 我還沒部署上,裡面的配置有點複雜。

相關文章