diff --git a/lib/vector-core/src/transform/mod.rs b/lib/vector-core/src/transform/mod.rs index 372724c42a912..b506716a2cfd0 100644 --- a/lib/vector-core/src/transform/mod.rs +++ b/lib/vector-core/src/transform/mod.rs @@ -40,34 +40,6 @@ impl Transform { Transform::Function(Box::new(v)) } - /// Mutably borrow the inner transform as a function transform. - /// - /// # Panics - /// - /// If the transform is not a [`FunctionTransform`] this will panic. - pub fn as_function(&mut self) -> &mut Box { - match self { - Transform::Function(t) => t, - _ => panic!( - "Called `Transform::as_function` on something that was not a function variant." - ), - } - } - - /// Transmute the inner transform into a function transform. - /// - /// # Panics - /// - /// If the transform is not a [`FunctionTransform`] this will panic. - pub fn into_function(self) -> Box { - match self { - Transform::Function(t) => t, - _ => panic!( - "Called `Transform::into_function` on something that was not a function variant." - ), - } - } - /// Create a new synchronous transform. /// /// This is a broader trait than the simple [`FunctionTransform`] in that it allows transforms @@ -104,20 +76,6 @@ impl Transform { Transform::Task(Box::new(WrapEventTask(v))) } - /// Mutably borrow the inner transform as a task transform. - /// - /// # Panics - /// - /// If the transform is a [`FunctionTransform`] this will panic. - pub fn as_task(&mut self) -> &mut Box> { - match self { - Transform::Task(t) => t, - _ => { - panic!("Called `Transform::as_task` on something that was not a task variant.") - } - } - } - /// Transmute the inner transform into a task transform. /// /// # Panics diff --git a/src/sinks/humio/metrics.rs b/src/sinks/humio/metrics.rs index 9a2ed31e0e49f..c79aa6b852d1a 100644 --- a/src/sinks/humio/metrics.rs +++ b/src/sinks/humio/metrics.rs @@ -6,7 +6,7 @@ use indoc::indoc; use lookup::lookup_v2::OptionalValuePath; use vector_common::sensitive_string::SensitiveString; use vector_config::configurable_component; -use vector_core::{sink::StreamSink, transform::Transform}; +use vector_core::sink::StreamSink; use super::{ host_key, @@ -14,8 +14,7 @@ use super::{ }; use crate::{ config::{ - AcknowledgementsConfig, GenerateConfig, Input, SinkConfig, SinkContext, TransformConfig, - TransformContext, + AcknowledgementsConfig, GenerateConfig, Input, SinkConfig, SinkContext, TransformContext, }, event::{Event, EventArray, EventContainer}, sinks::{ @@ -25,7 +24,10 @@ use crate::{ }, template::Template, tls::TlsConfig, - transforms::{metric_to_log::MetricToLogConfig, OutputBuffer}, + transforms::{ + metric_to_log::{MetricToLog, MetricToLogConfig}, + FunctionTransform, OutputBuffer, + }, }; /// Configuration for the `humio_metrics` sink. @@ -153,9 +155,7 @@ impl SinkConfig for HumioMetricsConfig { async fn build(&self, cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let transform = self .transform - .clone() - .build(&TransformContext::new_with_globals(cx.globals.clone())) - .await?; + .build_transform(&TransformContext::new_with_globals(cx.globals.clone())); let sink = HumioLogsConfig { token: self.token.clone(), @@ -199,7 +199,7 @@ impl SinkConfig for HumioMetricsConfig { pub struct HumioMetricsSink { inner: VectorSink, - transform: Transform, + transform: MetricToLog, } #[async_trait] @@ -210,7 +210,7 @@ impl StreamSink for HumioMetricsSink { .run(input.map(move |events| { let mut buf = OutputBuffer::with_capacity(events.len()); for event in events.into_events() { - transform.as_function().transform(&mut buf, event); + transform.transform(&mut buf, event); } // Awkward but necessary for the `EventArray` type let events = buf.into_events().map(Event::into_log).collect::>(); diff --git a/src/sources/kubernetes_logs/parser/cri.rs b/src/sources/kubernetes_logs/parser/cri.rs index c669fd44f5b38..e4d589b8b6727 100644 --- a/src/sources/kubernetes_logs/parser/cri.rs +++ b/src/sources/kubernetes_logs/parser/cri.rs @@ -188,7 +188,7 @@ pub mod tests { use bytes::Bytes; use super::{super::test_util, *}; - use crate::{event::LogEvent, test_util::trace_init, transforms::Transform}; + use crate::{event::LogEvent, test_util::trace_init}; use vrl::value::value; fn make_long_string(base: &str, len: usize) -> String { @@ -286,7 +286,7 @@ pub mod tests { fn test_parsing_valid_vector_namespace() { trace_init(); test_util::test_parser( - || Transform::function(Cri::new(LogNamespace::Vector)), + || Cri::new(LogNamespace::Vector), |bytes| Event::Log(LogEvent::from(value!(bytes))), valid_cases(LogNamespace::Vector), ); @@ -296,7 +296,7 @@ pub mod tests { fn test_parsing_valid_legacy_namespace() { trace_init(); test_util::test_parser( - || Transform::function(Cri::new(LogNamespace::Legacy)), + || Cri::new(LogNamespace::Legacy), |bytes| Event::Log(LogEvent::from(bytes)), valid_cases(LogNamespace::Legacy), ); diff --git a/src/sources/kubernetes_logs/parser/docker.rs b/src/sources/kubernetes_logs/parser/docker.rs index 97724e4b661c8..db25f52c63276 100644 --- a/src/sources/kubernetes_logs/parser/docker.rs +++ b/src/sources/kubernetes_logs/parser/docker.rs @@ -206,7 +206,7 @@ enum NormalizationError { #[cfg(test)] pub mod tests { use super::{super::test_util, *}; - use crate::{test_util::trace_init, transforms::Transform}; + use crate::test_util::trace_init; use vrl::value::value; fn make_long_string(base: &str, len: usize) -> String { @@ -315,10 +315,8 @@ pub mod tests { trace_init(); test_util::test_parser( - || { - Transform::function(Docker { - log_namespace: LogNamespace::Vector, - }) + || Docker { + log_namespace: LogNamespace::Vector, }, |bytes| Event::Log(LogEvent::from(value!(bytes))), valid_cases(LogNamespace::Vector), @@ -330,10 +328,8 @@ pub mod tests { trace_init(); test_util::test_parser( - || { - Transform::function(Docker { - log_namespace: LogNamespace::Legacy, - }) + || Docker { + log_namespace: LogNamespace::Legacy, }, |bytes| Event::Log(LogEvent::from(bytes)), valid_cases(LogNamespace::Legacy), diff --git a/src/sources/kubernetes_logs/parser/mod.rs b/src/sources/kubernetes_logs/parser/mod.rs index 37cb569fe7587..b8b5b4c6e9c7f 100644 --- a/src/sources/kubernetes_logs/parser/mod.rs +++ b/src/sources/kubernetes_logs/parser/mod.rs @@ -87,7 +87,7 @@ mod tests { use vrl::value::value; use super::*; - use crate::{event::Event, event::LogEvent, test_util::trace_init, transforms::Transform}; + use crate::{event::Event, event::LogEvent, test_util::trace_init}; /// Picker has to work for all test cases for underlying parsers. fn valid_cases(log_namespace: LogNamespace) -> Vec<(Bytes, Vec)> { @@ -107,7 +107,7 @@ mod tests { fn test_parsing_valid_vector_namespace() { trace_init(); test_util::test_parser( - || Transform::function(Parser::new(LogNamespace::Vector)), + || Parser::new(LogNamespace::Vector), |bytes| Event::Log(LogEvent::from(value!(bytes))), valid_cases(LogNamespace::Vector), ); @@ -117,7 +117,7 @@ mod tests { fn test_parsing_valid_legacy_namespace() { trace_init(); test_util::test_parser( - || Transform::function(Parser::new(LogNamespace::Legacy)), + || Parser::new(LogNamespace::Legacy), |bytes| Event::Log(LogEvent::from(bytes)), valid_cases(LogNamespace::Legacy), ); diff --git a/src/sources/kubernetes_logs/parser/test_util.rs b/src/sources/kubernetes_logs/parser/test_util.rs index 13cd4220620a0..745e849ad7d56 100644 --- a/src/sources/kubernetes_logs/parser/test_util.rs +++ b/src/sources/kubernetes_logs/parser/test_util.rs @@ -9,7 +9,7 @@ use vrl::value::{value, Value}; use crate::{ event::{Event, LogEvent}, sources::kubernetes_logs::Config, - transforms::{OutputBuffer, Transform}, + transforms::{FunctionTransform, OutputBuffer}, }; /// Build a log event for test purposes. @@ -58,15 +58,15 @@ pub fn make_log_event( /// Shared logic for testing parsers. /// /// Takes a parser builder and a list of test cases. -pub fn test_parser(builder: B, loader: L, cases: Vec<(S, Vec)>) +pub fn test_parser(builder: B, loader: L, cases: Vec<(S, Vec)>) where - B: Fn() -> Transform, + B: Fn() -> F, + F: FunctionTransform, L: Fn(S) -> Event, { for (message, expected) in cases { let input = loader(message); let mut parser = (builder)(); - let parser = parser.as_function(); let mut output = OutputBuffer::default(); parser.transform(&mut output, input); diff --git a/src/transforms/metric_to_log.rs b/src/transforms/metric_to_log.rs index bb397cc8fc352..b1c7c7394fca2 100644 --- a/src/transforms/metric_to_log.rs +++ b/src/transforms/metric_to_log.rs @@ -63,6 +63,17 @@ pub struct MetricToLogConfig { pub metric_tag_values: MetricTagValues, } +impl MetricToLogConfig { + pub fn build_transform(&self, context: &TransformContext) -> MetricToLog { + MetricToLog::new( + self.host_tag.as_deref(), + self.timezone.unwrap_or_else(|| context.globals.timezone()), + context.log_namespace(self.log_namespace), + self.metric_tag_values, + ) + } +} + impl GenerateConfig for MetricToLogConfig { fn generate_config() -> toml::Value { toml::Value::try_from(Self { @@ -79,12 +90,7 @@ impl GenerateConfig for MetricToLogConfig { #[typetag::serde(name = "metric_to_log")] impl TransformConfig for MetricToLogConfig { async fn build(&self, context: &TransformContext) -> crate::Result { - Ok(Transform::function(MetricToLog::new( - self.host_tag.as_deref(), - self.timezone.unwrap_or_else(|| context.globals.timezone()), - context.log_namespace(self.log_namespace), - self.metric_tag_values, - ))) + Ok(Transform::function(self.build_transform(context))) } fn input(&self) -> Input { @@ -676,10 +682,7 @@ mod tests { metric_tag_values, ..Default::default() } - .build(&TransformContext::default()) - .await - .unwrap() - .into_function() + .build_transform(&TransformContext::default()) .transform(&mut output, counter.into()); assert_eq!(output.len(), 1);