Отчеты об ошибках 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": ""
}