1*33f37583SAndroid Build Coastguard Worker /*
2*33f37583SAndroid Build Coastguard Worker * Copyright (C) 2024 The Android Open Source Project
3*33f37583SAndroid Build Coastguard Worker *
4*33f37583SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*33f37583SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*33f37583SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*33f37583SAndroid Build Coastguard Worker *
8*33f37583SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*33f37583SAndroid Build Coastguard Worker *
10*33f37583SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*33f37583SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*33f37583SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*33f37583SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*33f37583SAndroid Build Coastguard Worker * limitations under the License.
15*33f37583SAndroid Build Coastguard Worker */
16*33f37583SAndroid Build Coastguard Worker
17*33f37583SAndroid Build Coastguard Worker #include "apexd_metrics_stats.h"
18*33f37583SAndroid Build Coastguard Worker
19*33f37583SAndroid Build Coastguard Worker #include <android-base/logging.h>
20*33f37583SAndroid Build Coastguard Worker #include <unistd.h>
21*33f37583SAndroid Build Coastguard Worker
22*33f37583SAndroid Build Coastguard Worker #include "apex_constants.h"
23*33f37583SAndroid Build Coastguard Worker #include "apexd_metrics.h"
24*33f37583SAndroid Build Coastguard Worker #include "statslog_apex.h"
25*33f37583SAndroid Build Coastguard Worker
26*33f37583SAndroid Build Coastguard Worker namespace android::apex {
27*33f37583SAndroid Build Coastguard Worker
28*33f37583SAndroid Build Coastguard Worker namespace {
29*33f37583SAndroid Build Coastguard Worker
Cast(InstallType install_type)30*33f37583SAndroid Build Coastguard Worker int Cast(InstallType install_type) {
31*33f37583SAndroid Build Coastguard Worker switch (install_type) {
32*33f37583SAndroid Build Coastguard Worker case InstallType::Staged:
33*33f37583SAndroid Build Coastguard Worker return stats::apex::
34*33f37583SAndroid Build Coastguard Worker APEX_INSTALLATION_REQUESTED__INSTALLATION_TYPE__STAGED;
35*33f37583SAndroid Build Coastguard Worker case InstallType::NonStaged:
36*33f37583SAndroid Build Coastguard Worker return stats::apex::
37*33f37583SAndroid Build Coastguard Worker APEX_INSTALLATION_REQUESTED__INSTALLATION_TYPE__REBOOTLESS;
38*33f37583SAndroid Build Coastguard Worker }
39*33f37583SAndroid Build Coastguard Worker }
40*33f37583SAndroid Build Coastguard Worker
Cast(InstallResult install_result)41*33f37583SAndroid Build Coastguard Worker int Cast(InstallResult install_result) {
42*33f37583SAndroid Build Coastguard Worker switch (install_result) {
43*33f37583SAndroid Build Coastguard Worker case InstallResult::Success:
44*33f37583SAndroid Build Coastguard Worker return stats::apex::
45*33f37583SAndroid Build Coastguard Worker APEX_INSTALLATION_ENDED__INSTALLATION_RESULT__INSTALL_SUCCESSFUL;
46*33f37583SAndroid Build Coastguard Worker case InstallResult::Failure:
47*33f37583SAndroid Build Coastguard Worker return stats::apex::
48*33f37583SAndroid Build Coastguard Worker APEX_INSTALLATION_ENDED__INSTALLATION_RESULT__INSTALL_FAILURE_APEX_INSTALLATION;
49*33f37583SAndroid Build Coastguard Worker }
50*33f37583SAndroid Build Coastguard Worker }
51*33f37583SAndroid Build Coastguard Worker
Cast(ApexPartition partition)52*33f37583SAndroid Build Coastguard Worker int Cast(ApexPartition partition) {
53*33f37583SAndroid Build Coastguard Worker switch (partition) {
54*33f37583SAndroid Build Coastguard Worker case ApexPartition::System:
55*33f37583SAndroid Build Coastguard Worker return stats::apex::
56*33f37583SAndroid Build Coastguard Worker APEX_INSTALLATION_REQUESTED__APEX_PREINSTALL_PARTITION__PARTITION_SYSTEM;
57*33f37583SAndroid Build Coastguard Worker case ApexPartition::SystemExt:
58*33f37583SAndroid Build Coastguard Worker return stats::apex::
59*33f37583SAndroid Build Coastguard Worker APEX_INSTALLATION_REQUESTED__APEX_PREINSTALL_PARTITION__PARTITION_SYSTEM_EXT;
60*33f37583SAndroid Build Coastguard Worker case ApexPartition::Product:
61*33f37583SAndroid Build Coastguard Worker return stats::apex::
62*33f37583SAndroid Build Coastguard Worker APEX_INSTALLATION_REQUESTED__APEX_PREINSTALL_PARTITION__PARTITION_PRODUCT;
63*33f37583SAndroid Build Coastguard Worker case ApexPartition::Vendor:
64*33f37583SAndroid Build Coastguard Worker return stats::apex::
65*33f37583SAndroid Build Coastguard Worker APEX_INSTALLATION_REQUESTED__APEX_PREINSTALL_PARTITION__PARTITION_VENDOR;
66*33f37583SAndroid Build Coastguard Worker case ApexPartition::Odm:
67*33f37583SAndroid Build Coastguard Worker return stats::apex::
68*33f37583SAndroid Build Coastguard Worker APEX_INSTALLATION_REQUESTED__APEX_PREINSTALL_PARTITION__PARTITION_ODM;
69*33f37583SAndroid Build Coastguard Worker }
70*33f37583SAndroid Build Coastguard Worker }
71*33f37583SAndroid Build Coastguard Worker
72*33f37583SAndroid Build Coastguard Worker } // namespace
73*33f37583SAndroid Build Coastguard Worker
SendInstallationRequested(InstallType install_type,bool is_rollback,const ApexFileInfo & info)74*33f37583SAndroid Build Coastguard Worker void StatsLog::SendInstallationRequested(InstallType install_type,
75*33f37583SAndroid Build Coastguard Worker bool is_rollback,
76*33f37583SAndroid Build Coastguard Worker const ApexFileInfo& info) {
77*33f37583SAndroid Build Coastguard Worker if (!IsAvailable()) {
78*33f37583SAndroid Build Coastguard Worker LOG(WARNING) << "Unable to send atom: libstatssocket is not available";
79*33f37583SAndroid Build Coastguard Worker return;
80*33f37583SAndroid Build Coastguard Worker }
81*33f37583SAndroid Build Coastguard Worker std::vector<const char*> hals_cstr;
82*33f37583SAndroid Build Coastguard Worker for (const auto& hal : info.hals) {
83*33f37583SAndroid Build Coastguard Worker hals_cstr.push_back(hal.c_str());
84*33f37583SAndroid Build Coastguard Worker }
85*33f37583SAndroid Build Coastguard Worker int ret = stats::apex::stats_write(
86*33f37583SAndroid Build Coastguard Worker stats::apex::APEX_INSTALLATION_REQUESTED, info.name.c_str(), info.version,
87*33f37583SAndroid Build Coastguard Worker info.file_size, info.file_hash.c_str(), Cast(info.partition),
88*33f37583SAndroid Build Coastguard Worker Cast(install_type), is_rollback, info.shared_libs, hals_cstr);
89*33f37583SAndroid Build Coastguard Worker if (ret < 0) {
90*33f37583SAndroid Build Coastguard Worker LOG(WARNING) << "Failed to report apex_installation_requested stats";
91*33f37583SAndroid Build Coastguard Worker }
92*33f37583SAndroid Build Coastguard Worker }
93*33f37583SAndroid Build Coastguard Worker
SendInstallationEnded(const std::string & file_hash,InstallResult result)94*33f37583SAndroid Build Coastguard Worker void StatsLog::SendInstallationEnded(const std::string& file_hash,
95*33f37583SAndroid Build Coastguard Worker InstallResult result) {
96*33f37583SAndroid Build Coastguard Worker if (!IsAvailable()) {
97*33f37583SAndroid Build Coastguard Worker LOG(WARNING) << "Unable to send atom: libstatssocket is not available";
98*33f37583SAndroid Build Coastguard Worker return;
99*33f37583SAndroid Build Coastguard Worker }
100*33f37583SAndroid Build Coastguard Worker int ret = stats::apex::stats_write(stats::apex::APEX_INSTALLATION_ENDED,
101*33f37583SAndroid Build Coastguard Worker file_hash.c_str(), Cast(result));
102*33f37583SAndroid Build Coastguard Worker if (ret < 0) {
103*33f37583SAndroid Build Coastguard Worker LOG(WARNING) << "Failed to report apex_installation_ended stats";
104*33f37583SAndroid Build Coastguard Worker }
105*33f37583SAndroid Build Coastguard Worker }
106*33f37583SAndroid Build Coastguard Worker
IsAvailable()107*33f37583SAndroid Build Coastguard Worker bool StatsLog::IsAvailable() {
108*33f37583SAndroid Build Coastguard Worker return access("/apex/com.android.os.statsd", F_OK) == 0;
109*33f37583SAndroid Build Coastguard Worker }
110*33f37583SAndroid Build Coastguard Worker
111*33f37583SAndroid Build Coastguard Worker } // namespace android::apex
112