Chromium Code Reviews| Index: chrome/browser/metrics/metrics_service.cc |
| =================================================================== |
| --- chrome/browser/metrics/metrics_service.cc (revision 272759) |
| +++ chrome/browser/metrics/metrics_service.cc (working copy) |
| @@ -185,7 +185,6 @@ |
| #include "chrome/browser/chrome_notification_types.h" |
| #include "chrome/browser/io_thread.h" |
| #include "chrome/browser/metrics/chrome_stability_metrics_provider.h" |
| -#include "chrome/browser/metrics/compression_utils.h" |
| #include "chrome/browser/metrics/gpu_metrics_provider.h" |
| #include "chrome/browser/metrics/metrics_log.h" |
| #include "chrome/browser/metrics/metrics_state_manager.h" |
| @@ -199,9 +198,8 @@ |
| #include "components/metrics/metrics_pref_names.h" |
| #include "components/metrics/metrics_reporting_scheduler.h" |
| #include "components/metrics/metrics_service_client.h" |
| +#include "components/metrics/net/compression_utils.h" |
| #include "components/variations/entropy_provider.h" |
| -#include "net/base/load_flags.h" |
| -#include "net/url_request/url_fetcher.h" |
| #if defined(ENABLE_PLUGINS) |
| // TODO(asvitkine): Move this out of MetricsService. |
| @@ -277,12 +275,12 @@ |
| ResponseStatus ResponseCodeToStatus(int response_code) { |
| switch (response_code) { |
| + case -1: |
| + return NO_RESPONSE; |
| case 200: |
| return SUCCESS; |
| case 400: |
| return BAD_REQUEST; |
| - case net::URLFetcher::RESPONSE_CODE_INVALID: |
| - return NO_RESPONSE; |
| default: |
| return UNKNOWN_FAILURE; |
| } |
| @@ -378,12 +376,12 @@ |
| test_mode_active_(false), |
| state_(INITIALIZED), |
| has_initial_stability_log_(false), |
| + log_upload_in_progress_(false), |
| idle_since_last_transmission_(false), |
| session_id_(-1), |
| next_window_id_(0), |
| self_ptr_factory_(this), |
| - state_saver_factory_(this), |
| - waiting_for_asynchronous_reporting_step_(false) { |
| + state_saver_factory_(this) { |
| DCHECK(IsSingleThreaded()); |
| DCHECK(state_manager_); |
| DCHECK(client_); |
| @@ -931,7 +929,7 @@ |
| if (log_manager_.has_staged_log()) { |
| // We may race here, and send second copy of the log later. |
| metrics::PersistedLogs::StoreType store_type; |
| - if (current_fetch_.get()) |
| + if (log_upload_in_progress_) |
| store_type = metrics::PersistedLogs::PROVISIONAL_STORE; |
| else |
| store_type = metrics::PersistedLogs::NORMAL_STORE; |
| @@ -1009,8 +1007,8 @@ |
| // If somehow there is a fetch in progress, we return and hope things work |
| // out. The scheduler isn't informed since if this happens, the scheduler |
| // will get a response from the upload. |
| - DCHECK(!current_fetch_.get()); |
| - if (current_fetch_.get()) |
| + DCHECK(!log_upload_in_progress_); |
| + if (log_upload_in_progress_) |
| return; |
| // Abort if metrics were turned off during the final info gathering. |
| @@ -1160,12 +1158,25 @@ |
| void MetricsService::SendStagedLog() { |
| DCHECK(log_manager_.has_staged_log()); |
| + if (!log_manager_.has_staged_log()) |
| + return; |
| - PrepareFetchWithStagedLog(); |
| + DCHECK(!log_upload_in_progress_); |
| + log_upload_in_progress_ = true; |
| - bool upload_created = (current_fetch_.get() != NULL); |
| - UMA_HISTOGRAM_BOOLEAN("UMA.UploadCreation", upload_created); |
| - if (!upload_created) { |
| + if (!log_uploader_) { |
| + log_uploader_ = client_->CreateUploader( |
| + kServerUrl, kMimeType, |
| + base::Bind(&MetricsService::OnLogUploadComplete, |
| + self_ptr_factory_.GetWeakPtr())); |
| + } |
| + |
| + const std::string hash = |
| + base::HexEncode(log_manager_.staged_log_hash().data(), |
| + log_manager_.staged_log_hash().size()); |
| + bool success = log_uploader_->UploadLog(log_manager_.staged_log(), hash); |
| + UMA_HISTOGRAM_BOOLEAN("UMA.UploadCreation", success); |
| + if (!success) { |
| // Compression failed, and log discarded :-/. |
|
blundell
2014/05/26 07:56:56
is this comment a little out of date now?
Alexei Svitkine (slow)
2014/05/26 20:04:10
Done.
|
| // Skip this upload and hope things work out next time. |
| log_manager_.DiscardStagedLog(); |
| @@ -1173,66 +1184,14 @@ |
| return; |
| } |
| - DCHECK(!waiting_for_asynchronous_reporting_step_); |
| - waiting_for_asynchronous_reporting_step_ = true; |
| - |
| - current_fetch_->Start(); |
| - |
| HandleIdleSinceLastTransmission(true); |
| } |
| -void MetricsService::PrepareFetchWithStagedLog() { |
| - DCHECK(log_manager_.has_staged_log()); |
| - // Prepare the protobuf version. |
| - DCHECK(!current_fetch_.get()); |
| - if (log_manager_.has_staged_log()) { |
| - current_fetch_.reset(net::URLFetcher::Create( |
| - GURL(kServerUrl), net::URLFetcher::POST, this)); |
| - current_fetch_->SetRequestContext( |
| - g_browser_process->system_request_context()); |
| +void MetricsService::OnLogUploadComplete(int response_code) { |
| + DCHECK(log_upload_in_progress_); |
| + log_upload_in_progress_ = false; |
| - std::string log_text = log_manager_.staged_log(); |
| - std::string compressed_log_text; |
| - bool compression_successful = chrome::GzipCompress(log_text, |
| - &compressed_log_text); |
| - DCHECK(compression_successful); |
| - if (compression_successful) { |
| - current_fetch_->SetUploadData(kMimeType, compressed_log_text); |
| - // Tell the server that we're uploading gzipped protobufs. |
| - current_fetch_->SetExtraRequestHeaders("content-encoding: gzip"); |
| - const std::string hash = |
| - base::HexEncode(log_manager_.staged_log_hash().data(), |
| - log_manager_.staged_log_hash().size()); |
| - DCHECK(!hash.empty()); |
| - current_fetch_->AddExtraRequestHeader("X-Chrome-UMA-Log-SHA1: " + hash); |
| - UMA_HISTOGRAM_PERCENTAGE( |
| - "UMA.ProtoCompressionRatio", |
| - 100 * compressed_log_text.size() / log_text.size()); |
| - UMA_HISTOGRAM_CUSTOM_COUNTS( |
| - "UMA.ProtoGzippedKBSaved", |
| - (log_text.size() - compressed_log_text.size()) / 1024, |
| - 1, 2000, 50); |
| - } |
| - |
| - // We already drop cookies server-side, but we might as well strip them out |
| - // client-side as well. |
| - current_fetch_->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES | |
| - net::LOAD_DO_NOT_SEND_COOKIES); |
| - } |
| -} |
| - |
| -void MetricsService::OnURLFetchComplete(const net::URLFetcher* source) { |
| - DCHECK(waiting_for_asynchronous_reporting_step_); |
| - |
| - // We're not allowed to re-use the existing |URLFetcher|s, so free them here. |
| - // Note however that |source| is aliased to the fetcher, so we should be |
| - // careful not to delete it too early. |
| - DCHECK_EQ(current_fetch_.get(), source); |
| - scoped_ptr<net::URLFetcher> s(current_fetch_.Pass()); |
| - |
| - int response_code = source->GetResponseCode(); |
| - |
| // Log a histogram to track response success vs. failure rates. |
| UMA_HISTOGRAM_ENUMERATION("UMA.UploadResponseStatus.Protobuf", |
| ResponseCodeToStatus(response_code), |
| @@ -1259,8 +1218,6 @@ |
| if (upload_succeeded || discard_log) |
| log_manager_.DiscardStagedLog(); |
| - waiting_for_asynchronous_reporting_step_ = false; |
| - |
| if (!log_manager_.has_staged_log()) { |
| switch (state_) { |
| case SENDING_INITIAL_STABILITY_LOG: |