Самоответ:
Я пытался найти легкий путь, но не было. Поэтому я решил снять свою ленивую задницу и научиться использовать @ google-cloud / logging, который, как упоминал Юрий Гринштейн.
Я нашел много примеров, но ни одного из них не было достаточно для этого случая. Наконец, я построил функцию, которая легко сообщает об ошибке с дополнительной информацией.
Важными моментами являются следующие:
- Чтобы отображать пользовательский журнал ошибок на консоли GCP как обычный журнал ошибок,он должен включать серьезность, регион, номер_процесса, идентификатор трассировки. Если их нет, консоль GCP не показывает их в фильтре по умолчанию. Также нельзя сгруппировать по тегу идентификатора выполнения.
- execute_id и идентификатор трассировки должны быть извлечены из запроса http. (Я не знаю, как получить их для функций другого типа триггера.)
Потребовалось время, но, наконец, отчеты об ошибках Stackdriver распознают и группируют каждый тип ошибки и успешно включают пользовательскую информацию в ошибку. полезная нагрузка журнала JSON. Это то, что я хотел.
Теперь я наконец могу вернуться к работе.
Вот суть, которую я сделал.
Вот главнаякод.
// https://firebase.google.com/docs/functions/reporting-errors#manually_reporting_errors
const { Logging } = require('@google-cloud/logging')
// Instantiates a client
const logging = new Logging()
module.exports = function reportError (err, context = {}, req = undefined) {
// Use Stackdriver only on production environment.
if (process.env.NODE_ENV !== 'production') {
return new Promise((resolve, reject) => {
console.error(err, context)
return resolve()
})
}
const log = logging.log('cloudfunctions.googleapis.com%2Fcloud-functions')
// https://cloud.google.com/logging/docs/api/ref_v2beta1/rest/v2beta1/MonitoredResource
const metadata = {
severity: 'ERROR',
resource: {
type: 'cloud_function',
labels: {
function_name: process.env.FUNCTION_NAME,
project: process.env.GCLOUD_PROJECT,
region: process.env.FUNCTION_REGION
}
}
}
// Extract execution_id, trace from http request
// https://stackoverflow.com/a/55642248/7908771
if (req) {
const traceId = req.get('x-cloud-trace-context').split('/')[0]
Object.assign(metadata, {
trace: `projects/${process.env.GCLOUD_PROJECT}/traces/${traceId}`,
labels: {
execution_id: req.get('function-execution-id')
}
})
}
// https://cloud.google.com/error-reporting/reference/rest/v1beta1/ErrorEvent
const errorEvent = {
message: err.stack,
serviceContext: {
service: process.env.FUNCTION_NAME,
resourceType: 'cloud_function'
},
context: context
}
// Write the error log entry
return new Promise((resolve, reject) => {
log.write(log.entry(metadata, errorEvent), (error) => {
if (error) {
return reject(error)
}
return resolve()
})
})
}
Снимок экрана результатов 10 запусков:
Страница сводки об ошибках отчетов об ошибках Stackdriver.
В журнале Stackdriver отображается ошибка с пользовательской информацией.