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

Unified Diff: components/data_reduction_proxy/core/browser/data_reduction_proxy_metrics.cc

Issue 1054363002: Update DataReductionProxyNetworkDelegate/BypassStats to post tasks safely. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: bengr CR comments Created 5 years, 8 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
Index: components/data_reduction_proxy/core/browser/data_reduction_proxy_metrics.cc
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_metrics.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_metrics.cc
index 0408a7bde7cf6b6ebe8c782b4878063e181f4f5c..39efaa97b4985c1c74528d924027fd8d99bf5e14 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_metrics.cc
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_metrics.cc
@@ -4,296 +4,19 @@
#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_metrics.h"
-#include "base/metrics/histogram.h"
-#include "base/prefs/pref_service.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_util.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.h"
+#include "base/basictypes.h"
#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_config.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h"
#include "components/data_reduction_proxy/core/common/data_reduction_proxy_headers.h"
-#include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h"
-#include "net/base/host_port_pair.h"
#include "net/base/load_flags.h"
-#include "net/http/http_response_headers.h"
+#include "net/http/http_response_info.h"
#include "net/proxy/proxy_config.h"
-#include "net/proxy/proxy_retry_info.h"
#include "net/proxy/proxy_server.h"
-#include "net/proxy/proxy_service.h"
#include "net/url_request/url_request.h"
#include "net/url_request/url_request_context.h"
#include "url/url_constants.h"
namespace data_reduction_proxy {
-namespace {
-
-// A bypass delay more than this is treated as a long delay.
-const int kLongBypassDelayInSeconds = 30 * 60;
-
-// Increments an int64, stored as a string, in a ListPref at the specified
-// index. The value must already exist and be a string representation of a
-// number.
-void AddInt64ToListPref(size_t index,
- int64 length,
- base::ListValue* list_update) {
- int64 value = 0;
- std::string old_string_value;
- bool rv = list_update->GetString(index, &old_string_value);
- DCHECK(rv);
- if (rv) {
- rv = base::StringToInt64(old_string_value, &value);
- DCHECK(rv);
- }
- value += length;
- list_update->Set(index, new base::StringValue(base::Int64ToString(value)));
-}
-
-int64 ListPrefInt64Value(const base::ListValue& list_update, size_t index) {
- std::string string_value;
- if (!list_update.GetString(index, &string_value)) {
- NOTREACHED();
- return 0;
- }
-
- int64 value = 0;
- bool rv = base::StringToInt64(string_value, &value);
- DCHECK(rv);
- return value;
-}
-
-// Report UMA metrics for daily data reductions.
-void RecordDailyContentLengthHistograms(
- int64 original_length,
- int64 received_length,
- int64 original_length_with_data_reduction_enabled,
- int64 received_length_with_data_reduction_enabled,
- int64 original_length_via_data_reduction_proxy,
- int64 received_length_via_data_reduction_proxy,
- int64 https_length_with_data_reduction_enabled,
- int64 short_bypass_length_with_data_reduction_enabled,
- int64 long_bypass_length_with_data_reduction_enabled,
- int64 unknown_length_with_data_reduction_enabled) {
- // Report daily UMA only for days having received content.
- if (original_length <= 0 || received_length <= 0)
- return;
-
- // Record metrics in KB.
- UMA_HISTOGRAM_COUNTS(
- "Net.DailyOriginalContentLength", original_length >> 10);
- UMA_HISTOGRAM_COUNTS(
- "Net.DailyContentLength", received_length >> 10);
- int percent = 0;
- // UMA percentage cannot be negative.
- if (original_length > received_length) {
- percent = (100 * (original_length - received_length)) / original_length;
- }
- UMA_HISTOGRAM_PERCENTAGE("Net.DailyContentSavingPercent", percent);
-
- if (original_length_with_data_reduction_enabled <= 0 ||
- received_length_with_data_reduction_enabled <= 0) {
- return;
- }
-
- UMA_HISTOGRAM_COUNTS(
- "Net.DailyOriginalContentLength_DataReductionProxyEnabled",
- original_length_with_data_reduction_enabled >> 10);
- UMA_HISTOGRAM_COUNTS(
- "Net.DailyContentLength_DataReductionProxyEnabled",
- received_length_with_data_reduction_enabled >> 10);
-
- int percent_data_reduction_proxy_enabled = 0;
- // UMA percentage cannot be negative.
- if (original_length_with_data_reduction_enabled >
- received_length_with_data_reduction_enabled) {
- percent_data_reduction_proxy_enabled =
- 100 * (original_length_with_data_reduction_enabled -
- received_length_with_data_reduction_enabled) /
- original_length_with_data_reduction_enabled;
- }
- UMA_HISTOGRAM_PERCENTAGE(
- "Net.DailyContentSavingPercent_DataReductionProxyEnabled",
- percent_data_reduction_proxy_enabled);
-
- UMA_HISTOGRAM_PERCENTAGE(
- "Net.DailyContentPercent_DataReductionProxyEnabled",
- (100 * received_length_with_data_reduction_enabled) / received_length);
-
- DCHECK_GE(https_length_with_data_reduction_enabled, 0);
- UMA_HISTOGRAM_COUNTS(
- "Net.DailyContentLength_DataReductionProxyEnabled_Https",
- https_length_with_data_reduction_enabled >> 10);
- UMA_HISTOGRAM_PERCENTAGE(
- "Net.DailyContentPercent_DataReductionProxyEnabled_Https",
- (100 * https_length_with_data_reduction_enabled) / received_length);
-
- DCHECK_GE(short_bypass_length_with_data_reduction_enabled, 0);
- UMA_HISTOGRAM_COUNTS(
- "Net.DailyContentLength_DataReductionProxyEnabled_ShortBypass",
- short_bypass_length_with_data_reduction_enabled >> 10);
- UMA_HISTOGRAM_PERCENTAGE(
- "Net.DailyContentPercent_DataReductionProxyEnabled_ShortBypass",
- ((100 * short_bypass_length_with_data_reduction_enabled) /
- received_length));
-
- DCHECK_GE(long_bypass_length_with_data_reduction_enabled, 0);
- UMA_HISTOGRAM_COUNTS(
- "Net.DailyContentLength_DataReductionProxyEnabled_LongBypass",
- long_bypass_length_with_data_reduction_enabled >> 10);
- UMA_HISTOGRAM_PERCENTAGE(
- "Net.DailyContentPercent_DataReductionProxyEnabled_LongBypass",
- ((100 * long_bypass_length_with_data_reduction_enabled) /
- received_length));
-
- DCHECK_GE(unknown_length_with_data_reduction_enabled, 0);
- UMA_HISTOGRAM_COUNTS(
- "Net.DailyContentLength_DataReductionProxyEnabled_Unknown",
- unknown_length_with_data_reduction_enabled >> 10);
- UMA_HISTOGRAM_PERCENTAGE(
- "Net.DailyContentPercent_DataReductionProxyEnabled_Unknown",
- ((100 * unknown_length_with_data_reduction_enabled) /
- received_length));
-
- DCHECK_GE(original_length_via_data_reduction_proxy, 0);
- UMA_HISTOGRAM_COUNTS(
- "Net.DailyOriginalContentLength_ViaDataReductionProxy",
- original_length_via_data_reduction_proxy >> 10);
- DCHECK_GE(received_length_via_data_reduction_proxy, 0);
- UMA_HISTOGRAM_COUNTS(
- "Net.DailyContentLength_ViaDataReductionProxy",
- received_length_via_data_reduction_proxy >> 10);
- int percent_via_data_reduction_proxy = 0;
- if (original_length_via_data_reduction_proxy >
- received_length_via_data_reduction_proxy) {
- percent_via_data_reduction_proxy =
- 100 * (original_length_via_data_reduction_proxy -
- received_length_via_data_reduction_proxy) /
- original_length_via_data_reduction_proxy;
- }
- UMA_HISTOGRAM_PERCENTAGE(
- "Net.DailyContentSavingPercent_ViaDataReductionProxy",
- percent_via_data_reduction_proxy);
- UMA_HISTOGRAM_PERCENTAGE(
- "Net.DailyContentPercent_ViaDataReductionProxy",
- (100 * received_length_via_data_reduction_proxy) / received_length);
-}
-
-// Ensure list has exactly |length| elements, either by truncating at the
-// front, or appending "0"'s to the back.
-void MaintainContentLengthPrefsWindow(base::ListValue* list, size_t length) {
- // Remove data for old days from the front.
- while (list->GetSize() > length)
- list->Remove(0, NULL);
- // Newly added lists are empty. Add entries to back to fill the window,
- // each initialized to zero.
- while (list->GetSize() < length)
- list->AppendString(base::Int64ToString(0));
- DCHECK_EQ(length, list->GetSize());
-}
-
-// DailyContentLengthUpdate maintains a data saving pref. The pref is a list
-// of |kNumDaysInHistory| elements of daily total content lengths for the past
-// |kNumDaysInHistory| days.
-class DailyContentLengthUpdate {
- public:
- DailyContentLengthUpdate(const char* pref,
- DataReductionProxyCompressionStats* pref_service)
- : update_(pref_service->GetList(pref)) {}
-
- void UpdateForDataChange(int days_since_last_update) {
- // New empty lists may have been created. Maintain the invariant that
- // there should be exactly |kNumDaysInHistory| days in the histories.
- MaintainContentLengthPrefsWindow(update_, kNumDaysInHistory);
- if (days_since_last_update) {
- MaintainContentLengthPrefForDateChange(days_since_last_update);
- }
- }
-
- // Update the lengths for the current day.
- void Add(int content_length) {
- AddInt64ToListPref(kNumDaysInHistory - 1, content_length, update_);
- }
-
- int64 GetListPrefValue(size_t index) {
- return ListPrefInt64Value(*update_, index);
- }
-
- private:
- // Update the list for date change and ensure the list has exactly |length|
- // elements. The last entry in the list will be for the current day after
- // the update.
- void MaintainContentLengthPrefForDateChange(int days_since_last_update) {
- if (days_since_last_update == -1) {
- // The system may go backwards in time by up to a day for legitimate
- // reasons, such as with changes to the time zone. In such cases, we
- // keep adding to the current day.
- // Note: we accept the fact that some reported data is shifted to
- // the adjacent day if users travel back and forth across time zones.
- days_since_last_update = 0;
- } else if (days_since_last_update < -1) {
- // Erase all entries if the system went backwards in time by more than
- // a day.
- update_->Clear();
-
- days_since_last_update = kNumDaysInHistory;
- }
- DCHECK_GE(days_since_last_update, 0);
-
- // Add entries for days since last update event. This will make the
- // lists longer than kNumDaysInHistory. The additional items will be cut off
- // from the head of the lists by |MaintainContentLengthPrefsWindow|, below.
- for (int i = 0;
- i < days_since_last_update && i < static_cast<int>(kNumDaysInHistory);
- ++i) {
- update_->AppendString(base::Int64ToString(0));
- }
-
- // Entries for new days may have been appended. Maintain the invariant that
- // there should be exactly |kNumDaysInHistory| days in the histories.
- MaintainContentLengthPrefsWindow(update_, kNumDaysInHistory);
- }
-
- base::ListValue* update_;
-};
-
-// DailyDataSavingUpdate maintains a pair of data saving prefs, original_update_
-// and received_update_. pref_original is a list of |kNumDaysInHistory| elements
-// of daily total original content lengths for the past |kNumDaysInHistory|
-// days. pref_received is the corresponding list of the daily total received
-// content lengths.
-class DailyDataSavingUpdate {
- public:
- DailyDataSavingUpdate(const char* pref_original,
- const char* pref_received,
- DataReductionProxyCompressionStats* compression_stats)
- : original_(pref_original, compression_stats),
- received_(pref_received, compression_stats) {}
-
- void UpdateForDataChange(int days_since_last_update) {
- original_.UpdateForDataChange(days_since_last_update);
- received_.UpdateForDataChange(days_since_last_update);
- }
-
- // Update the lengths for the current day.
- void Add(int original_content_length, int received_content_length) {
- original_.Add(original_content_length);
- received_.Add(received_content_length);
- }
-
- int64 GetOriginalListPrefValue(size_t index) {
- return original_.GetListPrefValue(index);
- }
- int64 GetReceivedListPrefValue(size_t index) {
- return received_.GetListPrefValue(index);
- }
-
- private:
- DailyContentLengthUpdate original_;
- DailyContentLengthUpdate received_;
-};
-
-} // namespace
-
DataReductionProxyRequestType GetDataReductionProxyRequestType(
const net::URLRequest& request,
const net::ProxyConfig& data_reduction_proxy_config,
@@ -350,140 +73,4 @@ int64 GetAdjustedOriginalContentLength(
return original_content_length;
}
-void UpdateContentLengthPrefsForDataReductionProxy(
- int received_content_length,
- int original_content_length,
- bool with_data_reduction_proxy_enabled,
- DataReductionProxyRequestType request_type,
- base::Time now,
- DataReductionProxyCompressionStats* compression_stats) {
- // TODO(bengr): Remove this check once the underlying cause of
- // http://crbug.com/287821 is fixed. For now, only continue if the current
- // year is reported as being between 1972 and 2970.
- base::TimeDelta time_since_unix_epoch = now - base::Time::UnixEpoch();
- const int kMinDaysSinceUnixEpoch = 365 * 2; // 2 years.
- const int kMaxDaysSinceUnixEpoch = 365 * 1000; // 1000 years.
- if (time_since_unix_epoch.InDays() < kMinDaysSinceUnixEpoch ||
- time_since_unix_epoch.InDays() > kMaxDaysSinceUnixEpoch) {
- return;
- }
-
- // Determine how many days it has been since the last update.
- int64 then_internal = compression_stats->GetInt64(
- data_reduction_proxy::prefs::kDailyHttpContentLengthLastUpdateDate);
-
- // Local midnight could have been shifted due to time zone change.
- // If time is null then don't care if midnight will be wrong shifted due to
- // time zone change because it's still too much time ago.
- base::Time then_midnight = base::Time::FromInternalValue(then_internal);
- if (!then_midnight.is_null()) {
- then_midnight = then_midnight.LocalMidnight();
- }
- base::Time midnight = now.LocalMidnight();
-
- int days_since_last_update = (midnight - then_midnight).InDays();
-
- // Each day, we calculate the total number of bytes received and the total
- // size of all corresponding resources before any data-reducing recompression
- // is applied. These values are used to compute the data savings realized
- // by applying our compression techniques. Totals for the last
- // |kNumDaysInHistory| days are maintained.
- DailyDataSavingUpdate total(
- data_reduction_proxy::prefs::kDailyHttpOriginalContentLength,
- data_reduction_proxy::prefs::kDailyHttpReceivedContentLength,
- compression_stats);
- total.UpdateForDataChange(days_since_last_update);
-
- DailyDataSavingUpdate proxy_enabled(
- data_reduction_proxy::prefs::
- kDailyOriginalContentLengthWithDataReductionProxyEnabled,
- data_reduction_proxy::prefs::
- kDailyContentLengthWithDataReductionProxyEnabled,
- compression_stats);
- proxy_enabled.UpdateForDataChange(days_since_last_update);
-
- DailyDataSavingUpdate via_proxy(
- data_reduction_proxy::prefs::
- kDailyOriginalContentLengthViaDataReductionProxy,
- data_reduction_proxy::prefs::
- kDailyContentLengthViaDataReductionProxy,
- compression_stats);
- via_proxy.UpdateForDataChange(days_since_last_update);
-
- DailyContentLengthUpdate https(
- data_reduction_proxy::prefs::
- kDailyContentLengthHttpsWithDataReductionProxyEnabled,
- compression_stats);
- https.UpdateForDataChange(days_since_last_update);
-
- DailyContentLengthUpdate short_bypass(
- data_reduction_proxy::prefs::
- kDailyContentLengthShortBypassWithDataReductionProxyEnabled,
- compression_stats);
- short_bypass.UpdateForDataChange(days_since_last_update);
-
- DailyContentLengthUpdate long_bypass(
- data_reduction_proxy::prefs::
- kDailyContentLengthLongBypassWithDataReductionProxyEnabled,
- compression_stats);
- long_bypass.UpdateForDataChange(days_since_last_update);
-
- DailyContentLengthUpdate unknown(
- data_reduction_proxy::prefs::
- kDailyContentLengthUnknownWithDataReductionProxyEnabled,
- compression_stats);
- unknown.UpdateForDataChange(days_since_last_update);
-
- total.Add(original_content_length, received_content_length);
- if (with_data_reduction_proxy_enabled) {
- proxy_enabled.Add(original_content_length, received_content_length);
- // Ignore data source cases, if exist, when
- // "with_data_reduction_proxy_enabled == false"
- switch (request_type) {
- case VIA_DATA_REDUCTION_PROXY:
- via_proxy.Add(original_content_length, received_content_length);
- break;
- case HTTPS:
- https.Add(received_content_length);
- break;
- case SHORT_BYPASS:
- short_bypass.Add(received_content_length);
- break;
- case LONG_BYPASS:
- long_bypass.Add(received_content_length);
- break;
- case UNKNOWN_TYPE:
- unknown.Add(received_content_length);
- break;
- }
- }
-
- if (days_since_last_update) {
- // Record the last update time in microseconds in UTC.
- compression_stats->SetInt64(
- data_reduction_proxy::prefs::kDailyHttpContentLengthLastUpdateDate,
- midnight.ToInternalValue());
-
- // A new day. Report the previous day's data if exists. We'll lose usage
- // data if the last time Chrome was run was more than a day ago.
- // Here, we prefer collecting less data but the collected data is
- // associated with an accurate date.
- if (days_since_last_update == 1) {
- // The previous day's data point is the second one from the tail.
- // Therefore (kNumDaysInHistory - 2) below.
- RecordDailyContentLengthHistograms(
- total.GetOriginalListPrefValue(kNumDaysInHistory - 2),
- total.GetReceivedListPrefValue(kNumDaysInHistory - 2),
- proxy_enabled.GetOriginalListPrefValue(kNumDaysInHistory - 2),
- proxy_enabled.GetReceivedListPrefValue(kNumDaysInHistory - 2),
- via_proxy.GetOriginalListPrefValue(kNumDaysInHistory - 2),
- via_proxy.GetReceivedListPrefValue(kNumDaysInHistory - 2),
- https.GetListPrefValue(kNumDaysInHistory - 2),
- short_bypass.GetListPrefValue(kNumDaysInHistory - 2),
- long_bypass.GetListPrefValue(kNumDaysInHistory - 2),
- unknown.GetListPrefValue(kNumDaysInHistory - 2));
- }
- }
-}
-
} // namespace data_reduction_proxy

Powered by Google App Engine
This is Rietveld 408576698