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
This commit is contained in:
John Knox
2019-04-29 08:43:33 -07:00
committed by Facebook Github Bot
parent c01edec88d
commit bc993596ca

View File

@@ -20,11 +20,11 @@ export function reportPlatformFailures<T>(
): Promise<T> { ): Promise<T> {
return promise.then( return promise.then(
fulfilledValue => { fulfilledValue => {
getInstance().track('success-rate', name, 1); logPlatformSuccessRate(name, {isSuccess: true});
return fulfilledValue; return fulfilledValue;
}, },
rejectionReason => { rejectionReason => {
getInstance().track('success-rate', name, 0); logPlatformSuccessRate(name, {isSuccess: false, error: rejectionReason});
return Promise.reject(rejectionReason); return Promise.reject(rejectionReason);
}, },
); );
@@ -44,11 +44,14 @@ export function reportPluginFailures<T>(
): Promise<T> { ): Promise<T> {
return promise.then( return promise.then(
fulfilledValue => { fulfilledValue => {
getInstance().track('success-rate', name, 1, plugin); logPluginSuccessRate(name, plugin, {isSuccess: true});
return fulfilledValue; return fulfilledValue;
}, },
rejectionReason => { rejectionReason => {
getInstance().track('success-rate', name, 0, plugin); logPluginSuccessRate(name, plugin, {
isSuccess: false,
error: rejectionReason,
});
return Promise.reject(rejectionReason); return Promise.reject(rejectionReason);
}, },
); );
@@ -64,10 +67,43 @@ export function tryCatchReportPlatformFailures<T>(
): T { ): T {
try { try {
const result = closure(); const result = closure();
getInstance().track('success-rate', name, 1); logPlatformSuccessRate(name, {isSuccess: true});
return result; return result;
} catch (e) { } catch (e) {
getInstance().track('success-rate', name, 0); logPlatformSuccessRate(name, {isSuccess: false, error: e});
throw 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);
}