| 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
|
|
|