1use serde::{Deserialize, Serialize};
2use std::error::Error;
3
4use super::client::Client;
5use std::collections::HashMap;
6
7#[derive(Deserialize, Debug)]
8pub struct Node {
9 pub partitions: Vec<String>,
10 pub os_pid: String,
11 pub fd_total: i64,
12 pub sockets_total: i64,
13 pub mem_limit: i64,
14 pub mem_alarm: bool,
15 pub disk_free_limit: i64,
16 pub disk_free_alarm: bool,
17 pub proc_total: i64,
18 pub rates_mode: String,
19 pub uptime: i64,
20 pub run_queue: i32,
21 pub processors: i32,
22 pub exchange_types: Vec<ExchangeType>,
23 pub auth_mechanisms: Vec<AuthMechanism>,
24 pub applications: Vec<Application>,
25 pub contexts: Vec<Context>,
26 pub log_files: Vec<String>,
27 pub db_dir: String,
28 pub config_files: Vec<String>,
29 pub net_ticktime: i32,
30 pub enabled_plugins: Vec<String>,
31 pub mem_calculation_strategy: String,
32 pub ra_open_file_metrics: HashMap<String, i32>,
33 pub name: String,
34 #[serde(rename = "type")]
35 pub node_type: String,
36 pub running: bool,
37 pub being_drained: bool,
38 pub mem_used: i64,
39 pub mem_used_details: RateDetails,
40 pub fd_used: i32,
41 pub fd_used_details: RateDetails,
42 pub sockets_used: i32,
43 pub sockets_used_details: RateDetails,
44 pub proc_used: i32,
45 pub proc_used_details: RateDetails,
46 pub disk_free: i64,
47 pub disk_free_details: RateDetails,
48 pub gc_num: i64,
49 pub gc_num_details: RateDetails,
50 pub gc_bytes_reclaimed: i64,
51 pub gc_bytes_reclaimed_details: RateDetails,
52 pub context_switches: i64,
53 pub context_switches_details: RateDetails,
54 pub io_read_count: i64,
55 pub io_read_count_details: RateDetails,
56 pub io_read_bytes: i64,
57 pub io_read_bytes_details: RateDetails,
58 pub io_read_avg_time: f64,
59 pub io_read_avg_time_details: RateDetails,
60 pub io_write_count: i64,
61 pub io_write_count_details: RateDetails,
62 pub io_write_bytes: i64,
63 pub io_write_bytes_details: RateDetails,
64 pub io_write_avg_time: f64,
65 pub io_write_avg_time_details: RateDetails,
66 pub io_sync_count: i64,
67 pub io_sync_count_details: RateDetails,
68 pub io_sync_avg_time: f64,
69 pub io_sync_avg_time_details: RateDetails,
70 pub io_seek_count: i64,
71 pub io_seek_count_details: RateDetails,
72 pub io_seek_avg_time: f64,
73 pub io_seek_avg_time_details: RateDetails,
74 pub io_reopen_count: i64,
75 pub io_reopen_count_details: RateDetails,
76 pub mnesia_ram_tx_count: i64,
77 pub mnesia_ram_tx_count_details: RateDetails,
78 pub mnesia_disk_tx_count: i64,
79 pub mnesia_disk_tx_count_details: RateDetails,
80 pub msg_store_read_count: i64,
81 pub msg_store_read_count_details: RateDetails,
82 pub msg_store_write_count: i64,
83 pub msg_store_write_count_details: RateDetails,
84 pub queue_index_write_count: i64,
85 pub queue_index_write_count_details: RateDetails,
86 pub queue_index_read_count: i64,
87 pub queue_index_read_count_details: RateDetails,
88 pub connection_created: i64,
89 pub connection_created_details: RateDetails,
90 pub connection_closed: i64,
91 pub connection_closed_details: RateDetails,
92 pub channel_created: i64,
93 pub channel_created_details: RateDetails,
94 pub channel_closed: i64,
95 pub channel_closed_details: RateDetails,
96 pub queue_declared: i64,
97 pub queue_declared_details: RateDetails,
98 pub queue_created: i64,
99 pub queue_created_details: RateDetails,
100 pub queue_deleted: i64,
101 pub queue_deleted_details: RateDetails,
102 pub cluster_links: Vec<ClusterLink>,
103 pub metrics_gc_queue_length: MetricsGcQueueLength,
104}
105
106#[derive(Deserialize, Debug)]
107pub struct ExchangeType {
108 pub name: String,
109 pub description: String,
110 pub enabled: bool,
111}
112
113#[derive(Deserialize, Debug)]
114pub struct AuthMechanism {
115 pub name: String,
116 pub description: String,
117 pub enabled: bool,
118}
119
120#[derive(Deserialize, Debug)]
121pub struct Application {
122 pub name: String,
123 pub description: String,
124 pub version: String,
125}
126
127#[derive(Deserialize, Debug)]
128pub struct Context {
129 pub description: String,
130 pub path: String,
131 pub cowboy_opts: String,
132 pub port: String,
133 pub protocol: Option<String>,
134}
135
136#[derive(Serialize, Deserialize, Debug)]
137pub struct RateDetails {
138 pub rate: f64,
139}
140
141#[derive(Serialize, Deserialize, Debug)]
142pub struct MetricsGcQueueLength {
143 pub connection_closed: i32,
144 pub channel_closed: i32,
145 pub consumer_deleted: i32,
146 pub exchange_deleted: i32,
147 pub queue_deleted: i32,
148 pub vhost_deleted: i32,
149 pub node_node_deleted: i32,
150 pub channel_consumer_deleted: i32,
151}
152
153#[derive(Deserialize, Serialize, Debug)]
154pub struct ClusterLink {
155 pub stats: LinkStats,
156 pub name: String,
157 pub peer_addr: String,
158 pub peer_port: u16,
159 pub sock_addr: String,
160 pub sock_port: u16,
161 pub recv_bytes: u64,
162 pub send_bytes: u64,
163}
164
165#[derive(Deserialize, Serialize, Debug)]
166pub struct LinkStats {
167 pub send_bytes: u64,
168 pub send_bytes_details: RateDetails,
169 pub recv_bytes: u64,
170 pub recv_bytes_details: RateDetails,
171}
172
173pub struct NodeManager {
174 client: Box<Client>,
175}
176
177impl NodeManager {
178 pub fn new(client: Box<Client>) -> Self {
179 Self { client }
180 }
181
182 pub async fn get(&self) -> Result<Vec<Node>, Box<dyn Error>> {
183 let uri = "api/nodes".to_string();
184 let nodes = self
185 .client
186 .get(uri, None)
187 .await?
188 .json::<Vec<Node>>()
189 .await?;
190 Ok(nodes)
191 }
192}