Skip to main content

common_query/
native_histogram.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
15//! Shared native histogram field contract.
16//!
17//! Prom remote-write v2 stores these names as children of one Struct field, while
18//! metric-engine uses the same contract to recognize native histogram tables.
19
20use std::sync::Arc;
21
22use datatypes::data_type::ConcreteDataType;
23use datatypes::types::{StructField, StructType};
24use once_cell::sync::Lazy;
25
26pub const NATIVE_HISTOGRAM_FIELD: &str = "greptime_native_histogram";
27pub const SCHEMA_FIELD: &str = "schema";
28pub const ZERO_THRESHOLD_FIELD: &str = "zero_threshold";
29pub const SUM_FIELD: &str = "sum";
30pub const RESET_HINT_FIELD: &str = "reset_hint";
31pub const START_TIMESTAMP_FIELD: &str = "start_timestamp";
32pub const CUSTOM_VALUES_FIELD: &str = "custom_values";
33pub const POSITIVE_SPAN_OFFSETS_FIELD: &str = "positive_span_offsets";
34pub const POSITIVE_SPAN_LENGTHS_FIELD: &str = "positive_span_lengths";
35pub const NEGATIVE_SPAN_OFFSETS_FIELD: &str = "negative_span_offsets";
36pub const NEGATIVE_SPAN_LENGTHS_FIELD: &str = "negative_span_lengths";
37pub const COUNT_U64_FIELD: &str = "count_u64";
38pub const ZERO_COUNT_U64_FIELD: &str = "zero_count_u64";
39pub const POSITIVE_BUCKETS_I64_FIELD: &str = "positive_buckets_i64";
40pub const NEGATIVE_BUCKETS_I64_FIELD: &str = "negative_buckets_i64";
41pub const COUNT_F64_FIELD: &str = "count_f64";
42pub const ZERO_COUNT_F64_FIELD: &str = "zero_count_f64";
43pub const POSITIVE_BUCKETS_F64_FIELD: &str = "positive_buckets_f64";
44pub const NEGATIVE_BUCKETS_F64_FIELD: &str = "negative_buckets_f64";
45
46// Keep int and float payloads in separate columns. The populated family is the
47// type signal, so we don't need to persist an extra histogram-type tag.
48pub const NATIVE_HISTOGRAM_FIELD_NAMES: &[&str] = &[
49    SCHEMA_FIELD,
50    ZERO_THRESHOLD_FIELD,
51    SUM_FIELD,
52    RESET_HINT_FIELD,
53    START_TIMESTAMP_FIELD,
54    CUSTOM_VALUES_FIELD,
55    POSITIVE_SPAN_OFFSETS_FIELD,
56    POSITIVE_SPAN_LENGTHS_FIELD,
57    NEGATIVE_SPAN_OFFSETS_FIELD,
58    NEGATIVE_SPAN_LENGTHS_FIELD,
59    COUNT_U64_FIELD,
60    ZERO_COUNT_U64_FIELD,
61    POSITIVE_BUCKETS_I64_FIELD,
62    NEGATIVE_BUCKETS_I64_FIELD,
63    COUNT_F64_FIELD,
64    ZERO_COUNT_F64_FIELD,
65    POSITIVE_BUCKETS_F64_FIELD,
66    NEGATIVE_BUCKETS_F64_FIELD,
67];
68
69static NATIVE_HISTOGRAM_VALUE_TYPE: Lazy<ConcreteDataType> = Lazy::new(|| {
70    let fields = NATIVE_HISTOGRAM_FIELD_NAMES
71        .iter()
72        .filter_map(|name| {
73            let data_type = native_histogram_field_type(name)?;
74            Some(StructField::new((*name).to_string(), data_type, true))
75        })
76        .collect();
77    ConcreteDataType::struct_datatype(StructType::new(Arc::new(fields)))
78});
79
80/// Returns the exact Greptime type for a persisted native histogram field.
81pub fn native_histogram_field_type(name: &str) -> Option<ConcreteDataType> {
82    match name {
83        SCHEMA_FIELD | RESET_HINT_FIELD => Some(ConcreteDataType::int32_datatype()),
84        ZERO_THRESHOLD_FIELD | SUM_FIELD | COUNT_F64_FIELD | ZERO_COUNT_F64_FIELD => {
85            Some(ConcreteDataType::float64_datatype())
86        }
87        START_TIMESTAMP_FIELD => Some(ConcreteDataType::timestamp_millisecond_datatype()),
88        CUSTOM_VALUES_FIELD | POSITIVE_BUCKETS_F64_FIELD | NEGATIVE_BUCKETS_F64_FIELD => Some(
89            ConcreteDataType::list_datatype(Arc::new(ConcreteDataType::float64_datatype())),
90        ),
91        POSITIVE_SPAN_OFFSETS_FIELD | NEGATIVE_SPAN_OFFSETS_FIELD => Some(
92            ConcreteDataType::list_datatype(Arc::new(ConcreteDataType::int32_datatype())),
93        ),
94        POSITIVE_SPAN_LENGTHS_FIELD | NEGATIVE_SPAN_LENGTHS_FIELD => Some(
95            ConcreteDataType::list_datatype(Arc::new(ConcreteDataType::uint32_datatype())),
96        ),
97        COUNT_U64_FIELD | ZERO_COUNT_U64_FIELD => Some(ConcreteDataType::uint64_datatype()),
98        POSITIVE_BUCKETS_I64_FIELD | NEGATIVE_BUCKETS_I64_FIELD => Some(
99            ConcreteDataType::list_datatype(Arc::new(ConcreteDataType::int64_datatype())),
100        ),
101        _ => None,
102    }
103}
104
105pub fn native_histogram_value_type() -> &'static ConcreteDataType {
106    &NATIVE_HISTOGRAM_VALUE_TYPE
107}
108
109pub fn is_native_histogram_value_schema(name: &str, data_type: &ConcreteDataType) -> bool {
110    name == NATIVE_HISTOGRAM_FIELD && data_type == native_histogram_value_type()
111}