diff --git a/services/web/app/src/infrastructure/ExpressLocals.js b/services/web/app/src/infrastructure/ExpressLocals.js index ede2532e25..e3aac6f390 100644 --- a/services/web/app/src/infrastructure/ExpressLocals.js +++ b/services/web/app/src/infrastructure/ExpressLocals.js @@ -122,7 +122,8 @@ module.exports = function (webRouter, privateApiRouter, publicApiRouter) { const cdnAvailable = Settings.cdn && Settings.cdn.web && !!Settings.cdn.web.host - const cdnBlocked = req.query.nocdn === 'true' || req.session.cdnBlocked + const cdnBlocked = + req.query.nocdn === 'true' || req.session.cdnBlocked || false const userId = SessionManager.getLoggedInUserId(req.session) if (cdnBlocked && req.session.cdnBlocked == null) { logger.debug( @@ -135,6 +136,10 @@ module.exports = function (webRouter, privateApiRouter, publicApiRouter) { }) req.session.cdnBlocked = true } + Metrics.inc('cdn_blocked', 1, { + path: userId ? 'logged-in' : 'pre-login', + method: String(cdnBlocked), + }) const host = req.headers && req.headers.host const isSmoke = host.slice(0, 5).toLowerCase() === 'smoke' if (cdnAvailable && !isSmoke && !cdnBlocked) { diff --git a/services/web/test/acceptance/config/settings.test.defaults.js b/services/web/test/acceptance/config/settings.test.defaults.js index bf8e095ba4..f292b33cf0 100644 --- a/services/web/test/acceptance/config/settings.test.defaults.js +++ b/services/web/test/acceptance/config/settings.test.defaults.js @@ -23,6 +23,11 @@ module.exports = { : ['example.com'], statusPageUrl: 'status.example.com', + cdn: { + web: { + host: 'cdn.example.com', + }, + }, apis: { linkedUrlProxy: { diff --git a/services/web/test/acceptance/src/CDNMigrationTests.js b/services/web/test/acceptance/src/CDNMigrationTests.js new file mode 100644 index 0000000000..3d44412ce6 --- /dev/null +++ b/services/web/test/acceptance/src/CDNMigrationTests.js @@ -0,0 +1,95 @@ +const { expect } = require('chai') +const User = require('./helpers/User').promises +const { + promises: { getMetric }, +} = require('./helpers/metrics') + +describe('CDNMigration', function () { + let anon, user + beforeEach(async function () { + anon = new User() + user = new User() + await user.login() + }) + let noCdnPreLogin, noCdnLoggedIn + let cdnBlockedTruePreLogin, cdnBlockedTrueLoggedIn + let cdnBlockedFalsePreLogin, cdnBlockedFalseLoggedIn + + async function getNoCdn(path) { + return await getMetric( + line => line.includes('no_cdn') && line.includes(path) + ) + } + async function getCdnBlocked(path, method) { + return await getMetric( + line => + line.includes('cdn_blocked') && + line.includes(`path="${path}"`) && + line.includes(`method="${method}"`) + ) + } + + beforeEach(async function () { + noCdnPreLogin = await getNoCdn('pre-login') + noCdnLoggedIn = await getNoCdn('logged-in') + cdnBlockedTruePreLogin = await getCdnBlocked('pre-login', 'true') + cdnBlockedTrueLoggedIn = await getCdnBlocked('logged-in', 'true') + cdnBlockedFalsePreLogin = await getCdnBlocked('pre-login', 'false') + cdnBlockedFalseLoggedIn = await getCdnBlocked('logged-in', 'false') + }) + + describe('pre-login', function () { + it('should collect no_cdn', async function () { + await anon.doRequest('GET', '/login?nocdn=true') + expect(await getNoCdn('pre-login')).to.equal(noCdnPreLogin + 1) + }) + it('should collect cdn_blocked', async function () { + await anon.doRequest('GET', '/login') + await anon.doRequest('GET', '/login') + await anon.doRequest('GET', '/login') + expect(await getCdnBlocked('pre-login', 'false')).to.equal( + cdnBlockedFalsePreLogin + 3 + ) + expect(await getCdnBlocked('pre-login', 'true')).to.equal( + cdnBlockedTruePreLogin + ) + }) + it('should collect cdn_blocked after nocdn', async function () { + await anon.doRequest('GET', '/login?nocdn=true') + await anon.doRequest('GET', '/login') + expect(await getCdnBlocked('pre-login', 'false')).to.equal( + cdnBlockedFalsePreLogin + ) + expect(await getCdnBlocked('pre-login', 'true')).to.equal( + cdnBlockedTruePreLogin + 2 + ) + }) + }) + describe('logged-in', function () { + it('should collect no_cdn', async function () { + await user.doRequest('GET', '/project?nocdn=true') + expect(await getNoCdn('logged-in')).to.equal(noCdnLoggedIn + 1) + }) + it('should collect cdn_blocked=false before nocdn', async function () { + await user.doRequest('GET', '/project') + await user.doRequest('GET', '/project') + await user.doRequest('GET', '/project') + expect(await getCdnBlocked('logged-in', 'false')).to.equal( + cdnBlockedFalseLoggedIn + 3 + ) + expect(await getCdnBlocked('logged-in', 'true')).to.equal( + cdnBlockedTrueLoggedIn + ) + }) + it('should collect cdn_blocked=true after nocdn=true', async function () { + await user.doRequest('GET', '/project?nocdn=true') + await user.doRequest('GET', '/project') + expect(await getCdnBlocked('logged-in', 'false')).to.equal( + cdnBlockedFalseLoggedIn + ) + expect(await getCdnBlocked('logged-in', 'true')).to.equal( + cdnBlockedTrueLoggedIn + 2 + ) + }) + }) +})