Skip to content

Commit

Permalink
feat(user-event): Add browser & OS info to user events
Browse files Browse the repository at this point in the history
Implements #673
  • Loading branch information
Göran Sander committed Nov 26, 2023
1 parent 5298866 commit 396b76d
Show file tree
Hide file tree
Showing 6 changed files with 74 additions and 4 deletions.
23 changes: 23 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
"prom-client": "^14.2.0",
"qrs-interact": "^6.3.1",
"systeminformation": "^5.21.18",
"ua-parser-js": "^1.0.37",
"uuid": "^9.0.1",
"winston": "^3.11.0",
"winston-daily-rotate-file": "^4.7.1",
Expand Down
4 changes: 4 additions & 0 deletions src/lib/post-to-influxdb.js
Original file line number Diff line number Diff line change
Expand Up @@ -428,6 +428,10 @@ function postUserEventToInfluxdb(msg) {
origin: msg.origin,
appId: msg.appId,
appName: msg.appName,
uaBrowserName: msg.ua.browser.name,
uaBrowserMajorVersion: msg.ua.browser.major,
uaOsName: msg.ua.os.name,
uaOsVersion: msg.ua.os.version,
};

// Add custom tags from config file to payload
Expand Down
4 changes: 4 additions & 0 deletions src/lib/post-to-mqtt.js
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,10 @@ function postUserEventToMQTT(msg) {
origin: msg.origin,
appId: msg.appId,
appName: msg.appName,
uaBrowserName: msg.ua.browser.name,
uaBrowserMajorVersion: msg.ua.browser.major,
uaOsName: msg.ua.os.name,
uaOsVersion: msg.ua.os.version,
context: msg.context,
message: msg.message,
tags: {},
Expand Down
8 changes: 8 additions & 0 deletions src/lib/post-to-new-relic.js
Original file line number Diff line number Diff line change
Expand Up @@ -710,6 +710,10 @@ async function postUserEventToNewRelic(msg) {
qs_origin: msg.origin,
qs_appId: msg.appId,
qs_appName: msg.appName,
qs_uaBrowserName: msg.ua.browser.name,
qs_uaBrowserMajorVersion: msg.ua.browser.major,
qs_uaOsName: msg.ua.os.name,
qs_uaOsVersion: msg.ua.os.version,
};
} else {
attributes = {
Expand All @@ -722,6 +726,10 @@ async function postUserEventToNewRelic(msg) {
qs_origin: msg.origin,
qs_appId: msg.appId,
qs_appName: msg.appName,
qs_uaBrowserName: msg.ua.browser.name,
qs_uaBrowserMajorVersion: msg.ua.browser.major,
qs_uaOsName: msg.ua.os.name,
qs_uaOsVersion: msg.ua.os.version,
};
}

Expand Down
38 changes: 34 additions & 4 deletions src/lib/udp_handlers_user_activity.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/* eslint-disable no-unused-vars */
const { validate } = require('uuid');
const parser = require('ua-parser-js');

// Load global variables and functions
const globals = require('../globals');
Expand Down Expand Up @@ -41,14 +42,22 @@ function udpInitUserActivityServer() {

globals.logger.debug(`USER EVENT (raw): ${message.toString()}`);

// First 7 fields are separated by ;
// 8th field (message) can contain ; and single quotes. Handle with care
const msgTmp1 = message.toString().split(';');

// Get first 7 fields
const msg = msgTmp1.slice(0, 7);

globals.logger.verbose(`USER EVENT: ${msg[0]} - ${msg[4]} - ${msg[6]}`);
// Get field 8
// Get all text after the 7th ;
const msgTmp2 = msgTmp1.slice(7, msgTmp1.length);
const msgTmp3 = msgTmp2.join(';');

// Add field 8 to the message array
msg.push(msgTmp3);

// console.log('--------------------------------------------------');
// console.log(`USER: ${msg}`);
// console.log(`${msg[0]} - ${msg[4]} - ${msg[6]}`);
globals.logger.verbose(`USER EVENT: ${msg[0]} - ${msg[4]} - ${msg[6]}`);

// Clean up the first message field (=message source)
// Remove leading and trailing /
Expand Down Expand Up @@ -126,6 +135,27 @@ function udpInitUserActivityServer() {
}
}

// Is there a user agent (browser etc) in the message?
// The user starts with UserAgent: and uses rest of the message
if (msgObj?.message?.includes('UserAgent:')) {
let userAgent = msgObj.message.split('UserAgent:')[1];

// Remove leading and trailing spaces and single quotes
userAgent = userAgent.trim();
userAgent = userAgent.replace(/'/g, '');

// Parse the user agent string
const ua = parser(userAgent);

msgObj.ua = {};
msgObj.ua.browser = ua.browser;
msgObj.ua.cpu = ua.cpu;
msgObj.ua.device = ua.device;
msgObj.ua.engine = ua.engine;
msgObj.ua.os = ua.os;
msgObj.ua.ua = ua.ua;
}

// Post to MQTT
if (
((globals.config.has('Butler-SOS.mqttConfig.enableMQTT') &&
Expand Down

0 comments on commit 396b76d

Please sign in to comment.