UNPKG

flipper-common

Version:

Server & UI shared Flipper utilities

188 lines (186 loc) 6.51 kB
"use strict"; /** * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @format */ Object.defineProperty(exports, "__esModule", { value: true }); exports.logPlatformSuccessRate = exports.reportUsage = exports.tryCatchReportPluginFailuresAsync = exports.tryCatchReportPluginFailures = exports.tryCatchReportPlatformFailures = exports.reportPluginFailures = exports.reportPlatformFailures = exports.UnsupportedError = void 0; const errors_1 = require("./errors"); const Logger_1 = require("./Logger"); class UnsupportedError extends Error { constructor(message) { super(message); } } exports.UnsupportedError = UnsupportedError; /* * Wraps a Promise, preserving it's functionality but logging the success or failure state of it, with a given name, based on whether it's fulfilled or rejected. Use this variant to report failures in core platform (Flipper) code. */ function reportPlatformFailures(promise, name) { return new Promise((resolve, reject) => { promise .then((fulfilledValue) => { logPlatformSuccessRate(name, { kind: 'success' }); resolve(fulfilledValue); }) .catch((rejectionReason) => { if (rejectionReason instanceof errors_1.CancelledPromiseError) { logPlatformSuccessRate(name, { kind: 'cancelled', }); } else { logPlatformSuccessRate(name, { kind: 'failure', supportedOperation: !(rejectionReason instanceof UnsupportedError), error: rejectionReason, }); } reject(rejectionReason); }); }); } exports.reportPlatformFailures = reportPlatformFailures; /* * Wraps a Promise, preserving it's functionality but logging the success or failure state of it, with a given name, based on whether it's fulfilled or rejected. Use this variant to report failures in plugin code. */ function reportPluginFailures(promise, name, plugin) { const start = performance.now(); return promise.then((fulfilledValue) => { logPluginSuccessRate(name, plugin, { kind: 'success' }, performance.now() - start); return fulfilledValue; }, (rejectionReason) => { if (rejectionReason instanceof errors_1.CancelledPromiseError) { logPluginSuccessRate(name, plugin, { kind: 'cancelled', }, performance.now() - start); } else { logPluginSuccessRate(name, plugin, { kind: 'failure', supportedOperation: !(rejectionReason instanceof UnsupportedError), error: rejectionReason, }, performance.now() - start); } return Promise.reject(rejectionReason); }); } exports.reportPluginFailures = reportPluginFailures; /* * Wraps a closure, preserving it's functionality but logging the success or failure state of it. */ function tryCatchReportPlatformFailures(closure, name) { try { const result = closure(); logPlatformSuccessRate(name, { kind: 'success' }); return result; } catch (e) { logPlatformSuccessRate(name, { kind: 'failure', supportedOperation: !(e instanceof UnsupportedError), error: e, }); throw e; } } exports.tryCatchReportPlatformFailures = tryCatchReportPlatformFailures; /* * Wraps a closure, preserving it's functionality but logging the success or failure state of it. */ function tryCatchReportPluginFailures(closure, name, plugin) { try { const result = closure(); logPluginSuccessRate(name, plugin, { kind: 'success' }); return result; } catch (e) { logPluginSuccessRate(name, plugin, { kind: 'failure', supportedOperation: !(e instanceof UnsupportedError), error: e, }); throw e; } } exports.tryCatchReportPluginFailures = tryCatchReportPluginFailures; /* * Wraps a closure, preserving it's functionality but logging the success or failure state of it. */ async function tryCatchReportPluginFailuresAsync(closure, name, plugin) { try { const result = await closure(); logPluginSuccessRate(name, plugin, { kind: 'success' }); return result; } catch (e) { logPluginSuccessRate(name, plugin, { kind: 'failure', supportedOperation: !(e instanceof UnsupportedError), error: e, }); throw e; } } exports.tryCatchReportPluginFailuresAsync = tryCatchReportPluginFailuresAsync; /** * Track usage of a feature. * @param action Unique name for the action performed. E.g. captureScreenshot * @param data Optional additional metadata attached to the event. */ function reportUsage(action, data, plugin) { (0, Logger_1.getLogger)().track('usage', action, data, plugin); } exports.reportUsage = reportUsage; function logPlatformSuccessRate(name, result) { if (result.kind === 'success') { (0, Logger_1.getLogger)().track('success-rate', name, { value: 1 }); } else if (result.kind === 'cancelled') { (0, Logger_1.getLogger)().track('operation-cancelled', name); } else { (0, Logger_1.getLogger)().track('success-rate', name, { value: 0, supportedOperation: result.supportedOperation ? 1 : 0, error: extractMessage(result.error), }); } } exports.logPlatformSuccessRate = logPlatformSuccessRate; function logPluginSuccessRate(name, plugin, result, durationMs) { if (result.kind === 'success') { (0, Logger_1.getLogger)().track('success-rate', name, { value: 1, durationMs }, plugin); } else if (result.kind === 'cancelled') { (0, Logger_1.getLogger)().track('operation-cancelled', name, { durationMs }, plugin); } else { (0, Logger_1.getLogger)().track('success-rate', name, { value: 0, durationMs, supportedOperation: result.supportedOperation ? 1 : 0, error: extractMessage(result.error), }, plugin); } } function extractMessage(error) { if ((0, errors_1.isError)(error)) { return error.message; } return JSON.stringify(error); } //# sourceMappingURL=metrics.js.map