Commit 5ce3f773 authored by David's avatar David Committed by Commit Bot

Add browser_process_uptime_ms to JS crash reports.

Currently we don't record this for JS crash reports.
chrome://media-app wants to record the uptime of the browser process
to help track down potential race conditions.

We think this can be useful in general for JS errors.

Doc: http://go/backlight-better-crash-report#heading=h.1fkxhdmqpt47

Note: we have Process uptime & Process type fields in chrome crashes
and I believe we plan to add this in for JS crashes in crbug/1121816.

Change-Id: Ide154b49d2f9791cb044885054a5ff929f720618
Bug: b/169635499
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2463094
Commit-Queue: David Lei <dlei@google.com>
Reviewed-by: default avatarGabriel Charette <gab@chromium.org>
Reviewed-by: default avatarGiovanni Ortuño Urquidi <ortuno@chromium.org>
Reviewed-by: default avatarIan Barkley-Yeung <iby@chromium.org>
Reviewed-by: default avatarBugs Nash <bugsnash@chromium.org>
Auto-Submit: David Lei <dlei@google.com>
Cr-Commit-Position: refs/heads/master@{#818717}
parent 4dad6dba
...@@ -21,6 +21,7 @@ static_library("error_reporting") { ...@@ -21,6 +21,7 @@ static_library("error_reporting") {
"//base", "//base",
"//components/crash/core/app", "//components/crash/core/app",
"//components/feedback", "//components/feedback",
"//components/startup_metric_utils/browser",
"//content/public/browser", "//content/public/browser",
"//net", "//net",
"//services/network:network_service", "//services/network:network_service",
......
include_rules = [ include_rules = [
"+components/feedback", "+components/feedback",
"+components/startup_metric_utils",
"+net", "+net",
"+services/network", "+services/network",
] ]
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include "components/crash/content/browser/error_reporting/javascript_error_report.h" #include "components/crash/content/browser/error_reporting/javascript_error_report.h"
#include "components/crash/core/app/client_upload_info.h" #include "components/crash/core/app/client_upload_info.h"
#include "components/feedback/redaction_tool.h" #include "components/feedback/redaction_tool.h"
#include "components/startup_metric_utils/browser/startup_metric_utils.h"
#include "content/public/browser/browser_context.h" #include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "content/public/browser/storage_partition.h" #include "content/public/browser/storage_partition.h"
...@@ -236,6 +237,7 @@ void SendReport(const GURL& url, ...@@ -236,6 +237,7 @@ void SendReport(const GURL& url,
void OnConsentCheckCompleted( void OnConsentCheckCompleted(
base::ScopedClosureRunner callback_runner, base::ScopedClosureRunner callback_runner,
scoped_refptr<network::SharedURLLoaderFactory> loader_factory, scoped_refptr<network::SharedURLLoaderFactory> loader_factory,
base::TimeDelta browser_process_uptime,
base::Optional<JavaScriptErrorReport> error_report) { base::Optional<JavaScriptErrorReport> error_report) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI); DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
if (!error_report) { if (!error_report) {
...@@ -282,6 +284,11 @@ void OnConsentCheckCompleted( ...@@ -282,6 +284,11 @@ void OnConsentCheckCompleted(
if (error_report->column_number) if (error_report->column_number)
params["column"] = base::NumberToString(*error_report->column_number); params["column"] = base::NumberToString(*error_report->column_number);
// TODO(crbug/1121816): Chrome crashes have "Process uptime" and "Process
// type" fields, eventually consider using that for process uptime.
params["browser_process_uptime_ms"] =
base::NumberToString(browser_process_uptime.InMilliseconds());
const GURL url(base::StrCat( const GURL url(base::StrCat(
{crash_endpoint_string, "?", BuildPostRequestQueryString(params)})); {crash_endpoint_string, "?", BuildPostRequestQueryString(params)}));
std::string body; std::string body;
...@@ -312,13 +319,19 @@ void SendJavaScriptErrorReport(JavaScriptErrorReport error_report, ...@@ -312,13 +319,19 @@ void SendJavaScriptErrorReport(JavaScriptErrorReport error_report,
content::BrowserContext::GetDefaultStoragePartition(browser_context) content::BrowserContext::GetDefaultStoragePartition(browser_context)
->GetURLLoaderFactoryForBrowserProcess(); ->GetURLLoaderFactoryForBrowserProcess();
// Get browser uptime before swapping threads to reduce lag time between the
// error report occurring and sending it off.
base::TimeTicks startup_time = startup_metric_utils::MainEntryPointTicks();
base::TimeDelta browser_process_uptime =
(base::TimeTicks::Now() - startup_time);
// Consent check needs to be done on a blockable thread. We must return to // Consent check needs to be done on a blockable thread. We must return to
// this thread (the UI thread) to use the loader_factory. // this thread (the UI thread) to use the loader_factory.
base::ThreadPool::PostTaskAndReplyWithResult( base::ThreadPool::PostTaskAndReplyWithResult(
FROM_HERE, {base::MayBlock()}, FROM_HERE, {base::MayBlock()},
base::BindOnce(&CheckConsentAndRedact, std::move(error_report)), base::BindOnce(&CheckConsentAndRedact, std::move(error_report)),
base::BindOnce(&OnConsentCheckCompleted, std::move(callback_runner), base::BindOnce(&OnConsentCheckCompleted, std::move(callback_runner),
std::move(loader_factory))); std::move(loader_factory), browser_process_uptime));
} }
#endif // !defined(OS_WIN) #endif // !defined(OS_WIN)
......
...@@ -72,6 +72,7 @@ TEST_F(SendJavaScriptErrorReportTest, Basic) { ...@@ -72,6 +72,7 @@ TEST_F(SendJavaScriptErrorReportTest, Basic) {
ASSERT_TRUE(actual_report); ASSERT_TRUE(actual_report);
EXPECT_THAT(actual_report->query, HasSubstr("error_message=Hello%20World")); EXPECT_THAT(actual_report->query, HasSubstr("error_message=Hello%20World"));
EXPECT_THAT(actual_report->query, HasSubstr("type=JavascriptError")); EXPECT_THAT(actual_report->query, HasSubstr("type=JavascriptError"));
EXPECT_THAT(actual_report->query, HasSubstr("browser_process_uptime_ms="));
// TODO(iby) research why URL is repeated... // TODO(iby) research why URL is repeated...
EXPECT_THAT(actual_report->query, EXPECT_THAT(actual_report->query,
HasSubstr("src=https%3A%2F%2Fwww.chromium.org%2FHome")); HasSubstr("src=https%3A%2F%2Fwww.chromium.org%2FHome"));
...@@ -116,6 +117,7 @@ TEST_F(SendJavaScriptErrorReportTest, AllFields) { ...@@ -116,6 +117,7 @@ TEST_F(SendJavaScriptErrorReportTest, AllFields) {
ASSERT_TRUE(actual_report); ASSERT_TRUE(actual_report);
EXPECT_THAT(actual_report->query, HasSubstr("error_message=Hello%20World")); EXPECT_THAT(actual_report->query, HasSubstr("error_message=Hello%20World"));
EXPECT_THAT(actual_report->query, HasSubstr("type=JavascriptError")); EXPECT_THAT(actual_report->query, HasSubstr("type=JavascriptError"));
EXPECT_THAT(actual_report->query, HasSubstr("browser_process_uptime_ms="));
// TODO(iby) research why URL is repeated... // TODO(iby) research why URL is repeated...
EXPECT_THAT(actual_report->query, EXPECT_THAT(actual_report->query,
HasSubstr("src=https%3A%2F%2Fwww.chromium.org%2FHome")); HasSubstr("src=https%3A%2F%2Fwww.chromium.org%2FHome"));
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "extensions/shell/test/shell_apitest.h" #include "extensions/shell/test/shell_apitest.h"
#include "extensions/test/extension_test_message_listener.h" #include "extensions/test/extension_test_message_listener.h"
#include "extensions/test/test_extension_dir.h" #include "extensions/test/test_extension_dir.h"
#include "testing/gmock/include/gmock/gmock-matchers.h"
namespace extensions { namespace extensions {
...@@ -19,6 +20,8 @@ using browsertest_util::ExecuteScriptInBackgroundPage; ...@@ -19,6 +20,8 @@ using browsertest_util::ExecuteScriptInBackgroundPage;
namespace { namespace {
using ::testing::MatchesRegex;
constexpr const char* kTestExtensionId = "jjeoclcdfjddkdjokiejckgcildcflpp"; constexpr const char* kTestExtensionId = "jjeoclcdfjddkdjokiejckgcildcflpp";
std::string GetOsVersion() { std::string GetOsVersion() {
...@@ -99,13 +102,15 @@ IN_PROC_BROWSER_TEST_F(CrashReportPrivateApiTest, Basic) { ...@@ -99,13 +102,15 @@ IN_PROC_BROWSER_TEST_F(CrashReportPrivateApiTest, Basic) {
const base::Optional<MockCrashEndpoint::Report>& report = last_report(); const base::Optional<MockCrashEndpoint::Report>& report = last_report();
ASSERT_TRUE(report); ASSERT_TRUE(report);
EXPECT_EQ(report->query, EXPECT_THAT(
"browser=Chrome&browser_version=1.2.3.4&channel=Stable&" report->query,
"error_message=hi&full_url=http%3A%2F%2Fwww.test.com%2F&" MatchesRegex("browser=Chrome&browser_process_uptime_ms=\\d+&browser_"
"os=ChromeOS&os_version=" + "version=1.2.3.4&channel=Stable&"
GetOsVersion() + "error_message=hi&full_url=http%3A%2F%2Fwww.test.com%2F&"
"&prod=Chrome_ChromeOS&src=http%3A%2F%2Fwww.test." "os=ChromeOS&os_version=" +
"com%2F&type=JavascriptError&url=%2F&ver=1.2.3.4"); GetOsVersion() +
"&prod=Chrome_ChromeOS&src=http%3A%2F%2Fwww.test."
"com%2F&type=JavascriptError&url=%2F&ver=1.2.3.4"));
EXPECT_EQ(report->content, ""); EXPECT_EQ(report->content, "");
} }
...@@ -129,14 +134,16 @@ IN_PROC_BROWSER_TEST_F(CrashReportPrivateApiTest, ExtraParamsAndStackTrace) { ...@@ -129,14 +134,16 @@ IN_PROC_BROWSER_TEST_F(CrashReportPrivateApiTest, ExtraParamsAndStackTrace) {
ASSERT_TRUE(report); ASSERT_TRUE(report);
// The product name is escaped twice. The first time, it becomes // The product name is escaped twice. The first time, it becomes
// "Chrome%20(Chrome%20OS)" and then the second escapes the '%' into '%25'. // "Chrome%20(Chrome%20OS)" and then the second escapes the '%' into '%25'.
EXPECT_EQ(report->query, EXPECT_THAT(
"browser=Chrome&browser_version=1.2.3.4&channel=Stable&column=456&" report->query,
"error_message=hi&full_url=http%3A%2F%2Fwww.test.com%2Ffoo" MatchesRegex("browser=Chrome&browser_process_uptime_ms=\\d+&browser_"
"&line=123&os=ChromeOS&os_version=" + "version=1.2.3.4&channel=Stable&column=456&"
GetOsVersion() + "error_message=hi&full_url=http%3A%2F%2Fwww.test.com%2Ffoo"
"&prod=Chrome%2520(Chrome%2520OS)&" "&line=123&os=ChromeOS&os_version=" +
"src=http%3A%2F%2Fwww.test.com%2Ffoo&" GetOsVersion() +
"type=JavascriptError&url=%2Ffoo&ver=1.0.0.0"); "&prod=Chrome%2520\\(Chrome%2520OS\\)&"
"src=http%3A%2F%2Fwww.test.com%2Ffoo&"
"type=JavascriptError&url=%2Ffoo&ver=1.0.0.0"));
EXPECT_EQ(report->content, " at <anonymous>:1:1"); EXPECT_EQ(report->content, " at <anonymous>:1:1");
} }
...@@ -158,13 +165,16 @@ IN_PROC_BROWSER_TEST_F(CrashReportPrivateApiTest, StackTraceWithErrorMessage) { ...@@ -158,13 +165,16 @@ IN_PROC_BROWSER_TEST_F(CrashReportPrivateApiTest, StackTraceWithErrorMessage) {
const base::Optional<MockCrashEndpoint::Report>& report = last_report(); const base::Optional<MockCrashEndpoint::Report>& report = last_report();
ASSERT_TRUE(report); ASSERT_TRUE(report);
EXPECT_EQ(report->query, EXPECT_THAT(
"browser=Chrome&browser_version=1.2.3.4&channel=Stable&column=456&" report->query,
"error_message=hi&full_url=http%3A%2F%2Fwww.test.com%2Ffoo&" MatchesRegex(
"line=123&os=ChromeOS&os_version=" + "browser=Chrome&browser_process_uptime_ms=\\d+&browser_version=1.2."
GetOsVersion() + "3.4&channel=Stable&column=456&"
"&prod=TestApp&src=http%3A%2F%2Fwww.test.com%2Ffoo&type=" "error_message=hi&full_url=http%3A%2F%2Fwww.test.com%2Ffoo&"
"JavascriptError&url=%2Ffoo&ver=1.0.0.0"); "line=123&os=ChromeOS&os_version=" +
GetOsVersion() +
"&prod=TestApp&src=http%3A%2F%2Fwww.test.com%2Ffoo&type="
"JavascriptError&url=%2Ffoo&ver=1.0.0.0"));
EXPECT_EQ(report->content, ""); EXPECT_EQ(report->content, "");
} }
...@@ -187,14 +197,17 @@ IN_PROC_BROWSER_TEST_F(CrashReportPrivateApiTest, RedactMessage) { ...@@ -187,14 +197,17 @@ IN_PROC_BROWSER_TEST_F(CrashReportPrivateApiTest, RedactMessage) {
const base::Optional<MockCrashEndpoint::Report>& report = last_report(); const base::Optional<MockCrashEndpoint::Report>& report = last_report();
ASSERT_TRUE(report); ASSERT_TRUE(report);
EXPECT_EQ(report->query, EXPECT_THAT(
"browser=Chrome&browser_version=1.2.3.4&channel=Stable&column=456&" report->query,
"error_message=%5BMAC%20OUI%3D06%3A00%3A00%20IFACE%3D1%5D&" MatchesRegex(
"full_url=http%3A%2F%2Fwww.test.com%2Ffoo&line=123&os=ChromeOS&" "browser=Chrome&browser_process_uptime_ms=\\d+&browser_version=1.2."
"os_version=" + "3.4&channel=Stable&column=456&"
GetOsVersion() + "error_message=%5BMAC%20OUI%3D06%3A00%3A00%20IFACE%3D1%5D&"
"&prod=TestApp&src=http%3A%2F%2Fwww.test.com%2Ffoo&type=" "full_url=http%3A%2F%2Fwww.test.com%2Ffoo&line=123&os=ChromeOS&"
"JavascriptError&url=%2Ffoo&ver=1.0.0.0"); "os_version=" +
GetOsVersion() +
"&prod=TestApp&src=http%3A%2F%2Fwww.test.com%2Ffoo&type="
"JavascriptError&url=%2Ffoo&ver=1.0.0.0"));
EXPECT_EQ(report->content, ""); EXPECT_EQ(report->content, "");
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment