summaryrefslogtreecommitdiff
path: root/odrefresh/odr_metrics.cc
diff options
context:
space:
mode:
Diffstat (limited to 'odrefresh/odr_metrics.cc')
-rw-r--r--odrefresh/odr_metrics.cc100
1 files changed, 66 insertions, 34 deletions
diff --git a/odrefresh/odr_metrics.cc b/odrefresh/odr_metrics.cc
index 4bddb17bd8..a4533d9124 100644
--- a/odrefresh/odr_metrics.cc
+++ b/odrefresh/odr_metrics.cc
@@ -36,7 +36,7 @@ namespace art {
namespace odrefresh {
OdrMetrics::OdrMetrics(const std::string& cache_directory, const std::string& metrics_file)
- : cache_directory_(cache_directory), metrics_file_(metrics_file), status_(Status::kOK) {
+ : cache_directory_(cache_directory), metrics_file_(metrics_file) {
DCHECK(StartsWith(metrics_file_, "/"));
// Remove existing metrics file if it exists.
@@ -56,36 +56,57 @@ OdrMetrics::OdrMetrics(const std::string& cache_directory, const std::string& me
}
OdrMetrics::~OdrMetrics() {
- cache_space_free_end_mib_ = GetFreeSpaceMiB(cache_directory_);
+ CaptureSpaceFreeEnd();
- // Log metrics only if odrefresh detected a reason to compile.
- if (trigger_.has_value()) {
+ // Log metrics only if this is explicitly enabled (typically when compilation was done or an error
+ // occurred).
+ if (enabled_) {
WriteToFile(metrics_file_, this);
}
}
-void OdrMetrics::SetCompilationTime(int32_t seconds) {
- switch (stage_) {
+void OdrMetrics::CaptureSpaceFreeEnd() {
+ cache_space_free_end_mib_ = GetFreeSpaceMiB(cache_directory_);
+}
+
+void OdrMetrics::SetDex2OatResult(Stage stage,
+ int64_t compilation_time_ms,
+ const std::optional<ExecResult>& dex2oat_result) {
+ switch (stage) {
case Stage::kPrimaryBootClasspath:
- primary_bcp_compilation_seconds_ = seconds;
+ primary_bcp_compilation_millis_ = compilation_time_ms;
+ primary_bcp_dex2oat_result_ = dex2oat_result;
break;
case Stage::kSecondaryBootClasspath:
- secondary_bcp_compilation_seconds_ = seconds;
+ secondary_bcp_compilation_millis_ = compilation_time_ms;
+ secondary_bcp_dex2oat_result_ = dex2oat_result;
break;
case Stage::kSystemServerClasspath:
- system_server_compilation_seconds_ = seconds;
+ system_server_compilation_millis_ = compilation_time_ms;
+ system_server_dex2oat_result_ = dex2oat_result;
break;
case Stage::kCheck:
case Stage::kComplete:
case Stage::kPreparation:
case Stage::kUnknown:
- break;
+ LOG(FATAL) << "Unexpected stage " << stage_ << " when setting dex2oat result";
}
}
-void OdrMetrics::SetStage(Stage stage) {
- if (status_ == Status::kOK) {
- stage_ = stage;
+void OdrMetrics::SetBcpCompilationType(Stage stage, BcpCompilationType type) {
+ switch (stage) {
+ case Stage::kPrimaryBootClasspath:
+ primary_bcp_compilation_type_ = type;
+ break;
+ case Stage::kSecondaryBootClasspath:
+ secondary_bcp_compilation_type_ = type;
+ break;
+ case Stage::kSystemServerClasspath:
+ case Stage::kCheck:
+ case Stage::kComplete:
+ case Stage::kPreparation:
+ case Stage::kUnknown:
+ LOG(FATAL) << "Unexpected stage " << stage_ << " when setting BCP compilation type";
}
}
@@ -115,32 +136,43 @@ int32_t OdrMetrics::GetFreeSpaceMiB(const std::string& path) {
return static_cast<int32_t>(free_space_mib);
}
-bool OdrMetrics::ToRecord(/*out*/OdrMetricsRecord* record) const {
- if (!trigger_.has_value()) {
- return false;
+OdrMetricsRecord OdrMetrics::ToRecord() const {
+ return {
+ .odrefresh_metrics_version = kOdrefreshMetricsVersion,
+ .art_apex_version = art_apex_version_,
+ .trigger = static_cast<int32_t>(trigger_),
+ .stage_reached = static_cast<int32_t>(stage_),
+ .status = static_cast<int32_t>(status_),
+ .cache_space_free_start_mib = cache_space_free_start_mib_,
+ .cache_space_free_end_mib = cache_space_free_end_mib_,
+ .primary_bcp_compilation_millis = primary_bcp_compilation_millis_,
+ .secondary_bcp_compilation_millis = secondary_bcp_compilation_millis_,
+ .system_server_compilation_millis = system_server_compilation_millis_,
+ .primary_bcp_dex2oat_result = ConvertExecResult(primary_bcp_dex2oat_result_),
+ .secondary_bcp_dex2oat_result = ConvertExecResult(secondary_bcp_dex2oat_result_),
+ .system_server_dex2oat_result = ConvertExecResult(system_server_dex2oat_result_),
+ .primary_bcp_compilation_type = static_cast<int32_t>(primary_bcp_compilation_type_),
+ .secondary_bcp_compilation_type = static_cast<int32_t>(secondary_bcp_compilation_type_),
+ };
+}
+
+OdrMetricsRecord::Dex2OatExecResult OdrMetrics::ConvertExecResult(
+ const std::optional<ExecResult>& result) {
+ if (result.has_value()) {
+ return OdrMetricsRecord::Dex2OatExecResult(result.value());
+ } else {
+ return {};
}
- record->art_apex_version = art_apex_version_;
- record->trigger = static_cast<uint32_t>(trigger_.value());
- record->stage_reached = static_cast<uint32_t>(stage_);
- record->status = static_cast<uint32_t>(status_);
- record->primary_bcp_compilation_seconds = primary_bcp_compilation_seconds_;
- record->secondary_bcp_compilation_seconds = secondary_bcp_compilation_seconds_;
- record->system_server_compilation_seconds = system_server_compilation_seconds_;
- record->cache_space_free_start_mib = cache_space_free_start_mib_;
- record->cache_space_free_end_mib = cache_space_free_end_mib_;
- return true;
}
void OdrMetrics::WriteToFile(const std::string& path, const OdrMetrics* metrics) {
- OdrMetricsRecord record;
- if (!metrics->ToRecord(&record)) {
- LOG(ERROR) << "Attempting to report metrics without a compilation trigger.";
- return;
- }
+ OdrMetricsRecord record = metrics->ToRecord();
- // Preserve order from frameworks/proto_logging/stats/atoms.proto in metrics file written.
- std::ofstream ofs(path);
- ofs << record;
+ const android::base::Result<void>& result = record.WriteToFile(path);
+ if (!result.ok()) {
+ LOG(ERROR) << "Failed to report metrics to file: " << path
+ << ", error: " << result.error().message();
+ }
}
} // namespace odrefresh