redis_enterprise/
diagnostics.rs1use crate::client::RestClient;
9use crate::error::Result;
10use serde::{Deserialize, Serialize};
11use serde_json::Value;
12use typed_builder::TypedBuilder;
13
14#[derive(Debug, Clone, Serialize, Deserialize, TypedBuilder)]
16pub struct DiagnosticRequest {
17 #[serde(skip_serializing_if = "Option::is_none")]
19 #[builder(default, setter(strip_option))]
20 pub checks: Option<Vec<String>>,
21 #[serde(skip_serializing_if = "Option::is_none")]
23 #[builder(default, setter(strip_option))]
24 pub node_uids: Option<Vec<u32>>,
25 #[serde(skip_serializing_if = "Option::is_none")]
27 #[builder(default, setter(strip_option))]
28 pub bdb_uids: Option<Vec<u32>>,
29}
30
31#[derive(Debug, Clone, Serialize, Deserialize)]
33pub struct DiagnosticResult {
34 pub check_name: String,
36 pub status: String,
38 #[serde(skip_serializing_if = "Option::is_none")]
40 pub message: Option<String>,
41 #[serde(skip_serializing_if = "Option::is_none")]
43 pub details: Option<Value>,
44 #[serde(skip_serializing_if = "Option::is_none")]
46 pub recommendations: Option<Vec<String>>,
47
48 #[serde(flatten)]
49 pub extra: Value,
50}
51
52#[derive(Debug, Clone, Serialize, Deserialize)]
54pub struct DiagnosticReport {
55 pub report_id: String,
57 pub timestamp: String,
59 pub results: Vec<DiagnosticResult>,
61 #[serde(skip_serializing_if = "Option::is_none")]
63 pub summary: Option<DiagnosticSummary>,
64
65 #[serde(flatten)]
66 pub extra: Value,
67}
68
69#[derive(Debug, Clone, Serialize, Deserialize)]
71pub struct DiagnosticSummary {
72 pub total_checks: u32,
74 pub passed: u32,
76 pub warnings: u32,
78 pub failures: u32,
80}
81
82pub struct DiagnosticsHandler {
84 client: RestClient,
85}
86
87impl DiagnosticsHandler {
88 pub fn new(client: RestClient) -> Self {
89 DiagnosticsHandler { client }
90 }
91
92 pub async fn run(&self, request: DiagnosticRequest) -> Result<DiagnosticReport> {
94 self.client.post("/v1/diagnostics", &request).await
95 }
96
97 pub async fn list_checks(&self) -> Result<Vec<String>> {
99 self.client.get("/v1/diagnostics/checks").await
100 }
101
102 pub async fn get_last_report(&self) -> Result<DiagnosticReport> {
104 self.client.get("/v1/diagnostics/last").await
105 }
106
107 pub async fn get_report(&self, report_id: &str) -> Result<DiagnosticReport> {
109 self.client
110 .get(&format!("/v1/diagnostics/reports/{}", report_id))
111 .await
112 }
113
114 pub async fn list_reports(&self) -> Result<Vec<DiagnosticReport>> {
116 self.client.get("/v1/diagnostics/reports").await
117 }
118
119 pub async fn get_config(&self) -> Result<Value> {
121 self.client.get("/v1/diagnostics").await
122 }
123
124 pub async fn update_config(&self, body: Value) -> Result<Value> {
126 self.client.put("/v1/diagnostics", &body).await
127 }
128}