Skip to content

Включение отладки

Возврат отладочной информации в ответах REST API

По умолчанию сервер не добавляет детали ошибок в тело ответа, чтобы избежать раскрытия информации, специфичной для инстанса, конечным пользователям.

Вы можете изменить это, установив:

$ export SYNCMASTER__SERVER__DEBUG=False
$ # запуск сервера REST API
$ curl -XPOST http://localhost:8000/failing/endpoint ...
{
    "error": {
        "code": "unknown",
        "message": "Получено необработанное исключение. Пожалуйста, обратитесь в службу поддержки",
        "details": null,
    },
}
$ export SYNCMASTER__SERVER__DEBUG=True
$ # запуск сервера REST API
$ curl -XPOST http://localhost:8000/failing/endpoint ...
Traceback (most recent call last):
File ".../uvicorn/protocols/http/h11_impl.py", line 408, in run_asgi
    result = await app(  # type: ignore[func-returns-value]
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File ".../site-packages/uvicorn/middleware/proxy_headers.py", line 84, in __call__
    return await self.app(scope, receive, send)

ОПАСНО

Это только для среды разработки. НЕ используйте в продакшене!

Вывод отладочных логов на бэкенде

См. Настройки логирования, но замените уровень логирования INFO на DEBUG.

Заполнение заголовка X-Request-ID на бэкенде

Сервер может добавлять заголовок X-Request-ID к ответам, что позволяет сопоставлять запросы на клиенте с ответами бэкенда.

Это делается с помощью промежуточного ПО request_id, которое включено по умолчанию и может быть настроено, как описано ниже:

Bases: BaseModel

X-Request-ID Middleware Settings.

See asgi-correlation-id <https://github.com/snok/asgi-correlation-id>_ documentation.

Examples

.. code-block:: yaml :caption: config.yml

server:
    request_id:
        enabled: True
        header_name: X-Request-ID
        update_request_header: True
Source code in syncmaster/server/settings/server/request_id.py
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class RequestIDSettings(BaseModel):
    """X-Request-ID Middleware Settings.

    See `asgi-correlation-id <https://github.com/snok/asgi-correlation-id>`_ documentation.

    Examples
    --------

    .. code-block:: yaml
        :caption: config.yml

        server:
            request_id:
                enabled: True
                header_name: X-Request-ID
                update_request_header: True
    """

    enabled: bool = Field(default=True, description="Set to ``True`` to enable middleware")
    header_name: str = Field(
        default="X-Request-ID",
        description="Name of response header which is filled up with request ID value",
    )
    update_request_header: bool = Field(
        default=False,
        description=textwrap.dedent(
            """
            If ``False``, bypass header value from request to response as-is.

            If ``True``, always set new value of specific header.
            """,
        ),
    )

Вывод идентификатора запроса в логи бэкенда

Это делается путем добавления специального фильтра к обработчику логирования:

logging.yml

# только для разработки
version: 1
disable_existing_loggers: false

filters:
  # Добавляет идентификатор запроса как дополнительное поле с именем `correlation_id` к каждой записи лога.
  # Это используется в сочетании с settings.server.request_id.enabled=True
  # См. https://github.com/snok/asgi-correlation-id#configure-logging
  correlation_id:
    (): asgi_correlation_id.CorrelationIdFilter
    uuid_length: 32
    default_value: '-'

formatters:
  plain:
    (): logging.Formatter
    # Добавление correlation_id к записям лога
    fmt: '%(asctime)s.%(msecs)03d %(processName)s:%(process)d %(name)s:%(lineno)d [%(levelname)s] %(correlation_id)s %(message)s'
    datefmt: '%Y-%m-%d %H:%M:%S'

handlers:
  main:
    class: logging.StreamHandler
    formatter: plain
    filters: [correlation_id]
    stream: ext://sys.stdout
  celery:
    class: logging.StreamHandler
    formatter: plain
    filters: [correlation_id]
    stream: ext://sys.stdout

loggers:
  '':
    handlers: [main]
    level: INFO
    propagate: false
  uvicorn:
    handlers: [main]
    level: INFO
    propagate: false
  celery:
    level: INFO
    handlers: [celery]
    propagate: false
  scheduler:
    handlers: [main]
    level: INFO
    propagate: false
  py4j:
    handlers: [main]
    level: WARNING
    propagate: false
  hdfs.client:
    handlers: [main]
    level: WARNING
    propagate: false

Получаемые логи выглядят так:

2023-12-18 17:14:11.711 uvicorn.access:498 [INFO] 018c15e97a068ae09484f8c25e2799dd 127.0.0.1:34884 - "GET /monitoring/ping HTTP/1.1" 200