Skip to main content

vector/internal_events/
tag_cardinality_limit.rs

1use vector_lib::{
2    NamedInternalEvent, counter, gauge,
3    internal_event::{ComponentEventsDropped, CounterName, GaugeName, INTENTIONAL, InternalEvent},
4};
5
6#[derive(NamedInternalEvent)]
7pub struct TagCardinalityLimitRejectingEvent<'a> {
8    pub metric_name: &'a str,
9    pub tag_key: &'a str,
10    pub tag_value: &'a str,
11    pub include_extended_tags: bool,
12}
13
14impl InternalEvent for TagCardinalityLimitRejectingEvent<'_> {
15    fn emit(self) {
16        debug!(
17            message = "Event containing tag with new value after hitting configured 'value_limit'; discarding event.",
18            metric_name = self.metric_name,
19            tag_key = self.tag_key,
20            tag_value = self.tag_value,
21        );
22        if self.include_extended_tags {
23            counter!(
24                CounterName::TagValueLimitExceededTotal,
25                "metric_name" => self.metric_name.to_string(),
26                "tag_key" => self.tag_key.to_string(),
27            )
28            .increment(1);
29        } else {
30            counter!(CounterName::TagValueLimitExceededTotal).increment(1);
31        }
32
33        emit!(ComponentEventsDropped::<INTENTIONAL> {
34            count: 1,
35            reason: "Tag value limit exceeded."
36        })
37    }
38}
39
40#[derive(NamedInternalEvent)]
41pub struct TagCardinalityLimitRejectingTag<'a> {
42    pub metric_name: &'a str,
43    pub tag_key: &'a str,
44    pub tag_value: &'a str,
45    pub include_extended_tags: bool,
46}
47
48impl InternalEvent for TagCardinalityLimitRejectingTag<'_> {
49    fn emit(self) {
50        debug!(
51            message = "Rejecting tag after hitting configured 'value_limit'.",
52            metric_name = self.metric_name,
53            tag_key = self.tag_key,
54            tag_value = self.tag_value,
55        );
56        if self.include_extended_tags {
57            counter!(
58                CounterName::TagValueLimitExceededTotal,
59                "metric_name" => self.metric_name.to_string(),
60                "tag_key" => self.tag_key.to_string(),
61            )
62            .increment(1);
63        } else {
64            counter!(CounterName::TagValueLimitExceededTotal).increment(1);
65        }
66    }
67}
68
69#[derive(NamedInternalEvent)]
70pub struct TagCardinalityValueLimitReached<'a> {
71    pub key: &'a str,
72}
73
74impl InternalEvent for TagCardinalityValueLimitReached<'_> {
75    fn emit(self) {
76        debug!(
77            message = "Value_limit reached for key. New values for this key will be rejected.",
78            key = %self.key,
79        );
80        counter!(CounterName::ValueLimitReachedTotal).increment(1);
81    }
82}
83
84#[derive(NamedInternalEvent)]
85pub struct TagCardinalityLimitUntracked;
86
87impl InternalEvent for TagCardinalityLimitUntracked {
88    fn emit(self) {
89        debug!(
90            message = "Max tracked keys limit reached; forwarding one or more metric tags without cardinality checks."
91        );
92        counter!(CounterName::TagCardinalityUntrackedEventsTotal).increment(1);
93    }
94}
95
96#[derive(NamedInternalEvent)]
97pub struct TagCardinalityTrackedKeys {
98    pub count: usize,
99}
100
101impl InternalEvent for TagCardinalityTrackedKeys {
102    fn emit(self) {
103        gauge!(GaugeName::TagCardinalityTrackedKeys).set(self.count as f64);
104    }
105}