diff --git a/package-lock.json b/package-lock.json index b572512..8247a34 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@openally/timestore": "^1.5.1", "fastify": "^4.26.2", "pino-pretty": "^11.0.0", + "ua-parser-js": "^1.0.37", "undici": "^6.10.1", "zod": "^3.22.4" }, @@ -4045,6 +4046,28 @@ "node": ">=14.17" } }, + "node_modules/ua-parser-js": { + "version": "1.0.37", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz", + "integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "engines": { + "node": "*" + } + }, "node_modules/undici": { "version": "6.11.1", "resolved": "https://registry.npmjs.org/undici/-/undici-6.11.1.tgz", diff --git a/package.json b/package.json index 83c3ede..9d76676 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "@openally/timestore": "^1.5.1", "fastify": "^4.26.2", "pino-pretty": "^11.0.0", + "ua-parser-js": "^1.0.37", "undici": "^6.10.1", "zod": "^3.22.4" }, diff --git a/src/server.ts b/src/server.ts index 9d89e32..4fa8c76 100644 --- a/src/server.ts +++ b/src/server.ts @@ -5,6 +5,7 @@ import https from "node:https"; // Import Third-party Dependencies import fastify, { FastifyHttpOptions, FastifyHttpsOptions, FastifyInstance } from "fastify"; import proxy from "@fastify/http-proxy"; +import UAParser from "ua-parser-js"; import { getGlobalDispatcher } from "undici"; // Import Internal Dependencies @@ -22,8 +23,13 @@ export function buildServer( server.log.info(`GRAFANA_URL: ${context.grafanaApi}`); server.addHook("onRequest", async(request) => { + const userAgent = new UAParser(request.headers["user-agent"]) + .getResult(); + if (request.method !== "OPTIONS") { - request.log.info(`(${request.id}) receiving request "${request.method} ${request.raw.url}"`); + const uaLog = formatUserAgentLog(userAgent); + + request.log.info(`(${request.id}|${uaLog}) receiving request "${request.method} ${request.raw.url}"`); } }); @@ -61,3 +67,9 @@ export function buildServer( return server; } + +function formatUserAgentLog(parsedUserAgent: UAParser.IResult): string { + const { browser: uaBrowser, os: uaOs } = parsedUserAgent; + + return (uaBrowser.name && uaOs.name) ? `${uaOs.name}/${uaBrowser.name}` : parsedUserAgent.ua; +}