Skip to main content

redis_enterprise/
debuginfo.rs

1//! Debuginfo management for Redis Enterprise
2//!
3//! ## Overview
4//! - List and query resources
5//! - Create and update configurations
6//! - Monitor status and metrics
7
8use crate::client::RestClient;
9use crate::error::Result;
10use serde::{Deserialize, Serialize};
11use serde_json::Value;
12use typed_builder::TypedBuilder;
13
14/// Debug info collection request
15#[derive(Debug, Clone, Serialize, Deserialize, TypedBuilder)]
16pub struct DebugInfoRequest {
17    /// List of node UIDs to collect debug info from (if not specified, collects from all nodes)
18    #[serde(skip_serializing_if = "Option::is_none")]
19    #[builder(default, setter(strip_option))]
20    pub node_uids: Option<Vec<u32>>,
21    /// List of database UIDs to collect debug info for (if not specified, collects for all databases)
22    #[serde(skip_serializing_if = "Option::is_none")]
23    #[builder(default, setter(strip_option))]
24    pub bdb_uids: Option<Vec<u32>>,
25    /// Whether to include log files in the debug info collection
26    #[serde(skip_serializing_if = "Option::is_none")]
27    #[builder(default, setter(strip_option))]
28    pub include_logs: Option<bool>,
29    /// Whether to include system and database metrics in the debug info
30    #[serde(skip_serializing_if = "Option::is_none")]
31    #[builder(default, setter(strip_option))]
32    pub include_metrics: Option<bool>,
33    /// Whether to include configuration files and settings
34    #[serde(skip_serializing_if = "Option::is_none")]
35    #[builder(default, setter(strip_option))]
36    pub include_configs: Option<bool>,
37    /// Time range for collecting historical data and logs
38    #[serde(skip_serializing_if = "Option::is_none")]
39    #[builder(default, setter(strip_option))]
40    pub time_range: Option<TimeRange>,
41}
42
43/// Time range for debug info collection
44#[derive(Debug, Clone, Serialize, Deserialize)]
45pub struct TimeRange {
46    /// Start time for data collection (ISO 8601 format)
47    pub start: String,
48    /// End time for data collection (ISO 8601 format)
49    pub end: String,
50}
51
52/// Debug info status
53#[derive(Debug, Clone, Serialize, Deserialize)]
54pub struct DebugInfoStatus {
55    /// Unique identifier for the debug info collection task
56    pub task_id: String,
57    /// Current status of the debug info collection (queued, running, completed, failed)
58    pub status: String,
59    /// Completion progress as a percentage (0.0-100.0)
60    #[serde(skip_serializing_if = "Option::is_none")]
61    pub progress: Option<f32>,
62    /// URL for downloading the collected debug info package
63    #[serde(skip_serializing_if = "Option::is_none")]
64    pub download_url: Option<String>,
65    /// Error description if the collection task failed
66    #[serde(skip_serializing_if = "Option::is_none")]
67    pub error: Option<String>,
68}
69
70/// Debug info handler
71pub struct DebugInfoHandler {
72    client: RestClient,
73}
74
75impl DebugInfoHandler {
76    /// Create a new handler bound to the given REST client.
77    pub fn new(client: RestClient) -> Self {
78        DebugInfoHandler { client }
79    }
80
81    /// Start debug info collection
82    pub async fn create(&self, request: DebugInfoRequest) -> Result<DebugInfoStatus> {
83        self.client.post("/v1/debuginfo", &request).await
84    }
85
86    /// Get debug info collection status
87    pub async fn status(&self, task_id: &str) -> Result<DebugInfoStatus> {
88        self.client.get(&format!("/v1/debuginfo/{}", task_id)).await
89    }
90
91    /// List all debug info tasks
92    pub async fn list(&self) -> Result<Vec<DebugInfoStatus>> {
93        self.client.get("/v1/debuginfo").await
94    }
95
96    /// Download debug info package
97    pub async fn download(&self, task_id: &str) -> Result<Vec<u8>> {
98        self.client
99            .get_binary(&format!("/v1/debuginfo/{}/download", task_id))
100            .await
101    }
102
103    /// Cancel debug info collection
104    pub async fn cancel(&self, task_id: &str) -> Result<()> {
105        self.client
106            .delete(&format!("/v1/debuginfo/{}", task_id))
107            .await
108    }
109
110    /// Get all debug info across nodes - GET /v1/debuginfo/all (DEPRECATED)
111    /// Use cluster_debuginfo_binary() for the new endpoint
112    pub async fn all(&self) -> Result<Value> {
113        self.client.get("/v1/debuginfo/all").await
114    }
115
116    /// Get all debug info for a specific database - GET /v1/debuginfo/all/bdb/{uid} (DEPRECATED)
117    /// Use database_debuginfo_binary() for the new endpoint
118    pub async fn all_bdb(&self, bdb_uid: u32) -> Result<Value> {
119        self.client
120            .get(&format!("/v1/debuginfo/all/bdb/{}", bdb_uid))
121            .await
122    }
123
124    /// Get node debug info - GET /v1/debuginfo/node (DEPRECATED)
125    /// Use nodes_debuginfo_binary() for the new endpoint
126    pub async fn node(&self) -> Result<Value> {
127        self.client.get("/v1/debuginfo/node").await
128    }
129
130    /// Get node debug info for a specific database - GET /v1/debuginfo/node/bdb/{uid} (DEPRECATED)
131    /// Use database_debuginfo_binary() for the new endpoint
132    pub async fn node_bdb(&self, bdb_uid: u32) -> Result<Value> {
133        self.client
134            .get(&format!("/v1/debuginfo/node/bdb/{}", bdb_uid))
135            .await
136    }
137
138    // New binary endpoints (current API)
139
140    /// Get cluster debug info package as binary - GET /v1/cluster/debuginfo
141    /// Returns a tar.gz file containing all cluster debug information
142    pub async fn cluster_debuginfo_binary(&self) -> Result<Vec<u8>> {
143        self.client.get_binary("/v1/cluster/debuginfo").await
144    }
145
146    /// Get all nodes debug info package as binary - GET /v1/nodes/debuginfo
147    /// Returns a tar.gz file containing debug information from all nodes
148    pub async fn nodes_debuginfo_binary(&self) -> Result<Vec<u8>> {
149        self.client.get_binary("/v1/nodes/debuginfo").await
150    }
151
152    /// Get specific node debug info package as binary - GET /v1/nodes/{uid}/debuginfo
153    /// Returns a tar.gz file containing debug information from a specific node
154    pub async fn node_debuginfo_binary(&self, node_uid: u32) -> Result<Vec<u8>> {
155        self.client
156            .get_binary(&format!("/v1/nodes/{}/debuginfo", node_uid))
157            .await
158    }
159
160    /// Get all databases debug info package as binary - GET /v1/bdbs/debuginfo
161    /// Returns a tar.gz file containing debug information from all databases
162    pub async fn databases_debuginfo_binary(&self) -> Result<Vec<u8>> {
163        self.client.get_binary("/v1/bdbs/debuginfo").await
164    }
165
166    /// Get specific database debug info package as binary - GET /v1/bdbs/{uid}/debuginfo
167    /// Returns a tar.gz file containing debug information from a specific database
168    pub async fn database_debuginfo_binary(&self, bdb_uid: u32) -> Result<Vec<u8>> {
169        self.client
170            .get_binary(&format!("/v1/bdbs/{}/debuginfo", bdb_uid))
171            .await
172    }
173
174    // Deprecated binary endpoints (for backward compatibility)
175
176    /// Get all debug info as binary - GET /v1/debuginfo/all (DEPRECATED)
177    /// Returns a tar.gz file - Use cluster_debuginfo_binary() instead
178    pub async fn all_binary(&self) -> Result<Vec<u8>> {
179        self.client.get_binary("/v1/debuginfo/all").await
180    }
181
182    /// Get all debug info for a specific database as binary - GET /v1/debuginfo/all/bdb/{uid} (DEPRECATED)
183    /// Returns a tar.gz file - Use database_debuginfo_binary() instead
184    pub async fn all_bdb_binary(&self, bdb_uid: u32) -> Result<Vec<u8>> {
185        self.client
186            .get_binary(&format!("/v1/debuginfo/all/bdb/{}", bdb_uid))
187            .await
188    }
189
190    /// Get node debug info as binary - GET /v1/debuginfo/node (DEPRECATED)
191    /// Returns a tar.gz file - Use nodes_debuginfo_binary() instead
192    pub async fn node_binary(&self) -> Result<Vec<u8>> {
193        self.client.get_binary("/v1/debuginfo/node").await
194    }
195
196    /// Get node debug info for a specific database as binary - GET /v1/debuginfo/node/bdb/{uid} (DEPRECATED)
197    /// Returns a tar.gz file - Use database_debuginfo_binary() instead
198    pub async fn node_bdb_binary(&self, bdb_uid: u32) -> Result<Vec<u8>> {
199        self.client
200            .get_binary(&format!("/v1/debuginfo/node/bdb/{}", bdb_uid))
201            .await
202    }
203}