Bỏ qua tới nội dung

Hướng dẫn theo framework

Theo dõi lỗi cho Python

Với Python, Belvador dùng sentry-sdk chính thức với DSN Belvador của bạn, cùng tuỳ chọn khởi tạo và hook scrub_event bỏ request body, cookie và thông tin đăng nhập trước khi event rời server của bạn.

Bắt đầu miễn phíPython

Cập nhật 25/10/2026

Trả lời nhanh#

  • Dùng sentry-sdk chính thức với DSN Belvador của bạn.

  • Hook scrub_event bỏ request body, cookie và thông tin đăng nhập trước khi event rời server.

  • Job định kỳ báo check-in, còn trace và log OpenTelemetry được lưu trên cùng node.

  • Đây là cách cài tương thích: Belvador kiểm thử hook của mình, không kiểm thử bản thân sentry-sdk.

Cài đặt#

Terminal
pip install --upgrade "sentry-sdk"

Khởi tạo khi app bắt đầu chạy#

app.py
import osimport sentry_sdkimport reSENSITIVE_KEY = re.compile(r"password|passwd|pwd|secret|api_key|apikey|api-key|access_token|auth|credentials|credit_card|card_number|cvv|private_key|privatekey|session|cookie|token|bearer|ssn|dob", re.I)DROP_HEADER = re.compile(r"^(authorization|proxy-authorization|cookie|set-cookie|x-forwarded-for|x-real-ip|cf-connecting-ip|true-client-ip)$", re.I)IN_TEXT = [    (re.compile(r"\bBearer\s+[A-Za-z0-9._~+/-]+=*", re.I), "Bearer [Filtered]"),    (re.compile(r"\beyJ[A-Za-z0-9_-]{5,}\.[A-Za-z0-9_-]{5,}\.[A-Za-z0-9_-]{5,}"), "[Filtered]"),    (re.compile(r"\b[sr]k_(live|test)_[A-Za-z0-9]{8,}\b"), "[Filtered]"),    (re.compile(r"([?&#;\s\"']?[^=&#\s\"':]*(?:token|key|secret|password|session|auth)[^=&#\s\"':]*[\"']?\s*[=:]\s*[\"']?)[^&#\s\"',}]+", re.I), r"\1[Filtered]"),]def scrub_text(text):    for pattern, repl in IN_TEXT:        text = pattern.sub(repl, text)    return textdef scrub_value(value, depth=0):    if isinstance(value, str):        return scrub_text(value)    if depth > 8:        return value    if isinstance(value, (list, tuple)):        return [scrub_value(v, depth + 1) for v in value]    if isinstance(value, dict):        return {k: "[Filtered]" if SENSITIVE_KEY.search(str(k)) else scrub_value(v, depth + 1) for k, v in value.items()}    return valuedef scrub_event(event, hint):    request = event.get("request")    if request:        for field in ("data", "cookies", "env"):            request.pop(field, None)        headers = request.get("headers") or {}        for name in list(headers):            if DROP_HEADER.match(name):                del headers[name]            elif SENSITIVE_KEY.search(name):                headers[name] = "[Filtered]"        if isinstance(request.get("url"), str):            request["url"] = scrub_text(request["url"])        if request.get("query_string"):            request["query_string"] = scrub_value(request["query_string"])    user = event.get("user")    if user is not None:        event["user"] = {"id": user["id"]} if "id" in user else None    if event.get("message"):        event["message"] = scrub_text(event["message"])    if event.get("logentry"):        event["logentry"] = scrub_value(event["logentry"])    for ex in (event.get("exception") or {}).get("values") or []:        if ex.get("value"):            ex["value"] = scrub_text(ex["value"])    for field in ("extra", "contexts", "tags"):        if event.get(field):            event[field] = scrub_value(event[field])    crumbs = event.get("breadcrumbs")    if isinstance(crumbs, dict) and crumbs.get("values"):        crumbs["values"] = [scrub_value(b) for b in crumbs["values"]]    return eventsentry_sdk.init(    dsn=os.environ.get("BELVADOR_DSN", "https://<public-key>@ingest.belvador.dev/<project-id>"),    release=os.environ.get("APP_VERSION"),    environment=os.environ.get("APP_ENV", "production"),    send_default_pii=False,    traces_sample_rate=0,    max_breadcrumbs=50,    max_value_length=8192,    before_send=scrub_event,)

Khởi tạo trước khi import web framework để tích hợp của framework cũng được gắn. Hướng dẫn Python giải thích từng tuỳ chọn.

Cách cài này là gì#

Đây là cách cài tương thích, không phải gói của Belvador. Test của Belvador chạy scrub_event trên dữ liệu độc hại, nhưng Belvador không chứng nhận sentry-sdk hay các tích hợp framework của nó. Node của bạn lọc lần nữa trước khi lưu (bảo vệ dữ liệu).

Job định kỳ#

Python
from sentry_sdk.crons import monitor@monitor(monitor_slug="nightly-invoices", monitor_config={"schedule": {"type": "crontab", "value": "0 2 * * *"}, "timezone": "UTC"})def nightly_invoices():    ...  # your job

Celery beat, script cron và management command báo được theo cùng cách (theo dõi cron).

Trace và log#

Dùng OpenTelemetry Python SDK hoặc instrumentation không cần sửa code, với OTLP exporter chuẩn (OpenTelemetry cho Python).

Đã kiểm ngày 2026-10-25 với python 3.12.15, opentelemetry-distro 0.66b1, opentelemetry-sdk 1.45.1, flask 3.1.3: traces đạt, logs đạt, log mang trace/span của request.

Giới hạn#

  • Phiên bản Python được hỗ trợ theo bản sentry-sdk hiện hành.

  • Không có profiling; trace và log được giữ để debug trong thời gian có hạn.

Câu hỏi thường gặp#

Tích hợp Django, Flask và FastAPI có chạy không?#

Chúng là một phần của sentry-sdk và gửi qua cùng DSN. Belvador không chứng nhận từng tích hợp; hook lọc chạy trên mọi event chúng tạo ra.

Thử trên project Hetzner của bạn

Miễn phí trong giai đoạn beta. Hetzner tính tiền máy; Belvador không bao giờ tính tiền theo event.