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