xref: /aosp_15_r20/system/extras/profcollectd/profcollectctl.rs (revision 288bf5226967eb3dac5cce6c939ccc2a7f2b4fe5)
1*288bf522SAndroid Build Coastguard Worker //
2*288bf522SAndroid Build Coastguard Worker // Copyright (C) 2020 The Android Open Source Project
3*288bf522SAndroid Build Coastguard Worker //
4*288bf522SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
5*288bf522SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
6*288bf522SAndroid Build Coastguard Worker // You may obtain a copy of the License at
7*288bf522SAndroid Build Coastguard Worker //
8*288bf522SAndroid Build Coastguard Worker //      http://www.apache.org/licenses/LICENSE-2.0
9*288bf522SAndroid Build Coastguard Worker //
10*288bf522SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
11*288bf522SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
12*288bf522SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*288bf522SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
14*288bf522SAndroid Build Coastguard Worker // limitations under the License.
15*288bf522SAndroid Build Coastguard Worker //
16*288bf522SAndroid Build Coastguard Worker 
17*288bf522SAndroid Build Coastguard Worker //! Command to control profcollectd behaviour.
18*288bf522SAndroid Build Coastguard Worker 
19*288bf522SAndroid Build Coastguard Worker use anyhow::{bail, Context, Result};
20*288bf522SAndroid Build Coastguard Worker use std::env;
21*288bf522SAndroid Build Coastguard Worker 
22*288bf522SAndroid Build Coastguard Worker const HELP_MSG: &str = r#"
23*288bf522SAndroid Build Coastguard Worker usage: profcollectctl [command]
24*288bf522SAndroid Build Coastguard Worker 
25*288bf522SAndroid Build Coastguard Worker Command to control profcollectd behaviour.
26*288bf522SAndroid Build Coastguard Worker 
27*288bf522SAndroid Build Coastguard Worker command:
28*288bf522SAndroid Build Coastguard Worker     start       Schedule periodic collection.
29*288bf522SAndroid Build Coastguard Worker     stop        Terminate periodic collection.
30*288bf522SAndroid Build Coastguard Worker     trace       Request an one-off system-wide trace.
31*288bf522SAndroid Build Coastguard Worker     process     Convert traces to perf profiles.
32*288bf522SAndroid Build Coastguard Worker     report      Create a report containing all profiles.
33*288bf522SAndroid Build Coastguard Worker     reset       Clear all local data.
34*288bf522SAndroid Build Coastguard Worker     help        Print this message.
35*288bf522SAndroid Build Coastguard Worker "#;
36*288bf522SAndroid Build Coastguard Worker 
main() -> Result<()>37*288bf522SAndroid Build Coastguard Worker fn main() -> Result<()> {
38*288bf522SAndroid Build Coastguard Worker     libprofcollectd::init_logging();
39*288bf522SAndroid Build Coastguard Worker 
40*288bf522SAndroid Build Coastguard Worker     let args: Vec<String> = env::args().collect();
41*288bf522SAndroid Build Coastguard Worker     if args.len() != 2 {
42*288bf522SAndroid Build Coastguard Worker         bail!("This program only takes one argument{}", &HELP_MSG);
43*288bf522SAndroid Build Coastguard Worker     }
44*288bf522SAndroid Build Coastguard Worker 
45*288bf522SAndroid Build Coastguard Worker     let action = &args[1];
46*288bf522SAndroid Build Coastguard Worker     match action.as_str() {
47*288bf522SAndroid Build Coastguard Worker         "start" => {
48*288bf522SAndroid Build Coastguard Worker             println!("Scheduling profile collection");
49*288bf522SAndroid Build Coastguard Worker             libprofcollectd::schedule().context("Failed to schedule collection.")?;
50*288bf522SAndroid Build Coastguard Worker         }
51*288bf522SAndroid Build Coastguard Worker         "stop" => {
52*288bf522SAndroid Build Coastguard Worker             println!("Terminating profile collection");
53*288bf522SAndroid Build Coastguard Worker             libprofcollectd::terminate().context("Failed to terminate collection.")?;
54*288bf522SAndroid Build Coastguard Worker         }
55*288bf522SAndroid Build Coastguard Worker         "trace" => {
56*288bf522SAndroid Build Coastguard Worker             println!("Performing system-wide trace");
57*288bf522SAndroid Build Coastguard Worker             libprofcollectd::trace_system("manual").context("Failed to trace.")?;
58*288bf522SAndroid Build Coastguard Worker         }
59*288bf522SAndroid Build Coastguard Worker         "process" => {
60*288bf522SAndroid Build Coastguard Worker             println!("Processing traces");
61*288bf522SAndroid Build Coastguard Worker             libprofcollectd::process().context("Failed to process traces.")?;
62*288bf522SAndroid Build Coastguard Worker         }
63*288bf522SAndroid Build Coastguard Worker         "report" => {
64*288bf522SAndroid Build Coastguard Worker             println!("Creating profile report");
65*288bf522SAndroid Build Coastguard Worker             let path = libprofcollectd::report().context("Failed to create profile report.")?;
66*288bf522SAndroid Build Coastguard Worker             println!("Report created at: {}", &path);
67*288bf522SAndroid Build Coastguard Worker         }
68*288bf522SAndroid Build Coastguard Worker         "reset" => {
69*288bf522SAndroid Build Coastguard Worker             libprofcollectd::reset().context("Failed to reset.")?;
70*288bf522SAndroid Build Coastguard Worker             println!("Reset done.");
71*288bf522SAndroid Build Coastguard Worker         }
72*288bf522SAndroid Build Coastguard Worker         "help" => println!("{}", &HELP_MSG),
73*288bf522SAndroid Build Coastguard Worker         arg => bail!("Unknown argument: {}\n{}", &arg, &HELP_MSG),
74*288bf522SAndroid Build Coastguard Worker     }
75*288bf522SAndroid Build Coastguard Worker     Ok(())
76*288bf522SAndroid Build Coastguard Worker }
77