Index: chrome/browser/safe_browsing/srt_fetcher_win.cc |
diff --git a/chrome/browser/safe_browsing/srt_fetcher_win.cc b/chrome/browser/safe_browsing/srt_fetcher_win.cc |
index 01fb75c9e6905cfc81c28124da94a55e3c9fb9ff..1761324caf4aa31089cac8c8e8a82d5aa0d066fb 100644 |
--- a/chrome/browser/safe_browsing/srt_fetcher_win.cc |
+++ b/chrome/browser/safe_browsing/srt_fetcher_win.cc |
@@ -112,6 +112,29 @@ enum SwReporterUmaValue { |
SW_REPORTER_MAX, |
}; |
+// Used to send UMA information if Software Reporter logs uploads are enabled. |
Joe Mason
2016/09/16 14:57:13
"if" makes it sound like this is only sent if uplo
ftirelo
2016/09/16 15:34:42
Done.
|
+// Replicated in the histograms.xml file, so the order MUST NOT CHANGE. |
+enum SwReporterLogsUploadsEnabled { |
+ REPORTER_LOGS_UPLOADS_ENABLED = 0, |
+ REPORTER_LOGS_UPLOADS_SBER_DISABLED = 1, |
+ REPORTER_LOGS_UPLOADS_RECENTLY_SENT_LOGS = 2, |
+ REPORTER_LOGS_UPLOADS_MAX, |
+}; |
+ |
+// Used to send UMA information about the result of Software Reporter attempt to |
+// uppload logs, when logs are enabled. Replicated in the histograms.xml file, |
Joe Mason
2016/09/16 14:57:13
Typos: "Reporter's attempt". "upload" logs.
ftirelo
2016/09/16 15:34:42
Done.
|
+// so the order MUST NOT CHANGE. |
+enum SwReporterLogsUploadsResult { |
grt (UTC plus 2)
2016/09/16 15:59:20
...LogsUploadResult?
ftirelo
2016/09/16 19:26:55
Done.
|
+ REPORTER_LOGS_UPLOADS_RESULT_SUCCESS = 0, |
grt (UTC plus 2)
2016/09/16 15:59:20
it appears that the only value used is REPORTER_LO
grt (UTC plus 2)
2016/09/16 15:59:20
...LOGS_UPLOAD_RESULT...?
ftirelo
2016/09/16 19:26:55
Since there is no central place accessible by Chro
ftirelo
2016/09/16 19:26:55
Done.
|
+ REPORTER_LOGS_UPLOADS_RESULT_REQUEST_FAILED = 1, |
+ REPORTER_LOGS_UPLOADS_RESULT_INVALID_RESPONSE = 2, |
+ REPORTER_LOGS_UPLOADS_RESULT_TIMED_OUT = 3, |
+ REPORTER_LOGS_UPLOADS_RESULT_INTERNAL_ERROR = 4, |
+ REPORTER_LOGS_UPLOADS_RESULT_REPORT_TOO_LARGE = 5, |
+ REPORTER_LOGS_UPLOADS_RESULT_NO_NETWORK = 6, |
+ REPORTER_LOGS_UPLOADS_RESULT_MAX, |
+}; |
+ |
const char kRunningTimeErrorMetricName[] = |
"SoftwareReporter.RunningTimeRegistryError"; |
@@ -120,12 +143,16 @@ SwReporterTestingDelegate* g_testing_delegate_ = nullptr; |
const wchar_t kScanTimesSubKey[] = L"ScanTimes"; |
const wchar_t kFoundUwsValueName[] = L"FoundUws"; |
const wchar_t kMemoryUsedValueName[] = L"MemoryUsed"; |
+const wchar_t kLogsUploadResultValueName[] = L"LogsUploadResult"; |
const char kFoundUwsMetricName[] = "SoftwareReporter.FoundUwS"; |
const char kFoundUwsReadErrorMetricName[] = |
"SoftwareReporter.FoundUwSReadError"; |
const char kScanTimesMetricName[] = "SoftwareReporter.UwSScanTimes"; |
const char kMemoryUsedMetricName[] = "SoftwareReporter.MemoryUsed"; |
+const char kLogsUploadEnabledMetricName[] = |
+ "SoftwareReporter.LogsUploadEnabled"; |
+const char kLogsUploadsResultMetricName[] = "SoftwareReporter.LogsUploadResult"; |
grt (UTC plus 2)
2016/09/16 15:59:20
Uploads -> Upload
ftirelo
2016/09/16 19:26:55
Done.
|
// Reports metrics about the software reporter via UMA (and sometimes Rappor). |
class UMAHistogramReporter { |
@@ -325,6 +352,26 @@ class UMAHistogramReporter { |
RecordEnumerationHistogram("SoftwareReporter.Step", value, SW_REPORTER_MAX); |
} |
+ void RecordLogsUploadEnabled(SwReporterLogsUploadsEnabled value) { |
+ RecordEnumerationHistogram(kLogsUploadEnabledMetricName, value, |
+ REPORTER_LOGS_UPLOADS_MAX); |
+ } |
+ |
+ void RecordLogsUploadResult() { |
+ base::win::RegKey reporter_key(HKEY_CURRENT_USER, registry_key_.c_str(), |
+ KEY_QUERY_VALUE | KEY_SET_VALUE); |
grt (UTC plus 2)
2016/09/16 15:59:21
combining the RegKey ctor with KEY_SET_VALUE will
ftirelo
2016/09/16 19:26:55
Thanks for the hint! Fixed here and in the other p
|
+ DWORD logs_upload_result = 0; |
+ if (reporter_key.Valid() && |
+ reporter_key.ReadValueDW(kLogsUploadResultValueName, |
+ &logs_upload_result) == ERROR_SUCCESS) { |
+ RecordEnumerationHistogram( |
+ kLogsUploadsResultMetricName, |
+ static_cast<SwReporterLogsUploadsResult>(logs_upload_result), |
grt (UTC plus 2)
2016/09/16 15:59:20
cast this to a Sample rather than the enum since t
ftirelo
2016/09/16 19:26:55
Done.
|
+ REPORTER_LOGS_UPLOADS_RESULT_MAX); |
+ reporter_key.DeleteValue(kLogsUploadResultValueName); |
+ } |
+ } |
+ |
private: |
using Sample = base::HistogramBase::Sample; |
@@ -681,8 +728,10 @@ class ReporterRunner : public chrome::BrowserListObserver { |
// schedules the next run for a few days later, and the user might have |
// changed settings in the meantime. |
PrefService* local_state = g_browser_process->local_state(); |
- if (next_invocation.flags & SwReporterInvocation::FLAG_SEND_REPORTER_LOGS && |
+ if (next_invocation.supported_behaviours & |
+ SwReporterInvocation::REPORTER_BEHAVIOUR_SEND_REPORTER_LOGS && |
grt (UTC plus 2)
2016/09/16 15:59:20
wdyt about moving the enum out of SwReporterInvoca
ftirelo
2016/09/16 19:26:55
Done.
|
local_state && ShouldSendReporterLogs(*local_state)) { |
+ next_invocation.logs_upload_enabled = true; |
AddSwitchesForExtendedReporterUser(&next_invocation); |
// Set the local state value before the first attempt to run the |
// reporter, because we only want to upload logs once in the window |
@@ -745,13 +794,13 @@ class ReporterRunner : public chrome::BrowserListObserver { |
UMAHistogramReporter uma(finished_invocation.suffix); |
uma.ReportVersion(version); |
uma.ReportExitCode(exit_code); |
- uma.ReportFoundUwS(finished_invocation.flags & |
- SwReporterInvocation::FLAG_LOG_TO_RAPPOR); |
+ uma.ReportFoundUwS(finished_invocation.supported_behaviours & |
+ SwReporterInvocation::REPORTER_BEHAVIOUR_LOG_TO_RAPPOR); |
PrefService* local_state = g_browser_process->local_state(); |
if (local_state) { |
- if (finished_invocation.flags & |
- SwReporterInvocation::FLAG_LOG_EXIT_CODE_TO_PREFS) |
+ if (finished_invocation.supported_behaviours & |
+ SwReporterInvocation::REPORTER_BEHAVIOUR_LOG_EXIT_CODE_TO_PREFS) |
local_state->SetInteger(prefs::kSwReporterLastExitCode, exit_code); |
local_state->SetInt64(prefs::kSwReporterLastTimeTriggered, |
base::Time::Now().ToInternalValue()); |
@@ -759,9 +808,11 @@ class ReporterRunner : public chrome::BrowserListObserver { |
uma.ReportRuntime(reporter_running_time); |
uma.ReportScanTimes(); |
uma.ReportMemoryUsage(); |
+ if (finished_invocation.logs_upload_enabled) |
+ uma.RecordLogsUploadResult(); |
- if (!(finished_invocation.flags & |
- SwReporterInvocation::FLAG_TRIGGER_PROMPT)) |
+ if (!(finished_invocation.supported_behaviours & |
+ SwReporterInvocation::REPORTER_BEHAVIOUR_TRIGGER_PROMPT)) |
return; |
if (!IsInSRTPromptFieldTrialGroups()) { |
@@ -840,23 +891,30 @@ class ReporterRunner : public chrome::BrowserListObserver { |
// opted into Safe Browsing extended reporting, and logs have been sent at |
// least |kSwReporterLastTimeSentReport| days ago. |
bool ShouldSendReporterLogs(const PrefService& local_state) { |
- if (!base::FeatureList::IsEnabled(kSwReporterExtendedSafeBrowsingFeature) || |
- !SafeBrowsingExtendedReportingEnabled()) { |
+ if (!base::FeatureList::IsEnabled(kSwReporterExtendedSafeBrowsingFeature)) |
+ return false; |
+ |
+ UMAHistogramReporter uma; |
+ if (!SafeBrowsingExtendedReportingEnabled()) { |
+ uma.RecordLogsUploadEnabled(REPORTER_LOGS_UPLOADS_SBER_DISABLED); |
return false; |
} |
const base::Time now = base::Time::Now(); |
const base::Time last_time_sent_logs = base::Time::FromInternalValue( |
local_state.GetInt64(prefs::kSwReporterLastTimeSentReport)); |
- // Send the logs if the last send was in the future. This is intended as a |
- // measure for failure recovery, in case the time in local state is |
- // incorrectly set to the future. |
- if (last_time_sent_logs > now) |
+ const base::Time next_time_send_logs = |
+ last_time_sent_logs + |
+ base::TimeDelta::FromDays(kDaysBetweenReporterLogsSent); |
+ // Send the logs if the last send is the future or if the interval has |
+ // passed. The former is intended as a measure for failure recovery, in |
+ // case the time in local state is incorrectly set to the future. |
+ if (last_time_sent_logs > now || next_time_send_logs <= now) { |
+ uma.RecordLogsUploadEnabled(REPORTER_LOGS_UPLOADS_ENABLED); |
return true; |
- // Otherwise, send them if the interval has passed. |
- return last_time_sent_logs + |
- base::TimeDelta::FromDays(kDaysBetweenReporterLogsSent) <= |
- now; |
+ } |
+ uma.RecordLogsUploadEnabled(REPORTER_LOGS_UPLOADS_RECENTLY_SENT_LOGS); |
+ return false; |
} |
void AddSwitchesForExtendedReporterUser(SwReporterInvocation* invocation) { |
@@ -914,7 +972,9 @@ SwReporterInvocation SwReporterInvocation::FromCommandLine( |
bool SwReporterInvocation::operator==(const SwReporterInvocation& other) const { |
return command_line.argv() == other.command_line.argv() && |
- suffix == other.suffix && flags == other.flags; |
+ suffix == other.suffix && |
+ supported_behaviours == other.supported_behaviours && |
+ logs_upload_enabled == other.logs_upload_enabled; |
} |
void RunSwReporters(const SwReporterQueue& invocations, |