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