From 71be4660bf29f0782a65502de8f480376ac274f1 Mon Sep 17 00:00:00 2001 From: NGPixel Date: Thu, 16 Apr 2020 20:38:28 -0400 Subject: [PATCH] fix: use new telemetry endpoint --- server/core/telemetry.js | 170 ++++++++++++++++++++++++++------------- server/setup.js | 10 ++- 2 files changed, 122 insertions(+), 58 deletions(-) diff --git a/server/core/telemetry.js b/server/core/telemetry.js index 3c4dcab5..a43035cc 100644 --- a/server/core/telemetry.js +++ b/server/core/telemetry.js @@ -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()) diff --git a/server/setup.js b/server/setup.js index e9ab6133..aff8bcf5 100644 --- a/server/setup.js +++ b/server/setup.js @@ -134,7 +134,7 @@ module.exports = () => { // Init Telemetry WIKI.kernel.initTelemetry() - WIKI.telemetry.sendEvent('setup', 'install-start') + // WIKI.telemetry.sendEvent('setup', 'install-start') // Basic checks if (!semver.satisfies(process.version, '>=10.12')) { @@ -269,7 +269,7 @@ module.exports = () => { await WIKI.models.searchEngines.refreshSearchEnginesFromDisk() await WIKI.models.searchEngines.query().patch({ isEnabled: true }).where('key', 'db') - WIKI.telemetry.sendEvent('setup', 'install-loadedmodules') + // WIKI.telemetry.sendEvent('setup', 'install-loadedmodules') // Load storage targets await WIKI.models.storage.refreshTargetsFromDisk() @@ -326,13 +326,17 @@ module.exports = () => { }) WIKI.logger.info('Setup is complete!') - WIKI.telemetry.sendEvent('setup', 'install-completed') + // WIKI.telemetry.sendEvent('setup', 'install-completed') res.json({ ok: true, redirectPath: '/', redirectPort: WIKI.config.port }).end() + if (WIKI.config.telemetry.isEnabled) { + await WIKI.telemetry.sendInstanceEvent('INSTALL') + } + WIKI.config.setup = false WIKI.logger.info('Stopping Setup...')