summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libartbase/base/metrics/metrics.h92
-rw-r--r--libartbase/base/metrics/metrics_common.cc38
-rw-r--r--runtime/metrics/reporter.cc26
-rw-r--r--runtime/metrics/reporter.h16
-rw-r--r--runtime/metrics/statsd.cc19
-rw-r--r--runtime/runtime.cc7
6 files changed, 177 insertions, 21 deletions
diff --git a/libartbase/base/metrics/metrics.h b/libartbase/base/metrics/metrics.h
index 4e3346a763..316eb7a1a8 100644
--- a/libartbase/base/metrics/metrics.h
+++ b/libartbase/base/metrics/metrics.h
@@ -83,8 +83,14 @@ enum class CompilationReason {
kError,
kUnknown,
kFirstBoot,
- kBoot,
+ kBootAfterOTA,
+ kPostBoot,
kInstall,
+ kInstallFast,
+ kInstallBulk,
+ kInstallBulkSecondary,
+ kInstallBulkDowngraded,
+ kInstallBulkSecondaryDowngraded,
kBgDexopt,
kABOTA,
kInactive,
@@ -95,28 +101,90 @@ enum class CompilationReason {
constexpr const char* CompilationReasonName(CompilationReason reason) {
switch (reason) {
case CompilationReason::kError:
- return "Error";
+ return "error";
case CompilationReason::kUnknown:
- return "Unknown";
+ return "unknown";
case CompilationReason::kFirstBoot:
- return "FirstBoot";
- case CompilationReason::kBoot:
- return "Boot";
+ return "first-boot";
+ case CompilationReason::kBootAfterOTA:
+ return "boot-after-ota";
+ case CompilationReason::kPostBoot:
+ return "post-boot";
case CompilationReason::kInstall:
- return "Install";
+ return "install";
+ case CompilationReason::kInstallFast:
+ return "install-fast";
+ case CompilationReason::kInstallBulk:
+ return "install-bulk";
+ case CompilationReason::kInstallBulkSecondary:
+ return "install-bulk-secondary";
+ case CompilationReason::kInstallBulkDowngraded:
+ return "install-bulk-downgraded";
+ case CompilationReason::kInstallBulkSecondaryDowngraded:
+ return "install-bulk-secondary-downgraded";
case CompilationReason::kBgDexopt:
- return "BgDexopt";
+ return "bg-dexopt";
case CompilationReason::kABOTA:
- return "ABOTA";
+ return "ab-ota";
case CompilationReason::kInactive:
- return "Inactive";
+ return "inactive";
case CompilationReason::kShared:
- return "Shared";
+ return "shared";
case CompilationReason::kInstallWithDexMetadata:
- return "InstallWithDexMetadata";
+ return "install-with-dex-metadata";
}
}
+constexpr CompilationReason CompilationReasonFromName(std::string_view name) {
+ // Names come from PackageManagerServiceCompilerMapping.java
+ if (name == "unknown") {
+ return CompilationReason::kUnknown;
+ }
+ if (name == "first-boot") {
+ return CompilationReason::kFirstBoot;
+ }
+ if (name == "boot-after-ota") {
+ return CompilationReason::kBootAfterOTA;
+ }
+ if (name == "post-boot") {
+ return CompilationReason::kPostBoot;
+ }
+ if (name == "install") {
+ return CompilationReason::kInstall;
+ }
+ if (name == "install-fast") {
+ return CompilationReason::kInstallFast;
+ }
+ if (name == "install-bulk") {
+ return CompilationReason::kInstallBulk;
+ }
+ if (name == "install-bulk-secondary") {
+ return CompilationReason::kInstallBulkSecondary;
+ }
+ if (name == "install-bulk-downgraded") {
+ return CompilationReason::kInstallBulkDowngraded;
+ }
+ if (name == "install-bulk-secondary-downgraded") {
+ return CompilationReason::kInstallBulkSecondaryDowngraded;
+ }
+ if (name == "bg-dexopt") {
+ return CompilationReason::kBgDexopt;
+ }
+ if (name == "ab-ota") {
+ return CompilationReason::kABOTA;
+ }
+ if (name == "inactive") {
+ return CompilationReason::kInactive;
+ }
+ if (name == "shared") {
+ return CompilationReason::kShared;
+ }
+ if (name == "install-with-dex-metadata") {
+ return CompilationReason::kInstallWithDexMetadata;
+ }
+ return CompilationReason::kError;
+}
+
// SessionData contains metadata about a metrics session (basically the lifetime of an ART process).
// This information should not change for the lifetime of the session.
struct SessionData {
diff --git a/libartbase/base/metrics/metrics_common.cc b/libartbase/base/metrics/metrics_common.cc
index 89d003a71e..7805f51c0a 100644
--- a/libartbase/base/metrics/metrics_common.cc
+++ b/libartbase/base/metrics/metrics_common.cc
@@ -179,6 +179,44 @@ void FileBackend::EndReport() {
}
}
+// Make sure CompilationReasonName and CompilationReasonForName are inverses.
+static_assert(CompilationReasonFromName(CompilationReasonName(CompilationReason::kError)) ==
+ CompilationReason::kError);
+static_assert(CompilationReasonFromName(CompilationReasonName(CompilationReason::kUnknown)) ==
+ CompilationReason::kUnknown);
+static_assert(CompilationReasonFromName(CompilationReasonName(CompilationReason::kFirstBoot)) ==
+ CompilationReason::kFirstBoot);
+static_assert(CompilationReasonFromName(CompilationReasonName(CompilationReason::kBootAfterOTA)) ==
+ CompilationReason::kBootAfterOTA);
+static_assert(CompilationReasonFromName(CompilationReasonName(CompilationReason::kPostBoot)) ==
+ CompilationReason::kPostBoot);
+static_assert(CompilationReasonFromName(CompilationReasonName(CompilationReason::kInstall)) ==
+ CompilationReason::kInstall);
+static_assert(CompilationReasonFromName(CompilationReasonName(CompilationReason::kInstallFast)) ==
+ CompilationReason::kInstallFast);
+static_assert(CompilationReasonFromName(CompilationReasonName(CompilationReason::kInstallBulk)) ==
+ CompilationReason::kInstallBulk);
+static_assert(
+ CompilationReasonFromName(CompilationReasonName(CompilationReason::kInstallBulkSecondary)) ==
+ CompilationReason::kInstallBulkSecondary);
+static_assert(
+ CompilationReasonFromName(CompilationReasonName(CompilationReason::kInstallBulkDowngraded)) ==
+ CompilationReason::kInstallBulkDowngraded);
+static_assert(CompilationReasonFromName(
+ CompilationReasonName(CompilationReason::kInstallBulkSecondaryDowngraded)) ==
+ CompilationReason::kInstallBulkSecondaryDowngraded);
+static_assert(CompilationReasonFromName(CompilationReasonName(CompilationReason::kBgDexopt)) ==
+ CompilationReason::kBgDexopt);
+static_assert(CompilationReasonFromName(CompilationReasonName(CompilationReason::kABOTA)) ==
+ CompilationReason::kABOTA);
+static_assert(CompilationReasonFromName(CompilationReasonName(CompilationReason::kInactive)) ==
+ CompilationReason::kInactive);
+static_assert(CompilationReasonFromName(CompilationReasonName(CompilationReason::kShared)) ==
+ CompilationReason::kShared);
+static_assert(
+ CompilationReasonFromName(CompilationReasonName(CompilationReason::kInstallWithDexMetadata)) ==
+ CompilationReason::kInstallWithDexMetadata);
+
} // namespace metrics
} // namespace art
diff --git a/runtime/metrics/reporter.cc b/runtime/metrics/reporter.cc
index 5148b207ab..4cf1ba53b7 100644
--- a/runtime/metrics/reporter.cc
+++ b/runtime/metrics/reporter.cc
@@ -77,6 +77,13 @@ void MetricsReporter::RequestMetricsReport(bool synchronous) {
}
}
+void MetricsReporter::SetCompilationInfo(CompilationReason compilation_reason,
+ CompilerFilter::Filter compiler_filter) {
+ if (thread_.has_value()) {
+ messages_.SendMessage(CompilationInfoMessage{compilation_reason, compiler_filter});
+ }
+}
+
void MetricsReporter::BackgroundThreadRun() {
LOG_STREAM(DEBUG) << "Metrics reporting thread started";
@@ -108,10 +115,7 @@ void MetricsReporter::BackgroundThreadRun() {
messages_.SwitchReceive(
[&](BeginSessionMessage message) {
LOG_STREAM(DEBUG) << "Received session metadata";
-
- for (auto& backend : backends_) {
- backend->BeginSession(message.session_data);
- }
+ session_data_ = message.session_data;
},
[&]([[maybe_unused]] ShutdownRequestedMessage message) {
LOG_STREAM(DEBUG) << "Shutdown request received";
@@ -139,6 +143,11 @@ void MetricsReporter::BackgroundThreadRun() {
[&]([[maybe_unused]] StartupCompletedMessage message) {
LOG_STREAM(DEBUG) << "App startup completed, reporting metrics";
ReportMetrics();
+ },
+ [&](CompilationInfoMessage message) {
+ LOG_STREAM(DEBUG) << "Compilation info received";
+ session_data_.compilation_reason = message.compilation_reason;
+ session_data_.compiler_filter = message.compiler_filter;
});
}
@@ -154,9 +163,16 @@ void MetricsReporter::MaybeResetTimeout() {
}
}
-void MetricsReporter::ReportMetrics() const {
+void MetricsReporter::ReportMetrics() {
ArtMetrics* metrics{runtime_->GetMetrics()};
+ if (!session_started_) {
+ for (auto& backend : backends_) {
+ backend->BeginSession(session_data_);
+ }
+ session_started_ = true;
+ }
+
for (auto& backend : backends_) {
metrics->ReportAllMetrics(backend.get());
}
diff --git a/runtime/metrics/reporter.h b/runtime/metrics/reporter.h
index eff6e47322..3ad55b090f 100644
--- a/runtime/metrics/reporter.h
+++ b/runtime/metrics/reporter.h
@@ -83,6 +83,9 @@ class MetricsReporter {
// If synchronous is set to true, this function will block until the report has completed.
void RequestMetricsReport(bool synchronous = true);
+ void SetCompilationInfo(CompilationReason compilation_reason,
+ CompilerFilter::Filter compiler_filter);
+
static constexpr const char* kBackgroundThreadName = "Metrics Background Reporting Thread";
private:
@@ -95,7 +98,7 @@ class MetricsReporter {
void MaybeResetTimeout();
// Outputs the current state of the metrics to the destination set by config_.
- void ReportMetrics() const;
+ void ReportMetrics();
ReportingConfig config_;
Runtime* runtime_;
@@ -122,16 +125,25 @@ class MetricsReporter {
bool synchronous;
};
+ struct CompilationInfoMessage {
+ CompilationReason compilation_reason;
+ CompilerFilter::Filter compiler_filter;
+ };
+
MessageQueue<ShutdownRequestedMessage,
StartupCompletedMessage,
BeginSessionMessage,
- RequestMetricsReportMessage>
+ RequestMetricsReportMessage,
+ CompilationInfoMessage>
messages_;
// A message indicating a requested report has been finished.
struct ReportCompletedMessage {};
MessageQueue<ReportCompletedMessage> thread_to_host_messages_;
+
+ SessionData session_data_{};
+ bool session_started_{false};
};
} // namespace metrics
diff --git a/runtime/metrics/statsd.cc b/runtime/metrics/statsd.cc
index 39836e257a..7dc23002a5 100644
--- a/runtime/metrics/statsd.cc
+++ b/runtime/metrics/statsd.cc
@@ -117,8 +117,6 @@ constexpr int32_t EncodeCompilationReason(CompilationReason reason) {
return statsd::ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_AB_OTA;
case CompilationReason::kBgDexopt:
return statsd::ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_BG_DEXOPT;
- case CompilationReason::kBoot:
- return statsd::ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_BOOT;
case CompilationReason::kError:
return statsd::ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_ERROR;
case CompilationReason::kFirstBoot:
@@ -132,6 +130,23 @@ constexpr int32_t EncodeCompilationReason(CompilationReason reason) {
ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_INSTALL_WITH_DEX_METADATA;
case CompilationReason::kShared:
return statsd::ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_SHARED;
+ case CompilationReason::kPostBoot:
+ return statsd::ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_POST_BOOT;
+ case CompilationReason::kInstallBulk:
+ return statsd::ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_INSTALL_BULK;
+ case CompilationReason::kInstallBulkSecondary:
+ return statsd::
+ ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_INSTALL_BULK_SECONDARY;
+ case CompilationReason::kInstallBulkDowngraded:
+ return statsd::
+ ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_INSTALL_BULK_DOWNGRADED;
+ case CompilationReason::kInstallBulkSecondaryDowngraded:
+ return statsd::
+ ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_INSTALL_BULK_SECONDARY_DOWNGRADED;
+ case CompilationReason::kBootAfterOTA:
+ return statsd::ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_BOOT_AFTER_OTA;
+ case CompilationReason::kInstallFast:
+ return statsd::ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_INSTALL_FAST;
}
}
diff --git a/runtime/runtime.cc b/runtime/runtime.cc
index 6e7167d6e9..4c4567a69e 100644
--- a/runtime/runtime.cc
+++ b/runtime/runtime.cc
@@ -3063,6 +3063,13 @@ void Runtime::NotifyStartupCompleted() {
ProfileSaver::NotifyStartupCompleted();
if (metrics_reporter_ != nullptr) {
+ const OatFile* primary_oat_file = oat_file_manager_->GetPrimaryOatFile();
+ DCHECK_NE(primary_oat_file, nullptr);
+ const char* compilation_reason = primary_oat_file->GetCompilationReason();
+ metrics_reporter_->SetCompilationInfo(
+ compilation_reason != nullptr ? metrics::CompilationReasonFromName(compilation_reason) :
+ metrics::CompilationReason::kUnknown,
+ primary_oat_file->GetCompilerFilter());
metrics_reporter_->NotifyStartupCompleted();
}
}