saluki_components/common/datadog/
protocol.rs1use std::collections::{BTreeSet, HashMap};
4
5use agent_data_plane_config::shared::{
6 MetricsEncoding as TypedMetricsEncoding, V3ApiEncoding as TypedV3ApiEncoding, V3ApiSettings as TypedV3ApiSettings,
7 V3SeriesMode,
8};
9use serde::{Deserialize, Serialize};
10
11#[derive(Clone, Debug, PartialEq, Eq)]
16pub enum MetricsEndpointRouting {
17 AllExcept(BTreeSet<String>),
19 Only(BTreeSet<String>),
21}
22
23impl MetricsEndpointRouting {
24 pub(crate) fn should_route_to(&self, configured_endpoint: &str) -> bool {
26 match self {
27 Self::AllExcept(endpoints) => !endpoints.contains(configured_endpoint),
28 Self::Only(endpoints) => endpoints.contains(configured_endpoint),
29 }
30 }
31}
32
33#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
35pub enum MetricsPayloadType {
36 Series,
38
39 Sketches,
41}
42
43#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
45pub enum MetricsProtocolVersion {
46 V2,
48
49 V3,
51}
52
53#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
58pub struct MetricsPayloadInfo {
59 pub version: MetricsProtocolVersion,
61
62 pub payload_type: MetricsPayloadType,
64}
65
66impl MetricsPayloadInfo {
67 pub const fn v2_series() -> Self {
69 Self {
70 version: MetricsProtocolVersion::V2,
71 payload_type: MetricsPayloadType::Series,
72 }
73 }
74
75 pub const fn v2_sketches() -> Self {
77 Self {
78 version: MetricsProtocolVersion::V2,
79 payload_type: MetricsPayloadType::Sketches,
80 }
81 }
82
83 pub const fn v3_series() -> Self {
85 Self {
86 version: MetricsProtocolVersion::V3,
87 payload_type: MetricsPayloadType::Series,
88 }
89 }
90
91 pub const fn v3_sketches() -> Self {
93 Self {
94 version: MetricsProtocolVersion::V3,
95 payload_type: MetricsPayloadType::Sketches,
96 }
97 }
98
99 pub const fn is_sketch(&self) -> bool {
101 matches!(self.payload_type, MetricsPayloadType::Sketches)
102 }
103}
104
105#[derive(Clone, Debug, Default, PartialEq)]
107pub struct V3ApiSettings {
108 pub endpoints: Vec<String>,
113}
114
115impl V3ApiSettings {
116 pub fn is_enabled(&self) -> bool {
118 !self.endpoints.is_empty()
119 }
120}
121
122#[derive(Clone, Debug, Default, PartialEq)]
124pub struct V3ApiConfig {
125 pub sketches: V3ApiSettings,
127
128 pub compression_level: i32,
132}
133
134impl V3ApiConfig {
135 pub fn use_v3_sketches(&self) -> bool {
137 self.sketches.is_enabled()
138 }
139}
140
141impl From<&TypedV3ApiSettings> for V3ApiSettings {
142 fn from(settings: &TypedV3ApiSettings) -> Self {
143 Self {
144 endpoints: settings.endpoints.clone(),
145 }
146 }
147}
148
149impl From<&TypedV3ApiEncoding> for V3ApiConfig {
150 fn from(config: &TypedV3ApiEncoding) -> Self {
151 Self {
152 sketches: (&config.sketches).into(),
153 compression_level: config.compression_level,
154 }
155 }
156}
157
158#[derive(Clone, Debug, Default, PartialEq)]
160pub struct UseV3ApiConfig {
161 pub series: UseV3ApiSeriesConfig,
163}
164
165#[derive(Clone, Debug, Default, PartialEq)]
167pub struct UseV3ApiSeriesConfig {
168 pub enabled: V3SeriesMode,
170
171 pub endpoints: HashMap<String, V3SeriesMode>,
173}
174
175impl From<&TypedMetricsEncoding> for UseV3ApiSeriesConfig {
176 fn from(config: &TypedMetricsEncoding) -> Self {
177 Self {
178 enabled: config.v3_series_mode,
179 endpoints: config.v3_series_endpoint_modes.clone(),
180 }
181 }
182}