Как зарегистрировать ошибку в Stackdriver Error Reporting через Stackdriver Logging в Python

Я давно использую Stackdriver Logging, и теперь я хотел бы также воспользоваться функцией отчетов об ошибках. Я бы предпочел использовать механизм ведения журнала Python и очищать исключения из файла журнала, если это возможно (по разным причинам), а не использовать библиотеку error_reporting. При этом документация очень запутанная. Например, в документации сказано: https://cloud.google.com/error-reporting/docs/setup/compute-engine#log_exceptions

Сначала установите библиотеку fluent-logger-python:

sudo pip install google-cloud-error-report --upgrade

что заставляет меня поверить, что отчет об ошибках google-cloud-error является ответвлением или связан с fluent-logger-python, однако, когда я инициализирую google-cloud-error-report, он напрямую обращается к серверу метаданных GCE, а не подключается к местный беглый. Это два не связанных между собой пакета, или документация неверна или вводит в заблуждение? Если я отправлю исключения в формате JSON в fluentd или в файл журнала, отслеживаемый fluentd, поймет ли их отчет об ошибках?

Спасибо за любые разъяснения


person Robert Jordan    schedule 01.09.2017    source источник


Ответы (2)


Документация неверна.
TL; DR Вы должны вывести что-то похожее на https://cloud.google.com/error-reporting/docs/formatting-error-messages

Вот мое решение:

#Parse raw log entries to expose severity field so that
#StackDriver log viewer can properly categorize (and so we can filter)
<source>
  @type tail
  path /var/log/conductor
  pos_file /var/log/td-agent/conductor.pos
  format multiline
  format_firstline /\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/
  format1 /^(?<message>(?<time>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}),\d*\s*[a-zA-Z_]*\s*(?<severity>[A-Z]*).*)/
  read_from_head true
  multiline_flush_interval 3s
  tag conductor.app
</source>

#Add hostname field
<filter conductor.app>
  @type record_transformer
  <record>
    hostname ${hostname}
  </record>
</filter>

#Filter and tag log entries of severity ERROR or CRITICAL
<match conductor.app>
  @type rewrite_tag_filter
  rewriterule1 severity ERROR|CRITICAL conductor.err
  rewriterule2 severity .+ conductor.info
</match>

#Process entries with tracebacks differently than those without
<match conductor.err>
  @type rewrite_tag_filter
  rewriterule1 message .*Traceback conductor.err.traceback
  rewriterule2 message .+ conductor.err.message
</match>

#Parse out the traceback
<match conductor.err.traceback>
  @type parser
  key_name message
  format multiline
  format1 /^(?<message>(?<time>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}),\d*\s*(?<log>[a-zA-Z_]*)\s*(?<severity>[A-Z]*).*(?
<traceback>Traceback .*))/
  tag conductor.err.traceback.report
</match>

#Format traceback reports
<filter conductor.err.traceback.report>
  @type record_transformer
  <record>
      serviceContext {
        "service": "${record[\"log\"]}"
      }
      message ${record["traceback"]}
  </record>
  remove_keys traceback
</filter>

#Process errors that don't have tracebacks
<match conductor.err.message>
  @type parser
  key_name message
  format multiline
  format1 /^(?<message>(?<time>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}),\d*\s*(?<log>[a-zA-Z_]*)\s*(?<severity>[A-Z]*):\s*(?<report>.*))/
  tag conductor.err.message.report
</match>

#For errors without tracebacks we have to stub out some fields that
#error reporting requires, but we don't have
<filter conductor.err.message.report>
  @type record_transformer
  <record>
      serviceContext {
        "service": "${record[\"log\"]}"
      }
      message ${record["report"]}
      reportLocation {
        "filePath": "None",
        "lineNumber": 0,
        "functionName": "None"
      }
  </record>
</filter>

#Send to StackDriver logging!
<match conductor.**>
  @type google_cloud
  buffer_chunk_limit 2M
  flush_interval 5s
  max_retry_wait 300
  disable_retry_limit
  num_threads 8
</match>
person Robert Jordan    schedule 06.09.2017

Вы можете следовать руководству здесь: https://cloud.google.com/run/docs/logging#writing_structured_logs

Вы можете использовать python, чтобы создать dict и записать его в Stackdriver - он будет коррелировать с трассировкой. Это должно выглядеть примерно так (из учебника):

# Build structured log messages as an object.
global_log_fields = {}

# Add log correlation to nest all log messages
# beneath request log in Log Viewer.
trace_header = request.headers.get('X-Cloud-Trace-Context')

if trace_header and PROJECT:
    trace = trace_header.split('/')
    global_log_fields['logging.googleapis.com/trace'] = (
        f"projects/{PROJECT}/traces/{trace[0]}")

# Complete a structured log entry.
entry = dict(severity='NOTICE',
             message='This is the default display field.',
             # Log viewer accesses 'component' as jsonPayload.component'.
             component='arbitrary-property',
             **global_log_fields)

print(json.dumps(entry))

Дополнительную информацию об отчетах об ошибках см. Здесь: https://cloud.google.com/run/docs/error-reporting

person Dina Graves Portman    schedule 15.11.2019