Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[clickhouse] Clickana monitoring dashboard tool #7207

Merged
merged 41 commits into from
Dec 19, 2024
Merged
Show file tree
Hide file tree
Changes from 39 commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
a986ca6
poc
karencfv Dec 3, 2024
0c2e4ee
notes
karencfv Dec 3, 2024
db1e6c6
clean up
karencfv Dec 4, 2024
51baaa4
simplify
karencfv Dec 4, 2024
707021d
move file to devtools
karencfv Dec 4, 2024
1e07b65
Create dashboard data struct
karencfv Dec 4, 2024
0e83157
use full UTC date/time as label
karencfv Dec 5, 2024
98b9b32
clean up
karencfv Dec 5, 2024
99b5f78
adjust upper and lower Y axis bounds and labels
karencfv Dec 5, 2024
13d4436
Some more clean up
karencfv Dec 5, 2024
e147c5a
retrieve settings from CLI
karencfv Dec 5, 2024
77fc165
Make room to add more charts
karencfv Dec 5, 2024
bcc51cc
Set up to generate charts from several metrics
karencfv Dec 5, 2024
a44c7b6
clean up
karencfv Dec 5, 2024
e552d71
Restructure and add support for other charts
karencfv Dec 5, 2024
06d9e61
Restructure and add support for other charts
karencfv Dec 5, 2024
af16dd9
strat breaking up functions
karencfv Dec 6, 2024
7957e0c
better label calculation
karencfv Dec 6, 2024
1d0d5fe
extract calculations into functions
karencfv Dec 9, 2024
8c1bd2a
No need to use u64
karencfv Dec 9, 2024
7ada5ae
Clean up value handling
karencfv Dec 9, 2024
1d4ec78
Clean up timestamp handling
karencfv Dec 9, 2024
317b95c
fmt
karencfv Dec 9, 2024
54b86f5
restructure methods as standalone functions
karencfv Dec 9, 2024
7896ed8
restructure bounds and labels
karencfv Dec 9, 2024
dee3179
separate chart into another file
karencfv Dec 10, 2024
17fc96d
Add other charts
karencfv Dec 10, 2024
ae5819c
Add dashboard title
karencfv Dec 10, 2024
7822a8a
show time range in title bar
karencfv Dec 10, 2024
ed8651f
fix mid value label for y axis
karencfv Dec 10, 2024
1d7521c
clean up
karencfv Dec 10, 2024
2c53dbf
make API calls concurrent
karencfv Dec 11, 2024
e41c0be
simplify run method
karencfv Dec 11, 2024
a0cc34f
clean up
karencfv Dec 11, 2024
a176a5f
include in clickhouse and clickhouse-server zones
karencfv Dec 11, 2024
7b6cd44
add some tests
karencfv Dec 12, 2024
a525cbe
clean up
karencfv Dec 12, 2024
c8d22cd
More tests
karencfv Dec 12, 2024
21b793c
fmt
karencfv Dec 12, 2024
9bb0de7
address comments
karencfv Dec 18, 2024
b1dfbe7
how the hell did this happen?
karencfv Dec 19, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ members = [
"cockroach-admin/types",
"common",
"dev-tools/cert-dev",
"dev-tools/clickana",
"dev-tools/clickhouse-cluster-dev",
"dev-tools/ch-dev",
"dev-tools/crdb-seed",
Expand Down Expand Up @@ -157,6 +158,7 @@ default-members = [
"cockroach-admin/types",
"common",
"dev-tools/cert-dev",
"dev-tools/clickana",
"dev-tools/clickhouse-cluster-dev",
"dev-tools/ch-dev",
"dev-tools/crdb-seed",
Expand Down Expand Up @@ -330,6 +332,7 @@ chrono = { version = "0.4", features = [ "serde" ] }
chrono-tz = "0.10.0"
ciborium = "0.2.2"
clap = { version = "4.5", features = ["cargo", "derive", "env", "wrap_help"] }
clickana = { path = "dev-tools/clickana" }
clickhouse-admin-api = { path = "clickhouse-admin/api" }
clickhouse-admin-keeper-client = { path = "clients/clickhouse-admin-keeper-client" }
clickhouse-admin-server-client = { path = "clients/clickhouse-admin-server-client" }
Expand Down
2 changes: 2 additions & 0 deletions clickhouse-admin/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@ slog.workspace = true
slog-async.workspace = true
slog-dtrace.workspace = true
slog-error-chain.workspace = true
slog-term.workspace = true
serde.workspace = true
serde_json.workspace = true
thiserror.workspace = true
tokio.workspace = true
tokio-postgres.workspace = true
Expand Down
22 changes: 8 additions & 14 deletions clickhouse-admin/types/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1200,7 +1200,7 @@ pub enum Timestamp {
#[derive(Debug, Serialize, Deserialize, JsonSchema, PartialEq)]
#[serde(rename_all = "snake_case")]
pub struct SystemTimeSeries {
pub time: Timestamp,
pub time: String,
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is seriously doing my head in. Since Timestamp is an untagged enum, serde is having a hard time deserializing. My custom deserializer didn't work, but I'll see if I can find a way

pub value: f64,
// TODO: Would be really nice to have an enum with possible units (s, ms, bytes)
// Not sure if I can even add this, the system tables don't mention units at all.
Expand Down Expand Up @@ -2099,15 +2099,15 @@ snapshot_storage_disk=LocalSnapshotDisk

let expected = vec![
SystemTimeSeries {
time: crate::Timestamp::Unix("1732494720".to_string()),
time: "1732494720".to_string(),
value: 110220450825.75238,
},
SystemTimeSeries {
time: crate::Timestamp::Unix("1732494840".to_string()),
time: "1732494840".to_string(),
value: 110339992917.33331,
},
SystemTimeSeries {
time: crate::Timestamp::Unix("1732494960".to_string()),
time: "1732494960".to_string(),
value: 110421854037.33331,
},
];
Expand All @@ -2127,21 +2127,15 @@ snapshot_storage_disk=LocalSnapshotDisk

let expected = vec![
SystemTimeSeries {
time: crate::Timestamp::Utc(
"2024-11-25T00:34:00Z".parse::<DateTime<Utc>>().unwrap(),
),
time: "2024-11-25T00:34:00Z".to_string(),
value: 110220450825.75238,
},
SystemTimeSeries {
time: crate::Timestamp::Utc(
"2024-11-25T00:35:00Z".parse::<DateTime<Utc>>().unwrap(),
),
time: "2024-11-25T00:35:00Z".to_string(),
value: 110339992917.33331,
},
SystemTimeSeries {
time: crate::Timestamp::Utc(
"2024-11-25T00:36:00Z".parse::<DateTime<Utc>>().unwrap(),
),
time: "2024-11-25T00:36:00Z".to_string(),
value: 110421854037.33331,
},
];
Expand Down Expand Up @@ -2176,7 +2170,7 @@ snapshot_storage_disk=LocalSnapshotDisk

assert_eq!(
format!("{}", root_cause),
"data did not match any variant of untagged enum Timestamp at line 1 column 12",
"invalid type: integer `2024`, expected a string at line 1 column 12",
);
}
}
31 changes: 31 additions & 0 deletions dev-tools/clickana/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
[package]
name = "clickana"
version = "0.1.0"
edition = "2021"
license = "MPL-2.0"

[dependencies]
anyhow.workspace = true
camino.workspace = true
chrono.workspace = true
clap.workspace = true
clickhouse-admin-types.workspace = true
clickhouse-admin-server-client.workspace = true
dropshot.workspace = true
futures.workspace = true
omicron-common.workspace = true
ratatui.workspace = true
schemars.workspace = true
slog.workspace = true
slog-async.workspace = true
slog-dtrace.workspace = true
slog-error-chain.workspace = true
slog-term.workspace = true
serde_json.workspace = true
tokio.workspace = true
tokio-postgres.workspace = true

omicron-workspace-hack.workspace = true

[lints]
workspace = true
57 changes: 57 additions & 0 deletions dev-tools/clickana/src/bin/clickana.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at https://mozilla.org/MPL/2.0/.

use anyhow::Result;
use camino::Utf8PathBuf;
use clap::Parser;
use clickana::Clickana;
use std::net::SocketAddr;

const CLICKANA_LOG_FILE: &str = "/tmp/clickana.log";

#[tokio::main]
async fn main() -> Result<()> {
let args = Cli::parse();

let terminal = ratatui::init();
let result = Clickana::new(
args.clickhouse_addr,
args.log_path,
args.sampling_interval,
args.time_range,
args.refresh_interval,
)
.run(terminal)
.await;
ratatui::restore();
result
}

#[derive(Debug, Parser)]
struct Cli {
/// Path to the log file
#[arg(
long,
short,
env = "CLICKANA_LOG_PATH",
default_value = CLICKANA_LOG_FILE,
)]
log_path: Utf8PathBuf,

/// Address where a clickhouse admin server is listening on
#[arg(long, short = 'a')]
clickhouse_addr: SocketAddr,

/// The interval to collect monitoring data in seconds
#[arg(long, short, default_value_t = 60)]
sampling_interval: u64,

/// Range of time to collect monitoring data in seconds
#[arg(long, short, default_value_t = 3600)]
time_range: u64,

/// The interval at which the dashboards will refresh
#[arg(long, short, default_value_t = 60)]
refresh_interval: u64,
}
Loading
Loading