redis_enterprise/
logs.rs

1//! Log management and retrieval
2//!
3//! ## Overview
4//! - Query cluster logs
5//! - Configure log levels
6//! - Export log data
7
8use crate::client::RestClient;
9use crate::error::Result;
10use serde::{Deserialize, Serialize};
11use serde_json::Value;
12
13/// Log entry (cluster event)
14#[derive(Debug, Clone, Serialize, Deserialize)]
15pub struct LogEntry {
16    /// Timestamp when event happened (ISO 8601 format)
17    pub time: String,
18
19    /// Event type - determines what additional fields are available
20    /// (e.g., "bdb_name_updated", "node_status_changed", etc.)
21    #[serde(rename = "type")]
22    pub event_type: String,
23
24    /// Additional fields based on event type
25    /// May include severity, bdb_uid, old_val, new_val, and other event-specific fields
26    #[serde(flatten)]
27    pub extra: Value,
28}
29
30/// Logs query parameters
31#[derive(Debug, Serialize, Default)]
32pub struct LogsQuery {
33    /// Optional start time before which we don't want events
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub stime: Option<String>,
36    /// Optional end time after which we don't want events
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub etime: Option<String>,
39    /// Order of events: "desc" (descending) or "asc" (ascending, default)
40    #[serde(skip_serializing_if = "Option::is_none")]
41    pub order: Option<String>,
42    /// Optional maximum number of events to return
43    #[serde(skip_serializing_if = "Option::is_none")]
44    pub limit: Option<u32>,
45    /// Optional offset - skip this many events before returning results (for pagination)
46    #[serde(skip_serializing_if = "Option::is_none")]
47    pub offset: Option<u32>,
48}
49
50/// Logs handler for querying event logs
51pub struct LogsHandler {
52    client: RestClient,
53}
54
55impl LogsHandler {
56    pub fn new(client: RestClient) -> Self {
57        LogsHandler { client }
58    }
59
60    /// Get event logs
61    pub async fn list(&self, query: Option<LogsQuery>) -> Result<Vec<LogEntry>> {
62        if let Some(q) = query {
63            // Build query string from LogsQuery
64            let query_str = serde_urlencoded::to_string(&q).unwrap_or_default();
65            self.client.get(&format!("/v1/logs?{}", query_str)).await
66        } else {
67            self.client.get("/v1/logs").await
68        }
69    }
70}