Skip to main content

devops_armory/monitoring/gke/cpu/
usage.rs

1use std::{
2    thread::sleep, 
3    time
4};
5
6use awc::{
7    Client, Connector,
8    ws::{self, Frame},
9};
10
11use futures::StreamExt;
12use futures_util::SinkExt as _;
13
14use openssl::ssl::{
15    SslConnector, 
16    SslMethod, 
17    SslVerifyMode
18};
19
20/// Function returning CPU usage by pod in CFGROUP_2
21/// Utilize websocket connection
22pub async fn cpu_usage_cfgroup2(
23    token: String,
24    gke_cluster_endpoint: String,
25    gke_cluster_namespace: String,
26    gke_pod_name: String
27) -> Result<f64, std::io::Error> {
28
29    let mut builder = SslConnector::builder(SslMethod::tls()).unwrap();
30    builder.set_verify(SslVerifyMode::NONE);
31    let myconnector = builder.build();
32    let client = Client::builder()
33        .connector(Connector::new().openssl(myconnector))
34        .finish();
35    loop {
36        let Ok((_resp, mut connection2)) = client
37                    .ws(format!("https://{gke_cluster_endpoint}:443/api/v1/namespaces/{gke_cluster_namespace}/pods/{gke_pod_name}/exec?command=grep&command=user&command=/sys/fs/cgroup/cpu.stat&stdin=true&stdout=true&stderr=true"))
38                    .bearer_auth(format!("{token}"))
39                    .connect()
40                    .await
41                    else {
42                        continue;
43                    };
44
45        connection2
46            .send(ws::Message::Text("SGVsbG8sIHdvcmxkIQ==".into()))
47            .await
48            .unwrap();
49
50        loop {
51            let response = connection2.next().await;
52            match response {
53                Some(Ok(Frame::Binary(b))) => {
54                    let s = String::from_utf8_lossy(&b);
55                    let v = s.trim_matches(|c: char| !c.is_alphanumeric());
56                    if v.is_empty() {
57                        continue;
58                    }
59
60                    let cpu_stg = v.split(" ").collect::<Vec<&str>>()[1].trim();
61
62                    let cpu: f64 = cpu_stg.parse().expect("not correct type");
63
64                    sleep(time::Duration::from_millis(1000));
65
66                    return Ok(cpu);
67                }
68                Some(Ok(Frame::Close(_c))) => {
69                    //println!("Connection closed");
70                }
71                Some(Ok(_)) => todo!(),
72                Some(Err(e)) => {
73                    println!("Some error occured: {e}");
74                    //continue;
75                }
76                None => {
77                    break;
78                }
79            }
80        }
81    }
82}
83
84/// Function returning CPU usage by pod in CFGROUP_1
85/// Utilize websocket connection
86pub async fn cpu_usage_cfgroup1(
87    token: String,
88    gke_cluster_endpoint: String,
89    gke_cluster_namespace: String,
90    gke_pod_name: String
91) -> Result<f64, std::io::Error> {
92
93    let mut builder = SslConnector::builder(SslMethod::tls()).unwrap();
94    builder.set_verify(SslVerifyMode::NONE);
95    let myconnector = builder.build();
96    let client = Client::builder()
97        .connector(Connector::new().openssl(myconnector))
98        .finish();
99    loop {
100        let Ok((_resp, mut connection2)) = client
101                    .ws(format!("https://{gke_cluster_endpoint}:443/api/v1/namespaces/{gke_cluster_namespace}/pods/{gke_pod_name}/exec?command=cat&command=/sys/fs/cgroup/cpu/cpuacct.usage&stdin=true&stdout=true&stderr=true"))
102                    .bearer_auth(format!("{token}"))
103                    .connect()
104                    .await
105                    else {
106                        continue;
107                    };
108
109        connection2
110            .send(ws::Message::Text("SGVsbG8sIHdvcmxkIQ==".into()))
111            .await
112            .unwrap();
113
114        loop {
115            let response = connection2.next().await;
116            match response {
117                Some(Ok(Frame::Binary(b))) => {
118                    //println!("{:?}", b);
119                    let s = String::from_utf8_lossy(&b);
120                    let v = s.trim_matches(|c: char| !c.is_alphanumeric());
121                    if v.is_empty() {
122                        continue;
123                    }
124
125                    let cpu: f64 = v.parse().expect("not correct type");
126
127                    sleep(time::Duration::from_millis(1000));
128
129                    return Ok(cpu);
130                }
131                Some(Ok(Frame::Close(_c))) => {
132                    //println!("Connection closed");
133                }
134                Some(Ok(_)) => todo!(),
135                Some(Err(e)) => {
136                    println!("Some error occured {e}");
137                    //continue;
138                }
139                None => {
140                    break;
141                }
142            }
143        }
144    }
145}