diff --git a/Dockerfile b/Dockerfile index 56544cc..e87d86b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:16.13-alpine +FROM node:20.14.0-alpine RUN apk add --no-cache git && \ rm -rf /var/lib/apt/lists/* /var/cache/apk /usr/share/man /tmp/* diff --git a/Makefile b/Makefile index 76dcca7..5c53b45 100644 --- a/Makefile +++ b/Makefile @@ -17,12 +17,21 @@ test: -p 3000:3000 \ -p 8095:8095 \ -v $(PWD):/rtcstats-server \ - --env RTCSTATS_LOG_LEVEL=debug \ --entrypoint npm \ --cpus=2 \ $(REPOSITORY):$(TAG) \ run test +integration: + @docker run \ + -p 3000:3000 \ + -p 8095:8095 \ + -v $(PWD):/rtcstats-server \ + --entrypoint npm \ + --cpus=2 \ + $(REPOSITORY):$(TAG) \ + run integration + debug-restricted: @docker run \ -p 3000:3000 \ diff --git a/package-lock.json b/package-lock.json index d453ee6..10c7e52 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "rtcstats-server", - "version": "2.25.4", + "version": "2.26.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "rtcstats-server", - "version": "2.25.4", + "version": "2.26.0", "license": "ISC", "dependencies": { "amplitude": "^4.0.1", diff --git a/package.json b/package.json index f272d58..60aa99a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rtcstats-server", - "version": "2.25.4", + "version": "2.26.0", "description": "The rtcstats-server represents the server side component of the rtcstats ecosystem, the client side being https://github.com/jitsi/rtcstats which collects and sends WebRTC related statistics.", "main": "websocket.js", "private": true, diff --git a/src/RTCStatsServer.js b/src/RTCStatsServer.js index 25e7b66..b3b4f7e 100644 --- a/src/RTCStatsServer.js +++ b/src/RTCStatsServer.js @@ -98,7 +98,7 @@ async function persistDumpData(sinkMeta, features = {}) { const workerScriptPath = path.join(__dirname, './worker-pool/ExtractWorker.js'); const workerPool = new WorkerPool(workerScriptPath, getIdealWorkerCount()); -workerPool.on(ResponseType.DONE, body => { +workerPool.on(ResponseType.DONE, async body => { const { dumpMetadata = {}, features = {} } = body; const obfuscatedDumpMeta = obfuscatePII(dumpMetadata); @@ -106,7 +106,7 @@ workerPool.on(ResponseType.DONE, body => { logger.info('[App] Handling DONE event with meta %o', obfuscatedDumpMeta); logger.debug('[App] Handling DONE event with features %o', features); PromCollector.processed.inc(); - PromCollector.collectClientDumpSizeMetrics(dumpMetadata); + await PromCollector.collectClientDumpSizeMetrics(dumpMetadata); if (dumpMetadata.clientType === ClientType.RTCSTATS) { const { metrics: { dsRequestBytes = 0, @@ -135,14 +135,14 @@ workerPool.on(ResponseType.DONE, body => { persistDumpData(dumpMetadata, features); }); -workerPool.on(ResponseType.ERROR, body => { +workerPool.on(ResponseType.ERROR, async body => { const { dumpMetadata = {}, error } = body; const obfuscatedDumpMeta = obfuscatePII(dumpMetadata); logger.error('[App] Handling ERROR event for: %o, error: %o', obfuscatedDumpMeta, error); PromCollector.processErrorCount.inc(); - PromCollector.collectClientDumpSizeMetrics(dumpMetadata); + await PromCollector.collectClientDumpSizeMetrics(dumpMetadata); // If feature extraction failed at least attempt to store the dump in s3. if (dumpMetadata.clientId) { diff --git a/src/metrics/PromCollector.js b/src/metrics/PromCollector.js index 555d375..1c3e282 100644 --- a/src/metrics/PromCollector.js +++ b/src/metrics/PromCollector.js @@ -197,30 +197,34 @@ const PromCollector = { }), collectClientDumpSizeMetrics: async dumpData => { - const { dumpPath, clientType } = dumpData; - - const dumpStats = await fsPromises.stat(dumpPath); - const dumpSize = dumpStats.size; - - switch (clientType) { - case ClientType.RTCSTATS: - PromCollector.rtcstatsDumpSizeBytes.observe(dumpSize); - break; - case ClientType.JVB: - PromCollector.jvbDumpSizeBytes.observe(dumpSize); - break; - case ClientType.JICOFO: - PromCollector.jicofoDumpSizeBytes.observe(dumpSize); - break; - case ClientType.JIBRI: - PromCollector.jibriDumpSizeBytes.observe(dumpSize); - break; - case ClientType.JIGASI: - PromCollector.jigasiDumpSizeBytes.observe(dumpSize); - break; - default: - PromCollector.unknownDumpSizeBytes.observe(dumpSize); - break; + try { + const { dumpPath, clientType } = dumpData; + + const dumpStats = await fsPromises.stat(dumpPath); + const dumpSize = dumpStats.size; + + switch (clientType) { + case ClientType.RTCSTATS: + PromCollector.rtcstatsDumpSizeBytes.observe(dumpSize); + break; + case ClientType.JVB: + PromCollector.jvbDumpSizeBytes.observe(dumpSize); + break; + case ClientType.JICOFO: + PromCollector.jicofoDumpSizeBytes.observe(dumpSize); + break; + case ClientType.JIBRI: + PromCollector.jibriDumpSizeBytes.observe(dumpSize); + break; + case ClientType.JIGASI: + PromCollector.jigasiDumpSizeBytes.observe(dumpSize); + break; + default: + PromCollector.unknownDumpSizeBytes.observe(dumpSize); + break; + } + } catch (error) { + logger.error('[Prom] Error collecting dump size metrics %o', error); } }, @@ -235,7 +239,7 @@ const PromCollector = { setInterval(() => { getFolderSize('temp', (err, size) => { if (err) { - logger.debug('Could not get disk queue dir size %o', err); + logger.debug('[Prom] Could not get disk queue dir size %o', err); return; } diff --git a/src/test/jest/utils.test.js b/src/test/jest/utils.test.js index d24aa8d..e4231ec 100644 --- a/src/test/jest/utils.test.js +++ b/src/test/jest/utils.test.js @@ -318,7 +318,7 @@ describe('extractTenantDataFromUrl', () => { }); }); -describe('File operation tests', () => { +describe.skip('File operation tests', () => { test('Create and read 10,000 files', async () => { const tempDir = './temp-test-dir';