blob: b9415c0fc141062bc0ce828174533e78c6fd46c5 [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ash/arc/tracing/uma_perf_reporting.h"
#include "base/logging.h"
#include "base/metrics/histogram_functions.h"
#include "base/strings/stringprintf.h"
#undef ENABLED_VLOG_LEVEL
#define ENABLED_VLOG_LEVEL 1
namespace arc {
namespace {
// Defines the period to capture tracing results. Can be overwritten for
// testing.
base::TimeDelta tracing_period = base::Seconds(15);
std::string GetHistogramName(const std::string& category,
const std::string& name) {
return base::StringPrintf("Arc.Runtime.Performance.%s.%s", name.c_str(),
category.c_str());
}
void ReportFPS(const std::string& category_name, double fps) {
DCHECK(!category_name.empty());
DCHECK_GT(fps, 0);
base::UmaHistogramCounts100(GetHistogramName(category_name, "FPS2"),
static_cast<int>(std::round(fps)));
}
void ReportPerceivedFPS(const std::string& category_name,
double perceived_fps) {
DCHECK(!category_name.empty());
DCHECK_GT(perceived_fps, 0);
base::UmaHistogramCounts100(GetHistogramName(category_name, "PerceivedFPS2"),
static_cast<int>(std::round(perceived_fps)));
}
void ReportCommitDeviation(const std::string& category_name,
double commit_deviation) {
DCHECK(!category_name.empty());
DCHECK_GE(commit_deviation, 0);
base::UmaHistogramCustomCounts(
GetHistogramName(category_name, "CommitDeviation2"),
static_cast<int>(std::round(commit_deviation)), 100 /* min */,
5000 /* max */, 50 /* buckets */);
}
void ReportPresentDeviation(const std::string& category_name,
double present_deviation) {
DCHECK(!category_name.empty());
DCHECK_GE(present_deviation, 0);
base::UmaHistogramCustomCounts(
GetHistogramName(category_name, "PresentDeviation2"),
static_cast<int>(std::round(present_deviation)), 100 /* min */,
5000 /* max */, 50 /* buckets */);
}
void ReportQuality(const std::string& category_name, double quality) {
DCHECK(!category_name.empty());
DCHECK_GT(quality, 0);
// Report quality from 0 to 100%.
const int sample = (int)(quality * 100.0);
base::UmaHistogramPercentageObsoleteDoNotUse(
GetHistogramName(category_name, "RenderQuality2"), sample);
}
void ReportJanksPerMinute(const std::string& category_name,
double janks_per_minute) {
DCHECK(!category_name.empty());
DCHECK_GE(janks_per_minute, 0);
base::UmaHistogramCounts100(
GetHistogramName(category_name, "JanksPerMinute2"),
static_cast<int>(std::round(janks_per_minute)));
}
void ReportJanksPercentage(const std::string& category_name,
double janks_percentage) {
DCHECK(!category_name.empty());
DCHECK_GE(janks_percentage, 0);
base::UmaHistogramCounts100(
GetHistogramName(category_name, "JanksPercentage2"),
static_cast<int>(std::round(janks_percentage)));
}
} // namespace
UmaPerfReporting::UmaPerfReporting() : weak_ptr_factory_(this) {}
UmaPerfReporting::~UmaPerfReporting() = default;
void UmaPerfReporting::Schedule(ArcAppPerformanceTracingSession* session,
const std::string& category) {
base::TimeDelta start_delay = reported_categories_.count(category)
? kNextTracingDelay
: kInitTracingDelay;
session->Schedule(
true /* detect_idles */, start_delay, tracing_period,
base::BindOnce(&UmaPerfReporting::OnDone, weak_ptr_factory_.GetWeakPtr(),
session, category));
}
void UmaPerfReporting::SetTracingPeriodForTesting(
const base::TimeDelta& period) {
tracing_period = period;
}
void UmaPerfReporting::OnDone(ArcAppPerformanceTracingSession* session,
const std::string& category,
const std::optional<PerfTraceResult>& result) {
if (result.has_value()) {
VLOG(1) << "Analyzing is done for " << category << " "
<< " fps: " << result->fps
<< ", perceived_fps: " << result->perceived_fps
<< ", commit_deviation: " << result->commit_deviation
<< ", present_deviation: " << result->present_deviation
<< ", render_quality: " << result->render_quality
<< ", janks_per_minute: " << result->janks_per_minute
<< ", janks_percentage: " << result->janks_percentage;
ReportFPS(category, result->fps);
ReportPerceivedFPS(category, result->perceived_fps);
ReportCommitDeviation(category, result->commit_deviation);
ReportPresentDeviation(category, result->present_deviation);
ReportQuality(category, result->render_quality);
ReportJanksPerMinute(category, result->janks_per_minute);
ReportJanksPercentage(category, result->janks_percentage);
reported_categories_.insert(category);
}
Schedule(session, category);
}
} // namespace arc