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