flipper-common
Version:
Server & UI shared Flipper utilities
188 lines (186 loc) • 6.51 kB
JavaScript
;
/**
* 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