Browse Source

fix: use new telemetry endpoint

pull/1736/head
NGPixel 4 years ago
parent
commit
71be4660bf
2 changed files with 122 additions and 58 deletions
  1. 170
      server/core/telemetry.js
  2. 10
      server/setup.js

170
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())

10
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...')

Loading…
Cancel
Save