diff --git a/lib/collector/serverless.js b/lib/collector/serverless.js index 462239f03a..02f59acddc 100644 --- a/lib/collector/serverless.js +++ b/lib/collector/serverless.js @@ -246,6 +246,8 @@ class ServerlessCollector { ]) + '\n' if (sync) { + const s = process.stdout + s._handle && s._handle.setBlocking && s._handle.setBlocking(true) fs.writeSync(process.stdout.fd, serializedPayload) } else { process.stdout.write(serializedPayload) diff --git a/test/unit/collector/serverless.test.js b/test/unit/collector/serverless.test.js index 6d305f0229..2a07774d19 100644 --- a/test/unit/collector/serverless.test.js +++ b/test/unit/collector/serverless.test.js @@ -153,11 +153,12 @@ describe('ServerlessCollector API', () => { describe('#flushPayload', () => { let logStub = null - before(() => { - logStub = sinon.stub(process.stdout, 'write').callsFake(() => {}) + beforeEach(() => { + logStub = sinon.stub(process.stdout, 'write').callsFake(() => { + }) }) - after(() => { + afterEach(() => { logStub.restore() }) @@ -172,5 +173,23 @@ describe('ServerlessCollector API', () => { done() }) }) + it('handles very large payload and writes formatted to stdout', done => { + api.payload = {type: 'test payload'} + for (let i = 0; i < 4096; i++) { + api.payload[`customMetric${i}`] = Math.floor(Math.random() * 100000) + } + + api.flushPayload(() => { + const logPayload = JSON.parse(logStub.getCall(0).args[0]) + const buf = Buffer.from(logPayload[2], 'base64') + zlib.gunzip(buf, (err, unpack) => { + expect(err).to.be.null + const payload = JSON.parse(unpack) + expect(payload.data).to.be.ok + expect(Object.keys(payload.data)).to.have.lengthOf.above(4000) + done() + }) + }) + }) }) })