vector_core/event/
merge_state.rs

1use super::LogEvent;
2
3/// Encapsulates the inductive events merging algorithm.
4///
5/// In the future, this might be extended by various counters (the number of
6/// events that contributed to the current merge event for instance, or the
7/// event size) to support circuit breaker logic.
8#[derive(Debug)]
9pub struct LogEventMergeState {
10    /// Intermediate event we merge into.
11    intermediate_merged_event: LogEvent,
12}
13
14impl LogEventMergeState {
15    /// Initialize the algorithm with a first (partial) event.
16    pub fn new(first_partial_event: LogEvent) -> Self {
17        Self {
18            intermediate_merged_event: first_partial_event,
19        }
20    }
21
22    /// Merge the incoming (partial) event in.
23    pub fn merge_in_next_event(&mut self, incoming: LogEvent, fields: &[impl AsRef<str>]) {
24        self.intermediate_merged_event.merge(incoming, fields);
25    }
26
27    /// Merge the final (non-partial) event in and return the resulting (merged)
28    /// event.
29    pub fn merge_in_final_event(
30        mut self,
31        incoming: LogEvent,
32        fields: &[impl AsRef<str>],
33    ) -> LogEvent {
34        self.merge_in_next_event(incoming, fields);
35        self.intermediate_merged_event
36    }
37}
38
39#[cfg(test)]
40mod test {
41    use super::*;
42
43    fn log_event_with_message(message: &str) -> LogEvent {
44        LogEvent::from(message)
45    }
46
47    #[test]
48    fn log_event_merge_state_example() {
49        let fields = vec!["message".to_string()];
50
51        let mut state = LogEventMergeState::new(log_event_with_message("hel"));
52        state.merge_in_next_event(log_event_with_message("lo "), &fields);
53        let merged_event = state.merge_in_final_event(log_event_with_message("world"), &fields);
54
55        assert_eq!(
56            merged_event
57                .get("message")
58                .unwrap()
59                .coerce_to_bytes()
60                .as_ref(),
61            b"hello world"
62        );
63    }
64}