|
|
@ -1,9 +1,9 @@ |
|
|
|
const _ = require('lodash') |
|
|
|
const request = require('request-promise') |
|
|
|
const { createApolloFetch } = require('apollo-fetch') |
|
|
|
const bugsnag = require('@bugsnag/node') |
|
|
|
const { v4: uuid } = require('uuid') |
|
|
|
const qs = require('querystring') |
|
|
|
const os = require('os') |
|
|
|
const fs = require('fs-extra') |
|
|
|
|
|
|
|
/* global WIKI */ |
|
|
|
|
|
|
@ -30,67 +30,127 @@ module.exports = { |
|
|
|
|
|
|
|
if (_.get(WIKI.config, 'telemetry.isEnabled', false) === true && WIKI.config.offline !== true) { |
|
|
|
this.enabled = true |
|
|
|
this.sendOSInfo() |
|
|
|
this.sendInstanceEvent('STARTUP') |
|
|
|
} |
|
|
|
}, |
|
|
|
sendOSInfo() { |
|
|
|
this.sendBatchEvents([ |
|
|
|
{ |
|
|
|
eventCategory: 'node-version', |
|
|
|
eventAction: process.version |
|
|
|
}, |
|
|
|
{ |
|
|
|
eventCategory: 'os-platform', |
|
|
|
eventAction: os.platform() |
|
|
|
}, |
|
|
|
{ |
|
|
|
eventCategory: 'cpu-cores', |
|
|
|
eventAction: os.cpus().length |
|
|
|
}, |
|
|
|
{ |
|
|
|
eventCategory: 'db-type', |
|
|
|
eventAction: WIKI.config.db.type |
|
|
|
} |
|
|
|
]) |
|
|
|
}, |
|
|
|
sendError(err) { |
|
|
|
this.client.notify(err) |
|
|
|
}, |
|
|
|
sendEvent(eventCategory, eventAction, eventLabel) { |
|
|
|
this.sendBatchEvents([{ |
|
|
|
eventCategory, |
|
|
|
eventAction, |
|
|
|
eventLabel |
|
|
|
}]) |
|
|
|
// TODO
|
|
|
|
}, |
|
|
|
sendBatchEvents(events) { |
|
|
|
if (!this.enabled || WIKI.IS_DEBUG) { return false } |
|
|
|
request({ |
|
|
|
method: 'POST', |
|
|
|
url: WIKI.data.telemetry.GA_REMOTE, |
|
|
|
headers: { |
|
|
|
'Content-type': 'text/plain' |
|
|
|
}, |
|
|
|
body: events.map(ev => { |
|
|
|
return qs.stringify({ |
|
|
|
v: 1, // API version
|
|
|
|
tid: WIKI.data.telemetry.GA_ID, // Tracking ID
|
|
|
|
aip: 1, // Anonymize IP
|
|
|
|
ds: 'server', // Data source
|
|
|
|
cid: WIKI.telemetry.cid, // Client ID
|
|
|
|
t: 'event', // Hit Type
|
|
|
|
ec: ev.eventCategory, // Event Category
|
|
|
|
ea: ev.eventAction, // Event Action
|
|
|
|
el: ev.eventLabel // Event Label
|
|
|
|
}) |
|
|
|
}).join('\n') |
|
|
|
}).then(resp => { |
|
|
|
if (resp.status !== 200) { |
|
|
|
WIKI.logger.warn('Unable to send analytics telemetry request.') |
|
|
|
async sendInstanceEvent(eventType) { |
|
|
|
try { |
|
|
|
const apollo = createApolloFetch({ |
|
|
|
uri: WIKI.config.graphEndpoint |
|
|
|
}) |
|
|
|
|
|
|
|
// Platform detection
|
|
|
|
let platform = 'LINUX' |
|
|
|
let isDockerized = false |
|
|
|
let osname = `${os.type()} ${os.release()}` |
|
|
|
switch (os.platform()) { |
|
|
|
case 'win32': |
|
|
|
platform = 'WINDOWS' |
|
|
|
break |
|
|
|
case 'darwin': |
|
|
|
platform = 'MACOS' |
|
|
|
break |
|
|
|
default: |
|
|
|
platform = 'LINUX' |
|
|
|
isDockerized = await fs.pathExists('/.dockerenv') |
|
|
|
if (isDockerized) { |
|
|
|
osname = 'Docker' |
|
|
|
} |
|
|
|
break |
|
|
|
} |
|
|
|
}, err => { |
|
|
|
WIKI.logger.warn('Unable to send analytics telemetry request.') |
|
|
|
}) |
|
|
|
|
|
|
|
// DB Version detection
|
|
|
|
let dbVersion = 'Unknown' |
|
|
|
switch (WIKI.config.db.type) { |
|
|
|
case 'mariadb': |
|
|
|
case 'mysql': |
|
|
|
const resultMYSQL = await WIKI.models.knex.raw('SELECT VERSION() as version;') |
|
|
|
dbVersion = _.get(resultMYSQL, '[0][0].version', 'Unknown') |
|
|
|
break |
|
|
|
case 'mssql': |
|
|
|
const resultMSSQL = await WIKI.models.knex.raw('SELECT @@VERSION as version;') |
|
|
|
dbVersion = _.get(resultMSSQL, '[0].version', 'Unknown') |
|
|
|
break |
|
|
|
case 'postgres': |
|
|
|
dbVersion = _.get(WIKI.models, 'knex.client.version', 'Unknown') |
|
|
|
break |
|
|
|
case 'sqlite': |
|
|
|
dbVersion = _.get(WIKI.models, 'knex.client.driver.VERSION', 'Unknown') |
|
|
|
break |
|
|
|
} |
|
|
|
|
|
|
|
let arch = os.arch().toUpperCase() |
|
|
|
if (['ARM', 'ARM64', 'X32', 'X64'].indexOf(arch) < 0) { |
|
|
|
arch = 'OTHER' |
|
|
|
} |
|
|
|
|
|
|
|
// Send Event
|
|
|
|
const respStrings = await apollo({ |
|
|
|
query: `mutation (
|
|
|
|
$version: String! |
|
|
|
$platform: TelemetryPlatform! |
|
|
|
$os: String! |
|
|
|
$architecture: TelemetryArchitecture! |
|
|
|
$dbType: TelemetryDBType! |
|
|
|
$dbVersion: String! |
|
|
|
$nodeVersion: String! |
|
|
|
$cpuCores: Int! |
|
|
|
$ramMBytes: Int!, |
|
|
|
$clientId: String!, |
|
|
|
$event: TelemetryInstanceEvent! |
|
|
|
) { |
|
|
|
telemetry { |
|
|
|
instance( |
|
|
|
version: $version |
|
|
|
platform: $platform |
|
|
|
os: $os |
|
|
|
architecture: $architecture |
|
|
|
dbType: $dbType |
|
|
|
dbVersion: $dbVersion |
|
|
|
nodeVersion: $nodeVersion |
|
|
|
cpuCores: $cpuCores |
|
|
|
ramMBytes: $ramMBytes |
|
|
|
clientId: $clientId |
|
|
|
event: $event |
|
|
|
) { |
|
|
|
responseResult { |
|
|
|
succeeded |
|
|
|
errorCode |
|
|
|
slug |
|
|
|
message |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
}`,
|
|
|
|
variables: { |
|
|
|
version: WIKI.version, |
|
|
|
platform, |
|
|
|
os: osname, |
|
|
|
architecture: arch, |
|
|
|
dbType: WIKI.config.db.type.toUpperCase(), |
|
|
|
dbVersion, |
|
|
|
nodeVersion: process.version.substr(1), |
|
|
|
cpuCores: os.cpus().length, |
|
|
|
ramMBytes: Math.round(os.totalmem() / 1024 / 1024), |
|
|
|
clientId: WIKI.config.telemetry.clientId, |
|
|
|
event: eventType |
|
|
|
} |
|
|
|
}) |
|
|
|
const telemetryResponse = _.get(respStrings, 'data.telemetry.instance.responseResult', { succeeded: false, message: 'Unexpected Error' }) |
|
|
|
if (!telemetryResponse.succeeded) { |
|
|
|
WIKI.logger.warn('Failed to send instance telemetry: ' + telemetryResponse.message) |
|
|
|
} else { |
|
|
|
WIKI.logger.info('Telemetry is active: [ OK ]') |
|
|
|
} |
|
|
|
} catch (err) { |
|
|
|
WIKI.logger.warn(err) |
|
|
|
} |
|
|
|
}, |
|
|
|
generateClientId() { |
|
|
|
_.set(WIKI.config, 'telemetry.clientId', uuid()) |
|
|
|