mirror of
				https://github.com/gristlabs/grist-core.git
				synced 2025-06-13 20:53:59 +00:00 
			
		
		
		
	(core) add a cli command to view telemetry settings
Summary: This adds a `yarn cli settings telemetry [--json] [--all]` command that allows telemetry settings to be inspected. It is useful for keeping documentation about telemetry up to date. Test Plan: manual (a bit cheeky; justified on basis of breakage not being very important yet, this is essentially an internal feature) Reviewers: georgegevoian Reviewed By: georgegevoian Differential Revision: https://phab.getgrist.com/D3917
This commit is contained in:
		
							parent
							
								
									2b3e31a05c
								
							
						
					
					
						commit
						c5e750abc6
					
				| @ -1,3 +1,4 @@ | |||||||
|  | import { Level, TelemetryContracts } from 'app/common/Telemetry'; | ||||||
| import { version } from 'app/common/version'; | import { version } from 'app/common/version'; | ||||||
| import { synchronizeProducts } from 'app/gen-server/entity/Product'; | import { synchronizeProducts } from 'app/gen-server/entity/Product'; | ||||||
| import { HomeDBManager } from 'app/gen-server/lib/HomeDBManager'; | import { HomeDBManager } from 'app/gen-server/lib/HomeDBManager'; | ||||||
| @ -5,6 +6,7 @@ import { applyPatch } from 'app/gen-server/lib/TypeORMPatches'; | |||||||
| import { getMigrations, getOrCreateConnection, getTypeORMSettings, | import { getMigrations, getOrCreateConnection, getTypeORMSettings, | ||||||
|          undoLastMigration, updateDb } from 'app/server/lib/dbUtils'; |          undoLastMigration, updateDb } from 'app/server/lib/dbUtils'; | ||||||
| import { getDatabaseUrl } from 'app/server/lib/serverUtils'; | import { getDatabaseUrl } from 'app/server/lib/serverUtils'; | ||||||
|  | import { getTelemetryLevel } from 'app/server/lib/Telemetry'; | ||||||
| import { Gristifier } from 'app/server/utils/gristify'; | import { Gristifier } from 'app/server/utils/gristify'; | ||||||
| import { pruneActionHistory } from 'app/server/utils/pruneActionHistory'; | import { pruneActionHistory } from 'app/server/utils/pruneActionHistory'; | ||||||
| import * as commander from 'commander'; | import * as commander from 'commander'; | ||||||
| @ -43,6 +45,7 @@ export function getProgram(): commander.Command { | |||||||
| 
 | 
 | ||||||
|   addDbCommand(program, {nested: true}); |   addDbCommand(program, {nested: true}); | ||||||
|   addHistoryCommand(program, {nested: true}); |   addHistoryCommand(program, {nested: true}); | ||||||
|  |   addSettingsCommand(program, {nested: true}); | ||||||
|   addSiteCommand(program, {nested: true}); |   addSiteCommand(program, {nested: true}); | ||||||
|   addSqliteCommand(program); |   addSqliteCommand(program); | ||||||
|   addVersionCommand(program); |   addVersionCommand(program); | ||||||
| @ -63,6 +66,88 @@ export function addHistoryCommand(program: commander.Command, options: CommandOp | |||||||
|     .action(pruneActionHistory); |     .action(pruneActionHistory); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // Add commands for general configuration
 | ||||||
|  | export function addSettingsCommand(program: commander.Command, | ||||||
|  |                                    options: CommandOptions) { | ||||||
|  |   const sub = section(program, { | ||||||
|  |     sectionName: 'settings', | ||||||
|  |     sectionDescription: 'general configuration', | ||||||
|  |     ...options | ||||||
|  |   }); | ||||||
|  |   sub('telemetry') | ||||||
|  |     .description('show telemetry settings') | ||||||
|  |     .option('--json', 'show telemetry levels as json') | ||||||
|  |     .option('--all', 'show all telemetry levels') | ||||||
|  |     .action(showTelemetry); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function showTelemetry(options: { | ||||||
|  |   json?: boolean, | ||||||
|  |   all?: boolean, | ||||||
|  | }) { | ||||||
|  |   const contracts = TelemetryContracts; | ||||||
|  |   const levelName = getTelemetryLevel(); | ||||||
|  |   const level = Level[levelName]; | ||||||
|  |   if (options.json) { | ||||||
|  |     console.log(JSON.stringify({ | ||||||
|  |       contracts, | ||||||
|  |       currentLevel: level, | ||||||
|  |       currentLevelName: levelName, | ||||||
|  |     }, null, 2)); | ||||||
|  |   } else { | ||||||
|  |     if (options.all) { | ||||||
|  |       console.log("# All telemetry levels"); | ||||||
|  |       console.log(""); | ||||||
|  |       for (const iLevel of [Level.off, Level.limited, Level.full]) { | ||||||
|  |         describeTelemetryLevel(iLevel, '#'); | ||||||
|  |         console.log(""); | ||||||
|  |         showTelemetryAtLevel(iLevel, '##'); | ||||||
|  |         console.log(""); | ||||||
|  |       } | ||||||
|  |     } else { | ||||||
|  |       describeTelemetryLevel(level, ''); | ||||||
|  |       console.log(""); | ||||||
|  |       showTelemetryAtLevel(level, '#'); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function describeTelemetryLevel(level: Level, nesting: ''|'#') { | ||||||
|  |   switch (level) { | ||||||
|  |     case Level.off: | ||||||
|  |       console.log(nesting + "# Telemetry level: off"); | ||||||
|  |       console.log("No telemetry is recorded or transmitted."); | ||||||
|  |       break; | ||||||
|  |     case Level.limited: | ||||||
|  |       console.log(nesting + "# Telemetry level: limited"); | ||||||
|  |       console.log("This is a telemetry level appropriate for self-hosting instances of Grist."); | ||||||
|  |       console.log("Data is transmitted to Grist Labs."); | ||||||
|  |       break; | ||||||
|  |     case Level.full: | ||||||
|  |       console.log(nesting + "# Telemetry level: full"); | ||||||
|  |       console.log("This is a telemetry level appropriate for internal use by a hosted service, with"); | ||||||
|  |       console.log("`GRIST_TELEMETRY_URL` set to an endpoint controlled by the operator of the service."); | ||||||
|  |       break; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function showTelemetryAtLevel(level: Level, nesting: ''|'#'|'##') { | ||||||
|  |   const contracts = TelemetryContracts; | ||||||
|  |   for (const [name, contract] of Object.entries(contracts)) { | ||||||
|  |     if (contract.minimumTelemetryLevel > level) { continue; } | ||||||
|  |     console.log(nesting + "# " + name); | ||||||
|  |     console.log(contract.description); | ||||||
|  |     console.log(""); | ||||||
|  |     console.log("| Field | Type | Description |"); | ||||||
|  |     console.log("| ----- | ---- | ----------- |"); | ||||||
|  |     for (const [fieldName, metadata] of Object.entries(contract.metadataContracts || {})) { | ||||||
|  |       if ((metadata.minimumTelemetryLevel || 0) > level) { continue; } | ||||||
|  |       console.log("| " + fieldName + " | " + metadata.dataType + " | " + metadata.description + " |"); | ||||||
|  |     } | ||||||
|  |     console.log(""); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // Add commands related to sites:
 | // Add commands related to sites:
 | ||||||
| //   site create <domain> <owner-email>
 | //   site create <domain> <owner-email>
 | ||||||
| export function addSiteCommand(program: commander.Command, | export function addSiteCommand(program: commander.Command, | ||||||
|  | |||||||
| @ -162,11 +162,9 @@ export class Telemetry implements ITelemetry { | |||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   private async _initialize() { |   private async _initialize() { | ||||||
|  |     this._telemetryLevel = getTelemetryLevel(); | ||||||
|     if (process.env.GRIST_TELEMETRY_LEVEL !== undefined) { |     if (process.env.GRIST_TELEMETRY_LEVEL !== undefined) { | ||||||
|       this._telemetryLevel = TelemetryLevels.check(process.env.GRIST_TELEMETRY_LEVEL); |  | ||||||
|       this._checkTelemetryEvent = buildTelemetryEventChecker(this._telemetryLevel); |       this._checkTelemetryEvent = buildTelemetryEventChecker(this._telemetryLevel); | ||||||
|     } else { |  | ||||||
|       this._telemetryLevel = 'off'; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const {id} = await this._gristServer.getActivations().current(); |     const {id} = await this._gristServer.getActivations().current(); | ||||||
| @ -218,3 +216,11 @@ export class Telemetry implements ITelemetry { | |||||||
|     }); |     }); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | export function getTelemetryLevel(): TelemetryLevel { | ||||||
|  |   if (process.env.GRIST_TELEMETRY_LEVEL !== undefined) { | ||||||
|  |     return TelemetryLevels.check(process.env.GRIST_TELEMETRY_LEVEL); | ||||||
|  |   } else { | ||||||
|  |     return 'off'; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user