1 // Copyright 2018 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 "components/image_fetcher/core/image_fetcher_metrics_reporter.h"
6
7 #include "base/metrics/histogram.h"
8 #include "base/metrics/histogram_functions.h"
9 #include "base/metrics/histogram_macros.h"
10 #include "base/metrics/sparse_histogram.h"
11
12 namespace image_fetcher {
13
14 const char
15 ImageFetcherMetricsReporter::kCachedImageFetcherInternalUmaClientName[] =
16 "Internal";
17
18 namespace {
19
20 // 10 seconds in milliseconds.
21 const int kMaxReportTimeMs = 10 * 1000;
22 const int kMaxCacheSizeKb = 1024 * 300; /* 300MB */
23 const int kMaxCacheMetadataCount = 1000;
24
25 constexpr char kEventsHistogram[] = "ImageFetcher.Events";
26 constexpr char kImageLoadFromCacheHistogram[] =
27 "ImageFetcher.ImageLoadFromCacheTime";
28 constexpr char kImageLoadFromCacheJavaHistogram[] =
29 "ImageFetcher.ImageLoadFromCacheTimeJava";
30 constexpr char kTotalFetchFromNativeTimeJavaHistogram[] =
31 "ImageFetcher.ImageLoadFromNativeTimeJava";
32 constexpr char kImageLoadFromNetworkHistogram[] =
33 "ImageFetcher.ImageLoadFromNetworkTime";
34 constexpr char kImageLoadFromNetworkAfterCacheHitHistogram[] =
35 "ImageFetcher.ImageLoadFromNetworkAfterCacheHit";
36 constexpr char kTimeSinceLastLRUEvictionHistogram[] =
37 "ImageFetcher.TimeSinceLastCacheLRUEviction";
38 constexpr char kLoadImageMetadata[] = "ImageFetcher.LoadImageMetadata";
39 constexpr char kNetworkRequestStatusCodes[] = "ImageFetcher.RequestStatusCode";
40 constexpr char kImageCacheSize[] = "ImageFetcher.CacheSize";
41 constexpr char kImageCacheMetadataCount[] = "ImageFetcher.CacheMetadataCount";
42
43 // Returns a raw pointer to a histogram which is owned
GetTimeHistogram(const std::string & histogram_name,const std::string client_name)44 base::HistogramBase* GetTimeHistogram(const std::string& histogram_name,
45 const std::string client_name) {
46 return base::LinearHistogram::FactoryTimeGet(
47 histogram_name + std::string(".") + client_name, base::TimeDelta(),
48 base::TimeDelta::FromMilliseconds(kMaxReportTimeMs),
49 /* one bucket every 20ms. */ kMaxReportTimeMs / 20,
50 base::Histogram::kUmaTargetedHistogramFlag);
51 }
52
53 // Appends the cache strategy suffix. Needs to match ImageFetcherCacheStrategy
54 // in histograms.xml.
AppendSuffix(CacheOption cache_option,std::string * name)55 void AppendSuffix(CacheOption cache_option, std::string* name) {
56 DCHECK(name);
57 switch (cache_option) {
58 case CacheOption::kBestEffort:
59 name->append(".BestEffort");
60 break;
61 case CacheOption::kHoldUntilExpired:
62 name->append(".HoldUntilExpired");
63 break;
64 }
65 }
66
67 } // namespace
68
69 // static
ReportEvent(const std::string & client_name,ImageFetcherEvent event)70 void ImageFetcherMetricsReporter::ReportEvent(const std::string& client_name,
71 ImageFetcherEvent event) {
72 DCHECK(!client_name.empty());
73 UMA_HISTOGRAM_ENUMERATION(kEventsHistogram, event);
74 base::LinearHistogram::FactoryGet(
75 kEventsHistogram + std::string(".") + client_name, 0,
76 static_cast<int>(ImageFetcherEvent::kMaxValue),
77 static_cast<int>(ImageFetcherEvent::kMaxValue),
78 base::Histogram::kUmaTargetedHistogramFlag)
79 ->Add(static_cast<int>(event));
80 }
81
82 // static
ReportImageLoadFromCacheTime(const std::string & client_name,base::Time start_time)83 void ImageFetcherMetricsReporter::ReportImageLoadFromCacheTime(
84 const std::string& client_name,
85 base::Time start_time) {
86 DCHECK(!client_name.empty());
87 base::TimeDelta time_delta = base::Time::Now() - start_time;
88 UMA_HISTOGRAM_TIMES(kImageLoadFromCacheHistogram, time_delta);
89 GetTimeHistogram(kImageLoadFromCacheHistogram, client_name)
90 ->Add(time_delta.InMilliseconds());
91 }
92
93 // static
ReportImageLoadFromCacheTimeJava(const std::string & client_name,base::Time start_time)94 void ImageFetcherMetricsReporter::ReportImageLoadFromCacheTimeJava(
95 const std::string& client_name,
96 base::Time start_time) {
97 DCHECK(!client_name.empty());
98 base::TimeDelta time_delta = base::Time::Now() - start_time;
99 UMA_HISTOGRAM_TIMES(kImageLoadFromCacheJavaHistogram, time_delta);
100 GetTimeHistogram(kImageLoadFromCacheJavaHistogram, client_name)
101 ->Add(time_delta.InMilliseconds());
102 }
103
104 // static
ReportTotalFetchFromNativeTimeJava(const std::string & client_name,base::Time start_time)105 void ImageFetcherMetricsReporter::ReportTotalFetchFromNativeTimeJava(
106 const std::string& client_name,
107 base::Time start_time) {
108 DCHECK(!client_name.empty());
109 base::TimeDelta time_delta = base::Time::Now() - start_time;
110 UMA_HISTOGRAM_TIMES(kTotalFetchFromNativeTimeJavaHistogram, time_delta);
111 GetTimeHistogram(kTotalFetchFromNativeTimeJavaHistogram, client_name)
112 ->Add(time_delta.InMilliseconds());
113 }
114
115 // static
ReportImageLoadFromNetworkTime(const std::string & client_name,base::Time start_time)116 void ImageFetcherMetricsReporter::ReportImageLoadFromNetworkTime(
117 const std::string& client_name,
118 base::Time start_time) {
119 DCHECK(!client_name.empty());
120 base::TimeDelta time_delta = base::Time::Now() - start_time;
121 UMA_HISTOGRAM_TIMES(kImageLoadFromNetworkHistogram, time_delta);
122 GetTimeHistogram(kImageLoadFromNetworkHistogram, client_name)
123 ->Add(time_delta.InMilliseconds());
124 }
125
126 // static
ReportImageLoadFromNetworkAfterCacheHit(const std::string & client_name,base::Time start_time)127 void ImageFetcherMetricsReporter::ReportImageLoadFromNetworkAfterCacheHit(
128 const std::string& client_name,
129 base::Time start_time) {
130 DCHECK(!client_name.empty());
131 base::TimeDelta time_delta = base::Time::Now() - start_time;
132 UMA_HISTOGRAM_TIMES(kImageLoadFromNetworkAfterCacheHitHistogram, time_delta);
133 GetTimeHistogram(kImageLoadFromNetworkAfterCacheHitHistogram, client_name)
134 ->Add(time_delta.InMilliseconds());
135 }
136
137 // static
ReportTimeSinceLastCacheLRUEviction(base::Time start_time)138 void ImageFetcherMetricsReporter::ReportTimeSinceLastCacheLRUEviction(
139 base::Time start_time) {
140 base::TimeDelta time_delta = base::Time::Now() - start_time;
141 UMA_HISTOGRAM_TIMES(kTimeSinceLastLRUEvictionHistogram, time_delta);
142 }
143
144 // static
ReportLoadImageMetadata(base::TimeTicks start_time)145 void ImageFetcherMetricsReporter::ReportLoadImageMetadata(
146 base::TimeTicks start_time) {
147 base::TimeDelta time_delta = base::TimeTicks::Now() - start_time;
148 UMA_HISTOGRAM_TIMES(kLoadImageMetadata, time_delta);
149 }
150
151 // static
ReportRequestStatusCode(const std::string & client_name,int code)152 void ImageFetcherMetricsReporter::ReportRequestStatusCode(
153 const std::string& client_name,
154 int code) {
155 DCHECK(!client_name.empty());
156 base::UmaHistogramSparse(kNetworkRequestStatusCodes, code);
157 base::UmaHistogramSparse(
158 kNetworkRequestStatusCodes + std::string(".") + client_name, code);
159 }
160
161 // static
ReportCacheStatus(CacheOption cache_option,size_t total_bytes,int metadata_count)162 void ImageFetcherMetricsReporter::ReportCacheStatus(CacheOption cache_option,
163 size_t total_bytes,
164 int metadata_count) {
165 std::string cache_size_name = kImageCacheSize;
166 AppendSuffix(cache_option, &cache_size_name);
167 int total_size_kb = base::saturated_cast<int>(total_bytes / 1024);
168 base::UmaHistogramCustomCounts(cache_size_name, total_size_kb, 1,
169 kMaxCacheSizeKb, 50);
170
171 std::string metadata_count_name = kImageCacheMetadataCount;
172 AppendSuffix(cache_option, &metadata_count_name);
173 base::UmaHistogramCustomCounts(metadata_count_name, metadata_count, 1,
174 kMaxCacheMetadataCount, 50);
175 }
176
177 } // namespace image_fetcher
178