| OLD | NEW |
| 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 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 241 return NO_RESPONSE; | 241 return NO_RESPONSE; |
| 242 case 200: | 242 case 200: |
| 243 return SUCCESS; | 243 return SUCCESS; |
| 244 case 400: | 244 case 400: |
| 245 return BAD_REQUEST; | 245 return BAD_REQUEST; |
| 246 default: | 246 default: |
| 247 return UNKNOWN_FAILURE; | 247 return UNKNOWN_FAILURE; |
| 248 } | 248 } |
| 249 } | 249 } |
| 250 | 250 |
| 251 bool NewInitialMetricsTimingEnabled() { | |
| 252 return base::FieldTrialList::FindFullName("UMAInitialMetricsTiming") == | |
| 253 "Enabled"; | |
| 254 } | |
| 255 | |
| 256 void MarkAppCleanShutdownAndCommit(CleanExitBeacon* clean_exit_beacon, | 251 void MarkAppCleanShutdownAndCommit(CleanExitBeacon* clean_exit_beacon, |
| 257 PrefService* local_state) { | 252 PrefService* local_state) { |
| 258 clean_exit_beacon->WriteBeaconValue(true); | 253 clean_exit_beacon->WriteBeaconValue(true); |
| 259 local_state->SetInteger(prefs::kStabilityExecutionPhase, | 254 local_state->SetInteger(prefs::kStabilityExecutionPhase, |
| 260 MetricsService::SHUTDOWN_COMPLETE); | 255 MetricsService::SHUTDOWN_COMPLETE); |
| 261 // Start writing right away (write happens on a different thread). | 256 // Start writing right away (write happens on a different thread). |
| 262 local_state->CommitPendingWrite(); | 257 local_state->CommitPendingWrite(); |
| 263 } | 258 } |
| 264 | 259 |
| 265 } // namespace | 260 } // namespace |
| (...skipping 616 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 882 if (log_manager_.has_staged_log()) | 877 if (log_manager_.has_staged_log()) |
| 883 return; | 878 return; |
| 884 | 879 |
| 885 switch (state_) { | 880 switch (state_) { |
| 886 case INITIALIZED: | 881 case INITIALIZED: |
| 887 case INIT_TASK_SCHEDULED: // We should be further along by now. | 882 case INIT_TASK_SCHEDULED: // We should be further along by now. |
| 888 NOTREACHED(); | 883 NOTREACHED(); |
| 889 return; | 884 return; |
| 890 | 885 |
| 891 case INIT_TASK_DONE: | 886 case INIT_TASK_DONE: |
| 892 if (NewInitialMetricsTimingEnabled()) { | 887 PrepareInitialMetricsLog(); |
| 893 PrepareInitialMetricsLog(); | 888 // Stage the first log, which could be a stability log (either one |
| 894 // Stage the first log, which could be a stability log (either one | 889 // for created in this session or from a previous session) or the |
| 895 // for created in this session or from a previous session) or the | 890 // initial metrics log that was just created. |
| 896 // initial metrics log that was just created. | 891 log_manager_.StageNextLogForUpload(); |
| 897 log_manager_.StageNextLogForUpload(); | 892 if (has_initial_stability_log_) { |
| 898 if (has_initial_stability_log_) { | 893 // The initial stability log was just staged. |
| 899 // The initial stability log was just staged. | 894 has_initial_stability_log_ = false; |
| 900 has_initial_stability_log_ = false; | 895 state_ = SENDING_INITIAL_STABILITY_LOG; |
| 901 state_ = SENDING_INITIAL_STABILITY_LOG; | |
| 902 } else { | |
| 903 state_ = SENDING_INITIAL_METRICS_LOG; | |
| 904 } | |
| 905 } else { | 896 } else { |
| 906 if (has_initial_stability_log_) { | 897 state_ = SENDING_INITIAL_METRICS_LOG; |
| 907 // There's an initial stability log, ready to send. | |
| 908 log_manager_.StageNextLogForUpload(); | |
| 909 has_initial_stability_log_ = false; | |
| 910 state_ = SENDING_INITIAL_STABILITY_LOG; | |
| 911 } else { | |
| 912 PrepareInitialMetricsLog(); | |
| 913 log_manager_.StageNextLogForUpload(); | |
| 914 state_ = SENDING_INITIAL_METRICS_LOG; | |
| 915 } | |
| 916 } | 898 } |
| 917 break; | 899 break; |
| 918 | 900 |
| 919 case SENDING_OLD_LOGS: | 901 case SENDING_OLD_LOGS: |
| 920 NOTREACHED(); // Shouldn't be staging a new log during old log sending. | 902 NOTREACHED(); // Shouldn't be staging a new log during old log sending. |
| 921 return; | 903 return; |
| 922 | 904 |
| 923 case SENDING_CURRENT_LOGS: | 905 case SENDING_CURRENT_LOGS: |
| 924 CloseCurrentLog(); | 906 CloseCurrentLog(); |
| 925 OpenNewLog(); | 907 OpenNewLog(); |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1040 | 1022 |
| 1041 void MetricsService::OnLogUploadComplete(int response_code) { | 1023 void MetricsService::OnLogUploadComplete(int response_code) { |
| 1042 DCHECK(log_upload_in_progress_); | 1024 DCHECK(log_upload_in_progress_); |
| 1043 log_upload_in_progress_ = false; | 1025 log_upload_in_progress_ = false; |
| 1044 | 1026 |
| 1045 // Log a histogram to track response success vs. failure rates. | 1027 // Log a histogram to track response success vs. failure rates. |
| 1046 UMA_HISTOGRAM_ENUMERATION("UMA.UploadResponseStatus.Protobuf", | 1028 UMA_HISTOGRAM_ENUMERATION("UMA.UploadResponseStatus.Protobuf", |
| 1047 ResponseCodeToStatus(response_code), | 1029 ResponseCodeToStatus(response_code), |
| 1048 NUM_RESPONSE_STATUSES); | 1030 NUM_RESPONSE_STATUSES); |
| 1049 | 1031 |
| 1050 bool suppress_reschedule = false; | |
| 1051 | |
| 1052 bool upload_succeeded = response_code == 200; | 1032 bool upload_succeeded = response_code == 200; |
| 1053 | 1033 |
| 1054 // Provide boolean for error recovery (allow us to ignore response_code). | 1034 // Provide boolean for error recovery (allow us to ignore response_code). |
| 1055 bool discard_log = false; | 1035 bool discard_log = false; |
| 1056 const size_t log_size = log_manager_.staged_log().length(); | 1036 const size_t log_size = log_manager_.staged_log().length(); |
| 1057 if (upload_succeeded) { | 1037 if (upload_succeeded) { |
| 1058 UMA_HISTOGRAM_COUNTS_10000("UMA.LogSize.OnSuccess", log_size / 1024); | 1038 UMA_HISTOGRAM_COUNTS_10000("UMA.LogSize.OnSuccess", log_size / 1024); |
| 1059 } else if (log_size > kUploadLogAvoidRetransmitSize) { | 1039 } else if (log_size > kUploadLogAvoidRetransmitSize) { |
| 1060 UMA_HISTOGRAM_COUNTS("UMA.Large Rejected Log was Discarded", | 1040 UMA_HISTOGRAM_COUNTS("UMA.Large Rejected Log was Discarded", |
| 1061 static_cast<int>(log_size)); | 1041 static_cast<int>(log_size)); |
| 1062 discard_log = true; | 1042 discard_log = true; |
| 1063 } else if (response_code == 400) { | 1043 } else if (response_code == 400) { |
| 1064 // Bad syntax. Retransmission won't work. | 1044 // Bad syntax. Retransmission won't work. |
| 1065 discard_log = true; | 1045 discard_log = true; |
| 1066 } | 1046 } |
| 1067 | 1047 |
| 1068 if (upload_succeeded || discard_log) { | 1048 if (upload_succeeded || discard_log) { |
| 1069 log_manager_.DiscardStagedLog(); | 1049 log_manager_.DiscardStagedLog(); |
| 1070 // Store the updated list to disk now that the removed log is uploaded. | 1050 // Store the updated list to disk now that the removed log is uploaded. |
| 1071 log_manager_.PersistUnsentLogs(); | 1051 log_manager_.PersistUnsentLogs(); |
| 1072 } | 1052 } |
| 1073 | 1053 |
| 1074 if (!log_manager_.has_staged_log()) { | 1054 if (!log_manager_.has_staged_log()) { |
| 1075 switch (state_) { | 1055 switch (state_) { |
| 1076 case SENDING_INITIAL_STABILITY_LOG: | 1056 case SENDING_INITIAL_STABILITY_LOG: |
| 1077 if (NewInitialMetricsTimingEnabled()) { | 1057 // The initial metrics log is already in the queue of unsent logs. |
| 1078 // The initial metrics log is already in the queue of unsent logs. | 1058 state_ = SENDING_OLD_LOGS; |
| 1079 state_ = SENDING_OLD_LOGS; | |
| 1080 } else { | |
| 1081 PrepareInitialMetricsLog(); | |
| 1082 log_manager_.StageNextLogForUpload(); | |
| 1083 SendStagedLog(); | |
| 1084 state_ = SENDING_INITIAL_METRICS_LOG; | |
| 1085 suppress_reschedule = true; | |
| 1086 } | |
| 1087 break; | 1059 break; |
| 1088 | 1060 |
| 1089 case SENDING_INITIAL_METRICS_LOG: | 1061 case SENDING_INITIAL_METRICS_LOG: |
| 1090 state_ = log_manager_.has_unsent_logs() ? SENDING_OLD_LOGS | 1062 state_ = log_manager_.has_unsent_logs() ? SENDING_OLD_LOGS |
| 1091 : SENDING_CURRENT_LOGS; | 1063 : SENDING_CURRENT_LOGS; |
| 1092 break; | 1064 break; |
| 1093 | 1065 |
| 1094 case SENDING_OLD_LOGS: | 1066 case SENDING_OLD_LOGS: |
| 1095 if (!log_manager_.has_unsent_logs()) | 1067 if (!log_manager_.has_unsent_logs()) |
| 1096 state_ = SENDING_CURRENT_LOGS; | 1068 state_ = SENDING_CURRENT_LOGS; |
| 1097 break; | 1069 break; |
| 1098 | 1070 |
| 1099 case SENDING_CURRENT_LOGS: | 1071 case SENDING_CURRENT_LOGS: |
| 1100 break; | 1072 break; |
| 1101 | 1073 |
| 1102 default: | 1074 default: |
| 1103 NOTREACHED(); | 1075 NOTREACHED(); |
| 1104 break; | 1076 break; |
| 1105 } | 1077 } |
| 1106 | 1078 |
| 1107 if (log_manager_.has_unsent_logs()) | 1079 if (log_manager_.has_unsent_logs()) |
| 1108 DCHECK_LT(state_, SENDING_CURRENT_LOGS); | 1080 DCHECK_LT(state_, SENDING_CURRENT_LOGS); |
| 1109 } | 1081 } |
| 1110 | 1082 |
| 1111 // Error 400 indicates a problem with the log, not with the server, so | 1083 // Error 400 indicates a problem with the log, not with the server, so |
| 1112 // don't consider that a sign that the server is in trouble. | 1084 // don't consider that a sign that the server is in trouble. |
| 1113 bool server_is_healthy = upload_succeeded || response_code == 400; | 1085 bool server_is_healthy = upload_succeeded || response_code == 400; |
| 1114 // Don't notify the scheduler that the upload is finished if we've only just | 1086 scheduler_->UploadFinished(server_is_healthy, log_manager_.has_unsent_logs()); |
| 1115 // sent the initial stability log, but not yet the initial metrics log (treat | |
| 1116 // the two as a single unit of work as far as the scheduler is concerned). | |
| 1117 if (!suppress_reschedule) { | |
| 1118 scheduler_->UploadFinished(server_is_healthy, | |
| 1119 log_manager_.has_unsent_logs()); | |
| 1120 } | |
| 1121 | 1087 |
| 1122 if (server_is_healthy) | 1088 if (server_is_healthy) |
| 1123 client_->OnLogUploadComplete(); | 1089 client_->OnLogUploadComplete(); |
| 1124 } | 1090 } |
| 1125 | 1091 |
| 1126 void MetricsService::IncrementPrefValue(const char* path) { | 1092 void MetricsService::IncrementPrefValue(const char* path) { |
| 1127 int value = local_state_->GetInteger(path); | 1093 int value = local_state_->GetInteger(path); |
| 1128 local_state_->SetInteger(path, value + 1); | 1094 local_state_->SetInteger(path, value + 1); |
| 1129 } | 1095 } |
| 1130 | 1096 |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1258 base::Time::Now().ToTimeT()); | 1224 base::Time::Now().ToTimeT()); |
| 1259 } | 1225 } |
| 1260 | 1226 |
| 1261 void MetricsService::SetConnectionTypeCallback( | 1227 void MetricsService::SetConnectionTypeCallback( |
| 1262 base::Callback<void(bool*)> is_cellular_callback) { | 1228 base::Callback<void(bool*)> is_cellular_callback) { |
| 1263 DCHECK(!scheduler_); | 1229 DCHECK(!scheduler_); |
| 1264 is_cellular_callback_ = is_cellular_callback; | 1230 is_cellular_callback_ = is_cellular_callback; |
| 1265 } | 1231 } |
| 1266 | 1232 |
| 1267 } // namespace metrics | 1233 } // namespace metrics |
| OLD | NEW |