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 #include "api/test/metrics/metrics_logger.h"
11*d9f75844SAndroid Build Coastguard Worker
12*d9f75844SAndroid Build Coastguard Worker #include <map>
13*d9f75844SAndroid Build Coastguard Worker #include <string>
14*d9f75844SAndroid Build Coastguard Worker #include <utility>
15*d9f75844SAndroid Build Coastguard Worker #include <vector>
16*d9f75844SAndroid Build Coastguard Worker
17*d9f75844SAndroid Build Coastguard Worker #include "absl/strings/string_view.h"
18*d9f75844SAndroid Build Coastguard Worker #include "api/numerics/samples_stats_counter.h"
19*d9f75844SAndroid Build Coastguard Worker #include "api/test/metrics/metric.h"
20*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/synchronization/mutex.h"
21*d9f75844SAndroid Build Coastguard Worker
22*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
23*d9f75844SAndroid Build Coastguard Worker namespace test {
24*d9f75844SAndroid Build Coastguard Worker namespace {
25*d9f75844SAndroid Build Coastguard Worker
ToStats(const SamplesStatsCounter & values)26*d9f75844SAndroid Build Coastguard Worker Metric::Stats ToStats(const SamplesStatsCounter& values) {
27*d9f75844SAndroid Build Coastguard Worker if (values.IsEmpty()) {
28*d9f75844SAndroid Build Coastguard Worker return Metric::Stats();
29*d9f75844SAndroid Build Coastguard Worker }
30*d9f75844SAndroid Build Coastguard Worker return Metric::Stats{.mean = values.GetAverage(),
31*d9f75844SAndroid Build Coastguard Worker .stddev = values.GetStandardDeviation(),
32*d9f75844SAndroid Build Coastguard Worker .min = values.GetMin(),
33*d9f75844SAndroid Build Coastguard Worker .max = values.GetMax()};
34*d9f75844SAndroid Build Coastguard Worker }
35*d9f75844SAndroid Build Coastguard Worker
36*d9f75844SAndroid Build Coastguard Worker } // namespace
37*d9f75844SAndroid Build Coastguard Worker
LogSingleValueMetric(absl::string_view name,absl::string_view test_case_name,double value,Unit unit,ImprovementDirection improvement_direction,std::map<std::string,std::string> metadata)38*d9f75844SAndroid Build Coastguard Worker void DefaultMetricsLogger::LogSingleValueMetric(
39*d9f75844SAndroid Build Coastguard Worker absl::string_view name,
40*d9f75844SAndroid Build Coastguard Worker absl::string_view test_case_name,
41*d9f75844SAndroid Build Coastguard Worker double value,
42*d9f75844SAndroid Build Coastguard Worker Unit unit,
43*d9f75844SAndroid Build Coastguard Worker ImprovementDirection improvement_direction,
44*d9f75844SAndroid Build Coastguard Worker std::map<std::string, std::string> metadata) {
45*d9f75844SAndroid Build Coastguard Worker MutexLock lock(&mutex_);
46*d9f75844SAndroid Build Coastguard Worker metrics_.push_back(Metric{
47*d9f75844SAndroid Build Coastguard Worker .name = std::string(name),
48*d9f75844SAndroid Build Coastguard Worker .unit = unit,
49*d9f75844SAndroid Build Coastguard Worker .improvement_direction = improvement_direction,
50*d9f75844SAndroid Build Coastguard Worker .test_case = std::string(test_case_name),
51*d9f75844SAndroid Build Coastguard Worker .metric_metadata = std::move(metadata),
52*d9f75844SAndroid Build Coastguard Worker .time_series =
53*d9f75844SAndroid Build Coastguard Worker Metric::TimeSeries{.samples = std::vector{Metric::TimeSeries::Sample{
54*d9f75844SAndroid Build Coastguard Worker .timestamp = Now(), .value = value}}},
55*d9f75844SAndroid Build Coastguard Worker .stats = Metric::Stats{
56*d9f75844SAndroid Build Coastguard Worker .mean = value, .stddev = absl::nullopt, .min = value, .max = value}});
57*d9f75844SAndroid Build Coastguard Worker }
58*d9f75844SAndroid Build Coastguard Worker
LogMetric(absl::string_view name,absl::string_view test_case_name,const SamplesStatsCounter & values,Unit unit,ImprovementDirection improvement_direction,std::map<std::string,std::string> metadata)59*d9f75844SAndroid Build Coastguard Worker void DefaultMetricsLogger::LogMetric(
60*d9f75844SAndroid Build Coastguard Worker absl::string_view name,
61*d9f75844SAndroid Build Coastguard Worker absl::string_view test_case_name,
62*d9f75844SAndroid Build Coastguard Worker const SamplesStatsCounter& values,
63*d9f75844SAndroid Build Coastguard Worker Unit unit,
64*d9f75844SAndroid Build Coastguard Worker ImprovementDirection improvement_direction,
65*d9f75844SAndroid Build Coastguard Worker std::map<std::string, std::string> metadata) {
66*d9f75844SAndroid Build Coastguard Worker MutexLock lock(&mutex_);
67*d9f75844SAndroid Build Coastguard Worker Metric::TimeSeries time_series;
68*d9f75844SAndroid Build Coastguard Worker for (const SamplesStatsCounter::StatsSample& sample :
69*d9f75844SAndroid Build Coastguard Worker values.GetTimedSamples()) {
70*d9f75844SAndroid Build Coastguard Worker time_series.samples.push_back(
71*d9f75844SAndroid Build Coastguard Worker Metric::TimeSeries::Sample{.timestamp = sample.time,
72*d9f75844SAndroid Build Coastguard Worker .value = sample.value,
73*d9f75844SAndroid Build Coastguard Worker .sample_metadata = sample.metadata});
74*d9f75844SAndroid Build Coastguard Worker }
75*d9f75844SAndroid Build Coastguard Worker
76*d9f75844SAndroid Build Coastguard Worker metrics_.push_back(Metric{.name = std::string(name),
77*d9f75844SAndroid Build Coastguard Worker .unit = unit,
78*d9f75844SAndroid Build Coastguard Worker .improvement_direction = improvement_direction,
79*d9f75844SAndroid Build Coastguard Worker .test_case = std::string(test_case_name),
80*d9f75844SAndroid Build Coastguard Worker .metric_metadata = std::move(metadata),
81*d9f75844SAndroid Build Coastguard Worker .time_series = std::move(time_series),
82*d9f75844SAndroid Build Coastguard Worker .stats = ToStats(values)});
83*d9f75844SAndroid Build Coastguard Worker }
84*d9f75844SAndroid Build Coastguard Worker
LogMetric(absl::string_view name,absl::string_view test_case_name,const Metric::Stats & metric_stats,Unit unit,ImprovementDirection improvement_direction,std::map<std::string,std::string> metadata)85*d9f75844SAndroid Build Coastguard Worker void DefaultMetricsLogger::LogMetric(
86*d9f75844SAndroid Build Coastguard Worker absl::string_view name,
87*d9f75844SAndroid Build Coastguard Worker absl::string_view test_case_name,
88*d9f75844SAndroid Build Coastguard Worker const Metric::Stats& metric_stats,
89*d9f75844SAndroid Build Coastguard Worker Unit unit,
90*d9f75844SAndroid Build Coastguard Worker ImprovementDirection improvement_direction,
91*d9f75844SAndroid Build Coastguard Worker std::map<std::string, std::string> metadata) {
92*d9f75844SAndroid Build Coastguard Worker MutexLock lock(&mutex_);
93*d9f75844SAndroid Build Coastguard Worker metrics_.push_back(Metric{.name = std::string(name),
94*d9f75844SAndroid Build Coastguard Worker .unit = unit,
95*d9f75844SAndroid Build Coastguard Worker .improvement_direction = improvement_direction,
96*d9f75844SAndroid Build Coastguard Worker .test_case = std::string(test_case_name),
97*d9f75844SAndroid Build Coastguard Worker .metric_metadata = std::move(metadata),
98*d9f75844SAndroid Build Coastguard Worker .time_series = Metric::TimeSeries{.samples = {}},
99*d9f75844SAndroid Build Coastguard Worker .stats = std::move(metric_stats)});
100*d9f75844SAndroid Build Coastguard Worker }
101*d9f75844SAndroid Build Coastguard Worker
GetCollectedMetrics() const102*d9f75844SAndroid Build Coastguard Worker std::vector<Metric> DefaultMetricsLogger::GetCollectedMetrics() const {
103*d9f75844SAndroid Build Coastguard Worker std::vector<Metric> out = metrics_accumulator_.GetCollectedMetrics();
104*d9f75844SAndroid Build Coastguard Worker MutexLock lock(&mutex_);
105*d9f75844SAndroid Build Coastguard Worker out.insert(out.end(), metrics_.begin(), metrics_.end());
106*d9f75844SAndroid Build Coastguard Worker return out;
107*d9f75844SAndroid Build Coastguard Worker }
108*d9f75844SAndroid Build Coastguard Worker
Now()109*d9f75844SAndroid Build Coastguard Worker Timestamp DefaultMetricsLogger::Now() {
110*d9f75844SAndroid Build Coastguard Worker return clock_->CurrentTime();
111*d9f75844SAndroid Build Coastguard Worker }
112*d9f75844SAndroid Build Coastguard Worker
113*d9f75844SAndroid Build Coastguard Worker } // namespace test
114*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc
115