Запретить GCP-отчетам об ошибках регистрировать трассировку вложенного стека из середины сообщения журнала

#python #google-cloud-platform #google-cloud-logging #google-cloud-error-reporting

#python #google-облачная платформа #google-cloud-ведение журнала #google-cloud-отчеты об ошибках

Вопрос:

У меня есть блок кода в блоке try / except, который выдает / перехватывает исключения (psycopg2 в одном случае и CRCError в другом). Исключение регистрируется с использованием стандартной библиотеки (пример кода ниже).

В отчетах об ошибках GCP регистрируется пойманное исключение (отсутствует контекст).

Как мы можем выполнить следующее?

  • Убедитесь, что мое исключение с контекстным исключением явно отображается в консоли отчетов об ошибках. — Я на самом деле знаю, что ответ здесь заключается в том, чтобы [явно использовать клиент отчетов об ошибках] [1], как я делал это в другом месте, или разрешить исключение быть неперехваченным (нежелательно в данном случае, поскольку это изменило бы поток выполнения).
  • запретить GCP явно регистрировать эти «Ошибки» — это та часть, которая ставит меня в тупик. Я не хочу явно проглатывать трассировку стека перехваченного исключения. Имеет ли это какое-то отношение к тому, как я настроил ведение журнала для всего приложения? Обратите внимание, как GCP Logs Explorer показывает 2 отдельные записи ниже.

Пример кода, который обрабатывает / регистрирует ошибку OSError:

 try:
    with open(out_path, 'wb') as fout:
        with gzip.open(in_path, 'rb') as fin:
            shutil.copyfileobj(fin, fout)
except Exception:
    LOGGER.exception("Fatal error decompressing %s to %s, skipping", in_path, out_path)
 

Соответствующая запись отчета об ошибках:

 OSError: CRC check failed 0xa3d2ba37 != 0xb3b0d715
at _read_eof (/usr/local/lib/python3.7/gzip.py:512)
at read (/usr/local/lib/python3.7/gzip.py:465)
at readinto (/usr/local/lib/python3.7/_compression.py:68)
at read (/usr/local/lib/python3.7/gzip.py:287)
at copyfileobj (/usr/local/lib/python3.7/shutil.py:79)
at gunzip (xxx:NN)
 

Обозреватель журналов, показывающий две отдельные записи:

 {
    "textPayload": "2021-12-09 20:49:08,918 - __main__ - ERROR - Fatal error decompressing 0001.bin.gz to 0001.bin, skippingn",
    "insertId": "insertId1",
    "resource": {
        "type": "k8s_container",
        ...
    },
    "timestamp": "2021-12-09T20:49:08.918859648Z",
    "severity": "ERROR",
    "logName": "projects/myproject/logs/stderr",
    "receiveTimestamp": "2021-12-09T20:49:10.383920475Z"
}
 
 {
    "textPayload": "Traceback (most recent call last):n  File "xxx.py", line NN, in gunzipn    shutil.copyfileobj(fin, fout)n  File "/usr/local/lib/python3.7/shutil.py", line 79, in copyfileobjn    buf = fsrc.read(length)n  File "/usr/local/lib/python3.7/gzip.py", line 287, in readn    return self._buffer.read(size)n  File "/usr/local/lib/python3.7/_compression.py", line 68, in readinton    data = self.read(len(byte_view))n  File "/usr/local/lib/python3.7/gzip.py", line 465, in readn    self._read_eof()n  File "/usr/local/lib/python3.7/gzip.py", line 512, in _read_eofn    hex(self._crc)))nOSError: CRC check failed 0xa3d2ba37 != 0xb3b0d715n",
    "insertId": "insertId2",
    "resource": {
        "type": "k8s_container",
        ...
    },
    "timestamp": "2021-12-09T20:49:08.918931417Z",
    "severity": "ERROR",
    "logName": "projects/myproject/logs/stderr",
    "receiveTimestamp": "2021-12-09T20:49:10.383920475Z"
}
 

Ответ №1:

Вы можете попробовать использовать Sink для установки фильтров исключения. Это поможет вам исключить перенаправление совпадающих записей журнала в пункт назначения приемника или из-за облачного ведения журнала.

Нажмите на эту ссылку для получения полного руководства по созданию приемника.

  1. В облачной консоли перейдите на страницу Logging> Log Router.
  2. Выберите существующий облачный проект.
  3. Выберите Создать приемник
  4. Введите имя и описание приемника.
  5. Выберите пункт назначения приемника
  6. Выберите журналы для включения в приемник
  7. Выберите журналы для исключения из приемника
    a. В поле Имя фильтра исключения введите имя.
    b. В поле Создать фильтр исключения введите выражение фильтра, соответствующее записям журнала, которые вы хотите исключить. Вы также можете использовать функцию sample, чтобы выбрать часть записей журнала для исключения.

Вот ссылка для примеров фильтров.