1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "content/browser/appcache/appcache_histograms.h"
6
7#include "base/metrics/histogram.h"
8
9namespace content {
10
11static std::string OriginToCustomHistogramSuffix(const GURL& origin_url) {
12  if (origin_url.host() == "docs.google.com")
13    return ".Docs";
14  return std::string();
15}
16
17void AppCacheHistograms::CountInitResult(InitResultType init_result) {
18  UMA_HISTOGRAM_ENUMERATION(
19       "appcache.InitResult",
20       init_result, NUM_INIT_RESULT_TYPES);
21}
22
23void AppCacheHistograms::CountReinitAttempt(bool repeated_attempt) {
24  UMA_HISTOGRAM_BOOLEAN("appcache.ReinitAttempt", repeated_attempt);
25}
26
27void AppCacheHistograms::CountCorruptionDetected() {
28  UMA_HISTOGRAM_BOOLEAN("appcache.CorruptionDetected", true);
29}
30
31void AppCacheHistograms::CountUpdateJobResult(
32    AppCacheUpdateJob::ResultType result,
33    const GURL& origin_url) {
34  UMA_HISTOGRAM_ENUMERATION(
35       "appcache.UpdateJobResult",
36       result, AppCacheUpdateJob::NUM_UPDATE_JOB_RESULT_TYPES);
37
38  const std::string suffix = OriginToCustomHistogramSuffix(origin_url);
39  if (!suffix.empty()) {
40    base::LinearHistogram::FactoryGet(
41        "appcache.UpdateJobResult" + suffix,
42        1,
43        AppCacheUpdateJob::NUM_UPDATE_JOB_RESULT_TYPES,
44        AppCacheUpdateJob::NUM_UPDATE_JOB_RESULT_TYPES + 1,
45        base::HistogramBase::kUmaTargetedHistogramFlag)->Add(result);
46  }
47}
48
49void AppCacheHistograms::CountCheckResponseResult(
50    CheckResponseResultType result) {
51  UMA_HISTOGRAM_ENUMERATION(
52       "appcache.CheckResponseResult",
53       result, NUM_CHECK_RESPONSE_RESULT_TYPES);
54}
55
56void AppCacheHistograms::CountResponseRetrieval(
57    bool success, bool is_main_resource, const GURL& origin_url) {
58  std::string label;
59  if (is_main_resource) {
60    label = "appcache.MainResourceResponseRetrieval";
61    UMA_HISTOGRAM_BOOLEAN(label, success);
62  } else {
63    label = "appcache.SubResourceResponseRetrieval";
64    UMA_HISTOGRAM_BOOLEAN(label, success);
65  }
66  const std::string suffix = OriginToCustomHistogramSuffix(origin_url);
67  if (!suffix.empty()) {
68    base::BooleanHistogram::FactoryGet(
69        label + suffix,
70        base::HistogramBase::kUmaTargetedHistogramFlag)->Add(success);
71  }
72}
73
74void AppCacheHistograms::LogUpdateFailureStats(
75      const GURL& origin_url,
76      int percent_complete,
77      bool was_stalled,
78      bool was_off_origin_resource_failure) {
79  const std::string suffix = OriginToCustomHistogramSuffix(origin_url);
80
81  std::string label = "appcache.UpdateProgressAtPointOfFaliure";
82  UMA_HISTOGRAM_PERCENTAGE(label, percent_complete);
83  if (!suffix.empty()) {
84    base::LinearHistogram::FactoryGet(
85        label + suffix,
86        1, 101, 102,
87        base::HistogramBase::kUmaTargetedHistogramFlag)->Add(percent_complete);
88  }
89
90  label = "appcache.UpdateWasStalledAtPointOfFailure";
91  UMA_HISTOGRAM_BOOLEAN(label, was_stalled);
92  if (!suffix.empty()) {
93    base::BooleanHistogram::FactoryGet(
94        label + suffix,
95        base::HistogramBase::kUmaTargetedHistogramFlag)->Add(was_stalled);
96  }
97
98  label = "appcache.UpdateWasOffOriginAtPointOfFailure";
99  UMA_HISTOGRAM_BOOLEAN(label, was_off_origin_resource_failure);
100  if (!suffix.empty()) {
101    base::BooleanHistogram::FactoryGet(
102        label + suffix,
103        base::HistogramBase::kUmaTargetedHistogramFlag)->Add(
104            was_off_origin_resource_failure);
105  }
106}
107
108void AppCacheHistograms::AddTaskQueueTimeSample(
109    const base::TimeDelta& duration) {
110  UMA_HISTOGRAM_TIMES("appcache.TaskQueueTime", duration);
111}
112
113void AppCacheHistograms::AddTaskRunTimeSample(
114    const base::TimeDelta& duration) {
115  UMA_HISTOGRAM_TIMES("appcache.TaskRunTime", duration);
116}
117
118void AppCacheHistograms::AddCompletionQueueTimeSample(
119    const base::TimeDelta& duration) {
120  UMA_HISTOGRAM_TIMES("appcache.CompletionQueueTime", duration);
121}
122
123void AppCacheHistograms::AddCompletionRunTimeSample(
124    const base::TimeDelta& duration) {
125  UMA_HISTOGRAM_TIMES("appcache.CompletionRunTime", duration);
126}
127
128void AppCacheHistograms::AddNetworkJobStartDelaySample(
129    const base::TimeDelta& duration) {
130  UMA_HISTOGRAM_TIMES("appcache.JobStartDelay.Network", duration);
131}
132
133void AppCacheHistograms::AddErrorJobStartDelaySample(
134    const base::TimeDelta& duration) {
135  UMA_HISTOGRAM_TIMES("appcache.JobStartDelay.Error", duration);
136}
137
138void AppCacheHistograms::AddAppCacheJobStartDelaySample(
139    const base::TimeDelta& duration) {
140  UMA_HISTOGRAM_TIMES("appcache.JobStartDelay.AppCache", duration);
141}
142
143void AppCacheHistograms::AddMissingManifestEntrySample() {
144  UMA_HISTOGRAM_BOOLEAN("appcache.MissingManifestEntry", true);
145}
146
147void AppCacheHistograms::AddMissingManifestDetectedAtCallsite(
148    MissingManifestCallsiteType callsite) {
149  UMA_HISTOGRAM_ENUMERATION(
150       "appcache.MissingManifestDetectedAtCallsite",
151       callsite, NUM_MISSING_MANIFEST_CALLSITE_TYPES);
152}
153
154}  // namespace content
155