diff --git a/.github/workflows/check-git-deps.yml b/.github/workflows/check-git-deps.yml new file mode 100644 index 0000000000..d90f3f0a18 --- /dev/null +++ b/.github/workflows/check-git-deps.yml @@ -0,0 +1,154 @@ +name: Check Git Dependencies on Main Branch + +on: + pull_request: + branches: [main] + paths: + - 'Cargo.toml' + push: + branches: [main] + paths: + - 'Cargo.toml' + +jobs: + check-git-deps: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v6 + + - name: Check git dependencies + env: + WHITELIST_DEPS: "greptime-proto,meter-core,meter-macros" + run: | + #!/bin/bash + set -e + + echo "Checking whitelisted git dependencies..." + + # Function to check if a commit is on main branch + check_commit_on_main() { + local repo_url="$1" + local commit="$2" + local repo_name=$(basename "$repo_url" .git) + + echo "Checking $repo_name" + echo "Repo: $repo_url" + echo "Commit: $commit" + + # Create a temporary directory for cloning + local temp_dir=$(mktemp -d) + + # Clone the repository + if git clone "$repo_url" "$temp_dir" 2>/dev/null; then + cd "$temp_dir" + + # Try to determine the main branch name + local main_branch="main" + if ! git rev-parse --verify origin/main >/dev/null 2>&1; then + if git rev-parse --verify origin/master >/dev/null 2>&1; then + main_branch="master" + else + # Try to get the default branch + main_branch=$(git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@') + fi + fi + + echo "Main branch: $main_branch" + + # Check if commit exists + if git cat-file -e "$commit" 2>/dev/null; then + # Check if commit is on main branch + if git merge-base --is-ancestor "$commit" "origin/$main_branch" 2>/dev/null; then + echo "PASS: Commit $commit is on $main_branch branch" + cd - >/dev/null + rm -rf "$temp_dir" + return 0 + else + echo "FAIL: Commit $commit is NOT on $main_branch branch" + + # Try to find which branch contains this commit + local branch_name=$(git branch -r --contains "$commit" 2>/dev/null | head -1 | sed 's/^[[:space:]]*origin\///' | sed 's/[[:space:]]*$//') + if [[ -n "$branch_name" ]]; then + echo "Found on branch: $branch_name" + fi + cd - >/dev/null + rm -rf "$temp_dir" + return 1 + fi + else + echo "FAIL: Commit $commit not found in repository" + cd - >/dev/null + rm -rf "$temp_dir" + return 1 + fi + else + echo "FAIL: Failed to clone $repo_url" + rm -rf "$temp_dir" + return 1 + fi + } + + # Extract whitelisted git dependencies from Cargo.toml + echo "Extracting git dependencies from Cargo.toml..." + + # Create temporary array to store dependencies + declare -a deps=() + + # Build awk pattern from whitelist + IFS=',' read -ra WHITELIST <<< "$WHITELIST_DEPS" + awk_pattern="" + for dep in "${WHITELIST[@]}"; do + if [[ -n "$awk_pattern" ]]; then + awk_pattern="$awk_pattern|" + fi + awk_pattern="$awk_pattern$dep" + done + + # Extract whitelisted dependencies + while IFS= read -r line; do + if [[ -n "$line" ]]; then + deps+=("$line") + fi + done < <(awk -v pattern="$awk_pattern" ' + $0 ~ pattern ".*git = \"https:/" { + match($0, /git = "([^"]+)"/, arr) + git_url = arr[1] + if (match($0, /rev = "([^"]+)"/, rev_arr)) { + rev = rev_arr[1] + print git_url " " rev + } else { + # Check next line for rev + getline + if (match($0, /rev = "([^"]+)"/, rev_arr)) { + rev = rev_arr[1] + print git_url " " rev + } + } + } + ' Cargo.toml) + + echo "Found ${#deps[@]} dependencies to check:" + for dep in "${deps[@]}"; do + echo " $dep" + done + + failed=0 + + for dep in "${deps[@]}"; do + read -r repo_url commit <<< "$dep" + if ! check_commit_on_main "$repo_url" "$commit"; then + failed=1 + fi + done + + echo "Check completed." + + if [[ $failed -eq 1 ]]; then + echo "ERROR: Some git dependencies are not on their main branches!" + echo "Please update the commits to point to main branch commits." + exit 1 + else + echo "SUCCESS: All git dependencies are on their main branches!" + fi diff --git a/Cargo.lock b/Cargo.lock index 4bdf44a044..830ff1a9b8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5461,7 +5461,7 @@ dependencies = [ [[package]] name = "greptime-proto" version = "0.1.0" -source = "git+https://github.com/GreptimeTeam/greptime-proto.git?rev=0423fa30203187c75e2937a668df1da699c8b96c#0423fa30203187c75e2937a668df1da699c8b96c" +source = "git+https://github.com/GreptimeTeam/greptime-proto.git?rev=173efe5ec62722089db7c531c0b0d470a072b915#173efe5ec62722089db7c531c0b0d470a072b915" dependencies = [ "prost 0.13.5", "prost-types 0.13.5", diff --git a/Cargo.toml b/Cargo.toml index e257ae5c75..e94f27e4dc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -150,7 +150,7 @@ etcd-client = { version = "0.16.1", features = [ fst = "0.4.7" futures = "0.3" futures-util = "0.3" -greptime-proto = { git = "https://github.com/GreptimeTeam/greptime-proto.git", rev = "0423fa30203187c75e2937a668df1da699c8b96c" } +greptime-proto = { git = "https://github.com/GreptimeTeam/greptime-proto.git", rev = "173efe5ec62722089db7c531c0b0d470a072b915" } hex = "0.4" http = "1" humantime = "2.1" diff --git a/src/common/telemetry/src/metric.rs b/src/common/telemetry/src/metric.rs index b9262290a8..317b7bc3fb 100644 --- a/src/common/telemetry/src/metric.rs +++ b/src/common/telemetry/src/metric.rs @@ -71,6 +71,7 @@ pub fn convert_metric_to_write_request( timestamp, }], exemplars: vec![], + histograms: vec![], }), MetricType::GAUGE => timeseries.push(TimeSeries { labels: convert_label(m.get_label(), mf_name, None), @@ -79,6 +80,7 @@ pub fn convert_metric_to_write_request( timestamp, }], exemplars: vec![], + histograms: vec![], }), MetricType::HISTOGRAM => { let h = m.get_histogram(); @@ -97,6 +99,7 @@ pub fn convert_metric_to_write_request( timestamp, }], exemplars: vec![], + histograms: vec![], }); if upper_bound.is_sign_positive() && upper_bound.is_infinite() { inf_seen = true; @@ -114,6 +117,7 @@ pub fn convert_metric_to_write_request( timestamp, }], exemplars: vec![], + histograms: vec![], }); } timeseries.push(TimeSeries { @@ -127,6 +131,7 @@ pub fn convert_metric_to_write_request( timestamp, }], exemplars: vec![], + histograms: vec![], }); timeseries.push(TimeSeries { labels: convert_label( @@ -139,6 +144,7 @@ pub fn convert_metric_to_write_request( timestamp, }], exemplars: vec![], + histograms: vec![], }); } MetricType::SUMMARY => { @@ -155,6 +161,7 @@ pub fn convert_metric_to_write_request( timestamp, }], exemplars: vec![], + histograms: vec![], }); } timeseries.push(TimeSeries { @@ -168,6 +175,7 @@ pub fn convert_metric_to_write_request( timestamp, }], exemplars: vec![], + histograms: vec![], }); timeseries.push(TimeSeries { labels: convert_label( @@ -180,6 +188,7 @@ pub fn convert_metric_to_write_request( timestamp, }], exemplars: vec![], + histograms: vec![], }); } MetricType::UNTYPED => { @@ -274,7 +283,7 @@ mod test { assert_eq!( format!("{:?}", write_quest.timeseries), - r#"[TimeSeries { labels: [Label { name: "__name__", value: "test_counter" }, Label { name: "a", value: "1" }, Label { name: "b", value: "2" }], samples: [Sample { value: 1.0, timestamp: 0 }], exemplars: [] }]"# + r#"[TimeSeries { labels: [Label { name: "__name__", value: "test_counter" }, Label { name: "a", value: "1" }, Label { name: "b", value: "2" }], samples: [Sample { value: 1.0, timestamp: 0 }], exemplars: [], histograms: [] }]"# ); let gauge_opts = Opts::new("test_gauge", "test help") @@ -288,7 +297,7 @@ mod test { let write_quest = convert_metric_to_write_request(mf, None, 0); assert_eq!( format!("{:?}", write_quest.timeseries), - r#"[TimeSeries { labels: [Label { name: "__name__", value: "test_gauge" }, Label { name: "a", value: "1" }, Label { name: "b", value: "2" }], samples: [Sample { value: 42.0, timestamp: 0 }], exemplars: [] }]"# + r#"[TimeSeries { labels: [Label { name: "__name__", value: "test_gauge" }, Label { name: "a", value: "1" }, Label { name: "b", value: "2" }], samples: [Sample { value: 42.0, timestamp: 0 }], exemplars: [], histograms: [] }]"# ); } @@ -305,20 +314,20 @@ mod test { .iter() .map(|x| format!("{:?}", x)) .collect(); - let ans = r#"TimeSeries { labels: [Label { name: "__name__", value: "test_histogram_bucket" }, Label { name: "a", value: "1" }, Label { name: "le", value: "0.005" }], samples: [Sample { value: 0.0, timestamp: 0 }], exemplars: [] } -TimeSeries { labels: [Label { name: "__name__", value: "test_histogram_bucket" }, Label { name: "a", value: "1" }, Label { name: "le", value: "0.01" }], samples: [Sample { value: 0.0, timestamp: 0 }], exemplars: [] } -TimeSeries { labels: [Label { name: "__name__", value: "test_histogram_bucket" }, Label { name: "a", value: "1" }, Label { name: "le", value: "0.025" }], samples: [Sample { value: 0.0, timestamp: 0 }], exemplars: [] } -TimeSeries { labels: [Label { name: "__name__", value: "test_histogram_bucket" }, Label { name: "a", value: "1" }, Label { name: "le", value: "0.05" }], samples: [Sample { value: 0.0, timestamp: 0 }], exemplars: [] } -TimeSeries { labels: [Label { name: "__name__", value: "test_histogram_bucket" }, Label { name: "a", value: "1" }, Label { name: "le", value: "0.1" }], samples: [Sample { value: 0.0, timestamp: 0 }], exemplars: [] } -TimeSeries { labels: [Label { name: "__name__", value: "test_histogram_bucket" }, Label { name: "a", value: "1" }, Label { name: "le", value: "0.25" }], samples: [Sample { value: 1.0, timestamp: 0 }], exemplars: [] } -TimeSeries { labels: [Label { name: "__name__", value: "test_histogram_bucket" }, Label { name: "a", value: "1" }, Label { name: "le", value: "0.5" }], samples: [Sample { value: 1.0, timestamp: 0 }], exemplars: [] } -TimeSeries { labels: [Label { name: "__name__", value: "test_histogram_bucket" }, Label { name: "a", value: "1" }, Label { name: "le", value: "1" }], samples: [Sample { value: 1.0, timestamp: 0 }], exemplars: [] } -TimeSeries { labels: [Label { name: "__name__", value: "test_histogram_bucket" }, Label { name: "a", value: "1" }, Label { name: "le", value: "2.5" }], samples: [Sample { value: 1.0, timestamp: 0 }], exemplars: [] } -TimeSeries { labels: [Label { name: "__name__", value: "test_histogram_bucket" }, Label { name: "a", value: "1" }, Label { name: "le", value: "5" }], samples: [Sample { value: 1.0, timestamp: 0 }], exemplars: [] } -TimeSeries { labels: [Label { name: "__name__", value: "test_histogram_bucket" }, Label { name: "a", value: "1" }, Label { name: "le", value: "10" }], samples: [Sample { value: 1.0, timestamp: 0 }], exemplars: [] } -TimeSeries { labels: [Label { name: "__name__", value: "test_histogram_bucket" }, Label { name: "a", value: "1" }, Label { name: "le", value: "+Inf" }], samples: [Sample { value: 1.0, timestamp: 0 }], exemplars: [] } -TimeSeries { labels: [Label { name: "__name__", value: "test_histogram_sum" }, Label { name: "a", value: "1" }], samples: [Sample { value: 0.25, timestamp: 0 }], exemplars: [] } -TimeSeries { labels: [Label { name: "__name__", value: "test_histogram_count" }, Label { name: "a", value: "1" }], samples: [Sample { value: 1.0, timestamp: 0 }], exemplars: [] }"#; + let ans = r#"TimeSeries { labels: [Label { name: "__name__", value: "test_histogram_bucket" }, Label { name: "a", value: "1" }, Label { name: "le", value: "0.005" }], samples: [Sample { value: 0.0, timestamp: 0 }], exemplars: [], histograms: [] } +TimeSeries { labels: [Label { name: "__name__", value: "test_histogram_bucket" }, Label { name: "a", value: "1" }, Label { name: "le", value: "0.01" }], samples: [Sample { value: 0.0, timestamp: 0 }], exemplars: [], histograms: [] } +TimeSeries { labels: [Label { name: "__name__", value: "test_histogram_bucket" }, Label { name: "a", value: "1" }, Label { name: "le", value: "0.025" }], samples: [Sample { value: 0.0, timestamp: 0 }], exemplars: [], histograms: [] } +TimeSeries { labels: [Label { name: "__name__", value: "test_histogram_bucket" }, Label { name: "a", value: "1" }, Label { name: "le", value: "0.05" }], samples: [Sample { value: 0.0, timestamp: 0 }], exemplars: [], histograms: [] } +TimeSeries { labels: [Label { name: "__name__", value: "test_histogram_bucket" }, Label { name: "a", value: "1" }, Label { name: "le", value: "0.1" }], samples: [Sample { value: 0.0, timestamp: 0 }], exemplars: [], histograms: [] } +TimeSeries { labels: [Label { name: "__name__", value: "test_histogram_bucket" }, Label { name: "a", value: "1" }, Label { name: "le", value: "0.25" }], samples: [Sample { value: 1.0, timestamp: 0 }], exemplars: [], histograms: [] } +TimeSeries { labels: [Label { name: "__name__", value: "test_histogram_bucket" }, Label { name: "a", value: "1" }, Label { name: "le", value: "0.5" }], samples: [Sample { value: 1.0, timestamp: 0 }], exemplars: [], histograms: [] } +TimeSeries { labels: [Label { name: "__name__", value: "test_histogram_bucket" }, Label { name: "a", value: "1" }, Label { name: "le", value: "1" }], samples: [Sample { value: 1.0, timestamp: 0 }], exemplars: [], histograms: [] } +TimeSeries { labels: [Label { name: "__name__", value: "test_histogram_bucket" }, Label { name: "a", value: "1" }, Label { name: "le", value: "2.5" }], samples: [Sample { value: 1.0, timestamp: 0 }], exemplars: [], histograms: [] } +TimeSeries { labels: [Label { name: "__name__", value: "test_histogram_bucket" }, Label { name: "a", value: "1" }, Label { name: "le", value: "5" }], samples: [Sample { value: 1.0, timestamp: 0 }], exemplars: [], histograms: [] } +TimeSeries { labels: [Label { name: "__name__", value: "test_histogram_bucket" }, Label { name: "a", value: "1" }, Label { name: "le", value: "10" }], samples: [Sample { value: 1.0, timestamp: 0 }], exemplars: [], histograms: [] } +TimeSeries { labels: [Label { name: "__name__", value: "test_histogram_bucket" }, Label { name: "a", value: "1" }, Label { name: "le", value: "+Inf" }], samples: [Sample { value: 1.0, timestamp: 0 }], exemplars: [], histograms: [] } +TimeSeries { labels: [Label { name: "__name__", value: "test_histogram_sum" }, Label { name: "a", value: "1" }], samples: [Sample { value: 0.25, timestamp: 0 }], exemplars: [], histograms: [] } +TimeSeries { labels: [Label { name: "__name__", value: "test_histogram_count" }, Label { name: "a", value: "1" }], samples: [Sample { value: 1.0, timestamp: 0 }], exemplars: [], histograms: [] }"#; assert_eq!(write_quest_str.join("\n"), ans); } @@ -355,10 +364,10 @@ TimeSeries { labels: [Label { name: "__name__", value: "test_histogram_count" }, .iter() .map(|x| format!("{:?}", x)) .collect(); - let ans = r#"TimeSeries { labels: [Label { name: "__name__", value: "test_summary" }, Label { name: "quantile", value: "50" }], samples: [Sample { value: 3.0, timestamp: 20 }], exemplars: [] } -TimeSeries { labels: [Label { name: "__name__", value: "test_summary" }, Label { name: "quantile", value: "100" }], samples: [Sample { value: 5.0, timestamp: 20 }], exemplars: [] } -TimeSeries { labels: [Label { name: "__name__", value: "test_summary_sum" }], samples: [Sample { value: 15.0, timestamp: 20 }], exemplars: [] } -TimeSeries { labels: [Label { name: "__name__", value: "test_summary_count" }], samples: [Sample { value: 5.0, timestamp: 20 }], exemplars: [] }"#; + let ans = r#"TimeSeries { labels: [Label { name: "__name__", value: "test_summary" }, Label { name: "quantile", value: "50" }], samples: [Sample { value: 3.0, timestamp: 20 }], exemplars: [], histograms: [] } +TimeSeries { labels: [Label { name: "__name__", value: "test_summary" }, Label { name: "quantile", value: "100" }], samples: [Sample { value: 5.0, timestamp: 20 }], exemplars: [], histograms: [] } +TimeSeries { labels: [Label { name: "__name__", value: "test_summary_sum" }], samples: [Sample { value: 15.0, timestamp: 20 }], exemplars: [], histograms: [] } +TimeSeries { labels: [Label { name: "__name__", value: "test_summary_count" }], samples: [Sample { value: 5.0, timestamp: 20 }], exemplars: [], histograms: [] }"#; assert_eq!(write_quest_str.join("\n"), ans); } @@ -385,11 +394,11 @@ TimeSeries { labels: [Label { name: "__name__", value: "test_summary_count" }], let write_quest2 = convert_metric_to_write_request(mf, Some(&filter), 0); assert_eq!( format!("{:?}", write_quest1.timeseries), - r#"[TimeSeries { labels: [Label { name: "__name__", value: "filter_counter" }, Label { name: "a", value: "1" }, Label { name: "b", value: "2" }], samples: [Sample { value: 1.0, timestamp: 0 }], exemplars: [] }, TimeSeries { labels: [Label { name: "__name__", value: "test_counter" }, Label { name: "a", value: "1" }, Label { name: "b", value: "2" }], samples: [Sample { value: 2.0, timestamp: 0 }], exemplars: [] }]"# + r#"[TimeSeries { labels: [Label { name: "__name__", value: "filter_counter" }, Label { name: "a", value: "1" }, Label { name: "b", value: "2" }], samples: [Sample { value: 1.0, timestamp: 0 }], exemplars: [], histograms: [] }, TimeSeries { labels: [Label { name: "__name__", value: "test_counter" }, Label { name: "a", value: "1" }, Label { name: "b", value: "2" }], samples: [Sample { value: 2.0, timestamp: 0 }], exemplars: [], histograms: [] }]"# ); assert_eq!( format!("{:?}", write_quest2.timeseries), - r#"[TimeSeries { labels: [Label { name: "__name__", value: "test_counter" }, Label { name: "a", value: "1" }, Label { name: "b", value: "2" }], samples: [Sample { value: 2.0, timestamp: 0 }], exemplars: [] }]"# + r#"[TimeSeries { labels: [Label { name: "__name__", value: "test_counter" }, Label { name: "a", value: "1" }, Label { name: "b", value: "2" }], samples: [Sample { value: 2.0, timestamp: 0 }], exemplars: [], histograms: [] }]"# ); } } diff --git a/src/servers/src/prom_store.rs b/src/servers/src/prom_store.rs index 92c1815145..9ed2d00268 100644 --- a/src/servers/src/prom_store.rs +++ b/src/servers/src/prom_store.rs @@ -26,7 +26,7 @@ use arrow::datatypes::{Float64Type, TimestampMillisecondType}; use common_grpc::precision::Precision; use common_query::prelude::{greptime_timestamp, greptime_value}; use common_recordbatch::{RecordBatch, RecordBatches}; -use common_telemetry::tracing; +use common_telemetry::{tracing, warn}; use datafusion::dataframe::DataFrame; use datafusion::prelude::{Expr, col, lit, regexp_match}; use datafusion_common::ScalarValue; @@ -415,6 +415,10 @@ pub fn to_grpc_row_insert_requests(request: &WriteRequest) -> Result<(RowInsertR table_data.add_row(one_row); } } + + if !series.histograms.is_empty() { + warn!("Native histograms are not supported yet, data ignored"); + } } Ok(multi_table_data.into_row_insert_requests())