xref: /aosp_15_r20/external/webrtc/api/test/metrics/metrics_logger.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2022 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #ifndef API_TEST_METRICS_METRICS_LOGGER_H_
12*d9f75844SAndroid Build Coastguard Worker #define API_TEST_METRICS_METRICS_LOGGER_H_
13*d9f75844SAndroid Build Coastguard Worker 
14*d9f75844SAndroid Build Coastguard Worker #include <map>
15*d9f75844SAndroid Build Coastguard Worker #include <string>
16*d9f75844SAndroid Build Coastguard Worker #include <utility>
17*d9f75844SAndroid Build Coastguard Worker #include <vector>
18*d9f75844SAndroid Build Coastguard Worker 
19*d9f75844SAndroid Build Coastguard Worker #include "absl/strings/string_view.h"
20*d9f75844SAndroid Build Coastguard Worker #include "api/numerics/samples_stats_counter.h"
21*d9f75844SAndroid Build Coastguard Worker #include "api/test/metrics/metric.h"
22*d9f75844SAndroid Build Coastguard Worker #include "api/test/metrics/metrics_accumulator.h"
23*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/synchronization/mutex.h"
24*d9f75844SAndroid Build Coastguard Worker #include "system_wrappers/include/clock.h"
25*d9f75844SAndroid Build Coastguard Worker 
26*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
27*d9f75844SAndroid Build Coastguard Worker namespace test {
28*d9f75844SAndroid Build Coastguard Worker 
29*d9f75844SAndroid Build Coastguard Worker // Provides API to log and collect performance metrics.
30*d9f75844SAndroid Build Coastguard Worker class MetricsLogger {
31*d9f75844SAndroid Build Coastguard Worker  public:
32*d9f75844SAndroid Build Coastguard Worker   virtual ~MetricsLogger() = default;
33*d9f75844SAndroid Build Coastguard Worker 
34*d9f75844SAndroid Build Coastguard Worker   // Adds a metric with a single value.
35*d9f75844SAndroid Build Coastguard Worker   // `metadata` - metric's level metadata to add.
36*d9f75844SAndroid Build Coastguard Worker   virtual void LogSingleValueMetric(
37*d9f75844SAndroid Build Coastguard Worker       absl::string_view name,
38*d9f75844SAndroid Build Coastguard Worker       absl::string_view test_case_name,
39*d9f75844SAndroid Build Coastguard Worker       double value,
40*d9f75844SAndroid Build Coastguard Worker       Unit unit,
41*d9f75844SAndroid Build Coastguard Worker       ImprovementDirection improvement_direction,
42*d9f75844SAndroid Build Coastguard Worker       std::map<std::string, std::string> metadata = {}) = 0;
43*d9f75844SAndroid Build Coastguard Worker 
44*d9f75844SAndroid Build Coastguard Worker   // Adds metrics with a time series created based on the provided `values`.
45*d9f75844SAndroid Build Coastguard Worker   // `metadata` - metric's level metadata to add.
46*d9f75844SAndroid Build Coastguard Worker   virtual void LogMetric(absl::string_view name,
47*d9f75844SAndroid Build Coastguard Worker                          absl::string_view test_case_name,
48*d9f75844SAndroid Build Coastguard Worker                          const SamplesStatsCounter& values,
49*d9f75844SAndroid Build Coastguard Worker                          Unit unit,
50*d9f75844SAndroid Build Coastguard Worker                          ImprovementDirection improvement_direction,
51*d9f75844SAndroid Build Coastguard Worker                          std::map<std::string, std::string> metadata = {}) = 0;
52*d9f75844SAndroid Build Coastguard Worker 
53*d9f75844SAndroid Build Coastguard Worker   // Adds metric with a time series with only stats object and without actual
54*d9f75844SAndroid Build Coastguard Worker   // collected values.
55*d9f75844SAndroid Build Coastguard Worker   // `metadata` - metric's level metadata to add.
56*d9f75844SAndroid Build Coastguard Worker   virtual void LogMetric(absl::string_view name,
57*d9f75844SAndroid Build Coastguard Worker                          absl::string_view test_case_name,
58*d9f75844SAndroid Build Coastguard Worker                          const Metric::Stats& metric_stats,
59*d9f75844SAndroid Build Coastguard Worker                          Unit unit,
60*d9f75844SAndroid Build Coastguard Worker                          ImprovementDirection improvement_direction,
61*d9f75844SAndroid Build Coastguard Worker                          std::map<std::string, std::string> metadata = {}) = 0;
62*d9f75844SAndroid Build Coastguard Worker 
63*d9f75844SAndroid Build Coastguard Worker   // Returns all metrics collected by this logger.
64*d9f75844SAndroid Build Coastguard Worker   virtual std::vector<Metric> GetCollectedMetrics() const = 0;
65*d9f75844SAndroid Build Coastguard Worker };
66*d9f75844SAndroid Build Coastguard Worker 
67*d9f75844SAndroid Build Coastguard Worker class DefaultMetricsLogger : public MetricsLogger {
68*d9f75844SAndroid Build Coastguard Worker  public:
DefaultMetricsLogger(webrtc::Clock * clock)69*d9f75844SAndroid Build Coastguard Worker   explicit DefaultMetricsLogger(webrtc::Clock* clock) : clock_(clock) {}
70*d9f75844SAndroid Build Coastguard Worker   ~DefaultMetricsLogger() override = default;
71*d9f75844SAndroid Build Coastguard Worker 
72*d9f75844SAndroid Build Coastguard Worker   void LogSingleValueMetric(
73*d9f75844SAndroid Build Coastguard Worker       absl::string_view name,
74*d9f75844SAndroid Build Coastguard Worker       absl::string_view test_case_name,
75*d9f75844SAndroid Build Coastguard Worker       double value,
76*d9f75844SAndroid Build Coastguard Worker       Unit unit,
77*d9f75844SAndroid Build Coastguard Worker       ImprovementDirection improvement_direction,
78*d9f75844SAndroid Build Coastguard Worker       std::map<std::string, std::string> metadata = {}) override;
79*d9f75844SAndroid Build Coastguard Worker 
80*d9f75844SAndroid Build Coastguard Worker   void LogMetric(absl::string_view name,
81*d9f75844SAndroid Build Coastguard Worker                  absl::string_view test_case_name,
82*d9f75844SAndroid Build Coastguard Worker                  const SamplesStatsCounter& values,
83*d9f75844SAndroid Build Coastguard Worker                  Unit unit,
84*d9f75844SAndroid Build Coastguard Worker                  ImprovementDirection improvement_direction,
85*d9f75844SAndroid Build Coastguard Worker                  std::map<std::string, std::string> metadata = {}) override;
86*d9f75844SAndroid Build Coastguard Worker 
87*d9f75844SAndroid Build Coastguard Worker   void LogMetric(absl::string_view name,
88*d9f75844SAndroid Build Coastguard Worker                  absl::string_view test_case_name,
89*d9f75844SAndroid Build Coastguard Worker                  const Metric::Stats& metric_stats,
90*d9f75844SAndroid Build Coastguard Worker                  Unit unit,
91*d9f75844SAndroid Build Coastguard Worker                  ImprovementDirection improvement_direction,
92*d9f75844SAndroid Build Coastguard Worker                  std::map<std::string, std::string> metadata = {}) override;
93*d9f75844SAndroid Build Coastguard Worker 
94*d9f75844SAndroid Build Coastguard Worker   // Returns all metrics collected by this logger and its `MetricsAccumulator`.
95*d9f75844SAndroid Build Coastguard Worker   std::vector<Metric> GetCollectedMetrics() const override;
96*d9f75844SAndroid Build Coastguard Worker 
GetMetricsAccumulator()97*d9f75844SAndroid Build Coastguard Worker   MetricsAccumulator* GetMetricsAccumulator() { return &metrics_accumulator_; }
98*d9f75844SAndroid Build Coastguard Worker 
99*d9f75844SAndroid Build Coastguard Worker  private:
100*d9f75844SAndroid Build Coastguard Worker   webrtc::Timestamp Now();
101*d9f75844SAndroid Build Coastguard Worker 
102*d9f75844SAndroid Build Coastguard Worker   webrtc::Clock* const clock_;
103*d9f75844SAndroid Build Coastguard Worker   MetricsAccumulator metrics_accumulator_;
104*d9f75844SAndroid Build Coastguard Worker 
105*d9f75844SAndroid Build Coastguard Worker   mutable Mutex mutex_;
106*d9f75844SAndroid Build Coastguard Worker   std::vector<Metric> metrics_ RTC_GUARDED_BY(mutex_);
107*d9f75844SAndroid Build Coastguard Worker };
108*d9f75844SAndroid Build Coastguard Worker 
109*d9f75844SAndroid Build Coastguard Worker }  // namespace test
110*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
111*d9f75844SAndroid Build Coastguard Worker 
112*d9f75844SAndroid Build Coastguard Worker #endif  // API_TEST_METRICS_METRICS_LOGGER_H_
113