From 5d642c1cacb1b78fa215c679617d609ebc4bb2bf Mon Sep 17 00:00:00 2001 From: akvlad Date: Thu, 24 Oct 2024 14:24:37 +0300 Subject: [PATCH] fix local fingerprints check; pprof bin debug --- .gitignore | 1 + parser/registry/common.js | 2 +- pyroscope/pprof-bin/pkg/pprof_bin_bg.wasm | Bin 217700 -> 219754 bytes pyroscope/pprof-bin/src/lib.rs | 57 ++++++++++++++++------ 4 files changed, 44 insertions(+), 16 deletions(-) diff --git a/.gitignore b/.gitignore index e23f35f9..5732e78e 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ node_modules /wasm_parts/wasm_parts.iml /test/qryn_test_env/clickhouse/_data/ /test/qryn_test_env/grafana/_data/ +/test/qryn_test_cluster_env/grafana/_data/ diff --git a/parser/registry/common.js b/parser/registry/common.js index 0f0273ca..80fd2384 100644 --- a/parser/registry/common.js +++ b/parser/registry/common.js @@ -445,7 +445,7 @@ module.exports.preJoinLabels = (token, query, dist) => { dist = dist || '' const timeSeriesReq = new Sql.Select() .select('fingerprint', 'labels') - .from([`${DATABASE_NAME()}.time_series${dist}`, 'time_series']) + .from([`${DATABASE_NAME()}.time_series`, 'time_series']) .where(new Sql.And( new Sql.In('time_series.fingerprint', 'in', inRightSide), Sql.Gte(new Sql.Raw('date'), sqlFrom), diff --git a/pyroscope/pprof-bin/pkg/pprof_bin_bg.wasm b/pyroscope/pprof-bin/pkg/pprof_bin_bg.wasm index 74d12654fb7cdab32a76c7c4466648b9e468531b..0ee3ff457f1d14a520d12723eae6ae6240694754 100644 GIT binary patch delta 39366 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 E0Q9OsCjbBd delta 36775 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 FlameGraphDiff { res.right_ticks = t2.total()[0]; res.total = res.left_ticks + res.right_ticks; - let mut left_nodes = vec![Arc::new(TreeNodeV2 { + let mut left_nodes: VecDeque> = VecDeque::new(); + left_nodes.push_back(Arc::new(TreeNodeV2 { fn_id: 0, node_id: 0, slf: vec![0], total: vec![res.left_ticks], - })]; + })); - let mut right_nodes = vec![Arc::new(TreeNodeV2 { + let mut right_nodes: VecDeque> = VecDeque::new(); + right_nodes.push_back(Arc::new(TreeNodeV2 { fn_id: 0, node_id: 0, slf: vec![0], total: vec![res.right_ticks], - })]; + })); let mut levels = vec![0]; - let mut x_left_offsets = vec![0]; - let mut x_right_offsets = vec![0]; + let mut x_left_offsets: VecDeque = VecDeque::new(); + x_left_offsets.push_back(0); + let mut x_right_offsets = VecDeque::new(); + x_right_offsets.push_back(0); let mut name_location_cache: HashMap = HashMap::new(); - while let (Some(left), Some(right)) = (left_nodes.pop(), right_nodes.pop()) { - let x_left_offset = x_left_offsets.pop().unwrap(); - let x_right_offset = x_right_offsets.pop().unwrap(); + while let (Some(left), Some(right)) = + (left_nodes.pop_back(), right_nodes.pop_back()) { + let mut x_left_offset = x_left_offsets.pop_back().unwrap().clone(); + let mut x_right_offset = x_right_offsets.pop_back().unwrap().clone(); let level = levels.pop().unwrap(); let name = if left.fn_id == 0 { @@ -694,6 +699,13 @@ fn compute_flame_graph_diff(t1: &Tree, t2: &Tree) -> FlameGraphDiff { res.levels.push(Level::default()); } + if res.max_self < left.slf[0] { + res.max_self = left.slf[0]; + } + if res.max_self < right.slf[0] { + res.max_self = right.slf[0]; + } + res.levels[level].values.extend_from_slice(&[ x_left_offset, left.total[0], @@ -708,15 +720,30 @@ fn compute_flame_graph_diff(t1: &Tree, t2: &Tree) -> FlameGraphDiff { let empty_vec = Vec::new(); let children_right = t2.nodes.get(&right.node_id).unwrap_or(&empty_vec); for (child_left, child_right) in children_left.iter().zip(children_right.iter()) { - left_nodes.push(child_left.clone()); - right_nodes.push(child_right.clone()); - x_left_offsets.push(x_left_offset + child_left.total[0]); - x_right_offsets.push(x_right_offset + child_right.total[0]); - levels.push(level + 1); + left_nodes.push_front(child_left.clone()); + right_nodes.push_front(child_right.clone()); + x_left_offsets.push_front(x_left_offset.clone()); + x_right_offsets.push_front(x_right_offset.clone()); + x_left_offset += child_left.total[0].clone(); + x_right_offset += child_right.total[0].clone(); + levels.insert(0,level + 1); } } } + for i in 0..res.levels.len() { + let mut j = 0; + let mut prev0 = 0i64; + let mut prev3 = 0i64; + while j < res.levels[i].values.len() { + res.levels[i].values[j] -= prev0; + prev0 += res.levels[i].values[j] + res.levels[i].values[j+1]; + res.levels[i].values[j+3] -= prev3; + prev3 += res.levels[i].values[j+3] + res.levels[i].values[j+4]; + j += 7; + } + } + res }