Skip to main content

session/
protocol_ctx.rs

1// Copyright 2023 Greptime Team
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use ahash::HashSet;
16
17/// Protocol specific context
18/// for carrying options(like HTTP header options) within the query context
19#[derive(Debug, Clone, Default)]
20pub enum ProtocolCtx {
21    #[default]
22    None,
23    OtlpMetric(OtlpMetricCtx),
24}
25
26impl ProtocolCtx {
27    pub fn get_otlp_metric_ctx(&self) -> Option<&OtlpMetricCtx> {
28        match self {
29            ProtocolCtx::None => None,
30            ProtocolCtx::OtlpMetric(opt) => Some(opt),
31        }
32    }
33}
34
35/// The context information for OTLP metrics ingestion.
36/// - `promote_all_resource_attrs`
37///     If true, all resource attributes will be promoted to the final table schema.
38/// - `resource_attrs`
39///     If `promote_all_resource_attrs` is true, then the list is an exclude list from `ignore_resource_attrs`.
40///     If `promote_all_resource_attrs` is false, then this list is a include list from `promote_resource_attrs`.
41/// - `promote_scope_attrs`
42///     If true, all scope attributes will be promoted to the final table schema.
43///     Along with the scope name, scope version and scope schema URL.
44/// - `with_metric_engine`
45/// - `experimental_enable_exponential_histogram`
46/// - `is_legacy`
47///     If the user uses OTLP metrics ingestion before v0.16, it uses the old path.
48///     So we call this path 'legacy'.
49///     After v0.16, we store the OTLP metrics using prometheus compatible format, the new path.
50///     The difference is how we convert the input data into the final table schema.
51#[derive(Debug, Clone, Default)]
52pub struct OtlpMetricCtx {
53    pub promote_all_resource_attrs: bool,
54    pub resource_attrs: HashSet<String>,
55    pub promote_scope_attrs: bool,
56    pub with_metric_engine: bool,
57    pub experimental_enable_exponential_histogram: bool,
58    pub is_legacy: bool,
59    /// Set from the server's `otlp.experimental_enable_resource_info`; off
60    /// means the resource descriptor is not synthesized at all.
61    pub resource_info: bool,
62    pub metric_type: MetricType,
63    pub metric_translation_strategy: OtlpMetricTranslationStrategy,
64}
65
66impl OtlpMetricCtx {
67    pub fn set_metric_type(&mut self, metric_type: MetricType) {
68        self.metric_type = metric_type;
69    }
70}
71
72#[derive(Debug, Clone, Default)]
73pub enum MetricType {
74    // default value when initializing the context
75    #[default]
76    Init,
77    NonMonotonicSum,
78    MonotonicSum,
79    Gauge,
80    Histogram,
81    ExponentialHistogram,
82    Summary,
83}
84
85#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
86pub enum OtlpMetricTranslationStrategy {
87    #[default]
88    UnderscoreEscapingWithSuffixes,
89    UnderscoreEscapingWithoutSuffixes,
90    NoUtf8EscapingWithSuffixes,
91    NoTranslation,
92}
93
94impl OtlpMetricTranslationStrategy {
95    pub const VALUES: [&'static str; 4] = [
96        "UnderscoreEscapingWithSuffixes",
97        "UnderscoreEscapingWithoutSuffixes",
98        "NoUTF8EscapingWithSuffixes",
99        "NoTranslation",
100    ];
101
102    pub fn as_str(self) -> &'static str {
103        match self {
104            Self::UnderscoreEscapingWithSuffixes => "UnderscoreEscapingWithSuffixes",
105            Self::UnderscoreEscapingWithoutSuffixes => "UnderscoreEscapingWithoutSuffixes",
106            Self::NoUtf8EscapingWithSuffixes => "NoUTF8EscapingWithSuffixes",
107            Self::NoTranslation => "NoTranslation",
108        }
109    }
110
111    pub fn should_escape(self) -> bool {
112        matches!(
113            self,
114            Self::UnderscoreEscapingWithSuffixes | Self::UnderscoreEscapingWithoutSuffixes
115        )
116    }
117
118    pub fn should_add_suffixes(self) -> bool {
119        matches!(
120            self,
121            Self::UnderscoreEscapingWithSuffixes | Self::NoUtf8EscapingWithSuffixes
122        )
123    }
124}
125
126impl std::str::FromStr for OtlpMetricTranslationStrategy {
127    type Err = ();
128
129    fn from_str(value: &str) -> Result<Self, Self::Err> {
130        match value {
131            "UnderscoreEscapingWithSuffixes" => Ok(Self::UnderscoreEscapingWithSuffixes),
132            "UnderscoreEscapingWithoutSuffixes" => Ok(Self::UnderscoreEscapingWithoutSuffixes),
133            "NoUTF8EscapingWithSuffixes" => Ok(Self::NoUtf8EscapingWithSuffixes),
134            "NoTranslation" => Ok(Self::NoTranslation),
135            _ => Err(()),
136        }
137    }
138}
139
140impl std::fmt::Display for OtlpMetricTranslationStrategy {
141    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
142        f.write_str(self.as_str())
143    }
144}