telemetry.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.sendCommand = exports.Telemetry = void 0;
  4. const tslib_1 = require("tslib");
  5. const debug_1 = require("debug");
  6. const lodash = tslib_1.__importStar(require("lodash"));
  7. const helper_1 = require("./helper");
  8. const uuid_1 = require("./utils/uuid");
  9. const debug = (0, debug_1.debug)('ionic:lib:telemetry');
  10. const GA_CODE = 'UA-44023830-30';
  11. let _gaTracker;
  12. class Telemetry {
  13. constructor({ config, client, getInfo, ctx, project, session }) {
  14. this.client = client;
  15. this.config = config;
  16. this.getInfo = getInfo;
  17. this.ctx = ctx;
  18. this.project = project;
  19. this.session = session;
  20. }
  21. async sendCommand(command, args) {
  22. debug('Sending telemetry for command: %O %O', command, args);
  23. await (0, helper_1.sendMessage)({ config: this.config, ctx: this.ctx }, { type: 'telemetry', data: { command, args } });
  24. }
  25. }
  26. exports.Telemetry = Telemetry;
  27. async function getLeek({ config, version }) {
  28. if (!_gaTracker) {
  29. const Leek = (await Promise.resolve().then(() => tslib_1.__importStar(require('leek')))).default;
  30. let telemetryToken = config.get('tokens.telemetry');
  31. if (!telemetryToken) {
  32. telemetryToken = (0, uuid_1.generateUUID)();
  33. config.set('tokens.telemetry', telemetryToken);
  34. debug(`setting telemetry token to ${telemetryToken}`);
  35. }
  36. _gaTracker = new Leek({
  37. name: telemetryToken,
  38. trackingCode: GA_CODE,
  39. globalName: 'ionic',
  40. version,
  41. silent: !config.get('telemetry'),
  42. });
  43. }
  44. return _gaTracker;
  45. }
  46. async function sendCommand({ config, client, getInfo, ctx, session, project }, command, args) {
  47. const messageList = [];
  48. const name = 'command execution';
  49. const prettyArgs = args.map(a => a.includes(' ') ? `"${a}"` : a);
  50. const message = messageList.concat([command], prettyArgs).join(' ');
  51. await Promise.all([
  52. (async () => {
  53. const leek = await getLeek({ config, version: ctx.version });
  54. try {
  55. await leek.track({ name, message });
  56. }
  57. catch (e) {
  58. debug(`leek track error: ${e.stack ? e.stack : e}`);
  59. }
  60. })(),
  61. (async () => {
  62. const now = new Date().toISOString();
  63. const appflowId = project ? project.config.get('id') : undefined;
  64. const info = await getInfo();
  65. const results = info.map(r => r.key ? { [r.key]: r.value } : undefined).filter(r => !!r);
  66. const { req } = await client.make('POST', '/events/metrics');
  67. const metric = {
  68. 'name': 'cli_command_metrics',
  69. 'timestamp': now,
  70. 'session_id': config.get('tokens.telemetry'),
  71. 'source': 'cli',
  72. 'value': {
  73. 'command': command,
  74. 'arguments': prettyArgs.join(' '),
  75. 'app_id': appflowId,
  76. 'backend': 'pro',
  77. ...lodash.extend({}, ...results),
  78. },
  79. };
  80. const isLoggedIn = session.isLoggedIn();
  81. if (isLoggedIn) {
  82. const token = await session.getUserToken();
  83. req.set('Authorization', `Bearer ${token}`);
  84. }
  85. debug('metric: %o', metric);
  86. req.send({
  87. 'metrics': [metric],
  88. 'sent_at': now,
  89. });
  90. try {
  91. await client.do(req);
  92. }
  93. catch (e) {
  94. debug(`metric send error: ${e.stack ? e.stack : e}`);
  95. }
  96. })(),
  97. ]);
  98. }
  99. exports.sendCommand = sendCommand;