Я создал облачную функцию Google с триггером Pub / Sub (запускается приемником Stackdriver). Затем он меняет формат этих данных и сохраняет его в BigQuery.
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();
const environment= process.env.ENVIRONMENT || 'Dev';
insertIntoBigQueryClient = async (locationObject) => {
const metadata = locationObject.jsonPayload.metadata;
const row = [{
driverId: metadata.driverId,
driverPhone: metadata.driverPhone,
driverStatus: metadata.driverStatus,
driverLocation: metadata.driverLocation.coordinates,
timestamp: locationObject.timestamp
}];
// Insert data into a table
return await bigquery
.dataset(`YassirBackendLogging${environment}`)
.table('DriverLocationStatus')
.insert(row);
};
driverLocationStatusProcessing = async (pubSubEvent, context) => {
try {
const logObject = JSON.parse(Buffer.from(pubSubEvent.data, 'base64').toString());
insertIntoBigQueryClient(logObject);
} catch(error){
console.error(error);
}
};
// this part is only to have multi functions. one for each envirenment
switch (environment) {
case 'Prod' :
exports.driverLocationStatusProcessingProd = async (pubSubEvent, context) => {
await driverLocationStatusProcessing(pubSubEvent, context);
};
break;
case 'Dev' :
exports.driverLocationStatusProcessingDev = async (pubSubEvent, context) => {
await driverLocationStatusProcessing(pubSubEvent, context);
};
break;
default :
exports.driverLocationStatusProcessingDev = async (pubSubEvent, context) => {
await driverLocationStatusProcessing(pubSubEvent, context);
};
break;
}
И это код облачной сборки
steps:
- name: 'gcr.io/cloud-builders/gcloud'
args:
- functions
- deploy
- 'driverLocationStatusProcessing$_ENVIRONMENT'
- '--set-env-vars'
- ENVIRONMENT=$_ENVIRONMENT
- '--trigger-topic'
- 'DriverLocationStatus$_ENVIRONMENT'
- '--runtime'
- nodejs8
- '--timeout=540'
dir: 'driver-location-status'
Теперь эта функция работает отлично, но время от времени появляются ошибки из-за отсутствия. например:
Ошибка: не удалось загрузить учетные данные по умолчанию. Перейдите к https://cloud.google.com/docs/authentication/getting-started для получения дополнительной информации. в GoogleAuth.getApplicationDefaultAsync (/srv/node_modules/google-auth-library/build/src/auth/googleauth.js:161:19) по адресу process._tickDomainCallback (внутренний / process / next_tick.js: 229: 7)
Ошибка: функция вышла за пределы области действия функции. Невозможно выполнить функцию.
Надеюсь, у меня будут какие-то отзывы по этому вопросу. Может быть, что-то делать с асинхронной задачей?