diff --git a/bin/testObservability/helper/cleanupQueueSync.js b/bin/testObservability/helper/cleanupQueueSync.js new file mode 100644 index 00000000..aa2603f4 --- /dev/null +++ b/bin/testObservability/helper/cleanupQueueSync.js @@ -0,0 +1,13 @@ +/** + * Sending all the remaining queues for synchronous manner + */ + +const RequestQueueHandler = require('./requestQueueHandler'); + +const shutdown = async () => { + const requestHandler = new RequestQueueHandler(); + requestHandler.queue = require(process.argv[2].trim()); + await requestHandler.shutdown(); +} + +shutdown(); diff --git a/bin/testObservability/helper/constants.js b/bin/testObservability/helper/constants.js index 63bf08d1..dbf5e053 100644 --- a/bin/testObservability/helper/constants.js +++ b/bin/testObservability/helper/constants.js @@ -32,3 +32,5 @@ exports.OBSERVABILITY_ENV_VARS = [ exports.TEST_OBSERVABILITY_REPORTER = 'browserstack-cypress-cli/bin/testObservability/reporter'; exports.TEST_OBSERVABILITY_REPORTER_LOCAL = path.join(__dirname, '..', 'reporter'); + +exports.PENDING_QUEUES_FILE = `pending_queues_${process.pid}.json`; diff --git a/bin/testObservability/helper/helper.js b/bin/testObservability/helper/helper.js index deacff95..6db43d87 100644 --- a/bin/testObservability/helper/helper.js +++ b/bin/testObservability/helper/helper.js @@ -2,7 +2,7 @@ const fs = require('fs'); const path = require('path'); const http = require('http'); const https = require('https'); -const request = require('request'); +const request = require('requestretry'); const { v4: uuidv4 } = require('uuid'); const os = require('os'); const { promisify } = require('util'); @@ -114,7 +114,8 @@ const nodeRequest = (type, url, data, config) => { url: `${API_URL}/${url}`, body: data, json: config.headers['Content-Type'] === 'application/json', - agent: this.httpsKeepAliveAgent + agent: this.httpsKeepAliveAgent, + maxAttempts: 2 }}; if(url === exports.requestQueueHandler.screenshotEventUrl) { diff --git a/bin/testObservability/helper/requestQueueHandler.js b/bin/testObservability/helper/requestQueueHandler.js index 2387f7f0..172384f2 100644 --- a/bin/testObservability/helper/requestQueueHandler.js +++ b/bin/testObservability/helper/requestQueueHandler.js @@ -1,5 +1,9 @@ -const { BATCH_SIZE, BATCH_INTERVAL, consoleHolder } = require('./constants'); -const { debug, batchAndPostEvents } = require('./helper'); +const fs = require('fs'); +const cp = require('child_process'); +const path = require('path'); + +const { BATCH_SIZE, BATCH_INTERVAL, PENDING_QUEUES_FILE } = require('./constants'); +const { batchAndPostEvents } = require('./helper'); class RequestQueueHandler { constructor() { @@ -48,6 +52,15 @@ class RequestQueueHandler { } } + shutdownSync = () => { + this.removeEventBatchPolling('REMOVING'); + + fs.writeFileSync(path.join(__dirname, PENDING_QUEUES_FILE), JSON.stringify(this.queue)); + this.queue = []; + cp.spawnSync('node', [path.join(__dirname, 'cleanupQueueSync.js'), path.join(__dirname, PENDING_QUEUES_FILE)], {stdio: 'inherit'}); + fs.unlinkSync(path.join(__dirname, PENDING_QUEUES_FILE)); + } + shutdown = async () => { this.removeEventBatchPolling('REMOVING'); while(this.queue.length > 0) { diff --git a/bin/testObservability/plugin/ipcServer.js b/bin/testObservability/plugin/ipcServer.js index 08c4dd9a..16fc7236 100644 --- a/bin/testObservability/plugin/ipcServer.js +++ b/bin/testObservability/plugin/ipcServer.js @@ -1,5 +1,6 @@ const ipc = require('node-ipc'); const { consoleHolder } = require('../helper/constants'); +const { requestQueueHandler } = require('../helper/helper'); exports.startIPCServer = (subscribeServerEvents, unsubscribeServerEvents) => { if (ipc.server) { @@ -26,6 +27,9 @@ exports.startIPCServer = (subscribeServerEvents, unsubscribeServerEvents) => { process.on('exit', () => { unsubscribeServerEvents(ipc.server); ipc.server.stop(); + // Cleaning up all remaining event in request queue handler. Any synchronous operations + // on exit handler will block the process + requestQueueHandler.shutdownSync(); }); }); diff --git a/bin/testObservability/reporter/index.js b/bin/testObservability/reporter/index.js index 33c515f6..59ddc7b5 100644 --- a/bin/testObservability/reporter/index.js +++ b/bin/testObservability/reporter/index.js @@ -186,7 +186,6 @@ class MyReporter { } await this.uploadTestSteps(); - await requestQueueHandler.shutdown(); }); }