繁体   English   中英

谷歌云 Function 错误 - 发布订阅到 BigQuery

[英]Google Cloud Function Error - PubSub to BigQuery

我创建了一个带有 Pub/Sub 触发器(由 Stackdriver 接收器触发)的 Google Cloud Function。 然后它会更改此数据的格式并将其保存到 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'

现在,这个 function 工作正常,但有时会出现一些不知从何而来的错误。 如下所示:

错误:无法加载默认凭据。 浏览到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 (internal/process/next_tick.js:229:7)

错误:function 因请求而崩溃 scope Function 无法执行。

我希望我能就此事得到一些反馈。 也许与异步任务有关?

这看起来像是您的driverLocationStatusProcessing function 中的潜在逻辑错误:

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

我不确定这是否是您的问题的原因,但您的评论指出了潜在的竞争条件(“它像百万分之一一样发生”)并且没有那个returnawait不会做你期望它做的事情.

这也可能是相关的:无法加载默认凭据? (Node.js 谷歌计算引擎教程)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM