start
Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| start [2025/05/27 20:15] – admin | start [2025/05/28 19:15] (текущий) – admin | ||
|---|---|---|---|
| Строка 4: | Строка 4: | ||
| Его можно найти в интерфейсе редактирования проекта в поле **Токен**. | Его можно найти в интерфейсе редактирования проекта в поле **Токен**. | ||
| API_URL = https:// | API_URL = https:// | ||
| + | ====== Рекомендуемый способ передачи ошибок ====== | ||
| - | ===== Передаваемые поля | + | В этом разделе представлен рекомендуемый способ автоматической отправки |
| - | Для отправки ошибки необходимо | + | Используется декоратор `@detailed_exception_logger`, |
| + | * перехватывает исключения, | ||
| + | * извлекает стек вызовов и контекст исполнения, | ||
| + | * подготавливает структуру | ||
| + | * и отправляет её в API с авторизацией через токен проекта. | ||
| - | | + | При возникновении исключения, |
| + | |||
| + | | ||
| * **error_message** — текст ошибки | * **error_message** — текст ошибки | ||
| - | * **timestamp** — время | + | * **timestamp** — время в формате ISO 8601 |
| - | * **environment** — окружение (например, `production`, | + | * **environment** — окружение (по умолчанию: |
| - | * **release** — версия релиза (например, | + | * **release** — версия |
| - | * **platform** — операционная система (например, | + | * **platform** — ОС |
| - | * **language_version** — версия | + | * **language_version** — версия |
| - | * **user_id** — идентификатор пользователя (опционально) | + | * **user_id** — идентификатор пользователя (можно настроить) |
| * **user_email** — email пользователя (опционально) | * **user_email** — email пользователя (опционально) | ||
| - | * **request_data** — данные запроса, если доступны (например, параметры запроса, путь и т.д.) | + | * **request_data** — информация о контексте |
| - | * **stack_trace** — список фреймов | + | * **stack_trace** — список фреймов с переменными |
| - | * **file** — путь к файлу | + | * **tags** — теги в виде пар ключ/значение |
| - | * **line** — номер строки | + | |
| - | * **function** — имя функции | + | |
| - | * **code** — строка кода | + | |
| - | * **index** — индекс фрейма в стеке | + | |
| - | * **tags** — список | + | |
| - | ===== Пример | + | ===== Пример использования ===== |
| <code python> | <code python> | ||
| - | stack = traceback.extract_tb(e.__traceback__) | + | @detailed_exception_logger |
| - | stack_trace = [ | + | def divide(a, b): |
| - | { | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | | + | |
| - | ] | + | |
| - | error_data = { | + | divide(10, 0) |
| - | " | + | </ |
| - | " | + | |
| - | " | + | ===== Код декоратора ===== |
| - | " | + | |
| - | " | + | <code python> |
| - | " | + | import json |
| - | " | + | import traceback |
| - | " | + | import sys |
| - | " | + | import os |
| - | " | + | import inspect |
| - | " | + | from datetime import datetime |
| - | " | + | from functools import wraps |
| - | } | + | import requests |
| + | |||
| + | from config import API_URL, AUTH_TOKEN, ENVIRONMENT, | ||
| def send_error_to_api(error_data: | def send_error_to_api(error_data: | ||
| headers = { | headers = { | ||
| ' | ' | ||
| - | ' | + | ' |
| } | } | ||
| payload = { | payload = { | ||
| Строка 70: | Строка 67: | ||
| response.raise_for_status() | response.raise_for_status() | ||
| return response.json() | return response.json() | ||
| + | |||
| + | def detailed_exception_logger(func): | ||
| + | @wraps(func) | ||
| + | def wrapper(*args, | ||
| + | try: | ||
| + | return func(*args, **kwargs) | ||
| + | except Exception as e: | ||
| + | exc_type, exc_value, exc_tb = sys.exc_info() | ||
| + | timestamp = datetime.utcnow().isoformat() | ||
| + | |||
| + | stack_trace = [] | ||
| + | tb = exc_tb | ||
| + | index = 0 | ||
| + | while tb: | ||
| + | frame = tb.tb_frame | ||
| + | lineno = tb.tb_lineno | ||
| + | filename = frame.f_code.co_filename | ||
| + | func_name = frame.f_code.co_name | ||
| + | |||
| + | try: | ||
| + | with open(filename, | ||
| + | lines = f.readlines() | ||
| + | code_line = lines[lineno - 1].strip() if lineno <= len(lines) else "" | ||
| + | except Exception: | ||
| + | code_line = "" | ||
| + | |||
| + | stack_trace.append({ | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | }) | ||
| + | |||
| + | tb = tb.tb_next | ||
| + | index += 1 | ||
| + | |||
| + | error_data = { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | {" | ||
| + | {" | ||
| + | {" | ||
| + | ] | ||
| + | } | ||
| + | |||
| + | try: | ||
| + | send_error_to_api(error_data) | ||
| + | except Exception as api_error: | ||
| + | print(f" | ||
| + | print(json.dumps(error_data, | ||
| + | |||
| + | raise | ||
| + | |||
| + | return wrapper | ||
| </ | </ | ||
| + | |||
| + | ===== Дополнительно ===== | ||
| + | |||
| + | * При необходимости можно расширить `request_data` или `tags` дополнительными параметрами | ||
start.1748376948.txt.gz · Последнее изменение: — admin
