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

Unified Diff: chrome/browser/metrics/metrics_service.cc

Issue 291153013: Make MetricsService upload logs through an interface. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Casts for win64 compile Created 6 years, 7 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/metrics/metrics_service.h ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/metrics/metrics_service.cc
===================================================================
--- chrome/browser/metrics/metrics_service.cc (revision 274045)
+++ 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"
@@ -196,12 +195,11 @@
#include "chrome/common/variations/variations_util.h"
#include "components/metrics/metrics_log_base.h"
#include "components/metrics/metrics_log_manager.h"
+#include "components/metrics/metrics_log_uploader.h"
#include "components/metrics/metrics_pref_names.h"
#include "components/metrics/metrics_reporting_scheduler.h"
#include "components/metrics/metrics_service_client.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.
@@ -270,12 +268,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;
}
@@ -371,11 +369,11 @@
test_mode_active_(false),
state_(INITIALIZED),
has_initial_stability_log_(false),
+ log_upload_in_progress_(false),
idle_since_last_transmission_(false),
session_id_(-1),
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_);
@@ -885,7 +883,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;
@@ -960,11 +958,11 @@
}
void MetricsService::OnFinalLogInfoCollectionDone() {
- // 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
+ // If somehow there is a log upload 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.
@@ -1111,79 +1109,40 @@
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) {
- // Compression failed, and log discarded :-/.
+ 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) {
// Skip this upload and hope things work out next time.
log_manager_.DiscardStagedLog();
scheduler_->UploadCancelled();
+ log_upload_in_progress_ = false;
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),
@@ -1210,8 +1169,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:
« no previous file with comments | « chrome/browser/metrics/metrics_service.h ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698