xref: /aosp_15_r20/system/apex/apexd/apexd_metrics.h (revision 33f3758387333dbd2962d7edbd98681940d895da)
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 #pragma once
18*33f37583SAndroid Build Coastguard Worker 
19*33f37583SAndroid Build Coastguard Worker #include <map>
20*33f37583SAndroid Build Coastguard Worker #include <memory>
21*33f37583SAndroid Build Coastguard Worker #include <span>
22*33f37583SAndroid Build Coastguard Worker #include <string>
23*33f37583SAndroid Build Coastguard Worker #include <vector>
24*33f37583SAndroid Build Coastguard Worker 
25*33f37583SAndroid Build Coastguard Worker #include "apex_constants.h"
26*33f37583SAndroid Build Coastguard Worker 
27*33f37583SAndroid Build Coastguard Worker namespace android::apex {
28*33f37583SAndroid Build Coastguard Worker 
29*33f37583SAndroid Build Coastguard Worker class ApexFile;
30*33f37583SAndroid Build Coastguard Worker class ApexSession;
31*33f37583SAndroid Build Coastguard Worker 
32*33f37583SAndroid Build Coastguard Worker enum class InstallType {
33*33f37583SAndroid Build Coastguard Worker   Staged,
34*33f37583SAndroid Build Coastguard Worker   NonStaged,
35*33f37583SAndroid Build Coastguard Worker };
36*33f37583SAndroid Build Coastguard Worker 
37*33f37583SAndroid Build Coastguard Worker enum class InstallResult {
38*33f37583SAndroid Build Coastguard Worker   Success,
39*33f37583SAndroid Build Coastguard Worker   Failure,
40*33f37583SAndroid Build Coastguard Worker };
41*33f37583SAndroid Build Coastguard Worker 
42*33f37583SAndroid Build Coastguard Worker class Metrics {
43*33f37583SAndroid Build Coastguard Worker  public:
44*33f37583SAndroid Build Coastguard Worker   struct ApexFileInfo {
45*33f37583SAndroid Build Coastguard Worker     std::string name;
46*33f37583SAndroid Build Coastguard Worker     int64_t version;
47*33f37583SAndroid Build Coastguard Worker     bool shared_libs;
48*33f37583SAndroid Build Coastguard Worker     int64_t file_size;
49*33f37583SAndroid Build Coastguard Worker     std::string file_hash;
50*33f37583SAndroid Build Coastguard Worker     ApexPartition partition;
51*33f37583SAndroid Build Coastguard Worker     std::vector<std::string> hals;
52*33f37583SAndroid Build Coastguard Worker   };
53*33f37583SAndroid Build Coastguard Worker 
54*33f37583SAndroid Build Coastguard Worker   virtual ~Metrics() = default;
55*33f37583SAndroid Build Coastguard Worker   virtual void SendInstallationRequested(InstallType install_type,
56*33f37583SAndroid Build Coastguard Worker                                          bool is_rollback,
57*33f37583SAndroid Build Coastguard Worker                                          const ApexFileInfo& info) = 0;
58*33f37583SAndroid Build Coastguard Worker   virtual void SendInstallationEnded(const std::string& file_hash,
59*33f37583SAndroid Build Coastguard Worker                                      InstallResult result) = 0;
60*33f37583SAndroid Build Coastguard Worker };
61*33f37583SAndroid Build Coastguard Worker 
62*33f37583SAndroid Build Coastguard Worker std::unique_ptr<Metrics> InitMetrics(std::unique_ptr<Metrics> metrics);
63*33f37583SAndroid Build Coastguard Worker 
64*33f37583SAndroid Build Coastguard Worker void SendSessionApexInstallationEndedAtom(const ApexSession& session,
65*33f37583SAndroid Build Coastguard Worker                                           InstallResult install_result);
66*33f37583SAndroid Build Coastguard Worker 
67*33f37583SAndroid Build Coastguard Worker // Helper class to send "installation_requested" event. Events are
68*33f37583SAndroid Build Coastguard Worker // sent in its destructor using Metrics::Send* methods.
69*33f37583SAndroid Build Coastguard Worker class InstallRequestedEvent {
70*33f37583SAndroid Build Coastguard Worker  public:
InstallRequestedEvent(InstallType install_type,bool is_rollback)71*33f37583SAndroid Build Coastguard Worker   InstallRequestedEvent(InstallType install_type, bool is_rollback)
72*33f37583SAndroid Build Coastguard Worker       : install_type_(install_type), is_rollback_(is_rollback) {}
73*33f37583SAndroid Build Coastguard Worker   // Sends the "requested" event.
74*33f37583SAndroid Build Coastguard Worker   // Sends the "end" event if it's non-staged or failed.
75*33f37583SAndroid Build Coastguard Worker   ~InstallRequestedEvent();
76*33f37583SAndroid Build Coastguard Worker 
77*33f37583SAndroid Build Coastguard Worker   void AddFiles(std::span<const ApexFile> files);
78*33f37583SAndroid Build Coastguard Worker 
79*33f37583SAndroid Build Coastguard Worker   // Adds HAL Information for each APEX.
80*33f37583SAndroid Build Coastguard Worker   // Since the event can contain multiple APEX files, HAL information is
81*33f37583SAndroid Build Coastguard Worker   // passed as a map of APEX name to a list of HAL names.
82*33f37583SAndroid Build Coastguard Worker   void AddHals(const std::map<std::string, std::vector<std::string>>& hals);
83*33f37583SAndroid Build Coastguard Worker 
84*33f37583SAndroid Build Coastguard Worker   // Marks the current installation request has succeeded.
85*33f37583SAndroid Build Coastguard Worker   void MarkSucceeded();
86*33f37583SAndroid Build Coastguard Worker 
87*33f37583SAndroid Build Coastguard Worker   // Returns file hashes for APEX files added by AddFile()
88*33f37583SAndroid Build Coastguard Worker   std::vector<std::string> GetFileHashes() const;
89*33f37583SAndroid Build Coastguard Worker 
90*33f37583SAndroid Build Coastguard Worker  private:
91*33f37583SAndroid Build Coastguard Worker   InstallType install_type_;
92*33f37583SAndroid Build Coastguard Worker   bool is_rollback_;
93*33f37583SAndroid Build Coastguard Worker   std::vector<Metrics::ApexFileInfo> files_;
94*33f37583SAndroid Build Coastguard Worker   bool succeeded_ = false;
95*33f37583SAndroid Build Coastguard Worker };
96*33f37583SAndroid Build Coastguard Worker 
97*33f37583SAndroid Build Coastguard Worker }  // namespace android::apex
98