Отчеты об ошибках Stackdriver с помощью gcloud

Я пытаюсь использовать gcloud cli для отправки событий в отчеты об ошибках StackDriver.
(Очень ограниченная) документация находится здесь: https://cloud.google.com/sdk/gcloud/reference/beta/error-reporting/events/report

Независимо от того, что я отправляю как сообщение, мне кажется, что я получаю эту ошибку:

ОШИБКА: (gcloud.beta.error-reporting.events.report) INVALID_ARGUMENT: ReportedErrorEvent.context должен содержать местоположение, если message содержат исключение или трассировку стека.

Я попытался отформатировать сообщение как представление отчета об ошибке в формате JSON: https://cloud.google.com/error-reporting/docs/formatting-error-messages но сообщение, похоже, не изменилось. Вот пример команды и JSON:

gcloud beta error-reporting events report --service foo --message-file err.json

{
    "serviceContext": {
        "service": "foo"
    },
    "message": "Whoops!",
    "context": {
        "reportLocation": {
            "filePath": "/usr/local/bin/test",
            "lineNumber": 123,
            "functionName": "main"
        }
    }
}

4 ответа

Решение

Аргумент gcloud --message или --message-field - это просто message поле сообщаемой ошибки, а не весь JSON. Поскольку вы не можете предоставить reportLocation через gcloud, message должен быть трассировкой стека или исключением.

Использование API проводника с оригинальным запросом работает. Регистрация ошибки также попадает в Отчеты об ошибках через:

gcloud beta logging write --payload-type=json test-errors-log '
{
    "serviceContext": {
        "service": "foo"
    },                        
    "message": "Whoops!",
    "context": {
        "reportLocation": {
            "filePath": "/usr/local/bin/test",
            "lineNumber": 123,
            "functionName": "main"
        }
    }
}'

Еще один способ.

gcloud logging write --payload-type=json test-errors-log '
{
  "serviceContext": {"service": "foo"},                        
  "message": "message with stacktrace\n at /test.js"
}
'
gcloud logging write --payload-type=json test-errors-log '
{
  "@type": "type.googleapis.com/google.devtools.clouderrorreporting.v1beta1.ReportedErrorEvent",
  "message": "message without stacktrace"
}
'
gcloud beta error-reporting events report --service foo --message 'message with stacktrace
at /test.js'

gcloud beta error-reporting events reportтребует stacktrace из языка программирования, чтобы сообщить об этом. Это искусственное (и на самом деле довольно глупое требование).

Минимальная Java, такая как stacktrace:

      gcloud beta error-reporting events report --verbosity=debug \
  --service test --service-version test1 \
  --message "at a()"

Вы можете добавить интересные данные, если сохранитеat<SP><CHARS>()внутри сообщения на отдельной строке (спасибо за Bash$'\n'магия!):

      gcloud beta error-reporting events report --verbosity=debug \
  --service test --service-version test1 \
  --message $'Hello world!\nat a()'

Попробуйте добавить подробности httpRequest в контексте.

Вы можете найти подробную информацию о полезной нагрузке JSON в документации. Родительским объектом в json является ErrorEvent

Вы можете начать оттуда и найти ссылки на его подэлементы ServiceContext и ErrorContext

Хотя я не пробовал параметр командной строки, я отладил классы журналирования стекового драйвера, которые мы используем в нашем приложении, чтобы выяснить, какую полезную нагрузку json мы отправляем, и вот пример json, запущенный из нашего приложения.

{
  "context": {
    "httpRequest": {
      "responseStatusCode": 500,
      "method": "GET",
      "url": "http://localhost:16500/product"
    },
    "user": "2247177"
  },
  "message": "org.springframework.web.client.HttpServerErrorException:  500 Server Error
  at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java: 94)
  ",
  "serviceContext": {
    "service": "cart",
    "version": ""
  }