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    #[serde(flatten)]
70    pub extra: Value,
71}
72
73/// Debug info handler
74pub struct DebugInfoHandler {
75    client: RestClient,
76}
77
78impl DebugInfoHandler {
79    pub fn new(client: RestClient) -> Self {
80        DebugInfoHandler { client }
81    }
82
83    /// Start debug info collection
84    pub async fn create(&self, request: DebugInfoRequest) -> Result<DebugInfoStatus> {
85        self.client.post("/v1/debuginfo", &request).await
86    }
87
88    /// Get debug info collection status
89    pub async fn status(&self, task_id: &str) -> Result<DebugInfoStatus> {
90        self.client.get(&format!("/v1/debuginfo/{}", task_id)).await
91    }
92
93    /// List all debug info tasks
94    pub async fn list(&self) -> Result<Vec<DebugInfoStatus>> {
95        self.client.get("/v1/debuginfo").await
96    }
97
98    /// Download debug info package
99    pub async fn download(&self, task_id: &str) -> Result<Vec<u8>> {
100        self.client
101            .get_binary(&format!("/v1/debuginfo/{}/download", task_id))
102            .await
103    }
104
105    /// Cancel debug info collection
106    pub async fn cancel(&self, task_id: &str) -> Result<()> {
107        self.client
108            .delete(&format!("/v1/debuginfo/{}", task_id))
109            .await
110    }
111
112    /// Get all debug info across nodes - GET /v1/debuginfo/all (DEPRECATED)
113    /// Use cluster_debuginfo_binary() for the new endpoint
114    pub async fn all(&self) -> Result<Value> {
115        self.client.get("/v1/debuginfo/all").await
116    }
117
118    /// Get all debug info for a specific database - GET /v1/debuginfo/all/bdb/{uid} (DEPRECATED)
119    /// Use database_debuginfo_binary() for the new endpoint
120    pub async fn all_bdb(&self, bdb_uid: u32) -> Result<Value> {
121        self.client
122            .get(&format!("/v1/debuginfo/all/bdb/{}", bdb_uid))
123            .await
124    }
125
126    /// Get node debug info - GET /v1/debuginfo/node (DEPRECATED)
127    /// Use nodes_debuginfo_binary() for the new endpoint
128    pub async fn node(&self) -> Result<Value> {
129        self.client.get("/v1/debuginfo/node").await
130    }
131
132    /// Get node debug info for a specific database - GET /v1/debuginfo/node/bdb/{uid} (DEPRECATED)
133    /// Use database_debuginfo_binary() for the new endpoint
134    pub async fn node_bdb(&self, bdb_uid: u32) -> Result<Value> {
135        self.client
136            .get(&format!("/v1/debuginfo/node/bdb/{}", bdb_uid))
137            .await
138    }
139
140    // New binary endpoints (current API)
141
142    /// Get cluster debug info package as binary - GET /v1/cluster/debuginfo
143    /// Returns a tar.gz file containing all cluster debug information
144    pub async fn cluster_debuginfo_binary(&self) -> Result<Vec<u8>> {
145        self.client.get_binary("/v1/cluster/debuginfo").await
146    }
147
148    /// Get all nodes debug info package as binary - GET /v1/nodes/debuginfo
149    /// Returns a tar.gz file containing debug information from all nodes
150    pub async fn nodes_debuginfo_binary(&self) -> Result<Vec<u8>> {
151        self.client.get_binary("/v1/nodes/debuginfo").await
152    }
153
154    /// Get specific node debug info package as binary - GET /v1/nodes/{uid}/debuginfo
155    /// Returns a tar.gz file containing debug information from a specific node
156    pub async fn node_debuginfo_binary(&self, node_uid: u32) -> Result<Vec<u8>> {
157        self.client
158            .get_binary(&format!("/v1/nodes/{}/debuginfo", node_uid))
159            .await
160    }
161
162    /// Get all databases debug info package as binary - GET /v1/bdbs/debuginfo
163    /// Returns a tar.gz file containing debug information from all databases
164    pub async fn databases_debuginfo_binary(&self) -> Result<Vec<u8>> {
165        self.client.get_binary("/v1/bdbs/debuginfo").await
166    }
167
168    /// Get specific database debug info package as binary - GET /v1/bdbs/{uid}/debuginfo
169    /// Returns a tar.gz file containing debug information from a specific database
170    pub async fn database_debuginfo_binary(&self, bdb_uid: u32) -> Result<Vec<u8>> {
171        self.client
172            .get_binary(&format!("/v1/bdbs/{}/debuginfo", bdb_uid))
173            .await
174    }
175
176    // Deprecated binary endpoints (for backward compatibility)
177
178    /// Get all debug info as binary - GET /v1/debuginfo/all (DEPRECATED)
179    /// Returns a tar.gz file - Use cluster_debuginfo_binary() instead
180    pub async fn all_binary(&self) -> Result<Vec<u8>> {
181        self.client.get_binary("/v1/debuginfo/all").await
182    }
183
184    /// Get all debug info for a specific database as binary - GET /v1/debuginfo/all/bdb/{uid} (DEPRECATED)
185    /// Returns a tar.gz file - Use database_debuginfo_binary() instead
186    pub async fn all_bdb_binary(&self, bdb_uid: u32) -> Result<Vec<u8>> {
187        self.client
188            .get_binary(&format!("/v1/debuginfo/all/bdb/{}", bdb_uid))
189            .await
190    }
191
192    /// Get node debug info as binary - GET /v1/debuginfo/node (DEPRECATED)
193    /// Returns a tar.gz file - Use nodes_debuginfo_binary() instead
194    pub async fn node_binary(&self) -> Result<Vec<u8>> {
195        self.client.get_binary("/v1/debuginfo/node").await
196    }
197
198    /// Get node debug info for a specific database as binary - GET /v1/debuginfo/node/bdb/{uid} (DEPRECATED)
199    /// Returns a tar.gz file - Use database_debuginfo_binary() instead
200    pub async fn node_bdb_binary(&self, bdb_uid: u32) -> Result<Vec<u8>> {
201        self.client
202            .get_binary(&format!("/v1/debuginfo/node/bdb/{}", bdb_uid))
203            .await
204    }
205}