GCP, stdout пуст при чтении журналов облачных функций с помощью nodejs - PullRequest
0 голосов
/ 13 сентября 2018

Вот мой код nodejs:

const cp = require('child_process');

describe('cloud function test suites', () => {
  describe('deleteCampaign test suites', () => {
    const cloudFunctionName = 'deleteCampaign';
    it('should print campaign data', () => {
      const campaign = { id: '1' };
      const encodedCampaign = Buffer.from(JSON.stringify(campaign)).toString(
        'base64',
      );
      const data = JSON.stringify({ data: encodedCampaign });

      const executeResultOutput = cp
        .execSync(
          `gcloud beta functions call ${cloudFunctionName} --data '${data}'`,
        )
        .toString();

      const executionId = executeResultOutput.split(': ')[1];

      const logs = cp
        .execSync(
          `gcloud beta functions logs read ${cloudFunctionName} --execution-id ${executionId}`,
        )
        .toString();

      console.log(logs);

      expect(logs).toContain('campaign:  {"id":"1"}');
    });
  });
});

Я хочу напечатать журналы на стандартный вывод, но журналы - пустая строка.

Но когда я читаю логи, используя gcloud командную строку, это нормально. Стандартный вывод правильный:

gcloud beta functions logs read deleteCampaign --execution-id ee5owvtzlekc
LEVEL  NAME            EXECUTION_ID  TIME_UTC                 LOG
D      deleteCampaign  ee5owvtzlekc  2018-09-13 12:46:17.734  Function execution started
I      deleteCampaign  ee5owvtzlekc  2018-09-13 12:46:17.738  campaign:  {"id":"1"}
D      deleteCampaign  ee5owvtzlekc  2018-09-13 12:46:17.742  Function execution took 9 ms, finished with status: 'ok'

Я использую jest и nodejs, чтобы написать несколько тестов для моих облачных функций. Почему в логах пустая строка?

1 Ответ

0 голосов
/ 27 декабря 2018

Строка, которую вы пытаетесь получить, пуста, потому что журналы генерируют немного больше времени.Несмотря на то, что облачная функция Google завершила работу, вам придется подождать несколько секунд, пока журналы не будут готовы.

Читая ваш код, вы не позволяете этому случиться, поэтому вы получаете пустую строку.

Первое, что я заметил при чтении вашего кода, была эта часть:

const executionId = executeResultOutput.split(': ')[1];

Я понимаю, что вы хотите извлечь идентификатор выполнения функции Google Cloud Function.У меня были проблемы, потому что строка не была ограничена идентификатором выполнения, она также включала символ новой строки и слово «результат».Я удостоверился, что нужно просто извлечь необходимый код выполнения со следующим кодом:

const executionId = executeResultOutput.split(':')[1]; //We get the GCP ID. 
const executionId2 = executionId.split("\n")[0].toString(); //removing the right part of the string. 

Если вы нашли способ получить идентификатор выполнения без проблем, тогда игнорируйте мой код.

Ниже вы можете найти код, который работал для меня, реализуя функции.

let cloudFunctionLog ='';

function getLogs(){
    console.log('Trying to get logs...');
    const logs = cp
    .execSync(`gcloud beta functions logs read ${cloudFunctionName} --execution-id ${executionId2}`);
    return logs;
}

do{
    cloudFunctionLog=getLogs();
    if(!cloudFunctionLog){
        console.log('Logs are not ready yet...');
    }else{
        console.log(`${cloudFunctionLog}`);
    }
}while(!cloudFunctionLog);//Do it while the string comes empty.

Когда журналы больше не пусты, они будут отображаться в вашей консоли.

...