vector/internal_events/
template.rs

1use metrics::counter;
2use vector_lib::NamedInternalEvent;
3use vector_lib::internal_event::{
4    ComponentEventsDropped, InternalEvent, UNINTENTIONAL, error_stage, error_type,
5};
6
7#[derive(NamedInternalEvent)]
8pub struct TemplateRenderingError<'a> {
9    pub field: Option<&'a str>,
10    pub drop_event: bool,
11    pub error: crate::template::TemplateRenderingError,
12}
13
14impl InternalEvent for TemplateRenderingError<'_> {
15    fn emit(self) {
16        let mut msg = "Failed to render template".to_owned();
17        if let Some(field) = self.field {
18            use std::fmt::Write;
19            _ = write!(msg, " for \"{field}\"");
20        }
21        msg.push('.');
22
23        if self.drop_event {
24            error!(
25                message = %msg,
26                error = %self.error,
27                error_type = error_type::TEMPLATE_FAILED,
28                stage = error_stage::PROCESSING,
29            );
30
31            counter!(
32                "component_errors_total",
33                "error_type" => error_type::TEMPLATE_FAILED,
34                "stage" => error_stage::PROCESSING,
35            )
36            .increment(1);
37
38            emit!(ComponentEventsDropped::<UNINTENTIONAL> {
39                count: 1,
40                reason: "Failed to render template.",
41            });
42        } else {
43            warn!(
44                message = %msg,
45                error = %self.error,
46                error_type = error_type::TEMPLATE_FAILED,
47                stage = error_stage::PROCESSING,
48            );
49        }
50    }
51}