Skip to main content

devops_armory/monitoring/gke/ram/
usage.rs

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