File: metric_collector.h

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (197 lines) | stat: -rw-r--r-- 7,183 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_METRICS_PERF_METRIC_COLLECTOR_H_
#define CHROME_BROWSER_METRICS_PERF_METRIC_COLLECTOR_H_

#include <stdint.h>

#include <memory>
#include <string>

#include "base/sequence_checker.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "chrome/browser/metrics/perf/collection_params.h"

namespace metrics {

class SampledProfile;

namespace internal {

// MetricCollector implements the basic collector functionality, including the
// scheduling and synchronization logic between the various trigger events, and
// the profile post-processing logic. Except for the constructor that can be
// invoked from a different thread, all its methods run on the same sequence,
// which is enforced by a sequence checker. A collector is managed by a
// MetricProvider, including the sequence on which it runs.
class MetricCollector {
 public:
  using ProfileDoneCallback =
      base::RepeatingCallback<void(std::unique_ptr<SampledProfile>)>;

  // It may be invoked on a difference sequence than the member functions.
  MetricCollector(const std::string& name,
                  const CollectionParams& collection_params);

  MetricCollector(const MetricCollector&) = delete;
  MetricCollector& operator=(const MetricCollector&) = delete;

  virtual ~MetricCollector();

  virtual const char* ToolName() const = 0;

  void Init();

  // These methods are used to update the cached_data_size_ field via PostTask
  // from the provider.
  void AddCachedDataDelta(size_t delta);
  void ResetCachedDataSize();

  // Turns on profile collection. Resets the timer that's used to schedule
  // collections.
  void RecordUserLogin(base::TimeTicks login_time);

  // Deactivates the timer and turns off profile collection. Does not delete any
  // profile data that was already collected.
  void StopTimer();

  // Schedules a collection after a resume from suspend event. A collection is
  // scheduled with the probablity given by the sampling factor stored in
  // |collection_params_|.
  void ScheduleSuspendDoneCollection(base::TimeDelta sleep_duration);

  // Schedules a collection after a session restore event. A collection is
  // scheduled with the probablity given by the sampling factor stored in
  // |collection_params_|.
  void ScheduleSessionRestoreCollection(int num_tabs_restored);

  // Called when a jank started/stopped.
  void OnJankStarted();
  void OnJankStopped();

  void set_profile_done_callback(ProfileDoneCallback cb) {
    profile_done_callback_ = std::move(cb);
  }

 protected:
  // Enumeration representing success and various failure modes for collecting
  // profile data. These values are persisted to logs. Entries should not be
  // renumbered and numeric values should never be reused.
  enum class CollectionAttemptStatus {
    SUCCESS,
    NOT_READY_TO_COLLECT,
    INCOGNITO_ACTIVE,
    INCOGNITO_LAUNCHED,
    PROTOBUF_NOT_PARSED,
    ILLEGAL_DATA_RETURNED,
    ALREADY_COLLECTING,
    UNABLE_TO_COLLECT,
    DATA_COLLECTION_FAILED,
    SESSION_HAS_ZERO_SAMPLES,
    NUM_OUTCOMES
  };

  // Returns a WeakPtr to this instance.
  virtual base::WeakPtr<MetricCollector> GetWeakPtr() = 0;

  // Collector specific initialization.
  virtual void SetUp() {}

  // Saves the given outcome to the uma histogram associated with the collector.
  void AddToUmaHistogram(CollectionAttemptStatus outcome) const;

  // Returns whether the underlying timer is running or not.
  bool IsRunning() { return timer_.IsRunning(); }
  // Returns the current timer delay. Useful for debugging.
  base::TimeDelta CurrentTimerDelay() { return timer_.GetCurrentDelay(); }

  base::TimeTicks login_time() const { return login_time_; }

  // Collects perf data after a resume. |sleep_duration| is the duration the
  // system was suspended before resuming. |time_after_resume_ms| is how long
  // ago the system resumed.
  void CollectPerfDataAfterResume(base::TimeDelta sleep_duration,
                                  base::TimeDelta time_after_resume);

  // Collects perf data after a session restore. |time_after_restore| is how
  // long ago the session restore started. |num_tabs_restored| is the total
  // number of tabs being restored.
  void CollectPerfDataAfterSessionRestore(base::TimeDelta time_after_restore,
                                          int num_tabs_restored);

  // Selects a random time in the upcoming profiling interval that begins at
  // |next_profiling_interval_start|. Schedules |timer| to invoke
  // DoPeriodicCollection() when that time comes.
  void ScheduleIntervalCollection();

  // Collects profiles on a repeating basis by calling CollectIfNecessary() and
  // reschedules it to be collected again.
  void DoPeriodicCollection();

  // Collects a profile for a given |trigger_event| if necessary.
  void CollectIfNecessary(std::unique_ptr<SampledProfile> sampled_profile);

  // Returns if it's valid and safe for a collector to gather a profile.
  // A collector implementation can override this logic.
  virtual bool ShouldCollect() const;

  // Collector specific logic for collecting a profile.
  virtual void CollectProfile(
      std::unique_ptr<SampledProfile> sampled_profile) = 0;

  // Collector specific logic for stopping the current collection.
  virtual void StopCollection() {}

  // Parses the given serialized perf data proto. If valid, it adds it to the
  // given sampled_profile and stores it in the local profile data cache.
  void SaveSerializedPerfProto(std::unique_ptr<SampledProfile> sampled_profile,
                               std::string serialized_proto);

  // Returns a const reference to the collection_params.
  const CollectionParams& collection_params() const {
    return collection_params_;
  }

  // Returns a mutable reference to the collection_params, so that collectors
  // and tests can update the params.
  CollectionParams& collection_params() { return collection_params_; }

  // The size of cached profile data.
  size_t cached_data_size_ = 0;

  // Checks that some methods are called on the collector sequence.
  SEQUENCE_CHECKER(sequence_checker_);

 private:
  // Parameters controlling how profiles are collected. Initialized at
  // collector creation time. Then accessed only on the collector sequence.
  CollectionParams collection_params_;

  // For scheduling collection of profile data.
  base::OneShotTimer timer_;

  // Record of the last login time.
  base::TimeTicks login_time_;

  // Record of the start of the upcoming profiling interval.
  base::TimeTicks next_profiling_interval_start_;

  // Tracks the last time a session restore was collected.
  base::TimeTicks last_session_restore_collection_time_;

  // Name of the histogram that represents the success and various failure
  // modes of collection attempts.
  const std::string collect_uma_histogram_;

  // A callback to be Run on each successfully collected profile.
  ProfileDoneCallback profile_done_callback_;
};

}  // namespace internal

}  // namespace metrics

#endif  // CHROME_BROWSER_METRICS_PERF_METRIC_COLLECTOR_H_