Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(143)

Side by Side Diff: components/metrics/metrics_service.cc

Issue 384063004: Standardize persisted log loading (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 //------------------------------------------------------------------------------ 5 //------------------------------------------------------------------------------
6 // Description of the life cycle of a instance of MetricsService. 6 // Description of the life cycle of a instance of MetricsService.
7 // 7 //
8 // OVERVIEW 8 // OVERVIEW
9 // 9 //
10 // A MetricsService instance is typically created at application startup. It is 10 // A MetricsService instance is typically created at application startup. It is
(...skipping 539 matching lines...) Expand 10 before | Expand all | Expand 10 after
550 550
551 //------------------------------------------------------------------------------ 551 //------------------------------------------------------------------------------
552 // Initialization methods 552 // Initialization methods
553 553
554 void MetricsService::InitializeMetricsState() { 554 void MetricsService::InitializeMetricsState() {
555 local_state_->SetString(metrics::prefs::kStabilityStatsVersion, 555 local_state_->SetString(metrics::prefs::kStabilityStatsVersion,
556 client_->GetVersionString()); 556 client_->GetVersionString());
557 local_state_->SetInt64(metrics::prefs::kStabilityStatsBuildTime, 557 local_state_->SetInt64(metrics::prefs::kStabilityStatsBuildTime,
558 MetricsLog::GetBuildTime()); 558 MetricsLog::GetBuildTime());
559 559
560 log_manager_.LoadPersistedUnsentLogs();
561
560 session_id_ = local_state_->GetInteger(metrics::prefs::kMetricsSessionID); 562 session_id_ = local_state_->GetInteger(metrics::prefs::kMetricsSessionID);
561 563
562 if (!local_state_->GetBoolean(metrics::prefs::kStabilityExitedCleanly)) { 564 if (!local_state_->GetBoolean(metrics::prefs::kStabilityExitedCleanly)) {
563 IncrementPrefValue(metrics::prefs::kStabilityCrashCount); 565 IncrementPrefValue(metrics::prefs::kStabilityCrashCount);
564 // Reset flag, and wait until we call LogNeedForCleanShutdown() before 566 // Reset flag, and wait until we call LogNeedForCleanShutdown() before
565 // monitoring. 567 // monitoring.
566 local_state_->SetBoolean(metrics::prefs::kStabilityExitedCleanly, true); 568 local_state_->SetBoolean(metrics::prefs::kStabilityExitedCleanly, true);
567 569
568 // TODO(rtenneti): On windows, consider saving/getting execution_phase from 570 // TODO(rtenneti): On windows, consider saving/getting execution_phase from
569 // the registry. 571 // the registry.
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
734 UMA_HISTOGRAM_COUNTS("UMA.Discarded Log Events", 736 UMA_HISTOGRAM_COUNTS("UMA.Discarded Log Events",
735 log_manager_.current_log()->num_events()); 737 log_manager_.current_log()->num_events());
736 log_manager_.DiscardCurrentLog(); 738 log_manager_.DiscardCurrentLog();
737 OpenNewLog(); // Start trivial log to hold our histograms. 739 OpenNewLog(); // Start trivial log to hold our histograms.
738 } 740 }
739 741
740 // Put incremental data (histogram deltas, and realtime stats deltas) at the 742 // Put incremental data (histogram deltas, and realtime stats deltas) at the
741 // end of all log transmissions (initial log handles this separately). 743 // end of all log transmissions (initial log handles this separately).
742 // RecordIncrementalStabilityElements only exists on the derived 744 // RecordIncrementalStabilityElements only exists on the derived
743 // MetricsLog class. 745 // MetricsLog class.
744 MetricsLog* current_log = 746 MetricsLog* current_log = log_manager_.current_log();
745 static_cast<MetricsLog*>(log_manager_.current_log());
746 DCHECK(current_log); 747 DCHECK(current_log);
747 std::vector<variations::ActiveGroupId> synthetic_trials; 748 std::vector<variations::ActiveGroupId> synthetic_trials;
748 GetCurrentSyntheticFieldTrials(&synthetic_trials); 749 GetCurrentSyntheticFieldTrials(&synthetic_trials);
749 current_log->RecordEnvironment( 750 current_log->RecordEnvironment(
750 metrics_providers_.get(), synthetic_trials, GetInstallDate()); 751 metrics_providers_.get(), synthetic_trials, GetInstallDate());
751 base::TimeDelta incremental_uptime; 752 base::TimeDelta incremental_uptime;
752 base::TimeDelta uptime; 753 base::TimeDelta uptime;
753 GetUptimes(local_state_, &incremental_uptime, &uptime); 754 GetUptimes(local_state_, &incremental_uptime, &uptime);
754 current_log->RecordStabilityMetrics(metrics_providers_.get(), 755 current_log->RecordStabilityMetrics(metrics_providers_.get(),
755 incremental_uptime, uptime); 756 incremental_uptime, uptime);
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
881 case INITIALIZED: 882 case INITIALIZED:
882 case INIT_TASK_SCHEDULED: // We should be further along by now. 883 case INIT_TASK_SCHEDULED: // We should be further along by now.
883 NOTREACHED(); 884 NOTREACHED();
884 return; 885 return;
885 886
886 case INIT_TASK_DONE: 887 case INIT_TASK_DONE:
887 if (has_initial_stability_log_) { 888 if (has_initial_stability_log_) {
888 // There's an initial stability log, ready to send. 889 // There's an initial stability log, ready to send.
889 log_manager_.StageNextLogForUpload(); 890 log_manager_.StageNextLogForUpload();
890 has_initial_stability_log_ = false; 891 has_initial_stability_log_ = false;
891 // Note: No need to call LoadPersistedUnsentLogs() here because unsent
892 // logs have already been loaded by PrepareInitialStabilityLog().
893 state_ = SENDING_INITIAL_STABILITY_LOG; 892 state_ = SENDING_INITIAL_STABILITY_LOG;
894 } else { 893 } else {
895 PrepareInitialMetricsLog(); 894 PrepareInitialMetricsLog();
896 // Load unsent logs (if any) from local state.
897 log_manager_.LoadPersistedUnsentLogs();
898 state_ = SENDING_INITIAL_METRICS_LOG; 895 state_ = SENDING_INITIAL_METRICS_LOG;
899 } 896 }
900 break; 897 break;
901 898
902 case SENDING_OLD_LOGS: 899 case SENDING_OLD_LOGS:
903 NOTREACHED(); // Shouldn't be staging a new log during old log sending. 900 NOTREACHED(); // Shouldn't be staging a new log during old log sending.
904 return; 901 return;
905 902
906 case SENDING_CURRENT_LOGS: 903 case SENDING_CURRENT_LOGS:
907 CloseCurrentLog(); 904 CloseCurrentLog();
(...skipping 15 matching lines...) Expand all
923 920
924 scoped_ptr<MetricsLog> initial_stability_log( 921 scoped_ptr<MetricsLog> initial_stability_log(
925 CreateLog(MetricsLog::INITIAL_STABILITY_LOG)); 922 CreateLog(MetricsLog::INITIAL_STABILITY_LOG));
926 923
927 // Do not call NotifyOnDidCreateMetricsLog here because the stability 924 // Do not call NotifyOnDidCreateMetricsLog here because the stability
928 // log describes stats from the _previous_ session. 925 // log describes stats from the _previous_ session.
929 926
930 if (!initial_stability_log->LoadSavedEnvironmentFromPrefs()) 927 if (!initial_stability_log->LoadSavedEnvironmentFromPrefs())
931 return; 928 return;
932 929
933 log_manager_.LoadPersistedUnsentLogs();
934
935 log_manager_.PauseCurrentLog(); 930 log_manager_.PauseCurrentLog();
936 log_manager_.BeginLoggingWithLog(initial_stability_log.Pass()); 931 log_manager_.BeginLoggingWithLog(initial_stability_log.Pass());
937 932
938 // Note: Some stability providers may record stability stats via histograms, 933 // Note: Some stability providers may record stability stats via histograms,
939 // so this call has to be after BeginLoggingWithLog(). 934 // so this call has to be after BeginLoggingWithLog().
940 log_manager_.current_log()->RecordStabilityMetrics( 935 log_manager_.current_log()->RecordStabilityMetrics(
941 metrics_providers_.get(), base::TimeDelta(), base::TimeDelta()); 936 metrics_providers_.get(), base::TimeDelta(), base::TimeDelta());
942 RecordCurrentStabilityHistograms(); 937 RecordCurrentStabilityHistograms();
943 938
944 // Note: RecordGeneralMetrics() intentionally not called since this log is for 939 // Note: RecordGeneralMetrics() intentionally not called since this log is for
(...skipping 21 matching lines...) Expand all
966 base::TimeDelta uptime; 961 base::TimeDelta uptime;
967 GetUptimes(local_state_, &incremental_uptime, &uptime); 962 GetUptimes(local_state_, &incremental_uptime, &uptime);
968 963
969 // Histograms only get written to the current log, so make the new log current 964 // Histograms only get written to the current log, so make the new log current
970 // before writing them. 965 // before writing them.
971 log_manager_.PauseCurrentLog(); 966 log_manager_.PauseCurrentLog();
972 log_manager_.BeginLoggingWithLog(initial_metrics_log_.Pass()); 967 log_manager_.BeginLoggingWithLog(initial_metrics_log_.Pass());
973 968
974 // Note: Some stability providers may record stability stats via histograms, 969 // Note: Some stability providers may record stability stats via histograms,
975 // so this call has to be after BeginLoggingWithLog(). 970 // so this call has to be after BeginLoggingWithLog().
976 MetricsLog* current_log = 971 MetricsLog* current_log = log_manager_.current_log();
977 static_cast<MetricsLog*>(log_manager_.current_log());
978 current_log->RecordStabilityMetrics(metrics_providers_.get(), 972 current_log->RecordStabilityMetrics(metrics_providers_.get(),
979 base::TimeDelta(), base::TimeDelta()); 973 base::TimeDelta(), base::TimeDelta());
980 RecordCurrentHistograms(); 974 RecordCurrentHistograms();
981 975
982 current_log->RecordGeneralMetrics(metrics_providers_.get()); 976 current_log->RecordGeneralMetrics(metrics_providers_.get());
983 977
984 log_manager_.FinishCurrentLog(); 978 log_manager_.FinishCurrentLog();
985 log_manager_.ResumePausedLog(); 979 log_manager_.ResumePausedLog();
986 980
981 // Store unsent logs, including the initial log that was just saved, so
982 // that they're not lost in case of a crash before upload time.
983 log_manager_.PersistUnsentLogs();
984
987 DCHECK(!log_manager_.has_staged_log()); 985 DCHECK(!log_manager_.has_staged_log());
988 log_manager_.StageNextLogForUpload(); 986 log_manager_.StageNextLogForUpload();
989 } 987 }
990 988
991 void MetricsService::SendStagedLog() { 989 void MetricsService::SendStagedLog() {
992 DCHECK(log_manager_.has_staged_log()); 990 DCHECK(log_manager_.has_staged_log());
993 if (!log_manager_.has_staged_log()) 991 if (!log_manager_.has_staged_log())
994 return; 992 return;
995 993
996 DCHECK(!log_upload_in_progress_); 994 DCHECK(!log_upload_in_progress_);
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1040 const size_t log_size = log_manager_.staged_log().length(); 1038 const size_t log_size = log_manager_.staged_log().length();
1041 if (!upload_succeeded && log_size > kUploadLogAvoidRetransmitSize) { 1039 if (!upload_succeeded && log_size > kUploadLogAvoidRetransmitSize) {
1042 UMA_HISTOGRAM_COUNTS("UMA.Large Rejected Log was Discarded", 1040 UMA_HISTOGRAM_COUNTS("UMA.Large Rejected Log was Discarded",
1043 static_cast<int>(log_size)); 1041 static_cast<int>(log_size));
1044 discard_log = true; 1042 discard_log = true;
1045 } else if (response_code == 400) { 1043 } else if (response_code == 400) {
1046 // Bad syntax. Retransmission won't work. 1044 // Bad syntax. Retransmission won't work.
1047 discard_log = true; 1045 discard_log = true;
1048 } 1046 }
1049 1047
1050 if (upload_succeeded || discard_log) 1048 if (upload_succeeded || discard_log) {
1051 log_manager_.DiscardStagedLog(); 1049 log_manager_.DiscardStagedLog();
1050 // Store the updated list to disk now that the removed log is uploaded.
1051 log_manager_.PersistUnsentLogs();
1052 }
1052 1053
1053 if (!log_manager_.has_staged_log()) { 1054 if (!log_manager_.has_staged_log()) {
1054 switch (state_) { 1055 switch (state_) {
1055 case SENDING_INITIAL_STABILITY_LOG: 1056 case SENDING_INITIAL_STABILITY_LOG:
1056 // Store the updated list to disk now that the removed log is uploaded.
1057 log_manager_.PersistUnsentLogs();
1058 PrepareInitialMetricsLog(); 1057 PrepareInitialMetricsLog();
1059 SendStagedLog(); 1058 SendStagedLog();
1060 state_ = SENDING_INITIAL_METRICS_LOG; 1059 state_ = SENDING_INITIAL_METRICS_LOG;
1061 break; 1060 break;
1062 1061
1063 case SENDING_INITIAL_METRICS_LOG: 1062 case SENDING_INITIAL_METRICS_LOG:
1064 // The initial metrics log never gets persisted to local state, so it's
1065 // not necessary to call log_manager_.PersistUnsentLogs() here.
1066 // TODO(asvitkine): It should be persisted like the initial stability
1067 // log and old unsent logs. http://crbug.com/328417
1068 state_ = log_manager_.has_unsent_logs() ? SENDING_OLD_LOGS 1063 state_ = log_manager_.has_unsent_logs() ? SENDING_OLD_LOGS
1069 : SENDING_CURRENT_LOGS; 1064 : SENDING_CURRENT_LOGS;
1070 break; 1065 break;
1071 1066
1072 case SENDING_OLD_LOGS: 1067 case SENDING_OLD_LOGS:
1073 // Store the updated list to disk now that the removed log is uploaded.
1074 log_manager_.PersistUnsentLogs();
1075 if (!log_manager_.has_unsent_logs()) 1068 if (!log_manager_.has_unsent_logs())
1076 state_ = SENDING_CURRENT_LOGS; 1069 state_ = SENDING_CURRENT_LOGS;
1077 break; 1070 break;
1078 1071
1079 case SENDING_CURRENT_LOGS: 1072 case SENDING_CURRENT_LOGS:
1080 break; 1073 break;
1081 1074
1082 default: 1075 default:
1083 NOTREACHED(); 1076 NOTREACHED();
1084 break; 1077 break;
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
1144 1137
1145 void MetricsService::CheckForClonedInstall( 1138 void MetricsService::CheckForClonedInstall(
1146 scoped_refptr<base::SingleThreadTaskRunner> task_runner) { 1139 scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
1147 state_manager_->CheckForClonedInstall(task_runner); 1140 state_manager_->CheckForClonedInstall(task_runner);
1148 } 1141 }
1149 1142
1150 void MetricsService::GetCurrentSyntheticFieldTrials( 1143 void MetricsService::GetCurrentSyntheticFieldTrials(
1151 std::vector<variations::ActiveGroupId>* synthetic_trials) { 1144 std::vector<variations::ActiveGroupId>* synthetic_trials) {
1152 DCHECK(synthetic_trials); 1145 DCHECK(synthetic_trials);
1153 synthetic_trials->clear(); 1146 synthetic_trials->clear();
1154 const MetricsLog* current_log = 1147 const MetricsLog* current_log = log_manager_.current_log();
1155 static_cast<const MetricsLog*>(log_manager_.current_log());
1156 for (size_t i = 0; i < synthetic_trial_groups_.size(); ++i) { 1148 for (size_t i = 0; i < synthetic_trial_groups_.size(); ++i) {
1157 if (synthetic_trial_groups_[i].start_time <= current_log->creation_time()) 1149 if (synthetic_trial_groups_[i].start_time <= current_log->creation_time())
1158 synthetic_trials->push_back(synthetic_trial_groups_[i].id); 1150 synthetic_trials->push_back(synthetic_trial_groups_[i].id);
1159 } 1151 }
1160 } 1152 }
1161 1153
1162 scoped_ptr<MetricsLog> MetricsService::CreateLog(MetricsLog::LogType log_type) { 1154 scoped_ptr<MetricsLog> MetricsService::CreateLog(MetricsLog::LogType log_type) {
1163 return make_scoped_ptr(new MetricsLog(state_manager_->client_id(), 1155 return make_scoped_ptr(new MetricsLog(state_manager_->client_id(),
1164 session_id_, 1156 session_id_,
1165 log_type, 1157 log_type,
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1205 RecordCurrentState(local_state_); 1197 RecordCurrentState(local_state_);
1206 } 1198 }
1207 1199
1208 void MetricsService::RecordCurrentState(PrefService* pref) { 1200 void MetricsService::RecordCurrentState(PrefService* pref) {
1209 pref->SetInt64(metrics::prefs::kStabilityLastTimestampSec, 1201 pref->SetInt64(metrics::prefs::kStabilityLastTimestampSec,
1210 Time::Now().ToTimeT()); 1202 Time::Now().ToTimeT());
1211 1203
1212 for (size_t i = 0; i < metrics_providers_.size(); ++i) 1204 for (size_t i = 0; i < metrics_providers_.size(); ++i)
1213 metrics_providers_[i]->RecordCurrentState(); 1205 metrics_providers_[i]->RecordCurrentState();
1214 } 1206 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698