| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/translate/core/common/translate_metrics.h" | 5 #include "components/translate/core/common/translate_metrics.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 | 10 |
| 11 #include "base/macros.h" | 11 #include "base/macros.h" |
| 12 #include "base/metrics/histogram_macros.h" | 12 #include "base/metrics/histogram_macros.h" |
| 13 #include "base/metrics/metrics_hashes.h" | 13 #include "base/metrics/metrics_hashes.h" |
| 14 #include "url/url_constants.h" | 14 #include "url/url_constants.h" |
| 15 | 15 |
| 16 namespace translate { | 16 namespace translate { |
| 17 | 17 |
| 18 namespace { | 18 namespace metrics_internal { |
| 19 | 19 |
| 20 // Constant string values to indicate UMA names. All entries should have | |
| 21 // a corresponding index in MetricsNameIndex and an entry in |kMetricsEntries|. | |
| 22 const char kRenderer4LanguageDetection[] = "Renderer4.LanguageDetection"; | 20 const char kRenderer4LanguageDetection[] = "Renderer4.LanguageDetection"; |
| 23 const char kTranslateContentLanguage[] = "Translate.ContentLanguage"; | 21 const char kTranslateContentLanguage[] = "Translate.ContentLanguage"; |
| 24 const char kTranslateHtmlLang[] = "Translate.HtmlLang"; | 22 const char kTranslateHtmlLang[] = "Translate.HtmlLang"; |
| 25 const char kTranslateLanguageVerification[] = "Translate.LanguageVerification"; | 23 const char kTranslateLanguageVerification[] = "Translate.LanguageVerification"; |
| 26 const char kTranslateTimeToBeReady[] = "Translate.TimeToBeReady"; | 24 const char kTranslateTimeToBeReady[] = "Translate.TimeToBeReady"; |
| 27 const char kTranslateTimeToLoad[] = "Translate.TimeToLoad"; | 25 const char kTranslateTimeToLoad[] = "Translate.TimeToLoad"; |
| 28 const char kTranslateTimeToTranslate[] = "Translate.TimeToTranslate"; | 26 const char kTranslateTimeToTranslate[] = "Translate.TimeToTranslate"; |
| 29 const char kTranslateUserActionDuration[] = "Translate.UserActionDuration"; | 27 const char kTranslateUserActionDuration[] = "Translate.UserActionDuration"; |
| 30 const char kTranslatePageScheme[] = "Translate.PageScheme"; | 28 const char kTranslatePageScheme[] = "Translate.PageScheme"; |
| 31 const char kTranslateSimilarLanguageMatch[] = "Translate.SimilarLanguageMatch"; | 29 const char kTranslateSimilarLanguageMatch[] = "Translate.SimilarLanguageMatch"; |
| 32 const char kTranslateLanguageDetectionConflict[] = | 30 const char kTranslateLanguageDetectionConflict[] = |
| 33 "Translate.LanguageDetectionConflict"; | 31 "Translate.LanguageDetectionConflict"; |
| 34 | 32 |
| 35 struct MetricsEntry { | 33 } // namespace metrics_internal |
| 36 MetricsNameIndex index; | |
| 37 const char* const name; | |
| 38 }; | |
| 39 | 34 |
| 40 // This entry table should be updated when new UMA items are added. | 35 namespace { |
| 41 const MetricsEntry kMetricsEntries[] = { | |
| 42 {UMA_LANGUAGE_DETECTION, kRenderer4LanguageDetection}, | |
| 43 {UMA_CONTENT_LANGUAGE, kTranslateContentLanguage}, | |
| 44 {UMA_HTML_LANG, kTranslateHtmlLang}, | |
| 45 {UMA_LANGUAGE_VERIFICATION, kTranslateLanguageVerification}, | |
| 46 {UMA_TIME_TO_BE_READY, kTranslateTimeToBeReady}, | |
| 47 {UMA_TIME_TO_LOAD, kTranslateTimeToLoad}, | |
| 48 {UMA_TIME_TO_TRANSLATE, kTranslateTimeToTranslate}, | |
| 49 {UMA_USER_ACTION_DURATION, kTranslateUserActionDuration}, | |
| 50 {UMA_PAGE_SCHEME, kTranslatePageScheme}, | |
| 51 {UMA_SIMILAR_LANGUAGE_MATCH, kTranslateSimilarLanguageMatch}, | |
| 52 {UMA_LANGUAGE_DETECTION_CONFLICT, kTranslateLanguageDetectionConflict}, | |
| 53 }; | |
| 54 | |
| 55 static_assert(arraysize(kMetricsEntries) == UMA_MAX, | |
| 56 "kMetricsEntries should have UMA_MAX elements"); | |
| 57 | 36 |
| 58 // Page languages for which we track CLD3 language conflicts. | 37 // Page languages for which we track CLD3 language conflicts. |
| 59 const char* kLanguageDetectionConflictPageLangs[] = { | 38 const char* kLanguageDetectionConflictPageLangs[] = { |
| 60 "en", "en-US", "en-GB", "en-CA", "en-AU", "en-NZ", "en-ZA", "en-IN"}; | 39 "en", "en-US", "en-GB", "en-CA", "en-AU", "en-NZ", "en-ZA", "en-IN"}; |
| 61 | 40 |
| 62 LanguageCheckType GetLanguageCheckMetric(const std::string& provided_code, | 41 LanguageCheckType GetLanguageCheckMetric(const std::string& provided_code, |
| 63 const std::string& revised_code) { | 42 const std::string& revised_code) { |
| 64 if (provided_code.empty()) | 43 if (provided_code.empty()) |
| 65 return LANGUAGE_NOT_PROVIDED; | 44 return LANGUAGE_NOT_PROVIDED; |
| 66 else if (provided_code == revised_code) | 45 else if (provided_code == revised_code) |
| 67 return LANGUAGE_VALID; | 46 return LANGUAGE_VALID; |
| 68 return LANGUAGE_INVALID; | 47 return LANGUAGE_INVALID; |
| 69 } | 48 } |
| 70 | 49 |
| 71 } // namespace | 50 } // namespace |
| 72 | 51 |
| 73 void ReportContentLanguage(const std::string& provided_code, | 52 void ReportContentLanguage(const std::string& provided_code, |
| 74 const std::string& revised_code) { | 53 const std::string& revised_code) { |
| 75 UMA_HISTOGRAM_ENUMERATION(kTranslateContentLanguage, | 54 UMA_HISTOGRAM_ENUMERATION(metrics_internal::kTranslateContentLanguage, |
| 76 GetLanguageCheckMetric(provided_code, revised_code), | 55 GetLanguageCheckMetric(provided_code, revised_code), |
| 77 LANGUAGE_MAX); | 56 LANGUAGE_MAX); |
| 78 } | 57 } |
| 79 | 58 |
| 80 void ReportHtmlLang(const std::string& provided_code, | 59 void ReportHtmlLang(const std::string& provided_code, |
| 81 const std::string& revised_code) { | 60 const std::string& revised_code) { |
| 82 UMA_HISTOGRAM_ENUMERATION(kTranslateHtmlLang, | 61 UMA_HISTOGRAM_ENUMERATION(metrics_internal::kTranslateHtmlLang, |
| 83 GetLanguageCheckMetric(provided_code, revised_code), | 62 GetLanguageCheckMetric(provided_code, revised_code), |
| 84 LANGUAGE_MAX); | 63 LANGUAGE_MAX); |
| 85 } | 64 } |
| 86 | 65 |
| 87 void ReportLanguageVerification(LanguageVerificationType type) { | 66 void ReportLanguageVerification(LanguageVerificationType type) { |
| 88 UMA_HISTOGRAM_ENUMERATION(kTranslateLanguageVerification, type, | 67 UMA_HISTOGRAM_ENUMERATION(metrics_internal::kTranslateLanguageVerification, |
| 89 LANGUAGE_VERIFICATION_MAX); | 68 type, LANGUAGE_VERIFICATION_MAX); |
| 90 } | 69 } |
| 91 | 70 |
| 92 void ReportTimeToBeReady(double time_in_msec) { | 71 void ReportTimeToBeReady(double time_in_msec) { |
| 93 UMA_HISTOGRAM_MEDIUM_TIMES(kTranslateTimeToBeReady, | 72 UMA_HISTOGRAM_MEDIUM_TIMES(metrics_internal::kTranslateTimeToBeReady, |
| 94 base::TimeDelta::FromMicroseconds( | 73 base::TimeDelta::FromMicroseconds( |
| 95 static_cast<int64_t>(time_in_msec * 1000.0))); | 74 static_cast<int64_t>(time_in_msec * 1000.0))); |
| 96 } | 75 } |
| 97 | 76 |
| 98 void ReportTimeToLoad(double time_in_msec) { | 77 void ReportTimeToLoad(double time_in_msec) { |
| 99 UMA_HISTOGRAM_MEDIUM_TIMES(kTranslateTimeToLoad, | 78 UMA_HISTOGRAM_MEDIUM_TIMES(metrics_internal::kTranslateTimeToLoad, |
| 100 base::TimeDelta::FromMicroseconds( | 79 base::TimeDelta::FromMicroseconds( |
| 101 static_cast<int64_t>(time_in_msec * 1000.0))); | 80 static_cast<int64_t>(time_in_msec * 1000.0))); |
| 102 } | 81 } |
| 103 | 82 |
| 104 void ReportTimeToTranslate(double time_in_msec) { | 83 void ReportTimeToTranslate(double time_in_msec) { |
| 105 UMA_HISTOGRAM_MEDIUM_TIMES(kTranslateTimeToTranslate, | 84 UMA_HISTOGRAM_MEDIUM_TIMES(metrics_internal::kTranslateTimeToTranslate, |
| 106 base::TimeDelta::FromMicroseconds( | 85 base::TimeDelta::FromMicroseconds( |
| 107 static_cast<int64_t>(time_in_msec * 1000.0))); | 86 static_cast<int64_t>(time_in_msec * 1000.0))); |
| 108 } | 87 } |
| 109 | 88 |
| 110 void ReportUserActionDuration(base::TimeTicks begin, base::TimeTicks end) { | 89 void ReportUserActionDuration(base::TimeTicks begin, base::TimeTicks end) { |
| 111 UMA_HISTOGRAM_LONG_TIMES(kTranslateUserActionDuration, end - begin); | 90 UMA_HISTOGRAM_LONG_TIMES(metrics_internal::kTranslateUserActionDuration, |
| 91 end - begin); |
| 112 } | 92 } |
| 113 | 93 |
| 114 void ReportPageScheme(const std::string& scheme) { | 94 void ReportPageScheme(const std::string& scheme) { |
| 115 SchemeType type = SCHEME_OTHERS; | 95 SchemeType type = SCHEME_OTHERS; |
| 116 if (scheme == url::kHttpScheme) | 96 if (scheme == url::kHttpScheme) |
| 117 type = SCHEME_HTTP; | 97 type = SCHEME_HTTP; |
| 118 else if (scheme == url::kHttpsScheme) | 98 else if (scheme == url::kHttpsScheme) |
| 119 type = SCHEME_HTTPS; | 99 type = SCHEME_HTTPS; |
| 120 UMA_HISTOGRAM_ENUMERATION(kTranslatePageScheme, type, SCHEME_MAX); | 100 UMA_HISTOGRAM_ENUMERATION(metrics_internal::kTranslatePageScheme, type, |
| 101 SCHEME_MAX); |
| 121 } | 102 } |
| 122 | 103 |
| 123 void ReportLanguageDetectionTime(base::TimeTicks begin, base::TimeTicks end) { | 104 void ReportLanguageDetectionTime(base::TimeTicks begin, base::TimeTicks end) { |
| 124 UMA_HISTOGRAM_MEDIUM_TIMES(kRenderer4LanguageDetection, end - begin); | 105 UMA_HISTOGRAM_MEDIUM_TIMES(metrics_internal::kRenderer4LanguageDetection, |
| 106 end - begin); |
| 125 } | 107 } |
| 126 | 108 |
| 127 void ReportSimilarLanguageMatch(bool match) { | 109 void ReportSimilarLanguageMatch(bool match) { |
| 128 UMA_HISTOGRAM_BOOLEAN(kTranslateSimilarLanguageMatch, match); | 110 UMA_HISTOGRAM_BOOLEAN(metrics_internal::kTranslateSimilarLanguageMatch, |
| 111 match); |
| 129 } | 112 } |
| 130 | 113 |
| 131 void ReportLanguageDetectionConflict(const std::string& page_lang, | 114 void ReportLanguageDetectionConflict(const std::string& page_lang, |
| 132 const std::string& cld_lang) { | 115 const std::string& cld_lang) { |
| 133 const char* const* const it = | 116 const char* const* const it = |
| 134 std::find(std::begin(kLanguageDetectionConflictPageLangs), | 117 std::find(std::begin(kLanguageDetectionConflictPageLangs), |
| 135 std::end(kLanguageDetectionConflictPageLangs), page_lang); | 118 std::end(kLanguageDetectionConflictPageLangs), page_lang); |
| 136 const std::string page_lang_token = | 119 const std::string page_lang_token = |
| 137 it == std::end(kLanguageDetectionConflictPageLangs) ? "other" : *it; | 120 it == std::end(kLanguageDetectionConflictPageLangs) ? "other" : *it; |
| 138 | 121 |
| 139 UMA_HISTOGRAM_SPARSE_SLOWLY( | 122 UMA_HISTOGRAM_SPARSE_SLOWLY( |
| 140 kTranslateLanguageDetectionConflict, | 123 metrics_internal::kTranslateLanguageDetectionConflict, |
| 141 base::HashMetricName(page_lang_token + "," + cld_lang)); | 124 base::HashMetricName(page_lang_token + "," + cld_lang)); |
| 142 } | 125 } |
| 143 | 126 |
| 144 const char* GetMetricsName(MetricsNameIndex index) { | |
| 145 for (size_t i = 0; i < arraysize(kMetricsEntries); ++i) { | |
| 146 if (kMetricsEntries[i].index == index) | |
| 147 return kMetricsEntries[i].name; | |
| 148 } | |
| 149 NOTREACHED(); | |
| 150 return NULL; | |
| 151 } | |
| 152 | |
| 153 } // namespace translate | 127 } // namespace translate |
| OLD | NEW |