postfix_log_parser/formatters/json/
qmgr.rs

1use crate::events::qmgr::QmgrEvent;
2use serde_json::{Map, Value};
3
4/// 将Qmgr事件转换为JSON对象
5pub fn format_qmgr_event(qmgr_event: &QmgrEvent) -> Map<String, Value> {
6    let mut event_data = Map::new();
7
8    match qmgr_event {
9        QmgrEvent::ConfigurationWarning {
10            warning_type: _,
11            message,
12        } => {
13            event_data.insert(
14                "event_type".to_string(),
15                Value::String("config_warning".to_string()),
16            );
17            event_data.insert("message".to_string(), Value::String(message.clone()));
18        }
19        QmgrEvent::MessageActive {
20            queue_id,
21            from,
22            size,
23            nrcpt,
24        } => {
25            event_data.insert(
26                "event_type".to_string(),
27                Value::String("message_active".to_string()),
28            );
29            event_data.insert("queue_id".to_string(), Value::String(queue_id.clone()));
30            event_data.insert("sender".to_string(), Value::String(from.clone()));
31            event_data.insert(
32                "size".to_string(),
33                Value::Number(serde_json::Number::from(*size)),
34            );
35            event_data.insert(
36                "nrcpt".to_string(),
37                Value::Number(serde_json::Number::from(*nrcpt)),
38            );
39        }
40        QmgrEvent::MessageRemoved { queue_id, reason } => {
41            event_data.insert(
42                "event_type".to_string(),
43                Value::String("message_removed".to_string()),
44            );
45            event_data.insert("queue_id".to_string(), Value::String(queue_id.clone()));
46            if let Some(reason_text) = reason {
47                event_data.insert("reason".to_string(), Value::String(reason_text.clone()));
48            }
49        }
50        QmgrEvent::MessageSkipped {
51            queue_id,
52            reason,
53            status_details,
54        } => {
55            event_data.insert(
56                "event_type".to_string(),
57                Value::String("message_skipped".to_string()),
58            );
59            event_data.insert("queue_id".to_string(), Value::String(queue_id.clone()));
60            event_data.insert("reason".to_string(), Value::String(reason.clone()));
61            if let Some(details) = status_details {
62                event_data.insert("status_details".to_string(), Value::String(details.clone()));
63            }
64        }
65        QmgrEvent::MessageDeferred {
66            queue_id,
67            from,
68            to,
69            relay,
70            delay,
71            delays,
72            dsn,
73            status,
74        } => {
75            event_data.insert(
76                "event_type".to_string(),
77                Value::String("message_deferred".to_string()),
78            );
79            event_data.insert("queue_id".to_string(), Value::String(queue_id.clone()));
80            event_data.insert("sender".to_string(), Value::String(from.clone()));
81            if let Some(to_addr) = to {
82                event_data.insert("recipient".to_string(), Value::String(to_addr.clone()));
83            }
84            if let Some(relay_info) = relay {
85                event_data.insert("relay".to_string(), Value::String(relay_info.clone()));
86            }
87            event_data.insert("delay".to_string(), Value::String(delay.clone()));
88            if let Some(delays_info) = delays {
89                event_data.insert("delays".to_string(), Value::String(delays_info.clone()));
90            }
91            if let Some(dsn_code) = dsn {
92                event_data.insert("dsn".to_string(), Value::String(dsn_code.clone()));
93            }
94            event_data.insert("status".to_string(), Value::String(status.clone()));
95        }
96        QmgrEvent::MessageSent {
97            queue_id,
98            from,
99            to,
100            relay,
101            delay,
102            delays,
103            dsn,
104            status,
105        } => {
106            event_data.insert(
107                "event_type".to_string(),
108                Value::String("message_sent".to_string()),
109            );
110            event_data.insert("queue_id".to_string(), Value::String(queue_id.clone()));
111            event_data.insert("sender".to_string(), Value::String(from.clone()));
112            event_data.insert("recipient".to_string(), Value::String(to.clone()));
113            event_data.insert("relay".to_string(), Value::String(relay.clone()));
114            event_data.insert("delay".to_string(), Value::String(delay.clone()));
115            if let Some(delays_info) = delays {
116                event_data.insert("delays".to_string(), Value::String(delays_info.clone()));
117            }
118            if let Some(dsn_code) = dsn {
119                event_data.insert("dsn".to_string(), Value::String(dsn_code.clone()));
120            }
121            event_data.insert("status".to_string(), Value::String(status.clone()));
122        }
123        QmgrEvent::MessageBounced {
124            queue_id,
125            from,
126            to,
127            reason,
128            dsn,
129        } => {
130            event_data.insert(
131                "event_type".to_string(),
132                Value::String("message_bounced".to_string()),
133            );
134            event_data.insert("queue_id".to_string(), Value::String(queue_id.clone()));
135            event_data.insert("sender".to_string(), Value::String(from.clone()));
136            event_data.insert("recipient".to_string(), Value::String(to.clone()));
137            event_data.insert("reason".to_string(), Value::String(reason.clone()));
138            if let Some(dsn_code) = dsn {
139                event_data.insert("dsn".to_string(), Value::String(dsn_code.clone()));
140            }
141        }
142        QmgrEvent::QueueStats {
143            active,
144            deferred,
145            hold,
146            incoming,
147            maildrop,
148        } => {
149            event_data.insert(
150                "event_type".to_string(),
151                Value::String("queue_stats".to_string()),
152            );
153            if let Some(active_count) = active {
154                event_data.insert(
155                    "active".to_string(),
156                    Value::Number(serde_json::Number::from(*active_count)),
157                );
158            }
159            if let Some(deferred_count) = deferred {
160                event_data.insert(
161                    "deferred".to_string(),
162                    Value::Number(serde_json::Number::from(*deferred_count)),
163                );
164            }
165            if let Some(hold_count) = hold {
166                event_data.insert(
167                    "hold".to_string(),
168                    Value::Number(serde_json::Number::from(*hold_count)),
169                );
170            }
171            if let Some(incoming_count) = incoming {
172                event_data.insert(
173                    "incoming".to_string(),
174                    Value::Number(serde_json::Number::from(*incoming_count)),
175                );
176            }
177            if let Some(maildrop_count) = maildrop {
178                event_data.insert(
179                    "maildrop".to_string(),
180                    Value::Number(serde_json::Number::from(*maildrop_count)),
181                );
182            }
183        }
184        QmgrEvent::TransportStatus {
185            transport,
186            status,
187            details,
188        } => {
189            event_data.insert(
190                "event_type".to_string(),
191                Value::String("transport_status".to_string()),
192            );
193            event_data.insert("transport".to_string(), Value::String(transport.clone()));
194            event_data.insert("status".to_string(), Value::String(status.clone()));
195            if let Some(details_text) = details {
196                event_data.insert("details".to_string(), Value::String(details_text.clone()));
197            }
198        }
199        QmgrEvent::ResourceLimit {
200            resource_type,
201            current_value,
202            limit_value,
203            message,
204        } => {
205            event_data.insert(
206                "event_type".to_string(),
207                Value::String("resource_limit".to_string()),
208            );
209            event_data.insert(
210                "resource_type".to_string(),
211                Value::String(resource_type.clone()),
212            );
213            if let Some(current) = current_value {
214                event_data.insert(
215                    "current_value".to_string(),
216                    Value::Number(serde_json::Number::from(*current)),
217                );
218            }
219            if let Some(limit) = limit_value {
220                event_data.insert(
221                    "limit_value".to_string(),
222                    Value::Number(serde_json::Number::from(*limit)),
223                );
224            }
225            event_data.insert("message".to_string(), Value::String(message.clone()));
226        }
227        QmgrEvent::QueueFlush {
228            queue_name,
229            message_count,
230        } => {
231            event_data.insert(
232                "event_type".to_string(),
233                Value::String("queue_flush".to_string()),
234            );
235            if let Some(name) = queue_name {
236                event_data.insert("queue_name".to_string(), Value::String(name.clone()));
237            }
238            if let Some(count) = message_count {
239                event_data.insert(
240                    "message_count".to_string(),
241                    Value::Number(serde_json::Number::from(*count)),
242                );
243            }
244        }
245        QmgrEvent::Other {
246            event_type,
247            message,
248            queue_id,
249        } => {
250            event_data.insert("event_type".to_string(), Value::String("other".to_string()));
251            event_data.insert("sub_type".to_string(), Value::String(event_type.clone()));
252            event_data.insert("message".to_string(), Value::String(message.clone()));
253            if let Some(id) = queue_id {
254                event_data.insert("queue_id".to_string(), Value::String(id.clone()));
255            }
256        }
257    }
258
259    event_data
260}