From bc993596cac5044922a98c632d2caa187a58673c Mon Sep 17 00:00:00 2001 From: John Knox Date: Mon, 29 Apr 2019 08:43:33 -0700 Subject: [PATCH] Include error messages in success-rate metrics Summary: At the moment, we can see the %-success of instrumented operations, but it's hard to attribute the ones that fail to actual errors. This will allow us to see for every session-event row, the error messages that caused each of the failures. Then if necessary, you can search for that error message in logview to get more info like the stack trace. Requires a corresponding change in puma, since this is changing a number to a json value. Reviewed By: danielbuechele Differential Revision: D15099185 fbshipit-source-id: b966e6e55ab82f1cb9a4cfd7bf02034a1df01929 --- src/utils/metrics.js | 48 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/src/utils/metrics.js b/src/utils/metrics.js index 9f29d2744..f076f959d 100644 --- a/src/utils/metrics.js +++ b/src/utils/metrics.js @@ -20,11 +20,11 @@ export function reportPlatformFailures( ): Promise { return promise.then( fulfilledValue => { - getInstance().track('success-rate', name, 1); + logPlatformSuccessRate(name, {isSuccess: true}); return fulfilledValue; }, rejectionReason => { - getInstance().track('success-rate', name, 0); + logPlatformSuccessRate(name, {isSuccess: false, error: rejectionReason}); return Promise.reject(rejectionReason); }, ); @@ -44,11 +44,14 @@ export function reportPluginFailures( ): Promise { return promise.then( fulfilledValue => { - getInstance().track('success-rate', name, 1, plugin); + logPluginSuccessRate(name, plugin, {isSuccess: true}); return fulfilledValue; }, rejectionReason => { - getInstance().track('success-rate', name, 0, plugin); + logPluginSuccessRate(name, plugin, { + isSuccess: false, + error: rejectionReason, + }); return Promise.reject(rejectionReason); }, ); @@ -64,10 +67,43 @@ export function tryCatchReportPlatformFailures( ): T { try { const result = closure(); - getInstance().track('success-rate', name, 1); + logPlatformSuccessRate(name, {isSuccess: true}); return result; } catch (e) { - getInstance().track('success-rate', name, 0); + logPlatformSuccessRate(name, {isSuccess: false, error: e}); throw e; } } + +type Result = {isSuccess: true} | {isSuccess: false, error: any}; + +function logPlatformSuccessRate(name: string, result: Result) { + if (result.isSuccess) { + getInstance().track('success-rate', name, {value: 1}); + } else { + getInstance().track('success-rate', name, { + value: 0, + error: extractMessage(result.error), + }); + } +} + +function logPluginSuccessRate(name: string, plugin: string, result: Result) { + if (result.isSuccess) { + getInstance().track('success-rate', name, {value: 1}, plugin); + } else { + getInstance().track( + 'success-rate', + name, + {value: 1, error: extractMessage(result.error)}, + plugin, + ); + } +} + +function extractMessage(error: any) { + if (error instanceof Error) { + return error.message; + } + return JSON.stringify(error); +}