Index: components/payments/core/journey_logger.cc |
diff --git a/components/payments/core/journey_logger.cc b/components/payments/core/journey_logger.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6b48fadfe3855e6fd2671aba0012095438086350 |
--- /dev/null |
+++ b/components/payments/core/journey_logger.cc |
@@ -0,0 +1,176 @@ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "components/payments/core/journey_logger.h" |
+ |
+#include <algorithm> |
+ |
+#include "base/metrics/histogram_functions.h" |
+#include "base/metrics/histogram_macros.h" |
+ |
+namespace payments { |
+ |
+JourneyLogger::JourneyLogger() |
+ : was_can_make_payments_used_(false), |
+ could_make_payment_(false), |
+ was_show_called_(false) {} |
+ |
+JourneyLogger::~JourneyLogger() {} |
+ |
+void JourneyLogger::IncrementSelectionAdds(int section) { |
+ DCHECK(section < SECTION_MAX); |
+ sections_[section].number_selection_adds_++; |
+} |
+ |
+void JourneyLogger::IncrementSelectionChanges(int section) { |
+ DCHECK(section < SECTION_MAX); |
+ sections_[section].number_selection_changes_++; |
+} |
+ |
+void JourneyLogger::IncrementSelectionEdits(int section) { |
+ DCHECK(section < SECTION_MAX); |
+ sections_[section].number_selection_edits_++; |
+} |
+ |
+void JourneyLogger::SetNumberOfSuggestionsShown(int section, int number) { |
+ DCHECK(section < SECTION_MAX); |
+ sections_[section].number_suggestions_shown_ = number; |
+ sections_[section].is_requested_ = true; |
+} |
+ |
+void JourneyLogger::SetCanMakePaymentValue(bool value) { |
+ was_can_make_payments_used_ = true; |
+ could_make_payment_ |= value; |
+} |
+ |
+void JourneyLogger::SetShowCalled() { |
+ was_show_called_ = true; |
+} |
+ |
+void JourneyLogger::RecordJourneyStatsHistograms( |
+ const std::string& submission_type) { |
+ RecordSectionSpecificStats(submission_type); |
+ |
+ // Record the CanMakePayment metrics based on whether the transaction was |
+ // completed or aborted by the user (UserAborted) or otherwise (OtherAborted). |
+ RecordCanMakePaymentStats(submission_type.find("Abort") != std::string::npos |
+ ? COMPLETION_STATUS_ABORTED |
+ : COMPLETION_STATUS_COMPLETED); |
+} |
+ |
+void JourneyLogger::RecordSectionSpecificStats( |
+ const std::string& submission_type) { |
+ // Record whether the user had suggestions for each requested information. |
+ bool user_had_all_requested_information = true; |
+ |
+ for (int i = 0; i < NUMBER_OF_SECTIONS; ++i) { |
+ std::string name_suffix = ""; |
+ switch (i) { |
+ case SECTION_SHIPPING_ADDRESS: |
+ name_suffix = "ShippingAddress." + submission_type; |
+ break; |
+ case SECTION_CONTACT_INFO: |
+ name_suffix = "ContactInfo." + submission_type; |
+ break; |
+ case SECTION_CREDIT_CARDS: |
+ name_suffix = "CreditCards." + submission_type; |
+ break; |
+ default: |
+ break; |
+ } |
+ |
+ DCHECK(!name_suffix.empty()); |
+ |
+ // Only log the metrics for a section if it was requested by the merchant. |
+ if (sections_[i].is_requested_) { |
+ base::UmaHistogramCustomCounts( |
+ "PaymentRequest.NumberOfSelectionAdds." + name_suffix, |
+ std::min(sections_[i].number_selection_adds_, MAX_EXPECTED_SAMPLE), |
+ MIN_EXPECTED_SAMPLE, MAX_EXPECTED_SAMPLE, NUMBER_BUCKETS); |
+ base::UmaHistogramCustomCounts( |
+ "PaymentRequest.NumberOfSelectionChanges." + name_suffix, |
+ std::min(sections_[i].number_selection_changes_, MAX_EXPECTED_SAMPLE), |
+ MIN_EXPECTED_SAMPLE, MAX_EXPECTED_SAMPLE, NUMBER_BUCKETS); |
+ base::UmaHistogramCustomCounts( |
+ "PaymentRequest.NumberOfSelectionEdits." + name_suffix, |
+ std::min(sections_[i].number_selection_edits_, MAX_EXPECTED_SAMPLE), |
+ MIN_EXPECTED_SAMPLE, MAX_EXPECTED_SAMPLE, NUMBER_BUCKETS); |
+ base::UmaHistogramCustomCounts( |
+ "PaymentRequest.NumberOfSuggestionsShown." + name_suffix, |
+ std::min(sections_[i].number_suggestions_shown_, MAX_EXPECTED_SAMPLE), |
+ MIN_EXPECTED_SAMPLE, MAX_EXPECTED_SAMPLE, NUMBER_BUCKETS); |
+ |
+ if (sections_[i].number_suggestions_shown_ == 0) { |
+ user_had_all_requested_information = false; |
+ } |
+ } |
+ } |
+ |
+ // Record metrics about completion based on whether the user had suggestions |
+ // for each requested information. |
+ CompletionStatus completion_status = |
+ submission_type.find("Abort") != std::string::npos |
+ ? COMPLETION_STATUS_ABORTED |
+ : COMPLETION_STATUS_COMPLETED; |
+ if (user_had_all_requested_information) { |
+ base::UmaHistogramEnumeration( |
+ "PaymentRequest.UserHadSuggestionsForEverything." |
+ "EffectOnCompletion", |
+ completion_status, COMPLETION_STATUS_MAX); |
+ } else { |
+ base::UmaHistogramEnumeration( |
+ "PaymentRequest.UserDidNotHaveSuggestionsForEverything." |
+ "EffectOnCompletion", |
+ completion_status, COMPLETION_STATUS_MAX); |
+ } |
+} |
+ |
+void JourneyLogger::RecordCanMakePaymentStats( |
+ CompletionStatus completion_status) { |
+ // Record CanMakePayment usage. |
+ UMA_HISTOGRAM_ENUMERATION("PaymentRequest.CanMakePayment.Usage", |
+ was_can_make_payments_used_ |
+ ? CAN_MAKE_PAYMENT_USED |
+ : CAN_MAKE_PAYMENT_NOT_USED, |
+ CAN_MAKE_PAYMENT_USE_MAX); |
+ |
+ RecordCanMakePaymentEffectOnShow(); |
+ RecordCanMakePaymentEffectOnCompletion(completion_status); |
+} |
+ |
+void JourneyLogger::RecordCanMakePaymentEffectOnShow() { |
+ if (!was_can_make_payments_used_) |
+ return; |
+ |
+ int effect_on_show = 0; |
+ if (was_show_called_) |
+ effect_on_show |= CMP_SHOW_DID_SHOW; |
+ if (could_make_payment_) |
+ effect_on_show |= CMP_SHOW_COULD_MAKE_PAYMENT_; |
+ |
+ LOG(ERROR) << "Effect is " << effect_on_show; |
Mathieu
2017/03/24 13:46:44
remove?
sebsg
2017/03/24 13:53:19
Done.
|
+ |
+ UMA_HISTOGRAM_ENUMERATION("PaymentRequest.CanMakePayment.Used.EffectOnShow", |
+ effect_on_show, CMP_SHOW_MAX); |
+} |
+ |
+void JourneyLogger::RecordCanMakePaymentEffectOnCompletion( |
+ CompletionStatus completion_status) { |
+ if (!was_show_called_) |
+ return; |
+ |
+ std::string histogram_name = "PaymentRequest.CanMakePayment."; |
+ if (!was_can_make_payments_used_) { |
+ histogram_name += "NotUsed.WithShowEffectOnCompletion"; |
+ } else if (could_make_payment_) { |
+ histogram_name += "Used.TrueWithShowEffectOnCompletion"; |
+ } else { |
+ histogram_name += "Used.FalseWithShowEffectOnCompletion"; |
+ } |
+ |
+ base::UmaHistogramEnumeration(histogram_name, completion_status, |
+ COMPLETION_STATUS_MAX); |
+} |
+ |
+} // namespace payments |