codecs/encoding/format/
logfmt.rs

1use bytes::BytesMut;
2use serde::{Deserialize, Serialize};
3use tokio_util::codec::Encoder;
4use vector_common::encode_logfmt;
5use vector_core::{config::DataType, event::Event, schema};
6
7/// Config used to build a `LogfmtSerializer`.
8#[derive(Debug, Clone, Default, Deserialize, Serialize)]
9pub struct LogfmtSerializerConfig;
10
11impl LogfmtSerializerConfig {
12    /// Creates a new `LogfmtSerializerConfig`.
13    pub const fn new() -> Self {
14        Self
15    }
16
17    /// Build the `LogfmtSerializer` from this configuration.
18    pub const fn build(&self) -> LogfmtSerializer {
19        LogfmtSerializer
20    }
21
22    /// The data type of events that are accepted by `LogfmtSerializer`.
23    pub fn input_type(&self) -> DataType {
24        DataType::Log
25    }
26
27    /// The schema required by the serializer.
28    pub fn schema_requirement(&self) -> schema::Requirement {
29        // While technically we support `Value` variants that can't be losslessly serialized to
30        // logfmt, we don't want to enforce that limitation to users yet.
31        schema::Requirement::empty()
32    }
33}
34
35/// Serializer that converts an `Event` to bytes using the logfmt format.
36#[derive(Debug, Clone)]
37pub struct LogfmtSerializer;
38
39impl Encoder<Event> for LogfmtSerializer {
40    type Error = vector_common::Error;
41
42    fn encode(&mut self, event: Event, buffer: &mut BytesMut) -> Result<(), Self::Error> {
43        let log = event.as_log();
44        let string = encode_logfmt::encode_value(log.value())?;
45        buffer.extend_from_slice(string.as_bytes());
46
47        Ok(())
48    }
49}
50
51#[cfg(test)]
52mod tests {
53    use super::*;
54    use bytes::BytesMut;
55    use vector_core::event::{LogEvent, Value};
56    use vrl::btreemap;
57
58    #[test]
59    fn serialize_logfmt() {
60        let event = Event::Log(LogEvent::from(btreemap! {
61            "foo" => Value::from("bar")
62        }));
63        let mut serializer = LogfmtSerializer;
64        let mut bytes = BytesMut::new();
65
66        serializer.encode(event, &mut bytes).unwrap();
67
68        assert_eq!(bytes.freeze(), "foo=bar");
69    }
70}