vector/sinks/s3_common/
partitioner.rs1use vector_lib::{event::Event, partition::Partitioner};
2
3use crate::{
4 internal_events::TemplateRenderingError, sinks::util::partitioner::render_key_with_fallback,
5 template::Template,
6};
7
8#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9pub struct S3PartitionKey {
10 pub key_prefix: String,
11 pub ssekms_key_id: Option<String>,
12}
13
14pub struct S3KeyPartitioner {
20 key_prefix_template: Template,
21 ssekms_key_id_template: Option<Template>,
22 dead_letter_key_prefix: Option<String>,
23}
24
25impl S3KeyPartitioner {
26 pub const fn new(
27 key_prefix_template: Template,
28 ssekms_key_id_template: Option<Template>,
29 dead_letter_key_prefix: Option<String>,
30 ) -> Self {
31 Self {
32 key_prefix_template,
33 ssekms_key_id_template,
34 dead_letter_key_prefix,
35 }
36 }
37}
38
39impl Partitioner for S3KeyPartitioner {
40 type Item = Event;
41 type Key = Option<S3PartitionKey>;
42
43 fn partition(&self, item: &Self::Item) -> Self::Key {
44 let key_prefix = render_key_with_fallback(
45 &self.key_prefix_template,
46 item,
47 self.dead_letter_key_prefix.as_deref(),
48 )?;
49
50 let ssekms_key_id = self
51 .ssekms_key_id_template
52 .as_ref()
53 .map(|t| {
54 t.render_string(item).map_err(|error| {
55 emit!(TemplateRenderingError {
56 error,
57 field: Some("ssekms_key_id"),
58 drop_event: true,
59 });
60 })
61 })
62 .transpose()
63 .ok()?;
64
65 Some(S3PartitionKey {
66 key_prefix,
67 ssekms_key_id,
68 })
69 }
70}