Ошибка функции Google Cloud - PubSub to BigQuery - PullRequest
0 голосов
/ 03 октября 2019

Я создал облачную функцию 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)

Ошибка: функция вышла за пределы области действия функции. Невозможно выполнить функцию.

Надеюсь, у меня будут какие-то отзывы по этому вопросу. Может быть, что-то делать с асинхронной задачей?

1 Ответ

2 голосов
/ 03 октября 2019

Это выглядит как потенциальная логическая ошибка в вашей driverLocationStatusProcessing функции:

try {
    ...
    return insertIntoBigQueryClient(logObject);
    // ^^ add return statement

Я не уверен, является ли это причиной вашей проблемы, но ваши комментарии указывают на потенциальное состояние гонки ("это происходит раз в миллион") и без этого return await не будет делать то, что вы ожидаете.

Это также может иметь значение: Не удалось загрузитьучетные данные по умолчанию? (Учебное пособие по Google Compute Engine для Node.js)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...