From fabdc94ff696923a5c6d3599a284a20b938a7cf8 Mon Sep 17 00:00:00 2001 From: Alicia Sykes Date: Thu, 29 Jun 2023 23:40:06 +0100 Subject: [PATCH] Adds lambda function for checking response times --- netlify.toml | 5 ++++ server/lambda/server-status.js | 51 ++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 server/lambda/server-status.js diff --git a/netlify.toml b/netlify.toml index 2f94baa..b8c33af 100644 --- a/netlify.toml +++ b/netlify.toml @@ -65,6 +65,11 @@ from = "/get-txt" to = "/.netlify/functions/get-txt" status = 301 + force = true +[[redirects]] + from = "/server-status" + to = "/.netlify/functions/server-status" + status = 301 force = true # For router history mode, ensure pages land on index diff --git a/server/lambda/server-status.js b/server/lambda/server-status.js new file mode 100644 index 0000000..a8b5e40 --- /dev/null +++ b/server/lambda/server-status.js @@ -0,0 +1,51 @@ +const https = require('https'); +const { performance, PerformanceObserver } = require('perf_hooks'); + +exports.handler = async function(event, context) { + const { url } = event.queryStringParameters; + + if (!url) { + return { + statusCode: 400, + body: JSON.stringify({ message: 'You must provide a URL query parameter!' }), + }; + } + + let dnsLookupTime; + let responseCode; + let startTime = performance.now(); + + const obs = new PerformanceObserver((items) => { + dnsLookupTime = items.getEntries()[0].duration; + performance.clearMarks(); + }); + + obs.observe({ entryTypes: ['measure'] }); + + performance.mark('A'); + + return new Promise((resolve) => { + https.get(url, (res) => { + let data = ''; + responseCode = res.statusCode; + res.on('data', (chunk) => { + data += chunk; + }); + res.on('end', () => { + performance.mark('B'); + performance.measure('A to B', 'A', 'B'); + let responseTime = performance.now() - startTime; + obs.disconnect(); + resolve({ + statusCode: 200, + body: JSON.stringify({ isUp: true, dnsLookupTime, responseTime, responseCode }), + }); + }); + }).on('error', (e) => { + resolve({ + statusCode: 500, + body: JSON.stringify({ isUp: false, error: e.message }), + }); + }); + }); +};