From 400b5170b2644c7294045920913752e0e5d9a9b8 Mon Sep 17 00:00:00 2001 From: Andre da Silva <2917611+ndr-ds@users.noreply.github.com> Date: Tue, 26 May 2026 16:04:20 -0300 Subject: [PATCH] linera-service: remove linera net up --kubernetes (#6325) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `linera net up --kubernetes` launched a local KinD cluster via Helmfile to test infra config changes. Since infra now lives in ArgoCD with automated sync on merge, any change to linera-infra deploys immediately to the real clusters — testing via a local KinD cluster no longer serves a purpose. Remove the `kubernetes` feature and all code exclusively used by that path: - Delete `linera-service/src/cli_wrappers/{local_kubernetes_net,docker,helmfile,kind,kubectl,util}.rs` - Remove the `kubernetes: true` CLI match arm and related `NetCommand::Up` fields from `command.rs` - Remove `handle_net_up_kubernetes` from `net_up_utils.rs` - Remove the `kubernetes` feature and its optional deps (`k8s-openapi`, `kube`, `pathdiff`, `fs_extra`) from `linera-service/Cargo.toml` and workspace `Cargo.toml` - Delete `.github/workflows/remote-kubernetes-net-test.yml` - Remove `changed-files-kubernetes` job and `cargo clippy --features kubernetes` from `.github/workflows/rust.yml` - Delete `kubernetes/linera-validator/` (the Helm chart + Helmfile config that backed this feature) Net: ~-77k lines. `cargo check -p linera-service` and `cargo clippy -p linera-service` both exit 0. CI. - Nothing to do / These changes follow the usual release cycle. --- .github/workflows/rust.yml | 2 - Cargo.lock | 223 +- Cargo.toml | 4 - kubernetes/linera-validator/.helmignore | 23 - kubernetes/linera-validator/Chart.yaml | 49 - kubernetes/linera-validator/README.md | 31 - .../linera-validator/alloy-config.river.tpl | 228 - .../linera-validator/charts/alloy-1.3.1.tgz | Bin 26675 -> 0 bytes .../charts/kube-prometheus-stack-51.0.3.tgz | Bin 492130 -> 0 bytes .../charts/loki-stack-2.8.9.tgz | Bin 129849 -> 0 bytes .../charts/pyroscope-1.14.2.tgz | Bin 95725 -> 0 bytes .../linera-validator/crds/prometheusrule.yaml | 266 - .../linera-validator/crds/servicemonitor.yaml | 1426 -- .../linera-validator/exporter-config.toml.tpl | 31 - .../grafana-dashboards/linera/execution.json | 6441 ------- .../grafana-dashboards/linera/general.json | 4177 ----- .../grafana-dashboards/linera/logs.json | 765 - .../linera/storage/rocksdb.json | 2395 --- .../linera/storage/scylladb.json | 2924 ---- .../linera/storage/storage.json | 3749 ---- .../grafana-dashboards/linera/traces.json | 838 - .../grafana-dashboards/linera/views.json | 1328 -- .../linera/vms/ethereum.json | 439 - .../grafana-dashboards/profiling/cpu.json | 431 - .../profiling/jemalloc-memory.json | 145 - .../scylla-manager/scylla-manager.3.4.json | 1727 -- .../scylla/scylla-advanced.6.2.json | 6129 ------- .../scylla/scylla-alternator.6.2.json | 7157 -------- .../scylla/scylla-cql.6.2.json | 6570 ------- .../scylla/scylla-detailed.6.2.json | 14520 ---------------- .../scylla/scylla-ks.6.2.json | 2755 --- .../scylla/scylla-os.6.2.json | 2215 --- .../scylla/scylla-overview.6.2.json | 4418 ----- kubernetes/linera-validator/helmfile.yaml | 217 - .../scylla-manager.values.yaml | 31 - .../scylla-operator.values.yaml | 3 - .../gke-daemonset-raid-disks.yaml | 68 - .../local-csi-driver/00_namespace.yaml | 4 - .../local-csi-driver/10_csidriver.yaml | 7 - .../10_driver_serviceaccount.yaml | 5 - .../10_provisioner_clusterrole.yaml | 100 - .../20_provisioner_clusterrolebinding.yaml | 12 - .../local-csi-driver/50_daemonset.yaml | 125 - .../scylla-setup/local-ssd-sc.yaml | 8 - .../scylla-setup/nodeconfig.yaml | 29 - .../scylla.values.yaml.gotmpl | 19 - .../linera-validator/templates/NOTES.txt | 0 .../templates/block-exporter.yaml | 235 - .../linera-validator/templates/config.yaml | 7 - .../linera-validator/templates/explorer.yaml | 110 - .../templates/grafana-cloud-auth-secret.yaml | 10 - .../grafana-linera-dashboards-config.yaml | 17 - .../grafana-linera-vms-dashboards-config.yaml | 10 - .../grafana-pyroscope-dashboard-config.yaml | 11 - .../grafana-scylla-dashboards-config-0.yaml | 13 - .../grafana-scylla-dashboards-config-1.yaml | 14 - ...fana-scylla-manager-dashboards-config.yaml | 10 - .../linera-validator/templates/indexer.yaml | 75 - .../linera-validator/templates/ingress.yaml | 39 - .../templates/linera-recording-rules.yaml | 160 - .../templates/prometheus.yaml | 51 - .../linera-validator/templates/proxy.yaml | 141 - .../templates/scylla-agent-gcs-config.yaml | 14 - .../templates/scylla-config.yaml | 14 - .../templates/scylla-recording-rules.yaml | 525 - .../linera-validator/templates/shards.yaml | 159 - .../linera-validator/values-local.yaml.gotmpl | 208 - .../values-observability-alloy.yaml.gotmpl | 418 - kubernetes/linera-validator/values.yaml | 705 - .../linera-validator/working/.placeholder | 0 linera-service/Cargo.toml | 5 - linera-service/src/cli/command.rs | 45 - linera-service/src/cli/main.rs | 50 - linera-service/src/cli/net_up_utils.rs | 87 - linera-service/src/cli_wrappers/docker.rs | 155 - linera-service/src/cli_wrappers/helmfile.rs | 72 - linera-service/src/cli_wrappers/kind.rs | 52 - linera-service/src/cli_wrappers/kubectl.rs | 30 - .../src/cli_wrappers/local_kubernetes_net.rs | 612 - linera-service/src/cli_wrappers/mod.rs | 19 - linera-service/src/cli_wrappers/util.rs | 22 - linera-service/tests/linera_net_tests.rs | 49 +- 82 files changed, 14 insertions(+), 76164 deletions(-) delete mode 100644 kubernetes/linera-validator/.helmignore delete mode 100644 kubernetes/linera-validator/Chart.yaml delete mode 100644 kubernetes/linera-validator/README.md delete mode 100644 kubernetes/linera-validator/alloy-config.river.tpl delete mode 100644 kubernetes/linera-validator/charts/alloy-1.3.1.tgz delete mode 100644 kubernetes/linera-validator/charts/kube-prometheus-stack-51.0.3.tgz delete mode 100644 kubernetes/linera-validator/charts/loki-stack-2.8.9.tgz delete mode 100644 kubernetes/linera-validator/charts/pyroscope-1.14.2.tgz delete mode 100644 kubernetes/linera-validator/crds/prometheusrule.yaml delete mode 100644 kubernetes/linera-validator/crds/servicemonitor.yaml delete mode 100644 kubernetes/linera-validator/exporter-config.toml.tpl delete mode 100644 kubernetes/linera-validator/grafana-dashboards/linera/execution.json delete mode 100644 kubernetes/linera-validator/grafana-dashboards/linera/general.json delete mode 100644 kubernetes/linera-validator/grafana-dashboards/linera/logs.json delete mode 100644 kubernetes/linera-validator/grafana-dashboards/linera/storage/rocksdb.json delete mode 100644 kubernetes/linera-validator/grafana-dashboards/linera/storage/scylladb.json delete mode 100644 kubernetes/linera-validator/grafana-dashboards/linera/storage/storage.json delete mode 100644 kubernetes/linera-validator/grafana-dashboards/linera/traces.json delete mode 100644 kubernetes/linera-validator/grafana-dashboards/linera/views.json delete mode 100644 kubernetes/linera-validator/grafana-dashboards/linera/vms/ethereum.json delete mode 100644 kubernetes/linera-validator/grafana-dashboards/profiling/cpu.json delete mode 100644 kubernetes/linera-validator/grafana-dashboards/profiling/jemalloc-memory.json delete mode 100644 kubernetes/linera-validator/grafana-dashboards/scylla-manager/scylla-manager.3.4.json delete mode 100644 kubernetes/linera-validator/grafana-dashboards/scylla/scylla-advanced.6.2.json delete mode 100644 kubernetes/linera-validator/grafana-dashboards/scylla/scylla-alternator.6.2.json delete mode 100644 kubernetes/linera-validator/grafana-dashboards/scylla/scylla-cql.6.2.json delete mode 100644 kubernetes/linera-validator/grafana-dashboards/scylla/scylla-detailed.6.2.json delete mode 100644 kubernetes/linera-validator/grafana-dashboards/scylla/scylla-ks.6.2.json delete mode 100644 kubernetes/linera-validator/grafana-dashboards/scylla/scylla-os.6.2.json delete mode 100644 kubernetes/linera-validator/grafana-dashboards/scylla/scylla-overview.6.2.json delete mode 100644 kubernetes/linera-validator/helmfile.yaml delete mode 100644 kubernetes/linera-validator/scylla-manager.values.yaml delete mode 100644 kubernetes/linera-validator/scylla-operator.values.yaml delete mode 100644 kubernetes/linera-validator/scylla-setup/gke-daemonset-raid-disks.yaml delete mode 100644 kubernetes/linera-validator/scylla-setup/local-csi-driver/00_namespace.yaml delete mode 100644 kubernetes/linera-validator/scylla-setup/local-csi-driver/10_csidriver.yaml delete mode 100644 kubernetes/linera-validator/scylla-setup/local-csi-driver/10_driver_serviceaccount.yaml delete mode 100644 kubernetes/linera-validator/scylla-setup/local-csi-driver/10_provisioner_clusterrole.yaml delete mode 100644 kubernetes/linera-validator/scylla-setup/local-csi-driver/20_provisioner_clusterrolebinding.yaml delete mode 100644 kubernetes/linera-validator/scylla-setup/local-csi-driver/50_daemonset.yaml delete mode 100644 kubernetes/linera-validator/scylla-setup/local-ssd-sc.yaml delete mode 100644 kubernetes/linera-validator/scylla-setup/nodeconfig.yaml delete mode 100644 kubernetes/linera-validator/scylla.values.yaml.gotmpl delete mode 100644 kubernetes/linera-validator/templates/NOTES.txt delete mode 100644 kubernetes/linera-validator/templates/block-exporter.yaml delete mode 100644 kubernetes/linera-validator/templates/config.yaml delete mode 100644 kubernetes/linera-validator/templates/explorer.yaml delete mode 100644 kubernetes/linera-validator/templates/grafana-cloud-auth-secret.yaml delete mode 100644 kubernetes/linera-validator/templates/grafana-linera-dashboards-config.yaml delete mode 100644 kubernetes/linera-validator/templates/grafana-linera-vms-dashboards-config.yaml delete mode 100644 kubernetes/linera-validator/templates/grafana-pyroscope-dashboard-config.yaml delete mode 100644 kubernetes/linera-validator/templates/grafana-scylla-dashboards-config-0.yaml delete mode 100644 kubernetes/linera-validator/templates/grafana-scylla-dashboards-config-1.yaml delete mode 100644 kubernetes/linera-validator/templates/grafana-scylla-manager-dashboards-config.yaml delete mode 100644 kubernetes/linera-validator/templates/indexer.yaml delete mode 100644 kubernetes/linera-validator/templates/ingress.yaml delete mode 100644 kubernetes/linera-validator/templates/linera-recording-rules.yaml delete mode 100644 kubernetes/linera-validator/templates/prometheus.yaml delete mode 100644 kubernetes/linera-validator/templates/proxy.yaml delete mode 100644 kubernetes/linera-validator/templates/scylla-agent-gcs-config.yaml delete mode 100644 kubernetes/linera-validator/templates/scylla-config.yaml delete mode 100644 kubernetes/linera-validator/templates/scylla-recording-rules.yaml delete mode 100644 kubernetes/linera-validator/templates/shards.yaml delete mode 100644 kubernetes/linera-validator/values-local.yaml.gotmpl delete mode 100644 kubernetes/linera-validator/values-observability-alloy.yaml.gotmpl delete mode 100644 kubernetes/linera-validator/values.yaml delete mode 100644 kubernetes/linera-validator/working/.placeholder delete mode 100644 linera-service/src/cli_wrappers/docker.rs delete mode 100644 linera-service/src/cli_wrappers/helmfile.rs delete mode 100644 linera-service/src/cli_wrappers/kind.rs delete mode 100644 linera-service/src/cli_wrappers/kubectl.rs delete mode 100644 linera-service/src/cli_wrappers/local_kubernetes_net.rs delete mode 100644 linera-service/src/cli_wrappers/util.rs diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index dd17340e4425..d5c3767aa993 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -54,7 +54,6 @@ jobs: - '!docker/**' - '!docker_scylla/**' - '!configuration/**' - - '!kubernetes/**' - '!CONTRIBUTING.md' - '!INSTALL.md' - '!docs/**' @@ -545,7 +544,6 @@ jobs: - name: Run clippy run: | cargo clippy --locked --all-targets --all-features --workspace --exclude linera-web - cargo clippy --locked --no-default-features --features kubernetes cargo clippy --locked --no-default-features cargo clippy --locked --target wasm32-unknown-unknown --no-default-features --features web-default \ -p linera-client \ diff --git a/Cargo.lock b/Cargo.lock index 4474fa0aa269..f0f4205c30a1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4154,12 +4154,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "http-range-header" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f" - [[package]] name = "httparse" version = "1.10.1" @@ -4247,9 +4241,7 @@ dependencies = [ "futures-util", "http 0.2.12", "hyper 0.14.32", - "log", "rustls 0.21.12", - "rustls-native-certs 0.6.3", "tokio", "tokio-rustls 0.24.1", ] @@ -4265,7 +4257,7 @@ dependencies = [ "hyper-util", "log", "rustls 0.23.31", - "rustls-native-certs 0.8.1", + "rustls-native-certs", "rustls-pki-types", "tokio", "tokio-rustls 0.26.2", @@ -4273,18 +4265,6 @@ dependencies = [ "webpki-roots 1.0.2", ] -[[package]] -name = "hyper-timeout" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" -dependencies = [ - "hyper 0.14.32", - "pin-project-lite", - "tokio", - "tokio-io-timeout", -] - [[package]] name = "hyper-timeout" version = "0.5.2" @@ -4719,19 +4699,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "jsonpath-rust" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96acbc6188d3bd83519d053efec756aa4419de62ec47be7f28dec297f7dc9eb0" -dependencies = [ - "pest", - "pest_derive", - "regex", - "serde_json", - "thiserror 1.0.69", -] - [[package]] name = "jsonwebtoken" version = "9.3.1" @@ -4761,19 +4728,6 @@ dependencies = [ "sha2 0.10.9", ] -[[package]] -name = "k8s-openapi" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "550f99d93aa4c2b25de527bce492d772caf5e21d7ac9bd4b508ba781c8d91e30" -dependencies = [ - "base64 0.21.7", - "chrono", - "serde", - "serde-value", - "serde_json", -] - [[package]] name = "keccak" version = "0.1.6" @@ -4793,69 +4747,6 @@ dependencies = [ "sha3-asm", ] -[[package]] -name = "kube" -version = "0.88.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "462fe330a0617b276ec864c2255810adcdf519ecb6844253c54074b2086a97bc" -dependencies = [ - "k8s-openapi", - "kube-client", - "kube-core", -] - -[[package]] -name = "kube-client" -version = "0.88.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe0d65dd6f3adba29cfb84f19dfe55449c7f6c35425f9d8294bec40313e0b64" -dependencies = [ - "base64 0.21.7", - "bytes", - "chrono", - "either", - "futures", - "home", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.32", - "hyper-rustls 0.24.2", - "hyper-timeout 0.4.1", - "jsonpath-rust", - "k8s-openapi", - "kube-core", - "pem", - "pin-project", - "rustls 0.21.12", - "rustls-pemfile", - "secrecy 0.8.0", - "serde", - "serde_json", - "serde_yaml 0.9.34+deprecated", - "thiserror 1.0.69", - "tokio", - "tokio-util", - "tower 0.4.13", - "tower-http 0.4.4", - "tracing", -] - -[[package]] -name = "kube-core" -version = "0.88.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6b42844e9172f631b8263ea9ce003b9251da13beb1401580937ad206dd82f4c" -dependencies = [ - "chrono", - "form_urlencoded", - "http 0.2.12", - "k8s-openapi", - "once_cell", - "serde", - "serde_json", - "thiserror 1.0.69", -] - [[package]] name = "kzg-rs" version = "0.2.7" @@ -5146,7 +5037,7 @@ dependencies = [ "thiserror 1.0.69", "tokio", "tower 0.4.13", - "tower-http 0.6.6", + "tower-http", "tracing", "tracing-subscriber 0.3.19", "wrapped-fungible", @@ -5515,7 +5406,7 @@ dependencies = [ "test-log", "tokio", "tokio-util", - "tower-http 0.6.6", + "tower-http", "tracing", ] @@ -5554,7 +5445,7 @@ dependencies = [ "tonic 0.14.2", "tonic-prost", "tonic-prost-build", - "tower-http 0.6.6", + "tower-http", "tracing", ] @@ -5827,14 +5718,11 @@ dependencies = [ "current_platform", "ethereum-tracker", "fs-err", - "fs_extra", "fungible", "futures", "heck 0.4.1", "http 1.3.1", "indicatif", - "k8s-openapi", - "kube", "linera-base", "linera-chain", "linera-client", @@ -5862,7 +5750,6 @@ dependencies = [ "non-fungible", "nonzero_lit", "papaya", - "pathdiff", "port-selector", "prometheus", "proptest", @@ -5890,7 +5777,7 @@ dependencies = [ "tonic-reflection", "tonic-web", "tower 0.4.13", - "tower-http 0.6.6", + "tower-http", "tracing", "tracing-subscriber 0.3.19", "url", @@ -6878,7 +6765,7 @@ dependencies = [ "http-body-util", "hyper 1.6.0", "hyper-rustls 0.27.7", - "hyper-timeout 0.5.2", + "hyper-timeout", "hyper-util", "jsonwebtoken", "once_cell", @@ -6892,7 +6779,7 @@ dependencies = [ "snafu 0.8.6", "tokio", "tower 0.5.2", - "tower-http 0.6.6", + "tower-http", "tracing", "url", "web-time", @@ -7081,15 +6968,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" -[[package]] -name = "ordered-float" -version = "2.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" -dependencies = [ - "num-traits", -] - [[package]] name = "overload" version = "0.1.1" @@ -7303,12 +7181,6 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" -[[package]] -name = "pathdiff" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" - [[package]] name = "pem" version = "3.0.5" @@ -8375,7 +8247,7 @@ dependencies = [ "tokio", "tokio-rustls 0.26.2", "tower 0.5.2", - "tower-http 0.6.6", + "tower-http", "tower-service", "url", "wasm-bindgen", @@ -8811,18 +8683,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-native-certs" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" -dependencies = [ - "openssl-probe", - "rustls-pemfile", - "schannel", - "security-framework 2.11.1", -] - [[package]] name = "rustls-native-certs" version = "0.8.1" @@ -8832,7 +8692,7 @@ dependencies = [ "openssl-probe", "rustls-pki-types", "schannel", - "security-framework 3.3.0", + "security-framework", ] [[package]] @@ -9082,7 +8942,6 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" dependencies = [ - "serde", "zeroize", ] @@ -9095,19 +8954,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.9.1", - "core-foundation 0.9.4", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - [[package]] name = "security-framework" version = "3.3.0" @@ -9239,16 +9085,6 @@ dependencies = [ "typeid", ] -[[package]] -name = "serde-value" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" -dependencies = [ - "ordered-float", - "serde", -] - [[package]] name = "serde-wasm-bindgen" version = "0.4.5" @@ -10487,16 +10323,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "tokio-io-timeout" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bd86198d9ee903fedd2f9a2e72014287c0d9167e4ae43b5853007205dda1b76" -dependencies = [ - "pin-project-lite", - "tokio", -] - [[package]] name = "tokio-macros" version = "2.5.0" @@ -10644,12 +10470,12 @@ dependencies = [ "http-body 1.0.1", "http-body-util", "hyper 1.6.0", - "hyper-timeout 0.5.2", + "hyper-timeout", "hyper-util", "percent-encoding", "pin-project", "prost 0.13.5", - "rustls-native-certs 0.8.1", + "rustls-native-certs", "tokio", "tokio-rustls 0.26.2", "tokio-stream", @@ -10674,11 +10500,11 @@ dependencies = [ "http-body 1.0.1", "http-body-util", "hyper 1.6.0", - "hyper-timeout 0.5.2", + "hyper-timeout", "hyper-util", "percent-encoding", "pin-project", - "rustls-native-certs 0.8.1", + "rustls-native-certs", "socket2 0.6.0", "sync_wrapper 1.0.2", "tokio", @@ -10810,8 +10636,6 @@ dependencies = [ "futures-util", "pin-project", "pin-project-lite", - "tokio", - "tokio-util", "tower-layer", "tower-service", "tracing", @@ -10836,27 +10660,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "tower-http" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c5bb1d698276a2443e5ecfabc1008bf15a36c12e6a7176e7bf089ea9131140" -dependencies = [ - "base64 0.21.7", - "bitflags 2.9.1", - "bytes", - "futures-core", - "futures-util", - "http 0.2.12", - "http-body 0.4.6", - "http-range-header", - "mime", - "pin-project-lite", - "tower-layer", - "tower-service", - "tracing", -] - [[package]] name = "tower-http" version = "0.6.6" diff --git a/Cargo.toml b/Cargo.toml index d6d50f1642b0..7ffb641e49b8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -140,7 +140,6 @@ flarch = "0.7.0" frunk = "0.4.2" fs-err = "2.11.0" fs4 = "0.8.2" -fs_extra = "1.3.0" futures = "0.3.30" generic-array = { version = "0.14.7", features = ["serde"] } getrandom = "0.2.12" @@ -165,8 +164,6 @@ k256 = { version = "0.13.4", default-features = false, features = [ "serde", "arithmetic", ] } -k8s-openapi = { version = "0.21.1", features = ["v1_28"] } -kube = "0.88.1" linera-jemalloc-ctl = { version = "0.6.1", features = ["use_std"] } linera-jemallocator = "0.6.1" linera-kywasmtime = "0.1.0" @@ -191,7 +188,6 @@ opentelemetry-otlp = { version = "0.30.0", features = [ ] } opentelemetry_sdk = { version = "0.30.0", features = ["trace", "rt-tokio"] } papaya = "0.2.3" -pathdiff = "0.2.1" port-selector = "0.1.6" pprof_util = { version = "0.8.0", features = ["flamegraph", "symbolize"] } prettyplease = "0.2.16" diff --git a/kubernetes/linera-validator/.helmignore b/kubernetes/linera-validator/.helmignore deleted file mode 100644 index 0e8a0eb36f4c..000000000000 --- a/kubernetes/linera-validator/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/kubernetes/linera-validator/Chart.yaml b/kubernetes/linera-validator/Chart.yaml deleted file mode 100644 index 1800abf5945e..000000000000 --- a/kubernetes/linera-validator/Chart.yaml +++ /dev/null @@ -1,49 +0,0 @@ -apiVersion: v2 -name: linera-validator -description: A Helm chart for Linera validators - -# A chart can be either an 'application' or a 'library' chart. -# -# Application charts are a collection of templates that can be packaged into versioned archives -# to be deployed. -# -# Library charts provide useful utilities or functions for the chart developer. They're included as -# a dependency of application charts to inject those utilities and functions into the rendering -# pipeline. Library charts do not define any templates and therefore cannot be deployed. -type: application - -# This is the chart version. This version number should be incremented each time you make changes -# to the chart and its templates, including the app version. -# Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.1.0 - -# This is the version number of the application being deployed. This version number should be -# incremented each time you make changes to the application. Versions are not expected to -# follow Semantic Versioning. They should reflect the version the application is using. -# It is recommended to use it with quotes. -appVersion: "1.16.0" - -# Dependencies of the application being deployed. -dependencies: - - name: kube-prometheus-stack - version: "51.0.3" - repository: "https://prometheus-community.github.io/helm-charts" - condition: kube-prometheus-stack.enabled - - - name: loki-stack - version: "2.8.9" - repository: "https://grafana.github.io/helm-charts" - condition: loki-stack.enabled - - - name: pyroscope - version: "1.14.2" - repository: "https://grafana.github.io/helm-charts" - condition: pyroscope.enabled - - - name: alloy - alias: pyroscope-alloy - version: "1.3.1" - repository: "https://grafana.github.io/helm-charts" - condition: pyroscope-alloy.enabled - - diff --git a/kubernetes/linera-validator/README.md b/kubernetes/linera-validator/README.md deleted file mode 100644 index b4b8b217cc5e..000000000000 --- a/kubernetes/linera-validator/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# Linera Validator Helm Directory - -This directory holds the requisite -Helm [Charts](https://helm.sh/docs/topics/charts/) and files to deploy a Linera -validator to Kubernetes using Helm. - -## Outline - -The directory is split into a few key parts: - -- `Chart.yaml`: The validator's helm manifest. Defines versions, dependencies, - etc. -- `Chart.lock`: A lock file for the chart's dependencies. -- `charts/`: Holds the source for the validator chart's dependencies. -- `templates/`: The Kubernetes manifests templates which Helm uses to - parameterise the validators. -- `working`: A directory which is in `.gitignore` (but not by Helm, i.e. it is - *not* in the .helmignore) used to store intermediate artifacts for - bootstrapping networks. For example genesis configuration, server - configuration, etc. -- `values-*.yaml`: Files which are substituted into the validators' Kubernetes - manifests. - -## Usage - -To deploy a Linera validator, you can use the `linera net up --kubernetes` to -run a validator locally on `kind`. - -This will deploy a network with a single validator - the script also provides -the subsequent requisite commands to configure your `linera` binary against the -newly deployed network diff --git a/kubernetes/linera-validator/alloy-config.river.tpl b/kubernetes/linera-validator/alloy-config.river.tpl deleted file mode 100644 index 146040c103c2..000000000000 --- a/kubernetes/linera-validator/alloy-config.river.tpl +++ /dev/null @@ -1,228 +0,0 @@ -// Grafana Alloy configuration for Linera validator observability -// Collects metrics, logs, and traces and forwards to central stack - -// ==================== Prometheus Metrics Scraping ==================== - -// Discover Kubernetes pods for scraping -discovery.kubernetes "pods" { - role = "pod" - - namespaces { - names = [env("NAMESPACE")] - } -} - -// Relabel discovered pods to scrape all pods in namespace -discovery.relabel "linera_metrics" { - targets = discovery.kubernetes.pods.targets - - // Set job label based on container name - rule { - source_labels = ["__meta_kubernetes_pod_container_name"] - target_label = "job" - replacement = "linera-${1}" - } - - // Set instance label to pod name - rule { - source_labels = ["__meta_kubernetes_pod_name"] - target_label = "instance" - } - - // Set namespace label - rule { - source_labels = ["__meta_kubernetes_namespace"] - target_label = "namespace" - } - - // Set cluster label - rule { - target_label = "cluster" - replacement = env("CLUSTER_NAME") - } - - // Set validator label - rule { - target_label = "validator" - replacement = env("VALIDATOR_NAME") - } - - // Keep pods with a port named "metrics" (covers shards 21100, proxy 21100, block-exporter 9091) - rule { - source_labels = ["__meta_kubernetes_pod_container_port_name"] - regex = "metrics" - action = "keep" - } - - // Set __address__ to pod IP:port - rule { - source_labels = ["__meta_kubernetes_pod_ip", "__meta_kubernetes_pod_container_port_number"] - separator = ":" - target_label = "__address__" - } -} - -// Scrape metrics from discovered pods -prometheus.scrape "linera_metrics" { - targets = discovery.relabel.linera_metrics.output - - forward_to = [otelcol.receiver.prometheus.default.receiver] - - scrape_interval = "15s" - scrape_timeout = "10s" -} - -// Expose Alloy's own metrics -prometheus.exporter.self "alloy" {} - -prometheus.scrape "alloy_metrics" { - targets = prometheus.exporter.self.alloy.targets - forward_to = [otelcol.receiver.prometheus.default.receiver] -} - -// ==================== Prometheus Metrics Export ==================== - -// Convert Prometheus metrics to OTLP and send to external Prometheus -// Requires: PROMETHEUS_OTLP_URL, PROMETHEUS_OTLP_USER, PROMETHEUS_OTLP_PASS - -otelcol.exporter.otlphttp "prometheus" { - client { - endpoint = env("PROMETHEUS_OTLP_URL") - - auth = otelcol.auth.basic.prometheus_credentials.handler - - tls { - insecure_skip_verify = false - } - - compression = "gzip" - - headers = { - "Content-Type" = "application/x-protobuf", - } - } - - encoding = "proto" -} - -otelcol.auth.basic "prometheus_credentials" { - username = env("PROMETHEUS_OTLP_USER") - password = env("PROMETHEUS_OTLP_PASS") -} - -// Convert Prometheus metrics to OTLP format -otelcol.receiver.prometheus "default" { - output { - metrics = [otelcol.exporter.otlphttp.prometheus.input] - } -} - -// ==================== Loki Logs Collection ==================== - -// Discover Kubernetes pods for log collection -discovery.kubernetes "pod_logs" { - role = "pod" - - namespaces { - names = [env("NAMESPACE")] - } -} - -// Relabel discovered pods for log collection -discovery.relabel "pod_logs" { - targets = discovery.kubernetes.pod_logs.targets - - // Set pod label - rule { - source_labels = ["__meta_kubernetes_pod_name"] - target_label = "pod" - } - - // Set container label - rule { - source_labels = ["__meta_kubernetes_pod_container_name"] - target_label = "container" - } - - // Set namespace label - rule { - source_labels = ["__meta_kubernetes_namespace"] - target_label = "namespace" - } - - // Set cluster label - rule { - target_label = "cluster" - replacement = env("CLUSTER_NAME") - } - - // Set validator label - rule { - target_label = "validator" - replacement = env("VALIDATOR_NAME") - } -} - -// Read pod logs -loki.source.kubernetes "pods" { - targets = discovery.relabel.pod_logs.output - forward_to = [loki.write.central.receiver] -} - -// Write logs to external Loki -// Requires: LOKI_PUSH_URL, LOKI_PUSH_USER, LOKI_PUSH_PASS -loki.write "central" { - endpoint { - url = env("LOKI_PUSH_URL") - - basic_auth { - username = env("LOKI_PUSH_USER") - password = env("LOKI_PUSH_PASS") - } - - tls_config { - insecure_skip_verify = false - } - } - - external_labels = { - cluster = env("CLUSTER_NAME"), - validator = env("VALIDATOR_NAME"), - } -} - -// ==================== Tempo Traces Collection ==================== - -// OTLP receiver for traces -otelcol.receiver.otlp "default" { - grpc { - endpoint = "0.0.0.0:4317" - } - - http { - endpoint = "0.0.0.0:4318" - } - - output { - traces = [otelcol.exporter.otlphttp.central.input] - } -} - -// Export traces to external Tempo -// Requires: TEMPO_OTLP_URL, TEMPO_OTLP_USER, TEMPO_OTLP_PASS -otelcol.exporter.otlphttp "central" { - client { - endpoint = env("TEMPO_OTLP_URL") - - auth = otelcol.auth.basic.credentials.handler - - tls { - insecure_skip_verify = false - } - } -} - -otelcol.auth.basic "credentials" { - username = env("TEMPO_OTLP_USER") - password = env("TEMPO_OTLP_PASS") -} diff --git a/kubernetes/linera-validator/charts/alloy-1.3.1.tgz b/kubernetes/linera-validator/charts/alloy-1.3.1.tgz deleted file mode 100644 index aa44ef7cca76be90d61369dddd56b00e3b65a428..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26675 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 O0RR7pe8QCgi~;}*|AhYl diff --git a/kubernetes/linera-validator/charts/kube-prometheus-stack-51.0.3.tgz b/kubernetes/linera-validator/charts/kube-prometheus-stack-51.0.3.tgz deleted file mode 100644 index 8c929872275b0586ec841d346aa7d86f5d2d7024..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 492130 zcmV)SK(fCdiwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0POwwdK|a4D2ngD`4l*$e?JXjRdTB)%3x8X;jJhLd_brb)fml{YUFq@m{Dk6@OluP zzJk|v%cxoo=A^2#LIaTr+_#NXg5Vk*3H~D~)Xib@h6t><7<7*O>V#a)G1^q3C7T<# zp?@VpQqIO`v9p1jCj1=ckDunljgmBkm4p?P$ni#o3eHNZph_W1nG=R56)886orf;m zKuC~=ORBh7j?w1k20{x5c$g3KVG2kO{6t|zUJ)f|u?iGsCUuRhHdQ)ZxE1PK^4u;P z<(w983qhN3a#pZBDtJ|qLP_-J zc0vRribzyrMyEt7xsARx%YjNP=M#=aDYx}qVWqx%77`L|MIQAj0aRytyDyy+Apl>BpO32b*Y+@ zsBiv;^YltjfHLwL;yfiV_J>%&Ioe;A3wFYEVyW7Uhup<^XJuko}H2N&}2q26YYfZ|Cs3lJ@Ih4 z+_$(o%zk!;g__ed+1JW_3$1!j>wicp70nyvTYmdW<84NM&QA2F&|Vf?ss9jC@!S%#`L6JK4c|yN}6eGA(wB(e&|?-Qw9~7w)ju-E8fvc9tPbC1l68}FMJsIunb@Bh>C!;(3|4aP0g07EbcGkBsIVYtfd$pvFR*+Qf*Q^Cl!!9L(UP|U zDN;8TRz&6-8(UkNaRaUp17<{&p{BwGL43M~ch$rE0XNO~2UOt+spQ7i7Es#XFNhGd zB=BNs(5?U&#F8`>UuxzQI+6`8h-(QyR+@*AojsKfrRrJXR`I|aBU)?3Z8=>;E^ysc z_Gx^B#f&J+nS~BU`Of3~vF`nfN_G_cRmIOy#NgR=<)&gu7&@QRil9OetQ&@J6s3c-R#Qp-)3QuT7)pA{( zKed91c(9%C-%+XfOyGK5g_DYR2k@LTC3sa4@oHtJ`g=uGr{qZRi|!D^?tQyD>E!!s zUXo){a8Xh=>(nx`qWz}n4$^!$b_cHa>xtq5&$?@4zb&OA-Bmd$=A>*ZBKGw@ua3rl zUpL%Xh#P%kM4fYS7MJjnbbdNvYfsfJ?gQ)0r9xM*Q1@j8Ug9_eT`5~-)DnxqAxw@Ci)7?^9W}3i$yQdhaTk8_qBhBDPpl7JX&$T0jWekR#8gN$JGvF zbh1(ukjYK%(UqrOUU}^IQw8ST*}pscU*Oq45@bp*;H-<5O*lV8Z;uaUj^0Ymm{1^+ zdCaLysgMdaSSU?z>k`{gw?k@ojUhs3~sfaBE$7=uJ#S1bMxJ=0K7o-uSz?y|T$IDnh zShP~{8VR@bhzrxP{@al2h6OS#ontN|nmyM<`&NWA(rL&s`o}*vwt{Ivz05S+O!Kn3 z99g_GHb3Hur|`v3M2K88VvI(^A$k~9h*_~uH2bx4e}x;%Yyq?k zCe}0QbyH3!eC2f4PIhBf@d>Up))o_780?)eRZtR`wdZDL#~h}wZveSagq1LDazQ1m z&VrKjZA40{K=q8vnzBw)u2+i)TqvVU?zs?#g|z)2lW7pa1`L){J}7x12ZBtAAgmw* zTogpg47X~|;QxOf=(!EH@N6c?Ods^jZjj)Hf^~D=cQxX%j?olX(o*WOdFlArq_j(4 znswjWLMQO7E>XkF_{j|wuA5lFSwR{l2Mw=iu^cqK%p@sVLDe#|Wm~vuu&BBC#9$>U z3SKv#8tPIOs`5bHAISEWy9PO~nmNwXZg5rcb5b4&u5kpgIAe70;l0~Iu`EmkWsL5X zyf`DmeG3rX;s%ftqHY9Hv`o>O1ds-)e+!om(HhSP5@bfD5`cJHNf4bPst_Zjl&OG; zFhi&Dngn7^w59{e0OKD&cOyi4o+dmI}iY9KHCHC;KX*tC?TL z9J3i%8g6a%SpjZ7K7 zc*}4o^>{rwhv_1eRFFc^MKAWg>dq%%23yHbL&XC;_^%({IhiQVs|cpxt^PMtf{;uT zkzDu_Z8|XP5olK+hl%9Xf}H9Hm$zz+_GzG`hU1 zS>Vc_IWQa{SVdn(J9Gc3Aap^*7~NxS<J5<`5Rtp;R}Y>kuXI!4GDwD?-Um`3RObOf6*MwglWqW^pM zPH#PB1Z`TW*Cu-Z{@pv2zr0XHFkHPoK17#DkYfS|VZW--X8tff1^?@R<@fW44>r-} zS0me+uoAuZ<6G@ZR=7CJ>m?U@D=yTgt?g@O=qtgwLgTMdjynp{g3d&0Q3^0F}!cv(*b_ehx^6Xh1 zM&$Ri((+q@oB8-5`k%UyQ3WY3^cK8-e>n!^cBg~{&x9JxKN}#!c<7Jwhwi$uQj#t{{8r& zS?a%PMtNm{0a`dLH!9me&TOie@i8J{^bHrWlhVI`jYj$CDO&Ot$vJPU(n`seu^kq$ z&qj}j78F}G52;F5;dzCn)HAcaXzbO`n@%b|8|(~shJ)dw!Ek3l>qhVesR>guQyiWq z*DG#lMp+gBWO}R#*Q%=*y7P=rGt695JB;q=#z;Tu7aP4yI}}!l4F%v3Z-!@~fzAq* zbPDo5W$$i@z>1C=(UTP+*kRaTM_i~edOCbMx+!SeP=jRF3eY`A)}FDIWZG7mgws1{ zDGLX_;gl%@(~H+AlL|9qpr|3n2n*dOvwo|^EUuOfAEXm|z1~l#)6g&KcU&rIgm;Dv zTF_EIrc-oamx4-nf^*vl{+a8BR%mGkk)<-IlGm6r@M?0M9bq+>PEtJO!Y{YcM`a+c zZLpfVD`4b_-Q_uHNRb1>VU(iruypG%EIp`!@BVgIPD6ULYzVqv5=BH!8Ifqt&;7zc zSFYuRSk9(=;JW*~cW*+JA|lg+$e?F^3pMIBMVd8nx6jRFj1Ke*>>Vpl>{;{+^ycuS zLr|{>01x7Ot>;(>qWt-(F>7&EExi!RN`QlJ z**SZb)^LZfS5TZx%k&)tkNVem9d_yk=gnp@^Ctv22p}kH+~{*pa4}Ci76fF15u)1K zO6TH`77@p`u3PQk9&9uUrq@vM?)mwU=V#69^9^OV0_MbFY<&blWTCeocD9K&lzQ~( zAiR6Gx<$DLVof{Vzt7&iLtj|{uiJV;1bY8IU)$~lU|2(j_*<2liU1<(8C5u$zzF@2 zrQQDEK;Z_QyMRpw9XTsK_BY*l+56TOvI7dhoqXepp?Gknu@fTP;Jvs*`=1EyTOO)#BuJJ+RZeqMOn>T&=!ow4E zZvAgx2Q})SmeV{qN-wS^!B@I++C{}tMWrGPfy66ZVxY^P4WI3Lf+SMagOXEIs258_ zE|kE}ohlI;COZit_oEeXFf9EHUo>12%_G1bF3i-ws4GghtGz-vqLJu@b2IU;j+{lPbAWaaZW8w8~L3WvrW%uP>H+>%)z_Pc%_w^ zRBCBS1{RDQY!NFY$!O#8r2`mQ)9M8@280c{@{Gg=w0h1l&h38jsMrRBXf^kw0FRWO zaBDieSZDX(gCS$=Ob(7hpB2aDpKztwD0c$8#U_5xF=jJsuIJw>!nl48=+y9V?r@ew zQeh;Kz+(80krH^SIXA^&%QIuGqDen<2eNaBO2SHD_mbzy!FXdp9Dym(*x8i%F&!B0 z@f;g&vBqakMyOxZf-^=6YfK<`t#1PsiWY5!^&qI`R6!tWT;=SOEj3y{;-xw3iq`%_ z?H6F}gzi0uwg*S|^la`Whg%XUDQElBDP>@*oM2>opO;Na*u$gq++l_rkjzM0g$!+0aoyVGsFzN!>4xWrN(8AH{Ep{1_m_NnTQO1j8PDG8CSBjYaDt6dUT~%b0=@o zs|w)bUXQMvob}!6g>KG;olS1;*#cJ-sOM;ptyi%`JNeF&d}Xmk}} zGc}J!XZ(79p&@G8{}4v-VS@#uw_j|upgCAGTtN2VMDh0cP>;~ze;8a~B0ZN3bE9mQ zbQ7RNudgiTMAKE@y?JwFf5fb^2b6F^@CN;$DrsKhAIv*zHFI=o1EEo=C`a|1!xJ+M z*HzTJc~`$vs@WN%zs(JMrJpA#he7S+eJt@cVW#@ZCKaCyYE0SSMI0AyfE$|E<(9+Z z(R**lmEbEs>2Z&o(=Hs?1G|-T0uKP5gBao3mC|qF)V={dGcLFwTz<$TRVB@c9jof* z;_&K(U_k^}HGV@YGWPQ}4o$}d&Z=pZI@CL)il>T%bF+;mt>)XOT!8$K=$SG<%S7M& z>GxEa;YL%oSD}t)L)k19`ryJwD{GOcHe&A~{?(yu9>s zh)Yc|Tt;-~gZvNoJTyZBxmWEUr>DBz>1iNVZm`mJRoznm+G{G-tmev8YohRJU_DP8 zUY_d3f;ISOSRzBrYl`8I-Cg+K_w$DjzUuILHZ+3<#e(n{%+M-afaGe7z6u)qIj>EIL}F9$Se|zs_-|(sjClRt6J@IfYq?MTz+2M^dPJQlD~MVuf?` z%3QxG?;UYuiyOlG+2KK~ND$c5NvpW9W=I1`XBig7oGMbNRuDbxtl(^+nRCvho`UN? z!Xfb6`Q7W+Ft%+6@~9EK!Qi0eSkHu!YIrHrSB;krZbBX&fMW@tc5ST#k*X^M!&&D6 z@>7eKIpw}Q#J-9GYvL|UeFkR`g?HyM#3qIZZ;q4K&XVsz|JzECCK}p85ZQ2M?Cm4} zL+pfsEB5*6 zuV*XCOY8e)1d*w($VqZ-+@8wHwR|B9VumQ3Ly!HRIo{h=0w(9!3XZSR(1i zf1}k&7RDLc*#qxa=5J*3=J3SY;5rV`X+rd~Rue^p@deRD?#VCoc*pZOClmXwAaqV9 z3G$4WG9p1HdbKK2Smaz2F(ZH}ydO%s2^wW3>xEa~o&Y=^A_;75p_i6Ewnv|s;L!R4 zthSGWIN8>KCxH~PnhZ0zP4mHdGO?vTrJI%%&s-fYx@FnUrjtysAH1h2K$-UPq7g>m z8QB&fl%X@Sv_=Ur`D7jo6r#N!u;hao@;E8e(9&^U^Eulw6+Ui_lf@OhBAZAO5GZz6 z^0sRhM~yMF(BQ}2NxI>Ous+>$*%iIIOGstG7ep+Lkc(E^U@nh}IVsK%KW70WU2|f6 z*S9;m9{l=)YP-3~dG*lJBkPN=I<>14xb^W(M*3+^amTplsv6nO#%)S$S@zvsLk&oy%un;4SKs7{&kl9lF))aMTBkn~N7Rvv#voUz3;Rq>U9b1mG3XRnUC?jFt10+xTvQ!JVAUKtD=6Zgf5VW0*br=O6CZ@={*b zm-7eceod>2N>XrEO62~nDQgwj0JTCs$Wy_IGEDOr=>dctFd>WFCIA@;>JYtdbAFDb zt&kW=O_r z34x86{qmZ`x5tN9Y)jBDICBluveH~9V;Iheo)R_@GF-rGRB$0Q7B?ZBR_oGfr$cGg zdt#v}CBbV1o*lriy?A{Bm^^oWiIK9qqttvWs&O(;qc^qYMjie7j7s2jK*KP{tgI~O z6Gm*z-nWB5Jod_g;5k;`K_wF8Tu>0p0YKw1YGz>fZQBbkaG}vo0*y)}m0oR7q`Emw zTICJ>t)&W){v4RiNKE3Vc0vkOnbD`0J{X>lBP+x8>X^@@fw{3h z!`h8RCY-+wjfRoCSrQL~V!-5B3mB`dg$=HjdgSKdmY(QvUYj!xQZnP`NyLuUa@#U z`cuNcbjB1oK7R@Hr2=KC4V6gQtRktz=@w%vc-^!R(Z+T(NT0-RB)_d5tXz{C1hbEZ z!&fviaVZgIie}ha8=(R-eN{CTVs5z$;Ac=^Q{h7IZJbTYk`~?p2t-!AB#CgXj3bt# zP06Qf6V(JW>AilVzO0(|p>gznXpBmfuYlA!_ohLOJ_4M@wpY4$z*CH)S&Ic`iU4ik zyls-9*&)rbD6be2mFS_3>rsBtfcpB}G_RSB$!BAJ#oOVWq8aaeF#bF4EetekSKhzR z6zw%7JD7GL2CpNH0nGJMyx|p}E&oiGv8Fp|7|n}HI6on}2~vDJMz`B&ifPpfl38D+ zp1@c?b4IS1#G5drF-luH_kh4HN=awTg|zCdo!uYYM`hgflKSvvsb4sTej)mf-udLZ zV!s*ww(2^5kNk~whwVkHDGVD(ld{=?(MOo#mlvdHQw}plSZ|1^JEDoJ1Q%X(kxrKE zkPQEvC8|R6-&z^Q6;ccUHd<4@lRQPna9%$i;3>e%dwSz4B5?9>eCS4L{zhdOlGr(* z$!Dqs=q2-1O6kGElzM+*tSm3o%BU@NXz4pfnw$&DY$8N!`4` zG+8s?l&KF`jB_r|DvnDz&^QZ%?>YFHfuBY2I}2m#oj|qcp;od?HNH4GBj+yC&{otC z?yvi?76l*#6xCZMv7&NHO@yKs{54l@&3r|WTCGZ(*2_=yQ5llq=rbg_prf!stJj~BsoD9rjR{_n;Sc^GL zbgY;ZbhVu>M`gJ8QK82KM()XVKNtz=jI9q}NRM|0gk{{#6lYH0O3xG+Am?iG0 zS=QP-!(Z#;KOPK5J5TaqKFmks;F4mi>Kd7K68RbuqvgYK;uDdfJkR~FCibt;AN?G= zuI=UpUOQVbEmXYV)fl~beiXg-F%@r%BZFTf`0+$GZ&lMObYe}WPKb(RUS`;~MWls} z;r$i9zTz!Yw+CvPCHn0HM%4`uCQYiYJ)9*lkr2JqP?KI6biW~@riOUgMkN(U2|^y| zX*jjCTP|n!rLYOZoTQLOouMQXIueuvh6g8CWJtPTXrp<#gi5v5BVk)aY=?zEBK^w) zTsNP_>l9x+lZKbL2f_yJK^V>HY+fxRVVDmk9n+j?_vt*j0MEaezK5QXja%R0D1`G9 zge!DTCSjJ=1b@F=5TU3f`{sT{lJSZbR5|A?*lJf7Q5FQ_ucKhLK0tyVn0_mdzj;1- zHhPNwG5ROE-?Wp877v2IR}SU2PIw3*z*bI)n&w>026I(c12HXhr39Vz&!CHeZMAO! zi61!Y{>XdPTl`OmIwyoVe2jUhEs4;_#$o!@T5E{z>nK$S$NJ}qnVNN}0OhX|*jl9(iHkQVc}(6w-b$kc8w(`9@3momSo`QT_+?-VAf;#*J&l%4#J zg4cbj0Gq=$P9YoV0BnJ)6y*nnL=L8SHPaqKYZ5C4>|kPYzrYGR$+t_*=ZlcHj|7#r z-Ywf>oX>HNHHk);&r0Gfx2L_`q)`o%p}3Teeju*k6OO}0XHSP=1C+Zh3qjl+4ErUt zf7uhaT)#p;a~5(pu7QWX2frWQ7@Z6jWQ-<)pG#dR;&4~WLfl3)CpmiA3f_>xVS7R9 z32()0?eN@C#;8>gvI5d^9APQXAzz55p}o#&Bgq63`(1u(m-*=AC=yf~^q7#8D=9L% z;oSP5y4WCB0PYRLv*lWPLLFAT12*_kc@%zSpstRg>y^=OdVIv8Lot3_a#d~#=7-yZOTZuB|@^nYR z%}^2y%`-As&0#g&{f>j9G+3ka!8LKWX1)9H*+OpF?rs)s%dJBv(3XDX3v9)m0avVq zQHkVlmGS+t08f3R`14<_$a=KtkC91d>up2frB7`KL9rX7Ded9V-lj~y!0LoKnN37qMuq~td>@`MsLL{Xf;Mh-=DmR z0Irf=K9a`~FZG^Bn-a%GLR1J16%I1R7Rx{ ze}aK@OTHR)V~GoHzmSqDqfGW$wGaY3ay{O06lPjg^5l#*ejzzX-jF zkJj5anl>A&$io5y4xlF>hYevMbM%VN=0L*->r@*)iHKZqu1;G4VR|G{o|p5aH)S+p zCN>8atYe`f!O0laJ{=tLt_nV|X2LC)*Vk+um- zLb1d43AwSgwGpL)P7a}5l_Q#Dfe8>7;zdJ2xS{suIl%i3J%NHgp=3B#=1f7w5PsbZ z${tZLR3S0ec1Zr$4DRJSy9>s37mVvJ7}v)H<8t{<#{o@QtPorO^;rG^o9CL0H4d^U z$bIyZofxZlf#&Z#u#*>+yb!zrcMU1&f>cYyIF-w=Txil3XT+(vQ4|NN6uj|^X`eCQ z?9|GHPMwzf)JlX-4ZJ_zALgUI%VEBAIm~zU|MZVX`hWV5$CtzW$>lJAdO6IWU5@gd zy~|Oq|Mz6?a_4gQayQ?*e02FJ-@AN#`Q-BH<+IDt-sR5T<)h){o=x0=y78nUNneIs zXsM*oTbSMjyZVe2lV1R{4_)G^&*QzXo_*g>JC^EwRh?JXsb+lA23PH~eg6L#ApH^6 z)K4p+(oRpUWs*HqD}-94oUxEKD>#1iX!j$+e%hXTj{ z3c3+|;%s)V1Z*na6s$84zZ$SNrgnxbXcA0QCZxcvB$3gX1r8pxxH491CfqqR^e;g2 znmfH?ayav zJjDwl@Qj>}hVs%71)W;0BqA+(aPKB_8z5YrQb$8Auqud?i4t&OEtIqgD<+{ zjhy)!Qh1yRud06hD%^w!78!ucKHDtx5b}rJ5kgvdKQb5$Z<)*I z%G)w6j}MQ=hh3ES;C9pbeZFCa#94j8u2h`d9j8xsoPK-KqOC25$4((HEtNhJLI`T- zJUwkF2k^WGYxjh5>Y#i{~-v!}!$mb(r9-EOdB z^X|6zhFkpmA{?$xI&w!c+>s2QmShljXy#^U=CdoK;)uA;1lTH|p8GGaf-&)mC7{ph zDb~Sru|2)19hL~fwr%^o)CWi4BWwL#r@UpQ$vg=&^;rxfgVxb7A3Yl7kMfHJds$J)*owezgwH3HZw9G5sj4lI=5Urnk ziOMCzH7&s5X@VsLShRh|Ue{KKfyx&AdQHR**BhUD88i%^vbgCe-`QCSGBJknZJA=nYnqej>7%hfcwV;h5zP5>rqA<{L_+tl~&AQzhG!&WcMo|B?SeQFgvVTqE z`_D~A7hI4ROy&?uhftFwc21?nI(j``FtFpd)%xtYR-A&y=-Fs*cZC%5g?*&h*;AQ8 zbWOm(C6jmNV0UEJ9hvnzA+zot>br;f?xFs;huS{Iy$`j0ot@mP`%rhB*=+0=CTlEz za?(rlaF2$=y+<3dF!HEVF3*-FldG-v*0kEYd-Cs|{JSUr?#aJ<^6#Gf-{+J6`#S2D zF1XqT@9xBZ#M0i_O5saC_@9l|C8{VLG5gZS*Skt@tLuM3N?JW+N6O}@%2t2+Oj=q) zi|_2(#1b(f?hCKcg2K9YLqi$Sz74VDQxxhcx|rINC8{_sU0wo{@}DUl$MM0;%)@O4 z`+&83^byTrSW_UA` z#w0847eXW_WU-&lzl;Ur?q{)J4CmyImb;_n?r6E+B`vqkZZTl_eV|*!K&efo~+v9SwILJzJp(L+SN~6=tdK$iX{u@Qxh( z-I0S=(t`&0FG&mbP->mbsCNX=9Rc(~1kjhTnx9$5r-$XdzP+4J7n)nMHf2ILE8%Kb zF`wzhflWV;*XD4Ib9I^&EuK^mCiRS^7j0pb>CN1bnAqse!t!}24iqx0tx_GIpYDjd z@1s3FEAV$R0Z63!+5216@ard`a|3cg$;PlKAe~Y&*BPdOlI(nw!^2 z1AAU?$t*dkuan{#`T*{!w)^ zm6y|2l0sFN^L9p5HJQpwD*3a=kB67_Pc3Q5C6iNmX+r!i&6M>2P32`H6&K`EG{tE{ z8#0xb&h`=hgcGa(`l-coK85htQ+Ww#QKu5_?NzB49nbJ#^mo{8_tza|en*+#QRcro zW&RyMM-^u?)G|dY-MyJXoG4wQn-lF{IL-dANlaf8=luqh9Z-YtwrW~hp0cSty-yaJ z-nR4+XYiIVso#wUr}-alMdyWJk9RcpmqK&La=EQ2y|R(fp`(){ll`|#zXdIVY+kO? z=q8MyjM0b2VEa*e^xdc?q8>feeGW{UX?HrT3|^`&L2S(rp&uSyKs%;D+VaS0C1}Bgep~xRB0LcSgETt>3g^zB_cPdb<$_e2)MJBFYLb zgr?h#f_ITfL(UH)ZBke$gZi+W z^WV&r1F!d2ARyp;%Q5-}(`p+X%orEM{rf#T&^upMn&9x4ef1N{GzxIZ;18tzq_0&g zm_(cUTyAb_`T%X3_M3>SIT7bn611uNHnwF`OsiIqBVN&B8C#siXUY;0CnjBuIaS6$ zcTP}^FKFG?;oj~J&9O*Z!A)Fqcec*`T4%+!YArL?9+Z^Z$mRo5LSI+GIhY>F4r2v&rDwW+re+B)ZQ9 zqRw~?9OlRcl}bJ^N0kUm;A)a_qUp)ZgU-=^@fL2A$vaP_xl54b)>zW;bLP4>ieo${ zxCCoCS`*#zlDFub%6X!<#*A_ETqmkAgvE>(Wv>5e1phIoe4tlhjE)33S+e4~idji2 zqDa=*Bl{iaXD4k@5K_WDM`nfB%Y%@K0v9s_NNTy(^i$cpa;{}TpbA_T}I;&2|p~ed+%TmHPKGFal5RrbetMbjvy?V#%(|H z$tv+~nm^aA6BnWWO}@o8f8<7kKyANw2$~Q&ah6h{7*D5^QMHVU6t5i740K{7n6M(7 z=bR~Wq0pRHrPN(!6fE5|qkM5OPb zFgT#4CE6Jd4XT~lA31us80AO2?2az-=31q_qb#zN4@zFh0Yrx%INYO`xy<~K2X1aq zL@v}|g>g)~k8V@T_T{&Nx6K#^oPK!C*)iuTxsLYJTS-Kxi6n(4KaT{T(u%~nnANf& zV|1)J<(j-O>*(W|MsCKiG@973l=6>!5;n#lcKC1tc=JE`WPIKHa8>d1BS9CmA~W(* z7P!KOSdTYAUrSu-w^~p48!xBqOuWDip3sUaN|IF5ng>f$PwyWd25ndG49&x`IzcG6 z#K>=9f?E*rs)$$+#l!RJA5G%3`4FL^c<*Rc9pRQOewg8|bq%=@6h9{-S`L?rTw^^A z#1lmzo8MbH%;Lzt+q51n{n#L9sW>LnafBI}!M5hxX7u5VvT}?zpBp;;z<%HGw(OvM z0K6g#-WWm&$aKS4I#c&P^4igLfe^Y6CjwPest5T-Kwng%x>YTZ#~^i=bU_U2DhXSL zapdU4U_eh`V1`KDs3qc)A2mY<gel06FL6Nt5sr(!m21jFod zIxqpOAe}DLN=A&cQYG}c7K)l<#(`5?*Hhr-E&up}*P6>WoPigy0&i#O4_h&B2oZ=k z@hZoowx{lIRLyy-Y^q>K&AWC9Ea+{H7tSFihL%|^31zb^DIey^PqX@@96uXAd!%Pw{Bl@L>llya%%SDmfezFo48^-DbW274~Mw@O>5Y_?^hD{!0=}SlGTl-RY8||LF zjw^d6fU%#Yk@{HO0AO&F6^)tge9-Z*-8aR(CV~Ee+Ux|8399sH z8XlR2jMS^HynPHsmD*R@GkkCqbqqejird`OnwKZIm;)EEVVUM?X*Xr+L-lAPQomyN zUh|S@5cf9xQD(MijCO~^r&dkl3g77A><%A2+Vz4iZzS4!d`jF#tf-8;21v)rNSE+B2Hg$_X*%q6j ziz+I%d(tgFF`3#hn~{je0vi#=^~DC^1(p6HlthBPy5dOiRuM!ljEE5_p;@@Xa7-o1 z0FgmRREq}BHP7okb`s=dVZ1RQ97k1VX* zU6zBRa6DkpR`<;HnB9Br?{F~kvh_ETdune*xXd?$10+oc1K8twdG*O-g|F2Kz%AD}Rx-+mSs;?xR$Ib5iv;JAS$U;?>K%_B&`taB{W79Sa;o z%o5l;rZ?l>yLU*Dx~cTkH=U1->t8BdoaNKDsx+icl%x0WGu!n&G+8=culJ#}%js6o zl7O&~@#0?-HnQ#W zCN<9Z!HQ9?wAxs4uY-TSbXT`v;PK&e{5|;I12t#{Y_5ky|9@vN=J|lGhG@%Hg*cg- zqiR|Zyw~=3O=?he?F@&n=!Oxp8Hh=X(Q1nkw1C26mtj@kKj0~t&97O;JiRwHxG&pc zj<7`ge>*`h|9tYmND{5&>-p=0P@}*VE%<|N=x0I-tifCDTGmvU5#Q5f3GfP_DnT>T zG7~TaplhP-o~Fy6AG|m=)(%~h1qq5^-P*EVZdK=8Dl0#T1RjC9Gt|9iAEdeYnn1)N zMCU4zIgmGC1tW?c*d8NRpqzPjeMRAArEx*KwK~X zEuGQ~8DOI|ugFbOp{qh;~$#746m6N^|yNNFHT0LZ+ z4l>q1dflU!doPGkv;biq#6jS?!*(C6j#OmMC892kd8JdX>RM?}E=N2h z9Wrb`xxipt#~F!1i)2u`ncHD7a~4&}8X~|-kNH?aUR)OJ0fDfG=wfR&rohY* z06BUQnN<``YlId+pqS&}%y7!%Ko@!P@5JhHq(W4`_a%3YH?BjlF@zUAF#Wry_6z183K|M>X*TC8{ zqbVg-X{>3V&#_SX64zeDWMwV0zyU`#a%=75x>Gfia*_Q~B(6_i;2HX4a9dGri(>wS zB{_hFioQiNUpE4`qMu_Z$1A&KiR0L)e`O(JP4f-9kE>s~7IDS(1L<3jPdK7=OA=iI zL$_ptR2-K9clc^ zh%`2hn#iK?s}X!c{39C^Vurvu(%(Boj(g# zUN#iTId0U*S+HQnC6crxS%KXd1%&U(Td!*{W-$l1!Iq}U!2A<1+hUmS?&Lcgot*-u zq(ayT`;lY#^i`P}JEC*V=#g^8d%^$QpGEq$Ra2iJHn?q%$?d+vB(Eu7kET&;@^sggRTOrA`R0rePI{cD*?SzC;gmAIwOfXe;0 zo)ylbs`EVyoQAKs@}=SBYCo~jRV2fKkf|%Q+SRsLMvnNU8eyRx1F8*UFCO&t%D!&S z)P~A}FNo0mJUn>?7O^M<>~b`FUE?$2p2ojuoZ!5Mp!N@01|cuLE}4{K@rToyXo~z) z6;1xtyQ?+l?=v%`%nv31>YdjTy^n=@#%}Qky$8PXhVg*(Pqu!sIg2r&2`{6o-9G}n zt5FyM4%6pxK-Z2E-qd7Z8k?dYTd7dNo27Yku~g)LJn&CdzX?JhnXWN+bC}@^vy!GW6gu-W0vQ8H{e$=f37lk%MeK}4a2tWx^K-l!0AW(&P0 zq?G9aw=x;$j*BHaCy>S@sdZJzD74OY0T}zh(3yz8T5i^)RT7`W~jd>_2$9_NkfcPEBvRipK3hj7`pf#56WeF5nHPAkU(`kx4ql_5E&b zq3@^m%JtAz1s8qAX0uv@Egwk<1Z<*hI)lX+Ygk2P2ag^RVbzT{e%Nn< zLmN;p0^DB(pMD@}3afD|BsJ z+$qF90y{c`pI-dQa-=4Ph_e|mvK|`^s)t_+^NRlj_j@^bw72{0Y2+mI!VmsWF!;4M zyryj5Q4r4PpvD((84jfuE1?4;+O#)IdTHHyRwC%2VyS4qv61E}qlA0^{xurqqo)wR z$J({Hj9A9?-9)+xacj_mV)$fqkG6vMaI(Fe5VGc^Oe#Jb>_Qra zQ1Zm+nu+QBASg3#b<{MZH+pgI`?Qe~&H1^XA#@cPU)4s5_aI=v&w1u1L}@&&2a(k_ zR8pp&P*Vhfr|lZJnT*jv-BiR2R;-0l5gy|ep^#o{E66^GPcp=N5k&bTP-AAIZa5@p ziAyh=PTqj31|9REHfjahWd8tVWJKQ1?t0|5^KY$ikP~J)i zX$E>iX2=gaE(7I0a2zU;y?F?8Ea#*|6D(-~q_AFw(gf-QxdI7e@Sbusa>D`7ChsQH zM$u&)F@2>*1wl-Cg}pNcf>Dgo<%Ux&O*tQbg&Q&Y>iciL-TnJ=(tK5%9S*31@^M5_rLnPuoo!{AvLLK(4jTj|S@@Ld{}!!7mV+gGszarGe~&57c;y8H^c8J1H)d8#@q?1eZ<1hjYelV(78u~cmw*oXW=tF3lR_anVyE# z$05=h82niI2V&)k2wo@ANwk>T5f|66+{|xkaO13T17wyau2y;NG@3@#@e0%Dm&aZw zZ{%uvyoO7^L!}>vO245RT~4{EolVQ!qQ4+bi6t4-qdf=V-MiH-$~6#!bkO_v*}He> zD+|CzoPPg4U)#<`qx> zE?5z!vvlmgbaszYCAi`<Aa{KUIxFp$N=!Rf-~<|YG4c+US{4~&XyU0lk<>^ zO$n{9&hyyC&E0AHP1Br5$z@;gs;z@qb4_rOUnD{Zx-y!z)}pT1h{h6Oh)1DMZ7Lo4yj~CX$c84;b(y&M=z*+e4QjBI$QW$n z8OfC_CwYx8vPs2@v&@C8{(5JQlAI{H5BrQOFbY5=XVI;F6C9fCUfYPy&w1UrRSX27 ze&3G{PQcpcd7Kyib1#~YY`vO|-hb*|eeheX__=h!{A2PEiy8D19HoyEx4I}8`{$os zh$fsH^G^W28086J8k0|u$}^S_9ys!CLex1iZf_C-kSuJLuSkFyd)x00L-{9}rgfCc zhWVpMkSeL;W?M{W`HXKJj-C#)!_m{-ggk?R9`xB1hul=s=Cn~9onxzUFlfT0sgez6 zr9)^CE72u5OL|#Jpm*IW5=}oC5lR|C*_ZbY{17ZX4#9w+#%C_F(2DVzw+KNM=gkBc zXWK|}L#}ADl-p3}6Us`2XP7dnoMjI>I7$hS&}Y|U$@qxumo;VkM+cVcOVWu!Byatl zN+lqlmZ4L0bz^-;8RTn~Xxg&E97xSkxmZu2zz4E{)*xr6(b;qO$l{qYin`c;4kKjd z_^;?hRag_-3<5atsR5DOUD*V1`SI*$kQ`Y$XfS6fD2*N|t=ry*j@ZEvUpb?QJ3qWkDZ zlu(y$y&cgLur%DJk~rdkDlZ%$xZ5$f8&5{w-YVhEM!{{F|34b z14_6Pxy|Z)`hvIFPb=};Z27tnZtj#viP~(`nS1&$HN4`pC6bLMKH)W00@kA+*I%_D z=Ukj=Bp?S3H~*J8_?dy9MesX|W9pqiwdbK$a^CcvIV0!J+-oap_-DO{?nj=E@@LKh zL!#N{w@hM1<&+vTu^0R`S8mOGMPR5_{a)94zV`aQS{gSFx}k|8c%#AjTY5o z!y;Yu3l~09Q!ap&ypgMky4GvF+9RH|4{Vm5lSyuVWG1dab}p#WKMF!MwKA>nEcNHj z42`==h#dofzv=eJwt1H(gJA7e^FWei@McOS*!OxJL=X`;@dcE>jOVtZdPxGQ`}7^> zoZVAqsXux5&ntpIVzxbTCsw)+JMg(D|B<8VT?>Ec-yR&AuQz(8u8j7Yn2UBJzD9aPBd7uHO`ic@XbqP1(eP+WqreU$Vj>G}+nLEZHmd`9 z$AMh6C^c%LCmpe7#P_KeB561vs))%t8;WI+`zFRx+hu;ICfHe$j|i`hw(Ex?$W$*+ zP@RgFfu0sdir#qV|DcGJ*UoS|3cTobwa(1kgi5jsTQ>}!(3O#MzaO@{RH0DHG`KMD3l za(S0~sQ1rJnZUrL^F^{#gTmx8YNm}=+cpst;^!>vQQpbb2c(rfv3&`$Lx2qP7PM7J z!M2j@6mXu=tJn>P8gd0HWpO4tIIIRM$J%iSKBhR@l)N?qd`D*VkHXU+Ye>*2q7m{S zSDz597f+KR@7`M`HVqw?cP$dz%8$WPfY>B9_A=)twj;AXMAkdR+F8I7xWru&O|S&? z?V>Q+>ozA<9i^|?_P0Hxtj3k(k@aM{@KJcp6kqtgbrX3_tGANK??_dc_GZ z!e(XVdKTmZ9?$N|eB|SK-FSYbXSCtvmwq`LUS4%ES7&hTE9zT(^a~mwT|J~5&}z}3 zZhg3VI{fJK^x?FuA53=*!!SRDm-3O@OA$ypd(|K*FveFN%s@+pYc zNyofB9>a~8qR9uHnxvaw@p|cTtlTVJ_+cF4gnaaU>hJtlx=O}O!$>c_*c%lOvY*`S znZ5t9B4+KQ`M8asqIIwV-O@K$AfnsHGQF|a=- zyk({IHmSxK)rl%25vMiQ_UZe}ko5?4os({4oRBKp(_dgs1d#O~&a8m9>ig;Udhl;( zP5wq%$*b z1z_1RYmAhwR$QMvz#6Zv#JGOFn%RXFv&v*? zfP&~8tfII|vde&)#^TwIk#fip<2T{&M=y^LUcG$%X8&*;n-H2VOiW@W=%iJ|`*U!n z_~#t0iRca{PO`udp0d=~%R=&D*#$An3t<=ZppYQ7^;&Z}Ho1*xkNa887g2u)4025C zc31X6C^(Q!S}-_t%6LUt>t0hI{U(^UfeOP9Cnz4cRRhc_K7ldmC%Y5#8MD$A>B>~E znQ+1C;hLC%DUL8I2vY)AsNyD2k?-n6&%n4K80%*1u>)z#m~z+dhtpFVNbvOZ2ls;3 zMBxk&V=8liWr|PIA)ld&EJ)RL4xErE!vvy9Jg<_F04hD9-_iWI69 zWPlr*6`U>1+atlc+V<}sFZ&pb@;mGpvGBa71G^k&4ap!xm~}=}~o_ zQlLg%EzF&4DqN)6wFqs;T1T7a!K(=q zQ$$USOw}f;31(3)x6qgM41U-^V8DkaP@3`;kUHnyAOh0tbEm5Gy#u0Q9L-uRFjEA= zEV-B($3Z}SWYIJR5``CbLNb&91gKQg3F|ArbTo%p=QFyJX z+g9Hs-o(~&X-gMHAP|AK%lqmxtJvnBF7s=!7rV>;dQJA%_F-JYVgA1;co?=Vun$P<$S_{riGV7 z-y8k44_XE;UKoomp*<`?0*^izZt*%1QE*I#j;3? zJ(e-aSd*wdY0VHI&?TUZx^(iA9Q`MsbQ=OU4FQ87@)H-e?^Q-ZCo3}M({oN45eYI8tdsALNms!pNw= z)ZRH$)p!|_XK2b;N(%8zmac2X(L@k@hT3K(a7kpxX9pcXXSiHY&$=!sIZt^Plm5vB za0Wjw7^kDTDJyv0U`3-)|Er6EW}F&Prx{Sxfw5MFwK1d2uRGV4j&?BxaWL@|=7+La ztwd6RQ*VL<3?a~W=zUNHlhO}Zhbd(xGW@SeinSfW4yrj>hJy;BIP!>P|Er9~(2f4^ZuEYvkM@;= z?44j5oC5U+?eN2~SM1YubIsZ$=R7P*{_x7BhzL$4XmNVQ!Eg|x@lt;3IQB~`7C1Fx zfzwH6YLuS}GNYVb_I%;8uM~@7-dFCJ{8P1TZqo11oRJ4T3kowW1-F|QiB%G;>%u%} zlr2a@6g9yTjNisKgwE5C+&N~-iC6-1kEH9CPSDuY$XKmFMFY@}g(L)G>xIlBKg?I)$k?6vnIL|@K5JsAssX`z-S`oil#?moinR%W_7h6yxxK6?0!z{hN84HS$Y$#*+%p~%3VpSX0z)~7vRksm@pdhnl z?%P3@TT@>zz&%)jd!6;WYL01ym=IE>B0{|~j;0+J25u+l);a_mpQiq)Kk|vUC4q>E zF~{J#yeZ@G2^og}8IRIlt$z=MZZz}m9SZ!;r((H+1h}tbne_9im=@RP^}NfcWLjLW zH{o5@uf+$jE}hHJbFve1yx>f>Rqy+d+2}N5TPZKeBG>0_{B$oykR zvPfv0*=ZC9?B4dh7@Ez%)|G%;JCiu&Z<5cx|8+>N=!d-#+nTx4PlO`|3^>o}&Pna_ zPgTpH9q$^H{R+=a&+cD;K6;*( zjp#EV<@82$a=xsOkr+1pG~}>DH;RZDc%v(D<+>yOFM=%7UAcbWZiXz~09;7u=bR~W zq0pRHC76_C#=gi0sK&}#rWq5Jg4Z=?AvU3pmX&Jx%P6)V;|vMTmAS1j)s~hJ6AD1i zXo+@)!(rYPQGaq3W1>Jx7r+N`4l*K4ipZ0)| zq|kT!NN^Cd*;1Ek@7RPGvk_?`l^o@;4UllbW{(e)?-4IMz6+*$q^61^L>VKulzFi4 zpDP3g$!1!@`ms=QC1!#R6$n?(!X#`#1!swg<(ufPfbqyhLj;9Asf@uOUb;96dRh?o zo~dg2|FQS(+ie?J-e~`=r>GBcCRT=|c$F-z&pk($>_p$#j@nYXr>C8x27w}p2t*+T zP?wf9>%7K!z4Ihz)fH8^g9Itc2G>d~f`wi8UAy+>x9J)|i;(O>44I!D;g~e3u1Ebz zIUh~n`Kfi##Z_3x*tD*1O-xrdWxR~pXVkN16F5ti6~_i(Pqm%RSj#z6lVdvFYCaXN zKgUO4YWeDO3B;#oUy=9`U$nOR)Fi{L?T0=k3Ym)!C_35R;Ri{Vnds zLLM+;bOBX&aGGfRJH@i=+?#VZD#={;xFwn~IR;d;cVl8%Co9#C2&e!Uj7Lc!&+&fe zh`Y*JBUzaOQ#*(J%wWa|QkrF&Q4;7n3|r{#o;ik|YmRwx!AOkT)P$)E-!`SsFU<`| z*&{1!CG)CAZBtU#GE(vrX(_fQ!FRNH!lOOFiP1^6XdsV;aCZlz+)%G zCcb}naZG(2E@v1mrn8F=(aFJ3M5*t#e!|EoCz*E%@BmyYR&mHjQ&d4YgB&KVh@;9; zh7=||snd{>0qjgW9N7$n=o)&A8tbW<-HZ60@fYT-41Y!*!rVibrsHIYaCiZQKQpB3 zgvmCF*Yu3M$c-^H0ft72fQ$w^v3xh=I2((qo z@ll*N6$ErlhS+VYMT<~NHmwGE?!Ao2QZk$q?#%AZ4hGf&W9Wryyq5}TtxSiL(ZwVx zG974JmZVcB#y^nfkOJ1kZb)bX5O$`H7p22tS12k1u^a;o!a3k8H5LqVITNIq$1x8w zyfyD>IDnQtNNhlkWF_d1A!%Ej@M#iYnf?S*yQ*iT(s4`P-ch(``yEDeK2V@7QLR)r zI|a)I@|W1MV3kt+{zMFBY$&69%-;~c4%kX?CK>Hj7ib53kZOl93THaL5d-+*PZ+?P zmb}PxtW(M=3EqgNvq9sOh%oDIvm>WKh;Ec4!WC8B9zs^UPW%oI7nUs**!F3{7h$WsnXy zc4^2?=-fc}o+;mC9h?jwa1#WfO>S25_h4Z~j=2HYv*FDiFB2jfe8_r4gL3d(W`GHm zco5~ZCoeF`GZMS#T8QGp98c!Ri4>eFjX%Ez{Z4Pc(`9*N=HyVZVQ4yT(4v;|c$z9? z1>j|l29!Ii(rB}`i>7_WFGrCXu68s9UJey+=8T$zlW+NlsxCl=Zq)0LV`rBAFcdmKD=;n`eyX~V!F z(i9yBb&)$0tp>W{Z|O^Bs2*YD>@tZM$XR7aJA5wGJY4CMlb(|+K0Udqxl$)Xr5ivw zA?uk8wK6do^aRhE5D|o0ZYEUnVkTOJQ_&*45&EHWQ|6(c>?J3l5c4gvnHl@DOl~Rl zkk_X0^E!E&FpkLD^!Qbjv5by~_=M3wCN{nLdbm_Gr1AA2rIEVQq@7I|yP+WZlvyXp zkT&}ms%Y6h3PLW)wWCBxEuIrAbg*>hl!MJNC(MAxRFR?S@~|~A5+zcMiTcwsjfsJK zujFpi_fft1+s-Dyn$Kw55((v&7{T&M<&+_m`z$_&F@~_=F%-2I zWVzGEFq!5qW&CD4-QtS$8x8WmyTV>47i1obYsr8f=rKfc1{OV_zK64 zVWz$nt`{^m!Xs=8-wPi&AKCxk|MUL_EG<2~az(A8b;DRT6URRSy>6#RwcV-%l5B$J zGSmiUuVeathunx<{g<)&i`2$o8a;m^9fXB~HDo`;SkPu}x6v!S6>7>$wZTHAu7p!A zTo}AVn6HRWG;)FtC>>7Icc{6Pj506`z<-EE$;lz3!5(`;&(HG3Ks;t|Phn`ZfZ;j; z{rA=ktr?-HwI_zfDcYjvJ&1|nA>y1<@w}k?`X_qD?SX=ap-?50>hu% z|Jz46{Ik^GPUx9V3phbM1&`493vn%x)cHG7V^aASjb4aNFPI2miG=enBhR%3?B1f2 zSHc){<4DOWC`>~ReIJQ?L$V5?iQ-CX3i`#J3L~u!WudXvX8OMC=pjwtr3ZT|5M#9U z0tbxO!ZeMp!T|*}FCEH@$rBV=jz|G|&Ug@ILjR8ZtTAih3*$PL6G}B=bVPC9jCgyJ z1S#?W?N2P|TBzS;=64RFrp*3W8kOSxgo(^MiLEY*{17cDX>w)bu?QKY5mn~}&J91& zBg3uiM4JZ~h_$R#hSeLkUM&X#Dp#wo*B3P+Rx8yfa`}y&mx^6X(Hq3FEVH|Ra(dEJ z21V7$w3RYR3U`!M#7wRlNh2O*cOM7znEffR?@}o`G=(XKOOwbQT-Znl`C;f5tw+otgL%0)FvmNCveEuEhC>Jd$aPfk8F8BR2Gs`#7iNq zDx#$_IpxL5b6u*HB61)`np-`TSbQ>e63&dR!cKvxtlmyitYChw&b^!^EY?@m;?pe< zqJ5c*?Q0dF#cD~Bp4X{KKsFc6G|@<1ChU|A^sJdXGOL*iRK>hwKP_B{cj7#s{nl~N zUg-FH7MlCWgI*Zy;e`u3b9-;+yYF@s0#piPE*LJl*GTjB#X??LaW!<6H0d(=o|%mN zRIcQvWub)^#$V<#WoIXOnx&x4g=TOaLCrymFDJFP%5#3jY4b|=L=*Y*WA>OWX2!}D zk9RF&X?mx`6fx#zI{{w!%n@*5Q>$Xy5S8p5UU+TF#4J6q2)2EDy!Txc#nm=R|D(!T z-8(=!i|fL>698vEUr-kbfIKULY&Siwv*v(%>|i>5!?%sd-^X#@8LHt<)&^3*MU_9D zAXva)Z#Wtpz7mt+Bl}b~{tazBn~{{5>$&3{3l+M^8$37fe)Y`gDLXYBZ;GLC6;Cc@ zviaU2tTOdKzXrWd?-kV$^J^R*WI7O>V4Lg1$(p@!Ozye@U0W280SUYoRaL1^_Si+! zy?(df-Rlnby8S(8?qhUA1(u*4qINigZBeV~J8j2nM+DlWt=cjm#cAwB8%^4#CtlqV zmlC~oN5Gpp-rY{t>IMQ$RXw?WrfOs1XcIx#Ou!i z2uusjqhr|&XMuWk64=_aS&` z!w}**JL2Zc0zksiUVt1AY&MY5VuJq+O%e}RER*y9)wbkmU6);qjZSP$;7c($f6C~)FuZI7K^lf>)4StFEwHL zB_qLXphv<2ny|o-^`I>{%3n^zUf>%~=2l<~Aqt-mx4F3VtM5TxN&^3JBtxNQ?XZg} z^*(DQ+#R{sWuU*4dN+;qwtRX5=uSlCdbWtftzV^+Z@b#S?J(nRnC<~s&h@WEt)c33 z)~(;&tk6>_!@Wk}{VSeb`K?>ttE-MCCY-1$HnzM2RUNHOx+_J^rAHLa7XRy~_bm37 zhZ)jb9a3VFnlhpF)Wf+X73EwNwu}NZNC%uq7$tsk{!<&(9iX=4A_DjRiZjKi5_n;%7*W^R+?-O= zhOVEBggqKP&h-^6#Sgxh(d6>Ej{+k8-HXd8SH$w)LvwlrZn~X8ztiWBf|;qE6@@t~ zwT$Me83>n7%U6^Sdd+@zQK~-GuCoXt>>9>1)ab&CG!sri%1dQKbYh#Mqh@;Fx@4EJ z=)x$SeM;U-wIe0+$!e==<;1cowX8-JrE<*A;4cR&Bc~&ME&^egPj@V}KUo&~qjtYU zzW6uwATyxT)@#Tt*fNpD=Jd9@wG_N^iRzye&WgPsS(*p31h3Sez zPHRDj3scDqjF-+F%KV(VZfa&y+YU`VN>AAd!ZL7yD((8i*$)gLfU0UEMug#X;hN-9 zA~u7l?;qXv;cx%`avppMzRbVOcEQWJ2E@YpjHC2Ei@DHZMWGYD>Wk z9V;yd1Z}E1j?&#geLWqLHgx6?EvSJ(ISJmLe|mdzeEIgYBTj{1KfUKJA2d}4 z;+bY7bDmmh10L5SY2nd4IqVS!$fR~$8BN2|%K>MSN>+7n%3B}{>}ITv@AQ(tV)sbP zT_)A_zkYhJa3Bz4L6H_uE@v7H6~*g$kZfNQQ^kNlUIiAyn1~8A(P&CpXA-M0;7W9S zBd{ze)*;o~oqoKa*NzTP!J^pgV}=8s!Bo%EM$HpGORK8#S&>>bV2Zq%>DlD6%T6xQ zWCnrWiZo?!Mbgzz?^)~_S1ZyeyIbr~&OiyWjIFE-oJmQ59CGz1=dVgl20zm4hUmh0 z5y}V&xVV{UwPbr^ZxqoD*@# zIYK_rFfWu~#}sn!92c??VkiVOowx*JCNKFQ-jTLWGbUl`w zoANo9gOXZ}80hl3qGGJlHVe)DMF`unqCNc@v_d+|CTaConY21R?Q@g6Iwf~?m~uNW zyGNVk)oV;%O-`ajAjl77-du=v70$8~6`GD0woT7&M?|&RQtHyIj&zKSYj_`}&5B0C zc>Bk~bfaJBKpX*s{u@1p)B<<}jE{)VE;LGXo~?cm_%x%pg}fldq#H{N#x26vE;8+4 zkFYHAzqX*?X7t+%{n)^;au>ANNmNQ3rnz}{aSd;U!}WK{i*);nFPR(w0P61Ws~4D| z6HFZDsC|k)qEL*PEJ%f!q_#Oz-wc51`@;H0_04#zq5r{;H@(g|vg2*jZpNNg^I{qxe8OsvE&Y1~9M=wkt_g?(+?x(?j-H-hj*7f`DyPr>wuhD<~ z{mlLOuw&f^mtFY=SwF~w&OMeGsVo1oNHaQf2^5HVJcQDj?~h^k>k5c?A-#7xD!w zRyws{Vzzc!4j^`kqb!kQ-_o!#EmdGHiOpML@9l8WQh(Z!oiP}*9DorRoKK$2?XCLv1jt?~XGEdIS zJb`u;VMD=OVv9tv&(TWx&+3bOMYh?Z5i;SQn$L6j&_w9UL{XkAlu$RISsMF7V4!cBv) z0%4(Px1-qghXphIeAfJk-#+Ac6SDCTS0!cQC_lef{>+4-vzIAK{& zgIM)Ejxq@GB2otPOxZm2=HC=WxoUciq1`LyN0DI=Dk*25dUlIHMf?A123>MSc0%7> zwvPP$-yaS}1AYJZyWRev+5emPJUs0E2yUGD5z9{DxR6{&U(d;~STlG8e%yO}+@Yo3 z-uc2LtV&Q6a76*dT}&p8$3Sl&@tFK5rKK4 zipj!t@4+7n)8(mOeV;i1?EDQf;vEzjkV0<66zYmNUHCAsanx38eH{&hu_;|+Hhd98?vH?*(Wp3B3*OYtJdcMzzHKpnJd zqhz#IcXWNo@%IE0=&-D>Sgx+wE<>F$WG z?8?;?uPxC@)=MtyC_)5JkU%%78E9VNtQ6HFb;|adzJuW;>Mf5h1jfG`z_>ERnJ5^; zm&Bo@oSCUJ^^@@OWGYo2`dzYptTbg}rtinBdfZv4J-$C8S6z8L3dD!hmjsj0U*VV9 zl=9Lg+IV;<8XR&fPEznq9JbNqsO)u|GX^>}rCy3Ak-o?UQTpnOxCHXY0)@1vGl-p# zIqR#%#Mmh%_ySiiG^u@*AS(j2jhhgv3MD$++Q%$r z?O%yPL6alHTTcKu;FI7!ijJ3hwe;CWs&6E;TCd}6nah9JY zMRuq>PZj28Rf#HXvg)3s+9pSp3|5>TO;Rd3K{@Z#K1G@kv|FkP%S}^hid7~mOky`J zIZvu=QF5BHUs-|CB_*m(x&Tzmq?9F?H77eXTNMv6j5Ik+kZs;i5 z_9&j3DsL<_A3H=qrN?tnRw<$=PcVe(OJ?%{c z7>S`Xw82`5#5#sw84v2Q5AS?(v&5U7gsfJSor2^P1J+ zK^VNOFhtP^lK~3x0+NkDH&M+4%~ns=E_=1iF5AuFF+AVn5-i5I$E&dyW)8^VDg9o3 zJSD2E#CDd2GqZ47%#i z3JJALPc4I7Tm7xC{^r43^|yign>YfM--r52xOP1IEC7b%QP52zdPkETCO}^STB|E9 z0X`h*>wtDftyo(ET1he_T1kEC)0d9yTnXkMtrsE<(w;>aJ8hw9v7rw=>J3kQQ&|?S z2xF5wS5!JS$kP*9(+948kQu%x)@qdnCR>%Yx{^O@3v3ZUOjmW*GAlp*`W|^nldy>9 zbEeWKOeJcwXk65aJa!qIuP6j_P17VIiN2lb87wOq0X&LY|3?X;G!U)TjNO9fWrZiN(pN1j>rUF~W+KmL{>6YOD0|1?q`T z1m5u8hrdjy5IZ;hf3N}jjbh19sK4+dwY0W@V$|bqML<78X(=`^V$DPcXZ8YmYFEpx z{1o~Bs^$jmOXuF4m-GlO@c-?12XX)3!EnFd`2TL=lV>s$_zBcCA&M>H=N-9%GH`Y3 zc7M~`VX;Q4m(-3LXe4)RkxN0UR}|moQV&?#qd^HU*ij>$c))ZezX;9DxAX8&B*zF3 z62i!c803XunBvu-by$hXV@+0r^in(?GG9(s$(bU9KFn={@`b_!Q|=xy+7|){n#gx) z2f-)t`jjkfUU34 z&pJo)Xm#j`3Q$8m!Q&%Mul7AB9{snS15qw(#sS{BAmR^lf_=( zTQ|Z(FTZicJJQ`$(&8xSm1xm-Vx$yE?+QGLzoXHrG=+hB0}q5+pz6d4Dw%UusZA`J zmZN9ThN({~j8B}_gvx;uvxcZ_cZ?9{$3Q*mQVc*@(j>ksioh|LgA@3VRoD^^F(;x*UP!zgfPDax5TNcQLSg}1R^+VBhMzW9NQD5Qdrw^ZBr7DaY;|fL{@qHRBA%=t&PWB)1QC#C0y$QE+Tel0q9#M?$c?O}LB+NNIxP5y+Q{D?(Hhb0%hD`ijgV$^xtdd0SqjdIEI$7u~! zo>y;WjOeOOTm&Y;)(1 z_X(Qz{RPhh=-_yt=7A31`d0A*5NZhy}~!zd0xt6dV#TRM%9j;20^C!otb?#WlQd z(RdHl(=dOPaxWqJE_i%o7*mA87ckx*LeGlhOMS~nUnTx8ylX1({y!D-|NZW;8{_}| z;X&j7y^&9mYi%jVEyYos9uG2ZJ8RF17iGc7P1rb_`!1A;-!E9&FiS#-zTl2d@xzBB z0#<`v~k78?Z*3mj&NAES+s0{C${E4CJ%bmn0oY@ zx=1c(&XwyTD77d8rMX%oWXnw7IpY!bgyL#}`4L%O=pu##P_c?6jDTL1D&Uk*=B8l* zkU?dF5l2!;myERSvSwjNwsRFhCymI4gq$*ca}{LCQvKjBeL$ot(uO$t@B=Mw zxy)QR>WA}>_`52LNjWbQWSCMqNd*9JF&{&$F{^X#!<=kx6CN zDyIo3xc`s#hjIPyaMb93H}hHP{x5hO#Gm+jD5EY&DPC1^ppZyYAw*Ys24S2)tZC(&t`ovJJ6pN5 z=Cr^IIzS6AbX>8v=;_%8`c)jz+vuuyd@1v(gQW>eD-0NsQJhGQS$eD#!BoAA1LZzm zDnUu2g%Vz^?EUyfB-gwG8ax{jOSO%ddW}ynl0{P!jMFPg=s^I;)P>}{TA~F)6;LRL zr#CeH@(w_TBB1o!spF(QkZJ(-Q7-7QO2~7mO_YnblV0!?%}vMCg>?Nk2GkpwXqk2^ z)2XK1(LlL-8d&wN21?)8Qb#!YWZc^d*NpnfyuX3D~M#fLH zcBg2ul&mDFEy!bvo4tRQ8;u zihvIl1e1=@auCv)XqsRZ!$(%Gg6HKlQI-E!_5J@-G5_xmhjIQ-uLKSM-@xZN^MCz? zNLQr4whq3(Mz7=8C>~ezrOtVMjV{POc5WOOPN97SCZ-#ZbKyIlPSZjda@+$D-up1< zr~nPjhVX+#(ELF>fpb5+KXtHt;A2FN2x!YEOa(8$+UVB1HL-nseipq%)=CgUFZ?U5 z@x(QqIr(*lg772Dr581sJUlx;(I1?jokkDv!aELr4ItMHeFx4Vrul-x8H_McK!`|5 zmX-!16h;FS05br$&~-bM0J(u3fge5*vd7;24^;Q`-tiW9qJqnr6Y!M|%pjoX6f|`= zvI#K^!6Ix>^5p3h~i<4UP!y*W2aW5|eKOq#p zb6gnQ2O*q`8GiQXdDTy)^S^rNH~kcy|ASsXuKyc!2hI7viO++Yd^1M?*aa^=R5tc& z5x}>1P7pdC2WsApAKk@K-ElMe(T%jxBNO^A!?7(KLYfFH zDyv&eD6^3cHt9=LrLaqzni1z60V2w5WNGv)PRU?|jpbTpm1|EC?Yxy!q6+0KE2^!q zqB6CV4%-)NmY%_&iP?XmPsQ_}xj5Gw|35q!B;)`08~^`}e4fDeldEUQmJ{gG``VSb z%(Kj$w0V-fY`+G+7e9#Pv(TOJzjao*judr*50nmuj=iuHx}u=5qO6r9vO=CbL5_pe zot*;}_3rGvaQgH&D~^OnNOX1{%bIj{UVbE0A}h^{i%k2C>6)Gu4TS!zcr=nUR%pZp zwbXv13WQ{H)L&y^xt3$&!Z4rwnuKF4B^CECO7_XifU6Rf5or||Ct|G_`gC7nb24!( zrtT~rMnACXP{pC#zH#~&2;N|a3T=Hiayg(Q5%^O_~v zE?0F_R@R46h%DqDfyk?hVoScjCnsSJw z3_wnxsO&`8@<_=|A z#SK#G>z5C+S^10vg>Il4glQl;dr)Yq%%l`?pZ$ymGAsw07au$Gi^XK(+yP@RgSjQagEYk3 zy*UiAV+BST0a~<{z4HlD{_l8GsZC7$P!9C1ki0xz_N!(2j1k7k7UOtZ%Qq9JHZY+b z5gai~sn)QlhDCj)EUIBH>t!zAj$6qx_y3yl9|s5f!vy~0u-DxGH}R?C{+|QrSTFu! z0g7UxIUB|xOl*((FbLbFKnP=9C7e?Co&n!1m|$Hng4#-~hVYmD>XHb5I>DF^3i;@M zD8=Pdp{bHJ6}dj-J6Zsc>TFTDj--o4W*5@>0}`~ z6v3b`r{vMP2>(d$V#3RU?^@N@BKD&0U7^;K02}l(Ncf4@V?Gw~wkEtP;tE4h4Tz^M zCjkxOF$m2NP8Mze!&p0fWVh2p844ItW~Fg98@UIhO>@j4AVZ`rlKpYK-_3kdjVj8i{1JI@M>__@5ikowzs+y?J2A!@pQtqdwWJSP3dhYN z6lc9U+l^h_<1dTC>F!~frQ?Gb;coJ;*RO&$on|_wV&*to`=;*fb$*uT|K+^^ithj9 z?->4Pui^ij`K*)wZ{Fx1@$@IQ_eTv$nCxR5Fwa^q7+jXcKIT=vDvCpN3W~p$asf#1 z;AX7<>Y-lV@L$2YZzw0ak!7P#9NzgyX55yPXNxL$wVYiegGeb0RKdIH^(U-0dp9QD z!wZi?3Iu!l-AQ*e-V4c#ag#wtLu#;cl%|}>qm^yo$e>xqwo$%?skV)bw(&p9pZ~O^ z={r=-S;-l&==@LOKkW|>8vpN&d{WMTGSSDrb3v#1IZ6Sh@31xc^m2gOl!PRp5A^oQ z1J#fIydEV5fY{kt%OR0++T{*&DF={B6!MSWTvDYD;7Sxyqrr%H5@^01>`9fT)^N;L zq+h|CAeZuzM{a4FdF=$6pNO#1n9D48%j{S=UocIk>YDv9K60aKveCz5KX+?q3VP?2issSoKjek#g;7V<)j zTo>ZDa0-!JJW~WL(*Gaq$ML@odX4|bW(4;hXiS*7@5sKILRR?wpp#`*vL=%CU6Z{$-m|CbmeTWLFfk~1KZgg1EztY~Xq zl|8S3g_2XNKC&{~S9&!TCSjAMWet|DfCNHTgd`@>$RMug4ERE8{`-=6zyQLUzMa4GV>H zvjql*nj8+wbaylE2YH--d)*OAEtk@UlFF3U;VZCgFH2isN>j?U3c)`L@gb@Sdo+s$ z2=SswzY}XMH2{I#U5vMjSrYK1k_WE5PYo(i5grD|BgNLYz>NiUuC$$u5)|Fy(_><{Aczk|_!ga5UW zPlo)zz40H4_kSG%but1(KHes^9BI(p4F1Rp1rc*5_9idBd`L(Z!DLikYIB3@`^XKq zu(hmoeU0VxDuuBmXcTIVzKSrG<@tYY@gKupKW_gS^&0=r&3x9$|DQ;CvlRg#N=s7J zGhcNCNO}i1sDjz95D@L~&Odf4Yg?+vf~-@&vTRUE!Mmkyrz!9AasN=ywX{kF74M_j zq*Gd50De`TUQU+5)Mcy)bzjFSF4v2iv>J6s6lKs{L32@0MA1`AG|i{Vr=t81L(4AV z@vDD|^gq2M{#$>)@&Db(Cqw>!8(Mbi1%Uss)n2}2k=7)^b5hE+ojlacIry@FS%?P@B(FewN|?RSf_|{D0I-;6EMo_8b1ciO*8}{~37suHy`d*$C+K zZ88$%soQfnbwx$HMoCw(r`%8yXH!MDPOY|LoqT%nD$bj7wkvvSwx8$0wgUezZ2&0J z{|^WIasB^bFlhMyCO)h1|L5-I$+!A8SPFPkQcVSEL;iKy3Q~HQZ2a1c1(M@$hqa*0 zNmyCITIS^q+6mH{Q`%6F_i~Z9Wf2{oy~Lmnk5$|tOLnrNPhVLQW&91(Xffx_=r!TY zS)v*7SF@T>ObFsI)(ZZlTsso4FFP35@LngxACziF;^jzuWZz5RYou?|bbO5>Ygihs znhY7`NLRFEq!C@glu<;kv1Ra2Mfsod*{TMBLjC_iBLC~C-{}80^2w0@&&fQe3ijfc zt+oKrWm=PHE@;JF_t^6-F#*J9WrH>VR&`?pc%Gl7_H`#B2cTI|SBY1ju966|Dd|sX{YA@_edj2hi&)HUwmpujrm1&HLAC4OoT$ zmo)$s@c+SJKau}o)cF5z=Cd0Af9@6lvA?&$1R&ayY6D0e^{>kakk-Wwh73fke!I;8 zsVkwh9iY_P8#Dx@wx_fuAouOkaNMa>7$Cw1VGwiyqf8TPQsdJloRK%FbH>E)R8^JdZYpfo>y zzf=_FjH_C@oKR6epRBo9N1yXfWw>R1SAMP9`uabsp8sWR07d@)gM|Oj{-DwSZ{}0a z`TyMQ04n#`23vsIo>Y54<_vsYHi4{eZqP2EA1vE#8^~N0rR@WyDQwV2klCivc7j3* zb$~P%%X%5$%$cowMxe~aolga0&RK4o0b$N;K*d0fN_6zlfLy~*Cf%BhKNaX#Gyr8% zUcm@die_U7s`9BO|GO}(4*yvo|M$BG2XX(;QLo?Fe>U>TkpEp6K38Ghh2eHc@vI@K z;yW4M`UUs)(0ng~|~xEfAM@x7foZg-B`HwZywi zHGs|Mr89?U5k{h=@~})(QmH(wKjC?<=vUiiWQIJ1`8AS}FE_R|31_7!R}{-qXs#fT z6;NBfZPu}U;{;5JT#XO-W;iF%385m!Ochoa%DEL+&Xj%E+%LcFo!Q*d zYQ3c;FKptA68Xd8K+8LQw$s*#d>521vsi$L*|uk;pgH}*_?U;af}3>ZBF zy!22AUc$K_R(*YUSC9Tl5$LP>k&?j_gIpmh>qR8l?z5_+bw!3#Ulos!blLJ~CcXz@ z$QSV!5TgGRAg`2o{M4MR`7HCPeEtV*vYyy|suukJUUx7^;C~Ez&H2BP&yweV#0;ag z085DgvV8I3T}wy+Z-laHt40T;ophZPl}6s!n4X71Gjx#0^%=^82vZ@Z%_vJS78RhK zJL*ZCf0{8|)m79fO-b^XLeOH4`I_bquU6-2;2l`=5Zt%sri0fsYFe$7O$M1%ndow?i)j9bPwiBh)0 zLJM`vfT$^MU8qPRTN$5ws^8HSg)gyb!87|52BG7rCmH+X6pO~at?;#9D{R;t;vJ2m z+9E|{ShbFjJ)`<}5z4*XXj&MWWLJot@(KE`W0^thn2A&s3omqBa`7+2p)seno6SYr zI^<&kH!XGeGj`hMmB%Vjd7H1bqKH!|-L$YG9&q}~?``BmY=+Q2I_w^HQ<&9@CAn1r zbE0?-nM|e(Zz$G`G#jzvMl3Y4=StNs#NpiZ%&CHW6x&P3N*QeznaLljNF`d`%ZeyE zk!9tTY$|mNFIr8ji7y(d@&b(Zn)+o$AtpuYFg@FaKe2KDKr6B7VhWadm&N63(rHxQX;El98ITM0n9IF3rN7tUd(`G(Q3g%ihf*s)KR)y^pb9twdqqjIt1wW%5I ze}OX(AZ$YnLL`0+XHEbnjtjxW!9fTxG;J_Ju8VFRZwg$;yFS_x-C$jax7$MV`NDI; z`@I=-=WT0d;xO0?F@&t;{6YHmnVHu0&X0Q(SM))E=U!4IR<3sfN3SEz%ZcfmW5;zu z2L_%0T#O+v)cMJgt;qyyq;4al*cPj4hm+vBIVMS6 zFRX*b=(^zLY_iYTA{!Iio>ViPeta@hELT!LJpA*)xVmyYe-Q@8(La7`8CO>r{;_Z{ zUwiA-=V;s>-YRi~+cGe^CBHlv7IIzF527l?16w}vO^=KUDQ&ur z8Jr*&Vbb)+mN7PQR5O{;_t2Y$Gvlb&W#6Itvk+8`Bjbhgt!3CSu(0EkF)@w|Yk@Ht z`v8UjP1vXhAP5nLHgG%;&Y*UmGg`*Paa}qj0um9(>@j`z4Y_#}gkv`{te>NU> z!T27$l;uRJmg5DX=~-}>EEa_4q;p2-%;6R5oY69bulqaG3K3Qo$~#g1;X#mje58Xk zA)C`UHXeU#8R3lVFyz{NdrgAB3rokQ8ncwt@Bv1XOd*-{~mFtWy?F=OT*-m+kVjsp{8DloG<{q<=i6&`M8*KxiHo@2kySkskmzo~<#3q}A)$DS2~M}ANn ze_xf>Z;!vl_c;4@7D8+?#;iX6gl;35nb5gplfrtQJax%~3+G?t;cVZK1C7xwUHaQ7 zAr~A&9txd_WAO`RKxFBaPoiOS5|uxRDF2!A#aa4Ds_i7w=6^YU+yY7$UVk=TC|~oq zwNk9L3C?{<7euAwN*|qx>A1@t*3V^--qAkRce<(lJOUpzZgT-W8+>ZcyJvBoam^5V z);&2&)^TQxnlocFXNKr{xkF>-1RaLy*#abeaulRBWIZZn{X0sR1N$Mp1*sLFYr z7^`40-_$_mj?&&|Z;94ZIKQoEe{C~-d;>AzhtU+DtV`Gcrwhq0pO2_fpP;dg*J@1| zEV^Bj6U~~zxykLs#!+ubPO*DR$~N&edBL2L5!9`+bLYcw|Zcv4HsAI5K>-DrtG^ zk-w+#&NwonVNi%MsgIdK#V{wkp){T}IY-iyz2QdBV>c3lLKjBih$Tl*{2NS4$mBU0AL-o@x3K^-TSr z&qn9R&&H#6(r$Rv$>~8)nxh9}LeELVL$~eTj2?FEo59QYj&)706c3_-^6aOab42)1 zkJ|m2^}jbaTE>X{uSfqs=+eIl=|1^i&o=l8eHD$Y`T{MwPm9tQ`a}AE+h`dFHYI2q zq67az_W(isz?do92w)I5IA05L~?fg)jnoqW~_v zfi7Txk_zUc#00sbg z?tRD5F9WQhx;f&BnibhC3?|y&8b|$M%ebRMeNQAu={m}FKywpc+vt`m>ZvDDudnMs z=naQU`1FeOsCnV`R`J5MOlu}^XyuIzxd^{8t?Ma93(r;wALV)Af7d@ew1)en zCDXC_vOhRzfnNWx1%}-g=yqNmk~`0L_HbwpOmZX0wJTZ9oZdGE@mc*D-GaI4-2-kd z0cZlqzMx2zFUKgHv16ai?JagfxC$=mFCUZXt%Y;`QL()3+vO z5CZ6-#dP)`sv?tDNTdTY&E{fCuTyjLj*m#M+okF;{srLGEJi ziJO1I^d`@aE4~Ac%p22jnNWE@=-LlA5RYGfHcZ$3Y_x#oE`ku^*Po3S{LjzE<0`uP zT(@OIy>2V*0xt($dl&o}93FPMT{<@@`gS=EjOzuCH+5kUnsRw56a0!2p-<%mBi}eO zUdQKFsFdXN(gz>eDmHJX#(J&g`CM&b%>cw0VK83UQy2m#04|(_z(weqTwu%)pallq z&f#JAd!WuWm@Z6gdLe|te?(UGZb?_HYD{HCD?2x&C^nAgYGbeNA^d7d8+)(Y1wVq9 zwd{A$W(%m>?XKh#L{}B={PTS%clEX^oy7g92mlaQ}WIn6% zat}VC+uEIEzX}1?v=u4#{n^E3>!-JuUyi)7f(jei|A_ z#&@IrM3{MaBLZf)0x844`;ZU%xG}(EubW8*F zS0gKKm;G}kaseGBxDYenA7L|uqj@P7w4z@<-3g%10AR|lF5aJkHu%JM=d%!<RkDgNDy;Od&8>QXwF? zn&4!saW?Ym>;L&|j5?icJ_q(dy|u1~pDKwG*TPe&hT@rV)Fsse-Atxh3&E%0tK3x{ zH~|$*X+(xEBQmIYkE~9|n=(%Og>qUGOr0C($+cCHp}uMu>ee$<&VXddO$sXuTy$mg z7y%J;ag+?!S^LFx157SI6k=Q1+}9Qh(P&YtX;G=UUlEnhf4R8)a{lY(m-FMxlb^qw zzJ34p^6gioQ$1{Ss*O%{8J#NKC{L?Y{Ttn@jaD_z&PwvIb?I1p-9}bzl&nvoWX4Z{Hsy3el=>=>WsHmrE9O(Fy5_K64a#s6s&H;YS;C0*tMu6R4&^nUcYk1D_NgZ z@tVPUSJcAx`VEKOdJbE^8g_km-AypPMiKkXDPq^fn5(eL%7I2TvP!Y2zZqV+zq~Zc z5W;Q|zW!qY7x2ooZGk}YJEDOAf_*ZeFNUi{0l>tUOxBo#H_F~*U_ABViat>2vRXMQ z!q?z0WMsgxorfd3t&FrH_-D4iHEd~lwq!#;oHZOt=SZhyP@We% z3TC85wJ@X=No@^FsvOsn%97Ym>%3D&_TJ~pkI4PKR)AuV!l^jFid`=ShVG^~SPQst z_nEM<_Y8#gnK82Fg8IBKs7)-;<{0mANxti2WWgY~!jO!W7hcWb9O3(`@qGw`6kb}5 zm2O|=y$`f|&x;Y#xu}g9u1;-h~`#WN43j_gywb|{KVQ0+HIp{Fb*Ij<(Z-baxCO&(aYTy==XXp z&>xLjptl=c(~gyu_HQhebD-Y4_?#GzdKL;+&3ckh6k0CzdHEI+9tQu=@>o zV|q4Il@(iNGZd4I@Tz*rey(1UjMgC?tzKUltzMLiU};AeGSzR%{#GCSH^iu3PZ)OH zl9jUur!cVO%#?7I5%=*d{pQ^9E~rkCtf?$zXG{tCw93!^vf58Fd{;IMte3%J{?ei5 z7b5zZjtB9T2g6&0udgt)pmPJ6nU|Yl(yq)cEm3jj->Jn#+((aIU>G2GLH1fA<8T$% zm|lwJR1%7*PT4?^p<2x(!}s|oa=@SoctZvPd}7057iSml*Qi&Oef%}>GHi5@`;#EaBedBVJkcOwtPqZjE*Xkx!rwz zw|ZaWlL}5TB0~OlcKD~YOzw8~`RC>P{816f*3dI4W)*kL-g`AZFkg)a{eAnu+@JI& z-C=(??C$Rm_Fq~12j*l?ak=7mM8})9r3BgbksbU8!qYSRb?@J}zsBo9H~6<36Gz2f zzqq=xAiqwFkyJ&~l0(S_m*1X~;*Y9TTHK{aYEdeJlq#3o*4AI?Yv}Qtq8^(!)30iZ zPgd#hvz+47RTj0FVxOHA&!o$5YuU%otIzN1oMxMe1ka@FKh-+j&#Ui0$MvyQ^{*G9 z87>sFJ!_O62h7@~7}L24zsQy@l~em=LWZBxjNOZ}T{Q-qZ`EM4RkF^u*=vN>r?F#y zOLpvDl(eehiw$4ghAYwYV2q6+yFT8y4)@E15u+YpoMMr<7o}@jtAA-^o%z`bLJmc; zoPTLef$wFHAbq_0N-mlbM-acNEOP?!KgkLV(-LH@18J>a{&Z2(U~TOY6IRL-vz?0M zZ98DNjIFb(%^fH!2IFtbA+nw9t>05JzBKIZ8)R>d04+r2hQZa~?zy7IcFHsc~~7X?8Z3u-~&ATMZ} zp53+=zUx?K2-~K0?V(#2+EX}(UKs4rSf+29M^hHDqfw!yKEffydrlB6V6fNg_6Oh5 zzb!N;d#OF_zUuW~4faP3KTqYpZ|}mZ%aikqdyjLbnwa|1$Ha4G>|_~dFn48jH>|w| z*1ir+^jnO{F;ScoMW$xpnGP_z6`MDfE#*}m*;3+3F3d%UhQ2@4&dRpmyT!SpQZEvFtmOb;`ZG1%qhg#Nr3Y6{|vi>{(da~&whW@ZSwzY;**vC zCo#QE5}+mt(B_i>sXafDYw`oQZ%pfYiqXQeRYC~!E0g+&O2Xgu4-c*3K55BxY`*Ld4qBks zKWu?vw*|VLSBK=T@SQyzngi1)K{6+i;&Yt6gl0; zFe*d;P86YS{9yWAQOa*>48()$20rc`%S#*i;qf=A#ixJZYnN*6AE@<6OPe+5wLq`; zss(zl4$0E$y`tLhg?dYNJgB_GUg>vRpm#VRg_XrZZe(O0Pbi|lxSl3$1dBPjEvI_c zfanh0PI8ma#$yHTd;yGRTn}$3m%(5CoNVHeQao_HsSAV9l&eRXzgKkr=u%4m(ivbK7D@L)F~X;uUBXv{h-?cd$$yt1{~UJcgLtAW<5HyiKOa4o$WYP~wyc&|ol>D5T< z)#+-d^?xqL5FDSMflsXOjlychLwh^4?FY>vxUoa<)!MEnDZFVzSCkgGftb8{{>#N> z-i?J6Yk>uJ>$sy3V)Rb3z;2yal5<2D8)tC*QUVSS!x{JsANl9S@oEZ8-vWH4Z|!pO zs?i!ff349Lu;riLK7X$K6Kt4r!<4sxDIYe%^44pNe2gp@1Xmc6vGT&JIh-SW&p_pu zbY^P1n6FN4TdwB4Zo_W2p50J6Pw*VeUr4cT6<@dt z=D_V^K_}H1eM-uxuH`js=6e0PDB zscpjrFa=p=SO>C918cECSPKQbqF!u^^thbzI2KC+rexq)tUOCGs3Cqrm4KaLJhbfi zEf?(+X%RO(tPMO!9y~}C(+zk~w*&_{=)*4Tj>d2@>K-1#(WE;(9Ct?(+Zy%{p*?KC zLF)J{i~j*b%g#pp&_4zEAEVxA5X1i%3=R$&{Etn1GVnjh^p-~aAcflwqW^M$46?1A z@g9|9*#A4OGY*jF!LR}IXuv$+Tf#rS2K)}P=o`e22C;)4h)Il&Y!nU~1{QXFb`hn^ z2n6QbcOm$RH44a40Jly!1Lx}PE5h(#a<&fPk&4){6i!FHo*8teGwS*~>iT!adSE*k zSjTYG0;3`OuiK$e9XTi-^rum`1$qbl79j6-JBJ6m1*jhJ?m>(ZmMwY$%nu6lp*hB| zadd)@@K#a#H6R|X@L?diJ9ryZlzwbXCg4-SMSe1wZ`q39{w=_HJepdiIwy zkIG)|mtQ^e#&le=;=d5q{2m3tms4okWL3Srvmmsgy`}+WEzKQQZBVpmnrK{Cg71&! zRk4xGgHI7|d9*!~Nd3#%O|~yYqYg94hM4ZK*D&1-rn_v4kj1<*yCp>(i|`^MDzF#* zap!MlXw72GYV6p~RS;rm&WS7n+8|zG8P2zSg{9aLr2{VLOF>m;6fyZ>jLFwDtnZ;2 zz)cQoi3&>%E2XpSu)a}-brl|eY=zE^+KT7K>0{iP$k$J85YIMjf6DS$uA%~1`XI5P z<;V;+iTgz?`V! zP*vHF2AsYD^k%8>oD7b=3TugKse`9ji}}Je3A0*1Pm#XAD>IUk1f&^z{bHiNn+IRj zZtksfH}lLq%fxTd?QT24_0_HEUQL2~&&rJ7O6>g1n5zh~hlgCHGKi8a;cv(90c}`9 z(^anBg%V$tQ5u`pHT3K&3(e)*DN~a$7Q9-O%?b0Cr%j17$~{rbL(D%1eF$r^(-!B^@d{AbS)F3`VroO z%+S$|T*S(7kP+t~{f2{NaFD@r8ofx?;92lRWIa{8U}!<-2HI>-XQ+oV0;no7niE`yP1W!p>!K&QOGQobkorGqz@rpUb={7{jbhF&LPBQM2*a5u7PhP+te_Pr(+uR zScmo-4zgAbvXroqHl-AOt|}7Y^wfwjSqx~u z76!y!QGASi6qs&sHKD$VRTxkyzH-hhpuUd_3=__e#jPpjU7AkDho0?t(`7xxW#i8o z9dOCpQ_y-|ZHD`1id$?t8D@LRcA=_aR!(RYB_}1;9t{g)3+_CSw_o8nR z)Ok&gwB{rPqN>KpYFp&oZlz`98@#9WfVVERSa|3;#NgDt&*FfY?aDZrR$(iJEqvx|=6PJGmqk#k#D}13 zvp{V!*gW`~4!pGpLb6mI9v@o!oPAr+Kd@Z-f+tRtncWr_r_8G6~i>Lp?ARo zSLAJxh}=0=$*+VLN-!7FC5XdIu}ftbX&Se57gNWRKvc#-XV@7SHFD7yJ zkg3W<3(vj^vEyIy@TTg%St?gvUim;<0!T{$=RbL>&D>_M#-u;NX#}m5ub)V^d2_tF zPGq_lFJ@*i`%idp92sc*JG8>1!~Q5mn^<4AyVNT8)o{BS7(eZ!6G(;@aWeAlJ-iWw zA5+yPDVTHvF@+}>1;Na8u(EMevFa$~OLdew4Z=W#11k@=9IH-r!^g;0IzYcx!m&%k zbg77CSM_zM0IuwA0TNz%q&fw1D@17PZv>%@BBW(Qw0RK&`ijxoD7=k;WV8B{A?)=n zd$NBxf#buGWtzjDIWl|WVSivBs*r5`-lzd(+y2k8_;37qn~3!{4!q67g3HH$>-YMD zQ4IfWbkN&x@ZUD^$-sY$Pj6`~IAtjzpO8d24z0#u*XE|@OkfboCDxWp>=aHMj{+bB zbXhfkao;Fl+;hf-i|?QYBd)=SOB|YI@#4tE*m1)%kKSOkdq%r0@#5NTqh+w2F74k+ z(gDXpo(6Z-ZGnET*8=^~s0Dhv(e3J3Sx)~3j$MdDY8j&2m^EwegaZ7`46WI*cdzJm zq!=#lSA3?Fo4@jmh^+Z=c2rGpDU=Z0<}v8L8np~30(0-}4|=1~@NhWlAM9(oG{xwj zn>Hd-lgUxlglZ1)`=QY_bnS~&Hk)IrB!OH}Bf<6P;7>7xUUYw?SM^r(Glt6L@>Tco zw>0&st|T2%CF#DRBke{B;1z8lt%55QSp|G>`7;wk(`XsLFM`mS+>3{c5Roe#cAyvX zu@(<8v=Z@;Ip)#ZwwphvBvK1O!Np4tju|6iX)3q(dNDQlO z9ZExxP*}1WZ71+u^FB75+q!7E35xuqEZbgJTeras-Turl7o{ntIv*p4y?y0)6I6CR zY>ZL8Ax#5k-h^zb5Sw1WRNGu#^*{%OY5Iao^p5Q*b%-9xWY9tgPfd@3a3~`P@2H6N z=APj~J{Xr&HOD%|&t3Lqj7`s)iErc*YC4`6_?9t6QWwP@M3O##;3GTI;N3V;Su(et z4e#QOIFK#q^`iQRTIH{pFvE0US}XQjQLYOj#{G`Q^t4vmb;uhXGI5Z|>VzV&xvok_lXyJurx!XT_^WS!N zLD8A_@SwD3$&_5>?4+O0FVd59ZM_AwH#$(wkr@85dYDLRHLq&3dU7jG1+(W@!u`0Y zk<0#u4g1@yp9<9*Ng<;QfKU~-$URgt@2DEX%nqk<;qET@5%h{UCe1K^&gOvSm{&Mv zt6FzQ-L3ELsGHT@H+kKy+N)qOU#Uw!f*#nbJeKT4U7_Bh(L26@n5Ddp+~sRNR$1S` zdozTdm676m>yOxeudAMY^L3oB{a)`$y^3NUM1yXYr%);Hpa8newNacyBB$j|+d?>m zcUoFY`7oYDg~x_6_f+;JH8Y{^)WSz4&7Y;Bml1s^RKwX`N5Qq@|BBsW|}=u&>mcUrQg9X9T~lT=hl$DO5SBs*7Rbagk5=#4pj zA|BG6jB?s3Iltq&RP}1l9k2a68n^#yVu#$K+suRLvC>3JzLe#lv|K*Uvh!~oQ^8AY zmKRr7rt22?rd69}HBxt-b6t=Yw8DhP5`U)5x+t+NQ=j3Hw!cKq(5en-HM@@q)8sG0 z3NBp9_Q$Xryc&JD)_leqkFiaEmi7O-eie{o7~0%NC$Elt|F6-odl2{k8t(T8jsMps zKFt3M9NRXu!QAu~rt99ffMt4M47pR4EnTiUpmA-gHy0+^L#JNwRiwgHctYdt)Ob6o zN5nI8bV~J6(i3(bE9p5W2!n72!3o*SA1?s;kA*g{%$*D0roOc-_A8*}xzGc8or6yI z-#Y-1ySfdKr%{UP7~g~OVrJfVa*}`c`lG>Nn!A+hB-I@p9KITMNBf6^$Vuvf4w`Xf zz&n;-jC#t(Vk!uyd*hm(v=&K_J=WTegQCIX?=P@x92vslRxAexQO!{WFqUQY^)&>q zrsdmwQtyO(V*+b(S`h84n19$d+f+9m4BPK?>j{SCYuPw5L~K1*to0vjG{3UYSH7RF z$bUjHO!dGT-T*K4*=S`NSVwcAOZPDf(JnyvvzJ#*uxbs(IS9)~-2zGy#7w>-Ms`1u z=(H9sbpT${A=oWeQ}>@-O)ZDoFNE*vW`Y(}l)YngW&5_b8{4*R+qP|1Y}-i%729To z72CFrifvYK=URL1)AoDLd2hS-%V_iKoTJS#`tyH&y>~wkS-Iv%0^p|mea)eFPuQ4F zLvlfT@ty)l2~bVWiK?+>!xUpwoKVA%CT3fm0q2;E&UUYEzHZ2X?-HCp+l;3s8jiO8 znH_4N)tdLFW|TBOG4FPD#Lad3oU_xiOgUz}#ItaRH<-51Vl-Xe1x8IfYjK7r zCu!5}*DcYHvc{b48gW+igI97t6A{q1nlA;JP}c)IUpzC_G(Tbfptp`5Ua)DkiH` z+ya`E&1_6WV59Ku3}BVRF3&-FVAmXE`xRxxxd?~V=6a~EojhdQ^&5(|7EQ}q^NNm_ zW|TS6%l!Q`x#vGHv{wBiQQg}@$!xfdCk{qt1WYH2DXkb>W%253W$@~Mta;H(+A=D^}#m^e@!R~G;69hdN)z08*x7E&_1etQ%~%yUHl}^`mn?5O_e=a zb=+jZOQWT@*S^Yc7_8a)-L*$m$D-OEx zCFb(GXva?LJl{}34jbsvm-owu#wxIl=^pnoLESj}`D^wzE_P70!0>_u&>}yWu2UhW zM9+~}?JY)bmQ&Y`Wq!-x3FT_3xen_vqbx1KqmjwCrG+tJMlw6YaFdU|0XNoJ)Oqn? zzC2B_Ao%KVH+%APw6p@>?KLjBMQ7|xUST25zBkbC*qqtiZbCF_YIq4UaZ%i+3cJ`g ze7My=I1Lr%-v$P`1oOCwPd{7sW9z3q4|dSF%n<1C27<1y0gLZ&n`&6EBd0dX2$c>Z+e)`_{c4FuSlSXr-eXfhQ6-g zA&Ly}zI*}#*lcflIB$(#c6bGa5ly0$WmmCYh~2ycj09nrG;O!tOBJ|uV=#dS0S#>@ zVfe69&&iLWz9N`=U8^D+Sy{0yoSgg?AR$UMznb+d%I=a)fbMzApgaM~mJd)8-v3Ic zzJFc#y*h7jHG6zMspfN^@;Z+sN>!(x9Vw8zCthVrw@}J@JaQ^j5Thh=Q9yHG@)Ahi zUlQyHBbKrj zSJ-t}%rUJZmHw$V-9W%+_52wdZ=Uvu`~cE};|W!td(U{pn1{T0J#AL{aA_uk$xr$= z$&%PMXKw%Sx^djDJs)|~LIugiyER!1M49*p-5mr`H!_O66;=sfTd5C%f+iOQ@S88>UE2ztYFq zds6N)WE&k0SOW!K5bx?(47-|1QA1(1!OwsEeD{^`z{jyZ2-iQul#@l^xTO3%pU^$z z4w#ThXJqS{uC~pcXQi*XuWDS1mQ^29+Iv4cVtv6&Pd)vW{OZCkiE1(4q$b&Y3P&#n zdwRW@$8E#j%N_&D4fA}}jCXBqR4#2qg~0SupdVF29|dOydfB#mG9>=sGdGP@#(e&^ z2eQa@oT6eyi)QBu?`Wy572z6vz(dxqnq;V)f%&^touN>&t5e;Tvs0bnNU%g|7cIiW z(0GFbG)qnqS|vC{O+PrfoX9+*nVQ%dr0`Q%ngsalJ5VJta3vQ|Nf1jIntOLc!jGBzr6Gc@`rXz0+*mP!omgnkOcc*3P`;!@ zWYE~(*}GZ+V#3s3vAiOU*3ykASk+IS$*8bZ2SN6Kq{OT38G@Oo*2?k{O}b8N1$QF` zJ0)@62D#9t{HJRPk=a&pj(7anzC^nTo6rm_+=JL_mp5D370th|VW2TDk&u>ZY;3OO z{MG@0 zG(md(c-{$M>0ULEm^m!rq7NjS`quUS9p=B8o#xFt0;pZmM zG%B?0Ss3KHP&&QqYa#7)c%|C@;y>;~>3*wR!@tlF7(|GNWVG8LkRU6t0Q0V1R; zr6F%;cs88BW#7UJB?6BlQB-p-wKAKm=m1w8&=Fz4ow3KL`s*WLR1tYnl1Q;9=GyUSmmO;*7hISa0ZUyQIbQ}rguf?T7zr4V3iio*}z>tgR5&c5>@ zljOp{m7RXc-uS1h#7q2!z!vjxX46NUQ{8P~^>h6rjuPtBea_saQ5w93Sl+qX?^yFK z{Fl1s*p~a}TV3aOJ{+*Z)vT$tu633AjhY_xn6-$~l@4rOxo_qNf}(i6@8eR4JObD{ z)<*CBCq-&X_QJv$bycg@GWKDoP?cqTI<#`Z#+&>z_aDh}Rt14jiF&0MZA@5zKT_qp zi+aRx*Qu#PLY)`z@24Igud456X_3C~qZA-Ai0W{b3Ps@5{!!MYkuJ^n%rGnp=!76i zFxMg?`D{y4sz3g^Os!8!UFVyeI&WzvAyWlt;w}AN3p-beai~V zPD{nLYD@U*Lfvp!sst0aweH-E#@S@yGF^bpR&**awSqq!s+Q(#hOEnvUifJ?C%&GWK+UD&TA7z`u zqfEv|TsIpRMr&j6MG`N)8C7JM1M81<`oyBgt9w)lEi!AFSJi>S-+749U=l7(k0?K2 z$ol1(B;e}h7Z09Bpi*uC0}7h$hz_fK4*G~eG?B4UN3$KtPlr8mCPEE= zkO1tdgB-LRc;W+zM#(B^xDcha$fxRnLJ(e16jXt1b{lythCy%A+RGpib;9Od)OVE$ zQhG8abj@AaUlsYmhA1G)%caQ86xIzrrea$785(1VcC!I;l5c6HLLR%%d|*F(%TC4~ zKrnlSo+&_=RF;IEm+pH~Y;~`7JuIq0aZqMxFOVt_KX&_@Q--;(p$}u~ zmybiDz5Jpa=*ag0Y$C26Xg+fxQz7I4TNODGa!TxE+lz=H5k( zuLVZ%)IG}i`9-lGHPli%IPJq!rYZIz*>S%7nRO-yKcxpd@2kT{)0#j^Dl+6Dg(7lB zn@E1}YUZAWZta32xxBZHN8kA^9{xFTA2BG7VOy|@Q~`}MhYXU)B?g~LOh8SQyfhNR%7nt zP~`RzxnZw%^#1g|5kk|FMjue^;kQ8}Kx3b(+~c7U_1I<^%1aXef?lfu2X*#86`)Q% zg-qV9Z+?}Ap4Aj#0EIWQL=ILaDCx#Fq#~_!&@eTjSz!v?H7$m)*wmm<+g~LY{q6EL zgX9$_qv^zNTVxa}l1C59a!<|3$0laDcD8#@zl6mLs?*cpf9tX{38cbLsc%r&WKr~L z%IEJ5as;GiIpA-8(g*BnG{gyCELv+K6tFll%laOLuM;#jSIE-nNT`E;5RYygc&p{- z4KjL%j1^~dP%YZ+>-`qe8)P2_;cZSX^BQ?7wech1x7oprwwUO;P#k@+%85P5uYD}= znFZf+`J14RN94%lPtX;nY{Gaeg-8{E+BTcj$Y|uW;Wb*9J#cE8iC! z-v3or#*&vfGw3r%qX})DTv1;(E)4&wu5fGJpfRB%ZX;*aOp$s`+E^WFQC?Zuj06AH zQ(39{#i>*6{gJV3S!w-isRr<*wyxf)S;+%-BLsu`0P>z$+?>fI$R=WB@v0Kc?h-{< zb4&n+vJUKF_;zi$hF(PE_+j64))z583nyVL_>drJCVT*fj=!Hl5~j!FE>)GB~rGu#twmi5GW7~n1H=N-GPBj-KU7qn;XQ3w0kmQ zWcFrcqyq&fH-iYo%^3*XO!scYBWjc}t^Z7i1A*J`+T&)sQD6!Yw}jkq(I60Pu&W7* zNWARwIrPrX7W}rghN!M|gmjy&H{3X_w+ytE7D$R+t|yH7BtHQscc2MneH%@4J^Atm z1!18RMb{N5IDrRrf|VcIg?$p^zI1vGxweCe}#ua(qDPd*no_?9qYmJF!_nNoq`jOISN^kf9c~wVRQCv?w0EwXgtI zVJpf+l~pW2BxJ-JLjW4I3qpbq%EkOjO(s&u$sTAgzzCY(q3hWCIEOjUdN{ z41_b=18VchK1tNSQbv@d4GS)LQ)>?4*=7dvrcP=?;1?IR>SPh0)xJa(Az(kSG*A6i zD1K7Q$IWXnGN_YBw;%t*Ap=s{b?^b=JFejvcc56=+0GWv_6M@WLhY~^P#_d%bc_{? z?Tv5Fu8$MC;vS+p?MX|ZCG@JU#LuDrh&mX{#9Jt=&01t!QL+IB{{jmsXxZR_#B#4T zMU+&nOCx9*YNadqYBUGOK*Ky^x$#&y2_CQGYi?`DmsfZeZ7s+1QB! zMT6H!q$K?zr*J(b2}Avh+r(pWU^D|_-Q12?D0wk?CBJ0LhD#Sr(F}T7Zs{WM0dg-O zUJ+ju_Og5F->S`^t5yX`e39r&#LSu3*@l87mUZg-4@y3{Y2u4;3r!@V2i|=TuuO?2 zS{H>(k*Ql?oNk;KVFGw4mh<(f;>ZaDCUM`G&A35SwM9oWA?F~1L+Pt@iLUs#jqBjnKZy<<-(vHy__x|FkSBS$m)3| z^A1f2Nxl#oBrgUhEYd*J6=v#4+sn{ZK$Iy^>h@-T-&f z;yWl+Q6V^YE9C{v!)?wvkvM&@b0^Oz*ivh45xvilc=JU7+>|#W}v?+RoC)3 zu?btbt>9R^bF4BLL{~k@k6s(6C&6?&%-Rbq905u@hEDC>|E5THBK!>yd zD_xhJIipp6E?9aOA&p;7%orb7ViaePqfz*ju-AkuvfqKEoTVCP;(G;{T z$zI$PjFukRPMJ>{37tzwq^XA8|&o`wy_;*sm8VD)n1>(|q*4(*rW zq(R2JBE?tI*cXT5XPS4^|8Mqc`yH)Lf0^6r!CG!ctJ7d#d6F z{+5$5AC*WBp-31PWaQ?fVaNWyB9^@ZFhS*B2l%0jdQn2sATWWwAjMKOI;@*1tbBqx z4-1}w+_>P#K{M?sY9$2&R}7rq3hx=#^)`v*GA2qZ&Y>QO>=V#$kCzA3|53kZY27URC2CQ zUdcm(>TEL%BE|`%kS8P1-V8+6qA*a~PFyc_Be1O!W zajzo!1H(GMbo*)`9A?SAYOc~F({lD|~-ty7MV zu|&(S7@LS3331Y2a@+3K@5fWr`{n2Uiq3gJZ&(DW{^=dyncxNZS30Z$mJz5zRPv#5fZ=9Tupc&vv;wq)8TiJgbZ?2ps&Q>O#4jJcK?USYWAR{~o7Z)~|XipivulN;Fy)bD}MtfV{5 z^LA1tYXpUA81*%)>#XWGESum^+S)$_ZR`lb6U61Vu!-y$b4d(``n3J>gr;9=w@BK4 zUkm)P4y7v8AmwHk%kWv`b(YGg5=u)~A#$<~W;Xe*RH#A3&EA_;JIU=lsB6NB3iZ4x zvbX(dMy+h)n~l>*HyfP`)jY{5E$c}guZ3PuGep1~N~=8Ko{a;-z!{nig~V_xn_#Ks zX)K$Xg#>D?v5KJxW|P|CFWpLAbCdE-RXD6}ki6>W)NXM(_j?>NrJI=!xnQI4SAzI@ zN~w^`-(dA3#)DsHk?*4_$@t|{m0StYUYq+>ZMFf}3Rl$%0H|yqTy+EA`!|WhA-%-&zt`kIJVgVX=Qin>cQS5YF z*_HxuX+S2if}&^_7cZ{@XLo*Tbq_As!G>j|`Ktd0s&%)qQRs;xFGeh2me5uORH5+J zaio^-pStH@vn>(;bBVZ)wV&BEr5;U@PrNh=V2#B*>|!GAdy0E)@A z8_k2)2QQrv8~&6U6QS$aO|Xd27}qH;1Q@^!?y1_+qWHB?+m&Eo?tRxhw222$nHw$g zk7BSBTH>@I2&P7;KB_pCofvI${%_yR2Gweef%-h*k+qO4313J-9+n6If(*p`*|8iQGXB*?Hql*}s%}30{afwVjzWp*X)^D9 ztwEb`XJkn;>q+K&H$&^n^p)JmNigjN+~l6mN$wg|pcvd~Zjc%7b#NIaQV^EX5lbZ= zKVJf$P#9l)lW3MB{{l3G(Cap1z%_0DAbA!zy#_>qxv~=kpCIJ;1&&HDCz5ADQHVxP zH~VGWo{^D1xQw=OTzG5B#F<4d9Mb`R%cl;v{*UIq@ z<9Z^p1xG*$^SpwSbChxt_Ghgg3HLUV3FoX(ipy5X?#SgX+&7_ewWh;(o99w>&_E+d zpi#DQXDq|L@J5wW`S{F!71oc7jDM~kRU5d&-}2cqeb?JmUyZH|i=bbVGp{A(IQA!9|6LvsF)_$81v4(8m9@PMnsjJ51!>>_yVR++Scu zv3c-)8qc6b;0X1Wp8k7&cMr=_JFa~Z#@%)}yXyRb5uC2hg(h1=jkdP;lrcS{QD=+r zlo}_pcMV!-xr4K}+?H=@iSv*O6qE{OnoXiPjdq3fb`eEJia292ONORxK<{?WDV&eM zZ*rt%{KHK2)#w7XBlfO}La1bdO03zp_h9ne{CDmtlTwQ8)j)!%Y6 zQ%O$D8f-GLyC<=q=4i7tWA)fB_c0!(vOy$koDD`_la_cC$7Kiw{Q0)wP+>FvFD2U( zhVUgl_e_Hgf%&tAyYW8qxL94qp}ECR-AXmg_+FcJqh&&EVLFJcOyej4Cm50K44ucd z(eu|K(7Be^a546PFxsAD_>+XO##26RDEZ!~gc-$BA2TdO{HF z&y&El_V5t211mv*00N86kLg7*tr=l*>F1myw--&jO6fygUW1kUJ!HKikf}?YujC^f zZHpCDHA15^KZzZsYlNZiDVbQJdNC6%Q=W#p5cv6Ptl`$zk_j(ng$js_OptmRX%hTuu z!pqh6?hwf9;lVlytQCp%XW!u!?3_*j+hsx}C4|4aYE&gPO*zDYbTH2-4&Qza1J*>E zQ72^7L{acDtrbw0Ul9Eu!!>V@Di8(xQ8?*Aey=~~tI4vH^6!u5F$U{!(YCC79Qcvn zPk%)jE2q~pW4Kt;WkLIl539rZUvjH!GDGm2hS437O@$izNP}y@Jxv`zXJx@$#KVE^ zbb)QE``=Y%8P+@tfVo*h&`t;$!{bs(HKnq+7=-st3)3F z%m;>H^Qy}Ya>s{NJg|g^hNNA2Obie~-=S5#f|ogfSH6Y|$NGtyf-ykfdPgA)L`RHR zC8;(}Y+9sJ=c4_BRCI$Ak@CfcU^d{$Xv{@R6tnG7Qln@l0Kx=H_)5j36e%4W+L@sk zRyFu&y$}x$sTZ_YoCkE12__0W$G#xn#Q{ZMvM>qh1WnczC6^<#OsW}{OaxuMHCijh zBo2v$;KQ)c@>bbZXPA{wE;HFEQ*#+~B_gtA zx_j!pFH$aSyC6~&JtBcY#0@}%ENHk9jT6S)^e9K!`Aoc@re(#MTt*#>!L}grvKzP z#Et58kemw_i#>l~QqLk=OmJiI-uf8omCF}9!?eOVfQM|T zrq1q@k%VDPQZ}qw6+*P4ll{Qg_fM{8%c=_kIF|{NgI3wWj?2XgcigLtFKNGMi+i*ktNBM^m8 zLqU)l_)TWiJRca2UW949Xpz%Y13PAo0Gm0*221FMc|McXo)$IJ^&*k@mixovd#7Yc zRVzWWGLuNbOe%23YceJQPGPOB+s$jLbqv0KwV`&;i<8?opo-ii21ez(Uvuxw1cLm) zEFS+s(TNJRIqhg5vyUGN28c}J%0-D1Dm}< z#f-4uEfX6G@P7#J3blxUb~T{je-649Uk(cbQsl>Ug~WFGBN!^wu4!luI3rk|xfC9D z!JBXxY&_9e#Ghk?$&)`BFZACahsl=9V96imD7~p$)R`^e^WxxaW}=z)~ppurWl(wJ0ts|WdVfs*`<}WV|SHCC^yoJ=+C__Mp$4+KBJ_rZpV)E5TLGJ_UX{5Q$5UDJ*T$xtxDg)dSFRTW-g`tt%$m8z&U)}jj) zg|)Np^aq-+Ni<(i_51m|7nG1jGeQJVOn<`yQj8oSoE&UW(CI5M5u_(mZ)zB!oCOr! zLfd(+xS#1q=2c9r9k1);Zat4ks{XR%EbMzFu8u}ijluGae|azqWX^GM&t&UBnCo9u z!0?|`U_|r}6$rTjsGtbs#v%h02p=@LjuUh+fs5zk1IUM`U7{w85H(%^lALhud6bk3 zjvp-f%SRf+PMp4KJR5n+;HxJ`rfiV&)C8UVMp|NQUaK4UgjB&j6~>fS5q9wf;l*@{EUK({J**yAf10)jrZTK zMxXS5cQu%Qxtf^_|L2$($S(vtn;cNtGld)Y^w^+mAT|IZ9Nj@T0qrK8{U;*W|APqH z9)BSMBxL^okTt;|f6JOSl|8+`WQ`p_*2qErBWq6EedEZGR={`0J2wLOsJn7cTa9}U z=Lo7@OuZ8Z)T2%-1_ToJU;~CmX#!*Ou9jM}PLK4`Vq;JZpnk0-r@o<&W>% z%Q}qX2xQXNJwJ&VxSyQVH5zGVH8FkONpNuw;w^A6xVJxKe`$I$)XvY9%I&G*XqQwQ z=vB&KG+j(t+;B6|FGM7$IA~B#@bj;DC_TwrSQ0xU32@_IT!o0Fiiqip3@Q-yBVLN_ zqlymNs?!DI@I1v6s=H;u;_a71r2$ORk4#cRZw1RFiFSWW#?~gOS!7L(?*3*w2#yS6 z6p_L3`0&v9U?C{_dXG(@eppx87cQI^OPQC|HR7-$sL!AuhD#}kqQ`-_CB49 zni2^j2e_NVk8f-iD{)Xbwp$niGomVASF?c{C!GQnKjAW9A<4Rv!In(e&ZmE8U4?he zMu-Np^0*gjae^olk*;nj<+mU#3tIa3ago@DtjktSCNKz+u8T z?6bO9Od9$Pu%lah?UD*G+<2%Pd+<>i1o_%pSJkK@)4s*D6~h+U$U77pgtFE_6K2g|8)h?;H)Ih4T30qz_j9Ht5rpoW<(Ba__7Y;rdu>j{X@1 z=`|t?l~TL$K6p?4ZEzfwR=jIRzKksB>Eg88LGMtjhVP=xI4>biWAT-<-Ih5H%Akt9 znUdkK5VOUBWbL4y#Z4h~b94T9_6;AB%>!VgIbedGTc%1GwOeL~AS|ANRae?|Bvrz;*qPnF=h`{UrB5%j{p2(AQ9_s~sMPdSGN?zuos29y}Hrk;9F7I}3HRhQiL z@fUG&Bn(#yw%hemfp2ZIUU!h=8zY zcF>Kj#7QVo2ZF?=Jz_Y`F&~NbhAdAu`mw(%>4zTUm9la;Y^&f`=hYS~ zTHw0EV!S(mH+WQR9>J|;FmbVcNq@KetxUGawXlo#J(8(5xp!~6(a(q2@XgF3U{Q2! zT6Gcec%c%Wk>uRto$wiYZ9S68jL1@hEGerJkZ6&rfuyJ7G@3G3gcW?ZPSv2IxXu=m zq6AT8BWdm{ql?8-ge^yEBCC3nkxnvd9lk=oIOo()tsv^`Hde&sLIUk zES^=CI&;C((ZR@$Hav<9f>KRoM%JO?nTpupX_PPu`Z&d@u~<2{rKt$dhWOfSS0n6(@!ehQRCumjQ%K$&-D>bR0`N47Us3ImV%aQ7^FT*yjd1G136Iws{snKT+ zX73Qh>-3Ps&#;)h)P-njd&%LT+`>2I;UF1I3T#N4eIawa@)*z*r~EZ80%?Wd7(K;6>u$K zabK}7`E8>c_5+U}94pDVNadJjK*D^r91b_dxQNA8?aV|`7*iL{_~T}LS&un#Xs(eU zCg%^#7n*EbCTU?kmyBA_Q8G|y>RvHrjRBIF^7wWq>9KRA#BS8Wa%guSOT;wo7wY|m zc~J=u)Dwq>a9vz98xjHbz9i1nsD-Wd@0Zdbe^YM=fe(-3qSZuu6X#`HLse$Qm;r-X z*7(}A_u1U=*+fWCHpqT_G^B?sufJpxi}%BBe~iH^(1T&-$Kg9)8p{*tHCn#Hty3BB z(j*0lp?BW6C}@;_Gd37F=|EYrp)B>S&RA2z`{XE)f8}R`H=%NLQR21<#Xz?F<+q;n z-_er-M86Qx=>POOvowSnyFib!m>p7VE%f^`q5TjiEt5MUO5#Ri%@}~^I4XA1N^o+3 zw8Cpf`-Oi=#onY})l$0ur7l1Gb$tjJa3N@M{S@-`Po71Lb_Dfbd6x4G zg{ogRaCmrP6+m)j7dlFkJ3)R&&`^A#S~IVh_bW3{XC5p`y{RnFc*?mz-LYngKpA94 zeGoiZ#6~%IKo{8^(lCK-L0@ujG|m@2spURW0e0r}^wtuJH6`9^r$s!*3+-;Bp>B0S z-q9vt%hB*moYXMlxu2lD3MhGw!U|PCRYega>}Nzm^3mvj!6J1PS-0F59~!)eME|h2 zr5->u10yJ`;`v3uYMu0s)TJ1p$a{O&(=rY?*Ndf;?(sgqD0Q7+NWv3)b3b*Z{e}1Q zp|u)1>Tq6Ovs5C!0@=(OECXk+Sd|p5GfK9~tD-;xmR(8J;n`R;%(`RAa*0=-&GOlz zvh}BO7kQ#T>6&J$tM(Bh9ioH}50>4~q1U)-(i}Cx1)iYvmFs!gPnW-S!3Nch+!p1) zm`rNR1C&IS$kLYOGF+*uodvgIL|L|GD@t(_+ro>TRBt)WDCEaR>~z@47x8o0RT<(%vDh?^+mkq^ zM9%ubnQeyK9!ePATiy0FV`Kv@(n0?br8E=ySbvLBB=R)W6fkVIg9Wk|AW*Oypg}7L z2O?3g0;qU#`R+iVQ?L*bKzy~q_y4q{9^HRiQU}hmutq|uKYbv7gd?*BD&m~1j4`$% zFY3pD7e#=%y>CG+XTthU4y#oT^Qw5*uH*@Q))Y(k1Ng7!&XS#E+8K{q5V%u>kewTHvPIdJc>%r8|W1qG{K$>%ndsedq8fVz4s4o zm?G61w81!f)_k#L1z-n{Tet@@TE}T*zW0zndssoNidrs^ETeA_#G`c}&l4$~FqJKT zQ&zZp*U#rKz?xIKkKqCd6YFx1MniI|XH>G2RYC_QE9x59|TF zTl!v4c7!1dWH=>YOy=^|vq=Nfpe`ke-ljQe*@o#;1=~p78n%x1MDg9G;Vz5lh6aB~ z0nhLlazN@kef%c=zdWq1vdwVLCIiuy^x?NU5*no|s4&cSb8lziU5$1(*-m}Z7cCKc zr?4BgtkO`YVDf*PKP#P(vNxsnDBvz$XH+~ClzH_lZYm-FHIAOlSdmiX27OqFQdY9} z201|^@K4fEe-)626r>3uP%NELy=1`(hhfa|?j0Br}tbuAX(rIb7ZnkUy8>Oh& zix&uEw^|Fw&lQO96YyAeJy9RsUi+^sPJ?4`A_!q)Y@Wqq-5kuMZE9 zz~Eaj@DJlM91W3U|1C>dsB*$EHqRcL@XjZHwGP&{cDHguXA=5C8KA`StGmwQln^UP zD~}<0Rx4oBYDO01#lmkd}v3x9$}TlV*Nnmpnqv3F`4^lIi5 zEJ~dm|HQM>J1Dzoeo=MxrX|bSFLm{tcf*BD`KFKm)Pgluk8iB`S0O+JghJODnSZnw zLQoIHmvtT^etC=%Q(~C`1v~H7(ysl{bl;=m_+H>>3W0uCUgW zAKMKo$PM)W+7tEv%?rx>mlw1JctJV~bitvZE7@LPEVY_^*gvJ_5EOT`V79N~DIVW^ z{X(}{>BYS%d-Kc@fL!5}`nTbJOCG2EM?&)g;yC|+^bdg-*iAu1;9USCG>qC}L**p) z+{NS9MujU)j__FWiWP?r~ib_)&|BIMY13nFB; z_T5uxv2=*!wip^oL`4Otd=Y}t^#b|U+*2^neBbM|o@aEW-*?Nw7_=d?4dwCRxp|=G zhl&5Y7~~HEh`~zB8-N&;`&$fVYpZ$$JM_B39f0Nc>6G+mDpElJ<#EicSSD@{>kvJg zw@0`Py5v8%e*T~%%qgVK7fTI*UbByXe7bkJfqw^}5xIWcAp9G0`xVc9Nk2F2@V@04 zQtZ!kl$gbXW@!pBRrkl{H;25*cL($BN5R}=G#gbNe3BR90l0acS3pElj9C29!zq<7 zC5N=84%Kt@j#A~+X^cCyqYdkP53=+pZDE*}4jo667MT~=7)ww-TxUh1gN)|u#D-4M zLZ=D}LVW=fL*1Ae(J`s&_j|%IuxLs=LLQ58IO5U5zV&lbZHc^+` z!)BPuIU8ncp-mGMzEJohuHm~7xEoVQwHW0p{kA4&4=QL>z~15WQ1>Hr-=+@Wz>!lC zbsPKJv@40|sIq0l8BLlF;M@?8?)4^B#iIA@FNr)slI{_-$J_7%u-?Ua;SaX z)xBTiAA>SP#8@2m3wxcr?2^pY+b9NgP+ef@2y0;K%(lYC3CObX;ieCwsK%p4brJTD ze*FxkPvw`4XIb6E77w41u|P}6Q3jG~7R*{MDC3R#TUSZF4wo$*?PEk+?seP{-G))g&oQ##q=$0Q?*@-h!lVq7AHKN zAo0^q)mR9vbHcBq0Wg`E5%gS5jxcy_h7%&wvMU&;>m>TR#WvBd zc4J5DBukRwDunn&oN_;P6P_A=;F}!Kp!b~smSz-asPt`Gl0Dz~%uC^+0Ye`0(9H6T zp9Typ(awWQvdJbB8E{RaEG4Iwo3@DQGc$+}QBc5KMdxEo*r$5`6(K_^3BUwYMsjKk zWLhfQibNo0b!u&}P)t3asX}a{CiOZlD8-5AuwvighO6L`gynS1m@VYz3cr7&1N5b_ zj6fGmYHvD{%4?UIkLy$|XVG=#Z76W6>RWC!w>?%$Nh@F^Ce^MS75{WHaMS=)HOYx- z;D?8g!xJhRr?gbEJGR|?hGpJQ;b*XbY$m*ekYL@7nsRg;! zaO;xT1c{yhRof^S%B(UXT>Mqrl#!n)7JmNIw=%81xT4Mk+{L3R}t z)Su*scK-3;uB3CUppphJm>}}Za85Y9HjD4+ngp<0~w#XFfCmiVVk%wmS={u8>Y@9NwM<8LPZG8eoMrcGdHBHX`SKxKl=7r}j^6-7kI2c_+{BEt7ZZ}59!et_#SiO?`|{$2q`zZszc&TR(C z_P=?Hc;Uaj1z?S`3Cq0uejXS0s|&_lJjbkQbU9kPY+~#WQzk*hqz(>Y`{sA{|GT%? z0gUrubQ5(R=Izx1`{9AJ09eijy#??U$2V*d#(}2R@re9@_w?zq`e#OAZeax*x-0?$ z_Fr$=kO67$D-Th^nK3GUz##rPr^ACiD>RLntbsU}IlT_nt(n}%+qt>2W?#3e`#9Sp z*Zpe&YEYUMDg=Kjn@P@8Kb05unu;A{<~QmyS316Vzn{{jq*=*;c9dM9|K5&*qRP0Z z_6Ff?6>T8nP|kj0*s$LWzn)(p2Ks_X0m7}c`pMMAeItL%vyCfotBZ9&J4W&K?8ynC z?igmr35WE8bSMR^e&aG|tQ2*zBVcSMHEjgbX^Z$)IXA~6rHO2dpfe?*U&S83Jdex1 zN*2wU2)%dz zs6P2BGDZkg@`-H7{AUsL*0XHOfjiSEp{kx$?cPCf#e8R{vakk*SQ->ffUCxGQRI2~ku>_%=#P`R$(`l}131 z3IU);<@N6#l{rnz4vf31_k@&yKdVkkj!#LTbrwX3U|1)lCveD6|B-|8gu*cjq=ywu zpGMLuby?w$ej9#c-@?Y-ZU$kNKj`+4$31zw2k-UlFM8_PnIe1~K7x zKA?6+;0Q9MwqS;ftW@mu(ORUJJxulO3_wp-?o=ZhH8W5^DmTz9vkuWiuSo)4(IYHdMh+C|<;PFrbTdeUH%lbDDU?edh<9cwkl3TLH%1XqDW|y-R zdNZ!Uz)IcE6FYxksGPjag`)u{aN24zz%w&J4YrX~ySPxDvva~#3OkukBaTc=Js>4N z>lB1W`hfXo-nLj-@Bq`Ms@-BG{>ei*gUlLLs~C?^4uS;ER2A_q>DMRuTo4aE>%87EA;O`VQ@+0P~XL-{;GpWMgAYI-Z?mv?t%V{ZQFJ- zv7Jmjv2EM7G0DW{#I|i`Vmz^JKAZQuyT97n|GK(wS66k_t?qm7IiG_m?Iig_-3>?2 zi2A1P&xzLb%UcR37nXz79mGdpiX>!{#xhmPAwJDWf-Z88)vEi|(Ys!w@N2uat0KfdEq_JSd^u;53P z89d4GWo8O$X*wlj%R_1$23x*ZBa1~$NiNt}Lt2}AVd4v`KP^^$QTVK3V$P0aFwke@ z3rKg3YaMrmgj+54a^WM!u9ee57a?O4SYXy_5M+pn^Wnd>GBA4>vzaikL>1|#5lyOC zoTZeumNM{Sqc@L5>alG!L)n>-A9jp9;6xk*`dMFuFQ?eF!kGAAuvwv?eW?(ApD^x7 za8!U<3-RbS<{hTskUeZb*1Eh7bb<=12Y3D$2}0%#Z&zmwt^67zK-CamTho zxZ&*7^u8P?IQ02o#MXgU0HSZp9`H@{_sF-a1|_?U8#^y zHFJIfo#o8`4!p1sQzD61=n(px5Zr`HqcWjL=bxvS2xKNe+MI|ofoOsKCtt}8ipqkR zDl8Ob+Y6fNy10Pbq5tyzHc&%(0pNV#qlaXal0fm#jrBkY>fqzt;;P5_UBEb>sBed^ z8u@}t*H92{x*@1ZDTwZl2(<)Vn`a*la>ua7vt}}woRPc}?_V7d&|VJKQL}AfC8=8D z`~ss9dsFQRLCAFb{jawlrh71p;2En@q&&3)1rEv&U)n#6Ziq6mGBEgjZ58kZ&S_!% zGBcPfR)Ep=BeaD~;x@dHwfTagQ1}O;#J6E4W0b0QU*}EG<)~e`ME%=Zjd4bZ{GrMr z9m*{Y&=Qm{Y1abQPESM=h4QV@8FADBHt&2^*nP4eO~tcr`#^WH&<31N19zsdnV54v ziy%MI@nW``TFbISu$MAyyxJBE(lMN6>Y5BdO7OJ;0N_iDJkyRmlkFj+af?z-{WfM^ zht>E;&I{pX>acftWMh=lxgoPoS<}<6K+LgxVVd(6+`}W}5 z=}6}2A+SWL2fKh@r>eb;tv!|;TZ1lvu2WWe6`!JtP`U@d+W6yP3oJMmmAQ-U)&e7v z>>I!t`qyoL@ZNaIdlw)ZJNLQ?c3qFT&gX_uTt-ta%)raf$gMiAdCgzHEh{@gD|Bnt zMT4~==Wjq5OBe(<`Wr@B_pCL$Z*(_iWZcpVmyy}E>0@?PxUt}_lC1&;n=T-wHf|rN z6?M)t|J7J~cniFgY%Gu;26C}iQ|<$wZ?!Riv#Xt-mI3&@M*GS5AYC2%#VJQ^vO;`v39uvV5=K$Cp5L6bMm_rhZW%7@8!Vf|_~QvB+rS_|np5hv;cBMJ#aJuR(Mw#8FydBUgEA;gwRI@}npGkPbRM?S#wT7hJ zrX!58+p}~#iEn)n{k^}`;BAv4Q=p;+`+Yq6oBbb)ae~dv>Tae=RKRy*?;rTXodV+Y zkkOM#mc9eS{fsf#Hf_?k1u@CLMFz@>fvE~%?(lE@v)nH{O$=ml1~VTWERey7S1F5;C6$Q)UH$l7I%da{+9qqO?{Sj&k$7$#=tr zxI%5tT<^iMYY~+jL6EqLz;*qeMgx zM0FOpJ{gO(C&~S_u2q2Os`;YKrRu1kTfdXNkCS;b7oqOtk#Qr^msT$3rT8jsl8MkKNa`ioF`YmlrIjkK1+xahcj?9Nm6_=N!pvkf{uv{eJQ^W5;lb zOFw@Z^4BKEiuP$TMGi9-Bp*%)%{(V+Hacq_KRgIS;(~ICNG&m<#>G-g<&bFX9~Q{( zkxsV9(9v=NoLb%C-ec{S)@byKGln3upwM4J%p4(iut!ol=s-uW>Vlbm#A1+YNs(o6 zOG_Sxgn(+hPD7@L63&Cf{Uk$Mjt5`1wsJ{b#+i*vNosRv(Z$d34~!sc@(Bo^gO!8- zvm{gI0=f*!A0kycL^@<^h6(-76d2ax5x$NNBB=_Qqrd`&suKz}cqy_w53)NX(p(yM zJhCrM!Vn*LY+RxB5UiE1V{Ew&JztYp*t*UBQ}IGgLrfqN?vZA zaE*nWXrRxomyU#_kwPz|x*f1N$HpT@#qSlF+*avI#YHU;xXX=k8zEJ4ksInNKTCs| z6a+dwI(Z>_Ij>oHS>%Rl0bC;78^sJynw$O-zN2>iim7X&#H=37d0U^=*)Cd!^zB11`UqZd$% zg@Q0)Hq@l8hjmWuI=|rfaPP?3iwWB&ckD@~6Sw_Gp{=UDA*^JBJv@<3|80E|vj`kO z3v7`gltfu15!+7cnHkBD5#m2|YL_&Gh%+_U8fb){5;!kC=EQagvYxGk;k%ho7un0j zzEwCD*A^#utd zU~_)Nyujv%?!C;Zh)0aWVKxw0#P6b88pJ#St)_!!NRdGB4kffQ$b0vh8vzrQoo_*o z?~@>)T^?YOnY35VzrAP#56PV(p#z@tQH_b@$y63-@$(`cBG(Tb8MBJ)VSbAxwdjfH zj|x9aN5?CIWw%+u4UNVlK#P>d!zOHyJl8@1w3w3h2U_A2qO{m1zAUw z5!t5kFirzy$|SEaBV-|Qm!?3siT~Rt7~C{~%^4t=#B@~6N+X;T-ysf}mV-pxfngN4aVf8{I<{4YnAWMdJ>M)gd-1Id1a3#?o7 z4;J1@nGE8NzWeBv(#PI?-uA;UleOWI22sG|dB8VOz}%dV!s4i%AAJJ&!LWJ)+ir;5(4}Q<5wT#;q`NBq1hi_IJjW# z{3};uG8tTxXQ^Gt9Q%^>6EcJIoIHsRm#Fo_OdEYj@Dt;vZfg8Lbd#y!LE=|bRI2S} zedZrR^FEss9J%V@fOpHUhz~()%HoH=2w%k~O2nk!VLz5DxN4GTyfcsQUDo&{BHpK$ zTiQ>|KlR_SBi9EgFR(+$>g^s7?P?cLyfa88`ZU6U!(N;?s46kCBIdZCOY&K{AWLEE zC8P)u51~ebwOz8A70PB%z`v4bvCI+lP*99ICT|*|OziV^W5+&_?3t|&_ z2p}IU^#Ab1XQbz7bjbmzC&29Xeq`DCV$O+?pz{C4qFDB`3^n>dOZZ8#n6@lE6i3rZ;GlLXK{>wo9lML|$zj=DI?$O8Pmat@6E=GS|9D z|F=oVn`j})DWKZBMrS5{SoFrW~t!BWCK&nFUVm%YAmfM)?YADubKO1_1&Xk5Rd zyL3>0Lv@7p13ZcN2BeD$9GVyhHx{B7_vU13|$r`DN%7g}^#5pTSiA7E6#d z%W?_gQ<~{es8QwBU_mjeH?#ZV@xrY3Sl6AyXYF71WQ_%LXRgay*4pIuRQtu{g_*-* zTD>*$Jm$fo=POj&iwOn)qUuDGSJsTFeD6u$n(oRDsignH4F54Sh~EwILA^6zkqNQq zYIlf866^WfdUg=qRGp)MvMvGs>fP{R(M`CQs}#eQrL=TSnenTf?3gwvG+`tVG+JZp zx)=E6^ZNOI_sH>G2VP_6;TIt4|Cd#?xc;1J8INWq*Gj9e57~5-M9A-n0jY-tCh?d; zFVjiW5Z=)g4{FQdh5fs`!-S0Ya|hI78gIr5So%N)j!7=h*U50e~oy0)jfb1XNk-Zfa47=feKtb|vn zYfHJ?o=$IR$!5f6+2()Czsi0^AYvA3H_qEOt;_43BS6V_XF8Yc4b+|@OfqqPg?H~N zj>ujHv|$fVcANoc1s*1%hO#0%|FbGF=Y2cXjN{{288h-5sBmBPpGuUh3Gu{^j7^kX z%iM!g=4KGl>HRRML*0*j#v!T(iRIln=T_FB@mQD4gh?l)Yn|&<>k9ObEh_rw3{p^g z*T7sL@$WVs5`RcoI>rr*f`m|vD?Ya)7HFr))i#^RT4KSU*pt&))05L3;b7U! zgZlrpKji?UYxxy!>Vb;g{E8Q;)^TiQ*WYi6R+)L%&l)Bdso1Ouru~=j%aU)tx#LljVZX95;vc+ijcmF z5Wt{Hpc|7yi?(_Prb8CdP*XOfbOqTa16M7fY-usDcs&>SQ#%I>;vCi3T2{GPW{h8b zj6YPpggd=`D4Pt)xno0gMi&uNlp-5~n+cr?CXLypQk~T>t1PKU zz8-03q3qf}6}ID{(h(cgxo8^~Ple@979Dv4=lexP)S|Qg&Vz?JOw$hxRyCOfE^94M zq6!p|upE(|%^OMG`xi6rfr*W@vh4Q)o5hKwER`14zonfz}5dM($n zAAbAY@~I6pq%+jojomHv9sTeP4vS;g!ArKa!U!Q|a{x4S1qqEJ0T0ANv-4d;5P|$N zRGw=NgOmQ<%WUg)9CJ|CMa!0dtJS;R%3IeR>sD-ob;f~GPA5y%FcF9+7oFH;oW>e#A#soOl&r=2}Y(LzD zgml$J(4<EX(8c{T>O=ijClary^*GY^` z2za)CYVdGjdUtwiAYM!xuJ~?Sd8tJF{o!UB-%CDq%jJS4w5=P^C?;@}9Z-9f1RWub zGh#mW*6RH?%)&OjE5MlAWmCSV*EpU-Dp!a#nWu-Z-!xvxUhrrKE$9M(OK6k!DbiVe zp1Ev|+bp72x$+*Oecv$OVcYs3flEmK%Ic#n<;__PE%wGLC@~}Zn2x5~`uqBqwT*}G z?;Rr~+46AIK(ClP=aH$9XR-F1=C_BH{go{clI6kC22{D4iV;8Xd=vMG6HJ%)sc$9q26gb0&o&&0B3 zbSKY91nPzI%h2rg<)7}1tY0at`qpmo#0MoB8&8h@*sN?n1Q9b9`0a_n*}0%!73g;Z zi39Gyi zWDI+>UK+(y7$j}R2~SfzC{EXWhVYXa%G|&#VsOUOJo{xRg#0Pewm(M^4jbe&Z)fou zy(;LpZ(Ptfesl2Us7@qgv>X$nbi? zB&s(3!>d)IpkAJ=cIK{A!Zb0Ss#c5#)_!e-#N`DRGI=+hH< zI0!Nxkg;=Qjm_HctK~0YrBgNct6D;Yjtxsud(QWa9)Lm%up8fu_@XbKN zhAK6Cb8Yd6B3Nu{56`Nh9BPfzp;R|gJY)V@BsA4>5z1-ReIB8e#RvTzucP~(kQIF^ z1&{*f`dc#hYg5sU?E^HT_3?7l+G85*C*M}_Y!*?5MN%C^_9%C#$(@G~s_IA`YZv4z z(sLu@o;i}JD87LqEkFYcdsA)C&bNj5IB37{}~a>1QgnB;;$DRC;s?AK^ZoGGyp z3Y&`n&1VP#cH7uDJ3DWdvd#{1^*g`+dUWs3HiRKZHjTYaKJVdhV)Nh1XOZo+h18Q? z(TH1D6~|vOg2rsZB$YM`?H^pEb+VF+!#gN~_tjiDuvB|per7c+EUhX3ndl4O2LOeH z>M09#7DIXAB}vu$uS7bzwR#K2Bi2HScIOa2HCdWlt)OKBJf%VgA!wp9ip=%j*tLKk zZ1oSB9%}fY2SP+6!|kHGYYba=*v9+&x$XKHua+m9xriEwqxrS zSw1^+qkIT9T`zFHN||8cAA0$`wwc)b0jE)JZduw{HjBOBLZ4*K1EW=#SJF%9*pEag z1wYuHkODS5>m0e$BP-FM;4jnqaNSdst!I8Sqt$u**`jXh55bLf#0f+j%y$ts+6*^H zHh>b$2*U285|)i{LQ1b>yqCO2l!LDyf)UvHK-Q3F9#C6e_h5Fw%+w^a|M6x{3IJEi z1(u4Df7Qen@E)~FfCC%Bw0Xe{gJWcHBvG$ z8pw}|@|WQWX`qJTDdZQ$04_vFJpO>NgQg03v>q z?O0>X9=^)ItAT;Fk?#rm^n1Xp#}-~p;LZ{r&&>N@W}86!y)Uz_-q`27 z$mcYtFSZ#V3}%|nZS4fsF7ej;ow^rM_fC$=Lh+fbD(MT#y|&1BzW z5yqk^paVg77Q3y-z;xRM;oTpadT_Fn_9P zJW}*XBQ|0-_A>NDPd?IGa?7CK$E~rM9oz9k(R}YW)Py0~en}jnE0TYL~fF7+TD*Z+1Te_w?k z8=maWU20jPBq}U!j{Hn;<1$4~Xv$ghp5pB)PB_L@%b4b=klR9R)#u!%zPBqmQ^r(r zE5B{7v6ryo>1`HBpNGd;^Y6I9Niq`fl>=LE%oui2yIisrCV~YB+^yc_o)_RgSGSM$ za9}@OK5q6{ye}IxwGZE2BKNCe+EFG`2O&IpzRqZ z&2edMc75~RHdt?IG)kj(-oJ<1n!_h!qvW!=9kz`@E{%w-ZZ0+1cuc%@ST(h8jiFHi z2hD)w^Sxb5$%3oZ^>DAzpN`~dw-C-1{F2P&-IzR==$_(fymNh|^LMQ%a%f3b7H>0Q zq5N_;&B~Ua2fta!A=ZLgd_=c)90V^x;8U-(Ua-$hQba8`+!?R4^sWTn2tO87AJC^yeQr%R+i2#;q(9TV&@n9j$z_Ej=G;H;q?))s$4S!F3G%| z#mjVq{aq$mCZ*ZG{qUu--Kl0?&XW)f1_ALDVz5I*nD50R`$@0k>5#?2_M4SM0#=HY9n5 zdnEYrZC;ltx6Xe*d)<*~seZ2RjMnkGoo;Xa^-VIWbx{3=8ja`q+#S<@+N>Ua!(%!9 z;Kvh=@9i+p2g6&2dNZ7j<})m#X|mPIM6d-{C5{tm7vv-~iTIpeGPC*f4ib_ozQ|Ho zx~EB=s>3bpsnpL4h*8v&KAAd&1s+hGsfLcFOtoG}Q3L)>9ELW@A)DSh)t_s?Iy9SQvWuHt-fGc=7hWwiZPY^X~)3d5?_||{gdiz$6M~j`6YV1*2T|T55g+NU$?9AP27#( zvBTJIf_Y6_$skaqPoa5dYUA=l>Ho)D78YYmu1%hP0T6p*6B?rPgE3Cn^}q4eR%(r3 zNjS}TADT<*F%h&1@RBh5+?^}>2L6zDLw*7*2tMS7j+hU=UfM7WWHhiH_T6$h(FUfi z%+4fvi@%E4h!T?561sMW?tEqZ7Yj-vun^{S*e-s`h~IIo3_r<3dnYV?A|!3`l_JxW zNIKVu6Bfc4l->oQo<**-sJ%E*w*w!SKKDHxjud0H4f|0~TSnHPMU|{(G+%I31Zr!p zULVG|&Uv1~=SY3V#q+d+$saO}=m%*=g$))BJR>6+Z@FSRhFdFQBp?(WV3Hf{jEUvF z<%;XVCd~DLli&9wnrfSYJV+EOePtJxvvbJy5r(eCQV-?;1g-beA@ zNDtEfpa0!?wFT)CKwZ=>5qb2L5#BX!dG*=F83%NS_4okc=@)1b#eXe8jez|+O z)-EdNDBJ7ZaI0qg{&3!EqW}f+y4gr{p+c{PNOTWgE?>{3p&>ZM`cRZ)5fUDU#R}%kiW3=r86czT}$nyw9t9tEHT@&0A9#Yxldqejiyk8QD7eG zMaSD>vn%frq<~#)|7n6(BD0wj6-lTr$tCXVyFQ%@>%irAMsKzc^AGGw`;P2xXaTh_H`sj=fanQ5x)S3G7 z*?4GY=?(wp@b9GNjCRdwQ;ElYM<##X6?g@R%*tj|8KmZ`_@X^MVwi^B?XJ^OTud>z{ll(QPbG)$*cPDH+N8)*( znvP4aWYG0&9dfQ|5 zcBWg_fxC2^KU?HQc7bj9obdcr;>Wb=F7fPca- zKm-Uz{VsPP1HrkYi~r68h@&KoM@B4=S6Bazc@b4JsZHu7Ey6jWimATSQTbt(TxW7r zH`Fq1VurYR@;BZ>tjk2cZhs00b4mbqjrxEXom0=xKqj|v1R46fuvj5x_pmDC%<^~w zWIYtso;kjToeGbG=|}WG*tNC`M}J^{KBXtu`Z5A z?N8mI|1tHhAGW4WI<&bqrPV&&#jTn0#dkmFL^-ToZbocG6I zkK9!G+5l`^xI@bv`}G5(5GGMOglp%JG)-Jcy5W@qJOXFW;aO`xgV<_6BkV2WO$l4p6MDy zLmNJaQA$4jH=zY3V7L_cs7kQ!7NP^VOlV1L5{ZSLX-ZGhaj(?MQcj>D2cI;rG}gXU z$+1{C2RK7P*LwuLWg(pWw&M!$)Panf)&)H-hEX`kx?>TkG168LnYtk|w&bt$jle+p z+l9f>$a@r~#d`-BG$#tii!Xmoyd?HWNa~g0y_~zdxJZQ@n<+3uU|$I=KV#TskBSH>T3Suj|8lg3V-IOHLY@WHK{D^ zYVh0qrJy$HpQo+P1`ry#JG?}lDv$5L7#Iald=2 zXZ{4-dPSQiV(o6xUK>a*1-4~Q_NO8Ll2Y&pYNNxJ410}|VtG%73u;!}r)*gR@01sf z_wsjSZgddy`C#)4(oaOb4Ru_>;T_JF29Rmas_t-7-7SvaPiPUGeC8<$A$f~T`;r9 zL~0Q{Q|C#w<62G7)!$h7e!Vb#iPvxYYKuSW=Q#nedht>?Z#UiG9U%en;{GT9C1mgL z079y8s^oAzs+U27XxZ6@voT8%xzlOA-iU3splYsjf8&ZneCe%1lGBIU=s&(yOD%oJQlYZqRNuUZREj^Q&9X}B)W{x zu90r2d5zy3X?2@`Ml91k)%*&jE_M8?Fv-HhICz@U+#P9QA7nUVCbbt0ravkX@uyoT)G}`L@!mQM! zJ5oA#Yb(yPOwDC^UU2kFY~CAmMrDTug)IrUxzURplqzO*;_i>QSp8p%g1lYr_dnO0 znvDUSlXzY`p=4-Dn8cliN`dCtI^*266qi@zD+HJDE3pIpfCOH=9`sdgv{k8hbko5?d~wr_~k0!p?KGLWF*pdVyu@$1R8>}GD5 zX`POH6OC3euX)YccX!SiJcCt=A~Y4nx&_p@@3T8d?~Lz5HipPhv;ll?seB}-8hh|y z=%NgwRB^HjjZ`u1Hg%gXVQXtCIfSN2TXCDZUnvi5O=LAobW)$|4AM=IbM9T=RmWso z&}e)6ALMSn^ zILY$8D)^ewnji!@kx>vO)1`K}?nWP;QgWlvhj9U0Z4Ard!9SWL(#6Q}I1Q{};ACbe zc61I406K!`q#R zZjoztOrW19=hE%Y${j;2utu!sJn{M*`L&0*V8gA+ov>QZC}j=gvJ$a>o95up5^m_A&*K7`FJP7xbdR-0|f`woiHI+D2cn_8u2y~og+$BuONE)Np_}5V?9@$ZbTCOSO)du0&=`-U-+ZQ9e;>a)p<6yt2pq@wxgn%< zaoA8wOln*vVa|U!KFYfR{{22?Hd$Q745=C*+6lI~fOY+Dn_cK8F?w;CeEN)LZZ)u8 zWM&_(FnMgAW?EZ67Eq-13iABnaF(UOooz1rOB}3Xq7UT`|tUk@hy4Z$+=QKN&->bNRa| zq;NbdaO}!mf(qB3$iGFK$_j6z?pxXfHTjtVk!{*FhOJ7%zNoF%L~hA9w zugEC2J82^hKnS8IRSxnH$pOR>GwkaPjE&NQ$8jQy>M(*M;!g?}2v8qemney$O@_zM z+c`EaKxBECSbsvt*-h4`KfHZ4&vF!)&5Rhj_P*E!&5E;t{hhhhMb-Q4C^meT>7_r)O-{ zOVL_?DA_ZYY2gk_y-cQyz-fuZx6c}>;|%vK#oeRBF*Yw(abe3P$H}`0%^k(Z%I&Bk zWoD+PjVVD^4*Iu_nH-X$H!i)LTe$sB)y$eE_kM1ADE_o72qCxy0dKy3~ zD^UZZAO=xDe^8eHd?&kjLrkFWuVQg?@A9TohMz;&{ZhSexMG~Hc_lYg`2wzp6eGo| zJy019+puP(6c0F=0`ZIs*Z*6Gc`y*f&-o$f6hb^lwr2n*$=>%EdwZCo!vU~rS zxee~7nTKFNW%adtb1bdn%^K=61Lcs=6JK@b`Z2Vc^kq#}6CcB7R?)fV$Mufb9WE*! z9$y1#HFW)a6mtC{ZM-9+8x5tVn^Gy87SaR%WR4$(jI7YDj)GWz5bRcTqe20cB%EO$ zeUbQ>!kzQaI{M)R7h824yIy^4%Cih(7j%LH6BHg;fQ8f_?8u%XM49 za)u9J>bdYGef%bU0Rfe4=5ni{Y(mCF*8`*ZDml#|G1eOkf~RgXBaS8nwVy`iNmnkz z6JH+piT5}s=D{}XDAICZC?=0mk2e*~+q`l2MDe_4i!x*p`e;WAH_N~2qQJh#dZ;id zqWv&$2)ni5@LE(|FN9L$ycajY>oBRr;-{hmnFqo~2Wg0he)cufS~P-`&j#3{No|RI zLrHvVXeA(;_m) zONxo4D{bJ+`gJ@nd4?z+@J;LM)Ot{L>ubb_umb$GMAiTRc+c8sr<;`a(#Bimn2Wdo zc0InFpo{q7>bd6CMZJuV&}0Ef+O3jhy~F5m&kx2YJ02>`D8GDK&1%&T^chd5rl0tB zMdInurrMlK4Z9;sFBz$bE8&Ck`!o`cvM6RIgGY_DoGU11r}(t^Ce|x`rJh{eg8D)H z+-=>AaP6JjS2;DsK4no?-Rru~;q<55Ec4wfS?Al9lw0_e9na=GSU}`};J(R84?qY( z=%nKaFPs^y2@k@kCf(UjuVuVbSHhxV1&BoaE90J}maP$HS~fzSn}s zG`iRjW)#7F2+qNM4;t8>W#dCB!way>=G&3~;EIy@Oy?sR1uZmDj4d9ED#b2}MK37fvjvFp2DeS;xTt1lsGtZG3=rHt2tN-5<@bS(Ew*o* zWSGVvjFG@aK0d$HXy6Y5B)5;eW`4-qfWp&%tbwiw`O_mH9np#A#CsqT@Uo*|3-y7< zR2BQ6r=G&RM2YdxOC&@}5M;bmb3{WB3pH*wkuVsH8LW8uPB%6g=z9}*wvJb9G(W5? zb&NGAX_)=+(ed)b$|CoYGBj)2pT*Ezop(=*JT)qJ+U$_?0ujMYxd@M-iwrch#EyA&eq*Qjq1<++{OzkfZfs7lOfvpGtZC15xo2A zG#VFMfs80jX9(IHupYZGBkJmHEFOE8?uK=SYmKVD6CfyLNwRlNOv!kw(h+7 z8Zs>p8{uV&88MC<=2hCADYy+EXi#+~U+poO=H;CH8Zx({hRc)8utS<&Skke2PqdKQ zZ(ItGF&42MFKmHycb#h|?90i#)v9nNW(b^k|RF@I5p*Fowf?#_T=OVD?$zZT=d`J#?P^1=agN1A?8Z=ZDD0k z2nEp~f+*(y8a-*+Q5*&0AVPx^0!;`NMLrS^9?nQecwxrgLIN+G(-RKf=IaGrs}e8< zZK(m!8ZL}k-7aCVX(%QM@qNe*w}6wsi}SDW zMpXjcs?wJMA!(dsu@z@ZEVMZhrX*-u@-|M=OPXXc&)6pPno?&@TsimsbsO!N&D%~% z^wGVje>UUQ8Q%#rewB=XeoJ*J=2gS*Wss6$S~m@xgCgbAi3!W_tlHmVoc1U8x`+ui zrrPJIUD=P0@~=4}#d@gFMv(-N@PNj5&N49_x9sJK}8WGYYt(|A{rO61BVv4}g)~H)2qZEkY*Zob?iVAvW>dCv#Rv4E*v{u`}}NL={6Z7$81_ zo`<{r1H9Ea7U6xkIU@c#Qs+8*a*6He8_Z^;V(9pd!d=eLs)qsCgq|_F#pv1#1rd~P zV7b5S?uWyIcb_Y4=fX>_>gQ@c3y52s$xzd{Cb=F=-^?)EG1c7odk-IX9`0?Ray5C*R_XL~gDMa{enF z^05!;RV^oApMv~{3h_Q`rxQ0cTBf&mqz^C7HB@9s2r4sx-~0=e4weX`Qs+nF=!mc= zzHS>MI1?r11qS}@x-q#dW>fRJXzUZE{~+GwGw~(4oyg!Pd4!KyqXhX^s$CP!{Vy+{ zlKL66`taT5bA~b_6{*Y^0duC*Wi7d2uieZH0d@1#WxYQ9pQxEdmq|$I1p!fm^^(9( zDPSy8(JnA)Fd&|(h^H_0l-&V#chl5~rIY5jI!bypAPdD#+2|_woW+9=>u82C{+~Ma zfF4A2D&KI_UpoXgR}2u}>Oha~e~?}OM;_D^yv0pjsqvUm^yzn~#{e&!RW7;MAv7EN zMWf=UBlu~Ku}mwFX|sdweKN9n<+z3u-~>@Xm(qCKgN3?lG5IcjQOUOwSu*)3ZmgTi zf@y6l7hH+qPh?D5mbgk+q^hY*X{=*X%dSz>8U9%jsS74K!CeB4t|_QRi1mE#BJW6 zzHXDfjYy&&wcHCXUn)evcCM30sq&ZE&qfP!LZBC+BIj45S&>QIAZuC}cf7EaawQ6> zM6BNJ`v)wDR6e+!csjTqx7dNE@5vZ)cqF5*IEs|G_`pgeuKCTeTx?3t*yAgY{MQj; zSgr(WyW|0kzSv}HQ111_g1qnE-A@`>^eu7i)W~)2TM698&7-n~wpDQ{2;B7aRK7{7 zxGSo$*J8ZB6l6~0jG>?)3~&7z9i~v{d8%V{v-CdPiC2}q^sMH==#_!@3ct`tnKOr{a zMC*hRe%C7sCBlF{+N+%M#0~gj_4HKg6+5P3VRPcnojKb^N^Hj@!71h~a>NZl@hi5z zc%VZCrqxj3h6|#?8FXXi>nnYPiRlR_eL0Ebf3*2XiOR{UqL9VeI)9>0lFu+3I&+HG z6l@daBdnBaoLJ`_y%0xo*#Ur7LUF*NFQt7TZ!YF8@EyXbiWtaoRZH-!5%vsPbI{jq z5fW0Go<}hzHlHbl@IJo?12lPiCy8Y!Y3*ek0xoV_G5Y~G8Vg2%&HSK4v}xg(3io>$ z*997(4?Xo9BJ+ch~n%_v-FiUEQnuRMk0W?|p<0g1FBSFTcPPcQ6@R#~@|%u;<(GJ+yO#G4siefcJ9OqWH(*KPL8a*$vb zkEhTkgi}C9@)oI-iKa(nyf(|_KDQL!wFMPxR20b)Cq6r@dW-Y^@x~nW(fmYG)aE~r znYe_!rh%e%P6G{V-CdTkh%jN8n!PCMp?D!vm|4w)#XZ~IZoTc4dmx@U z;%2I28|DW<100ZNbW0lo7;0*=zy_?{Cm;GT{!Mdg6tVy9|E-(tVLfCc`(r$Er;Ibu zM;|7zdAf*$Q9UD7c`L@+=14M+!RSh?tI(B2WmSU~l+PqD&ans>?(Tqq%0TaF zvcEQ($fqW!S32K~J0fPm1hSsVX=|!^v^Q%e0LN5#fp)4fw_$U_UkpP4g%8jgK+SPQ z82~)2egX`83_?gTGL2dXBQJmMBwZ7L%sp{`dJ0lcvU1x}T!gqTe%!{)SN?h~hv?u$hA559>DgeyE=Sw2PY(N9Gc(o`Yb0 zPZaygimQf{h5YX$MALd8c9F*_pzE|y&ZPI^RrwrY0#>EzIi-IJsT<8a@&%hD=yMw1 z%L9JacuGc&wG`hB!vKAT9smpHr4``E*EoL7W9Dh%a$%~;zSC5mA{$ssjTpDVf%*EL zSXfXBv=}#iFvQ?yFL(9!LSurr^m0z$Vv|N|pFja8)QG?>?CV>Q`Q_=ZR}W!i#m{to9duW+oTq zaYeTxpzN1;4z=A^X+G_l*6rD^!=x!0Q9pXzjd}>0aq_TqWCAh>4oSCTFK^nj5@A|4 z>Vk@^^GQ`EVVIb+an9HZ_1NTC8e1TUwvdUT!F-36qzFMdvl)Y@~E(l zS?3~y^zPrHB7K>6yy2ZFstnWE8W_3ZuvWGk|9qVR31-BN*0gCFKHQcIqw zyO=o)>uB&EM!5t*J9rKZJ1@Z|mqI@kDf%7EhBc?n1&e}Ur_R<5NOw1bFp*ODu0$5u z>apCd)!W9;C7@HGj>`6rwImlkd6?8?MeSEphr5JPbsfMn9O>w9Dsa^e z82vH;BIB{IYy)7zr(p8Mpqm=*4OMP*Z*C-i5D8<_>hDyd^h$z}oU+ zV?7`>3ymNt5?C=MsNM`3oJh+$wiBqb0?tsY1z1%b&q;#Q7e+Nagtdr2q!LUMoU{a@ zKoA<(^|?y0f*r((HBrr_bkg2x;(<%L&O&w(Z0d@TI9W46jNmbZQH!;S1vZI13}E@| zl9ixSh+$|N_j6 zmwuNX7osj!XaK5b{JBy8O80eEE#HA}dB>;nYv`@!U#H8;S=dn&0&sIl5v;0wf~q-~ zBCxPgpb%z5;A#%aDS|?}aQhJ*pTATc!FEQmcM}Q$p6j;gVKNit+5=V3A~X7IJF5!N zGd1l6ze9DO@v~q|rsBp*@S(X-I&#q(mPf$Rphb=5YlDB0P4Do!X#BxBNXSO07y$6u z_BK%7kK~Njc{{8B!`&nP-sO>b1nf(W0W{~9*1xkP;3Hl1=U`4Ul88fnGiogI;=DQB z6EvsiA4{hjw$dK{Y$$$d?4orLtI|*f&x?8UwXu49OoUXVlI^Tm>&RP8tS*2ptzIz= z;S)d$c-t!QeG_a!D?h@W5q}F{nmz%(1up?Mp4g9mWcYmSyO1skC!Z5J0>{23M?I`+ zk#^Ic)*_UJ~$9EBJ9&a*mOOyUaz-(e`wg**kr#9UBHR48~zlDS`h22d1IIKJ)Ua6O*ia`{?zr&}g2QFjW{HEh&1vu8Q(+woV@ z7AA{M!S2;O)xRMpVj16WiJMgVO2%0bFAYA2v?w9VsZN(JKE0OU?q#dKNw=mlush|6@$5``&$QDw)!x3k}E;f_wO!D)RC;r zC}=p4F9V{A%yBb_ZK~X}DB_J#!84#3r}(jvP!~wJlxd0RUAGZDL3HluGN21~VUu=) zL~H~QJ+RE+O9iCUI{>Y+3$asqbaW*6JuF2BWaT=NnRB&izqr)WrDR*(rOMJ)`sZ;( zJ$$E+{BNY9!KAXb1r=vyeZdP+y=A!ZlZR`rGgW)J#(Mb#INh#<<@6#`g5xY~&=fl3 zzv4_;lU2pbD1~XBf{HEO;q@Oq;PCQVv5z#7i)bQg7CMd^hPPo5vI9ZhF_^W9H2DFZwUGRq; zPz8=VqrG14ek&Uu&Ny_0QKg}ZqP1gVc?J>Se*;_)Ad8x~vCJ-cE((e-mO46n>v|}h zfZB}Fc`{Iq?b<4m+z{H;=PPflt6J4-VH;{szLFUxXp?VIZZq}8s3xbx+KRa0Mcd#K zg5_ZRkGiPG>L+1ma3`#p6YuBRtj~3|J?%&^(?g_{bAse4G^%Y>EmAJ16Ffcfa>Px3 zWsgzfloyi1i&vDFhx}5*&P!a(f{#Vp5+HCNAsoMda73PE_#OG z1BhN7J$#DVa)qzhE2&L!#Y!-wpMX%2;8{0ndo-HDjwtyjB_WA%qHodDms2zpV#gGt zg^*%MH;Y@zs+5HszEA1_v&e~-+DhWnv#XRk{*&XoNu;bI4R43`0MmlPv6uD7Y_jemCCTgW6rWf?1NTrhLKH>|?Ye7i;|Nv*MboW5@!{(vHM9{O`=SpIe5K z-fRJ-62cdZ>8P>!t+M)?&`7C89@ z{D|iT#gs%cC@E)*;Hb`|V4osiQ7aFe&HtlxN|^5E)Z4EJJR&u>(zYeUS-pZ!4ss|8 z_a*UbuGeAyID0UyXxcVFOf_Te`y-ycN=g_e!Xm8!lPFNR0qj&xh^pIQIJCpn}`Y(cdr)SS0%q~A#xS~E!Dl)+<32U$oVI}*8XL0 zYRN-ZzT0wtAsFa3+sL|9SCh1P;-$5;TC&xDGD1vf_jNAhL+Q-4$cJ7mA&wm99BM z!cnCdd!tl67ZkBzqN?V5SK+?=-X&i-_<#jJwc_3;wqSAbXrxr}*$q0U|8V7K*N)s& zO2Qf`pZ`VstUMgAK~t2Gg?^+n{+BX6avtmcV^lfw%sKDaMN4_TV)1XI6sbI2%qQbd zc2hY$Ssk2zzMj#sde;-fw}!Ev>tih30fO#oZSzU+ub3D>Xt#QfPlOQ_56I*1&+M$0 z7DJOhCv+16FFP^vEqOui_87WRt+_!4hveVi@jCk1`SsB!Wx~D+kx(<_83$B4tP}V` zDx%oa5AcoV&Ta_rJ-G)l4&u(?;YG7UmEncKwCKpgt^h`txwu4!CPslJ}O2OBC~@ICt@ zk*BPTR83M|q!aR)cRC~DoGNGufKMf1>?9!E%2+)8^{d;<)!72rl1>FSugreucpY%6 zwD2?Nl>B)DIGe50FsST^^kt74Twm#2h1-z~?o2H)5gpTJ7`T!1VQ@iTLTQ)4Ba{|^ z{|S|crmLce*eE^&H(8Ijgq6|DbcvGr#%;Pa#65|3%H5g$?NU#XBfH*fSan36Gvl2}=0bd7ycMp4KOMM0CgfSd0r&x7BB3`yp>>i|D(I zbMZ4kjA^Gn;eR9;7x!8%R_0futHLukUP2F0eW4ZfNrsgp<94}%8(qB5yQ><}7Q zi?pMo>HbR!qeharH$&tD$f7J@=6EtszD8%B>w=X(q{Bn>@&-zkvLO-!6o@iwNr>LYBJ>A? zpf99ZVrd|h8>v`RT$pSdKTHNSyls3ynGQTZJXKm=E%xD6wRQ0UJ=fbdXgGe673q;d zZ;Hj(CoKUz{icXIsv<_e)Je#1-0C_RmRTe7t3&n@EDMF~3xE<6wYz4k)7W26Sbgm?ax*(m{a4dRrSGuzd&RdSNyadW@E`*X%5-_1i{q1SJKxg?r?&r=~E zXW|tC6ZrE6bW6u1aL8k;m|36eqcsG06A6f@1vHDnX{5_1t67x8Gpp-`aUDbKvXOzCg^jh z;PHVtrki65gLE6tcTb=U&m~?jsl9(q-jgk&wNFo#6%fFNiuGQ za)njK?vI?@pof|_T;XwjoOjQ-*)if}MHE1?6==z;S`)UOiqf8%G8wfd#@#FBzO!!&!SiFDNweWg_XM2AfK^_ro2c&u(2(D!kPg(|+ z$0o+IE*gBnqvtA*>bCc3-XvIvfck*%bO52MIQ8t29Lm~Q|AmsJ6V3qAV;sRH;k4gO z{doJ7T8I4` z%P&e@i?EJZ{xW@wg4MVN3$vmtepqqwMtev}Sbe7+Yj5huu|9PF+u|Oe7ubK*4QnTZ zqW;Sq#q)9}Nh95JK+aRJ(9TdOsW>s`Lee&7ZqL!5cf5x0Zj~d>fcn@Qkq#$=AU;Oy zcQsOcFzp{q9=OQLIU%LlyT$h-&E#lf+?|OwCFun{*647Tj z7#fC}`i_ECLt<;BsU%3|VxABN1;-$+Vnb?j|3_XXPZinzudluzu*ugQP;UY&K7$_N z4nRlOD_Q!`h~?7*cSX+IJ@EdtK_T&GiAoY9;wXm@`Z?#72uE5~dOtGnP|(R8ffU@a z6mApx zS*Yu;lk2xI+NjoXAx8wBBBs?lfqMS^I&rP4S&RvVr}~Fj8}W6Uz#kNMdQQG*2 zmaq(H23ma<8U?e1_5fCMq}B(rblqL9gclivj2ev7sTMdFrbr{5p7sZ^8<7aX4^m}B zF2qw!J43~LY&NgEvjL}(P=kth3M>AMv%%g!Xp7~GNWFn-t}<(Hnl>hsmS)DNRN@D@ z4i2dlX}Pf^(C2%FGhIoaa(; z0`r6~fci&UfOUkEE{*vNo01PH!uMC>6sQ>+>bP=z4y6e#4JOO<-r|P5>a|o1M6-_b z=bC%I`_^UEXE6v*N5F8)R>leW$B-OIS(jOcv=LKgTXlAucQ(nMX6^B-JP0s2_d6JL zbVc+7u2jaBcF>I;TuZ8s+9n8k%~+!PkY?bj>H$M*&YU6TEqgS#`l$V@4kq-LAl8Pk z_>rc4fK!3Fz!uPuH0$0$ogabU$L-90{YZ>fVvQA@)Fa!>8mqyQcTId<$2#AJ#Ln{y z`+e)ysAY;=Q!APcs!rp~%Vgsl8;edIFk`5Zd?p*`Jgz>8q4p9Lara5E4u~Fd7qTnu z`jPfJ7Yv?i9R^mcvKNOfB>CQ#8l8z9lapPJmdyo z-%+@;c!=Y5)UG)1E*g7S1K~iy=C-*R>H{@cchAdMWm`OXQbo?$Qb9xk3P%}2eD;1x z?E=qS)*1%#Rf#nS2oe>Iy^LJL9}HOEqr@j`WBNx)fKR3M+{eM{w52a-=U%dc*dV}i zez9aDb(2smqFqtD2HrF-_qdxpe%3CUZz_k)n9mwG6a1P3mN=YQ5|bI&v|l`M8wjC{ zm9+>OefhQ~9TH0`(huTAbtEPnJXt){Pc7?_{vaZB;fPy&U$hA*k|JjGYcrC@c38ecgWBO z#`T1?_r(iJYjr6isckqVzg#M1kXN?7^w@kJ;R}+PUFwsQe?l`Q3PI`sJy0CDCL(q6 zrFQAG3UJEQ>+H{*)ML~d{{_NDJPyX;Jo^)EV_hNP6%+KId;^WYADJ4a=l_A66B22x zEslt3BK^Yd;qonn3Spq~*F}A@Tb09$&M^i7X$h$Ep+B|bVyl36-@{8M6vS#y*h38^ zWci+bktKo>DnOt&5Y;@*p7KTns0 z`s)7mx$=U)6Xfk>audusnHt^u<>MKpA=@||XtwFD90Kq+SA&h$#AI!pcuFVkZ5`e^ z6(B=qlpHj7<5_*RZzkJy)XJ!T2x#n=?$RYSj4mIlSTvz^GLD=HEqc=uZs zDGsf^A#+8u>~bC{S;fw#fDj@JHF2pgWQ$Emsb$jCuB_o5LL{SnAQ0kh{;WG`Idz4; z%V(2reRG2qU<@1N96E&H{4X11fz!&F;yZyWoYOhVV-->?!SK%`ZF;& z*vIzWC(8E|A}<}QlC1EPtjxVqkVc24>`}?qFj+07qXpkha#>*F63Y%VIy2Re466;6 za=LWjs}&L*B77~=b#>n*s=h$nClEG5eRi9uv%=ARMWLg=1Z6= zm^X?)BvUm-SFPmP)c=O0IV3)aUDT(tIh=4?({UpB=QYCo)#+nl1!43^`r50&4z{cy zK_*ak({Z+&PTXIzQ7F4fC2}`|^TF%)^-;RwAyV<3pB%1v>8wg@=QeheNy z5Ic2jZJ2aoCu#ssFv|}k63`p??a?HtLvu8=!@4$h0WIIqbSA^RA) zB;?&t?XZYitS+Gu`@nKO`%YqcL&)l|ZyjXsFYWsJwTKf5r*a!|P)16q^=^NhS=6%J0P*m4(Yqu&lvt2TUC;JkePzXQxZ|qOD zSDQNryw5hkav}tvwcjA*oCarCHR!{I9{w&1;uV8o9oOUGsoE@xrKkxptA8ddC@a3SI|0ronz)Oc1Rxa{cG~lV=>{96VbtK9jnpOLTmN$|+_jS}_ z7^dEU{i!Ny7KfGW_X%NINFJx5zKb_TVi#-iX!xIWIG0s|bGpy5pkk+&uNIf+
d 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�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

T>2>${ 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
J_osl413E0(Ls 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 p9Q?Pw8V#+>%t9AeY diff --git a/kubernetes/linera-validator/charts/loki-stack-2.8.9.tgz b/kubernetes/linera-validator/charts/loki-stack-2.8.9.tgz deleted file mode 100644 index 87010cd898f359c39f3fec96bc07879b4e2e5ce8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129849 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μKE@{6a7c|PmPulcg{;%MT`Fx9r_ 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� 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 AnE(I) diff --git a/kubernetes/linera-validator/charts/pyroscope-1.14.2.tgz b/kubernetes/linera-validator/charts/pyroscope-1.14.2.tgz deleted file mode 100644 index 7d2b8fa12c8e098bfb54697b44fc66ea0a913e33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95725 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 3.0.0. - The field is ignored for Thanos Ruler. - type: object - limit: - description: |- - limit defines the number of alerts an alerting rule and series a recording - rule can produce. - Limit is supported starting with Prometheus >= 2.31 and Thanos Ruler >= 0.24. - type: integer - name: - description: name defines the name of the rule group. - minLength: 1 - type: string - partial_response_strategy: - description: |- - partial_response_strategy is only used by ThanosRuler and will - be ignored by Prometheus instances. - More info: https://github.com/thanos-io/thanos/blob/main/docs/components/rule.md#partial-response - pattern: ^(?i)(abort|warn)?$ - type: string - query_offset: - description: |- - query_offset defines the offset the rule evaluation timestamp of this particular group by the specified duration into the past. - - It requires Prometheus >= v2.53.0. - It is not supported for ThanosRuler. - pattern: ^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$ - type: string - rules: - description: rules defines the list of alerting and recording - rules. - items: - description: |- - Rule describes an alerting or recording rule - See Prometheus documentation: [alerting](https://www.prometheus.io/docs/prometheus/latest/configuration/alerting_rules/) or [recording](https://www.prometheus.io/docs/prometheus/latest/configuration/recording_rules/#recording-rules) rule - properties: - alert: - description: |- - alert defines the name of the alert. Must be a valid label value. - Only one of `record` and `alert` must be set. - type: string - annotations: - additionalProperties: - type: string - description: |- - annotations defines annotations to add to each alert. - Only valid for alerting rules. - type: object - expr: - anyOf: - - type: integer - - type: string - description: expr defines the PromQL expression to evaluate. - x-kubernetes-int-or-string: true - for: - description: for defines how alerts are considered firing - once they have been returned for this long. - pattern: ^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$ - type: string - keep_firing_for: - description: keep_firing_for defines how long an alert - will continue firing after the condition that triggered - it has cleared. - minLength: 1 - pattern: ^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$ - type: string - labels: - additionalProperties: - type: string - description: labels defines labels to add or overwrite. - type: object - record: - description: |- - record defines the name of the time series to output to. Must be a valid metric name. - Only one of `record` and `alert` must be set. - type: string - required: - - expr - type: object - type: array - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - type: object - status: - description: |- - status defines the status subresource. It is under active development and is updated only when the - "StatusForConfigurationResources" feature gate is enabled. - - Most recent observed status of the PrometheusRule. Read-only. - More info: - https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - properties: - bindings: - description: bindings defines the list of workload resources (Prometheus, - PrometheusAgent, ThanosRuler or Alertmanager) which select the configuration - resource. - items: - description: WorkloadBinding is a link between a configuration resource - and a workload resource. - properties: - conditions: - description: conditions defines the current state of the configuration - resource when bound to the referenced Workload object. - items: - description: ConfigResourceCondition describes the status - of configuration resources linked to Prometheus, PrometheusAgent, - Alertmanager or ThanosRuler. - properties: - lastTransitionTime: - description: lastTransitionTime defines the time of the - last update to the current status property. - format: date-time - type: string - message: - description: message defines the human-readable message - indicating details for the condition's last transition. - type: string - observedGeneration: - description: |- - observedGeneration defines the .metadata.generation that the - condition was set based upon. For instance, if `.metadata.generation` is - currently 12, but the `.status.conditions[].observedGeneration` is 9, the - condition is out of date with respect to the current state of the object. - format: int64 - type: integer - reason: - description: reason for the condition's last transition. - type: string - status: - description: status of the condition. - minLength: 1 - type: string - type: - description: |- - type of the condition being reported. - Currently, only "Accepted" is supported. - enum: - - Accepted - minLength: 1 - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - group: - description: group defines the group of the referenced resource. - enum: - - monitoring.coreos.com - type: string - name: - description: name defines the name of the referenced object. - minLength: 1 - type: string - namespace: - description: namespace defines the namespace of the referenced - object. - minLength: 1 - type: string - resource: - description: resource defines the type of resource being referenced - (e.g. Prometheus, PrometheusAgent, ThanosRuler or Alertmanager). - enum: - - prometheuses - - prometheusagents - - thanosrulers - - alertmanagers - type: string - required: - - group - - name - - namespace - - resource - type: object - type: array - x-kubernetes-list-map-keys: - - group - - resource - - name - - namespace - x-kubernetes-list-type: map - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/kubernetes/linera-validator/crds/servicemonitor.yaml b/kubernetes/linera-validator/crds/servicemonitor.yaml deleted file mode 100644 index bc25715f977c..000000000000 --- a/kubernetes/linera-validator/crds/servicemonitor.yaml +++ /dev/null @@ -1,1426 +0,0 @@ -# ServiceMonitor Custom Resource Definition -# Source: prometheus-operator v0.86.1 -# Exported from: testnet-conway-validator-1-cluster -# Date: 2025-10-23 -# -# This CRD is bundled locally to avoid GitHub rate limiting when downloading -# from raw.githubusercontent.com during deployments. -# -# Update when: -# - Upgrading prometheus-operator / kube-prometheus-stack Helm charts -# - New monitoring features require updated CRD fields -# - Quarterly check (or as-needed) -# -# To update: -# 1. Find the version from: https://github.com/prometheus-operator/prometheus-operator/releases -# 2. Export from a cluster with the latest version: -# kubectl get crd servicemonitors.monitoring.coreos.com -o yaml > servicemonitor.yaml -# 3. Clean cluster-specific metadata (resourceVersion, uid, status, managedFields) -# 4. Replace this file -# -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.19.0 - operator.prometheus.io/version: 0.86.1 - name: servicemonitors.monitoring.coreos.com -spec: - conversion: - strategy: None - group: monitoring.coreos.com - names: - categories: - - prometheus-operator - kind: ServiceMonitor - listKind: ServiceMonitorList - plural: servicemonitors - shortNames: - - smon - singular: servicemonitor - scope: Namespaced - versions: - - name: v1 - schema: - openAPIV3Schema: - description: |- - The `ServiceMonitor` custom resource definition (CRD) defines how `Prometheus` and `PrometheusAgent` can scrape metrics from a group of services. - Among other things, it allows to specify: - * The services to scrape via label selectors. - * The container ports to scrape. - * Authentication credentials to use. - * Target and metric relabeling. - - `Prometheus` and `PrometheusAgent` objects select `ServiceMonitor` objects using label and namespace selectors. - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - description: |- - spec defines the specification of desired Service selection for target discovery by - Prometheus. - properties: - attachMetadata: - description: |- - attachMetadata defines additional metadata which is added to the - discovered targets. - - It requires Prometheus >= v2.37.0. - properties: - node: - description: |- - node when set to true, Prometheus attaches node metadata to the discovered - targets. - - The Prometheus service account must have the `list` and `watch` - permissions on the `Nodes` objects. - type: boolean - type: object - bodySizeLimit: - description: |- - bodySizeLimit when defined, bodySizeLimit specifies a job level limit on the size - of uncompressed response body that will be accepted by Prometheus. - - It requires Prometheus >= v2.28.0. - pattern: (^0|([0-9]*[.])?[0-9]+((K|M|G|T|E|P)i?)?B)$ - type: string - convertClassicHistogramsToNHCB: - description: |- - convertClassicHistogramsToNHCB defines whether to convert all scraped classic histograms into a native histogram with custom buckets. - It requires Prometheus >= v3.0.0. - type: boolean - endpoints: - description: |- - endpoints defines the list of endpoints part of this ServiceMonitor. - Defines how to scrape metrics from Kubernetes [Endpoints](https://kubernetes.io/docs/concepts/services-networking/service/#endpoints) objects. - In most cases, an Endpoints object is backed by a Kubernetes [Service](https://kubernetes.io/docs/concepts/services-networking/service/) object with the same name and labels. - items: - description: |- - Endpoint defines an endpoint serving Prometheus metrics to be scraped by - Prometheus. - properties: - authorization: - description: |- - authorization configures the Authorization header credentials to use when - scraping the target. - - Cannot be set at the same time as `basicAuth`, or `oauth2`. - properties: - credentials: - description: credentials defines a key of a Secret in the - namespace that contains the credentials for authentication. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. Instances of this type with an empty value here are - almost certainly wrong. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - type: string - optional: - description: Specify whether the Secret or its key must - be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: - description: |- - type defines the authentication type. The value is case-insensitive. - - "Basic" is not a supported value. - - Default: "Bearer" - type: string - type: object - basicAuth: - description: |- - basicAuth defines the Basic Authentication credentials to use when - scraping the target. - - Cannot be set at the same time as `authorization`, or `oauth2`. - properties: - password: - description: |- - password defines a key of a Secret containing the password for - authentication. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. Instances of this type with an empty value here are - almost certainly wrong. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - type: string - optional: - description: Specify whether the Secret or its key must - be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - username: - description: |- - username defines a key of a Secret containing the username for - authentication. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. Instances of this type with an empty value here are - almost certainly wrong. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - type: string - optional: - description: Specify whether the Secret or its key must - be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - bearerTokenFile: - description: |- - bearerTokenFile defines the file to read bearer token for scraping the target. - - Deprecated: use `authorization` instead. - type: string - bearerTokenSecret: - description: |- - bearerTokenSecret defines a key of a Secret containing the bearer - token for scraping targets. The secret needs to be in the same namespace - as the ServiceMonitor object and readable by the Prometheus Operator. - - Deprecated: use `authorization` instead. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. Instances of this type with an empty value here are - almost certainly wrong. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - type: string - optional: - description: Specify whether the Secret or its key must - be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - enableHttp2: - description: enableHttp2 can be used to disable HTTP2 when scraping - the target. - type: boolean - filterRunning: - description: |- - filterRunning when true, the pods which are not running (e.g. either in Failed or - Succeeded state) are dropped during the target discovery. - - If unset, the filtering is enabled. - - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-phase - type: boolean - followRedirects: - description: |- - followRedirects defines whether the scrape requests should follow HTTP - 3xx redirects. - type: boolean - honorLabels: - description: |- - honorLabels defines when true the metric's labels when they collide - with the target's labels. - type: boolean - honorTimestamps: - description: |- - honorTimestamps defines whether Prometheus preserves the timestamps - when exposed by the target. - type: boolean - interval: - description: |- - interval at which Prometheus scrapes the metrics from the target. - - If empty, Prometheus uses the global scrape interval. - pattern: ^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$ - type: string - metricRelabelings: - description: |- - metricRelabelings defines the relabeling rules to apply to the - samples before ingestion. - items: - description: |- - RelabelConfig allows dynamic rewriting of the label set for targets, alerts, - scraped samples and remote write samples. - - More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config - properties: - action: - default: replace - description: |- - action to perform based on the regex matching. - - `Uppercase` and `Lowercase` actions require Prometheus >= v2.36.0. - `DropEqual` and `KeepEqual` actions require Prometheus >= v2.41.0. - - Default: "Replace" - enum: - - replace - - Replace - - keep - - Keep - - drop - - Drop - - hashmod - - HashMod - - labelmap - - LabelMap - - labeldrop - - LabelDrop - - labelkeep - - LabelKeep - - lowercase - - Lowercase - - uppercase - - Uppercase - - keepequal - - KeepEqual - - dropequal - - DropEqual - type: string - modulus: - description: |- - modulus to take of the hash of the source label values. - - Only applicable when the action is `HashMod`. - format: int64 - type: integer - regex: - description: regex defines the regular expression against - which the extracted value is matched. - type: string - replacement: - description: |- - replacement value against which a Replace action is performed if the - regular expression matches. - - Regex capture groups are available. - type: string - separator: - description: separator defines the string between concatenated - SourceLabels. - type: string - sourceLabels: - description: |- - sourceLabels defines the source labels select values from existing labels. Their content is - concatenated using the configured Separator and matched against the - configured regular expression. - items: - description: |- - LabelName is a valid Prometheus label name. - For Prometheus 3.x, a label name is valid if it contains UTF-8 characters. - For Prometheus 2.x, a label name is only valid if it contains ASCII characters, letters, numbers, as well as underscores. - type: string - type: array - targetLabel: - description: |- - targetLabel defines the label to which the resulting string is written in a replacement. - - It is mandatory for `Replace`, `HashMod`, `Lowercase`, `Uppercase`, - `KeepEqual` and `DropEqual` actions. - - Regex capture groups are available. - type: string - type: object - type: array - noProxy: - description: |- - noProxy defines a comma-separated string that can contain IPs, CIDR notation, domain names - that should be excluded from proxying. IP and domain names can - contain port numbers. - - It requires Prometheus >= v2.43.0, Alertmanager >= v0.25.0 or Thanos >= v0.32.0. - type: string - oauth2: - description: |- - oauth2 defines the OAuth2 settings to use when scraping the target. - - It requires Prometheus >= 2.27.0. - - Cannot be set at the same time as `authorization`, or `basicAuth`. - properties: - clientId: - description: |- - clientId defines a key of a Secret or ConfigMap containing the - OAuth2 client's ID. - properties: - configMap: - description: configMap defines the ConfigMap containing - data to use for the targets. - properties: - key: - description: The key to select. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. Instances of this type with an empty value here are - almost certainly wrong. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - type: string - optional: - description: Specify whether the ConfigMap or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: secret defines the Secret containing data - to use for the targets. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. Instances of this type with an empty value here are - almost certainly wrong. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - clientSecret: - description: |- - clientSecret defines a key of a Secret containing the OAuth2 - client's secret. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. Instances of this type with an empty value here are - almost certainly wrong. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - type: string - optional: - description: Specify whether the Secret or its key must - be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - endpointParams: - additionalProperties: - type: string - description: |- - endpointParams configures the HTTP parameters to append to the token - URL. - type: object - noProxy: - description: |- - noProxy defines a comma-separated string that can contain IPs, CIDR notation, domain names - that should be excluded from proxying. IP and domain names can - contain port numbers. - - It requires Prometheus >= v2.43.0, Alertmanager >= v0.25.0 or Thanos >= v0.32.0. - type: string - proxyConnectHeader: - additionalProperties: - items: - description: SecretKeySelector selects a key of a Secret. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. Instances of this type with an empty value here are - almost certainly wrong. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: array - description: |- - proxyConnectHeader optionally specifies headers to send to - proxies during CONNECT requests. - - It requires Prometheus >= v2.43.0, Alertmanager >= v0.25.0 or Thanos >= v0.32.0. - type: object - x-kubernetes-map-type: atomic - proxyFromEnvironment: - description: |- - proxyFromEnvironment defines whether to use the proxy configuration defined by environment variables (HTTP_PROXY, HTTPS_PROXY, and NO_PROXY). - - It requires Prometheus >= v2.43.0, Alertmanager >= v0.25.0 or Thanos >= v0.32.0. - type: boolean - proxyUrl: - description: proxyUrl defines the HTTP proxy server to use. - pattern: ^(http|https|socks5)://.+$ - type: string - scopes: - description: scopes defines the OAuth2 scopes used for the - token request. - items: - type: string - type: array - tlsConfig: - description: |- - tlsConfig defines the TLS configuration to use when connecting to the OAuth2 server. - It requires Prometheus >= v2.43.0. - properties: - ca: - description: ca defines the Certificate authority used - when verifying server certificates. - properties: - configMap: - description: configMap defines the ConfigMap containing - data to use for the targets. - properties: - key: - description: The key to select. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. Instances of this type with an empty value here are - almost certainly wrong. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - type: string - optional: - description: Specify whether the ConfigMap or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: secret defines the Secret containing - data to use for the targets. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. Instances of this type with an empty value here are - almost certainly wrong. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - cert: - description: cert defines the Client certificate to - present when doing client-authentication. - properties: - configMap: - description: configMap defines the ConfigMap containing - data to use for the targets. - properties: - key: - description: The key to select. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. Instances of this type with an empty value here are - almost certainly wrong. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - type: string - optional: - description: Specify whether the ConfigMap or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: secret defines the Secret containing - data to use for the targets. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. Instances of this type with an empty value here are - almost certainly wrong. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - insecureSkipVerify: - description: insecureSkipVerify defines how to disable - target certificate validation. - type: boolean - keySecret: - description: keySecret defines the Secret containing - the client key file for the targets. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. Instances of this type with an empty value here are - almost certainly wrong. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - maxVersion: - description: |- - maxVersion defines the maximum acceptable TLS version. - - It requires Prometheus >= v2.41.0 or Thanos >= v0.31.0. - enum: - - TLS10 - - TLS11 - - TLS12 - - TLS13 - type: string - minVersion: - description: |- - minVersion defines the minimum acceptable TLS version. - - It requires Prometheus >= v2.35.0 or Thanos >= v0.28.0. - enum: - - TLS10 - - TLS11 - - TLS12 - - TLS13 - type: string - serverName: - description: serverName is used to verify the hostname - for the targets. - type: string - type: object - tokenUrl: - description: tokenUrl defines the URL to fetch the token - from. - minLength: 1 - type: string - required: - - clientId - - clientSecret - - tokenUrl - type: object - params: - additionalProperties: - items: - type: string - type: array - description: params define optional HTTP URL parameters. - type: object - path: - description: |- - path defines the HTTP path from which to scrape for metrics. - - If empty, Prometheus uses the default value (e.g. `/metrics`). - type: string - port: - description: |- - port defines the name of the Service port which this endpoint refers to. - - It takes precedence over `targetPort`. - type: string - proxyConnectHeader: - additionalProperties: - items: - description: SecretKeySelector selects a key of a Secret. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. Instances of this type with an empty value here are - almost certainly wrong. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - type: string - optional: - description: Specify whether the Secret or its key must - be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: array - description: |- - proxyConnectHeader optionally specifies headers to send to - proxies during CONNECT requests. - - It requires Prometheus >= v2.43.0, Alertmanager >= v0.25.0 or Thanos >= v0.32.0. - type: object - x-kubernetes-map-type: atomic - proxyFromEnvironment: - description: |- - proxyFromEnvironment defines whether to use the proxy configuration defined by environment variables (HTTP_PROXY, HTTPS_PROXY, and NO_PROXY). - - It requires Prometheus >= v2.43.0, Alertmanager >= v0.25.0 or Thanos >= v0.32.0. - type: boolean - proxyUrl: - description: proxyUrl defines the HTTP proxy server to use. - pattern: ^(http|https|socks5)://.+$ - type: string - relabelings: - description: |- - relabelings defines the relabeling rules to apply the target's - metadata labels. - - The Operator automatically adds relabelings for a few standard Kubernetes fields. - - The original scrape job's name is available via the `__tmp_prometheus_job_name` label. - - More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config - items: - description: |- - RelabelConfig allows dynamic rewriting of the label set for targets, alerts, - scraped samples and remote write samples. - - More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config - properties: - action: - default: replace - description: |- - action to perform based on the regex matching. - - `Uppercase` and `Lowercase` actions require Prometheus >= v2.36.0. - `DropEqual` and `KeepEqual` actions require Prometheus >= v2.41.0. - - Default: "Replace" - enum: - - replace - - Replace - - keep - - Keep - - drop - - Drop - - hashmod - - HashMod - - labelmap - - LabelMap - - labeldrop - - LabelDrop - - labelkeep - - LabelKeep - - lowercase - - Lowercase - - uppercase - - Uppercase - - keepequal - - KeepEqual - - dropequal - - DropEqual - type: string - modulus: - description: |- - modulus to take of the hash of the source label values. - - Only applicable when the action is `HashMod`. - format: int64 - type: integer - regex: - description: regex defines the regular expression against - which the extracted value is matched. - type: string - replacement: - description: |- - replacement value against which a Replace action is performed if the - regular expression matches. - - Regex capture groups are available. - type: string - separator: - description: separator defines the string between concatenated - SourceLabels. - type: string - sourceLabels: - description: |- - sourceLabels defines the source labels select values from existing labels. Their content is - concatenated using the configured Separator and matched against the - configured regular expression. - items: - description: |- - LabelName is a valid Prometheus label name. - For Prometheus 3.x, a label name is valid if it contains UTF-8 characters. - For Prometheus 2.x, a label name is only valid if it contains ASCII characters, letters, numbers, as well as underscores. - type: string - type: array - targetLabel: - description: |- - targetLabel defines the label to which the resulting string is written in a replacement. - - It is mandatory for `Replace`, `HashMod`, `Lowercase`, `Uppercase`, - `KeepEqual` and `DropEqual` actions. - - Regex capture groups are available. - type: string - type: object - type: array - scheme: - description: scheme defines the HTTP scheme to use when scraping - the metrics. - enum: - - http - - https - - HTTP - - HTTPS - type: string - scrapeTimeout: - description: |- - scrapeTimeout defines the timeout after which Prometheus considers the scrape to be failed. - - If empty, Prometheus uses the global scrape timeout unless it is less - than the target's scrape interval value in which the latter is used. - The value cannot be greater than the scrape interval otherwise the operator will reject the resource. - pattern: ^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$ - type: string - targetPort: - anyOf: - - type: integer - - type: string - description: |- - targetPort defines the name or number of the target port of the `Pod` object behind the - Service. The port must be specified with the container's port property. - x-kubernetes-int-or-string: true - tlsConfig: - description: tlsConfig defines the TLS configuration to use - when scraping the target. - properties: - ca: - description: ca defines the Certificate authority used when - verifying server certificates. - properties: - configMap: - description: configMap defines the ConfigMap containing - data to use for the targets. - properties: - key: - description: The key to select. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. Instances of this type with an empty value here are - almost certainly wrong. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - type: string - optional: - description: Specify whether the ConfigMap or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: secret defines the Secret containing data - to use for the targets. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. Instances of this type with an empty value here are - almost certainly wrong. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - caFile: - description: caFile defines the path to the CA cert in the - Prometheus container to use for the targets. - type: string - cert: - description: cert defines the Client certificate to present - when doing client-authentication. - properties: - configMap: - description: configMap defines the ConfigMap containing - data to use for the targets. - properties: - key: - description: The key to select. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. Instances of this type with an empty value here are - almost certainly wrong. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - type: string - optional: - description: Specify whether the ConfigMap or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: secret defines the Secret containing data - to use for the targets. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. Instances of this type with an empty value here are - almost certainly wrong. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - certFile: - description: certFile defines the path to the client cert - file in the Prometheus container for the targets. - type: string - insecureSkipVerify: - description: insecureSkipVerify defines how to disable target - certificate validation. - type: boolean - keyFile: - description: keyFile defines the path to the client key - file in the Prometheus container for the targets. - type: string - keySecret: - description: keySecret defines the Secret containing the - client key file for the targets. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. Instances of this type with an empty value here are - almost certainly wrong. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - type: string - optional: - description: Specify whether the Secret or its key must - be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - maxVersion: - description: |- - maxVersion defines the maximum acceptable TLS version. - - It requires Prometheus >= v2.41.0 or Thanos >= v0.31.0. - enum: - - TLS10 - - TLS11 - - TLS12 - - TLS13 - type: string - minVersion: - description: |- - minVersion defines the minimum acceptable TLS version. - - It requires Prometheus >= v2.35.0 or Thanos >= v0.28.0. - enum: - - TLS10 - - TLS11 - - TLS12 - - TLS13 - type: string - serverName: - description: serverName is used to verify the hostname for - the targets. - type: string - type: object - trackTimestampsStaleness: - description: |- - trackTimestampsStaleness defines whether Prometheus tracks staleness of - the metrics that have an explicit timestamp present in scraped data. - Has no effect if `honorTimestamps` is false. - - It requires Prometheus >= v2.48.0. - type: boolean - type: object - type: array - fallbackScrapeProtocol: - description: |- - fallbackScrapeProtocol defines the protocol to use if a scrape returns blank, unparseable, or otherwise invalid Content-Type. - - It requires Prometheus >= v3.0.0. - enum: - - PrometheusProto - - OpenMetricsText0.0.1 - - OpenMetricsText1.0.0 - - PrometheusText0.0.4 - - PrometheusText1.0.0 - type: string - jobLabel: - description: |- - jobLabel selects the label from the associated Kubernetes `Service` - object which will be used as the `job` label for all metrics. - - For example if `jobLabel` is set to `foo` and the Kubernetes `Service` - object is labeled with `foo: bar`, then Prometheus adds the `job="bar"` - label to all ingested metrics. - - If the value of this field is empty or if the label doesn't exist for - the given Service, the `job` label of the metrics defaults to the name - of the associated Kubernetes `Service`. - type: string - keepDroppedTargets: - description: |- - keepDroppedTargets defines the per-scrape limit on the number of targets dropped by relabeling - that will be kept in memory. 0 means no limit. - - It requires Prometheus >= v2.47.0. - format: int64 - type: integer - labelLimit: - description: |- - labelLimit defines the per-scrape limit on number of labels that will be accepted for a sample. - - It requires Prometheus >= v2.27.0. - format: int64 - type: integer - labelNameLengthLimit: - description: |- - labelNameLengthLimit defines the per-scrape limit on length of labels name that will be accepted for a sample. - - It requires Prometheus >= v2.27.0. - format: int64 - type: integer - labelValueLengthLimit: - description: |- - labelValueLengthLimit defines the per-scrape limit on length of labels value that will be accepted for a sample. - - It requires Prometheus >= v2.27.0. - format: int64 - type: integer - namespaceSelector: - description: |- - namespaceSelector defines in which namespace(s) Prometheus should discover the services. - By default, the services are discovered in the same namespace as the `ServiceMonitor` object but it is possible to select pods across different/all namespaces. - properties: - any: - description: |- - any defines the boolean describing whether all namespaces are selected in contrast to a - list restricting them. - type: boolean - matchNames: - description: matchNames defines the list of namespace names to - select from. - items: - type: string - type: array - type: object - nativeHistogramBucketLimit: - description: |- - nativeHistogramBucketLimit defines ff there are more than this many buckets in a native histogram, - buckets will be merged to stay within the limit. - It requires Prometheus >= v2.45.0. - format: int64 - type: integer - nativeHistogramMinBucketFactor: - anyOf: - - type: integer - - type: string - description: |- - nativeHistogramMinBucketFactor defines if the growth factor of one bucket to the next is smaller than this, - buckets will be merged to increase the factor sufficiently. - It requires Prometheus >= v2.50.0. - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - podTargetLabels: - description: |- - podTargetLabels defines the labels which are transferred from the - associated Kubernetes `Pod` object onto the ingested metrics. - items: - type: string - type: array - sampleLimit: - description: |- - sampleLimit defines a per-scrape limit on the number of scraped samples - that will be accepted. - format: int64 - type: integer - scrapeClass: - description: scrapeClass defines the scrape class to apply. - minLength: 1 - type: string - scrapeClassicHistograms: - description: |- - scrapeClassicHistograms defines whether to scrape a classic histogram that is also exposed as a native histogram. - It requires Prometheus >= v2.45.0. - - Notice: `scrapeClassicHistograms` corresponds to the `always_scrape_classic_histograms` field in the Prometheus configuration. - type: boolean - scrapeProtocols: - description: |- - scrapeProtocols defines the protocols to negotiate during a scrape. It tells clients the - protocols supported by Prometheus in order of preference (from most to least preferred). - - If unset, Prometheus uses its default value. - - It requires Prometheus >= v2.49.0. - items: - description: |- - ScrapeProtocol represents a protocol used by Prometheus for scraping metrics. - Supported values are: - * `OpenMetricsText0.0.1` - * `OpenMetricsText1.0.0` - * `PrometheusProto` - * `PrometheusText0.0.4` - * `PrometheusText1.0.0` - enum: - - PrometheusProto - - OpenMetricsText0.0.1 - - OpenMetricsText1.0.0 - - PrometheusText0.0.4 - - PrometheusText1.0.0 - type: string - type: array - x-kubernetes-list-type: set - selector: - description: selector defines the label selector to select the Kubernetes - `Endpoints` objects to scrape metrics from. - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. - The requirements are ANDed. - items: - description: |- - A label selector requirement is a selector that contains values, a key, and an operator that - relates the key and values. - properties: - key: - description: key is the label key that the selector applies - to. - type: string - operator: - description: |- - operator represents a key's relationship to a set of values. - Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: |- - values is an array of string values. If the operator is In or NotIn, - the values array must be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - x-kubernetes-list-type: atomic - required: - - key - - operator - type: object - type: array - x-kubernetes-list-type: atomic - matchLabels: - additionalProperties: - type: string - description: |- - matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, whose key field is "key", the - operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - selectorMechanism: - description: |- - selectorMechanism defines the mechanism used to select the endpoints to scrape. - By default, the selection process relies on relabel configurations to filter the discovered targets. - Alternatively, you can opt in for role selectors, which may offer better efficiency in large clusters. - Which strategy is best for your use case needs to be carefully evaluated. - - It requires Prometheus >= v2.17.0. - enum: - - RelabelConfig - - RoleSelector - type: string - serviceDiscoveryRole: - description: |- - serviceDiscoveryRole defines the service discovery role used to discover targets. - - If set, the value should be either "Endpoints" or "EndpointSlice". - Otherwise it defaults to the value defined in the - Prometheus/PrometheusAgent resource. - enum: - - Endpoints - - EndpointSlice - type: string - targetLabels: - description: |- - targetLabels defines the labels which are transferred from the - associated Kubernetes `Service` object onto the ingested metrics. - items: - type: string - type: array - targetLimit: - description: |- - targetLimit defines a limit on the number of scraped targets that will - be accepted. - format: int64 - type: integer - required: - - endpoints - - selector - type: object - status: - description: |- - status defines the status subresource. It is under active development and is updated only when the - "StatusForConfigurationResources" feature gate is enabled. - - Most recent observed status of the ServiceMonitor. Read-only. - More info: - https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - properties: - bindings: - description: bindings defines the list of workload resources (Prometheus, - PrometheusAgent, ThanosRuler or Alertmanager) which select the configuration - resource. - items: - description: WorkloadBinding is a link between a configuration resource - and a workload resource. - properties: - conditions: - description: conditions defines the current state of the configuration - resource when bound to the referenced Workload object. - items: - description: ConfigResourceCondition describes the status - of configuration resources linked to Prometheus, PrometheusAgent, - Alertmanager or ThanosRuler. - properties: - lastTransitionTime: - description: lastTransitionTime defines the time of the - last update to the current status property. - format: date-time - type: string - message: - description: message defines the human-readable message - indicating details for the condition's last transition. - type: string - observedGeneration: - description: |- - observedGeneration defines the .metadata.generation that the - condition was set based upon. For instance, if `.metadata.generation` is - currently 12, but the `.status.conditions[].observedGeneration` is 9, the - condition is out of date with respect to the current state of the object. - format: int64 - type: integer - reason: - description: reason for the condition's last transition. - type: string - status: - description: status of the condition. - minLength: 1 - type: string - type: - description: |- - type of the condition being reported. - Currently, only "Accepted" is supported. - enum: - - Accepted - minLength: 1 - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - group: - description: group defines the group of the referenced resource. - enum: - - monitoring.coreos.com - type: string - name: - description: name defines the name of the referenced object. - minLength: 1 - type: string - namespace: - description: namespace defines the namespace of the referenced - object. - minLength: 1 - type: string - resource: - description: resource defines the type of resource being referenced - (e.g. Prometheus, PrometheusAgent, ThanosRuler or Alertmanager). - enum: - - prometheuses - - prometheusagents - - thanosrulers - - alertmanagers - type: string - required: - - group - - name - - namespace - - resource - type: object - type: array - x-kubernetes-list-map-keys: - - group - - resource - - name - - namespace - x-kubernetes-list-type: map - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/kubernetes/linera-validator/exporter-config.toml.tpl b/kubernetes/linera-validator/exporter-config.toml.tpl deleted file mode 100644 index 61e656c51cde..000000000000 --- a/kubernetes/linera-validator/exporter-config.toml.tpl +++ /dev/null @@ -1,31 +0,0 @@ -id = {{ .exporterId }} - -metrics_port = {{ .Values.blockExporter.metricsPort }} - -[service_config] -host = "0.0.0.0" -port = {{ .Values.blockExporter.port }} - -[destination_config] -committee_destination = true - -[[destination_config.destinations]] -kind = "Indexer" -{{- if .Values.blockExporter.indexerEndpoint }} -tls = "Tls" -port = 443 -endpoint = "{{ .Values.blockExporter.indexerEndpoint }}" -{{- else }} -tls = "ClearText" -port = {{ .Values.blockExporter.indexerPort }} -endpoint = "linera-indexer-{{ .Values.networkName }}.linera-indexer.svc.cluster.local" -{{- end }} - -[limits] -persistence_period_ms = 5_000 -work_queue_size = 256 -blob_cache_weight_mb = 1024 -blob_cache_items_capacity = 8192 -block_cache_weight_mb = 1024 -block_cache_items_capacity = 8192 -auxiliary_cache_size_mb = 1024 \ No newline at end of file diff --git a/kubernetes/linera-validator/grafana-dashboards/linera/execution.json b/kubernetes/linera-validator/grafana-dashboards/linera/execution.json deleted file mode 100644 index 3d5e322c7761..000000000000 --- a/kubernetes/linera-validator/grafana-dashboards/linera/execution.json +++ /dev/null @@ -1,6441 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "label_replace(max without(uid, instance) (kube_pod_start_time{pod=~\"proxy-.*\", namespace=\"default\"}) != max without(uid, instance) (kube_pod_start_time{pod=~\"proxy-.*\", namespace=\"default\"} offset 5m), \"validator\", \"$1.testnet-conway.linera.net\", \"cluster\", \"gke-testnet-conway-(validator-\\d+)\")", - "hide": false, - "iconColor": "rgba(255, 152, 48, 1)", - "limit": 100, - "name": "proxy_restart", - "showIn": 0, - "tagKeys": "validator,pod", - "tags": [], - "titleFormat": "proxy restart", - "type": "tags" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "label_replace(max without(uid, instance) (kube_pod_start_time{pod=~\"shards-.*\", namespace=\"default\"}) != max without(uid, instance) (kube_pod_start_time{pod=~\"shards-.*\", namespace=\"default\"} offset 5m), \"validator\", \"$1.testnet-conway.linera.net\", \"cluster\", \"gke-testnet-conway-(validator-\\d+)\")", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "shard_restart", - "showIn": 0, - "tagKeys": "validator,pod", - "tags": [], - "titleFormat": "shard restart", - "type": "tags" - } - ] - }, - "description": "Execution metrics for Linera validators including block execution latency, operation processing, message handling, and WebAssembly performance statistics.", - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 1, - "links": [], - "panels": [ - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 1, - "panels": [], - "title": "Latencies", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Time taken to execute a block, including all operations and state transitions", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "\u00b5s" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 1 - }, - "id": 2, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:block_execution_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:block_execution_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:block_execution_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Block Execution Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Time taken to execute a single operation within a block", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "\u00b5s" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 1 - }, - "id": 3, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:operation_execution_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:operation_execution_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:operation_execution_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Operation Execution Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Time taken to execute a cross-chain message", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "\u00b5s" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 9 - }, - "id": 4, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:message_execution_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:message_execution_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:message_execution_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Message Execution Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Time taken to decompress WebAssembly bytecode before execution", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 9 - }, - "id": 5, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:bytecode_decompression_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:bytecode_decompression_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:bytecode_decompression_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Bytecode Decompression Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Time taken to compute cryptographic hash of chain state", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "\u00b5s" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 17 - }, - "id": 6, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:state_hash_computation_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:state_hash_computation_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:state_hash_computation_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "State Hash Computation Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Time messages spend waiting in the cross-chain message queue", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 17 - }, - "id": 7, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:cross_chain_queue_wait_time:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:cross_chain_queue_wait_time:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:cross_chain_queue_wait_time:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Cross Chain Queue Wait Time", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Time requests spend waiting in the chain worker processing queue", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 25 - }, - "id": 8, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:chain_worker_request_queue_wait_time:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:chain_worker_request_queue_wait_time:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:chain_worker_request_queue_wait_time:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Chain Worker Request Queue Wait Time", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Time taken to create and process network initialization actions", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 25 - }, - "id": 9, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:create_network_actions_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:create_network_actions_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:create_network_actions_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Create Network Actions Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Ratio of cache hits to total cache accesses for value cache, broken down by value type", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percentunit" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 33 - }, - "id": 56, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum by (value_type) (rate(linera_value_cache_hit{validator=~\"$validator\", job=\"linera-linera-server\"}[5m]))\n/\n(\n sum by (value_type) (rate(linera_value_cache_hit{validator=~\"$validator\", job=\"linera-linera-server\"}[5m]))\n + sum by (value_type) (rate(linera_value_cache_miss{validator=~\"$validator\", job=\"linera-linera-server\"}[5m]))\n)", - "instant": false, - "legendFormat": "{{value_type}}", - "range": true, - "refId": "A" - } - ], - "title": "Value Cache Hit Ratio by Type", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate of value cache operations (hits + misses) per second, broken down by value type. Helps distinguish 0% hit ratio due to zero traffic vs actual misses.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 33 - }, - "id": 69, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum by (value_type) (\n rate(linera_value_cache_hit{validator=~\"$validator\", job=\"linera-linera-server\"}[5m])\n + rate(linera_value_cache_miss{validator=~\"$validator\", job=\"linera-linera-server\"}[5m])\n)", - "instant": false, - "legendFormat": "{{value_type}}", - "range": true, - "refId": "A" - } - ], - "title": "Value Cache Operations Rate by Type", - "type": "timeseries" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 41 - }, - "id": 10, - "panels": [], - "title": "Rates", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate at which new chains are being opened in the network", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 42 - }, - "id": 11, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_open_chain_count{validator=~\"$validator\", job=\"linera-linera-server\"}[1m])) by (instance)", - "legendFormat": "{{instance}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_open_chain_count{validator=~\"$validator\", job=\"linera-linera-server\"}[1m]))", - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Chains Opened per Second (1m avg)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate at which blocks are being added to chains", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 42 - }, - "id": 12, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_num_blocks{validator=~\"$validator\", job=\"linera-linera-server\"}[1m])) by (instance)", - "legendFormat": "{{instance}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_num_blocks{validator=~\"$validator\", job=\"linera-linera-server\"}[1m]))", - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Blocks Added to Chains per Second (1m avg)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate at which blocks are being executed by validators", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 50 - }, - "id": 13, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_num_blocks_executed{validator=~\"$validator\", job=\"linera-linera-server\"}[1m])) by (instance)", - "legendFormat": "{{instance}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_num_blocks_executed{validator=~\"$validator\", job=\"linera-linera-server\"}[1m]))", - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Blocks Executed per Second (1m avg)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate of transaction processing across the network", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 50 - }, - "id": 14, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_transaction_count{validator=~\"$validator\", job=\"linera-linera-server\"}[1m])) by (instance)", - "legendFormat": "{{instance}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_transaction_count{validator=~\"$validator\", job=\"linera-linera-server\"}[1m]))", - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Transactions per Second (1m avg)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate of individual operations being executed", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 58 - }, - "id": 15, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_operation_count{validator=~\"$validator\", job=\"linera-linera-server\"}[1m])) by (instance)", - "legendFormat": "{{instance}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_operation_count{validator=~\"$validator\", job=\"linera-linera-server\"}[1m]))", - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Operations per Second (1m avg)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate of incoming message bundles from other chains", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 58 - }, - "id": 16, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_incoming_bundle_count{validator=~\"$validator\", job=\"linera-linera-server\"}[1m])) by (instance)", - "legendFormat": "{{instance}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_incoming_bundle_count{validator=~\"$validator\", job=\"linera-linera-server\"}[1m]))", - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Incoming Bundles per Second (1m avg)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate of incoming messages from other chains", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 66 - }, - "id": 50, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_incoming_message_count{validator=~\"$validator\", job=\"linera-linera-server\"}[1m])) by (instance)", - "legendFormat": "{{instance}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_incoming_message_count{validator=~\"$validator\", job=\"linera-linera-server\"}[1m]))", - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Incoming Messages per Second (1m avg)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate at which the cross-chain message channel reaches capacity", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 66 - }, - "id": 59, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_notifications_skipped_receiver_lag{validator=~\"$validator\", job=\"linera-linera-server\"}[1m])) by (instance)", - "legendFormat": "{{instance}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_notifications_skipped_receiver_lag{validator=~\"$validator\", job=\"linera-linera-server\"}[1m]))", - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Notifications Skipped - Receiver lag, per Second (1m avg)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate at which the cross-chain message channel reaches capacity", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 74 - }, - "id": 18, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_cross_chain_message_channel_full{validator=~\"$validator\", job=\"linera-linera-server\"}[1m])) by (instance)", - "legendFormat": "{{instance}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_cross_chain_message_channel_full{validator=~\"$validator\", job=\"linera-linera-server\"}[1m]))", - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Cross Chain Message Channel Full per Second (1m avg)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate at which each validator is signing certificates", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 74 - }, - "id": 19, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_certificates_signed_count{validator=~\"$validator\", job=\"linera-linera-server\"}[1m])) by (validator)", - "legendFormat": "{{validator}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_certificates_signed_count{validator=~\"$validator\", job=\"linera-linera-server\"}[1m]))", - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Certificates Signed per Second per Validator (1m avg)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate at which the cross-chain message channel reaches capacity", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 82 - }, - "id": 60, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_notifications_dropped_no_receiver{validator=~\"$validator\", job=\"linera-linera-server\"}[1m])) by (instance)", - "legendFormat": "{{instance}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_notifications_dropped_no_receiver{validator=~\"$validator\", job=\"linera-linera-server\"}[1m]))", - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Notifications dropped - No receiver, per Second (1m avg)", - "type": "timeseries" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 90 - }, - "id": 21, - "panels": [], - "title": "Other", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of inbox queues maintained by each chain", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 91 - }, - "id": 24, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:num_inboxes:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:num_inboxes:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:num_inboxes:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Number of Inboxes", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of outbox queues maintained by each chain", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 91 - }, - "id": 25, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:num_outboxes:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:num_outboxes:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:num_outboxes:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Number of Outboxes", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of messages pending in chain inbox queues", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 99 - }, - "id": 26, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:inbox_size:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:inbox_size:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:inbox_size:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Inbox Size", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of messages pending in chain outbox queues", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 99 - }, - "id": 27, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:outbox_size:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:outbox_size:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:outbox_size:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Outbox Size", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of message bundles removed during processing", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 107 - }, - "id": 28, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:removed_bundles:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:removed_bundles:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:removed_bundles:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Removed Bundles", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of consensus rounds in block proposal phase", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 107 - }, - "id": 29, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:num_rounds_in_block_proposal:rate1m{validator=~\"$validator\"}) by (le, round_type))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:num_rounds_in_block_proposal:rate1m{validator=~\"$validator\"}) by (le, round_type))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:num_rounds_in_block_proposal:rate1m{validator=~\"$validator\"}) by (le, round_type))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Rounds in Block Proposal", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of consensus rounds required to create a certificate", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 115 - }, - "id": 23, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:num_rounds_in_certificate:rate1m{validator=~\"$validator\"}) by (le, certificate_value, round_type))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:num_rounds_in_certificate:rate1m{validator=~\"$validator\"}) by (le, certificate_value, round_type))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:num_rounds_in_certificate:rate1m{validator=~\"$validator\"}) by (le, certificate_value, round_type))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Rounds in Certificate", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 115 - }, - "id": 55, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "sum(linera_cross_chain_message_tasks{validator=~\"$validator\", job=\"linera-linera-server\"}) by (instance)", - "fullMetaSearch": false, - "includeNullMetadata": true, - "legendFormat": "__auto", - "range": true, - "refId": "A", - "useBackend": false - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "sum(linera_cross_chain_message_tasks{validator=~\"$validator\", job=\"linera-linera-server\"})", - "fullMetaSearch": false, - "hide": false, - "includeNullMetadata": true, - "legendFormat": "Total", - "range": true, - "refId": "B", - "useBackend": false - } - ], - "title": "Concurrent cross chain message tasks", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Total number of certificates signed by each validator", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 123 - }, - "id": 30, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "linera_certificates_signed_count{validator=~\"$validator\", job=\"linera-linera-server\"}", - "legendFormat": "{{validator}}", - "range": true, - "refId": "A" - } - ], - "title": "Certificates Signed per Validator", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 123 - }, - "id": 61, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "sum(linera_chain_worker_actors_active{validator=~\"$validator\", job=\"linera-linera-server\"}) by (instance)", - "fullMetaSearch": false, - "includeNullMetadata": true, - "legendFormat": "__auto", - "range": true, - "refId": "A", - "useBackend": false - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "sum(linera_chain_worker_actors_active{validator=~\"$validator\", job=\"linera-linera-server\"})", - "fullMetaSearch": false, - "hide": false, - "includeNullMetadata": true, - "legendFormat": "Total", - "range": true, - "refId": "B", - "useBackend": false - } - ], - "title": "Chain Worker Actors Active", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 131 - }, - "id": 63, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "sum(linera_chain_worker_endpoints_cached{validator=~\"$validator\", job=\"linera-linera-server\"}) by (instance)", - "fullMetaSearch": false, - "includeNullMetadata": true, - "legendFormat": "__auto", - "range": true, - "refId": "A", - "useBackend": false - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "sum(linera_chain_worker_endpoints_cached{validator=~\"$validator\", job=\"linera-linera-server\"})", - "fullMetaSearch": false, - "hide": false, - "includeNullMetadata": true, - "legendFormat": "Total", - "range": true, - "refId": "B", - "useBackend": false - } - ], - "title": "Chain Worker Endpoints Cached", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 131 - }, - "id": 62, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "sum(linera_chain_worker_states_loaded{validator=~\"$validator\", job=\"linera-linera-server\"}) by (instance)", - "fullMetaSearch": false, - "includeNullMetadata": true, - "legendFormat": "__auto", - "range": true, - "refId": "A", - "useBackend": false - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "sum(linera_chain_worker_states_loaded{validator=~\"$validator\", job=\"linera-linera-server\"})", - "fullMetaSearch": false, - "hide": false, - "includeNullMetadata": true, - "legendFormat": "Total", - "range": true, - "refId": "B", - "useBackend": false - } - ], - "title": "Chain Worker States Loaded", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Distribution of transactions per confirmed block", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 139 - }, - "id": 66, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:transactions_per_block:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:transactions_per_block:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:transactions_per_block:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Transactions Per Block", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Distribution of operations per confirmed block", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 139 - }, - "id": 64, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:operations_per_block:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:operations_per_block:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:operations_per_block:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Operations Per Block", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Distribution of incoming message bundles per confirmed block", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 147 - }, - "id": 65, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:incoming_bundles_per_block:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:incoming_bundles_per_block:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:incoming_bundles_per_block:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Incoming Bundles Per Block", - "type": "timeseries" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 155 - }, - "id": 31, - "panels": [], - "title": "Wasm", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Time taken to instantiate a WebAssembly contract module", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 156 - }, - "id": 32, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:wasm_contract_instantiation_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:wasm_contract_instantiation_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:wasm_contract_instantiation_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Wasm Contract Instantiation Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Time taken to instantiate a WebAssembly service module", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 156 - }, - "id": 33, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:wasm_service_instantiation_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:wasm_service_instantiation_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:wasm_service_instantiation_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Wasm Service Instantiation Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Amount of WebAssembly execution fuel consumed per block", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 164 - }, - "id": 34, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:wasm_fuel_used_per_block:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:wasm_fuel_used_per_block:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:wasm_fuel_used_per_block:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Wasm Fuel Used per Block", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of storage read operations during WebAssembly execution per block", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 164 - }, - "id": 35, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:wasm_num_reads_per_block:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:wasm_num_reads_per_block:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:wasm_num_reads_per_block:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Wasm Num Reads per Block", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Total bytes read from storage during WebAssembly execution per block", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 172 - }, - "id": 36, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:wasm_bytes_read_per_block:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:wasm_bytes_read_per_block:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:wasm_bytes_read_per_block:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Wasm Bytes Read per Block", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Total bytes written to storage during WebAssembly execution per block", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 172 - }, - "id": 37, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:wasm_bytes_written_per_block:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:wasm_bytes_written_per_block:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:wasm_bytes_written_per_block:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Wasm Bytes Written per Block", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 180 - }, - "id": 67, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(rate(linera_wasm_bytecode_size_bytes_bucket{validator=~\"$validator\"}[1m])) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(rate(linera_wasm_bytecode_size_bytes_bucket{validator=~\"$validator\"}[1m])) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(rate(linera_wasm_bytecode_size_bytes_bucket{validator=~\"$validator\"}[1m])) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "WASM Bytecode Size", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 180 - }, - "id": 68, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(rate(linera_wasm_bytecode_decompressed_size_bytes_bucket{validator=~\"$validator\"}[1m])) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(rate(linera_wasm_bytecode_decompressed_size_bytes_bucket{validator=~\"$validator\"}[1m])) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(rate(linera_wasm_bytecode_decompressed_size_bytes_bucket{validator=~\"$validator\"}[1m])) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "WASM Bytecode Decompressed Size", - "type": "timeseries" - } - ], - "preload": false, - "refresh": "30s", - "schemaVersion": 42, - "tags": [ - "linera" - ], - "templating": { - "list": [ - { - "allValue": ".*", - "current": { - "text": "All", - "value": "$__all" - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "label_values(linera_block_execution_latency_bucket, validator)", - "includeAll": true, - "label": "Validator", - "name": "validator", - "options": [], - "query": { - "query": "label_values(linera_block_execution_latency_bucket, validator)", - "refId": "PrometheusVariableQueryEditor-VariableQuery" - }, - "refresh": 1, - "regex": "", - "type": "query", - "multi": true - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "Execution", - "uid": "aeeg4vnzeku80d", - "weekStart": "" -} diff --git a/kubernetes/linera-validator/grafana-dashboards/linera/general.json b/kubernetes/linera-validator/grafana-dashboards/linera/general.json deleted file mode 100644 index 11b74cc46bc4..000000000000 --- a/kubernetes/linera-validator/grafana-dashboards/linera/general.json +++ /dev/null @@ -1,4177 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "label_replace(\n max without(uid, instance) (kube_pod_start_time{pod=~\"proxy-.*\", namespace=\"default\"})\n !=\n max without(uid, instance) (kube_pod_start_time{pod=~\"proxy-.*\", namespace=\"default\"} offset 5m),\n \"validator\",\n \"$1.testnet-conway.linera.net\",\n \"cluster\",\n \"gke-testnet-conway-(validator-\\\\d+)\"\n)", - "hide": false, - "iconColor": "rgba(255, 152, 48, 1)", - "limit": 100, - "name": "proxy_restart", - "showIn": 0, - "tagKeys": "validator,pod", - "tags": [], - "titleFormat": "proxy restart", - "type": "tags" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "label_replace(\n max without(uid, instance) (kube_pod_start_time{pod=~\"shards-.*\", namespace=\"default\"})\n !=\n max without(uid, instance) (kube_pod_start_time{pod=~\"shards-.*\", namespace=\"default\"} offset 5m),\n \"validator\",\n \"$1.testnet-conway.linera.net\",\n \"cluster\",\n \"gke-testnet-conway-(validator-\\\\d+)\"\n)", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "shard_restart", - "showIn": 0, - "tagKeys": "validator,pod", - "tags": [], - "titleFormat": "shard restart", - "type": "tags" - } - ] - }, - "description": "Comprehensive monitoring dashboard for Linera validator infrastructure including proxy metrics, server performance, and cluster resource utilization", - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 1, - "links": [], - "liveNow": true, - "panels": [ - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 14, - "panels": [], - "title": "Proxy", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate of incoming requests to the proxy layer, aggregated per pod", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "reqps" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 1 - }, - "id": 21, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_proxy_request_count{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\", traffic_type=~\"$traffic_type\"}[1m])) by (instance)", - "legendFormat": "__auto", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_proxy_request_count{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\", traffic_type=~\"$traffic_type\"}[1m]))", - "hide": false, - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Proxy requests per second (averaged for the past minute)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Percentage of failed proxy requests over 1 minute intervals", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 1 - }, - "id": 11, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "disableTextWrap": false, - "editorMode": "code", - "exemplar": false, - "expr": "(\n sum(rate(linera_proxy_request_error{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\", traffic_type=~\"$traffic_type\", method_name!=\"non_grpc\"}[1m])) by (method_name)\n) / (\n sum(rate(linera_proxy_request_success{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\", traffic_type=~\"$traffic_type\", method_name!=\"non_grpc\"}[1m])) by (method_name)\n +\n sum(rate(linera_proxy_request_error{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\", traffic_type=~\"$traffic_type\", method_name!=\"non_grpc\"}[1m])) by (method_name)\n) * 100", - "fullMetaSearch": false, - "hide": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "{{method_name}}", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "Proxy Error rate (1m)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Request latency percentiles for the proxy layer over 1 minute intervals", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 9 - }, - "id": 18, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:proxy_request_latency:rate1m{validator=~\"$validator\", traffic_type=~\"$traffic_type\"}) by (le))", - "format": "time_series", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "p99", - "range": true, - "refId": "A", - "useBackend": false - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:proxy_request_latency:rate1m{validator=~\"$validator\", traffic_type=~\"$traffic_type\"}) by (le))", - "instant": false, - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:proxy_request_latency:rate1m{validator=~\"$validator\", traffic_type=~\"$traffic_type\"}) by (le))", - "instant": false, - "legendFormat": "p50", - "range": true, - "refId": "C" - } - ], - "title": "Proxy Latency (ms)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Proxy request latency percentiles broken down by request type over 1 minute intervals", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 9 - }, - "id": 50, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(rate(linera_proxy_request_latency_bucket{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\", traffic_type=~\"$traffic_type\", method_name=~\"[A-Z][a-zA-Z]+\", method_name!~\"HEAD|ServerReflectionInfo\"}[1m])) by (le, method_name))", - "legendFormat": "{{method_name}} - p99", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(rate(linera_proxy_request_latency_bucket{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\", traffic_type=~\"$traffic_type\", method_name=~\"[A-Z][a-zA-Z]+\", method_name!~\"HEAD|ServerReflectionInfo\"}[1m])) by (le, method_name))", - "legendFormat": "{{method_name}} - p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(rate(linera_proxy_request_latency_bucket{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\", traffic_type=~\"$traffic_type\", method_name=~\"[A-Z][a-zA-Z]+\", method_name!~\"HEAD|ServerReflectionInfo\"}[1m])) by (le, method_name))", - "legendFormat": "{{method_name}} - p50", - "range": true, - "refId": "C" - } - ], - "title": "Proxy Latency by Request Type (ms)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Proxy request rate broken down by gRPC method name", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "reqps" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 17 - }, - "id": 51, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": true, - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_proxy_request_count{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\", traffic_type=~\"$traffic_type\", method_name=~\"[A-Z][a-zA-Z]+\", method_name!~\"HEAD|ServerReflectionInfo\"}[1m])) by (method_name)", - "legendFormat": "{{method_name}}", - "range": true, - "refId": "A" - } - ], - "title": "Proxy Request Rate by Request Type", - "type": "timeseries" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 25 - }, - "id": 15, - "panels": [], - "title": "Server", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate of incoming requests to the validator server, aggregated per pod", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "reqps" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 26 - }, - "id": 22, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum by(instance) (rate(linera_server_request_count{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\", traffic_type=~\"$traffic_type\"}[1m]))", - "legendFormat": "__auto", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_server_request_count{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\", traffic_type=~\"$traffic_type\"}[1m]))", - "hide": false, - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Server requests per second (averaged for the past minute)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Percentage of failed server requests over 1 minute intervals", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 26 - }, - "id": 12, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "(\n sum(rate(linera_server_request_error{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\", traffic_type=~\"$traffic_type\"}[1m])) by (method_name)\n) / (\n sum(rate(linera_server_request_success{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\", traffic_type=~\"$traffic_type\"}[1m])) by (method_name)\n +\n sum(rate(linera_server_request_error{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\", traffic_type=~\"$traffic_type\"}[1m])) by (method_name)\n) * 100", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "{{method_name}}", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "Server Error rate (1m)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Request latency percentiles for the server over 1 minute intervals", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 34 - }, - "id": 13, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:server_request_latency:rate1m{validator=~\"$validator\", traffic_type=~\"$traffic_type\"}) by (le))", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "p99", - "range": true, - "refId": "A", - "useBackend": false - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:server_request_latency:rate1m{validator=~\"$validator\", traffic_type=~\"$traffic_type\"}) by (le))", - "instant": false, - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:server_request_latency:rate1m{validator=~\"$validator\", traffic_type=~\"$traffic_type\"}) by (le))", - "instant": false, - "legendFormat": "p50", - "range": true, - "refId": "C" - } - ], - "title": "Server Latency (ms)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Request latency percentiles broken down by request type over 1 minute intervals", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 34 - }, - "id": 23, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(rate(linera_server_request_latency_bucket{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\", traffic_type=~\"$traffic_type\"}[1m])) by (le, method_name))", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "{{method_name}} - p99", - "range": true, - "refId": "A", - "useBackend": false - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(rate(linera_server_request_latency_bucket{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\", traffic_type=~\"$traffic_type\"}[1m])) by (le, method_name))", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "{{method_name}} - p90", - "range": true, - "refId": "B", - "useBackend": false - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(rate(linera_server_request_latency_bucket{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\", traffic_type=~\"$traffic_type\"}[1m])) by (le, method_name))", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "{{method_name}} - p50", - "range": true, - "refId": "C", - "useBackend": false - } - ], - "title": "Server Latency by Request Type (ms)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Server request rate broken down by gRPC method name", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "reqps" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 42 - }, - "id": 52, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": true, - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_server_request_count{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\", traffic_type=~\"$traffic_type\"}[1m])) by (method_name)", - "legendFormat": "{{method_name}}", - "range": true, - "refId": "A" - } - ], - "title": "Server Request Rate by Request Type", - "type": "timeseries" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 58 - }, - "id": 8, - "panels": [], - "title": "Cluster Info", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Total transmitted network bytes per validator pod", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "decbytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 59 - }, - "id": 9, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(container_network_transmit_bytes_total{validator=~\"$validator\",pod=~\"(proxy|shards)-.*\"}[60s])) by (pod)", - "hide": false, - "instant": false, - "legendFormat": "tx - {{pod}}", - "range": true, - "refId": "C" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(container_network_transmit_bytes_total{validator=~\"$validator\",pod=~\"(proxy|shards)-.*\"}[60s]))", - "hide": false, - "instant": false, - "legendFormat": "tx - Total", - "range": true, - "refId": "D" - } - ], - "title": "Network bytes TX total per pod", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Total received network bytes per validator pod", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "decbytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 59 - }, - "id": 47, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(container_network_receive_bytes_total{validator=~\"$validator\",pod=~\"(proxy|shards)-.*\"}[60s])) by (pod)", - "hide": false, - "instant": false, - "legendFormat": "tx - {{pod}}", - "range": true, - "refId": "C" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(container_network_receive_bytes_total{validator=~\"$validator\",pod=~\"(proxy|shards)-.*\"}[60s]))", - "hide": false, - "instant": false, - "legendFormat": "rx - Total", - "range": true, - "refId": "D" - } - ], - "title": "Network bytes RX total per pod", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Termination events per validator container", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 67 - }, - "id": 39, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(kube_pod_container_status_last_terminated_reason{validator=~\"$validator\",pod=~\"(proxy|shards)-.*\"}[1m])) by (pod, reason)", - "hide": false, - "instant": false, - "legendFormat": "{{pod}} - {{reason}}", - "range": true, - "refId": "B" - } - ], - "title": "Container termination", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Exit codes from terminated validator containers", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 67 - }, - "id": 46, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "kube_pod_container_status_last_terminated_exitcode{validator=~\"$validator\",pod=~\"(proxy|shards)-.*\"}", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "{{pod}}", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "Container termination exit code", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "CPU utilization per validator container", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 75 - }, - "id": 36, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(container_cpu_usage_seconds_total{validator=~\"$validator\",pod=~\"(proxy|shards)-.*\"}[60s])) by (pod)", - "instant": false, - "legendFormat": "{{pod}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(container_cpu_usage_seconds_total{validator=~\"$validator\",pod=~\"(proxy|shards)-.*\"}[60s]))", - "hide": false, - "instant": false, - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Container CPU Usage", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Memory allocation failures per validator container", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 75 - }, - "id": 29, - "options": { - "legend": { - "calcs": [ - "lastNotNull" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "sum by(pod, failure_type) (rate(container_memory_failures_total{validator=~\"$validator\",pod=~\"(proxy|shards)-.*\", failure_type!=\"pgfault\"}[60s]))", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "{{pod}} - {{failure_type}}", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "Container Memory Failures", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Filesystem read operations per second for validator shards", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "iops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 83 - }, - "id": 41, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(container_fs_reads_total{validator=~\"$validator\",container=\"linera-server\"}[60s])) by (pod)", - "instant": false, - "legendFormat": "{{pod}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(container_fs_reads_total{validator=~\"$validator\",container=\"linera-server\"}[60s]))", - "hide": false, - "instant": false, - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Shards FS reads per second", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Memory usage in bytes per validator container", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "decbytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 83 - }, - "id": 5, - "options": { - "legend": { - "calcs": [ - "lastNotNull" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "sum(container_memory_usage_bytes{validator=~\"$validator\",container=~\"linera.*\"}) by (container)", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "{{container}}", - "range": true, - "refId": "A", - "useBackend": false - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(container_memory_usage_bytes{validator=~\"$validator\",pod=~\"(proxy|shards).*\"}) by (pod)", - "hide": false, - "instant": false, - "legendFormat": "{{pod}}", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "sum(container_memory_usage_bytes{validator=~\"$validator\",container=~\"linera.*\"})", - "fullMetaSearch": false, - "hide": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "Total", - "range": true, - "refId": "C", - "useBackend": false - } - ], - "title": "Container Memory Usage Bytes", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Filesystem read throughput in bytes per second for validator shards", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "Bps" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 91 - }, - "id": 32, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(container_fs_reads_bytes_total{validator=~\"$validator\",container=\"linera-server\"}[60s])) by (pod)", - "instant": false, - "legendFormat": "{{pod}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(container_fs_reads_bytes_total{validator=~\"$validator\",container=\"linera-server\"}[60s]))", - "hide": false, - "instant": false, - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Shards FS read bytes per second", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Filesystem write operations per second for validator shards", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "iops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 91 - }, - "id": 31, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(container_fs_writes_total{validator=~\"$validator\",container=\"linera-server\"}[60s])) by (pod)", - "instant": false, - "legendFormat": "{{pod}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(container_fs_writes_total{validator=~\"$validator\",container=\"linera-server\"}[60s]))", - "hide": false, - "instant": false, - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Shards FS writes per second", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Filesystem write throughput in bytes per second for validator shards", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "Bps" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 99 - }, - "id": 44, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(container_fs_writes_bytes_total{validator=~\"$validator\",container=\"linera-server\"}[60s])) by (pod)", - "instant": false, - "legendFormat": "{{pod}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(container_fs_writes_bytes_total{validator=~\"$validator\",container=\"linera-server\"}[60s]))", - "hide": false, - "instant": false, - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Shards FS written bytes per second", - "type": "timeseries" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 107 - }, - "id": 34, - "panels": [], - "title": "Scylla Cluster Info", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Total transmitted network bytes for ScyllaDB pods", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "decbytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 108 - }, - "id": 30, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(container_network_transmit_bytes_total{validator=~\"$validator\",pod=~\"scylla-validator.*\"}[60s])) by (pod)", - "instant": false, - "legendFormat": "{{container}}", - "range": true, - "refId": "A" - } - ], - "title": "Scylla Network bytes TX total", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Total received network bytes for ScyllaDB pods", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "decbytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 108 - }, - "id": 48, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(container_network_receive_bytes_total{validator=~\"$validator\",pod=~\"scylla-validator.*\"}[60s])) by (pod)", - "instant": false, - "legendFormat": "{{container}}", - "range": true, - "refId": "A" - } - ], - "title": "Scylla Network bytes RX total", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Termination events for ScyllaDB containers", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 116 - }, - "id": 45, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "sum(rate(kube_pod_container_status_last_terminated_reason{validator=~\"$validator\",validator=~\"$validator\",pod=~\"(scylla)-.*\"}[1m])) by (pod, reason)", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "ScyllaDB Container termination", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Memory allocation failures for ScyllaDB containers", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 116 - }, - "id": 27, - "options": { - "legend": { - "calcs": [ - "lastNotNull" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "sum by(failure_type) (rate(container_memory_failures_total{validator=~\"$validator\",container=\"scylla\", failure_type!=\"pgfault\"}[60s]))", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "Scylla Memory Failures", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "CPU utilization for ScyllaDB containers", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 124 - }, - "id": 26, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(container_cpu_usage_seconds_total{validator=~\"$validator\",pod=~\"scylla-validator-.*\"}[60s])) by (pod)", - "instant": false, - "legendFormat": "{{container}}", - "range": true, - "refId": "A" - } - ], - "title": "ScyllaDB Total CPU Usage", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Out-of-memory events per second for ScyllaDB containers", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 124 - }, - "id": 38, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "sum(rate(container_oom_events_total{validator=~\"$validator\",pod=~\"scylla-validator-.*\"}[1m])) by (pod)", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "ScyllaDB OOM events per second", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Filesystem read operations per second for ScyllaDB", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "iops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 132 - }, - "id": 28, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(container_fs_reads_total{validator=~\"$validator\",container=\"scylla\"}[60s])) by (container)", - "instant": false, - "legendFormat": "{{container}}", - "range": true, - "refId": "A" - } - ], - "title": "ScyllaDB FS reads per second", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Memory usage in bytes for ScyllaDB containers", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "decbytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 132 - }, - "id": 10, - "options": { - "legend": { - "calcs": [ - "lastNotNull" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "sum(container_memory_usage_bytes{validator=~\"$validator\",pod=~\"scylla-validator.*\"}) by (pod)", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "Scylla Memory Usage Bytes", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Filesystem read throughput in bytes per second for ScyllaDB", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "Bps" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 140 - }, - "id": 42, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(container_fs_reads_bytes_total{validator=~\"$validator\",container=\"scylla\"}[60s])) by (container)", - "instant": false, - "legendFormat": "{{container}}", - "range": true, - "refId": "A" - } - ], - "title": "ScyllaDB FS read bytes per second", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Filesystem write operations per second for ScyllaDB", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "iops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 140 - }, - "id": 43, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(container_fs_writes_total{validator=~\"$validator\",container=\"scylla\"}[60s])) by (container)", - "instant": false, - "legendFormat": "{{container}}", - "range": true, - "refId": "A" - } - ], - "title": "ScyllaDB FS writes per second", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Filesystem write throughput in bytes per second for ScyllaDB", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "Bps" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 148 - }, - "id": 33, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(container_fs_writes_bytes_total{validator=~\"$validator\",container=\"scylla\"}[60s])) by (container)", - "instant": false, - "legendFormat": "{{container}}", - "range": true, - "refId": "A" - } - ], - "title": "ScyllaDB FS written bytes per second", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Proxy gRPC request errors split by error_type label (gRPC status code). Empty/missing label is bucketed as `_no_label` (some scrape targets may be on older code without PR #5951/#5966).", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "reqps" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 17 - }, - "id": 60, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum by (error_type) (label_replace(rate(linera_proxy_request_error{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\", traffic_type=~\"$traffic_type\"}[1m]), \"error_type\", \"_no_label\", \"error_type\", \"\"))", - "legendFormat": "{{error_type}}", - "range": true, - "refId": "A" - } - ], - "title": "Proxy Errors by error_type", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Server request errors split by error_type label (qualified Rust error variant: WorkerError::, ChainError::, ExecutionError::). Empty/missing label is bucketed as `_no_label` (some scrape targets may be on older code without PR #5951/#5966).", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "reqps" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 42 - }, - "id": 61, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum by (error_type) (label_replace(rate(linera_server_request_error{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\", traffic_type=~\"$traffic_type\"}[1m]), \"error_type\", \"_no_label\", \"error_type\", \"\"))", - "legendFormat": "{{error_type}}", - "range": true, - "refId": "A" - } - ], - "title": "Server Errors by error_type", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Top 20 (method_name \u00d7 error_type) pairs from server_request_error \u2014 pinpoints which gRPC method is failing with which error variant.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "reqps" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 50 - }, - "id": 62, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "topk(20, sum by (method_name, error_type) (label_replace(rate(linera_server_request_error{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\", traffic_type=~\"$traffic_type\"}[5m]), \"error_type\", \"_no_label\", \"error_type\", \"\")))", - "legendFormat": "{{method_name}} / {{error_type}}", - "range": true, - "refId": "A" - } - ], - "title": "Top Server Error Pairs (method \u00d7 error_type)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "fillOpacity": 10, - "lineWidth": 1, - "spanNulls": false - }, - "min": 0, - "unit": "percentunit" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 99 - }, - "id": 63, - "options": { - "legend": { - "calcs": [ - "lastNotNull", - "mean" - ], - "displayMode": "table", - "placement": "bottom" - }, - "tooltip": { - "mode": "multi" - } - }, - "targets": [ - { - "expr": "avg by (cluster) (rate(node_cpu_seconds_total{mode=\"steal\", cluster=~\"gke-testnet-conway-validator-.*\"}[5m]))", - "legendFormat": "{{cluster}}" - } - ], - "title": "CPU Steal Time (per validator cluster)", - "type": "timeseries" - } - ], - "preload": false, - "refresh": "30s", - "schemaVersion": 42, - "tags": [ - "linera" - ], - "templating": { - "list": [ - { - "allValue": ".*", - "current": { - "text": "All", - "value": "$__all" - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "includeAll": true, - "label": "Validator", - "multi": true, - "name": "validator", - "options": [], - "query": "label_values(linera_proxy_request_count, validator)", - "refresh": 1, - "regex": "", - "type": "query" - }, - { - "allValue": ".*", - "current": { - "text": "All", - "value": "$__all" - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "label_values(linera_proxy_request_count, traffic_type)", - "includeAll": true, - "label": "Traffic Type", - "multi": true, - "name": "traffic_type", - "options": [], - "query": "label_values(linera_proxy_request_count, traffic_type)", - "refresh": 1, - "regex": "", - "type": "query" - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "General", - "uid": "d1c10f4e-acbf-4cb9-9abd-bade0adcbd13", - "weekStart": "" -} diff --git a/kubernetes/linera-validator/grafana-dashboards/linera/logs.json b/kubernetes/linera-validator/grafana-dashboards/linera/logs.json deleted file mode 100644 index 4b6e79408701..000000000000 --- a/kubernetes/linera-validator/grafana-dashboards/linera/logs.json +++ /dev/null @@ -1,765 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "label_replace(max without(uid, instance) (kube_pod_start_time{pod=~\"proxy-.*\", namespace=\"default\"}) != max without(uid, instance) (kube_pod_start_time{pod=~\"proxy-.*\", namespace=\"default\"} offset 5m), \"validator\", \"$1.testnet-conway.linera.net\", \"cluster\", \"gke-testnet-conway-(validator-\\d+)\")", - "hide": false, - "iconColor": "rgba(255, 152, 48, 1)", - "limit": 100, - "name": "proxy_restart", - "showIn": 0, - "tagKeys": "validator,pod", - "tags": [], - "titleFormat": "proxy restart", - "type": "tags" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "label_replace(max without(uid, instance) (kube_pod_start_time{pod=~\"shards-.*\", namespace=\"default\"}) != max without(uid, instance) (kube_pod_start_time{pod=~\"shards-.*\", namespace=\"default\"} offset 5m), \"validator\", \"$1.testnet-conway.linera.net\", \"cluster\", \"gke-testnet-conway-(validator-\\d+)\")", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "shard_restart", - "showIn": 0, - "tagKeys": "validator,pod", - "tags": [], - "titleFormat": "shard restart", - "type": "tags" - } - ] - }, - "description": "Loki log analysis for Linera validator infrastructure - log volume, error tracking, and log stream", - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 1, - "links": [], - "liveNow": false, - "panels": [ - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 1, - "panels": [], - "title": "Overview", - "type": "row" - }, - { - "datasource": { - "type": "loki", - "uid": "loki" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 0, - "y": 1 - }, - "id": 2, - "options": { - "colorMode": "background", - "graphMode": "area", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "targets": [ - { - "datasource": { - "type": "loki", - "uid": "loki" - }, - "editorMode": "code", - "expr": "sum(count_over_time({validator=~\"$validator\", container=~\"$container\"} [$__interval]))", - "queryType": "range", - "refId": "A" - } - ], - "title": "Log Rate", - "type": "stat" - }, - { - "datasource": { - "type": "loki", - "uid": "loki" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 1 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 6, - "y": 1 - }, - "id": 3, - "options": { - "colorMode": "background", - "graphMode": "area", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "targets": [ - { - "datasource": { - "type": "loki", - "uid": "loki" - }, - "editorMode": "code", - "expr": "sum(count_over_time({validator=~\"$validator\", container=~\"$container\"} |= \" ERROR \" [$__interval]))", - "queryType": "range", - "refId": "A" - } - ], - "title": "Error Count", - "type": "stat" - }, - { - "datasource": { - "type": "loki", - "uid": "loki" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "yellow", - "value": 1 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 12, - "y": 1 - }, - "id": 4, - "options": { - "colorMode": "background", - "graphMode": "area", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "targets": [ - { - "datasource": { - "type": "loki", - "uid": "loki" - }, - "editorMode": "code", - "expr": "sum(count_over_time({validator=~\"$validator\", container=~\"$container\"} |= \" WARN \" [$__interval]))", - "queryType": "range", - "refId": "A" - } - ], - "title": "Warn Count", - "type": "stat" - }, - { - "datasource": { - "type": "loki", - "uid": "loki" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "yellow", - "value": 1 - }, - { - "color": "red", - "value": 5 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 18, - "y": 1 - }, - "id": 5, - "options": { - "colorMode": "background", - "graphMode": "area", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "targets": [ - { - "datasource": { - "type": "loki", - "uid": "loki" - }, - "editorMode": "code", - "expr": "sum(count_over_time({validator=~\"$validator\", container=~\"$container\"} |= \" ERROR \" [$__interval])) / sum(count_over_time({validator=~\"$validator\", container=~\"$container\"} [$__interval])) * 100", - "queryType": "range", - "refId": "A" - } - ], - "title": "Error Rate %", - "type": "stat" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 5 - }, - "id": 6, - "panels": [], - "title": "Log Volume", - "type": "row" - }, - { - "datasource": { - "type": "loki", - "uid": "loki" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "bars", - "fillOpacity": 80, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "normal" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": ".*ERROR.*" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": ".*WARN.*" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "orange", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": ".*INFO.*" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": ".*DEBUG.*" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "blue", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 16, - "x": 0, - "y": 6 - }, - "id": 7, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "type": "loki", - "uid": "loki" - }, - "editorMode": "code", - "expr": "sum by (level, validator) (count_over_time({validator=~\"$validator\", container=~\"$container\"} | pattern `<_> <_>` | level=~\"ERROR|WARN|INFO|DEBUG|TRACE\" [$__interval]))", - "legendFormat": "{{level}} - {{validator}}", - "queryType": "range", - "refId": "A" - } - ], - "title": "Log Volume by Level", - "type": "timeseries" - }, - { - "datasource": { - "type": "loki", - "uid": "loki" - }, - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "red", - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 8, - "x": 16, - "y": 6 - }, - "id": 8, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "type": "loki", - "uid": "loki" - }, - "editorMode": "code", - "expr": "sum by (validator) (count_over_time({validator=~\"$validator\", container=~\"$container\"} |= \" ERROR \" [$__interval]))", - "legendFormat": "{{validator}}", - "queryType": "range", - "refId": "A" - } - ], - "title": "Error Rate Trend", - "type": "timeseries" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 14 - }, - "id": 13, - "panels": [], - "title": "Log Stream", - "type": "row" - }, - { - "datasource": { - "type": "loki", - "uid": "loki" - }, - "gridPos": { - "h": 20, - "w": 24, - "x": 0, - "y": 15 - }, - "id": 14, - "maxDataPoints": 500, - "options": { - "dedupStrategy": "none", - "enableLogDetails": true, - "prettifyLogMessage": false, - "showTime": true, - "sortOrder": "Descending", - "wrapLogMessage": true - }, - "targets": [ - { - "datasource": { - "type": "loki", - "uid": "loki" - }, - "editorMode": "code", - "expr": "{validator=~\"$validator\", container=~\"$container\"} |= \"$level\" |~ \"$search\"", - "queryType": "range", - "refId": "A" - } - ], - "title": "Log Stream", - "type": "logs" - } - ], - "refresh": "1m", - "schemaVersion": 39, - "tags": [ - "linera" - ], - "templating": { - "list": [ - { - "allValue": ".*", - "current": { - "selected": false, - "text": "All", - "value": "$__all" - }, - "datasource": { - "type": "loki", - "uid": "loki" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "label": "Validator", - "multi": true, - "name": "validator", - "options": [], - "query": "label_values({container=~\"linera-.+\"}, validator)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "type": "query" - }, - { - "allValue": "linera-.+", - "current": { - "selected": false, - "text": "All", - "value": "$__all" - }, - "hide": 0, - "includeAll": true, - "label": "Container", - "multi": true, - "name": "container", - "options": [ - { - "selected": false, - "text": "linera-proxy", - "value": "linera-proxy" - }, - { - "selected": false, - "text": "linera-server", - "value": "linera-server" - }, - { - "selected": false, - "text": "linera-faucet", - "value": "linera-faucet" - }, - { - "selected": false, - "text": "linera-block-exporter", - "value": "linera-block-exporter" - } - ], - "query": "linera-proxy,linera-server,linera-faucet,linera-block-exporter", - "skipUrlSync": false, - "type": "custom" - }, - { - "current": { - "selected": false, - "text": "All", - "value": "" - }, - "hide": 0, - "includeAll": false, - "label": "Level", - "multi": false, - "name": "level", - "options": [ - { - "selected": true, - "text": "All", - "value": "" - }, - { - "selected": false, - "text": "ERROR", - "value": " ERROR " - }, - { - "selected": false, - "text": "WARN", - "value": " WARN " - }, - { - "selected": false, - "text": "INFO", - "value": " INFO " - }, - { - "selected": false, - "text": "DEBUG", - "value": " DEBUG " - } - ], - "query": ",ERROR,WARN,INFO,DEBUG", - "skipUrlSync": false, - "type": "custom" - }, - { - "current": { - "selected": false, - "text": "", - "value": "" - }, - "hide": 0, - "label": "Search", - "name": "search", - "options": [], - "query": "", - "skipUrlSync": false, - "type": "textbox" - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "Logs", - "uid": "linera-logs", - "version": 1, - "weekStart": "" -} diff --git a/kubernetes/linera-validator/grafana-dashboards/linera/storage/rocksdb.json b/kubernetes/linera-validator/grafana-dashboards/linera/storage/rocksdb.json deleted file mode 100644 index 4d1784ad3548..000000000000 --- a/kubernetes/linera-validator/grafana-dashboards/linera/storage/rocksdb.json +++ /dev/null @@ -1,2395 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "label_replace(max without(uid, instance) (kube_pod_start_time{pod=~\"shards-.*\", namespace=\"default\"}) != max without(uid, instance) (kube_pod_start_time{pod=~\"shards-.*\", namespace=\"default\"} offset 5m), \"validator\", \"$1.testnet-conway.linera.net\", \"cluster\", \"gke-testnet-conway-(validator-\\d+)\")", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "shard_restart", - "showIn": 0, - "tagKeys": "validator,pod", - "tags": [], - "titleFormat": "shard restart", - "type": "tags" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 1, - "panels": [], - "title": "RocksDB Metrics", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Internal RocksDB write batch latency", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 1 - }, - "id": 2, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, linera:rocksdb_internal_write_batch_latency:rate1m{job=~\"$job\"})", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, linera:rocksdb_internal_write_batch_latency:rate1m{job=~\"$job\"})", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, linera:rocksdb_internal_write_batch_latency:rate1m{job=~\"$job\"})", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "RocksDB Write Batch Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Internal RocksDB read value latency", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 1 - }, - "id": 3, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, linera:rocksdb_internal_read_value_bytes_latency:rate1m{job=~\"$job\"})", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, linera:rocksdb_internal_read_value_bytes_latency:rate1m{job=~\"$job\"})", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, linera:rocksdb_internal_read_value_bytes_latency:rate1m{job=~\"$job\"})", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "RocksDB Read Value Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Internal RocksDB contains key latency", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 9 - }, - "id": 4, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, linera:rocksdb_internal_contains_key_latency:rate1m{job=~\"$job\"})", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, linera:rocksdb_internal_contains_key_latency:rate1m{job=~\"$job\"})", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, linera:rocksdb_internal_contains_key_latency:rate1m{job=~\"$job\"})", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "RocksDB Contains Key Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Internal RocksDB prefix scan latency", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 9 - }, - "id": 5, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, linera:rocksdb_internal_find_keys_by_prefix_latency:rate1m{job=~\"$job\"})", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, linera:rocksdb_internal_find_keys_by_prefix_latency:rate1m{job=~\"$job\"})", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, linera:rocksdb_internal_find_keys_by_prefix_latency:rate1m{job=~\"$job\"})", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "RocksDB Find Keys By Prefix Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Size of write batches to RocksDB", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 17 - }, - "id": 6, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, linera:rocksdb_internal_write_batch_size:rate1m{job=~\"$job\"})", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, linera:rocksdb_internal_write_batch_size:rate1m{job=~\"$job\"})", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, linera:rocksdb_internal_write_batch_size:rate1m{job=~\"$job\"})", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "RocksDB Write Batch Size", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Size of keys read from RocksDB", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 17 - }, - "id": 7, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, linera:rocksdb_internal_read_value_key_size:rate1m{job=~\"$job\"})", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, linera:rocksdb_internal_read_value_key_size:rate1m{job=~\"$job\"})", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, linera:rocksdb_internal_read_value_key_size:rate1m{job=~\"$job\"})", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "RocksDB Read Value Key Size", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Size of values read from RocksDB", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 25 - }, - "id": 8, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, linera:rocksdb_internal_read_value_value_size:rate1m{job=~\"$job\"})", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, linera:rocksdb_internal_read_value_value_size:rate1m{job=~\"$job\"})", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, linera:rocksdb_internal_read_value_value_size:rate1m{job=~\"$job\"})", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "RocksDB Read Value Value Size", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Internal RocksDB batch contains check latency", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 25 - }, - "id": 9, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, linera:rocksdb_internal_contains_keys_latency:rate1m{job=~\"$job\"})", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, linera:rocksdb_internal_contains_keys_latency:rate1m{job=~\"$job\"})", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, linera:rocksdb_internal_contains_keys_latency:rate1m{job=~\"$job\"})", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "RocksDB Batch Contains Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Internal RocksDB batch read latency", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 33 - }, - "id": 10, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, linera:rocksdb_internal_read_multi_value_bytes_latency:rate1m{job=~\"$job\"})", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, linera:rocksdb_internal_read_multi_value_bytes_latency:rate1m{job=~\"$job\"})", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, linera:rocksdb_internal_read_multi_value_bytes_latency:rate1m{job=~\"$job\"})", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "RocksDB Batch Read Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of keys per batch read", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 33 - }, - "id": 11, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, linera:rocksdb_internal_read_multi_values_num_entries:rate1m{job=~\"$job\"})", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, linera:rocksdb_internal_read_multi_values_num_entries:rate1m{job=~\"$job\"})", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, linera:rocksdb_internal_read_multi_values_num_entries:rate1m{job=~\"$job\"})", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "RocksDB Batch Read Entries", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Internal RocksDB prefix scan with values latency", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 41 - }, - "id": 12, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, linera:rocksdb_internal_find_key_values_by_prefix_latency:rate1m{job=~\"$job\"})", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, linera:rocksdb_internal_find_key_values_by_prefix_latency:rate1m{job=~\"$job\"})", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, linera:rocksdb_internal_find_key_values_by_prefix_latency:rate1m{job=~\"$job\"})", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "RocksDB Find Key Values By Prefix Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Total size of keys per prefix scan", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 41 - }, - "id": 13, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, linera:rocksdb_internal_find_keys_by_prefix_keys_size:rate1m{job=~\"$job\"})", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, linera:rocksdb_internal_find_keys_by_prefix_keys_size:rate1m{job=~\"$job\"})", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, linera:rocksdb_internal_find_keys_by_prefix_keys_size:rate1m{job=~\"$job\"})", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "RocksDB Prefix Scan Keys Size", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of keys found per prefix scan", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 49 - }, - "id": 14, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, linera:rocksdb_internal_find_keys_by_prefix_num_keys:rate1m{job=~\"$job\"})", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, linera:rocksdb_internal_find_keys_by_prefix_num_keys:rate1m{job=~\"$job\"})", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, linera:rocksdb_internal_find_keys_by_prefix_num_keys:rate1m{job=~\"$job\"})", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "RocksDB Prefix Scan Keys Found", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate of read operations where the key did not exist in the database", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 49 - }, - "id": 15, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_rocksdb_internal_read_value_none_cases{job=~\"$job\"}[1m]))", - "legendFormat": "rate", - "range": true, - "refId": "A" - } - ], - "title": "RocksDB Read Key Not Found Rate", - "type": "timeseries" - } - ], - "preload": false, - "refresh": "30s", - "schemaVersion": 42, - "tags": [ - "linera", - "storage", - "rocksdb" - ], - "templating": { - "list": [ - { - "allValue": ".*", - "current": { - "text": "All", - "value": "$__all" - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "label_values(linera_rocksdb_internal_connect_latency_count, job)", - "includeAll": true, - "label": "Job", - "name": "job", - "options": [], - "query": { - "query": "label_values(linera_rocksdb_internal_connect_latency_count, job)", - "refId": "PrometheusVariableQueryEditor-VariableQuery" - }, - "refresh": 2, - "regex": "", - "sort": 1, - "type": "query" - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": {}, - "timezone": "browser", - "title": "RocksDB", - "uid": "linera-rocksdb", - "weekStart": "" -} diff --git a/kubernetes/linera-validator/grafana-dashboards/linera/storage/scylladb.json b/kubernetes/linera-validator/grafana-dashboards/linera/storage/scylladb.json deleted file mode 100644 index c83d3154e912..000000000000 --- a/kubernetes/linera-validator/grafana-dashboards/linera/storage/scylladb.json +++ /dev/null @@ -1,2924 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "label_replace(max without(uid, instance) (kube_pod_start_time{pod=~\"proxy-.*\", namespace=\"default\"}) != max without(uid, instance) (kube_pod_start_time{pod=~\"proxy-.*\", namespace=\"default\"} offset 5m), \"validator\", \"$1.testnet-conway.linera.net\", \"cluster\", \"gke-testnet-conway-(validator-\\d+)\")", - "hide": false, - "iconColor": "rgba(255, 152, 48, 1)", - "limit": 100, - "name": "proxy_restart", - "showIn": 0, - "tagKeys": "validator,pod", - "tags": [], - "titleFormat": "proxy restart", - "type": "tags" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "label_replace(max without(uid, instance) (kube_pod_start_time{pod=~\"shards-.*\", namespace=\"default\"}) != max without(uid, instance) (kube_pod_start_time{pod=~\"shards-.*\", namespace=\"default\"} offset 5m), \"validator\", \"$1.testnet-conway.linera.net\", \"cluster\", \"gke-testnet-conway-(validator-\\d+)\")", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "shard_restart", - "showIn": 0, - "tagKeys": "validator,pod", - "tags": [], - "titleFormat": "shard restart", - "type": "tags" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 1, - "links": [], - "panels": [ - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 1, - "panels": [], - "title": "ScyllaDB Metrics", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Internal ScyllaDB write batch latency", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 1 - }, - "id": 2, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:journaling_scylladb_internal_write_batch_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:journaling_scylladb_internal_write_batch_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:journaling_scylladb_internal_write_batch_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "ScyllaDB Write Batch Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Internal ScyllaDB read value latency", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 1 - }, - "id": 3, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:journaling_scylladb_internal_read_value_bytes_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:journaling_scylladb_internal_read_value_bytes_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:journaling_scylladb_internal_read_value_bytes_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "ScyllaDB Read Value Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Internal ScyllaDB contains key latency", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 9 - }, - "id": 4, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:journaling_scylladb_internal_contains_key_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:journaling_scylladb_internal_contains_key_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:journaling_scylladb_internal_contains_key_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "ScyllaDB Contains Key Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Internal ScyllaDB prefix scan latency", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 9 - }, - "id": 5, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:journaling_scylladb_internal_find_keys_by_prefix_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:journaling_scylladb_internal_find_keys_by_prefix_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:journaling_scylladb_internal_find_keys_by_prefix_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "ScyllaDB Find Keys By Prefix Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Size of write batches to ScyllaDB", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 17 - }, - "id": 6, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:journaling_scylladb_internal_write_batch_size:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:journaling_scylladb_internal_write_batch_size:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:journaling_scylladb_internal_write_batch_size:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "ScyllaDB Write Batch Size", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Size of keys read from ScyllaDB", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 17 - }, - "id": 7, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:journaling_scylladb_internal_read_value_key_size:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:journaling_scylladb_internal_read_value_key_size:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:journaling_scylladb_internal_read_value_key_size:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "ScyllaDB Read Value Key Size", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Size of values read from ScyllaDB", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 25 - }, - "id": 8, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:journaling_scylladb_internal_read_value_value_size:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:journaling_scylladb_internal_read_value_value_size:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:journaling_scylladb_internal_read_value_value_size:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "ScyllaDB Read Value Value Size", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Internal ScyllaDB batch contains check latency", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 25 - }, - "id": 9, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:journaling_scylladb_internal_contains_keys_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:journaling_scylladb_internal_contains_keys_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:journaling_scylladb_internal_contains_keys_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "ScyllaDB Batch Contains Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Internal ScyllaDB batch read latency", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 33 - }, - "id": 10, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:journaling_scylladb_internal_read_multi_value_bytes_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:journaling_scylladb_internal_read_multi_value_bytes_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:journaling_scylladb_internal_read_multi_value_bytes_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "ScyllaDB Batch Read Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of keys per batch read", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 33 - }, - "id": 11, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:journaling_scylladb_internal_read_multi_values_num_entries:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:journaling_scylladb_internal_read_multi_values_num_entries:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:journaling_scylladb_internal_read_multi_values_num_entries:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "ScyllaDB Batch Read Entries", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Internal ScyllaDB prefix scan with values latency", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 41 - }, - "id": 12, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:journaling_scylladb_internal_find_key_values_by_prefix_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:journaling_scylladb_internal_find_key_values_by_prefix_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:journaling_scylladb_internal_find_key_values_by_prefix_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "ScyllaDB Find Key Values By Prefix Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Total size of keys per prefix scan", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 41 - }, - "id": 13, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:journaling_scylladb_internal_find_keys_by_prefix_keys_size:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:journaling_scylladb_internal_find_keys_by_prefix_keys_size:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:journaling_scylladb_internal_find_keys_by_prefix_keys_size:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "ScyllaDB Prefix Scan Keys Size", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of keys found per prefix scan", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 49 - }, - "id": 14, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:journaling_scylladb_internal_find_keys_by_prefix_num_keys:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:journaling_scylladb_internal_find_keys_by_prefix_num_keys:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:journaling_scylladb_internal_find_keys_by_prefix_num_keys:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "ScyllaDB Prefix Scan Keys Found", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate of read operations where the key did not exist in the database", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 49 - }, - "id": 15, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_journaling_scylladb_internal_read_value_none_cases{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))", - "legendFormat": "rate", - "range": true, - "refId": "A" - } - ], - "title": "ScyllaDB Read Key Not Found Rate", - "type": "timeseries" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 57 - }, - "id": 16, - "panels": [], - "title": "ScyllaDB I/O", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "ScyllaDB disk read and write operations per second from the I/O scheduler", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 8, - "x": 0, - "y": 58 - }, - "id": 17, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum by(pod) (rate(scylla_io_queue_total_read_ops{namespace=\"scylla\", cluster=~\"$cluster\"}[5m]))", - "legendFormat": "{{pod}} read", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum by(pod) (rate(scylla_io_queue_total_write_ops{namespace=\"scylla\", cluster=~\"$cluster\"}[5m]))", - "legendFormat": "{{pod}} write", - "range": true, - "refId": "B" - } - ], - "title": "IOPS", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of requests queued in the ScyllaDB I/O scheduler", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 8, - "x": 8, - "y": 58 - }, - "id": 18, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "max by(pod) (scylla_io_queue_queue_length{namespace=\"scylla\", cluster=~\"$cluster\"})", - "legendFormat": "{{pod}}", - "range": true, - "refId": "A" - } - ], - "title": "I/O Queue Length", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Delay in the ScyllaDB I/O scheduler before requests are dispatched to disk", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 8, - "x": 16, - "y": 58 - }, - "id": 19, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "max by(pod) (scylla_io_queue_delay{namespace=\"scylla\", cluster=~\"$cluster\"})", - "legendFormat": "{{pod}}", - "range": true, - "refId": "A" - } - ], - "title": "I/O Delay", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Maps each Conway validator (GKE cluster) to its ScyllaDB cluster UUID used in scylla-manager backups. Joins scylla_manager_backup_files_size_bytes (UUID + manager pod) with kube_pod_info (manager pod -> GKE cluster). Only actively-backed-up clusters appear; stale scylla-manager registrations are filtered out.", - "fieldConfig": { - "defaults": { - "custom": { - "align": "left", - "cellOptions": { - "type": "auto" - }, - "filterable": false - }, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 24, - "x": 0, - "y": 66 - }, - "id": 20, - "options": { - "cellHeight": "sm", - "footer": { - "show": false - }, - "showHeader": true - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "group by (cluster, instance) (scylla_manager_backup_files_size_bytes)", - "format": "table", - "instant": true, - "range": false, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "group by (cluster, pod) (kube_pod_info{pod=~\"scylla-manager-[^-]+-[^-]+\"})", - "format": "table", - "instant": true, - "range": false, - "refId": "B" - } - ], - "title": "Validator → Scylla Cluster UUID", - "transformations": [ - { - "filter": { - "id": "byRefId", - "options": "A" - }, - "id": "organize", - "options": { - "excludeByName": { - "Time": true, - "Value": true, - "__name__": true, - "job": true, - "name": true - }, - "indexByName": {}, - "renameByName": { - "cluster": "scylla_cluster_uuid", - "instance": "manager_pod" - } - } - }, - { - "filter": { - "id": "byRefId", - "options": "B" - }, - "id": "organize", - "options": { - "excludeByName": { - "Time": true, - "Value": true, - "__name__": true, - "created_by_kind": true, - "created_by_name": true, - "exported_namespace": true, - "host_ip": true, - "host_network": true, - "job": true, - "namespace": true, - "node": true, - "pod_ip": true, - "uid": true - }, - "indexByName": {}, - "renameByName": { - "cluster": "validator_gke_cluster", - "pod": "manager_pod" - } - } - }, - { - "id": "joinByField", - "options": { - "byField": "manager_pod", - "mode": "inner" - } - }, - { - "id": "organize", - "options": { - "excludeByName": {}, - "indexByName": { - "manager_pod": 2, - "scylla_cluster_uuid": 1, - "validator_gke_cluster": 0 - }, - "renameByName": {} - } - } - ], - "type": "table" - } - ], - "tags": [ - "linera", - "storage", - "scylladb" - ], - "templating": { - "list": [ - { - "allValue": ".*", - "current": { - "text": "All", - "value": "$__all" - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "label_values(linera_load_view_latency_bucket, validator)", - "includeAll": true, - "label": "Validator", - "name": "validator", - "options": [], - "query": { - "query": "label_values(linera_load_view_latency_bucket, validator)", - "refId": "PrometheusVariableQueryEditor-VariableQuery" - }, - "refresh": 2, - "regex": "", - "sort": 1, - "type": "query", - "multi": true - }, - { - "allValue": ".*", - "current": { - "text": "All", - "value": "$__all" - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "label_values(scylla_io_queue_total_read_ops{namespace=\"scylla\"}, cluster)", - "includeAll": true, - "label": "Cluster", - "name": "cluster", - "options": [], - "query": { - "query": "label_values(scylla_io_queue_total_read_ops{namespace=\"scylla\"}, cluster)", - "refId": "PrometheusVariableQueryEditor-VariableQuery" - }, - "refresh": 2, - "regex": "", - "sort": 1, - "type": "query" - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": {}, - "timezone": "browser", - "title": "ScyllaDB", - "uid": "linera-scylladb", - "weekStart": "" -} diff --git a/kubernetes/linera-validator/grafana-dashboards/linera/storage/storage.json b/kubernetes/linera-validator/grafana-dashboards/linera/storage/storage.json deleted file mode 100644 index 54fbd8e9151e..000000000000 --- a/kubernetes/linera-validator/grafana-dashboards/linera/storage/storage.json +++ /dev/null @@ -1,3749 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "label_replace(max without(uid, instance) (kube_pod_start_time{pod=~\"proxy-.*\", namespace=\"default\"}) != max without(uid, instance) (kube_pod_start_time{pod=~\"proxy-.*\", namespace=\"default\"} offset 5m), \"validator\", \"$1.testnet-conway.linera.net\", \"cluster\", \"gke-testnet-conway-(validator-\\d+)\")", - "hide": false, - "iconColor": "rgba(255, 152, 48, 1)", - "limit": 100, - "name": "proxy_restart", - "showIn": 0, - "tagKeys": "validator,pod", - "tags": [], - "titleFormat": "proxy restart", - "type": "tags" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "label_replace(max without(uid, instance) (kube_pod_start_time{pod=~\"shards-.*\", namespace=\"default\"}) != max without(uid, instance) (kube_pod_start_time{pod=~\"shards-.*\", namespace=\"default\"} offset 5m), \"validator\", \"$1.testnet-conway.linera.net\", \"cluster\", \"gke-testnet-conway-(validator-\\d+)\")", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "shard_restart", - "showIn": 0, - "tagKeys": "validator,pod", - "tags": [], - "titleFormat": "shard restart", - "type": "tags" - } - ] - }, - "description": "Storage layer metrics including latencies for loading views, chains, contracts, and services, plus I/O operation rates", - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 1, - "links": [], - "panels": [ - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 1, - "panels": [], - "title": "Latencies", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Time to load chain state from storage. p50 is median, p90 is most users' experience, p99 captures tail latency.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 1 - }, - "id": 2, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:load_chain_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:load_chain_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:load_chain_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Load Chain Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Time to load a contract from storage. p50 is median, p90 is most users' experience, p99 captures tail latency.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 1 - }, - "id": 3, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:load_contract_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:load_contract_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:load_contract_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Load Contract Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Time to load a service from storage. p50 is median, p90 is most users' experience, p99 captures tail latency.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 9 - }, - "id": 4, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:load_service_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:load_service_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:load_service_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Load Service Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Time to read a certificate from storage", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 9 - }, - "id": 5, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:read_certificate_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:read_certificate_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:read_certificate_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Read Certificate Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Time to read a blob from storage", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 17 - }, - "id": 6, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:read_blob_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:read_blob_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:read_blob_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Read Blob Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Time to write a blob to storage", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 17 - }, - "id": 7, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:write_blob_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:write_blob_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:write_blob_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Write Blob Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Time to read an event from storage", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 25 - }, - "id": 8, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:read_event_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:read_event_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:read_event_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Read Event Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Time to write events to storage", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 25 - }, - "id": 9, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:write_event_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:write_event_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:write_event_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Write Event Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Time to write a batch to storage", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 33 - }, - "id": 10, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:write_batch_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:write_batch_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:write_batch_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Write Batch Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Time to check if a certificate exists in storage", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 33 - }, - "id": 11, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:contains_certificate_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:contains_certificate_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:contains_certificate_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Contains Certificate Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Time to check if a blob exists in storage", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 41 - }, - "id": 12, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:contains_blob_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:contains_blob_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:contains_blob_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Contains Blob Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Time to check if an event exists in storage", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 41 - }, - "id": 13, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:contains_event_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:contains_event_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:contains_event_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Contains Event Latency", - "type": "timeseries" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 49 - }, - "id": 14, - "panels": [], - "title": "Rates", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate of contains_blobs operations per second by pod.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 50 - }, - "id": 15, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_contains_blobs{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\",pod!=\"\"}[1m])) by (instance)", - "legendFormat": "{{instance}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_contains_blobs{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))", - "hide": false, - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Contains Blobs Rate", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate of contains_blob_state operations per second by pod.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 50 - }, - "id": 16, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_contains_blob_state{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\",pod!=\"\"}[1m])) by (instance)", - "legendFormat": "{{instance}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_contains_blob_state{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))", - "hide": false, - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Contains Blob State Rate", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate of event write operations per second by pod.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 58 - }, - "id": 17, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_write_event{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\",pod!=\"\"}[1m])) by (instance)", - "legendFormat": "{{instance}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_write_event{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))", - "hide": false, - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Write Event Rate", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate of event read operations per second by pod.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 58 - }, - "id": 18, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_read_event{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\",pod!=\"\"}[1m])) by (instance)", - "legendFormat": "{{instance}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_read_event{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))", - "hide": false, - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Read Event Rate", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate of certificate read operations (batch) per second by pod.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 66 - }, - "id": 19, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_read_certificates{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\",pod!=\"\"}[1m])) by (instance)", - "legendFormat": "{{instance}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_read_certificates{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))", - "hide": false, - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Read Certificates Rate (batch)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate of single certificate read operations per second by pod.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 66 - }, - "id": 20, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_read_certificate{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\",pod!=\"\"}[1m])) by (instance)", - "legendFormat": "{{instance}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_read_certificate{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))", - "hide": false, - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Read Certificate Rate (single)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate of blob state read operations (batch) per second by pod.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 74 - }, - "id": 21, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_read_blob_states{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\",pod!=\"\"}[1m])) by (instance)", - "legendFormat": "{{instance}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_read_blob_states{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))", - "hide": false, - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Read Blob States Rate (batch)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate of single blob state read operations per second by pod.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 74 - }, - "id": 22, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_read_blob_state{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\",pod!=\"\"}[1m])) by (instance)", - "legendFormat": "{{instance}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_read_blob_state{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))", - "hide": false, - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Read Blob State Rate (single)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate of blob write operations per second by pod.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 82 - }, - "id": 23, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_write_blob{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\",pod!=\"\"}[1m])) by (instance)", - "legendFormat": "{{instance}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_write_blob{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))", - "hide": false, - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Write Blob Rate", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate of blob read operations per second by pod.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 82 - }, - "id": 24, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_read_blob{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\",pod!=\"\"}[1m])) by (instance)", - "legendFormat": "{{instance}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_read_blob{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))", - "hide": false, - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Read Blob Rate", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate of certificate write operations per second by pod.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 90 - }, - "id": 25, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_write_certificate{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\",pod!=\"\"}[1m])) by (instance)", - "legendFormat": "{{instance}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_write_certificate{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))", - "hide": false, - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Write Certificate Rate", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate of confirmed block read operations per second by pod.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 90 - }, - "id": 26, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_read_confirmed_block{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\",pod!=\"\"}[1m])) by (instance)", - "legendFormat": "{{instance}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_read_confirmed_block{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))", - "hide": false, - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Read Confirmed Block Rate", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate of contains_blob operations per second by pod.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 98 - }, - "id": 27, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_contains_blob{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\",pod!=\"\"}[1m])) by (instance)", - "legendFormat": "{{instance}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_contains_blob{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))", - "hide": false, - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Contains Blob Rate", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate of contains_certificate operations per second by pod.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 98 - }, - "id": 28, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_contains_certificate{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\",pod!=\"\"}[1m])) by (instance)", - "legendFormat": "{{instance}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_contains_certificate{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))", - "hide": false, - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Contains Certificate Rate", - "type": "timeseries" - } - ], - "preload": false, - "refresh": "30s", - "schemaVersion": 42, - "tags": [ - "linera" - ], - "templating": { - "list": [ - { - "allValue": ".*", - "current": { - "text": "All", - "value": "$__all" - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "label_values(linera_load_view_latency_bucket, validator)", - "includeAll": true, - "label": "Validator", - "name": "validator", - "options": [], - "query": { - "query": "label_values(linera_load_view_latency_bucket, validator)", - "refId": "PrometheusVariableQueryEditor-VariableQuery" - }, - "refresh": 2, - "regex": "", - "sort": 1, - "type": "query", - "multi": true - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": {}, - "timezone": "browser", - "title": "Storage", - "uid": "deeg8st7mbegwc", - "weekStart": "" -} diff --git a/kubernetes/linera-validator/grafana-dashboards/linera/traces.json b/kubernetes/linera-validator/grafana-dashboards/linera/traces.json deleted file mode 100644 index a54f218052e8..000000000000 --- a/kubernetes/linera-validator/grafana-dashboards/linera/traces.json +++ /dev/null @@ -1,838 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "label_replace(max without(uid, instance) (kube_pod_start_time{pod=~\"proxy-.*\", namespace=\"default\"}) != max without(uid, instance) (kube_pod_start_time{pod=~\"proxy-.*\", namespace=\"default\"} offset 5m), \"validator\", \"$1.testnet-conway.linera.net\", \"cluster\", \"gke-testnet-conway-(validator-\\d+)\")", - "hide": false, - "iconColor": "rgba(255, 152, 48, 1)", - "limit": 100, - "name": "proxy_restart", - "showIn": 0, - "tagKeys": "validator,pod", - "tags": [], - "titleFormat": "proxy restart", - "type": "tags" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "label_replace(max without(uid, instance) (kube_pod_start_time{pod=~\"shards-.*\", namespace=\"default\"}) != max without(uid, instance) (kube_pod_start_time{pod=~\"shards-.*\", namespace=\"default\"} offset 5m), \"validator\", \"$1.testnet-conway.linera.net\", \"cluster\", \"gke-testnet-conway-(validator-\\d+)\")", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "shard_restart", - "showIn": 0, - "tagKeys": "validator,pod", - "tags": [], - "titleFormat": "shard restart", - "type": "tags" - } - ] - }, - "description": "Tempo distributed tracing for Linera validator infrastructure - RED metrics, latency analysis, and trace search", - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 1, - "links": [], - "liveNow": false, - "panels": [ - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 1, - "panels": [], - "title": "RED Overview", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "reqps" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 8, - "x": 0, - "y": 1 - }, - "id": 2, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_proxy_request_count{validator=~\"$validator\"}[5m])) by (method)", - "legendFormat": "proxy: {{method}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_server_request_count{validator=~\"$validator\"}[5m])) by (method)", - "legendFormat": "server: {{method}}", - "range": true, - "refId": "B" - } - ], - "title": "Request Rate by Component", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "red", - "mode": "fixed" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "reqps" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 8, - "x": 8, - "y": 1 - }, - "id": 3, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_proxy_request_count{validator=~\"$validator\", status=\"error\"}[5m])) by (method)", - "legendFormat": "proxy: {{method}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_server_request_count{validator=~\"$validator\", status=\"error\"}[5m])) by (method)", - "legendFormat": "server: {{method}}", - "range": true, - "refId": "B" - } - ], - "title": "Error Rate by Component", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 8, - "x": 16, - "y": 1 - }, - "id": 4, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(rate(linera_proxy_request_latency_bucket{validator=~\"$validator\"}[5m])) by (le))", - "legendFormat": "proxy p99", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(rate(linera_proxy_request_latency_bucket{validator=~\"$validator\"}[5m])) by (le))", - "legendFormat": "proxy p50", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(rate(linera_server_request_latency_bucket{validator=~\"$validator\"}[5m])) by (le))", - "legendFormat": "server p99", - "range": true, - "refId": "C" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(rate(linera_server_request_latency_bucket{validator=~\"$validator\"}[5m])) by (le))", - "legendFormat": "server p50", - "range": true, - "refId": "D" - } - ], - "title": "Request Latency P99/P50", - "type": "timeseries" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 9 - }, - "id": 5, - "panels": [], - "title": "Latency Analysis", - "type": "row" - }, - { - "datasource": { - "type": "tempo", - "uid": "tempo" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ns" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 10 - }, - "id": 6, - "options": { - "bucketCount": 30 - }, - "targets": [ - { - "datasource": { - "type": "tempo", - "uid": "tempo" - }, - "query": "{ resource.service.name =~ \"$service\" && duration > $min_duration }", - "queryType": "traceql", - "tableType": "traces", - "refId": "A" - } - ], - "title": "Trace Duration Histogram", - "type": "histogram" - }, - { - "datasource": { - "type": "tempo", - "uid": "tempo" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "traceID" - }, - "properties": [ - { - "id": "custom.hidden", - "value": false - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "duration" - }, - "properties": [ - { - "id": "custom.hidden", - "value": false - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "rootServiceName" - }, - "properties": [ - { - "id": "custom.hidden", - "value": false - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "rootTraceName" - }, - "properties": [ - { - "id": "custom.hidden", - "value": false - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "startTimeUnixNano" - }, - "properties": [ - { - "id": "custom.hidden", - "value": false - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 10 - }, - "id": 7, - "options": { - "sortBy": [ - { - "displayName": "Duration", - "desc": true - } - ] - }, - "targets": [ - { - "datasource": { - "type": "tempo", - "uid": "tempo" - }, - "query": "{ resource.service.name =~ \"$service\" && duration > $min_duration }", - "queryType": "traceql", - "tableType": "traces", - "limit": 20, - "refId": "A" - } - ], - "title": "Slow Traces", - "type": "table" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 18 - }, - "id": 8, - "panels": [], - "title": "Error Investigation", - "type": "row" - }, - { - "datasource": { - "type": "tempo", - "uid": "tempo" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 24, - "x": 0, - "y": 19 - }, - "id": 9, - "options": {}, - "targets": [ - { - "datasource": { - "type": "tempo", - "uid": "tempo" - }, - "query": "{ resource.service.name =~ \"$service\" && status = error }", - "queryType": "traceql", - "tableType": "traces", - "limit": 20, - "refId": "A" - } - ], - "title": "Error Traces", - "type": "table" - }, - { - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 27 - }, - "id": 12, - "panels": [ - { - "datasource": { - "type": "tempo", - "uid": "tempo" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 12, - "w": 24, - "x": 0, - "y": 45 - }, - "id": 13, - "options": {}, - "targets": [ - { - "datasource": { - "type": "tempo", - "uid": "tempo" - }, - "queryType": "serviceMap", - "serviceMapQuery": "{ resource.service.name =~ \"$service\" }", - "refId": "A" - } - ], - "title": "Service Map", - "type": "nodeGraph" - } - ], - "title": "Service Graph", - "type": "row" - } - ], - "refresh": "1m", - "schemaVersion": 39, - "tags": [ - "linera" - ], - "templating": { - "list": [ - { - "allValue": ".*", - "current": { - "selected": false, - "text": "All", - "value": "$__all" - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "label": "Validator", - "multi": true, - "name": "validator", - "options": [], - "query": "label_values(linera_proxy_request_count, validator)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "type": "query" - }, - { - "allValue": ".*", - "current": { - "selected": false, - "text": "All", - "value": "$__all" - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "label_values(traces_spanmetrics_calls_total, service)", - "hide": 0, - "includeAll": true, - "label": "Service", - "multi": true, - "name": "service", - "options": [], - "query": { - "query": "label_values(traces_spanmetrics_calls_total, service)", - "refId": "StandardVariableQuery" - }, - "refresh": 1, - "skipUrlSync": false, - "type": "query" - }, - { - "current": { - "selected": false, - "text": "100ms", - "value": "100ms" - }, - "hide": 0, - "includeAll": false, - "label": "Min Duration", - "multi": false, - "name": "min_duration", - "options": [ - { - "selected": true, - "text": "100ms", - "value": "100ms" - }, - { - "selected": false, - "text": "500ms", - "value": "500ms" - }, - { - "selected": false, - "text": "1s", - "value": "1s" - }, - { - "selected": false, - "text": "5s", - "value": "5s" - }, - { - "selected": false, - "text": "10s", - "value": "10s" - } - ], - "query": "100ms,500ms,1s,5s,10s", - "skipUrlSync": false, - "type": "custom" - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "Traces", - "uid": "linera-traces", - "version": 1, - "weekStart": "" -} diff --git a/kubernetes/linera-validator/grafana-dashboards/linera/views.json b/kubernetes/linera-validator/grafana-dashboards/linera/views.json deleted file mode 100644 index 0dd54cb3327c..000000000000 --- a/kubernetes/linera-validator/grafana-dashboards/linera/views.json +++ /dev/null @@ -1,1328 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "label_replace(max without(uid, instance) (kube_pod_start_time{pod=~\"proxy-.*\", namespace=\"default\"}) != max without(uid, instance) (kube_pod_start_time{pod=~\"proxy-.*\", namespace=\"default\"} offset 5m), \"validator\", \"$1.testnet-conway.linera.net\", \"cluster\", \"gke-testnet-conway-(validator-\\d+)\")", - "hide": false, - "iconColor": "rgba(255, 152, 48, 1)", - "limit": 100, - "name": "proxy_restart", - "showIn": 0, - "tagKeys": "validator,pod", - "tags": [], - "titleFormat": "proxy restart", - "type": "tags" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "label_replace(max without(uid, instance) (kube_pod_start_time{pod=~\"shards-.*\", namespace=\"default\"}) != max without(uid, instance) (kube_pod_start_time{pod=~\"shards-.*\", namespace=\"default\"} offset 5m), \"validator\", \"$1.testnet-conway.linera.net\", \"cluster\", \"gke-testnet-conway-(validator-\\d+)\")", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "shard_restart", - "showIn": 0, - "tagKeys": "validator,pod", - "tags": [], - "titleFormat": "shard restart", - "type": "tags" - } - ] - }, - "description": "Metrics related to view loading, saving, and caching operations", - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 1, - "links": [], - "liveNow": false, - "panels": [ - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 10, - "panels": [], - "title": "Latencies", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Time to load a view from storage. p50 is median, p90 is most users' experience, p99 captures tail latency.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 1 - }, - "id": 4, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:load_view_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:load_view_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:load_view_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Load View Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Time to save a view to storage. p50 is median, p90 is most users' experience, p99 captures tail latency.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p99" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 1 - }, - "id": 5, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(linera:save_view_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(linera:save_view_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p90", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(linera:save_view_latency:rate1m{validator=~\"$validator\"}) by (le))", - "legendFormat": "p99", - "range": true, - "refId": "C" - } - ], - "title": "Save View Latency", - "type": "timeseries" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 9 - }, - "id": 11, - "panels": [], - "title": "Rates", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate of view save operations per second, broken down by pod. Higher values indicate more state changes being persisted.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 10 - }, - "id": 3, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_save_view{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m])) by (instance)", - "legendFormat": "{{instance}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_save_view{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))", - "hide": false, - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Save View Rate", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate of view load operations per second, broken down by pod. Higher values indicate more state being read from storage.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 10 - }, - "id": 2, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_load_view{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m])) by (instance)", - "legendFormat": "{{instance}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_load_view{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))", - "hide": false, - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "Load View Rate", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Percentage of cache hits vs total cache accesses. Higher values indicate better cache efficiency and less storage I/O.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 18 - }, - "id": 1, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "(\n sum(rate(linera_num_cache_success{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))\n /\n (\n sum(rate(linera_num_cache_success{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))\n + sum(rate(linera_num_cache_fault{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))\n )\n) * 100", - "legendFormat": "Hit %", - "range": true, - "refId": "A" - } - ], - "title": "Cache Hit Ratio", - "type": "timeseries" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 26 - }, - "id": 12, - "panels": [], - "title": "LRU Cache", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "LRU cache hit percentage for read_value operations. Higher values mean fewer database reads.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 27 - }, - "id": 13, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "(\n sum(rate(linera_num_read_value_cache_hits{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))\n /\n (\n sum(rate(linera_num_read_value_cache_hits{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))\n + sum(rate(linera_num_read_value_cache_miss{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))\n )\n) * 100", - "legendFormat": "Hit %", - "range": true, - "refId": "A" - } - ], - "title": "LRU Read Value Hit %", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "LRU cache hit percentage for contains_key operations. Higher values mean fewer database lookups.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 27 - }, - "id": 14, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "(\n sum(rate(linera_num_contains_key_cache_hit{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))\n /\n (\n sum(rate(linera_num_contains_key_cache_hit{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))\n + sum(rate(linera_num_contains_key_cache_miss{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))\n )\n) * 100", - "legendFormat": "Hit %", - "range": true, - "refId": "A" - } - ], - "title": "LRU Contains Key Hit %", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "LRU cache hit percentage for find_keys_by_prefix operations.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 35 - }, - "id": 15, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "(\n sum(rate(linera_num_find_keys_by_prefix_cache_hit{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))\n /\n (\n sum(rate(linera_num_find_keys_by_prefix_cache_hit{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))\n + sum(rate(linera_num_find_keys_by_prefix_cache_miss{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))\n )\n) * 100", - "legendFormat": "Hit %", - "range": true, - "refId": "A" - } - ], - "title": "LRU Find Keys By Prefix Hit %", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "LRU cache hit percentage for find_key_values_by_prefix operations.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 35 - }, - "id": 16, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "(\n sum(rate(linera_num_find_key_values_by_prefix_cache_hit{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))\n /\n (\n sum(rate(linera_num_find_key_values_by_prefix_cache_hit{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))\n + sum(rate(linera_num_find_key_values_by_prefix_cache_miss{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))\n )\n) * 100", - "legendFormat": "Hit %", - "range": true, - "refId": "A" - } - ], - "title": "LRU Find Key Values By Prefix Hit %", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate of LRU cache operations per second. Shows the overall cache activity.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 43 - }, - "id": 17, - "options": { - "legend": { - "calcs": [ - "mean", - "max" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_num_read_value_cache_hits{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m])) + sum(rate(linera_num_read_value_cache_miss{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))", - "legendFormat": "read_value", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_num_contains_key_cache_hit{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m])) + sum(rate(linera_num_contains_key_cache_miss{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))", - "legendFormat": "contains_key", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_num_find_keys_by_prefix_cache_hit{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m])) + sum(rate(linera_num_find_keys_by_prefix_cache_miss{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))", - "legendFormat": "find_keys_by_prefix", - "range": true, - "refId": "C" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(linera_num_find_key_values_by_prefix_cache_hit{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m])) + sum(rate(linera_num_find_key_values_by_prefix_cache_miss{validator=~\"$validator\", job=~\"linera-linera-server|linera-linera-proxy\"}[1m]))", - "legendFormat": "find_key_values_by_prefix", - "range": true, - "refId": "D" - } - ], - "title": "LRU Cache Operations Rate", - "type": "timeseries" - } - ], - "refresh": "30s", - "schemaVersion": 38, - "style": "dark", - "tags": [ - "linera" - ], - "templating": { - "list": [ - { - "allValue": ".*", - "current": { - "selected": false, - "text": "All", - "value": "$__all" - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "label_values(linera_load_view, validator)", - "hide": 0, - "includeAll": true, - "label": "Validator", - "multi": true, - "name": "validator", - "options": [], - "query": { - "query": "label_values(linera_load_view, validator)", - "refId": "PrometheusVariableQueryEditor-VariableQuery" - }, - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "type": "query" - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": {}, - "timezone": "browser", - "title": "Views", - "uid": "aeeg8d3516zuof", - "weekStart": "" -} diff --git a/kubernetes/linera-validator/grafana-dashboards/linera/vms/ethereum.json b/kubernetes/linera-validator/grafana-dashboards/linera/vms/ethereum.json deleted file mode 100644 index 79b5517bbe8e..000000000000 --- a/kubernetes/linera-validator/grafana-dashboards/linera/vms/ethereum.json +++ /dev/null @@ -1,439 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "label_replace(max without(uid, instance) (kube_pod_start_time{pod=~\"shards-.*\", namespace=\"default\"}) != max without(uid, instance) (kube_pod_start_time{pod=~\"shards-.*\", namespace=\"default\"} offset 5m), \"validator\", \"$1.testnet-conway.linera.net\", \"cluster\", \"gke-testnet-conway-(validator-\\d+)\")", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "shard_restart", - "showIn": 0, - "tagKeys": "validator,pod", - "tags": [], - "titleFormat": "shard restart", - "type": "tags" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 1, - "links": [], - "liveNow": false, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "11.6.0-83314", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(rate(linera_evm_contract_instantiation_latency_bucket[1m])) by (le))", - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "EVM Contract Instantiation Latency p99 (1m)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "11.6.0-83314", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(rate(linera_evm_contract_instantiation_latency_bucket[1m])) by (le))", - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "EVM Contract Instantiation Latency p50 (1m)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "11.6.0-83314", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(rate(linera_evm_service_instantiation_latency_bucket[1m])) by (le))", - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "EVM Service Instantiation Latency p99 (1m)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "11.6.0-83314", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(rate(linera_evm_service_instantiation_latency_bucket[1m])) by (le))", - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "EVM Service Instantiation Latency p50 (1m)", - "type": "timeseries" - } - ], - "refresh": "", - "schemaVersion": 38, - "style": "dark", - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": {}, - "timezone": "browser", - "title": "Ethereum", - "uid": "beeghfwg5l7uod", - "version": 1, - "weekStart": "" -} diff --git a/kubernetes/linera-validator/grafana-dashboards/profiling/cpu.json b/kubernetes/linera-validator/grafana-dashboards/profiling/cpu.json deleted file mode 100644 index 19091caa7e9d..000000000000 --- a/kubernetes/linera-validator/grafana-dashboards/profiling/cpu.json +++ /dev/null @@ -1,431 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 1, - "links": [], - "liveNow": false, - "panels": [ - { - "datasource": { - "type": "grafana-pyroscope-datasource", - "uid": "pyroscope" - }, - "gridPos": { - "h": 12, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 1, - "targets": [ - { - "datasource": { - "type": "grafana-pyroscope-datasource", - "uid": "pyroscope" - }, - "groupBy": [], - "labelSelector": "{service_name=\"ebpf/default/proxy/\"}", - "profileTypeId": "process_cpu:cpu:nanoseconds:cpu:nanoseconds", - "queryType": "profile", - "refId": "A" - } - ], - "title": "CPU Profile Flamegraph - Proxies", - "type": "flamegraph" - }, - { - "datasource": { - "type": "grafana-pyroscope-datasource", - "uid": "pyroscope" - }, - "gridPos": { - "h": 12, - "w": 24, - "x": 0, - "y": 12 - }, - "id": 4, - "targets": [ - { - "datasource": { - "type": "grafana-pyroscope-datasource", - "uid": "pyroscope" - }, - "groupBy": [], - "labelSelector": "{service_name=\"ebpf/default/shards/\"}", - "profileTypeId": "process_cpu:cpu:nanoseconds:cpu:nanoseconds", - "queryType": "profile", - "refId": "A" - } - ], - "title": "CPU Profile Flamegraph - Shards", - "type": "flamegraph" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 2, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "rate(pyroscope_distributor_received_samples_count[5m])", - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "Profile Ingestion Rate", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 3, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_PROMETHEUS}" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "rate(pyroscope_distributor_received_decompressed_bytes_sum[5m])", - "fullMetaSearch": false, - "includeNullMetadata": true, - "legendFormat": "Bytes/sec", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "Profile Data Volume", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 30 - }, - "id": 5, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "pyroscope_distributor_received_compressed_bytes_sum - pyroscope_distributor_received_compressed_bytes_sum offset 1h", - "legendFormat": "Compressed Data (1h)", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "pyroscope_distributor_received_decompressed_bytes_sum - pyroscope_distributor_received_decompressed_bytes_sum offset 1h", - "legendFormat": "Decompressed Data (1h)", - "range": true, - "refId": "B" - } - ], - "title": "Data Compression Efficiency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "yellow", - "value": 1000 - }, - { - "color": "red", - "value": 5000 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 12, - "x": 12, - "y": 30 - }, - "id": 6, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "pyroscope_distributor_ingester_clients", - "range": true, - "refId": "A" - } - ], - "title": "Active Ingester Clients", - "type": "stat" - } - ], - "refresh": "30s", - "schemaVersion": 38, - "style": "dark", - "tags": [ - "linera", - "profiling", - "cpu" - ], - "templating": { - "list": [] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": {}, - "timezone": "browser", - "title": "CPU", - "uid": "ee74af8d-0448-45cd-bdbc-f9108b3378b7", - "weekStart": "" -} diff --git a/kubernetes/linera-validator/grafana-dashboards/profiling/jemalloc-memory.json b/kubernetes/linera-validator/grafana-dashboards/profiling/jemalloc-memory.json deleted file mode 100644 index d51f351ff53f..000000000000 --- a/kubernetes/linera-validator/grafana-dashboards/profiling/jemalloc-memory.json +++ /dev/null @@ -1,145 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 1, - "links": [], - "liveNow": false, - "panels": [ - { - "datasource": { - "type": "grafana-pyroscope-datasource", - "uid": "pyroscope" - }, - "gridPos": { - "h": 12, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 1, - "options": { - "displayMode": "flamegraph" - }, - "targets": [ - { - "datasource": { - "type": "grafana-pyroscope-datasource", - "uid": "pyroscope" - }, - "groupBy": [], - "labelSelector": "{service_name=\"memory/default/shards/\"}", - "profileTypeId": "memory:inuse_space:bytes:space:bytes", - "queryType": "profile", - "refId": "A" - } - ], - "title": "Memory Allocation Flamegraph - Server", - "type": "flamegraph" - }, - { - "datasource": { - "type": "grafana-pyroscope-datasource", - "uid": "${datasource}" - }, - "gridPos": { - "h": 12, - "w": 24, - "x": 0, - "y": 12 - }, - "id": 2, - "options": { - "displayMode": "flamegraph" - }, - "targets": [ - { - "datasource": { - "type": "grafana-pyroscope-datasource", - "uid": "${datasource}" - }, - "groupBy": [], - "labelSelector": "{service_name=\"memory/default/proxy/\"}", - "profileTypeId": "memory:inuse_space:bytes:space:bytes", - "queryType": "profile", - "refId": "A" - } - ], - "title": "Memory Allocation Flamegraph - Proxy", - "type": "flamegraph" - } - ], - "refresh": "30s", - "schemaVersion": 38, - "style": "dark", - "tags": [ - "linera", - "memory", - "profiling" - ], - "templating": { - "list": [ - { - "current": { - "selected": false, - "text": "Pyroscope", - "value": "pyroscope" - }, - "hide": 0, - "includeAll": false, - "label": "Pyroscope Datasource", - "multi": false, - "name": "datasource", - "options": [], - "query": "grafana-pyroscope-datasource", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "type": "datasource" - }, - { - "current": { - "selected": false, - "text": "Prometheus", - "value": "prometheus" - }, - "hide": 0, - "includeAll": false, - "label": "Prometheus Datasource", - "multi": false, - "name": "prometheus_datasource", - "options": [], - "query": "prometheus", - "queryValue": "", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "type": "datasource" - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "Memory", - "uid": "linera-memory-profiling", - "weekStart": "" -} diff --git a/kubernetes/linera-validator/grafana-dashboards/scylla-manager/scylla-manager.3.4.json b/kubernetes/linera-validator/grafana-dashboards/scylla-manager/scylla-manager.3.4.json deleted file mode 100644 index 7dfd075be38c..000000000000 --- a/kubernetes/linera-validator/grafana-dashboards/scylla-manager/scylla-manager.3.4.json +++ /dev/null @@ -1,1727 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - }, - { - "class": "annotation_restart", - "datasource": "prometheus", - "enable": true, - "expr": "resets(scylla_gossip_heart_beat{cluster=\"$cluster\"}[$__rate_interval])>0", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "node_restart", - "showIn": 0, - "tagKeys": "instance,dc,cluster", - "tags": [], - "titleFormat": "restart", - "type": "tags" - }, - { - "class": "annotation_manager_task", - "datasource": "prometheus", - "enable": true, - "expr": "scylla_manager_task_active_count{type=~\"repair|backup\",cluster=\"$cluster\"}>0", - "hide": false, - "iconColor": "#73BF69", - "limit": 100, - "name": "Task", - "showIn": 0, - "tagKeys": "type", - "tags": [], - "titleFormat": "Running", - "type": "tags" - }, - { - "class": "annotation_manager_task_failed", - "datasource": "prometheus", - "enable": true, - "expr": "sum(changes(scylla_manager_task_run_total{status=\"ERROR\", cluster=\"$cluster\"}[$__rate_interval])) by(type)>0", - "hide": false, - "iconColor": "#73BF69", - "limit": 100, - "name": "Failed", - "showIn": 0, - "tagKeys": "type", - "tags": [], - "titleFormat": "Task Failed", - "type": "tags" - } - ] - }, - "class": "dashboard", - "editable": true, - "gnetId": null, - "graphTooltip": 1, - "hideControls": true, - "id": null, - "links": [ - { - "asDropdown": true, - "icon": "external link", - "includeVars": true, - "keepTime": true, - "tags": [], - "type": "dashboards" - } - ], - "originalTitle": "Scylla Manager Metrics", - "overwrite": true, - "panels": [ - { - "class": "text_panel", - "datasource": null, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "gridPos": { - "h": 3, - "w": 24, - "x": 0, - "y": 1 - }, - "id": 1, - "isNew": true, - "links": [], - "mode": "html", - "options": { - "content": "

\n\n [[cluster_name]]
", - "mode": "html" - }, - "span": 12, - "title": "", - "transparent": true, - "type": "text" - }, - { - "class": "small_stat", - "datasource": "prometheus", - "fieldConfig": { - "defaults": { - "mappings": [ - { - "from": "", - "id": 0, - "text": "Online", - "to": "", - "type": 1, - "value": "0" - }, - { - "from": "", - "id": 1, - "text": "Offline", - "to": "", - "type": 1, - "value": "1" - } - ], - "noValue": " Offline", - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "red", - "value": null - }, - { - "color": "green", - "value": 0 - } - ] - } - } - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 0, - "y": 3 - }, - "id": 2, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "7.1.3", - "span": 3, - "targets": [ - { - "expr": "count(scrape_samples_scraped{job=\"scylla_manager\"}==0) OR vector(0)", - "intervalFactor": 1, - "refId": "A", - "step": 40 - } - ], - "timeFrom": null, - "timeShift": null, - "title": "Manager", - "type": "stat" - }, - { - "class": "small_stat", - "datasource": "prometheus", - "fieldConfig": { - "defaults": { - "custom": {}, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 2, - "y": 3 - }, - "id": 3, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "7.1.3", - "targets": [ - { - "expr": "count(scylla_manager_healthcheck_cql_rtt_ms{cluster=\"$cluster\"})", - "intervalFactor": 1, - "legendFormat": "Total Nodes", - "refId": "A", - "step": 40 - } - ], - "timeFrom": null, - "timeShift": null, - "title": "Total Nodes", - "type": "stat" - }, - { - "class": "small_stat", - "datasource": "prometheus", - "description": "The number of nodes that Scylla manager CQL probe failed connecting to. It could indicate a network or a node problem", - "fieldConfig": { - "defaults": { - "custom": {}, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 1 - } - ] - } - } - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 4, - "y": 3 - }, - "id": 4, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "7.1.3", - "targets": [ - { - "expr": "count((scylla_manager_healthcheck_cql_status{cluster=\"$cluster\"}==-1) and on(instance) (scylla_node_operation_mode{cluster=\"$cluster\"} == 3) ) OR vector(0)", - "intervalFactor": 1, - "legendFormat": "Nodes without CQL connection", - "refId": "A", - "step": 20 - } - ], - "thresholds": "1,2", - "timeFrom": null, - "timeShift": null, - "title": "CQL Fail", - "type": "stat" - }, - { - "class": "vertical_lcd", - "datasource": "prometheus", - "fieldConfig": { - "defaults": { - "custom": {}, - "decimals": 0, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 6, - "y": 3 - }, - "id": 5, - "options": { - "displayMode": "lcd", - "orientation": "vertical", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "showUnfilled": true - }, - "pluginVersion": "7.1.3", - "span": 2, - "targets": [ - { - "expr": "sum(scylla_manager_repair_progress{cluster=\"$cluster\", job=\"scylla_manager\"}) or on() manager:repair_progress{cluster=~\"[[cluster]]\"}*100", - "format": "time_series", - "intervalFactor": 2, - "refId": "A" - } - ], - "timeFrom": null, - "timeShift": null, - "title": "Repair", - "type": "bargauge" - }, - { - "class": "small_stat", - "datasource": "prometheus", - "description": "The time of the last successful repair", - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "green", - "mode": "fixed" - }, - "custom": {}, - "mappings": [], - "noValue": "Never", - "thresholds": { - "mode": "absolute", - "steps": [] - }, - "unit": "dateTimeAsIsoNoDateIfToday" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 8, - "y": 3 - }, - "id": 6, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "7.1.3", - "targets": [ - { - "expr": "manager:repair_done_ts{cluster=\"$cluster\"}*1000", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 40 - } - ], - "timeFrom": null, - "timeShift": null, - "title": "Last repair", - "type": "stat" - }, - { - "class": "small_stat", - "datasource": "prometheus", - "description": "The time of the last failed repair", - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "green", - "mode": "fixed" - }, - "custom": {}, - "mappings": [], - "noValue": "Never", - "thresholds": { - "mode": "absolute", - "steps": [] - }, - "unit": "dateTimeAsIsoNoDateIfToday" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 10, - "y": 3 - }, - "id": 7, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "7.1.3", - "targets": [ - { - "expr": "manager:repair_fail_ts{cluster=\"$cluster\"}*1000", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 40 - } - ], - "timeFrom": null, - "timeShift": null, - "title": "Last Failure", - "type": "stat" - }, - { - "class": "vertical_lcd", - "datasource": "prometheus", - "fieldConfig": { - "defaults": { - "custom": {}, - "decimals": 0, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 12, - "y": 3 - }, - "id": 8, - "options": { - "displayMode": "lcd", - "orientation": "vertical", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "showUnfilled": true - }, - "pluginVersion": "7.1.3", - "span": 2, - "targets": [ - { - "expr": "manager:backup_progress{cluster=~\"[[cluster]]\"}*100", - "format": "time_series", - "intervalFactor": 2, - "refId": "A" - } - ], - "timeFrom": null, - "timeShift": null, - "title": "Backup", - "type": "bargauge" - }, - { - "class": "small_stat", - "datasource": "prometheus", - "description": "The time of the last successful backup", - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "green", - "mode": "fixed" - }, - "custom": {}, - "mappings": [], - "noValue": "Never", - "thresholds": { - "mode": "absolute", - "steps": [] - }, - "unit": "dateTimeAsIsoNoDateIfToday" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 14, - "y": 3 - }, - "id": 9, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "7.1.3", - "targets": [ - { - "expr": "manager:backup_done_ts{cluster=\"$cluster\"}*1000", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 40 - } - ], - "timeFrom": null, - "timeShift": null, - "title": "Last Backup", - "type": "stat" - }, - { - "class": "small_stat", - "datasource": "prometheus", - "description": "The time of the last failed backup", - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "green", - "mode": "fixed" - }, - "custom": {}, - "mappings": [], - "noValue": "Never", - "thresholds": { - "mode": "absolute", - "steps": [] - }, - "unit": "dateTimeAsIsoNoDateIfToday" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 16, - "y": 3 - }, - "id": 10, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "7.1.3", - "targets": [ - { - "expr": "manager:backup_fail_ts{cluster=\"$cluster\"}*1000", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 40 - } - ], - "timeFrom": null, - "timeShift": null, - "title": "Last Failure", - "type": "stat" - }, - { - "class": "percent_panel", - "datasource": "prometheus", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "class": "fieldConfig_defaults", - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "class": "fieldConfig_defaults_custom", - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 4, - "x": 0, - "y": 7 - }, - "id": 11, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 2, - "targets": [ - { - "expr": "sum(scylla_manager_repair_progress{cluster=\"$cluster\", job=\"scylla_manager\"}) or on() manager:repair_progress{cluster=~\"[[cluster]]\"}*100", - "format": "time_series", - "intervalFactor": 2, - "refId": "A" - } - ], - "title": "Repair Progress", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": "prometheus", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "links": [], - "unit": "si:tr/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 10, - "x": 4, - "y": 7 - }, - "id": 12, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 5, - "targets": [ - { - "expr": "sum(rate(scylla_manager_repair_token_ranges_success{cluster=~\"[[cluster]]\", instance=~\"$instance\", shard=~\"$shard\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "refId": "A", - "step": 4 - } - ], - "title": "Repair Token-Range Rate", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": "prometheus", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "links": [], - "unit": "si:tr/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 10, - "x": 14, - "y": 7 - }, - "id": 13, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 5, - "targets": [ - { - "expr": "sum(rate(scylla_manager_repair_token_ranges_error{cluster=~\"[[cluster]]\", instance=~\"$instance\", shard=~\"$shard\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "refId": "A", - "step": 4 - } - ], - "title": "Repair Token-Range Error Rate", - "type": "timeseries" - }, - { - "class": "percentunit_panel", - "datasource": "prometheus", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "class": "fieldConfig_defaults", - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMax": 1, - "axisSoftMin": 0, - "barAlignment": 0, - "class": "fieldConfig_defaults_custom", - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "unit": "percentunit" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 4, - "x": 0, - "y": 13 - }, - "id": 14, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 2, - "targets": [ - { - "expr": "manager:backup_progress{cluster=~\"[[cluster]]\"}", - "format": "time_series", - "intervalFactor": 2, - "refId": "A" - } - ], - "title": "Backup Progress", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": "prometheus", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "links": [], - "unit": "decbytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 4, - "y": 13 - }, - "id": 15, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "expr": "sum(scylla_manager_backup_files_uploaded_bytes{cluster=~\"[[cluster]]\", instance=~\"$instance\", shard=~\"$shard\"}) by ([[by]])", - "intervalFactor": 1, - "refId": "A", - "step": 4 - } - ], - "title": "Uploaded bytes", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": "prometheus", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "links": [], - "unit": "decbytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 10, - "y": 13 - }, - "id": 16, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "expr": "sum(scylla_manager_backup_files_skipped_bytes{cluster=~\"[[cluster]]\", instance=~\"$instance\", shard=~\"$shard\"}) by ([[by]])", - "intervalFactor": 1, - "refId": "A", - "step": 4 - } - ], - "title": "Uploaded skipped", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": "prometheus", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "links": [], - "unit": "decbytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 16, - "y": 13 - }, - "id": 17, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "expr": "sum(scylla_manager_backup_files_failed_bytes{cluster=~\"[[cluster]]\", instance=~\"$instance\", shard=~\"$shard\"}) by ([[by]])", - "intervalFactor": 1, - "refId": "A", - "step": 4 - } - ], - "title": "Uploaded Failed", - "type": "timeseries" - }, - { - "class": "percent_panel", - "dashversion": ">3.2", - "datasource": "prometheus", - "description": "Shows current restore progress", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "class": "fieldConfig_defaults", - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "class": "fieldConfig_defaults_custom", - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 0, - "y": 19 - }, - "id": 18, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 4, - "targets": [ - { - "expr": "scylla_manager_restore_progress{cluster=~\"[[cluster]]\"} < 100", - "intervalFactor": 1, - "refId": "A", - "step": 4 - } - ], - "title": "Restore Progress", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": "prometheus", - "description": "Shows restore progress, the remaining bytes to complete", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "links": [], - "unit": "decbytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 8, - "y": 19 - }, - "id": 19, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 4, - "targets": [ - { - "expr": "sum(scylla_manager_restore_remaining_bytes{cluster=~\"[[cluster]]\", instance=~\"$instance\", shard=~\"$shard\"}) by ([[by]])", - "intervalFactor": 1, - "refId": "A", - "step": 4 - } - ], - "title": "Restore Remaining Bytes", - "type": "timeseries" - }, - { - "class": "ms_panel", - "datasource": "prometheus", - "description": "Average duration time for a CQL ping operation", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "class": "fieldConfig_defaults", - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "class": "fieldConfig_defaults_custom", - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "unit": "ms" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 10, - "x": 0, - "y": 25 - }, - "id": 20, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 5, - "targets": [ - { - "expr": "avg(scylla_manager_healthcheck_cql_rtt_ms{instance=~\"$instance\", cluster=~\"[[cluster]]\"}) by ($by)", - "intervalFactor": 1, - "refId": "A", - "step": 4 - } - ], - "title": "CQL probe duration by $by", - "type": "timeseries" - }, - { - "class": "text_panel", - "content": "

Manager Agent

", - "datasource": null, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 31 - }, - "id": 21, - "isNew": true, - "links": [], - "mode": "html", - "options": {}, - "span": 12, - "style": {}, - "title": "", - "transparent": true, - "type": "text" - }, - { - "class": "bytes_panel", - "datasource": "prometheus", - "description": "An increase in memory can indicate an issue with the Manager agent", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "class": "fieldConfig_defaults", - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "class": "fieldConfig_defaults_custom", - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 10, - "x": 0, - "y": 33 - }, - "id": 22, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 5, - "targets": [ - { - "expr": "sum(go_memstats_heap_inuse_bytes{job=~\"manager_agent.?\", instance=~\"$instance\"}) by ($by)", - "intervalFactor": 1, - "refId": "A", - "step": 4 - } - ], - "title": "Agent Memory Heap usage", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": "prometheus", - "description": "An increase in the number of threads can indicate an issue with the Manager agent", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "class": "fieldConfig_defaults", - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "class": "fieldConfig_defaults_custom", - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 10, - "x": 10, - "y": 33 - }, - "id": 23, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 5, - "targets": [ - { - "expr": "avg(go_threads{job=~\"manager_agent.?\", instance=~\"$instance\"}) by ($by)", - "intervalFactor": 1, - "refId": "A", - "step": 4 - } - ], - "title": "Agent Threads", - "type": "timeseries" - }, - { - "class": "plain_text", - "datasource": null, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "gridPos": { - "h": 3, - "w": 24, - "x": 0, - "y": 39 - }, - "id": 24, - "isNew": true, - "links": [], - "mode": "html", - "options": { - "content": "
Scylla Monitoring version - 4.9.4
\n    
", - "mode": "html" - }, - "span": 12, - "style": {}, - "title": "", - "transparent": true, - "type": "text" - } - ], - "refresh": "10s", - "schemaVersion": 26, - "style": "dark", - "tags": [ - "3.4" - ], - "templating": { - "list": [ - { - "allValue": null, - "current": { - "tags": [], - "text": "Cluster", - "value": "cluster" - }, - "hide": 0, - "includeAll": false, - "label": "by", - "multi": false, - "name": "by", - "options": [ - { - "selected": true, - "text": "Cluster", - "value": "cluster" - }, - { - "selected": false, - "text": "Instance", - "value": "instance" - }, - { - "selected": false, - "text": "Keyspace", - "value": "keyspace" - }, - { - "selected": false, - "text": "Shard", - "value": "shard" - } - ], - "query": "Instance,Shard,Keyspace,Cluster", - "type": "custom" - }, - { - "allValue": null, - "class": "template_variable_single", - "current": { - "isNone": true, - "selected": false, - "text": "None", - "value": "" - }, - "datasource": "prometheus", - "definition": "", - "error": null, - "hide": 0, - "includeAll": false, - "label": "cluster", - "multi": false, - "name": "cluster_name", - "options": [], - "query": "label_values(scylla_manager_cluster_name,name)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "class": "template_variable_single", - "current": { - "isNone": true, - "selected": false, - "text": "None", - "value": "" - }, - "datasource": "prometheus", - "definition": "", - "error": null, - "hide": 2, - "includeAll": false, - "label": "cluster_id", - "multi": false, - "name": "cluster", - "options": [], - "query": "label_values(scylla_manager_cluster_name{name=\"$cluster_name\"}, cluster)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": "prometheus", - "definition": "", - "error": null, - "hide": 0, - "includeAll": true, - "label": "instance", - "multi": true, - "name": "instance", - "options": [], - "query": "label_values(scylla_manager_healthcheck_cql_rtt_ms{cluster=\"$cluster\"}, instance)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": "prometheus", - "definition": "", - "error": null, - "hide": 0, - "includeAll": true, - "label": "shard", - "multi": true, - "name": "shard", - "options": [], - "query": "label_values(scylla_manager_repair_segments_total, shard)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 3, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "class": "template_variable_custom", - "current": { - "text": "3.4", - "value": "3.4" - }, - "error": null, - "hide": 2, - "includeAll": false, - "label": null, - "multi": false, - "name": "scylla_version", - "options": [ - { - "selected": true, - "text": "3.4", - "value": "3.4" - } - ], - "query": "3.4", - "skipUrlSync": false, - "type": "custom" - }, - { - "allValue": null, - "class": "monitor_version_var", - "current": { - "text": "4.9.4", - "value": "4.9.4" - }, - "error": null, - "hide": 2, - "includeAll": false, - "label": null, - "multi": false, - "name": "monitoring_version", - "options": [ - { - "selected": true, - "text": "4.9.4", - "value": "4.9.4" - } - ], - "query": "4.9.4", - "skipUrlSync": false, - "type": "custom" - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "now": true, - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "browser", - "title": "Scylla Manager Metrics", - "uid": "manager-3-4", - "version": 3 -} \ No newline at end of file diff --git a/kubernetes/linera-validator/grafana-dashboards/scylla/scylla-advanced.6.2.json b/kubernetes/linera-validator/grafana-dashboards/scylla/scylla-advanced.6.2.json deleted file mode 100644 index e60455e3223a..000000000000 --- a/kubernetes/linera-validator/grafana-dashboards/scylla/scylla-advanced.6.2.json +++ /dev/null @@ -1,6129 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - }, - { - "class": "annotation_restart", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "resets(scylla_gossip_heart_beat{cluster=\"$cluster\"}[$__rate_interval])>0", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "node_restart", - "showIn": 0, - "tagKeys": "instance,dc,cluster", - "tags": [], - "titleFormat": "restart", - "type": "tags" - }, - { - "class": "annotation_stall", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": false, - "expr": "changes(scylla_stall_detector_reported{cluster=\"$cluster\"}[$__rate_interval])>0", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "stall detector", - "showIn": 0, - "tagKeys": "dc,instance,shard", - "tags": [], - "titleFormat": "Stall found", - "type": "tags" - }, - { - "class": "annotation_schema_changed", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": false, - "expr": "changes(scylla_database_schema_changed{cluster=\"$cluster\"}[$__rate_interval])>0", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "Schema Changed", - "showIn": 0, - "tagKeys": "instance,dc,cluster", - "tags": [], - "titleFormat": "schema changed", - "type": "tags" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 1, - "links": [ - { - "asDropdown": true, - "icon": "external link", - "includeVars": true, - "keepTime": true, - "tags": [], - "type": "dashboards" - } - ], - "liveNow": false, - "panels": [ - { - "class": "text_panel", - "dashproductreject": "no-version-check", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 1, - "w": 9, - "x": 0, - "y": 0 - }, - "id": 1, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "type": "text" - }, - { - "class": "text_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 1, - "w": 4, - "x": 9, - "y": 0 - }, - "id": 2, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "# ", - "mode": "markdown" - }, - "pluginVersion": "10.1.1", - "span": 12, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "type": "text" - }, - { - "class": "text_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 1, - "w": 4, - "x": 13, - "y": 0 - }, - "id": 3, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "# ", - "mode": "markdown" - }, - "pluginVersion": "10.1.1", - "span": 12, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "type": "text" - }, - { - "class": "text_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 1, - "w": 7, - "x": 17, - "y": 0 - }, - "id": 4, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "# ", - "mode": "markdown" - }, - "pluginVersion": "10.1.1", - "span": 12, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "type": "text" - }, - { - "class": "small_stat", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The number of nodes configured in the cluster.", - "fieldConfig": { - "defaults": { - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 0, - "y": 1 - }, - "id": 5, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "count(scylla_scylladb_current_version{job=\"scylla\", cluster=\"$cluster\"})", - "intervalFactor": 1, - "legendFormat": "Total Nodes", - "refId": "A", - "step": 40 - } - ], - "title": "# Nodes", - "type": "stat" - }, - { - "class": "small_stat", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The number of unreachable nodes.\nUsually because a machine is down or unreachable.", - "fieldConfig": { - "defaults": { - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 1 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 2, - "y": 1 - }, - "id": 6, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "(count(scrape_samples_scraped{job=\"scylla\", cluster=\"$cluster\"}==0) OR vector(0))", - "intervalFactor": 1, - "legendFormat": "Offline ", - "refId": "A", - "step": 20 - } - ], - "title": "Unreachable", - "type": "stat" - }, - { - "class": "small_stat", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The number of joining and leaving nodes.\nThe number of nodes that are up but not actively part of the cluster, either because they are still joining or because they are leaving.", - "fieldConfig": { - "defaults": { - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 1 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 4, - "y": 1 - }, - "id": 7, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "count(scylla_node_operation_mode{cluster=\"$cluster\"}!=3)OR vector(0)", - "intervalFactor": 1, - "legendFormat": "Offline ", - "refId": "A", - "step": 20 - } - ], - "thresholds": "1,2", - "title": "Inactive", - "type": "stat" - }, - { - "class": "small_stat", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "mappings": [], - "noValue": " Offline", - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "red", - "value": null - }, - { - "color": "green", - "value": 0 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byFrameRefID", - "options": "A" - }, - "properties": [ - { - "id": "mappings", - "value": [ - { - "options": { - "0": { - "index": 2, - "text": "Online" - }, - "1": { - "index": 3, - "text": "Repair" - }, - "2": { - "index": 4, - "text": "Backup" - }, - "3": { - "index": 1, - "text": "Backup Repair" - }, - "-1": { - "index": 0, - "text": "Offline" - } - }, - "type": "value" - } - ] - } - ] - }, - { - "matcher": { - "id": "byFrameRefID", - "options": "B" - }, - "properties": [ - { - "id": "unit", - "value": "percent" - }, - { - "id": "mappings", - "value": [ - { - "options": { - "0": { - "index": 0, - "text": " " - } - }, - "type": "value" - } - ] - } - ] - } - ] - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 6, - "y": 1 - }, - "id": 8, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "textMode": "value", - "wideLayout": true - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "(max(scylla_manager_scheduler_run_indicator{type=~\"repair\",cluster=\"$cluster\"}) or on() vector(0)) + (max(scylla_manager_scheduler_run_indicator{type=~\"backup\",cluster=\"$cluster\"})*2 or on() vector(0)) + (sum(scylla_manager_server_current_version{}) or on() vector(-1))", - "intervalFactor": 1, - "refId": "A", - "step": 40 - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "(avg(scylla_manager_repair_progress{cluster=\"$cluster\", job=\"scylla_manager\"}) * max(scylla_manager_scheduler_run_indicator{type=\"repair\",cluster=\"$cluster\"})) or on () (100*avg(manager:backup_progress{cluster=\"$cluster\"}) * max(scylla_manager_scheduler_run_indicator{type=\"backup\",cluster=\"$cluster\"})) or on () vector(0)", - "instant": true, - "interval": "", - "legendFormat": "", - "refId": "B" - } - ], - "title": "Manager", - "type": "stat" - }, - { - "class": "small_stat", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Average Write Latency", - "fieldConfig": { - "defaults": { - "decimals": 0, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 50000 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 9, - "y": 1 - }, - "id": 9, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "avg(wlatencya{by=\"cluster\", cluster=~\"$cluster|^$\",scheduling_group_name=~\"$sg\"}>0)", - "instant": true, - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 4 - } - ], - "title": "Avg Write", - "type": "stat" - }, - { - "class": "small_stat", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "99% write Latency", - "fieldConfig": { - "defaults": { - "decimals": 0, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 100000 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 11, - "y": 1 - }, - "id": 10, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "wlatencyp99{by=\"cluster\", cluster=~\"$cluster|^$\",scheduling_group_name=~\"$sg\"}>0", - "instant": true, - "intervalFactor": 1, - "legendFormat": "{{scheduling_group_name}}", - "refId": "A", - "step": 4 - } - ], - "title": "99% Write", - "type": "stat" - }, - { - "class": "small_stat", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Average Read Latency", - "fieldConfig": { - "defaults": { - "decimals": 0, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 50000 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 13, - "y": 1 - }, - "id": 11, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "avg(rlatencya{by=\"cluster\", cluster=~\"$cluster|^$\",scheduling_group_name=~\"$sg\"}>0)", - "instant": true, - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 4 - } - ], - "title": "Avg Read", - "type": "stat" - }, - { - "class": "small_stat", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "99% read Latency", - "fieldConfig": { - "defaults": { - "decimals": 0, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 100000 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 15, - "y": 1 - }, - "id": 12, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "rlatencyp99{by=\"cluster\", cluster=~\"$cluster|^$\",scheduling_group_name=~\"$sg\"}>0", - "instant": true, - "intervalFactor": 1, - "legendFormat": "{{scheduling_group_name}}", - "refId": "A", - "step": 4 - } - ], - "title": "99% Read", - "type": "stat" - }, - { - "class": "small_stat", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "decimals": 1, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "si:" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 17, - "y": 1 - }, - "id": 13, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "sum(rate(scylla_transport_requests_served{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) + (sum(rate(scylla_thrift_served{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) or on() vector(0))", - "instant": true, - "intervalFactor": 1, - "refId": "A", - "step": 40 - } - ], - "title": "Requests/s", - "type": "stat" - }, - { - "class": "small_stat", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The percentage of the time during which Scylla utilized the CPU. Note that because Scylla does busy polling for some time before going idle, CPU utilization as seen by the operating system may be much higher. Your system is not yet CPU-bottlenecked until this metric is high.", - "fieldConfig": { - "defaults": { - "decimals": 0, - "mappings": [], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 20, - "y": 1 - }, - "id": 14, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "avg(scylla_reactor_utilization{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"} )", - "instant": true, - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 4 - } - ], - "title": "Load", - "type": "stat" - }, - { - "class": "small_stat", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The rate of timeouts (read and write).\n\nTimeouts are an indication of an overloaded system", - "fieldConfig": { - "defaults": { - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 1 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 22, - "y": 1 - }, - "id": 15, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "(sum(rate(scylla_storage_proxy_coordinator_write_timeouts{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) or on() vector(0)) + (sum(rate(scylla_storage_proxy_coordinator_read_timeouts{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) or on() vector(0))", - "instant": true, - "intervalFactor": 1, - "refId": "A", - "step": 40 - } - ], - "title": "Timeouts", - "type": "stat" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 5 - }, - "id": 16, - "panels": [], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "type": "row" - }, - { - "class": "plain_text", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 6 - }, - "id": 17, - "links": [], - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

IO Queue Information

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "percentunit_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "This graph shows how IO queue consumption is distributed between io-groups and streams.\n\nscylla_io_queue_consumption", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMax": 1, - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percentunit" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 8 - }, - "id": 18, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_io_queue_consumption{iogroup=~\"$iogroup\", class=~\"$classes\", instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\"}[$__rate_interval])) by (instance, iogroup, stream)", - "intervalFactor": 1, - "legendFormat": "Group {{iogroup}} {{stream}} {{dc}} {{instance}} ", - "refId": "A", - "step": 30 - } - ], - "title": "I/O Group consumption by instance", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "This graph shows the ratio of dispatch rate to completion rate. It is expected to be 1.0, growing larger on reactor stalls or disk problems.\n\nscylla_io_queue_flow_ratio", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMax": 1.15, - "axisSoftMin": 0.85, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 8 - }, - "id": 19, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], scylla_io_queue_flow_ratio{iogroup=~\"$iogroup\", instance=~\"[[node]]\", cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"})", - "intervalFactor": 1, - "legendFormat": "Group {{iogroup}} {{dc}} {{instance}} {{shard}}", - "refId": "A", - "step": 30 - } - ], - "title": "I/O Group Queue flow ratio", - "type": "timeseries" - }, - { - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 14 - }, - "id": 20, - "panels": [], - "repeat": "classes", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "$classes", - "type": "row" - }, - { - "class": "seconds_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Total time spent in the queue", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 15 - }, - "id": 21, - "links": [], - "options": { - "class": "desc_tooltip_options", - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], max(rate(scylla_io_queue_total_delay_sec{class=\"$classes\", instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])/rate(scylla_io_queue_total_operations{class=\"$classes\", instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]) or on() max(scylla_io_queue_delay{class=\"$classes\", instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"} ) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 30 - } - ], - "title": "$classes I/O Queue delay by [[by]]", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of requests in the queue", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 15 - }, - "id": 22, - "links": [], - "options": { - "class": "desc_tooltip_options", - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], max(scylla_io_queue_queue_length{class=\"$classes\", instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 30 - } - ], - "title": "$classes Queue length by [[by]]", - "type": "timeseries" - }, - { - "class": "bps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The queue bandwidth rate in bytes \n\nscylla_io_queue_total_bytes", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "Bps" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 15 - }, - "id": 23, - "links": [], - "options": { - "class": "desc_tooltip_options", - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], sum(rate(scylla_io_queue_total_bytes{class=\"$classes\", instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 30 - } - ], - "title": "$classes I/O Queue bandwidth by [[by]]", - "type": "timeseries" - }, - { - "class": "iops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The rate of io queue operation\n\nsscylla_io_queue_total_operations", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "iops" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 15 - }, - "id": 24, - "links": [], - "options": { - "class": "desc_tooltip_options", - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], sum(rate(scylla_io_queue_total_operations{class=\"$classes\", instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 30 - } - ], - "title": "$classes I/O Queue IOPS by [[by]]", - "type": "timeseries" - }, - { - "class": "seconds_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Total time spent in disk", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 21 - }, - "id": 25, - "links": [], - "options": { - "class": "desc_tooltip_options", - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], max(rate(scylla_io_queue_total_exec_sec{class=\"$classes\", instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])/rate(scylla_io_queue_total_operations{class=\"$classes\", instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]) or on() max(scylla_io_queue_delay{class=\"$classes\", instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"} ) by ([[by]]))", - "intervalFactor": 1, - "refId": "A", - "step": 30 - } - ], - "title": "Disk $classes I/O Queue delay by [[by]]", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of requests in the disk", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 21 - }, - "id": 26, - "links": [], - "options": { - "class": "desc_tooltip_options", - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], max(scylla_io_queue_disk_queue_length{class=\"$classes\", instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by ([[by]]))", - "intervalFactor": 1, - "refId": "A", - "step": 30 - } - ], - "title": "DISK $classes Queue length by [[by]]", - "type": "timeseries" - }, - { - "class": "seconds_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The time the class waited for being dispatched with non-empty software queue.\n\nLarge IO delays coupled with small starvation time denotes that scheduler is doing its job properly, and it's upper layer that overflows disk capacity.\n\nLarge IO delays coupled with large starvation time denotes that there might be some problem on the scheduler level that it cannot deliver IO requests from that class into disk in timely manner or the disk is slow and cannot afford timely dispatching.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 21 - }, - "id": 27, - "links": [], - "options": { - "class": "desc_tooltip_options", - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], sum(rate(scylla_io_queue_starvation_time_sec{class=\"$classes\", instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "refId": "A", - "step": 30 - } - ], - "title": "DISK $classes starvation time by [[by]]", - "type": "timeseries" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 118 - }, - "id": 28, - "panels": [], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "type": "row" - }, - { - "class": "plain_text", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 119 - }, - "id": 29, - "links": [], - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

Information by Task Group

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 121 - }, - "id": 30, - "panels": [], - "repeat": "sg", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "$sg", - "type": "row" - }, - { - "class": "percentunit_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Scylla employs an event-loop like reactor that alternates between the execution of different groups of tasks periodically. This graph shows how much time was spent in $sg group", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMax": 1, - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percentunit" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 122 - }, - "id": 31, - "links": [], - "options": { - "class": "desc_tooltip_options", - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "pointradius": 1, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_scheduler_runtime_ms{instance=~\"[[node]]\" ,cluster=\"$cluster\", dc=~\"$dc\",group=~\"$sg\", shard=~\"[[shard]]\"}[$__rate_interval])/1000) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 30 - } - ], - "title": "Time used by [[by]] - $sg", - "type": "timeseries" - }, - { - "class": "percentunit_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Scylla employs an event-loop like reactor that alternates between the execution of different groups of tasks periodically. The maximum amount of time during which a task group can run is called the \"task quota\". Some task groups may disrespect that and run for longer. This may cause latency issues", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMax": 1, - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percentunit" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 122 - }, - "id": 32, - "links": [], - "options": { - "class": "desc_tooltip_options", - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "pointradius": 1, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_scheduler_time_spent_on_task_quota_violations_ms{instance=~\"[[node]]\" ,cluster=\"$cluster\", dc=~\"$dc\",group=~\"$sg\", shard=~\"[[shard]]\"}[$__rate_interval])/1000) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 30 - } - ], - "title": "Time spent in task quota violations by [[by]] - $sg", - "type": "timeseries" - }, - { - "class": "percentunit_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Scylla employs an event-loop like reactor that alternates between the execution of different groups of tasks periodically. The maximum amount of time during which a task group can run is called the \"task quota\". Some task groups may disrespect that and run for longer.\n\n This graph shows the amount of time the group was waiting to get CPU time.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMax": 1, - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percentunit" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 122 - }, - "id": 33, - "links": [], - "options": { - "class": "desc_tooltip_options", - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "pointradius": 1, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_scheduler_starvetime_ms{instance=~\"[[node]]\" ,cluster=\"$cluster\", dc=~\"$dc\",group=~\"$sg\", shard=~\"[[shard]]\"}[$__rate_interval])/1000) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 30 - } - ], - "title": "Starvation time by [[by]] - $sg", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Shares assigned to the $sg. Shares determine how Scylla reactor distributes the task quotas between groups (Higher share gets more quotas)", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 122 - }, - "id": 34, - "links": [], - "options": { - "class": "desc_tooltip_options", - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "pointradius": 1, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(scylla_scheduler_shares{instance=~\"[[node]]\" ,cluster=\"$cluster\", dc=~\"$dc\",group=~\"$sg\", shard=~\"[[shard]]\"}) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 30 - } - ], - "title": "Scheduler shares [[by]] - $sg", - "type": "timeseries" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 205 - }, - "id": 35, - "panels": [], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Internal node errors", - "type": "row" - }, - { - "class": "plain_text", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 206 - }, - "id": 36, - "links": [], - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

Internal node Errors - $cluster

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "rps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of Read requests that failed due to an 'unavailable' error", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:reads/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 0, - "y": 208 - }, - "id": 37, - "links": [], - "options": { - "class": "desc_tooltip_options", - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], avg(rate(scylla_storage_proxy_coordinator_read_errors_local_node{instance=~\"[[node]]\" ,cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 30 - } - ], - "title": "Local Reads Error by [[by]]", - "type": "timeseries" - }, - { - "class": "wps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of write requests that failed due to an 'unavailable' error", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 8, - "y": 208 - }, - "id": 38, - "links": [], - "options": { - "class": "desc_tooltip_options", - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], avg(rate(scylla_storage_proxy_coordinator_write_errors_local_node{instance=~\"[[node]]\" ,cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 30 - } - ], - "title": "Local Write Error by [[by]]", - "type": "timeseries" - }, - { - "class": "text_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 6, - "w": 8, - "x": 16, - "y": 208 - }, - "id": 39, - "links": [], - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "## ", - "mode": "markdown" - }, - "pluginVersion": "10.1.1", - "span": 4, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "rps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of Read requests that failed due to an 'unavailable' error", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:reads/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 0, - "y": 214 - }, - "id": 40, - "links": [], - "options": { - "class": "desc_tooltip_options", - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], avg(rate(scylla_storage_proxy_coordinator_read_unavailable{instance=~\"[[node]]\" ,cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 30 - } - ], - "title": "Reads Unavailable Error by [[by]]", - "type": "timeseries" - }, - { - "class": "wps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of write requests that failed on a local Node", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 8, - "y": 214 - }, - "id": 41, - "links": [], - "options": { - "class": "desc_tooltip_options", - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], avg(rate(scylla_storage_proxy_coordinator_write_unavailable{instance=~\"[[node]]\" ,cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 30 - } - ], - "title": "Write Unavailable Error by [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of write requests that failed on a local Node", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 16, - "y": 214 - }, - "id": 42, - "links": [], - "options": { - "class": "desc_tooltip_options", - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], avg(rate(scylla_storage_proxy_coordinator_range_unavailable{instance=~\"[[node]]\" ,cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 30 - } - ], - "title": "Range Unavailable Error by [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of AIO Errors", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 0, - "y": 220 - }, - "id": 43, - "links": [], - "options": { - "class": "desc_tooltip_options", - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], avg(rate(scylla_reactor_aio_errors{instance=~\"[[node]]\" ,cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 30 - } - ], - "title": "AIO Error by [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Total number of abandoned failed futures, futures destroyed while still containing an exception.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 8, - "y": 220 - }, - "id": 44, - "links": [], - "options": { - "class": "desc_tooltip_options", - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], sum(rate(scylla_reactor_abandoned_failed_futures{instance=~\"[[node]]\" ,cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 30 - } - ], - "title": "Ignored Future By [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of C++ exceptions thrown.\n\n An exception by itself does not indicate a problem", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 16, - "y": 220 - }, - "id": 45, - "links": [], - "options": { - "class": "desc_tooltip_options", - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], sum(rate(scylla_reactor_cpp_exceptions{instance=~\"[[node]]\" ,cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 30 - } - ], - "title": "C++ Exceptions [[by]]", - "type": "timeseries" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 226 - }, - "id": 46, - "panels": [], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Commit Log", - "type": "row" - }, - { - "class": "plain_text", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 227 - }, - "id": 47, - "links": [], - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

Commit log Information

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "bytes_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Holds the size of disk space in bytes reserved for data so far. A too high value indicates that we have some bottleneck in the writing to sstables path", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 229 - }, - "id": 48, - "links": [], - "options": { - "class": "desc_tooltip_options", - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], avg(scylla_commitlog_disk_total_bytes{instance=~\"[[node]]\" ,cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 30 - } - ], - "title": "Avg reserved disk space by [[by]]", - "type": "timeseries" - }, - { - "class": "bytes_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Holds the size of disk space in bytes used for data so far. A too high value indicates that we have some bottleneck in the writing to sstables path", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 229 - }, - "id": 49, - "links": [], - "options": { - "class": "desc_tooltip_options", - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], avg(scylla_commitlog_disk_active_bytes{instance=~\"[[node]]\" ,cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 30 - } - ], - "title": "Avg used disk space by [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Counts a number of times the flush() method was called for a file", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 229 - }, - "id": 50, - "links": [], - "options": { - "class": "desc_tooltip_options", - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], avg(rate(scylla_commitlog_flush{instance=~\"[[node]]\" ,cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 30 - } - ], - "title": "Avg flush by [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Holds the current number of segments", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 229 - }, - "id": 51, - "links": [], - "options": { - "class": "desc_tooltip_options", - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], avg(scylla_commitlog_segments{instance=~\"[[node]]\" ,cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 30 - } - ], - "title": "Segments by [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Counts a number of times a flush limit was exceeded. A non-zero value indicates that there are too many pending flush operations (see pending_flushes) and some of them will be blocked till the total amount of pending flush operations drops below 5.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 235 - }, - "id": 52, - "links": [], - "options": { - "class": "desc_tooltip_options", - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], avg(rate(scylla_commitlog_flush_limit_exceeded{instance=~\"[[node]]\" ,cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 30 - } - ], - "title": "Avg flush limit exceeded by [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Holds the number of currently pending allocations. A non-zero value indicates that we have a bottleneck in the disk write flow.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 235 - }, - "id": 53, - "links": [], - "options": { - "class": "desc_tooltip_options", - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], avg(scylla_commitlog_pending_allocations{instance=~\"[[node]]\" ,cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 30 - } - ], - "title": "Pending allocations by [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Counts a number of requests blocked due to memory pressure. A non-zero value indicates that the commitlog memory quota is not enough to serve the required amount of requests.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 235 - }, - "id": 54, - "links": [], - "options": { - "class": "desc_tooltip_options", - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], avg(scylla_commitlog_pending_flushes{instance=~\"[[node]]\" ,cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 30 - } - ], - "title": "Pending flush by [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Holds the current number of unused segments. A non-zero value indicates that the disk write path became temporary slow.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 235 - }, - "id": 55, - "links": [], - "options": { - "class": "desc_tooltip_options", - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], avg(scylla_commitlog_unused_segments{instance=~\"[[node]]\" ,cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 30 - } - ], - "title": "Unused segments by [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Holds the number of not closed segments that still have some free space. This value should not get too high.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 241 - }, - "id": 56, - "links": [], - "options": { - "class": "desc_tooltip_options", - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], avg(scylla_commitlog_allocating_segments{instance=~\"[[node]]\" ,cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 30 - } - ], - "title": "Allocating segments by [[by]]", - "type": "timeseries" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 247 - }, - "id": 57, - "panels": [], - "repeat": "domain", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "RPC metrics - $domain", - "type": "row" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "scylla_rpc_client_count", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 4, - "x": 0, - "y": 248 - }, - "id": 58, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 2, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], sum(scylla_rpc_client_count{instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", domain=\"$domain\"}) by ([[by]], domain)>0)", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "RPC Client count by [[by]]", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "scylla_rpc_client_sent_messages", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 4, - "x": 4, - "y": 248 - }, - "id": 59, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 2, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], sum(rate(scylla_rpc_client_sent_messages{instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", domain=\"$domain\"}[$__rate_interval])>0) by ([[by]],domain))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "RPC sent messages by [[by]]", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "scylla_rpc_client_replied", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 4, - "x": 8, - "y": 248 - }, - "id": 60, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 2, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], sum(rate(scylla_rpc_client_replied{instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", domain=\"$domain\"}[$__rate_interval])>0) by ([[by]],domain))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "RPC replied messages by [[by]]", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "scylla_rpc_client_exception_received", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 4, - "x": 12, - "y": 248 - }, - "id": 61, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 2, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], sum(rate(scylla_rpc_client_exception_received{instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", domain=\"$domain\"}[$__rate_interval])>0) by ([[by]],domain))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "RPC exceptional replied messages by [[by]]", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "scylla_rpc_client_timeout", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 4, - "x": 16, - "y": 248 - }, - "id": 62, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 2, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], sum(rate(scylla_rpc_client_timeout{instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", domain=\"$domain\"}[$__rate_interval])>0) by ([[by]],domain))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "RPC requests timeout by [[by]]", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "the number of requests queued for sending, but not yet sent\n\nscylla_rpc_client_pending", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 4, - "x": 20, - "y": 248 - }, - "id": 63, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 2, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], sum(scylla_rpc_client_pending{instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", domain=\"$domain\"}) by ([[by]],domain)>0)", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "RPC Pending Messages by [[by]]", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "the number of requests waiting for the reply\n\nscylla_rpc_client_wait_reply", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 4, - "x": 0, - "y": 254 - }, - "id": 64, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 2, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], sum(scylla_rpc_client_wait_reply{instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", domain=\"$domain\"}) by ([[by]],domain)>0)", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "RPC Wait for Reply by [[by]]", - "type": "timeseries" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "dashproductreject": "no-your-pannels", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 260 - }, - "id": 65, - "panels": [], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Your panels", - "type": "row" - }, - { - "class": "plain_text", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 261 - }, - "id": 66, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

Your Panels

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "user_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "This graph panel was left empty on purpose for ad-hoc usage. Change it when needed. Pay attention that changes to the panel will not be saved.\n\nIf you do need a panel that can be saved, create a new dashboard, or edit the panel inside the json file", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 263 - }, - "id": 67, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 6, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Your Graph here", - "type": "timeseries" - }, - { - "class": "user_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "This graph panel was left empty on purpose for ad-hoc usage. Change it when needed. Pay attention that changes to the panel will not be saved.\n\nIf you do need a panel that can be saved, create a new dashboard, or edit the panel inside the json file", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 12, - "x": 12, - "y": 263 - }, - "id": 68, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 6, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Your Graph here", - "type": "timeseries" - }, - { - "class": "plain_text", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 3, - "w": 24, - "x": 0, - "y": 269 - }, - "id": 69, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "
Scylla Monitoring version - 4.9.4
\n    
", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - } - ], - "refresh": "10s", - "schemaVersion": 38, - "style": "dark", - "tags": [ - "6.2" - ], - "templating": { - "list": [ - { - "current": { - "tags": [], - "text": "Instance", - "value": "instance" - }, - "hide": 0, - "includeAll": false, - "label": "by", - "multi": false, - "name": "by", - "options": [ - { - "selected": false, - "text": "Cluster", - "value": "cluster" - }, - { - "selected": false, - "text": "DC", - "value": "dc" - }, - { - "selected": true, - "text": "Instance", - "value": "instance" - }, - { - "selected": false, - "text": "Shard", - "value": "instance,shard" - } - ], - "query": "Instance : instance,Cluster : cluster,DC : dc,Shard : instance\\,shard", - "skipUrlSync": false, - "type": "custom" - }, - { - "class": "template_variable_single", - "current": { - "selected": false, - "text": "scylla", - "value": "scylla" - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": false, - "label": "cluster", - "multi": false, - "name": "cluster", - "options": [], - "query": "label_values(scylla_reactor_utilization, cluster)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "label": "dc", - "multi": true, - "name": "dc", - "options": [], - "query": "label_values(scylla_reactor_utilization{cluster=~\"$cluster\"}, dc)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "label": "node", - "multi": true, - "name": "node", - "options": [], - "query": "label_values(scylla_reactor_utilization{cluster=\"$cluster\", dc=~\"$dc\"}, instance)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "label": "shard", - "multi": true, - "name": "shard", - "options": [], - "query": "label_values(scylla_reactor_utilization,shard)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 3, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "label": "classes", - "multi": true, - "name": "classes", - "options": [], - "query": "label_values(scylla_io_queue_delay,class)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "label": "group", - "multi": true, - "name": "sg", - "options": [], - "query": "label_values(scylla_scheduler_time_spent_on_task_quota_violations_ms,group)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "dashversion": [ - ">5.4", - ">2024.1" - ], - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "label": "iogroup", - "multi": true, - "name": "iogroup", - "options": [], - "query": "label_values(scylla_io_queue_consumption,iogroup)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "label": "domain", - "multi": true, - "name": "domain", - "options": [], - "query": "label_values(scylla_rpc_client_count,domain)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "class": "aggregation_function", - "current": { - "tags": [], - "text": "avg", - "value": "avg" - }, - "hide": 0, - "includeAll": false, - "label": "Function", - "multi": false, - "name": "func", - "options": [ - { - "selected": false, - "text": "sum", - "value": "sum" - }, - { - "selected": true, - "text": "avg", - "value": "avg" - }, - { - "selected": false, - "text": "max", - "value": "max" - }, - { - "selected": false, - "text": "min", - "value": "min" - }, - { - "selected": false, - "text": "stddev", - "value": "stddev" - }, - { - "selected": false, - "text": "stdvar", - "value": "stdvar" - } - ], - "query": "sum,avg,max,min,stddev,stdvar", - "skipUrlSync": false, - "type": "custom" - }, - { - "class": "topbottom", - "current": { - "tags": [], - "text": "top", - "value": "topk" - }, - "hide": 0, - "includeAll": false, - "label": "Filter", - "multi": false, - "name": "topbottom", - "options": [ - { - "selected": true, - "text": "top", - "value": "topk" - }, - { - "selected": false, - "text": "bottom", - "value": "bottomk" - }, - { - "selected": false, - "text": "limit", - "value": "limitk" - } - ], - "query": "top : topk,bottom : bottomk,limit : limitk", - "skipUrlSync": false, - "type": "custom" - }, - { - "class": "filter_limit", - "current": { - "tags": [], - "text": "256", - "value": "256" - }, - "hide": 0, - "includeAll": false, - "label": "", - "multi": false, - "name": "filter_limit", - "options": [ - { - "selected": false, - "text": "5", - "value": "5" - }, - { - "selected": false, - "text": "10", - "value": "10" - }, - { - "selected": false, - "text": "20", - "value": "20" - }, - { - "selected": false, - "text": "50", - "value": "50" - }, - { - "selected": false, - "text": "100", - "value": "100" - }, - { - "selected": true, - "text": "256", - "value": "256" - }, - { - "selected": false, - "text": "512", - "value": "512" - }, - { - "selected": false, - "text": "1000", - "value": "1000" - }, - { - "selected": false, - "text": "10000", - "value": "10000" - } - ], - "query": "0, 5, 10, 20, 50, 100, 256, 500, 1000, 10000", - "skipUrlSync": false, - "type": "custom" - }, - { - "class": "template_variable_custom", - "current": { - "text": "6.2", - "value": "6.2" - }, - "hide": 2, - "includeAll": false, - "multi": false, - "name": "scylla_version", - "options": [ - { - "selected": true, - "text": "6.2", - "value": "6.2" - } - ], - "query": "6.2", - "skipUrlSync": false, - "type": "custom" - }, - { - "class": "monitor_version_var", - "current": { - "text": "4.9.4", - "value": "4.9.4" - }, - "hide": 2, - "includeAll": false, - "multi": false, - "name": "monitoring_version", - "options": [ - { - "selected": true, - "text": "4.9.4", - "value": "4.9.4" - } - ], - "query": "4.9.4", - "skipUrlSync": false, - "type": "custom" - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "now": true, - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "browser", - "title": "Advanced", - "uid": "advanced-6-2", - "version": 1, - "weekStart": "" - } \ No newline at end of file diff --git a/kubernetes/linera-validator/grafana-dashboards/scylla/scylla-alternator.6.2.json b/kubernetes/linera-validator/grafana-dashboards/scylla/scylla-alternator.6.2.json deleted file mode 100644 index 5495151df2b4..000000000000 --- a/kubernetes/linera-validator/grafana-dashboards/scylla/scylla-alternator.6.2.json +++ /dev/null @@ -1,7157 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - }, - { - "class": "annotation_restart", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "resets(scylla_gossip_heart_beat{cluster=\"$cluster\"}[$__rate_interval])>0", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "node_restart", - "showIn": 0, - "tagKeys": "instance,dc,cluster", - "tags": [], - "titleFormat": "restart", - "type": "tags" - }, - { - "class": "annotation_stall", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": false, - "expr": "changes(scylla_stall_detector_reported{cluster=\"$cluster\"}[$__rate_interval])>0", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "stall detector", - "showIn": 0, - "tagKeys": "dc,instance,shard", - "tags": [], - "titleFormat": "Stall found", - "type": "tags" - }, - { - "class": "annotation_schema_changed", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": false, - "expr": "changes(scylla_database_schema_changed{cluster=\"$cluster\"}[$__rate_interval])>0", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "Schema Changed", - "showIn": 0, - "tagKeys": "instance,dc,cluster", - "tags": [], - "titleFormat": "schema changed", - "type": "tags" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 1, - "links": [ - { - "asDropdown": true, - "icon": "external link", - "includeVars": true, - "keepTime": true, - "tags": [], - "type": "dashboards" - } - ], - "liveNow": false, - "panels": [ - { - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 1, - "panels": [], - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Alternator Cluster overview $cluster", - "type": "row" - }, - { - "class": "text_panel", - "dashproductreject": "no-version-check", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 1, - "w": 6, - "x": 0, - "y": 1 - }, - "id": 2, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "type": "text" - }, - { - "class": "text_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 1, - "w": 3, - "x": 6, - "y": 1 - }, - "id": 3, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Manager", - "type": "text" - }, - { - "class": "text_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 1, - "w": 4, - "x": 9, - "y": 1 - }, - "id": 4, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "", - "mode": "markdown" - }, - "pluginVersion": "10.1.1", - "span": 12, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Average latencies", - "type": "text" - }, - { - "class": "text_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 1, - "w": 4, - "x": 13, - "y": 1 - }, - "id": 5, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "", - "mode": "markdown" - }, - "pluginVersion": "10.1.1", - "span": 12, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "P99 Latencies", - "type": "text" - }, - { - "class": "text_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 1, - "w": 7, - "x": 17, - "y": 1 - }, - "id": 6, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "# ", - "mode": "markdown" - }, - "pluginVersion": "10.1.1", - "span": 12, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "type": "text" - }, - { - "class": "small_stat", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The number of nodes configured in the cluster.", - "fieldConfig": { - "defaults": { - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 0, - "y": 2 - }, - "id": 7, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "count(scylla_scylladb_current_version{job=\"scylla\", cluster=\"$cluster\"})", - "intervalFactor": 1, - "legendFormat": "Total Nodes", - "refId": "A", - "step": 40 - } - ], - "title": "# Nodes", - "type": "stat" - }, - { - "class": "small_stat", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The number of unreachable nodes.\nUsually because a machine is down or unreachable.", - "fieldConfig": { - "defaults": { - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 1 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 2, - "y": 2 - }, - "id": 8, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "(count(scrape_samples_scraped{job=\"scylla\", cluster=\"$cluster\"}==0) OR vector(0))", - "intervalFactor": 1, - "legendFormat": "Offline ", - "refId": "A", - "step": 20 - } - ], - "title": "Unreachable", - "type": "stat" - }, - { - "class": "small_stat", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The number of joining and leaving nodes.\nThe number of nodes that are up but not actively part of the cluster, either because they are still joining or because they are leaving.", - "fieldConfig": { - "defaults": { - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 1 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 4, - "y": 2 - }, - "id": 9, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "count(scylla_node_operation_mode{cluster=\"$cluster\"}!=3)OR vector(0)", - "intervalFactor": 1, - "legendFormat": "Offline ", - "refId": "A", - "step": 20 - } - ], - "thresholds": "1,2", - "title": "Inactive", - "type": "stat" - }, - { - "class": "small_stat", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "mappings": [ - { - "options": { - "0": { - "text": "Online" - }, - "1": { - "text": "Repair" - }, - "2": { - "text": "Backup" - }, - "3": { - "text": "Backup Repair" - }, - "-1": { - "text": "Offline" - } - }, - "type": "value" - } - ], - "noValue": " Offline", - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "red", - "value": null - }, - { - "color": "green", - "value": 0 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 6, - "y": 2 - }, - "id": 10, - "options": { - "": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "textMode": "value", - "wideLayout": true - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "(max(scylla_manager_scheduler_run_indicator{type=~\"repair\",cluster=\"$cluster\"}) or on() vector(0)) + (max(scylla_manager_scheduler_run_indicator{type=~\"backup\",cluster=\"$cluster\"})*2 or on() vector(0)) + (sum(scylla_manager_server_current_version{}) or on() vector(-1))", - "intervalFactor": 1, - "refId": "A", - "step": 40 - } - ], - "type": "stat" - }, - { - "class": "vertical_lcd", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "decimals": 0, - "mappings": [], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 1, - "x": 8, - "y": 2 - }, - "id": 11, - "options": { - "displayMode": "lcd", - "minVizHeight": 10, - "minVizWidth": 0, - "orientation": "vertical", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "showUnfilled": true, - "valueMode": "color" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "(avg(scylla_manager_repair_progress{cluster=\"$cluster\", job=\"scylla_manager\"}) * max(scylla_manager_scheduler_run_indicator{type=\"repair\",cluster=\"$cluster\"})) or on () (100*avg(manager:backup_progress{cluster=\"$cluster\"}) * max(scylla_manager_scheduler_run_indicator{type=\"backup\",cluster=\"$cluster\"})) or on () vector(0)", - "instant": true, - "interval": "", - "legendFormat": "", - "refId": "A" - } - ], - "type": "bargauge" - }, - { - "class": "small_stat", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "", - "fieldConfig": { - "defaults": { - "decimals": 0, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 50000 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 4, - "x": 9, - "y": 2 - }, - "id": 12, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "sum(rate(scylla_alternator_op_latency_sum{cluster=~\"$cluster\", op=~\"$ops\"}[$__rate_interval])) by (op)/sum(rate(scylla_alternator_op_latency_count{cluster=~\"$cluster|^$\", op=~\"$ops\"}[$__rate_interval])>0) by (op)", - "instant": true, - "intervalFactor": 1, - "legendFormat": "{{op}}", - "refId": "A", - "step": 4 - } - ], - "type": "stat" - }, - { - "class": "small_stat", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "", - "fieldConfig": { - "defaults": { - "decimals": 0, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 50000 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 4, - "x": 13, - "y": 2 - }, - "id": 13, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "histogram_quantile(0.99, sum(rate(scylla_alternator_op_latency_bucket{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=~\"$ops\"}[$__rate_interval])>0) by (op, le))", - "instant": true, - "intervalFactor": 1, - "legendFormat": "{{op}}", - "refId": "A", - "step": 4 - } - ], - "type": "stat" - }, - { - "class": "small_stat", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Total Operations per seconds", - "fieldConfig": { - "defaults": { - "decimals": 1, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "si:" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 17, - "y": 2 - }, - "id": 14, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "dashversion": [ - ">6.2", - ">2025.1" - ], - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "(sum(rate(scylla_alternator_operation{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", op !~\"Batch.*\"}[$__rate_interval])) or vector(0))+ on() (sum(rate(scylla_alternator_batch_item_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) or vector(0))", - "instant": true, - "intervalFactor": 1, - "refId": "A", - "step": 40 - } - ], - "title": "Total Operations/s", - "type": "stat" - }, - { - "class": "small_stat", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The percentage of the time during which Scylla utilized the CPU. Note that because Scylla does busy polling for some time before going idle, CPU utilization as seen by the operating system may be much higher. Your system is not yet CPU-bottlenecked until this metric is high.", - "fieldConfig": { - "defaults": { - "decimals": 0, - "mappings": [], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 20, - "y": 2 - }, - "id": 15, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "avg(scylla_reactor_utilization{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"} )", - "instant": true, - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 4 - } - ], - "title": "Load", - "type": "stat" - }, - { - "class": "small_stat", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The rate of timeouts (read and write).\n\nTimeouts are an indication of an overloaded system", - "fieldConfig": { - "defaults": { - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 1 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 22, - "y": 2 - }, - "id": 16, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "(sum(rate(scylla_storage_proxy_coordinator_write_timeouts{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) or on() vector(0)) + (sum(rate(scylla_storage_proxy_coordinator_read_timeouts{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) or on() vector(0))", - "instant": true, - "intervalFactor": 1, - "refId": "A", - "step": 40 - } - ], - "title": "Timeouts", - "type": "stat" - }, - { - "class": "alert_table", - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 0, - "y": 6 - }, - "id": 75, - "options": { - "alertInstanceLabelFilter": "job!=\"scylla_manager\"", - "alertName": "", - "dashboardAlerts": false, - "groupBy": [], - "groupMode": "default", - "maxItems": 20, - "sortOrder": 3, - "stateFilter": { - "error": true, - "firing": true, - "noData": false, - "normal": false, - "pending": false - }, - "viewMode": "list" - }, - "span": 4, - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "Active Alerts", - "type": "alertlist" - }, - { - "class": "bytes_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 3, - "x": 8, - "y": 6 - }, - "id": 17, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 5, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "sum(node_filesystem_size_bytes{mountpoint=\"$mount_point\", instance=~\"$node\"})-sum(node_filesystem_avail_bytes{mountpoint=\"$mount_point\", instance=~\"$node\"})", - "intervalFactor": 1, - "legendFormat": "{{mountpoint}}", - "metric": "", - "refId": "A", - "step": 1 - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "sum(node_filesystem_size{mountpoint=\"$mount_point\", instance=~\"$node\"})-sum(node_filesystem_avail{mountpoint=\"$mount_point\", instance=~\"$node\"})", - "intervalFactor": 1, - "legendFormat": "{{mountpoint}}", - "metric": "", - "refId": "B", - "step": 1 - } - ], - "title": "Total Cluster Storage", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of Alternator Operations by operation type", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 5, - "x": 11, - "y": 6 - }, - "id": 18, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 5, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_alternator_operation{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]\", op=~\"$ops\"}[$__rate_interval])>0) by (op)", - "intervalFactor": 1, - "legendFormat": "{{op}}", - "metric": "", - "refId": "A", - "step": 4 - } - ], - "title": "Operations/s", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The P95 Latencies per operation", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 4, - "x": 16, - "y": 6 - }, - "id": 19, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 5, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "histogram_quantile(0.95, sum(rate(scylla_alternator_op_latency_bucket{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=~\"$ops\"}[$__rate_interval])>0) by (op, le))", - "intervalFactor": 1, - "legendFormat": "{{op}}", - "metric": "", - "refId": "A", - "step": 4 - } - ], - "title": "P95 Latencies", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The P99 Latencies per operation", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 4, - "x": 20, - "y": 6 - }, - "id": 20, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 5, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "histogram_quantile(0.99, sum(rate(scylla_alternator_op_latency_bucket{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=~\"$ops\"}[$__rate_interval])>0) by (op, le))", - "intervalFactor": 1, - "legendFormat": "{{op}}", - "metric": "", - "refId": "A", - "step": 4 - } - ], - "title": "P99 Latencies", - "type": "timeseries" - }, - { - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 12 - }, - "id": 21, - "panels": [], - "repeat": "dc", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "type": "row" - }, - { - "class": "plain_text", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 13 - }, - "id": 22, - "links": [], - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

Information for $dc

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "dc_nodes_table", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "custom": { - "cellOptions": { - "type": "auto" - }, - "filterable": true, - "inspect": false - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "orange", - "value": 85 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Value #A" - }, - "properties": [ - { - "id": "custom.width", - "value": 105 - }, - { - "id": "displayName", - "value": "Status" - }, - { - "id": "custom.cellOptions", - "value": { - "type": "color-text" - } - }, - { - "id": "thresholds", - "value": { - "mode": "absolute", - "steps": [ - { - "color": "yellow", - "value": null - }, - { - "color": "rgb(87, 128, 193)", - "value": 3 - }, - { - "color": "red", - "value": 4 - } - ] - } - }, - { - "id": "custom.align", - "value": "center" - }, - { - "id": "mappings", - "value": [ - { - "options": { - "1": { - "text": "Starting" - }, - "2": { - "text": "Joining" - }, - "3": { - "text": "Normal" - }, - "4": { - "text": "Leaving" - }, - "5": { - "text": "Decommissioned" - }, - "6": { - "text": "Draining" - }, - "7": { - "text": "Drained" - }, - "8": { - "text": "Moving" - }, - "9": { - "text": "Split-Cluster" - } - }, - "type": "value" - } - ] - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #B" - }, - "properties": [ - { - "id": "custom.cellOptions", - "value": { - "mode": "lcd", - "type": "gauge" - } - }, - { - "id": "min", - "value": 0 - }, - { - "id": "max", - "value": 101 - }, - { - "id": "displayName", - "value": "Load" - }, - { - "id": "custom.width", - "value": 120 - }, - { - "id": "custom.filterable", - "value": false - }, - { - "id": "decimals", - "value": 0 - }, - { - "id": "unit", - "value": "percent" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "svr" - }, - "properties": [ - { - "id": "custom.width", - "value": 90 - }, - { - "id": "displayName", - "value": "Version" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "instance" - }, - "properties": [ - { - "id": "custom.width", - "value": 105 - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #C" - }, - "properties": [ - { - "id": "links", - "value": [ - { - "title": "OS Information Dashboard, an Error indicates there are OS related errors", - "url": "/d/OS-[[dash_version]]/os-metrics?refresh=30s&orgId=1&var-by=instance&var-node=${__data.fields[0]}&from=${__from}&to=${__to}" - } - ] - }, - { - "id": "custom.width", - "value": 90 - }, - { - "id": "custom.filterable", - "value": true - }, - { - "id": "mappings", - "value": [ - { - "options": { - "0": { - "text": "OS Info" - } - }, - "type": "value" - }, - { - "options": { - "from": 0, - "result": { - "text": "OS Errors" - }, - "to": 100000 - }, - "type": "range" - } - ] - }, - { - "id": "thresholds", - "value": { - "mode": "absolute", - "steps": [ - { - "color": "rgb(87, 128, 193)", - "value": null - }, - { - "color": "dark-orange", - "value": 0.001 - } - ] - } - }, - { - "id": "custom.cellOptions", - "value": { - "type": "color-text" - } - }, - { - "id": "custom.align", - "value": "left" - }, - { - "id": "displayName", - "value": "OS" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #D" - }, - "properties": [ - { - "id": "links", - "value": [ - { - "title": "Cordinator and Replica node errors", - "url": "/d/detailed-[[dash_version]]/detailed?refresh=30s&orgId=1&var-by=instance&var-node=${__data.fields[0]}&from=${__from}&to=${__to}" - } - ] - }, - { - "id": "custom.width", - "value": 80 - }, - { - "id": "custom.filterable", - "value": true - }, - { - "id": "mappings", - "value": [ - { - "options": { - "0": { - "text": "" - }, - "1": { - "text": "Errors" - } - }, - "type": "value" - } - ] - }, - { - "id": "thresholds", - "value": { - "mode": "absolute", - "steps": [ - { - "color": "rgb(87, 128, 193)", - "value": null - }, - { - "color": "dark-orange", - "value": 0.001 - } - ] - } - }, - { - "id": "custom.cellOptions", - "value": { - "type": "color-text" - } - }, - { - "id": "custom.align", - "value": "left" - }, - { - "id": "displayName", - "value": " " - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "instance" - }, - "properties": [ - { - "id": "links", - "value": [ - { - "title": "Detailed view", - "url": "/d/detailed-[[dash_version]]/detailed?refresh=30s&orgId=1&var-by=instance&var-node=${__data.fields[0]}&from=${__from}&to=${__to}" - } - ] - } - ] - }, - { - "dashversion": [ - ">5.2", - ">2023.1" - ], - "matcher": { - "id": "byName", - "options": "Value #E" - }, - "properties": [ - { - "id": "custom.cellOptions", - "value": { - "mode": "lcd", - "type": "gauge" - } - }, - { - "id": "min", - "value": 0 - }, - { - "id": "max", - "value": 101 - }, - { - "id": "displayName", - "value": "Streaming" - }, - { - "id": "custom.width", - "value": 90 - }, - { - "id": "custom.filterable", - "value": false - }, - { - "id": "decimals", - "value": 0 - }, - { - "id": "unit", - "value": "percent" - }, - { - "id": "thresholds", - "value": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #F" - }, - "properties": [ - { - "id": "custom.cellOptions", - "value": { - "mode": "lcd", - "type": "gauge" - } - }, - { - "id": "min", - "value": 0 - }, - { - "id": "max", - "value": 101 - }, - { - "id": "displayName", - "value": "Disk Usage" - }, - { - "id": "custom.width", - "value": 120 - }, - { - "id": "custom.filterable", - "value": false - }, - { - "id": "decimals", - "value": 0 - }, - { - "id": "unit", - "value": "percent" - }, - { - "id": "thresholds", - "value": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #G" - }, - "properties": [ - { - "id": "displayName", - "value": "P50" - }, - { - "id": "custom.width", - "value": 100 - }, - { - "id": "custom.filterable", - "value": false - }, - { - "id": "decimals", - "value": 0 - }, - { - "id": "unit", - "value": "µs" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #H" - }, - "properties": [ - { - "id": "displayName", - "value": "Get P99" - }, - { - "id": "custom.width", - "value": 100 - }, - { - "id": "custom.filterable", - "value": false - }, - { - "id": "decimals", - "value": 0 - }, - { - "id": "unit", - "value": "µs" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #I" - }, - "properties": [ - { - "id": "displayName", - "value": "Put P99" - }, - { - "id": "custom.width", - "value": 100 - }, - { - "id": "custom.filterable", - "value": false - }, - { - "id": "decimals", - "value": 0 - }, - { - "id": "unit", - "value": "µs" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #J" - }, - "properties": [ - { - "id": "displayName", - "value": "Update P99" - }, - { - "id": "custom.width", - "value": 100 - }, - { - "id": "custom.filterable", - "value": false - }, - { - "id": "decimals", - "value": 0 - }, - { - "id": "unit", - "value": "µs" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #K" - }, - "properties": [ - { - "id": "displayName", - "value": "Delete P99" - }, - { - "id": "custom.width", - "value": 100 - }, - { - "id": "custom.filterable", - "value": false - }, - { - "id": "decimals", - "value": 0 - }, - { - "id": "unit", - "value": "µs" - } - ] - } - ] - }, - "gridPos": { - "h": 14, - "w": 24, - "x": 0, - "y": 15 - }, - "id": 23, - "options": { - "cellHeight": "sm", - "footer": { - "countRows": false, - "fields": "", - "reducer": [ - "sum" - ], - "show": false - }, - "showHeader": true - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "0*scylla_scylladb_current_version{cluster=\"$cluster\", dc=~\"$dc\"} + on (instance) group_left() (scylla_node_operation_mode{cluster=\"$cluster\", dc=~\"$dc\"}!= 3 or on (instance) ((scylla_gossip_live{cluster=\"$cluster\", dc=~\"$dc\"}+1< bool scalar(count(scylla_node_operation_mode{cluster=\"$cluster\"}==3)))*6 + 3))", - "format": "table", - "hide": false, - "instant": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "avg(scylla_reactor_utilization{cluster=~\"$cluster\", dc=~\"$dc\"} ) by (instance)", - "format": "table", - "instant": true, - "interval": "", - "legendFormat": "", - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "sum(rate(scylla_reactor_aio_errors{cluster=~\"$cluster\", dc=~\"$dc\"}[$__rate_interval])) by (instance)", - "format": "table", - "instant": true, - "interval": "", - "legendFormat": "", - "refId": "C" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "sum(scylla_errors:nodes_total{cluster=~\"$cluster\", dc=~\"$dc\"}) by (instance) >bool 0", - "format": "table", - "instant": true, - "interval": "", - "legendFormat": "", - "refId": "D" - }, - { - "dashversion": [ - ">5.2", - ">2023.1" - ], - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "(min(scylla_streaming_finished_percentage{cluster=\"$cluster\", dc=~\"$dc\"}*100) by (instance) < 100) or on (instance) 0*sum(scylla_scylladb_current_version{cluster=\"$cluster\", dc=~\"$dc\"}) by (instance)", - "format": "table", - "instant": true, - "interval": "", - "legendFormat": "", - "refId": "E" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "100-100*node_filesystem_avail_bytes{mountpoint=\"$mount_point\", dc=~\"$dc\", instance=~\"$node\"}/node_filesystem_size_bytes{mountpoint=\"$mount_point\", dc=~\"$dc\", instance=~\"$node\"}", - "format": "table", - "instant": true, - "interval": "", - "legendFormat": "", - "refId": "F" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "histogram_quantile(0.5, sum(rate(scylla_alternator_op_latency_bucket{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", op=~\"GetItem|PutItem|UpdateItem|DeleteItem\"}[$__rate_interval])>0) by (le, instance))", - "format": "table", - "instant": true, - "interval": "", - "legendFormat": "", - "refId": "G" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "histogram_quantile(0.99, sum(rate(scylla_alternator_op_latency_bucket{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", op=\"GetItem\"}[$__rate_interval])>0) by (le, instance))", - "format": "table", - "instant": true, - "interval": "", - "legendFormat": "", - "refId": "H" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "histogram_quantile(0.99, sum(rate(scylla_alternator_op_latency_bucket{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", op=\"PutItem\"}[$__rate_interval])>0) by (le, instance))", - "format": "table", - "instant": true, - "interval": "", - "legendFormat": "", - "refId": "I" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "histogram_quantile(0.99, sum(rate(scylla_alternator_op_latency_bucket{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", op=\"UpdateItem\"}[$__rate_interval])>0) by (le, instance))", - "format": "table", - "instant": true, - "interval": "", - "legendFormat": "", - "refId": "J" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "histogram_quantile(0.99, sum(rate(scylla_alternator_op_latency_bucket{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", op=\"DeleteItem\"}[$__rate_interval])>0) by (le, instance))", - "format": "table", - "instant": true, - "interval": "", - "legendFormat": "", - "refId": "K" - } - ], - "title": "Nodes", - "transformations": [ - { - "id": "filterFieldsByName", - "options": { - "include": { - "names": [ - "instance", - "svr", - "Value #A", - "Value #B", - "Value #C", - "Value #D", - "Value #E", - "Value #F", - "Value #G", - "Value #H", - "Value #I", - "Value #J", - "Value #K", - "Value #L", - "Value #M" - ] - } - } - }, - { - "id": "seriesToColumns", - "options": { - "byField": "instance" - } - }, - { - "id": "organize", - "options": { - "excludeByName": {}, - "indexByName": { - "Value #A": 3, - "Value #B": 5, - "Value #C": 1, - "Value #D": 12, - "Value #E": 6, - "Value #F": 4, - "Value #G": 7, - "Value #H": 8, - "Value #I": 9, - "Value #J": 10, - "Value #K": 11, - "instance": 0, - "svr": 2 - }, - "renameByName": {} - } - } - ], - "type": "table" - }, - { - "class": "plain_text", - "dashproductreject": "no-version-check", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 1, - "w": 10, - "x": 14, - "y": 29 - }, - "id": 24, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 30 - }, - "id": 25, - "panels": [], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Data Plane Actions", - "type": "row" - }, - { - "class": "plain_text", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 31 - }, - "id": 26, - "links": [], - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

Data Plane Actions

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 0, - "y": 33 - }, - "id": 27, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_alternator_operation{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"GetItem\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "GetItem by [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 8, - "y": 33 - }, - "id": 28, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_alternator_operation{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"PutItem\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "PutItem by [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 16, - "y": 33 - }, - "id": 29, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_alternator_operation{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"UpdateItem\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "UpdateItem by [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 0, - "y": 39 - }, - "id": 30, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_alternator_operation{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"DeleteItem\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "DeleteItem by [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 8, - "y": 39 - }, - "id": 31, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_alternator_operation{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"Query\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Query by [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 16, - "y": 39 - }, - "id": 32, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_alternator_operation{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"Scan\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Scan by [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 0, - "y": 45 - }, - "id": 33, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_alternator_operation{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"BatchWriteItem\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "BatchWriteItem by [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The number of items processed as a result of BatchWriteItem", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 8, - "y": 45 - }, - "id": 34, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 4, - "targets": [ - { - "dashversion": [ - ">6.2", - ">2025.1" - ], - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_alternator_batch_item_count{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"BatchWriteItem\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Operations from BatchWriteItem by [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The average batch size of BatchWriteItem", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 16, - "y": 45 - }, - "id": 35, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 4, - "targets": [ - { - "dashversion": [ - ">6.2", - ">2025.1" - ], - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_alternator_batch_item_count{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"BatchWriteItem\"}[$__rate_interval])) by ([[by]])/$func(rate(scylla_alternator_operation{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"BatchWriteItem\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Average Batch size of BatchWriteItem by [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 0, - "y": 51 - }, - "id": 36, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_alternator_operation{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"BatchGetItem\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "BatchGetItem by [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The number of items processed as a result of BatchGetItem", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 8, - "y": 51 - }, - "id": 37, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 4, - "targets": [ - { - "dashversion": [ - ">6.2", - ">2025.1" - ], - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_alternator_batch_item_count{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"BatchGetItem\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Operations from BatchGetItem by [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The average batch size of BatchGetItem", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 16, - "y": 51 - }, - "id": 38, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 4, - "targets": [ - { - "dashversion": [ - ">6.2", - ">2025.1" - ], - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_alternator_batch_item_count{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"BatchGetItem\"}[$__rate_interval])) by ([[by]])/$func(rate(scylla_alternator_operation{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"BatchGetItem\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Average Batch size of BatchGetItem by [[by]]", - "type": "timeseries" - }, - { - "class": "plain_text", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 57 - }, - "id": 39, - "links": [], - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

Data Plane Latencies

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 59 - }, - "id": 40, - "panels": [], - "repeat": "alternator_latency_ops", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "$alternator_latency_ops", - "type": "row" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 60 - }, - "id": 41, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_alternator_op_latency_summary_count{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"$alternator_latency_ops\"}[$__rate_interval])) by ([[by]]) or on () $func(rate(scylla_alternator_op_latency_count{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"$alternator_latency_ops\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Completed $alternator_latency_ops", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 60 - }, - "id": 42, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "scylla_alternator_op_latency_summary{quantile=\"0.5\", by=\"$by\", instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"$alternator_latency_ops\"} or on () $func(rate(scylla_alternator_op_latency_sum{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"$alternator_latency_ops\"}[$__rate_interval])) by ([[by]])/($func(rate(scylla_alternator_op_latency_count{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"$alternator_latency_ops\"}[$__rate_interval])) by ([[by]]) + 1)", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Average $alternator_latency_ops latency by [[by]]", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 60 - }, - "id": 43, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "scylla_alternator_op_latency_summary{quantile=\"0.95\", by=\"$by\", instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"$alternator_latency_ops\"} or on() histogram_quantile(0.95, sum(rate(scylla_alternator_op_latency_bucket{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"$alternator_latency_ops\"}[$__rate_interval])) by ([[by]], le))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "95th percentile $alternator_latency_ops latency by [[by]]", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 60 - }, - "id": 44, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "scylla_alternator_op_latency_summary{quantile=\"0.99\", by=\"$by\", instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"$alternator_latency_ops\"} or on() histogram_quantile(0.99, sum(rate(scylla_alternator_op_latency_bucket{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"$alternator_latency_ops\"}[$__rate_interval])) by ([[by]], le))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "99th percentile $alternator_latency_ops latency by [[by]]", - "type": "timeseries" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 101 - }, - "id": 45, - "panels": [], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Streams", - "type": "row" - }, - { - "class": "plain_text", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 102 - }, - "id": 46, - "links": [], - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

Streams Actions

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 0, - "y": 104 - }, - "id": 47, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_alternator_operation{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"ListStreams\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "ListStreams by [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 8, - "y": 104 - }, - "id": 48, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_alternator_operation{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"DescribeStream\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "DescribeStream by [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 16, - "y": 104 - }, - "id": 49, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_alternator_operation{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"GetShardIterator\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "GetShardIterator by [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 0, - "y": 110 - }, - "id": 50, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_alternator_operation{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"GetRecords\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "GetRecords by [[by]]", - "type": "timeseries" - }, - { - "class": "plain_text", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 116 - }, - "id": 51, - "links": [], - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

Streams Latencies

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 118 - }, - "id": 52, - "panels": [], - "repeat": "alternator_streams_latency_ops", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "$alternator_streams_latency_ops", - "type": "row" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 119 - }, - "id": 53, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_alternator_op_latency_summary_count{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"$alternator_streams_latency_ops\"}[$__rate_interval])) by ([[by]]) or on() $func(rate(scylla_alternator_op_latency_count{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"$alternator_streams_latency_ops\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Completed $alternator_streams_latency_ops", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 119 - }, - "id": 54, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "scylla_alternator_op_latency_summary{quantile=\"0.5\", by=\"$by\", instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"$alternator_streams_latency_ops\"} or on() $func(rate(scylla_alternator_op_latency_sum{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"$alternator_streams_latency_ops\"}[$__rate_interval])) by ([[by]])/($func(rate(scylla_alternator_op_latency_count{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"$alternator_streams_latency_ops\"}[$__rate_interval])) by ([[by]]) + 1)", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Average $alternator_streams_latency_ops latency by [[by]]", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 119 - }, - "id": 55, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "scylla_alternator_op_latency_summary{quantile=\"0.95\", by=\"$by\", instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"$alternator_streams_latency_ops\"} or on () histogram_quantile(0.95, sum(rate(scylla_alternator_op_latency_bucket{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"$alternator_streams_latency_ops\"}[$__rate_interval])) by ([[by]], le))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "95th percentile $alternator_streams_latency_ops latency by [[by]]", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 119 - }, - "id": 56, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "scylla_alternator_op_latency_summary{quantile=\"0.99\", by=\"$by\", instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"$alternator_streams_latency_ops\"} or on () histogram_quantile(0.99, sum(rate(scylla_alternator_op_latency_bucket{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"$alternator_streams_latency_ops\"}[$__rate_interval])) by ([[by]], le))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "99th percentile $alternator_streams_latency_ops latency by [[by]]", - "type": "timeseries" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 125 - }, - "id": 57, - "panels": [], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Control plane", - "type": "row" - }, - { - "class": "plain_text", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 126 - }, - "id": 58, - "links": [], - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

Control Plane Actions

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 0, - "y": 128 - }, - "id": 59, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_alternator_operation{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"CreateTable\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "CreateTable by [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 8, - "y": 128 - }, - "id": 60, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_alternator_operation{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"DeleteTable\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "DeleteTable by [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 16, - "y": 128 - }, - "id": 61, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_alternator_operation{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"DescribeTable\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "DescribeTable by [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 0, - "y": 134 - }, - "id": 62, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_alternator_operation{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"ListTables\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "ListTables by [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 8, - "y": 134 - }, - "id": 63, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_alternator_operation{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", op=\"DescribeEndpoints\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "DescribeEndpoints by [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The number of items deleted by their TTL", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 16, - "y": 134 - }, - "id": 64, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_expiration_items_deleted{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Expired Item Deleted by [[by]]", - "type": "timeseries" - }, - { - "class": "plain_text", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 2, - "w": 12, - "x": 0, - "y": 140 - }, - "id": 65, - "links": [], - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

Cache

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 6, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "plain_text", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 2, - "w": 12, - "x": 12, - "y": 140 - }, - "id": 66, - "links": [], - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

Timeouts

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 6, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of rows that were read from the cache, without needing to be fetched from storage.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 142 - }, - "id": 67, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_cache_row_hits{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "Cache Hits", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of rows that were not present in the cache, and had to be fetched from storage.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 142 - }, - "id": 68, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_cache_row_misses{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "Cache Misses", - "type": "timeseries" - }, - { - "class": "wpm_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Requests that Scylla tried to write but timed out. Timeouts are counted in the node that received the request (the coordinator), not at the replicas.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 142 - }, - "id": 69, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(delta(scylla_storage_proxy_coordinator_write_timeouts{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "Write Timeouts/Minutes by [[by]]", - "type": "timeseries" - }, - { - "class": "rpm_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Requests that Scylla tried to read but timed out. Timeouts are counted in the node that received the request (the coordinator), not at the replicas.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:reads/m" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 142 - }, - "id": 70, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(delta(scylla_storage_proxy_coordinator_read_timeouts{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "Read Timeouts/Minutes by [[by]]", - "type": "timeseries" - }, - { - "class": "plain_text", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 148 - }, - "id": 71, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

Your Panels

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "user_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "This graph panel was left empty on purpose for ad-hoc usage. Change it when needed. Pay attention that changes to the panel will not be saved.\n\nIf you do need a panel that can be saved, create a new dashboard, or edit the panel inside the json file", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 150 - }, - "id": 72, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 6, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Your Graph here", - "type": "timeseries" - }, - { - "class": "user_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "This graph panel was left empty on purpose for ad-hoc usage. Change it when needed. Pay attention that changes to the panel will not be saved.\n\nIf you do need a panel that can be saved, create a new dashboard, or edit the panel inside the json file", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 12, - "x": 12, - "y": 150 - }, - "id": 73, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 6, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Your Graph here", - "type": "timeseries" - }, - { - "class": "plain_text", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 3, - "w": 24, - "x": 0, - "y": 156 - }, - "id": 74, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "
Scylla Monitoring version - 4.9.4
\n    
", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - } - ], - "refresh": "10s", - "schemaVersion": 38, - "style": "dark", - "tags": [ - "6.2" - ], - "templating": { - "list": [ - { - "class": "by_template_var", - "current": { - "tags": [], - "text": "Instance", - "value": "instance" - }, - "hide": 0, - "includeAll": false, - "label": "by", - "multi": false, - "name": "by", - "options": [ - { - "selected": false, - "text": "Cluster", - "value": "cluster" - }, - { - "selected": false, - "text": "DC", - "value": "dc" - }, - { - "selected": true, - "text": "Instance", - "value": "instance" - }, - { - "selected": false, - "text": "Shard", - "value": "instance,shard" - } - ], - "query": "Cluster : cluster,DC : dc, Instance : instance, Shard : instance\\,shard", - "skipUrlSync": false, - "type": "custom" - }, - { - "class": "template_variable_single", - "current": { - "selected": false, - "text": "scylla", - "value": "scylla" - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": false, - "label": "cluster", - "multi": false, - "name": "cluster", - "options": [], - "query": "label_values(scylla_reactor_utilization, cluster)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "label": "dc", - "multi": true, - "name": "dc", - "options": [], - "query": "label_values(scylla_reactor_utilization{cluster=~\"$cluster\"}, dc)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "label": "node", - "multi": true, - "name": "node", - "options": [], - "query": "label_values(scylla_reactor_utilization{cluster=~\"$cluster|$^\", dc=~\"$dc\"}, instance)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "label": "shard", - "multi": true, - "name": "shard", - "options": [], - "query": "label_values(scylla_reactor_utilization,shard)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 3, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "class": "template_variable_single", - "current": { - "selected": false, - "text": "/mnt/disks/raid", - "value": "/mnt/disks/raid" - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": false, - "label": "Mount path", - "multi": false, - "name": "mount_point", - "options": [], - "query": "node_filesystem_avail_bytes", - "refresh": 2, - "regex": "/mountpoint=\"([^\"]*)\".*/", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "class": "aggregation_function", - "current": { - "tags": [], - "text": "sum", - "value": "sum" - }, - "hide": 0, - "includeAll": false, - "label": "Function", - "multi": false, - "name": "func", - "options": [ - { - "selected": true, - "text": "sum", - "value": "sum" - }, - { - "selected": false, - "text": "avg", - "value": "avg" - }, - { - "selected": false, - "text": "max", - "value": "max" - }, - { - "selected": false, - "text": "min", - "value": "min" - }, - { - "selected": false, - "text": "stddev", - "value": "stddev" - }, - { - "selected": false, - "text": "stdvar", - "value": "stdvar" - } - ], - "query": "sum,avg,max,min,stddev,stdvar", - "skipUrlSync": false, - "type": "custom" - }, - { - "class": "template_variable_custom", - "current": { - "text": "6-2", - "value": "6-2" - }, - "hide": 2, - "includeAll": false, - "multi": false, - "name": "dash_version", - "options": [ - { - "selected": true, - "text": "6-2", - "value": "6-2" - } - ], - "query": "6-2", - "skipUrlSync": false, - "type": "custom" - }, - { - "class": "template_variable_custom", - "current": { - "text": "6.2", - "value": "6.2" - }, - "hide": 2, - "includeAll": false, - "multi": false, - "name": "scylla_version", - "options": [ - { - "selected": true, - "text": "6.2", - "value": "6.2" - } - ], - "query": "6.2", - "skipUrlSync": false, - "type": "custom" - }, - { - "class": "monitor_version_var", - "current": { - "text": "4.9.4", - "value": "4.9.4" - }, - "hide": 2, - "includeAll": false, - "multi": false, - "name": "monitoring_version", - "options": [ - { - "selected": true, - "text": "4.9.4", - "value": "4.9.4" - } - ], - "query": "4.9.4", - "skipUrlSync": false, - "type": "custom" - }, - { - "class": "template_variable_custom", - "current": { - "text": "All", - "value": "$__all" - }, - "dashversion": [ - ">6.0", - ">2024.1" - ], - "hide": 2, - "includeAll": true, - "multi": true, - "name": "alternator_latency_ops", - "options": [ - { - "selected": true, - "text": "All", - "value": "$__all" - }, - { - "selected": false, - "text": "GetItem", - "value": "GetItem" - }, - { - "selected": false, - "text": "PutItem", - "value": "PutItem" - }, - { - "selected": false, - "text": "UpdateItem", - "value": "UpdateItem" - }, - { - "selected": false, - "text": "DeleteItem", - "value": "DeleteItem" - }, - { - "selected": false, - "text": "BatchWriteItem", - "value": "BatchWriteItem" - }, - { - "selected": false, - "text": "BatchGetItem", - "value": "BatchGetItem" - } - ], - "query": "GetItem,PutItem,UpdateItem,DeleteItem,BatchWriteItem,BatchGetItem", - "skipUrlSync": false, - "type": "custom" - }, - { - "class": "template_variable_custom", - "current": { - "text": "All", - "value": "$__all" - }, - "hide": 2, - "includeAll": true, - "multi": true, - "name": "alternator_streams_latency_ops", - "options": [ - { - "selected": true, - "text": "All", - "value": "$__all" - }, - { - "selected": false, - "text": "GetRecords", - "value": "GetRecords" - } - ], - "query": "GetRecords", - "skipUrlSync": false, - "type": "custom" - }, - { - "allValue": ".+", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "label": "ops", - "multi": true, - "name": "ops", - "options": [], - "query": "label_values(scylla_alternator_operation{cluster=~\"$cluster|$\"},op)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 3, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "current": { - "isNone": true, - "selected": false, - "text": "None", - "value": "" - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "scylla_alternator_total_operations{cluster=~\"$cluster|$^\"}", - "hide": 2, - "includeAll": false, - "multi": false, - "name": "no_alternator", - "options": [], - "query": { - "query": "scylla_alternator_total_operations{cluster=~\"$cluster|$^\"}", - "refId": "StandardVariableQuery" - }, - "refresh": 1, - "regex": "/^(scylla_alternator_total_operations)/", - "skipUrlSync": false, - "sort": 0, - "type": "query" - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "now": true, - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "browser", - "title": "Alternator", - "uid": "alternator-6-2", - "version": 1, - "weekStart": "" - } diff --git a/kubernetes/linera-validator/grafana-dashboards/scylla/scylla-cql.6.2.json b/kubernetes/linera-validator/grafana-dashboards/scylla/scylla-cql.6.2.json deleted file mode 100644 index dffa72e4cb6f..000000000000 --- a/kubernetes/linera-validator/grafana-dashboards/scylla/scylla-cql.6.2.json +++ /dev/null @@ -1,6570 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - }, - { - "class": "annotation_restart", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "resets(scylla_gossip_heart_beat{cluster=\"$cluster\"}[$__rate_interval])>0", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "node_restart", - "showIn": 0, - "tagKeys": "instance,dc,cluster", - "tags": [], - "titleFormat": "restart", - "type": "tags" - }, - { - "class": "annotation_stall", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": false, - "expr": "changes(scylla_stall_detector_reported{cluster=\"$cluster\"}[$__rate_interval])>0", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "stall detector", - "showIn": 0, - "tagKeys": "dc,instance,shard", - "tags": [], - "titleFormat": "Stall found", - "type": "tags" - }, - { - "class": "annotation_schema_changed", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": false, - "expr": "changes(scylla_database_schema_changed{cluster=\"$cluster\"}[$__rate_interval])>0", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "Schema Changed", - "showIn": 0, - "tagKeys": "instance,dc,cluster", - "tags": [], - "titleFormat": "schema changed", - "type": "tags" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 1, - "links": [ - { - "asDropdown": true, - "icon": "external link", - "includeVars": true, - "keepTime": true, - "tags": [], - "type": "dashboards" - } - ], - "liveNow": false, - "panels": [ - { - "class": "collapsible_row_panel", - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 1, - "panels": [], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "type": "row" - }, - { - "class": "text_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 3, - "w": 24, - "x": 0, - "y": 1 - }, - "id": 2, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "
\n\n [[cluster]]
", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 4 - }, - "id": 3, - "panels": [], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "CQL By User", - "type": "row" - }, - { - "class": "text_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 5 - }, - "id": 4, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

CQL By User - Coordinator

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Counts the total number of CQL INSERT requests with/without conditions.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 7 - }, - "id": 5, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "topk([[topk]], sum(rate(scylla_cql_inserts{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]) - sum(rate(scylla_cql_inserts_per_ks{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", who=\"internal\"}[$__rate_interval])) by ([[by]])) or on ([[by]]) bottomk([[bottomk]], sum(rate(scylla_cql_inserts{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]) - sum(rate(scylla_cql_inserts_per_ks{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", who=\"internal\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "CQL Insert", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of CQL SELECT commands generated by the user", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 7 - }, - "id": 6, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "topk([[topk]], sum(rate(scylla_cql_reads{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]) - sum(rate(scylla_cql_reads_per_ks{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", who=\"internal\"}[$__rate_interval])) by ([[by]])) or on ([[by]]) bottomk([[bottomk]], sum(rate(scylla_cql_reads{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]) - sum(rate(scylla_cql_reads_per_ks{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", who=\"internal\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "CQL Reads", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Counts the total number of CQL DELETE requests with/without conditions.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 7 - }, - "id": 7, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "topk([[topk]], sum(rate(scylla_cql_deletes{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]])-sum(rate(scylla_cql_deletes_per_ks{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", who=\"internal\"}[$__rate_interval])) by ([[by]])) or on ([[by]]) bottomk([[bottomk]], sum(rate(scylla_cql_deletes{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]])-sum(rate(scylla_cql_deletes_per_ks{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", who=\"internal\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "CQL Deletes", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Counts the total number of CQL UPDATE requests with/without conditions.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 7 - }, - "id": 8, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "topk([[topk]], sum(rate(scylla_cql_updates{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]])-sum(rate(scylla_cql_updates_per_ks{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", who=\"internal\"}[$__rate_interval])) by ([[by]])) or on ([[by]]) bottomk([[bottomk]], sum(rate(scylla_cql_updates{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]])-sum(rate(scylla_cql_updates_per_ks{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", who=\"internal\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "CQL Updates", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "amount of CQL connections currently established", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 13 - }, - "id": 9, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "pointradius": 1, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "topk([[topk]], sum(scylla_transport_current_connections{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by ([[by]])) or on ([[by]]) bottomk([[bottomk]], sum(scylla_transport_current_connections{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 30 - } - ], - "title": "Client CQL connections by [[by]]", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Rate of CQL connections created", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 13 - }, - "id": 10, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "pointradius": 1, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "topk([[topk]], sum(rate(scylla_transport_cql_connections{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]])) or on ([[by]]) bottomk([[bottomk]], sum(rate(scylla_transport_cql_connections{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 30 - } - ], - "title": "Client CQL new connections by [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Counts the number of SELECT statements with BYPASS CACHE option", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 13 - }, - "id": 11, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "topk([[topk]], sum(rate(scylla_cql_select_bypass_caches{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]])) or on ([[by]]) bottomk([[bottomk]], sum(rate(scylla_cql_select_bypass_caches{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "format": "time_series", - "hide": false, - "intervalFactor": 2, - "refId": "A" - } - ], - "title": "BYPASS CACHE", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "CQL errors by type, only active errors are shown", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 13 - }, - "id": 12, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "pointradius": 1, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "sum(rate(scylla_transport_cql_errors_total{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]],type) >0", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 30 - } - ], - "title": "CQL Errors [[by]]", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of Logged CQL batches command, each batched command is counted once.\n\nIs used to make sure that multiple mutations across multiple partitions happen atomically, that is, all the included mutations will eventually succeed. However, there is a performance penalty imposed by atomicity guarantee.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 19 - }, - "id": 13, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "pointradius": 1, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "topk([[topk]], sum(rate(scylla_cql_batches_pure_logged{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]])) or on ([[by]]) bottomk([[bottomk]], sum(rate(scylla_cql_batches_pure_logged{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 30 - } - ], - "title": "CQL Logged Batches by [[by]]", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of CQL batches command, each batched command is counted once.\n\nIs generally used to group mutations for a single partition and do not suffer from the performance penalty imposed by logged batches, but there is no atomicity guarantee for multi-partition updates.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 19 - }, - "id": 14, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "pointradius": 1, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "topk([[topk]], sum(rate(scylla_cql_batches_pure_unlogged{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]])) or on ([[by]]) bottomk([[bottomk]], sum(rate(scylla_cql_batches_pure_unlogged{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 30 - } - ], - "title": "CQL Unlogged Batches by [[by]]", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of CQL command batched. Each batch would add the number of commands inside the batch", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 19 - }, - "id": 15, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "pointradius": 1, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "topk([[topk]], sum(rate(scylla_cql_statements_in_batches{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]])) or on ([[by]]) bottomk([[bottomk]], sum(rate(scylla_cql_statements_in_batches{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 30 - } - ], - "title": "CQL Command In Batches by [[by]]", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of CQL row reads", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 19 - }, - "id": 16, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "pointradius": 1, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "topk([[topk]], sum(rate(scylla_cql_rows_read{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]])) or on ([[by]]) bottomk([[bottomk]], sum(rate(scylla_cql_rows_read{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 30 - } - ], - "title": "CQL Row Reads [[by]]", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of reads using secondary indexes", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 25 - }, - "id": 17, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "pointradius": 1, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "topk([[topk]], sum(rate(scylla_cql_secondary_index_reads{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]])) or on ([[by]]) bottomk([[bottomk]], sum(rate(scylla_cql_secondary_index_reads{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 30 - } - ], - "title": "Secondary indexes Reads [[by]]", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Requests by Consistency Level", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 25 - }, - "id": 18, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "pointradius": 1, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "topk([[topk]], sum(rate(scylla_query_processor_queries{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])>0) by ([[by]], consistency_level)) or on ([[by]],consistency_level) bottomk([[bottomk]], sum(rate(scylla_query_processor_queries{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])>0) by ([[by]], consistency_level))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 30 - } - ], - "title": "Requests by Consistency Level [[by]]", - "type": "timeseries" - }, - { - "class": "text_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 3, - "w": 24, - "x": 0, - "y": 31 - }, - "id": 19, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "CQL System tables
The following information is based on Scylla Plugin configuration, check the documentation for more details on how to enable it.", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "collapsible_row_panel", - "collapsed": true, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 34 - }, - "id": 20, - "panels": [ - { - "class": "single_value_table", - "columns": [ - { - "text": "Avg", - "value": "avg" - } - ], - "datasource": { - "uid": "scylla-datasource" - }, - "fieldConfig": { - "defaults": { - "custom": { - "filterable": false - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "fontSize": "100%", - "gridPos": { - "h": 6, - "w": 24, - "x": 0, - "y": 35 - }, - "id": 21, - "links": [], - "options": { - "showHeader": true - }, - "scroll": true, - "showHeader": true, - "sort": { - "col": 0, - "desc": true - }, - "span": 12, - "targets": [ - { - "allHosts": true, - "datasource": { - "uid": "scylla-datasource" - }, - "queryHost": "$node", - "queryText": "select address, port, shard_id, connection_stage, client_type, ssl_enabled, username, driver_name, driver_version, protocol_version from system.clients", - "refId": "A" - } - ], - "title": "Connection Table", - "transform": "table", - "type": "table" - } - ], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Connection", - "type": "row" - }, - { - "class": "collapsible_row_panel", - "collapsed": true, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 35 - }, - "id": 22, - "panels": [ - { - "class": "single_value_table", - "columns": [ - { - "text": "Avg", - "value": "avg" - } - ], - "datasource": { - "uid": "scylla-datasource" - }, - "fieldConfig": { - "defaults": { - "custom": { - "cellOptions": { - "type": "auto" - }, - "filterable": false, - "inspect": false - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "row_size" - }, - "properties": [ - { - "id": "unit", - "value": "bytes" - } - ] - } - ] - }, - "fontSize": "100%", - "gridPos": { - "h": 6, - "w": 24, - "x": 0, - "y": 36 - }, - "id": 23, - "links": [], - "options": { - "cellHeight": "sm", - "footer": { - "countRows": false, - "fields": "", - "reducer": [ - "sum" - ], - "show": false - }, - "showHeader": true - }, - "pluginVersion": "10.1.1", - "scroll": true, - "showHeader": true, - "sort": { - "col": 0, - "desc": true - }, - "span": 12, - "targets": [ - { - "allHosts": true, - "datasource": { - "uid": "scylla-datasource" - }, - "queryHost": "$node", - "queryText": "select keyspace_name, table_name,partition_key, clustering_key, row_size,compaction_time from system.large_rows", - "refId": "A" - } - ], - "title": "Large Rows", - "transform": "table", - "type": "table" - } - ], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Large Rows", - "type": "row" - }, - { - "class": "collapsible_row_panel", - "collapsed": true, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 36 - }, - "id": 24, - "panels": [ - { - "class": "single_value_table", - "columns": [ - { - "text": "Avg", - "value": "avg" - } - ], - "datasource": { - "uid": "scylla-datasource" - }, - "fieldConfig": { - "defaults": { - "custom": { - "filterable": false - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "cell_size" - }, - "properties": [ - { - "id": "unit", - "value": "bytes" - } - ] - } - ] - }, - "fontSize": "100%", - "gridPos": { - "h": 6, - "w": 24, - "x": 0, - "y": 49 - }, - "id": 25, - "links": [], - "options": { - "showHeader": true - }, - "scroll": true, - "showHeader": true, - "sort": { - "col": 0, - "desc": true - }, - "span": 12, - "targets": [ - { - "allHosts": true, - "datasource": { - "uid": "scylla-datasource" - }, - "queryHost": "$node", - "queryText": "select keyspace_name, table_name,partition_key, clustering_key, column_name,cell_size, collection_elements, compaction_time from system.large_cells", - "refId": "A" - } - ], - "title": "Large Cells", - "transform": "table", - "type": "table" - } - ], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Large Cells", - "type": "row" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 37 - }, - "id": 26, - "panels": [], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Partitions", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "partition_size" - }, - "properties": [ - { - "id": "unit", - "value": "bytes" - } - ] - } - ] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 38 - }, - "id": 27, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "allHosts": true, - "datasource": { - "uid": "scylla-datasource" - }, - "editorMode": "code", - "expr": "sum(rate(scylla_database_large_partition_exceeding_threshold[1m])) by (pod, service, shard)", - "legendFormat": "__auto", - "queryHost": "$node", - "queryText": "select keyspace_name, table_name,partition_key, partition_size, compaction_time, rows from system.large_partitions", - "range": true, - "refId": "A" - } - ], - "title": "Large Partitions", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "partition_size" - }, - "properties": [ - { - "id": "unit", - "value": "bytes" - } - ] - } - ] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 38 - }, - "id": 67, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "allHosts": true, - "datasource": { - "uid": "scylla-datasource" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "sum(rate(scylla_sstables_partition_reads[1m])) by (pod, service, shard)", - "fullMetaSearch": false, - "includeNullMetadata": true, - "legendFormat": "__auto", - "queryHost": "$node", - "queryText": "select keyspace_name, table_name,partition_key, partition_size, compaction_time, rows from system.large_partitions", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "SSTable partition reads", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "partition_size" - }, - "properties": [ - { - "id": "unit", - "value": "bytes" - } - ] - } - ] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 38 - }, - "id": 68, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "allHosts": true, - "datasource": { - "uid": "scylla-datasource" - }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "sum by(pod, service, shard) (rate(scylla_sstables_partition_writes[1m]))", - "fullMetaSearch": false, - "includeNullMetadata": true, - "legendFormat": "__auto", - "queryHost": "$node", - "queryText": "select keyspace_name, table_name,partition_key, partition_size, compaction_time, rows from system.large_partitions", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "SSTable partition writes", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "partition_size" - }, - "properties": [ - { - "id": "unit", - "value": "bytes" - } - ] - } - ] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 38 - }, - "id": 70, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "allHosts": true, - "datasource": { - "uid": "scylla-datasource" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "sum by(pod, service, shard) (rate(scylla_cache_partition_hits[1m]))", - "fullMetaSearch": false, - "includeNullMetadata": true, - "legendFormat": "Hits - Pod: {{pod}} - Service: {{service}} - Shard: {{shard}}", - "queryHost": "$node", - "queryText": "select keyspace_name, table_name,partition_key, partition_size, compaction_time, rows from system.large_partitions", - "range": true, - "refId": "A", - "useBackend": false - }, - { - "allHosts": true, - "datasource": { - "uid": "scylla-datasource" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "sum by(pod, service, shard) (rate(scylla_cache_partition_misses[1m]))", - "fullMetaSearch": false, - "hide": false, - "includeNullMetadata": true, - "legendFormat": "Misses - Pod: {{pod}} - Service: {{service}} - Shard: {{shard}}", - "queryHost": "$node", - "queryText": "select keyspace_name, table_name,partition_key, partition_size, compaction_time, rows from system.large_partitions", - "range": true, - "refId": "B", - "useBackend": false - }, - { - "allHosts": true, - "datasource": { - "uid": "scylla-datasource" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "sum by(pod, service) (rate(scylla_cache_partition_hits[1m]))", - "fullMetaSearch": false, - "hide": false, - "includeNullMetadata": true, - "legendFormat": "Hits - Pod: {{pod}} - Service: {{service}}", - "queryHost": "$node", - "queryText": "select keyspace_name, table_name,partition_key, partition_size, compaction_time, rows from system.large_partitions", - "range": true, - "refId": "C", - "useBackend": false - }, - { - "allHosts": true, - "datasource": { - "uid": "scylla-datasource" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "sum by(pod, service) (rate(scylla_cache_partition_misses[1m]))", - "fullMetaSearch": false, - "hide": false, - "includeNullMetadata": true, - "legendFormat": "Misses - Pod: {{pod}} - Service: {{service}}", - "queryHost": "$node", - "queryText": "select keyspace_name, table_name,partition_key, partition_size, compaction_time, rows from system.large_partitions", - "range": true, - "refId": "D", - "useBackend": false - } - ], - "title": "Cache partition hits/misses", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "partition_size" - }, - "properties": [ - { - "id": "unit", - "value": "bytes" - } - ] - } - ] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 44 - }, - "id": 69, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "allHosts": true, - "datasource": { - "uid": "scylla-datasource" - }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "sum by(pod, service, shard) (rate(scylla_column_family_memtable_partition_hits[1m]))", - "fullMetaSearch": false, - "includeNullMetadata": true, - "legendFormat": "__auto", - "queryHost": "$node", - "queryText": "select keyspace_name, table_name,partition_key, partition_size, compaction_time, rows from system.large_partitions", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "Memtable partition hits", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "partition_size" - }, - "properties": [ - { - "id": "unit", - "value": "bytes" - } - ] - } - ] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 44 - }, - "id": 71, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "allHosts": true, - "datasource": { - "uid": "scylla-datasource" - }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "sum by(pod, service, shard) (rate(scylla_column_family_memtable_partition_writes[1m]))", - "fullMetaSearch": false, - "includeNullMetadata": true, - "legendFormat": "__auto", - "queryHost": "$node", - "queryText": "select keyspace_name, table_name,partition_key, partition_size, compaction_time, rows from system.large_partitions", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "Memtable partition writes", - "type": "timeseries" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 50 - }, - "id": 28, - "panels": [], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "CQL Internal", - "type": "row" - }, - { - "class": "text_panel", - "editable": true, - "error": false, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 51 - }, - "id": 29, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

CQL Internal - Coordinator

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "transparent": true, - "type": "text" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of CQL INSERT commands generated by internal operations", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 53 - }, - "id": 30, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "topk([[topk]], sum(rate(scylla_cql_inserts_per_ks{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", who=\"internal\"}[$__rate_interval])) by ([[by]])) or on ([[by]]) bottomk([[bottomk]], sum(rate(scylla_cql_inserts_per_ks{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", who=\"internal\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "CQL Internal Insert", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of CQL SELECT commands generated by internal operations", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 53 - }, - "id": 31, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "topk([[topk]], sum(rate(scylla_cql_reads_per_ks{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", who=\"internal\"}[$__rate_interval])) by ([[by]])) or on ([[by]]) bottomk([[bottomk]], sum(rate(scylla_cql_reads_per_ks{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", who=\"internal\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "CQL Internal Reads", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Counts the total number of CQL DELETE requests with/without conditions.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 53 - }, - "id": 32, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "topk([[topk]], sum(rate(scylla_cql_deletes_per_ks{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", who=\"internal\"}[$__rate_interval])) by ([[by]])) or on ([[by]]) bottomk([[bottomk]], sum(rate(scylla_cql_deletes_per_ks{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", who=\"internal\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "CQL Deletes", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Counts the total number of CQL UPDATE requests with/without conditions.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 53 - }, - "id": 33, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "topk([[topk]], sum(rate(scylla_cql_updates_per_ks{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", who=\"internal\"}[$__rate_interval])) by ([[by]])) or on ([[by]]) bottomk([[bottomk]], sum(rate(scylla_cql_updates_per_ks{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", who=\"internal\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "CQL Updates", - "type": "timeseries" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 59 - }, - "id": 34, - "panels": [], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "LWT", - "type": "row" - }, - { - "class": "text_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 60 - }, - "id": 35, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

LWT

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Counts the total number of CQL INSERT requests with/without conditions.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 62 - }, - "id": 36, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "topk([[topk]], sum(rate(scylla_cql_inserts{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", conditional=\"yes\"}[$__rate_interval])) by ([[by]])) or on ([[by]]) bottomk([[bottomk]], sum(rate(scylla_cql_inserts{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", conditional=\"yes\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "CQL Insert", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Counts the total number of CQL DELETE requests with/without conditions.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 62 - }, - "id": 37, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "topk([[topk]], sum(rate(scylla_cql_deletes{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", conditional=\"yes\"}[$__rate_interval])) by ([[by]])) or on ([[by]]) bottomk([[bottomk]], sum(rate(scylla_cql_deletes{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", conditional=\"yes\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "CQL Deletes", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Counts the total number of CQL UPDATE requests with/without conditions.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 62 - }, - "id": 38, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "topk([[topk]], sum(rate(scylla_cql_updates{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", conditional=\"yes\"}[$__rate_interval])) by ([[by]])) or on ([[by]]) bottomk([[bottomk]], sum(rate(scylla_cql_updates{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", conditional=\"yes\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "CQL Updates", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of CQL batches command, each batched command is counted once", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 62 - }, - "id": 39, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "pointradius": 1, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "topk([[topk]], sum(rate(scylla_cql_batches{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", conditional=\"yes\"}[$__rate_interval])) by ([[by]])) or on ([[by]]) bottomk([[bottomk]], sum(rate(scylla_cql_batches{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", conditional=\"yes\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 30 - } - ], - "title": "CQL Batches by [[by]]", - "type": "timeseries" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 68 - }, - "id": 40, - "panels": [], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Optimization", - "type": "row" - }, - { - "class": "text_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 69 - }, - "id": 41, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

Optimization

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "gauge_errors_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "All of the requests should be prepared\n\nPrepared statements remove the overhead of parsing the query every time and allow optimal routing of requests from client to server", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "#299c46", - "value": null - }, - { - "color": "rgba(237, 129, 40, 0.89)", - "value": 4 - }, - { - "color": "#d44a3a", - "value": 10 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 2, - "x": 0, - "y": 71 - }, - "id": 42, - "links": [], - "options": { - "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showThresholdLabels": false, - "showThresholdMarkers": true - }, - "pluginVersion": "10.1.1", - "span": 1, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "floor(100 *sum(cql:non_system_prepared1m)/ (sum(cql:all_shardrate1m{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) - sum(cql:all_system_shardrate1m{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}))) OR vector(0)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A" - } - ], - "title": "CQL Non-Prepared Statements", - "transparent": true, - "type": "gauge" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "All of the requests should be prepared\n", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 2, - "y": 71 - }, - "id": 43, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "sum(cql:non_system_prepared1m{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by ([[by]])", - "format": "time_series", - "hide": false, - "intervalFactor": 2, - "refId": "A" - } - ], - "title": "CQL Non-Prepared Statements", - "type": "timeseries" - }, - { - "class": "gauge_errors_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "All requests should be paged\n\nNon Paged request sources:\n- Client modifying the fetch size\n\nNon Paged requests require reading all the results and returning them in a single request.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "#299c46", - "value": null - }, - { - "color": "rgba(237, 129, 40, 0.89)", - "value": 4 - }, - { - "color": "#d44a3a", - "value": 10 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 2, - "x": 8, - "y": 71 - }, - "id": 44, - "links": [], - "options": { - "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showThresholdLabels": false, - "showThresholdMarkers": true - }, - "pluginVersion": "10.1.1", - "span": 1, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "100 * ((sum(rate(scylla_cql_unpaged_select_queries{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval]))-sum(rate(scylla_cql_unpaged_select_queries_per_ks{ks=\"system\",instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])))/sum(rate(scylla_cql_reads{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval]))) OR vector(0)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A" - } - ], - "title": "Non-Paged CQL Reads", - "transparent": true, - "type": "gauge" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Non-Paged requests require reading all the results and returning them in a single request", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 10, - "y": 71 - }, - "id": 45, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "sum(rate(scylla_cql_unpaged_select_queries{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]])-sum(rate(scylla_cql_unpaged_select_queries_per_ks{ks=\"system\",instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]])", - "format": "time_series", - "hide": false, - "intervalFactor": 2, - "refId": "A" - } - ], - "title": "Non-Paged CQL Reads", - "type": "timeseries" - }, - { - "class": "gauge_errors_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "All of the requests should be Token Aware\n\nNon Token Aware requests sources:\n* Non-Prepared Stamements\n* Client not using a Token Aware load balancing policy\n\nTokenAware requests are sent to a Scylla node that is also a replica. Token Un-Aware requests require extra hop and additional processing.\n\nNote that the metric shows incorrect values when batches are used.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "#299c46", - "value": null - }, - { - "color": "rgba(237, 129, 40, 0.89)", - "value": 4 - }, - { - "color": "#d44a3a", - "value": 10 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 2, - "x": 16, - "y": 71 - }, - "id": 46, - "links": [], - "options": { - "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showThresholdLabels": false, - "showThresholdMarkers": true - }, - "pluginVersion": "10.1.1", - "span": 1, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "clamp_max(100*((sum(rate(scylla_storage_proxy_coordinator_reads_coordinator_outside_replica_set{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) or on() vector(0)) + (sum(rate(scylla_storage_proxy_coordinator_writes_coordinator_outside_replica_set{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) or on() vector(0)))/((sum(rate(scylla_query_processor_queries{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) + 1) or vector(1)),100) OR vector(0)", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "", - "refId": "A" - } - ], - "title": "Non-Token Aware", - "transparent": true, - "type": "gauge" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Requests that are not token aware indicates that requests are not routed to the right node, which require extra hop and additional processing.\n\nNote that the metric shows incorrect values when batches are used.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 71 - }, - "id": 47, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "(sum(rate(scylla_storage_proxy_coordinator_reads_coordinator_outside_replica_set{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]) or on() sum(scylla_reactor_utilization*0) by([[by]])) + (sum(rate(scylla_storage_proxy_coordinator_writes_coordinator_outside_replica_set{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]) or on() sum(scylla_reactor_utilization*0) by([[by]]))", - "format": "time_series", - "hide": false, - "intervalFactor": 2, - "refId": "A" - } - ], - "title": "Non-Token Aware Queries", - "type": "timeseries" - }, - { - "class": "gauge_errors_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Reversed CQL Reads entail additional processing on server side\n\nSources: CQL Read requests with ORDER BY that is different from the \"CLUSTERING ORDER BY\" of the table\nAlternatives:\n\n* Denormalize your data (use a Materialized View)", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "#299c46", - "value": null - }, - { - "color": "rgba(237, 129, 40, 0.89)", - "value": 4 - }, - { - "color": "#d44a3a", - "value": 10 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 2, - "x": 0, - "y": 77 - }, - "id": 48, - "links": [], - "options": { - "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showThresholdLabels": false, - "showThresholdMarkers": true - }, - "pluginVersion": "10.1.1", - "span": 1, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "100 * sum(rate(scylla_cql_reverse_queries{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) / sum(rate(scylla_cql_reads{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) OR vector(0)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A" - } - ], - "title": "Reversed CQL Reads", - "transparent": true, - "type": "gauge" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Reversed CQL Reads entail additional processing on server side and should be avoided", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 2, - "y": 77 - }, - "id": 49, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "sum(rate(scylla_cql_reverse_queries{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]])", - "format": "time_series", - "hide": false, - "intervalFactor": 2, - "refId": "A" - } - ], - "title": "Reversed CQL Reads", - "type": "timeseries" - }, - { - "class": "gauge_errors_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "ALLOW FILTERING CQL Reads, the percentage of read requests with 'ALLOW FILTERING'\n\nALLOW FILTERING CQL Reads entail additional processing on server side\n\nSources: CQL Read requests with \"ALLOW FILTERING\"\n\nALLOW FILTERING should be used when large parts of the filtered data is returned - check \n\"ALLOW FILTERING CQL Read Filtered Rows to check what percentage of the data is used\"\n\nAlternatives:\n- Use a Secondary Index\n- Denormalize your data (use a Materialized View)", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "#299c46", - "value": null - }, - { - "color": "rgba(237, 129, 40, 0.89)", - "value": 4 - }, - { - "color": "#d44a3a", - "value": 10 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 2, - "x": 8, - "y": 77 - }, - "id": 50, - "links": [], - "options": { - "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showThresholdLabels": false, - "showThresholdMarkers": true - }, - "pluginVersion": "10.1.1", - "span": 1, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "100 * sum(rate(scylla_cql_filtered_read_requests{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) / sum(rate(scylla_cql_reads{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) OR vector(0)", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "", - "refId": "A" - } - ], - "title": "ALLOW FILTERING CQL Reads", - "transparent": true, - "type": "gauge" - }, - { - "class": "rps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Read requests with ALLOW FILTERING\n\nALLOW FILTERING CQL Reads entail additional processing on server side and should be avoided", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:reads/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 10, - "y": 77 - }, - "id": 51, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "sum(rate(scylla_cql_filtered_read_requests{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]])", - "format": "time_series", - "hide": false, - "intervalFactor": 2, - "refId": "A" - } - ], - "title": "ALLOW FILTERING CQL Reads", - "type": "timeseries" - }, - { - "class": "gauge_errors_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "ALLOW FILTERING Filtered rows, the percentage of rows that were read and then filtered.\n\nALLOW FILTERING CQL Reads entail additional processing on server side. \nReading a row and then filter it is a waste of resources.\n\nSources: CQL Read requests with \"ALLOW FILTERING\"\n\nALLOW FILTERING should be used when large parts of the filtered data is returned\n\nAlternatives:\n- Use a Secondary Index\n- Denormalize your data (use a Materialized View)", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "#299c46", - "value": null - }, - { - "color": "rgba(237, 129, 40, 0.89)", - "value": 4 - }, - { - "color": "#d44a3a", - "value": 10 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 2, - "x": 16, - "y": 77 - }, - "id": 52, - "links": [], - "options": { - "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showThresholdLabels": false, - "showThresholdMarkers": true - }, - "pluginVersion": "10.1.1", - "span": 1, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "100 * sum(rate(scylla_cql_filtered_rows_dropped_total{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) /sum(rate(scylla_cql_filtered_rows_read_total{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) OR vector(0)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A" - } - ], - "title": "ALLOW FILTERING Filtered Rows", - "transparent": true, - "type": "gauge" - }, - { - "class": "rps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "CQL Queries with ALLOW FILTERING should be avoided.\nDropped rows are rows that were read but were filtered by the server.\nWhen dropped rows is relatively high you should consider the alternatives", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:reads/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 77 - }, - "id": 53, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "sum(rate(scylla_cql_filtered_rows_read_total{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]])", - "format": "time_series", - "hide": false, - "intervalFactor": 2, - "legendFormat": "rows read $node $shard", - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "sum(rate(scylla_cql_filtered_rows_matched_total{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]])", - "format": "time_series", - "hide": false, - "interval": "", - "intervalFactor": 2, - "legendFormat": "rows matched $node $shard", - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "sum(rate(scylla_cql_filtered_rows_dropped_total{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "rows dropped $node $shard", - "refId": "C" - } - ], - "title": "ALLOW FILTERING CQL Read Filtering", - "type": "timeseries" - }, - { - "class": "gauge_errors_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Range scans should typically by pass the cache.\n\n Add BYPASS CACHE to your select queries.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "#299c46", - "value": null - }, - { - "color": "rgba(237, 129, 40, 0.89)", - "value": 4 - }, - { - "color": "#d44a3a", - "value": 10 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 2, - "x": 0, - "y": 83 - }, - "id": 54, - "links": [], - "options": { - "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showThresholdLabels": false, - "showThresholdMarkers": true - }, - "pluginVersion": "10.1.1", - "span": 1, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "floor(100 *sum(rate(scylla_cql_select_partition_range_scan_no_bypass_cache{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval]))/(sum(rate(scylla_cql_reads{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) - sum(rate(scylla_cql_reads_per_ks{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", who=\"internal\"}[$__rate_interval])) )) OR vector(0)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A" - } - ], - "title": "Range Scans", - "transparent": true, - "type": "gauge" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Range scans should typically by pass the cache.\n\n Add BYPASS CACHE to your select queries.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 2, - "y": 83 - }, - "id": 55, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "sum(rate(scylla_cql_select_partition_range_scan_no_bypass_cache{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]])", - "format": "time_series", - "hide": false, - "intervalFactor": 2, - "refId": "A" - } - ], - "title": "Range Scans Without BYPASS CACHE ", - "type": "timeseries" - }, - { - "class": "gauge_errors_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Using consistency level ANY in a query may hurt persistency, if the node receiving the request will fail the data may be lost", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "#299c46", - "value": null - }, - { - "color": "rgba(237, 129, 40, 0.89)", - "value": 4 - }, - { - "color": "#d44a3a", - "value": 10 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 2, - "x": 8, - "y": 83 - }, - "id": 56, - "links": [], - "options": { - "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showThresholdLabels": false, - "showThresholdMarkers": true - }, - "pluginVersion": "10.1.1", - "span": 1, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "floor(100 *sum(rate(scylla_query_processor_queries{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", consistency_level=\"ANY\"}[$__rate_interval]))/sum(rate(scylla_query_processor_queries{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval]))) OR vector(0)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A" - } - ], - "title": "CQL ANY Queries", - "transparent": true, - "type": "gauge" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Using consistency level ANY in a query may hurt persistency, if the node receiving the request will fail the data may be lost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 10, - "y": 83 - }, - "id": 57, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "sum(rate(scylla_query_processor_queries{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", consistency_level=\"ANY\"}[$__rate_interval])) by ([[by]])", - "format": "time_series", - "hide": false, - "intervalFactor": 2, - "refId": "A" - } - ], - "title": "CQL ANY CL Queries", - "type": "timeseries" - }, - { - "class": "gauge_errors_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Using consistency level ALL in a query may hurt availability, if a node is unavailable operations will fail", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "#299c46", - "value": null - }, - { - "color": "rgba(237, 129, 40, 0.89)", - "value": 4 - }, - { - "color": "#d44a3a", - "value": 10 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 2, - "x": 16, - "y": 83 - }, - "id": 58, - "links": [], - "options": { - "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showThresholdLabels": false, - "showThresholdMarkers": true - }, - "pluginVersion": "10.1.1", - "span": 1, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "floor(100 *sum(rate(scylla_query_processor_queries{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", consistency_level=\"ALL\"}[$__rate_interval]))/sum(rate(scylla_query_processor_queries{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval]))) OR vector(0)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A" - } - ], - "title": "CQL ALL CL Queries", - "transparent": true, - "type": "gauge" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Using consistency level ALL in a query may hurt availability, if a node is unavailable operations will fail", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 83 - }, - "id": 59, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "sum(rate(scylla_query_processor_queries{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", consistency_level=\"ALL\"}[$__rate_interval])) by ([[by]])", - "format": "time_series", - "hide": false, - "intervalFactor": 2, - "refId": "A" - } - ], - "title": "CQL ALL CL Queries", - "type": "timeseries" - }, - { - "class": "text_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 3, - "w": 24, - "x": 0, - "y": 89 - }, - "id": 60, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

Cross DC Information

This section is relevant only if you have more than one DC
", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "gauge_errors_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "How many Queries use Consistency level ONE\n\nThis is an issue when using multiple datacenters.\n\nUsing consistency level ONE in a query when there is more than one DC may hurt performance, queries may end in the non-local DC. Use LOCAL_ONE instead", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "#299c46", - "value": null - }, - { - "color": "rgba(237, 129, 40, 0.89)", - "value": 4 - }, - { - "color": "#d44a3a", - "value": 10 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 2, - "x": 0, - "y": 92 - }, - "id": 61, - "links": [], - "options": { - "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showThresholdLabels": false, - "showThresholdMarkers": true - }, - "pluginVersion": "10.1.1", - "span": 1, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "floor(100 *sum(rate(scylla_query_processor_queries{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", consistency_level=\"ONE\"}[$__rate_interval]))/sum(rate(scylla_query_processor_queries{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval]))) OR vector(0)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A" - } - ], - "title": "CQL ONE Queries", - "transparent": true, - "type": "gauge" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "How many Queries use Consistency level ONE\n\nThis is an issue when using multiple datacenters.\n\nUsing consistency level ONE in a query when there is more than one DC may hurt performance, queries may end in the non-local DC. Use LOCAL_ONE instead", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 2, - "y": 92 - }, - "id": 62, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "sum(rate(scylla_query_processor_queries{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", consistency_level=\"ONE\"}[$__rate_interval])) by ([[by]])", - "format": "time_series", - "hide": false, - "intervalFactor": 2, - "refId": "A" - } - ], - "title": "CQL ONE CL Queries", - "type": "timeseries" - }, - { - "class": "gauge_errors_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "How many Queries use Consistency level QUORUM\n\nThis is an issue when using multiple datacenters.\n\nUsing consistency level QUORUM in a query when there is more than one DC may hurt performance, queries may end in the non-local DC. Use LOCAL_QUORUM instead", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "#299c46", - "value": null - }, - { - "color": "rgba(237, 129, 40, 0.89)", - "value": 4 - }, - { - "color": "#d44a3a", - "value": 10 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 2, - "x": 8, - "y": 92 - }, - "id": 63, - "links": [], - "options": { - "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showThresholdLabels": false, - "showThresholdMarkers": true - }, - "pluginVersion": "10.1.1", - "span": 1, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "floor(100 *sum(rate(scylla_query_processor_queries{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", consistency_level=\"QUORUM\"}[$__rate_interval]))/sum(rate(scylla_query_processor_queries{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval]))) OR vector(0)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A" - } - ], - "title": "CQL QUORUM CL Queries", - "transparent": true, - "type": "gauge" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "How many Queries use Consistency level QUORUM\n\nThis is an issue when using multiple datacenters.\n\nUsing consistency level QUORUM in a query when there is more than one DC may hurt performance, queries may end in the non-local DC. Use LOCAL_QUORUM instead", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 10, - "y": 92 - }, - "id": 64, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "sum(rate(scylla_query_processor_queries{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", consistency_level=\"QUORUM\"}[$__rate_interval])) by ([[by]])", - "format": "time_series", - "hide": false, - "intervalFactor": 2, - "refId": "A" - } - ], - "title": "CQL QUORUM CL Queries", - "type": "timeseries" - }, - { - "class": "gauge_errors_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Cross DC traffic may cause additional latencies and network loads and in most cases, should be avoided.\n\nCross DC Read requests sources:\n- Consistency Level that is not LOCAL_XXX\n- Tables with read_repair_chance > 0\n\nNote:\n- If requests are supposed to be DC local - verify client is using a DCAware policy and a LOCAL_XX consistency level", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "#299c46", - "value": null - }, - { - "color": "rgba(237, 129, 40, 0.89)", - "value": 4 - }, - { - "color": "#d44a3a", - "value": 10 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 24, - "x": 0, - "y": 98 - }, - "id": 65, - "links": [], - "options": { - "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showThresholdLabels": false, - "showThresholdMarkers": true - }, - "pluginVersion": "10.1.1", - "repeat": "dc", - "span": 2, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "100*(sum(rate(scylla_storage_proxy_coordinator_reads_remote_node{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) - sum(rate(scylla_storage_proxy_coordinator_reads_remote_node{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", datacenter=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])))/sum(rate(scylla_storage_proxy_coordinator_reads_remote_node{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) OR vector(0)", - "format": "time_series", - "intervalFactor": 1, - "refId": "A" - } - ], - "title": "Cross DC read requests $dc", - "transparent": true, - "type": "gauge" - }, - { - "class": "plain_text", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 3, - "w": 24, - "x": 0, - "y": 200 - }, - "id": 66, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "
Scylla Monitoring version - 4.9.4
\n    
", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - } - ], - "refresh": "10s", - "schemaVersion": 38, - "style": "dark", - "tags": [ - "6.2" - ], - "templating": { - "list": [ - { - "class": "by_template_var", - "current": { - "tags": [], - "text": "Instance", - "value": "instance" - }, - "hide": 0, - "includeAll": false, - "label": "by", - "multi": false, - "name": "by", - "options": [ - { - "selected": false, - "text": "Cluster", - "value": "cluster" - }, - { - "selected": false, - "text": "DC", - "value": "dc" - }, - { - "selected": true, - "text": "Instance", - "value": "instance" - }, - { - "selected": false, - "text": "Shard", - "value": "instance,shard" - } - ], - "query": "Cluster : cluster,DC : dc, Instance : instance, Shard : instance\\,shard", - "skipUrlSync": false, - "type": "custom" - }, - { - "class": "template_variable_single", - "current": { - "selected": false, - "text": "scylla", - "value": "scylla" - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": false, - "label": "cluster", - "multi": false, - "name": "cluster", - "options": [], - "query": "label_values(scylla_reactor_utilization, cluster)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "label": "dc", - "multi": true, - "name": "dc", - "options": [], - "query": "label_values(scylla_reactor_utilization{cluster=~\"$cluster\"}, dc)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "class": "template_variable_single", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "label": "node", - "multi": true, - "name": "node", - "options": [], - "query": "label_values(scylla_reactor_utilization{cluster=\"$cluster\", dc=~\"$dc\"}, instance)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "label": "shard", - "multi": true, - "name": "shard", - "options": [], - "query": "label_values(scylla_reactor_utilization,shard)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 3, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "class": "topk_limit", - "current": { - "tags": [], - "text": "256", - "value": "256" - }, - "hide": 0, - "includeAll": false, - "label": "Filter Highest", - "multi": false, - "name": "topk", - "options": [ - { - "selected": false, - "text": "0", - "value": "0" - }, - { - "selected": false, - "text": "5", - "value": "5" - }, - { - "selected": false, - "text": "10", - "value": "10" - }, - { - "selected": false, - "text": "20", - "value": "20" - }, - { - "selected": false, - "text": "50", - "value": "50" - }, - { - "selected": false, - "text": "100", - "value": "100" - }, - { - "selected": true, - "text": "256", - "value": "256" - }, - { - "selected": false, - "text": "512", - "value": "512" - }, - { - "selected": false, - "text": "1000", - "value": "1000" - }, - { - "selected": false, - "text": "10000", - "value": "10000" - } - ], - "query": "0, 5, 10, 20, 50, 100, 256, 500, 1000, 10000", - "skipUrlSync": false, - "type": "custom" - }, - { - "class": "botomk_limit", - "current": { - "tags": [], - "text": "0", - "value": "0" - }, - "hide": 0, - "includeAll": false, - "label": "Filter Lowest", - "multi": false, - "name": "bottomk", - "options": [ - { - "selected": true, - "text": "0", - "value": "0" - }, - { - "selected": false, - "text": "5", - "value": "5" - }, - { - "selected": false, - "text": "10", - "value": "10" - }, - { - "selected": false, - "text": "20", - "value": "20" - }, - { - "selected": false, - "text": "50", - "value": "50" - }, - { - "selected": false, - "text": "100", - "value": "100" - }, - { - "selected": false, - "text": "256", - "value": "256" - }, - { - "selected": false, - "text": "512", - "value": "512" - }, - { - "selected": false, - "text": "1000", - "value": "1000" - }, - { - "selected": false, - "text": "10000", - "value": "10000" - } - ], - "query": "0, 5, 10, 20, 50, 100, 256, 500, 1000, 10000", - "skipUrlSync": false, - "type": "custom" - }, - { - "class": "template_variable_custom", - "current": { - "text": "6-2", - "value": "6-2" - }, - "hide": 2, - "includeAll": false, - "multi": false, - "name": "dash_version", - "options": [ - { - "selected": true, - "text": "6-2", - "value": "6-2" - } - ], - "query": "6-2", - "skipUrlSync": false, - "type": "custom" - }, - { - "class": "template_variable_custom", - "current": { - "text": "6.2", - "value": "6.2" - }, - "hide": 2, - "includeAll": false, - "multi": false, - "name": "scylla_version", - "options": [ - { - "selected": true, - "text": "6.2", - "value": "6.2" - } - ], - "query": "6.2", - "skipUrlSync": false, - "type": "custom" - }, - { - "class": "monitor_version_var", - "current": { - "text": "4.9.4", - "value": "4.9.4" - }, - "hide": 2, - "includeAll": false, - "multi": false, - "name": "monitoring_version", - "options": [ - { - "selected": true, - "text": "4.9.4", - "value": "4.9.4" - } - ], - "query": "4.9.4", - "skipUrlSync": false, - "type": "custom" - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "now": true, - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "browser", - "title": "Scylla CQL", - "uid": "cql-6-2", - "version": 1, - "weekStart": "" - } \ No newline at end of file diff --git a/kubernetes/linera-validator/grafana-dashboards/scylla/scylla-detailed.6.2.json b/kubernetes/linera-validator/grafana-dashboards/scylla/scylla-detailed.6.2.json deleted file mode 100644 index 088bd1e5963c..000000000000 --- a/kubernetes/linera-validator/grafana-dashboards/scylla/scylla-detailed.6.2.json +++ /dev/null @@ -1,14520 +0,0 @@ -{ - "annotations": { - "class": "default_annotations", - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "enable": false, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - }, - { - "class": "annotation_restart", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "resets(scylla_gossip_heart_beat{cluster=\"$cluster\"}[$__rate_interval])>0", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "node_restart", - "showIn": 0, - "tagKeys": "instance,dc,cluster", - "tags": [], - "titleFormat": "restart", - "type": "tags" - }, - { - "class": "annotation_stall", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": false, - "expr": "changes(scylla_stall_detector_reported{cluster=\"$cluster\"}[$__rate_interval])>0", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "stall detector", - "showIn": 0, - "tagKeys": "dc,instance,shard", - "tags": [], - "titleFormat": "Stall found", - "type": "tags" - }, - { - "class": "annotation_schema_changed", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": false, - "expr": "changes(scylla_database_schema_changed{cluster=\"$cluster\"}[$__rate_interval])>0", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "Schema Changed", - "showIn": 0, - "tagKeys": "instance,dc,cluster", - "tags": [], - "titleFormat": "schema changed", - "type": "tags" - }, - { - "class": "annotation_manager_task", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "scylla_manager_task_active_count{type=~\"repair|backup\",cluster=\"$cluster\"}>0", - "hide": false, - "iconColor": "#73BF69", - "limit": 100, - "name": "Task", - "showIn": 0, - "tagKeys": "type", - "tags": [], - "titleFormat": "Running", - "type": "tags" - }, - { - "class": "annotation_hints_writes", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": false, - "expr": "changes(scylla_hints_manager_written{cluster=\"$cluster\"}[$__rate_interval])>0", - "hide": false, - "iconColor": "rgb(255, 176, 0, 128)", - "limit": 100, - "name": "Hints Write", - "showIn": 0, - "tagKeys": "instance,dc,cluster", - "tags": [], - "titleFormat": "Hints write", - "type": "tags" - }, - { - "class": "annotation_hints_sent", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": false, - "expr": "changes(scylla_hints_manager_sent{cluster=\"$cluster\"}[$__rate_interval])>0", - "hide": false, - "iconColor": "rgb(50, 176, 0, 128)", - "limit": 100, - "name": "Hints Sent", - "showIn": 0, - "tagKeys": "instance,dc,cluster", - "tags": [], - "titleFormat": "Hints Sent", - "type": "tags" - }, - { - "class": "mv_building", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "sum(scylla_view_builder_builds_in_progress{cluster=\"$cluster\"})>0", - "hide": false, - "iconColor": "rgb(50, 176, 0, 128)", - "limit": 100, - "name": "MV", - "showIn": 0, - "tagKeys": "instance,dc,cluster", - "tags": [], - "titleFormat": "Materialized View built", - "type": "tags" - }, - { - "class": "ops_annotation", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "10*min(scylla_node_ops_finished_percentage{cluster=\"$cluster\"}) by (ops, dc,instance) < 10", - "hide": false, - "iconColor": "rgb(50, 176, 0, 128)", - "limit": 100, - "name": "ops", - "showIn": 0, - "tagKeys": "ops,dc,instance", - "tags": [], - "titleFormat": "Operation", - "type": "tags" - }, - { - "class": "stream_annotation", - "dashversion": [ - ">5.2", - ">2023.1" - ], - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "10*min(scylla_streaming_finished_percentage{cluster=\"$cluster\"}) by (ops, dc,instance) < 10", - "hide": false, - "iconColor": "rgb(50, 176, 0, 128)", - "limit": 100, - "name": "streaming", - "showIn": 0, - "tagKeys": "ops,dc,instance", - "tags": [], - "titleFormat": "Streaming", - "type": "tags" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 1, - "links": [ - { - "asDropdown": true, - "icon": "external link", - "includeVars": true, - "keepTime": true, - "tags": [], - "type": "dashboards" - } - ], - "liveNow": false, - "panels": [ - { - "class": "text_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 3, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 1, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "
\n\n [[cluster]]
", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "percent_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The percentage of the time during which Scylla utilized the CPU. Note that because Scylla does busy polling for some time before going idle, CPU utilization as seen by the operating system may be much higher. Your system is not yet CPU-bottlenecked until this metric is high.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 4, - "x": 0, - "y": 3 - }, - "id": 2, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 5, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], avg(scylla_reactor_utilization{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"} ) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 4 - } - ], - "title": "Load", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Amount of requests served as the coordinator. Imbalances here represent dispersion at the connection level, not your data model.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 5, - "x": 4, - "y": 3 - }, - "id": 3, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 5, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_transport_requests_served{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "Requests Served per [[by]] - Coordinator", - "type": "timeseries" - }, - { - "class": "rps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Counts the total number of successful user reads on this shard.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:reads/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 5, - "x": 9, - "y": 3 - }, - "id": 4, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 5, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_database_total_reads{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Reads per [[by]] - Replica", - "type": "timeseries" - }, - { - "class": "wps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Counts the total number of successful write operations performed by this shard.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 5, - "x": 14, - "y": 3 - }, - "id": 5, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 5, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_database_total_writes{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "Writes per [[by]] - Replica", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 5, - "x": 19, - "y": 3 - }, - "id": 6, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 5, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], sum(scylla_tablets_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by([[by]]))", - "format": "time_series", - "instant": false, - "legendFormat": "{{dc}} {{instance}} {{shard}}", - "range": false, - "refId": "A" - } - ], - "title": "Tablets over time per [[by]]", - "type": "timeseries" - }, - { - "class": "collapsible_row_panel", - "collapsed": true, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 9 - }, - "id": 7, - "panels": [ - { - "class": "heatmap_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": { - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "scaleDistribution": { - "type": "linear" - } - } - }, - "overrides": [] - }, - "gridPos": { - "h": 13, - "w": 24, - "x": 0, - "y": 10 - }, - "id": 8, - "isNew": true, - "links": [], - "options": { - "barRadius": 0, - "barWidth": 0.89, - "calculate": false, - "cellGap": 1, - "color": { - "exponent": 0.5, - "fill": "dark-orange", - "min": 0, - "mode": "scheme", - "reverse": false, - "scale": "exponential", - "scheme": "Oranges", - "steps": 64 - }, - "exemplars": { - "color": "rgba(255,0,255,0.7)" - }, - "filterValues": { - "le": 1e-9 - }, - "fullHighlight": false, - "groupWidth": 0.7, - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "show": true, - "showLegend": false - }, - "orientation": "auto", - "rowsFrame": { - "layout": "auto" - }, - "showValue": "always", - "stacking": "none", - "tooltip": { - "mode": "single", - "showColorScale": false, - "sort": "none", - "yHistogram": false - }, - "xTickLabelRotation": 0, - "xTickLabelSpacing": 0, - "yAxis": { - "axisPlacement": "left", - "reverse": false - } - }, - "span": 5, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], sum(scylla_tablets_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by([[by]])) or on() vector(0)", - "format": "time_series", - "instant": false, - "legendFormat": "{{dc}} {{instance}} {{shard}}", - "range": false, - "refId": "A" - } - ], - "title": "Tablets over time per [[by]]", - "type": "heatmap" - }, - { - "class": "barchart_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "fillOpacity": 80, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineWidth": 1, - "scaleDistribution": { - "type": "linear" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 24, - "x": 0, - "y": 23 - }, - "id": 9, - "isNew": true, - "links": [], - "options": { - "barRadius": 0, - "barWidth": 0.89, - "fullHighlight": false, - "groupWidth": 0.7, - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "orientation": "auto", - "showValue": "always", - "stacking": "none", - "tooltip": { - "mode": "single", - "sort": "none" - }, - "xTickLabelRotation": 0, - "xTickLabelSpacing": 0 - }, - "span": 12, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], sum(scylla_tablets_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by([[by]]))", - "format": "table", - "instant": true, - "legendFormat": "__auto", - "range": false, - "refId": "A" - } - ], - "title": "Tablets per [[by]]", - "type": "barchart" - } - ], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Tablets information", - "type": "row" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 10 - }, - "id": 10, - "panels": [], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "reads and writes", - "type": "row" - }, - { - "class": "plain_text", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 11 - }, - "id": 11, - "links": [], - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

Reads and Writes - Coordinator

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "writes_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Foreground writes are writes that weren't acknowledged yet to the application. For instance, if a single replica responded and two are needed due to the consistency level. This metric represents a queue size, not a rate. High values here correlate with increased write latencies.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 13 - }, - "id": 12, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(scylla_storage_proxy_coordinator_foreground_writes{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Foreground Writes per [[by]]", - "type": "timeseries" - }, - { - "class": "writes_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Background writes are writes that are already acknowledged to the application but have additional work to be done. For instance, if a replica responded and only one is needed, this request is still listed as a background request until all replicas respond. This metric represents a queue size, not a rate. High values here correlate with increased write latencies.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 13 - }, - "id": 13, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(scylla_storage_proxy_coordinator_background_writes{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Background Writes per [[by]]", - "type": "timeseries" - }, - { - "class": "reads_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Foreground reads are reads that weren't acknowledged yet to the application. For instance, if a single replica responded and two are needed due to the consistency level. This metric represents a queue size, not a rate. High values here correlate with increased read latencies.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:reads" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 13 - }, - "id": 14, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(scylla_storage_proxy_coordinator_foreground_reads{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "Foreground Reads per [[by]]", - "type": "timeseries" - }, - { - "class": "reads_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Background reads are reads that are already acknowledged to the application but have additional work to be done. For instance, if a replica responded and only one is needed, this request is still listed as a background request until all replicas respond. This metric represents a queue size, not a rate. High values here correlate with increased read latencies.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:reads" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 13 - }, - "id": 15, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(scylla_storage_proxy_coordinator_background_reads{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 4 - } - ], - "title": "Background Reads per [[by]]", - "type": "timeseries" - }, - { - "class": "wps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of successfully written hints.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 19 - }, - "id": 16, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_hints_manager_written{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Hints Written per [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of sent hints.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 19 - }, - "id": 17, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_hints_manager_sent{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 4 - } - ], - "title": "Hints sent per [[by]]", - "type": "timeseries" - }, - { - "class": "rps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of times a digest read was done on behalf of a speculative retry.\n\nSpeculative retry is a mechanism that causes the client or server to speculate that a request may fail, and send a new request.\n\nspeculative retry may reduce latency in exchange for system load, but only if there is little activity.\n\nA lot of speculative retries increases load and can harm latency more than helping.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:reads/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 19 - }, - "id": 18, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_storage_proxy_coordinator_speculative_digest_reads{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 4 - } - ], - "title": "Speculative Digest Reads By [[by]]", - "type": "timeseries" - }, - { - "class": "rps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of times a read was done on behalf of a speculative retry.\n\nSpeculative retry is a mechanism that causes the client or server to speculate that a request may fail, and send a new request.\n\nspeculative retry may reduce latency in exchange for system load, but only if there is little activity.\n\nA lot of speculative retries increases load and can harm latency more than helping.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:reads/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 19 - }, - "id": 19, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_storage_proxy_coordinator_speculative_data_reads{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 4 - } - ], - "title": "Speculative Data Reads By [[by]]", - "type": "timeseries" - }, - { - "class": "requestsps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Holds an incrementing counter with the requests that were shed due to overload (threshold configured via max_concurrent_requests_per_shard). The first derivative of this value shows how often we shed requests due to overload in the \"CQL transport\" component.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:requests/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 25 - }, - "id": 20, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_transport_requests_shed{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Requests Shed", - "type": "timeseries" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 31 - }, - "id": 21, - "panels": [], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Latencies", - "type": "row" - }, - { - "class": "wps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "writes rate", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 32 - }, - "id": 22, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_storage_proxy_coordinator_write_latency_summary_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"}[$__rate_interval])) by ([[by]],scheduling_group_name))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Writes by [[by]]", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The average write latency", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 32 - }, - "id": 23, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "($topbottom([[filter_limit]], wlatencya{by=\"[[by]]\", instance=~\"[[node]]|$^\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"}))/scalar($func(count(scylla_reactor_utilization) by (instance,shard)) ==bool count(scylla_reactor_utilization))", - "intervalFactor": 1, - "legendFormat": "{{scheduling_group_name}} {{cluster}} {{dc}} {{instance}} {{shard}}", - "refId": "A", - "step": 1 - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(wlatencya{by=\"instance,shard\", instance=~\"[[node]]|$^\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"})by ([[by]], scheduling_group_name)/(scalar(count(count(scylla_reactor_utilization) by ([[by]])) != bool count(scylla_reactor_utilization))* scalar($func(count(scylla_reactor_utilization) by (instance,shard)) !=bool count(scylla_reactor_utilization)))", - "intervalFactor": 1, - "legendFormat": "{{func}} {{scheduling_group_name}} {{cluster}} {{dc}} {{instance}}", - "refId": "B", - "step": 1 - } - ], - "title": "Average write latency by [[by]]", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The 95th percentile write latency", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 32 - }, - "id": 24, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "($topbottom([[filter_limit]], wlatencyp95{by=\"[[by]]\", instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg|$\"}))/scalar($func(count(scylla_reactor_utilization) by (instance,shard)) ==bool count(scylla_reactor_utilization))", - "intervalFactor": 1, - "legendFormat": "{{scheduling_group_name}} {{cluster}} {{dc}} {{instance}} {{shard}}", - "metric": "", - "refId": "A", - "step": 1 - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(wlatencyp95{by=\"instance,shard\", instance=~\"[[node]]|$^\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"})by ([[by]], scheduling_group_name)/(scalar(count(count(scylla_reactor_utilization) by ([[by]])) != bool count(scylla_reactor_utilization))* scalar($func(count(scylla_reactor_utilization) by (instance,shard)) !=bool count(scylla_reactor_utilization)))", - "intervalFactor": 1, - "legendFormat": "{{func}} {{scheduling_group_name}} {{cluster}} {{dc}} {{instance}}", - "refId": "B", - "step": 1 - } - ], - "title": "95th percentile write latency by [[by]]", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "99th percentile write latency", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 32 - }, - "id": 25, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "($topbottom([[filter_limit]], wlatencyp99{by=\"[[by]]\", instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"}))/scalar($func(count(scylla_reactor_utilization) by (instance,shard)) ==bool count(scylla_reactor_utilization))", - "intervalFactor": 1, - "legendFormat": "{{scheduling_group_name}} {{cluster}} {{dc}} {{instance}} {{shard}}", - "metric": "", - "refId": "A", - "step": 1 - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(wlatencyp99{by=\"instance,shard\", instance=~\"[[node]]|$^\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"})by ([[by]], scheduling_group_name)/(scalar(count(count(scylla_reactor_utilization) by ([[by]])) != bool count(scylla_reactor_utilization))* scalar($func(count(scylla_reactor_utilization) by (instance,shard)) !=bool count(scylla_reactor_utilization)))", - "intervalFactor": 1, - "legendFormat": "{{func}} {{scheduling_group_name}} {{cluster}} {{dc}} {{instance}}", - "refId": "B", - "step": 1 - } - ], - "title": "99th percentile write latency by [[by]]", - "type": "timeseries" - }, - { - "class": "rps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Reads rate", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:reads/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 38 - }, - "id": 26, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_storage_proxy_coordinator_read_latency_summary_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"}[$__rate_interval])) by ([[by]],scheduling_group_name) or on ([[by]],scheduling_group_name) $func(rate(scylla_storage_proxy_coordinator_read_latency_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\",scheduling_group_name=~\"$sg\"}[$__rate_interval])) by ([[by]],scheduling_group_name))", - "intervalFactor": 1, - "legendFormat": "{{scheduling_group_name}} {{cluster}} {{dc}} {{instance}} {{shard}}", - "refId": "A", - "step": 1 - } - ], - "title": "Reads by [[by]]", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Average read latency", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 38 - }, - "id": 27, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "($topbottom([[filter_limit]], rlatencya{by=\"[[by]]\", instance=~\"[[node]]|$^\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"}))/scalar($func(count(scylla_reactor_utilization) by (instance,shard)) ==bool count(scylla_reactor_utilization))", - "intervalFactor": 1, - "legendFormat": "{{scheduling_group_name}} {{cluster}} {{dc}} {{instance}} {{shard}}", - "refId": "A", - "step": 1 - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rlatencya{by=\"instance,shard\", instance=~\"[[node]]|$^\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"})by ([[by]], scheduling_group_name)/(scalar(count(count(scylla_reactor_utilization) by ([[by]])) != bool count(scylla_reactor_utilization))* scalar($func(count(scylla_reactor_utilization) by (instance,shard)) !=bool count(scylla_reactor_utilization)))", - "intervalFactor": 1, - "legendFormat": "{{func}} {{scheduling_group_name}} {{cluster}} {{dc}} {{instance}}", - "refId": "B", - "step": 1 - } - ], - "title": "Average read latency by [[by]]", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "95th percentile read latency", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 38 - }, - "id": 28, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "($topbottom([[filter_limit]], rlatencyp95{by=\"[[by]]\", instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"}))/scalar($func(count(scylla_reactor_utilization) by (instance,shard)) ==bool count(scylla_reactor_utilization))", - "intervalFactor": 1, - "legendFormat": "{{scheduling_group_name}} {{cluster}} {{dc}} {{instance}} {{shard}}", - "metric": "", - "refId": "A", - "step": 1 - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rlatencyp95{by=\"instance,shard\", instance=~\"[[node]]|$^\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"})by ([[by]], scheduling_group_name)/(scalar(count(count(scylla_reactor_utilization) by ([[by]])) != bool count(scylla_reactor_utilization))* scalar($func(count(scylla_reactor_utilization) by (instance,shard)) !=bool count(scylla_reactor_utilization)))", - "intervalFactor": 1, - "legendFormat": "{{func}} {{scheduling_group_name}} {{cluster}} {{dc}} {{instance}}", - "refId": "B", - "step": 1 - } - ], - "title": "95th percentile read latency by [[by]]", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "99th percentile read latency", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 38 - }, - "id": 29, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "($topbottom([[filter_limit]], rlatencyp99{by=\"[[by]]\", instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"}))/scalar($func(count(scylla_reactor_utilization) by (instance,shard)) ==bool count(scylla_reactor_utilization))", - "intervalFactor": 1, - "legendFormat": "{{scheduling_group_name}} {{cluster}} {{dc}} {{instance}} {{shard}}", - "metric": "", - "refId": "A", - "step": 1 - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rlatencyp99{by=\"instance,shard\", instance=~\"[[node]]|$^\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"})by ([[by]], scheduling_group_name)/(scalar(count(count(scylla_reactor_utilization) by ([[by]])) != bool count(scylla_reactor_utilization))* scalar($func(count(scylla_reactor_utilization) by (instance,shard)) !=bool count(scylla_reactor_utilization)))", - "intervalFactor": 1, - "legendFormat": "{{func}} {{scheduling_group_name}} {{cluster}} {{dc}} {{instance}}", - "refId": "B", - "step": 1 - } - ], - "title": "99th percentile read latency by [[by]]", - "type": "timeseries" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 44 - }, - "id": 30, - "panels": [], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Timeouts and Errors", - "type": "row" - }, - { - "class": "plain_text", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 45 - }, - "id": 31, - "links": [], - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

Timeouts and Errors - Coordinator

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "wps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Requests that Scylla tried to write but timed out. Timeouts are counted in the node that received the request (the coordinator), not at the replicas.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 47 - }, - "id": 32, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_storage_proxy_coordinator_write_timeouts{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\",scheduling_group_name=~\"$sg\"}[$__rate_interval])) by ([[by]],scheduling_group_name))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Write Timeouts/Seconds per [[by]]", - "type": "timeseries" - }, - { - "class": "wps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Requests that Scylla did not even try to write because replicas that were needed to execute this write were unavailable. Unavailable writes are counted in the node that received the request (the coordinator), not at the replicas.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 47 - }, - "id": 33, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_storage_proxy_coordinator_write_unavailable{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\",scheduling_group_name=~\"$sg\"}[$__rate_interval])) by ([[by]],scheduling_group_name))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Write Unavailable/Seconds per [[by]]", - "type": "timeseries" - }, - { - "class": "rps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Requests that Scylla tried to read but timed out. Timeouts are counted in the node that received the request (the coordinator), not at the replicas.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:reads/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 47 - }, - "id": 34, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_storage_proxy_coordinator_read_timeouts{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\",scheduling_group_name=~\"$sg\"}[$__rate_interval])) by ([[by]],scheduling_group_name))", - "intervalFactor": 1, - "legendFormat": "Read {{dc}} {{instance}} {{shard}}", - "refId": "A", - "step": 1 - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_storage_proxy_coordinator_cas_read_timeouts{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\",scheduling_group_name=~\"$sg\"}[$__rate_interval])) by ([[by]],scheduling_group_name))", - "intervalFactor": 1, - "legendFormat": "CAS {{dc}} {{instance}} {{shard}}", - "refId": "B", - "step": 1 - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_storage_proxy_coordinator_range_timeouts{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\",scheduling_group_name=~\"$sg\"}[$__rate_interval])) by ([[by]],scheduling_group_name))", - "intervalFactor": 1, - "legendFormat": "Range {{dc}} {{instance}} {{shard}}", - "refId": "C", - "step": 1 - } - ], - "title": "Read Timeouts/Seconds per [[by]]", - "type": "timeseries" - }, - { - "class": "rps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Requests that Scylla did not even try to read because replicas that were needed to execute this write were unavailable. Unavailable reads are counted in the node that received the request (the coordinator), not at the replicas.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:reads/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 47 - }, - "id": 35, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_storage_proxy_coordinator_read_unavailable{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\",scheduling_group_name=~\"$sg\"}[$__rate_interval])) by ([[by]],scheduling_group_name))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 4 - } - ], - "title": "Read Unavailable/Seconds per [[by]]", - "type": "timeseries" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 53 - }, - "id": 36, - "panels": [], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Replica", - "type": "row" - }, - { - "class": "plain_text", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 54 - }, - "id": 37, - "links": [], - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

Replica

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "reads_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The number of currently active read operations", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:reads" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 56 - }, - "id": 38, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(scylla_database_active_reads{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]\", class=~\"$sg\"}>0) by ([[by]], class))", - "intervalFactor": 1, - "legendFormat": "{{class}} {{dc}} {{instance}} {{shard}}", - "refId": "A", - "step": 1 - } - ], - "title": "Active reads", - "type": "timeseries" - }, - { - "class": "reads_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "number of currently queued read operations", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:reads" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 56 - }, - "id": 39, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(scylla_database_queued_reads{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Queued reads", - "type": "timeseries" - }, - { - "class": "writes_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The current number of requests blocked due to reaching the memory quota. Non-zero value indicates that our bottleneck is memory", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 56 - }, - "id": 40, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(scylla_database_requests_blocked_memory_current{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Writes currently blocked on dirty", - "type": "timeseries" - }, - { - "class": "writes_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "number of currently pending allocations. A non-zero value indicates that we have a bottleneck in the disk write flow.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 56 - }, - "id": 41, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(scylla_commitlog_pending_allocations{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Writes currently blocked on commitlog", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Reciprocal Miss Rate is a score in the range of 1 to 100 that is used to decide the fraction of read requests to send to each replica - a replica with twice the RMR value of another replica will serve twice the number of read requests.\n\nRMR is calculated on a table level, this is an aggregate estimation of that score.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 62 - }, - "id": 42, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], clamp_max(1 + sum((rate(scylla_cache_reads{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval]) - rate(scylla_cache_reads_with_misses{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval]))) by ([[by]])/(sum(rate(scylla_cache_reads_with_misses{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]) + 0.00001),100))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Reciprocal Miss Rate (HWLB)", - "type": "timeseries" - }, - { - "class": "rps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Counts the total number of failed user read operations. Add the total_reads to this value to get the total amount of reads issued on this shard.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:reads/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 62 - }, - "id": 43, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_database_total_reads_failed{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Reads failed", - "type": "timeseries" - }, - { - "class": "wps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Holds the current number of requests blocked due to reaching the memory quota (15566635008B). Non-zero value indicates that our bottleneck is memory and more specifically - the memory quota allocated for the \"database\" component.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 62 - }, - "id": 44, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_database_requests_blocked_memory{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Writes blocked on dirty", - "type": "timeseries" - }, - { - "class": "wps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Counts number of requests blocked due to memory pressure. A non-zero value indicates that the commitlog memory quota is not enough to serve the required amount of requests.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 62 - }, - "id": 45, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_commitlog_requests_blocked_memory{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Writes blocked on commitlog", - "type": "timeseries" - }, - { - "class": "text_panel", - "dashversion": [ - "<2024.1", - ">5.0" - ], - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 68 - }, - "id": 46, - "links": [], - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "", - "mode": "markdown" - }, - "pluginVersion": "10.1.1", - "span": 6, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "wps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Counts the total number of failed write operations. A sum of this value plus total_writes represents a total amount of writes attempted on this shard.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 68 - }, - "id": 47, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_database_total_writes_failed{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Writes failed", - "type": "timeseries" - }, - { - "class": "wps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Counts write operations failed due to a timeout. A positive value is a sign of storage being overloaded.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 68 - }, - "id": 48, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_database_total_writes_timedout{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Writes timed out", - "type": "timeseries" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 74 - }, - "id": 49, - "panels": [], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Storage", - "type": "row" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of sstables currently open for reading \n\nscylla_sstables_currently_open_for_reading", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 75 - }, - "id": 50, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(scylla_sstables_currently_open_for_reading{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Open sstables for reading", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of sstables read\n\nscylla_database_sstables_read", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 75 - }, - "id": 51, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(scylla_database_sstables_read{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]\"}>0) by ([[by]], class))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "SStable reads", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of sstables disk reads\n\nscylla_database_disk_reads", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 75 - }, - "id": 52, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(scylla_database_disk_reads{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]\"}>0) by ([[by]], class))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "SStables disk reads", - "type": "timeseries" - }, - { - "class": "collapsible_row_panel", - "collapsed": true, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 81 - }, - "id": 53, - "panels": [ - { - "class": "bytes_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "S3 Writes, bytes rate \n\nscylla_s3_total_write_bytes", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "class": "fieldConfig_defaults", - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "class": "fieldConfig_defaults_custom", - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 101 - }, - "id": 54, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_s3_total_write_bytes{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "S3 Writes Bytes/s by [[by]]", - "type": "timeseries" - }, - { - "class": "seconds_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "S3 Writes latency\n\nscylla_s3_total_write_latency_sec", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "class": "fieldConfig_defaults", - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "class": "fieldConfig_defaults_custom", - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "unit": "s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 101 - }, - "id": 55, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_s3_total_write_latency_sec{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]])/$func(rate(scylla_s3_total_write_requests{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "S3 Writes latency", - "type": "timeseries" - }, - { - "class": "bytes_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "S3 reads, bytes rate \n\nscylla_s3_total_read_bytes", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "class": "fieldConfig_defaults", - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "class": "fieldConfig_defaults_custom", - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 101 - }, - "id": 56, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_s3_total_read_bytes{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "S3 reads Bytes/s by [[by]]", - "type": "timeseries" - }, - { - "class": "seconds_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "S3 reads latency\n\nscylla_s3_total_read_latency_sec", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "class": "fieldConfig_defaults", - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "class": "fieldConfig_defaults_custom", - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "unit": "s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 101 - }, - "id": 57, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_s3_total_read_latency_sec{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]])/$func(rate(scylla_s3_total_read_requests{instance=~\"[[node]]\",cluster=~\"$cluster|$^\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "S3 reads latency", - "type": "timeseries" - } - ], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "S3 Information", - "type": "row" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 82 - }, - "id": 58, - "panels": [], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Cache", - "type": "row" - }, - { - "class": "text_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 83 - }, - "id": 59, - "links": [], - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

Cache - Replica

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "rps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "number of reads that were served from the cache", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:reads/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 85 - }, - "id": 60, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 6, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_cache_reads{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval]) - rate(scylla_cache_reads_with_misses{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Reads with no misses", - "type": "timeseries" - }, - { - "class": "rps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "number of reads which had to read from sstables", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:reads/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 12, - "x": 12, - "y": 85 - }, - "id": 61, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 6, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_cache_reads_with_misses{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Reads with misses", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "total number of rows needed by reads and found in cache", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 91 - }, - "id": 62, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_cache_row_hits{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Row Hits", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "total number of rows needed by reads and missing in cache", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 91 - }, - "id": 63, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_cache_row_misses{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Row Misses", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "number of partitions needed by reads and found in cache", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 91 - }, - "id": 64, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_cache_partition_hits{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Partition Hits", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "number of partitions needed by reads and missing in cache", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 91 - }, - "id": 65, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_cache_partition_misses{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Partition Misses", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "total number of rows added to cache", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 97 - }, - "id": 66, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_cache_row_insertions{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Row Insertions", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "total number of rows evicted from cache", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 97 - }, - "id": 67, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_cache_row_evictions{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Row Evictions", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "total number of partitions added to cache", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 97 - }, - "id": 68, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_cache_partition_insertions{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Partition Insertions", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "total number of evicted partitions", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 97 - }, - "id": 69, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_cache_partition_evictions{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Partition Evictions", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "total number of rows in memtables which were merged with existing rows during cache update on memtable flush", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 103 - }, - "id": 70, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_cache_rows_merged_from_memtable{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Row Merges", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "total number of invalidated rows", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 103 - }, - "id": 71, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_cache_row_removals{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Row Removals", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "total number of partitions merged", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 103 - }, - "id": 72, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_cache_partition_merges{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Partition Merges", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "total number of invalidated partitions", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 103 - }, - "id": 73, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_cache_partition_removals{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Partition Removals", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "total number of cached rows", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 109 - }, - "id": 74, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(scylla_cache_rows{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Rows", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "total number of cached partitions", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 109 - }, - "id": 75, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(scylla_cache_partitions{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Partitions", - "type": "timeseries" - }, - { - "class": "bytes_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "current bytes used by the cache out of the total size of memory", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 109 - }, - "id": 76, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(scylla_cache_bytes_used{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Used Bytes", - "type": "timeseries" - }, - { - "class": "bytes_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "total size of memory for the cache", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 109 - }, - "id": 77, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(scylla_cache_bytes_total{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Total Bytes", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Counts the number of prepared statements cache entries evictions.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 115 - }, - "id": 78, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_cql_prepared_cache_evictions{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Prepared Statements Cache Eviction", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Counts the number of authenticated prepared statements cache entries evictions.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 115 - }, - "id": 79, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_cql_authorized_prepared_statements_cache_evictions{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Authorized Prepared Statements Cache Eviction", - "type": "timeseries" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 121 - }, - "id": 80, - "panels": [], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Materialized Views", - "type": "row" - }, - { - "class": "text_panel", - "editable": true, - "error": false, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 122 - }, - "id": 81, - "links": [], - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

Materialized Views - Replica

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "transparent": true, - "type": "text" - }, - { - "class": "wps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Counts the number of view updates generated locally and applied on the same node", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 124 - }, - "id": 82, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_database_total_view_updates_pushed_local{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "Local view updates", - "type": "timeseries" - }, - { - "class": "wps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Counts the number of view updates generated and then sent to be applied on a remote replica", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 124 - }, - "id": 83, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_database_total_view_updates_pushed_remote{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "Remote view updates", - "type": "timeseries" - }, - { - "class": "bytes_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Size in bytes of the view update backlog at each base replica.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 124 - }, - "id": 84, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(scylla_database_view_update_backlog{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "View Update Backlog", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of dropped view updates due to an excessive view update backlog.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 124 - }, - "id": 85, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_database_dropped_view_updates{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "Dropped View Updates", - "type": "timeseries" - }, - { - "class": "wps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of hints sent for view.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 130 - }, - "id": 86, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_hints_for_views_manager_sent{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "Hints for view", - "type": "timeseries" - }, - { - "class": "writes_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Currently throttled base writes, as a consequence of the respective view update backlog.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 130 - }, - "id": 87, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(scylla_storage_proxy_coordinator_current_throttled_base_writes{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "Throttled Base Writes", - "type": "timeseries" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 136 - }, - "id": 88, - "panels": [], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Tombstones", - "type": "row" - }, - { - "class": "rps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Amount of range tombstones processed during read.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:reads/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 137 - }, - "id": 89, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_sstables_range_tombstone_reads{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "Range Tombstones reads", - "type": "timeseries" - }, - { - "class": "rps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Amount of range tombstones processed during read.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:reads/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 137 - }, - "id": 90, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_cache_range_tombstone_reads{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "Cache Range Tombstones Read", - "type": "timeseries" - }, - { - "class": "rps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Amount of row tombstones read", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:reads/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 137 - }, - "id": 91, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_sstables_row_tombstone_reads{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "Row Tombstones reads", - "type": "timeseries" - }, - { - "class": "rps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Amount of cache row tombstones read", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:reads/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 137 - }, - "id": 92, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_cache_row_tombstone_reads{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "Cache Row Tombstones reads", - "type": "timeseries" - }, - { - "class": "wps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Amount of tombstones writes.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 143 - }, - "id": 93, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_sstables_tombstone_writes{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "Tombstones Writes", - "type": "timeseries" - }, - { - "class": "wps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Amount of range tombstones writes.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 143 - }, - "id": 94, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_sstables_range_tombstone_writes{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "Range Tombstones Writes", - "type": "timeseries" - }, - { - "class": "wps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Amount of Cell Tombstones Writes.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 143 - }, - "id": 95, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_sstables_cell_tombstone_writes{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "Cell Tombstones Writes", - "type": "timeseries" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 149 - }, - "id": 96, - "panels": [], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "LWT", - "type": "row" - }, - { - "class": "text_panel", - "editable": true, - "error": false, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 150 - }, - "id": 97, - "links": [], - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

LWT - Coordinator

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "transparent": true, - "type": "text" - }, - { - "class": "rps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "LWT read rate.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:reads/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 152 - }, - "id": 98, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_storage_proxy_coordinator_cas_read_latency_summary_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]) or on([[by]]) $func(rate(scylla_storage_proxy_coordinator_cas_read_latency_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "LWT Reads", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "LWT Average Read latency.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 152 - }, - "id": 99, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], sum(casrlatencya{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", by=\"[[by]]\"}) or on([[by]]) $func(rate(scylla_storage_proxy_coordinator_cas_read_latency_sum{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]])/($func(rate(scylla_storage_proxy_coordinator_cas_read_latency_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]]) + 1))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "LWT Average Read latency", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "LWT 95% Read latency.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 152 - }, - "id": 100, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], casrlatencyp95{by=\"[[by]]\", instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"})", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "95% latency", - "type": "timeseries" - }, - { - "class": "rps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "LWT Read Timeouts", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:reads/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 152 - }, - "id": 101, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_storage_proxy_coordinator_cas_read_timeouts{instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"statement|$\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "LWT Read Timeouts", - "type": "timeseries" - }, - { - "class": "wps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "LWT write rate.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 158 - }, - "id": 102, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_storage_proxy_coordinator_cas_write_latency_summary_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]) or on ([[by]]) ($func(rate(scylla_storage_proxy_coordinator_cas_write_latency_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]])))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "LWT Writes", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "LWT Average Write latency.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 158 - }, - "id": 103, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], sum(caswlatencya{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", by=\"[[by]]\"}) or on([[by]]) ($func(rate(scylla_storage_proxy_coordinator_cas_write_latency_sum{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]])/($func(rate(scylla_storage_proxy_coordinator_cas_write_latency_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]) + 1)))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "LWT Average Write latency", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "LWT 95% write latency.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 158 - }, - "id": 104, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], caswlatencyp95{by=\"[[by]]\", instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"})", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "95% latency", - "type": "timeseries" - }, - { - "class": "wps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "LWT Write Timeouts", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 158 - }, - "id": 105, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_storage_proxy_coordinator_cas_write_timeouts{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "LWT Write Timeouts", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "A single Read/Write LWT will result in multiple paxos operations", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 164 - }, - "id": 106, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_storage_proxy_coordinator_cas_total_operations{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "Paxos operations", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "How many paxos operations that did not yet produce a result are running", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 164 - }, - "id": 107, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(scylla_storage_proxy_coordinator_cas_foreground{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "Paxos Foreground operations", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "How many paxos operations are still running after a result was already returned", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 164 - }, - "id": 108, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(scylla_storage_proxy_coordinator_cas_background{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "Paxos Background operations", - "type": "timeseries" - }, - { - "class": "text_panel", - "editable": true, - "error": false, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 164 - }, - "id": 109, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "# ", - "mode": "markdown" - }, - "pluginVersion": "10.1.1", - "span": 3, - "transparent": true, - "type": "text" - }, - { - "class": "wps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "An LWT INSERT, UPDATE or DELETE command that involves a condition will be rejected if the condition is not met.\n\nWhile it is ok, a high value may indicate that there is a potential problem with data distribution", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 170 - }, - "id": 110, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_storage_proxy_coordinator_cas_write_condition_not_met{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "LWT Condition-Not-Met", - "type": "timeseries" - }, - { - "class": "wps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of times some INSERT, UPDATE or DELETE request with conditions had to retry because there was a concurrent conditional statement against the same key. Each retry is performed after a randomized sleep interval, so it can lead to statement timing out completely.\n\nIt can indicates contention over a hot row or key", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 170 - }, - "id": 111, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_storage_proxy_coordinator_cas_write_contention_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "LWT Write Contention", - "type": "timeseries" - }, - { - "class": "rps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of times some SELECT with SERIAL consistency had to retry because there was a concurrent conditional statement against the same key. Each retry is performed after a randomized sleep interval, so it can lead to statement timing out completely.\n\nIt can indicates contention over a hot row or key", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:reads/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 170 - }, - "id": 112, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_storage_proxy_coordinator_cas_read_contention_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]]) - $func(rate(scylla_storage_proxy_coordinator_cas_read_contention_bucket{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\", le=\"1.000000\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "LWT Read Contention", - "type": "timeseries" - }, - { - "class": "wps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of partially succeeded conditional statements. These statements were not committed by the coordinator, due to some replicas responding with errors or timing out. The coordinator had to propagate the error to the client. However, the statement succeeded on a minority of replicas, so may later be propagated to the rest during repair.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 170 - }, - "id": 113, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_storage_proxy_coordinator_cas_write_timeout_due_to_uncertainty{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "LWT Write Timeout Due to Uncertainty", - "type": "timeseries" - }, - { - "class": "wps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of times a INSERT, UPDATE, or DELETE with conditions failed after being unable to contact enough replicas to match the consistency level", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 176 - }, - "id": 114, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_storage_proxy_coordinator_cas_write_unavailable{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "LWT Write Unavailable", - "type": "timeseries" - }, - { - "class": "rps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of times a SELECT with SERIAL consistency failed after being unable to contact enough replicas to match the consistency level", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:reads/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 176 - }, - "id": 115, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_storage_proxy_coordinator_cas_read_unavailable{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "LWT Read Unavailable", - "type": "timeseries" - }, - { - "class": "wps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of Paxos-repairs of INSERT, UPDATE, or DELETE with conditions.\n\nA repair is necessary when a previous Paxos statement was partially successful. A subsequent statement then may not proceed before completing the work of its predecessor. A repair is not guaranteed to succeed, the metric indicates the number of repair attempts made", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 176 - }, - "id": 116, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_storage_proxy_coordinator_cas_write_unfinished_commit{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "LWT Write Unfinished - Repair Attempts", - "type": "timeseries" - }, - { - "class": "rps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of Paxos-repairs of SELECT statement with SERIAL consistency.\n\nA repair is necessary when a previous Paxos statement was partially successful. A subsequent statement then may not proceed before completing the work of its predecessor. A repair is not guaranteed to succeed, the metric indicates the number of repair attempts made", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:reads/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 176 - }, - "id": 117, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_storage_proxy_coordinator_cas_read_unfinished_commit{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "LWT Read Unfinished - Repair Attempts", - "type": "timeseries" - }, - { - "class": "rps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Normally, a PREPARE Paxos-round piggy-backs the previous value along with the PREPARE response. When the coordinator is unable to obtain the previous value (or its digest) from some of the participants, or when the digests did not match, a separate repair round has to be performed.\n\nThis indicates that some Paxos queries did not run successfully to completion, e.g. because some node is overloaded, down, or there was contention around a key.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:reads/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 182 - }, - "id": 118, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_storage_proxy_coordinator_cas_failed_read_round_optimization{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "Failed Read-Round Optimization", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of pruning requests.\n\nA successful conditional statement deletes the intermediate state from system.paxos table using PRUNE command.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 182 - }, - "id": 119, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_storage_proxy_coordinator_cas_prune{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "LWT Prune", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Number of Dropped pruning requests.\n\nA successful conditional statement deletes the intermediate state from system.paxos table using PRUNE command. If the system is busy it may not keep up with the PRUNE requests, so such requests are dropped.\n\nHigh value suggests the system is overloaded and also that system.paxos table is taking up space. If a prune is dropped, system.paxos table key and value for respective LWT transaction will stay around until next transaction against the same key or until the gc_grace_period, when it's removed by compaction.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 182 - }, - "id": 120, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_storage_proxy_coordinator_cas_dropped_prune{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "LWT Dropped Prune", - "type": "timeseries" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 188 - }, - "id": 121, - "panels": [], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "CDC", - "type": "row" - }, - { - "class": "text_panel", - "editable": true, - "error": false, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 189 - }, - "id": 122, - "links": [], - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

CDC - Replica

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "transparent": true, - "type": "text" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The rate of CDC operations.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 0, - "y": 191 - }, - "id": 123, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_cdc_operations_total{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "CDC Operations", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The rate of failed CDC operations.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 8, - "y": 191 - }, - "id": 124, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_cdc_operations_failed{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]])/($func(rate(scylla_storage_proxy_coordinator_cas_read_latency_summary_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]) or on ([[by]]) $func(rate(scylla_storage_proxy_coordinator_cas_read_latency_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]) + 1))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 10 - } - ], - "title": "Failed CDC operations", - "type": "timeseries" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 197 - }, - "id": 125, - "panels": [], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Memory", - "type": "row" - }, - { - "class": "text_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 198 - }, - "id": 126, - "links": [], - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

Memory - Replica

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "bytes_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Holds a current size of allocated memory in bytes.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 0, - "y": 200 - }, - "id": 127, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(scylla_lsa_total_space_bytes{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "LSA total memory", - "type": "timeseries" - }, - { - "class": "bytes_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Holds a current amount of used non-LSA memory.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 8, - "y": 200 - }, - "id": 128, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(scylla_lsa_non_lsa_used_space_bytes{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Non-LSA used memory", - "type": "timeseries" - }, - { - "class": "percentunit_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Bloom filter should take a small percentage of the total memory.\n\nscylla_sstables_bloom_filter_memory_size", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMax": 1, - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percentunit" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 16, - "y": 200 - }, - "id": 129, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(scylla_sstables_bloom_filter_memory_size{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by ([[by]])/$func(scylla_memory_total_memory{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Bloom Filter memory usage (percentage)", - "type": "timeseries" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 206 - }, - "id": 130, - "panels": [], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Compaction", - "type": "row" - }, - { - "class": "text_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 207 - }, - "id": 131, - "links": [], - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

Compaction - Replica

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "graph_panel_int", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Holds the number of currently active compactions.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 0, - "y": 209 - }, - "id": 132, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(scylla_compaction_manager_compactions{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "Running Compactions", - "type": "timeseries" - }, - { - "class": "percent_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Percentage of CPU time used by compaction", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 8, - "y": 209 - }, - "id": 133, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], ($func(rate(scylla_scheduler_runtime_ms{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\", group=\"compaction\"}[$__rate_interval])) by ([[by]]))/10)", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "Compactions CPU Runtime", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Shares assigned to the compaction", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 16, - "y": 209 - }, - "id": 134, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 4, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], avg(scylla_scheduler_shares{group=\"compaction\", instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by ([[by]]))", - "format": "time_series", - "intervalFactor": 1, - "refId": "A" - } - ], - "title": "Compactions Shares", - "type": "timeseries" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 215 - }, - "id": 135, - "panels": [], - "repeat": "sg", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Latencies - $sg", - "type": "row" - }, - { - "class": "wps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The general write latency histogram", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 216 - }, - "id": 136, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_storage_proxy_coordinator_write_latency_summary_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"}[$__rate_interval])) by ([[by]]) or on([[by]]) $func(rate(scylla_storage_proxy_coordinator_write_latency_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\",scheduling_group_name=~\"$sg\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Writes by [[by]]", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 216 - }, - "id": 137, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "($topbottom([[filter_limit]], wlatencya{by=\"[[by]]\", instance=~\"[[node]]|$^\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"}))/scalar($func(count(scylla_reactor_utilization) by (instance,shard)) ==bool count(scylla_reactor_utilization))", - "intervalFactor": 1, - "legendFormat": "{{scheduling_group_name}} {{cluster}} {{dc}} {{instance}} {{shard}}", - "refId": "A", - "step": 1 - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(wlatencya{by=\"instance,shard\", instance=~\"[[node]]|$^\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"})by ([[by]], scheduling_group_name)/(scalar(count(count(scylla_reactor_utilization) by ([[by]])) != bool count(scylla_reactor_utilization))* scalar($func(count(scylla_reactor_utilization) by (instance,shard)) !=bool count(scylla_reactor_utilization)))", - "intervalFactor": 1, - "legendFormat": "{{func}} {{scheduling_group_name}} {{cluster}} {{dc}} {{instance}}", - "refId": "B", - "step": 1 - } - ], - "title": "Average write latency by [[by]]", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 216 - }, - "id": 138, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "($topbottom([[filter_limit]], wlatencyp95{by=\"[[by]]\", instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg|$\"}))/scalar($func(count(scylla_reactor_utilization) by (instance,shard)) ==bool count(scylla_reactor_utilization))", - "intervalFactor": 1, - "legendFormat": "{{scheduling_group_name}} {{cluster}} {{dc}} {{instance}} {{shard}}", - "metric": "", - "refId": "A", - "step": 1 - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(wlatencyp95{by=\"instance,shard\", instance=~\"[[node]]|$^\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"})by ([[by]], scheduling_group_name)/(scalar(count(count(scylla_reactor_utilization) by ([[by]])) != bool count(scylla_reactor_utilization))* scalar($func(count(scylla_reactor_utilization) by (instance,shard)) !=bool count(scylla_reactor_utilization)))", - "intervalFactor": 1, - "legendFormat": "{{func}} {{scheduling_group_name}} {{cluster}} {{dc}} {{instance}}", - "refId": "B", - "step": 1 - } - ], - "title": "95th percentile write latency by [[by]]", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 216 - }, - "id": 139, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "($topbottom([[filter_limit]], wlatencyp99{by=\"[[by]]\", instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"}))/scalar($func(count(scylla_reactor_utilization) by (instance,shard)) ==bool count(scylla_reactor_utilization))", - "intervalFactor": 1, - "legendFormat": "{{scheduling_group_name}} {{cluster}} {{dc}} {{instance}} {{shard}}", - "metric": "", - "refId": "A", - "step": 1 - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(wlatencyp99{by=\"instance,shard\", instance=~\"[[node]]|$^\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"})by ([[by]], scheduling_group_name)/(scalar(count(count(scylla_reactor_utilization) by ([[by]])) != bool count(scylla_reactor_utilization))* scalar($func(count(scylla_reactor_utilization) by (instance,shard)) !=bool count(scylla_reactor_utilization)))", - "intervalFactor": 1, - "legendFormat": "{{func}} {{scheduling_group_name}} {{cluster}} {{dc}} {{instance}}", - "refId": "B", - "step": 1 - } - ], - "title": "99th percentile write latency by [[by]]", - "type": "timeseries" - }, - { - "class": "rps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The general read latency histogram", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:reads/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 222 - }, - "id": 140, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], $func(rate(scylla_storage_proxy_coordinator_read_latency_summary_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"}[$__rate_interval])) by ([[by]]) or on ([[by]]) $func(rate(scylla_storage_proxy_coordinator_read_latency_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\",scheduling_group_name=~\"$sg\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Reads by [[by]]", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 222 - }, - "id": 141, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "($topbottom([[filter_limit]], rlatencya{by=\"[[by]]\", instance=~\"[[node]]|$^\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"}))/scalar($func(count(scylla_reactor_utilization) by (instance,shard)) ==bool count(scylla_reactor_utilization))", - "intervalFactor": 1, - "legendFormat": "{{scheduling_group_name}} {{cluster}} {{dc}} {{instance}} {{shard}}", - "refId": "A", - "step": 1 - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rlatencya{by=\"instance,shard\", instance=~\"[[node]]|$^\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"})by ([[by]], scheduling_group_name)/(scalar(count(count(scylla_reactor_utilization) by ([[by]])) != bool count(scylla_reactor_utilization))* scalar($func(count(scylla_reactor_utilization) by (instance,shard)) !=bool count(scylla_reactor_utilization)))", - "intervalFactor": 1, - "legendFormat": "{{func}} {{scheduling_group_name}} {{cluster}} {{dc}} {{instance}}", - "refId": "B", - "step": 1 - } - ], - "title": "Average read latency by [[by]]", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 222 - }, - "id": 142, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "($topbottom([[filter_limit]], rlatencyp95{by=\"[[by]]\", instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"}))/scalar($func(count(scylla_reactor_utilization) by (instance,shard)) ==bool count(scylla_reactor_utilization))", - "intervalFactor": 1, - "legendFormat": "{{scheduling_group_name}} {{cluster}} {{dc}} {{instance}} {{shard}}", - "metric": "", - "refId": "A", - "step": 1 - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rlatencyp95{by=\"instance,shard\", instance=~\"[[node]]|$^\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"})by ([[by]], scheduling_group_name)/(scalar(count(count(scylla_reactor_utilization) by ([[by]])) != bool count(scylla_reactor_utilization))* scalar($func(count(scylla_reactor_utilization) by (instance,shard)) !=bool count(scylla_reactor_utilization)))", - "intervalFactor": 1, - "legendFormat": "{{func}} {{scheduling_group_name}} {{cluster}} {{dc}} {{instance}}", - "refId": "B", - "step": 1 - } - ], - "title": "95th percentile read latency by [[by]]", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 222 - }, - "id": 143, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "($topbottom([[filter_limit]], rlatencyp99{by=\"[[by]]\", instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"}))/scalar($func(count(scylla_reactor_utilization) by (instance,shard)) ==bool count(scylla_reactor_utilization))", - "intervalFactor": 1, - "legendFormat": "{{scheduling_group_name}} {{cluster}} {{dc}} {{instance}} {{shard}}", - "metric": "", - "refId": "A", - "step": 1 - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rlatencyp99{by=\"instance,shard\", instance=~\"[[node]]|$^\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"})by ([[by]], scheduling_group_name)/(scalar(count(count(scylla_reactor_utilization) by ([[by]])) != bool count(scylla_reactor_utilization))* scalar($func(count(scylla_reactor_utilization) by (instance,shard)) !=bool count(scylla_reactor_utilization)))", - "intervalFactor": 1, - "legendFormat": "{{func}} {{scheduling_group_name}} {{cluster}} {{dc}} {{instance}}", - "refId": "B", - "step": 1 - } - ], - "title": "99th percentile read latency by [[by]]", - "type": "timeseries" - }, - { - "class": "bps_panel", - "dashversion": [ - ">5.3", - ">2022.1" - ], - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Bytes received in CQL messages", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "Bps" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 228 - }, - "id": 144, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], sum(rate(scylla_transport_cql_request_bytes{kind=~\"$kind\",instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "Received payload by [[by]]", - "type": "timeseries" - }, - { - "class": "bps_panel", - "dashversion": [ - ">5.3", - ">2022.1" - ], - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Average CQL message size (received)", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "Bps" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 228 - }, - "id": 145, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], sum(rate(scylla_transport_cql_request_bytes{kind=~\"$kind\", instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"}[$__rate_interval])) by ([[by]])/sum(rate(scylla_transport_cql_requests_count{kind=~\"$kind\",instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "Average received payload size by [[by]]", - "type": "timeseries" - }, - { - "class": "bps_panel", - "dashversion": [ - ">5.3", - ">2022.1" - ], - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Bytes sent in CQL messages", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "Bps" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 228 - }, - "id": 146, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], sum(rate(scylla_transport_cql_response_bytes{kind=~\"$kind\",instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "Response payload by [[by]]", - "type": "timeseries" - }, - { - "class": "bps_panel", - "dashversion": [ - ">5.3", - ">2022.1" - ], - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Average CQL message size (sent)", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "Bps" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 228 - }, - "id": 147, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], sum(rate(scylla_transport_cql_response_bytes{kind=~\"$kind\",instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"}[$__rate_interval])) by ([[by]])/sum(rate(scylla_transport_cql_requests_count{kind=~\"$kind\",instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"}[$__rate_interval])) by ([[by]]))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "Average response payload size by [[by]]", - "type": "timeseries" - }, - { - "class": "bytes_panel", - "dashversion": [ - ">5.3", - ">2022.1" - ], - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "This is a ballpark estimation of the write-messages size (like insert and update).\n\nIt is based on the assumption that write-messages are responsible for most inwards traffic.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 234 - }, - "id": 148, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], sum(rate(scylla_transport_cql_request_bytes{kind=~\"QUERY|EXECUTE\",instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"}[$__rate_interval])) by ([[by]])/(sum(rate(scylla_storage_proxy_coordinator_write_latency_summary_count{instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"}[$__rate_interval])) by ([[by]]) or on([[by]]) sum(rate(scylla_storage_proxy_coordinator_write_latency_count{instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\",scheduling_group_name=~\"$sg\"}[$__rate_interval])) by ([[by]])))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "Estimated write message size by [[by]]", - "type": "timeseries" - }, - { - "class": "bytes_panel", - "dashversion": [ - ">5.3", - ">2022.1" - ], - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "This is a ballpark estimation of the read-messages size (like select).\n\nIt is based on the assumption that read-messages are responsible for most outbound traffic.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 234 - }, - "id": 149, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$topbottom([[filter_limit]], sum(rate(scylla_transport_cql_response_bytes{kind=~\"QUERY|EXECUTE\",instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"}[$__rate_interval])) by ([[by]])/(sum(rate(scylla_storage_proxy_coordinator_read_latency_summary_count{instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"}[$__rate_interval])) by ([[by]]) or on ([[by]]) sum(rate(scylla_storage_proxy_coordinator_read_latency_count{instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"}[$__rate_interval])) by ([[by]])))", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "Estimated read message size by [[by]]", - "type": "timeseries" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "dashproductreject": "no-your-pannels", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 240 - }, - "id": 150, - "panels": [], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Your panels", - "type": "row" - }, - { - "class": "plain_text", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 241 - }, - "id": 151, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

Your Panels

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "user_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "This graph panel was left empty on purpose for ad-hoc usage. Change it when needed. Pay attention that changes to the panel will not be saved.\n\nIf you do need a panel that can be saved, create a new dashboard, or edit the panel inside the json file", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 243 - }, - "id": 152, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 6, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Your Graph here", - "type": "timeseries" - }, - { - "class": "user_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "This graph panel was left empty on purpose for ad-hoc usage. Change it when needed. Pay attention that changes to the panel will not be saved.\n\nIf you do need a panel that can be saved, create a new dashboard, or edit the panel inside the json file", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 12, - "x": 12, - "y": 243 - }, - "id": 153, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 6, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Your Graph here", - "type": "timeseries" - }, - { - "class": "plain_text", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 3, - "w": 24, - "x": 0, - "y": 249 - }, - "id": 154, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "
Scylla Monitoring version - 4.9.4
\n    
", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - } - ], - "refresh": "10s", - "schemaVersion": 38, - "style": "dark", - "tags": [ - "6.2" - ], - "templating": { - "list": [ - { - "class": "by_template_var", - "current": { - "tags": [], - "text": "Instance", - "value": "instance" - }, - "hide": 0, - "includeAll": false, - "label": "by", - "multi": false, - "name": "by", - "options": [ - { - "selected": false, - "text": "Cluster", - "value": "cluster" - }, - { - "selected": false, - "text": "DC", - "value": "dc" - }, - { - "selected": true, - "text": "Instance", - "value": "instance" - }, - { - "selected": false, - "text": "Shard", - "value": "instance,shard" - } - ], - "query": "Cluster : cluster,DC : dc, Instance : instance, Shard : instance\\,shard", - "skipUrlSync": false, - "type": "custom" - }, - { - "class": "template_variable_single", - "current": { - "selected": false, - "text": "scylla", - "value": "scylla" - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": false, - "label": "cluster", - "multi": false, - "name": "cluster", - "options": [], - "query": "label_values(scylla_reactor_utilization, cluster)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "label": "dc", - "multi": true, - "name": "dc", - "options": [], - "query": "label_values(scylla_reactor_utilization{cluster=~\"$cluster\"}, dc)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "label": "node", - "multi": true, - "name": "node", - "options": [], - "query": "label_values(scylla_reactor_utilization{cluster=\"$cluster\", dc=~\"$dc\"}, instance)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".+", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "label": "shard", - "multi": true, - "name": "shard", - "options": [], - "query": "label_values(scylla_reactor_utilization,shard)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 3, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "statement" - ], - "value": [ - "statement" - ] - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "label": "SG", - "multi": true, - "name": "sg", - "options": [], - "query": "label_values(scylla_scheduler_runtime_ms{cluster=\"$cluster\"}, group)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 3, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "dashversion": [ - ">5.3", - ">2022.1" - ], - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "label": "cql_kind", - "multi": true, - "name": "kind", - "options": [], - "query": "label_values(scylla_transport_cql_requests_count{cluster=\"$cluster\"}, kind)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 3, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "class": "aggregation_function", - "current": { - "tags": [], - "text": "sum", - "value": "sum" - }, - "hide": 0, - "includeAll": false, - "label": "Function", - "multi": false, - "name": "func", - "options": [ - { - "selected": true, - "text": "sum", - "value": "sum" - }, - { - "selected": false, - "text": "avg", - "value": "avg" - }, - { - "selected": false, - "text": "max", - "value": "max" - }, - { - "selected": false, - "text": "min", - "value": "min" - }, - { - "selected": false, - "text": "stddev", - "value": "stddev" - }, - { - "selected": false, - "text": "stdvar", - "value": "stdvar" - } - ], - "query": "sum,avg,max,min,stddev,stdvar", - "skipUrlSync": false, - "type": "custom" - }, - { - "class": "topbottom", - "current": { - "tags": [], - "text": "top", - "value": "topk" - }, - "hide": 0, - "includeAll": false, - "label": "Filter", - "multi": false, - "name": "topbottom", - "options": [ - { - "selected": true, - "text": "top", - "value": "topk" - }, - { - "selected": false, - "text": "bottom", - "value": "bottomk" - }, - { - "selected": false, - "text": "limit", - "value": "limitk" - } - ], - "query": "top : topk,bottom : bottomk,limit : limitk", - "skipUrlSync": false, - "type": "custom" - }, - { - "class": "filter_limit", - "current": { - "tags": [], - "text": "256", - "value": "256" - }, - "hide": 0, - "includeAll": false, - "label": "", - "multi": false, - "name": "filter_limit", - "options": [ - { - "selected": false, - "text": "5", - "value": "5" - }, - { - "selected": false, - "text": "10", - "value": "10" - }, - { - "selected": false, - "text": "20", - "value": "20" - }, - { - "selected": false, - "text": "50", - "value": "50" - }, - { - "selected": false, - "text": "100", - "value": "100" - }, - { - "selected": true, - "text": "256", - "value": "256" - }, - { - "selected": false, - "text": "512", - "value": "512" - }, - { - "selected": false, - "text": "1000", - "value": "1000" - }, - { - "selected": false, - "text": "10000", - "value": "10000" - } - ], - "query": "0, 5, 10, 20, 50, 100, 256, 500, 1000, 10000", - "skipUrlSync": false, - "type": "custom" - }, - { - "class": "template_variable_custom", - "current": { - "text": "6.2", - "value": "6.2" - }, - "hide": 2, - "includeAll": false, - "multi": false, - "name": "scylla_version", - "options": [ - { - "selected": true, - "text": "6.2", - "value": "6.2" - } - ], - "query": "6.2", - "skipUrlSync": false, - "type": "custom" - }, - { - "class": "monitor_version_var", - "current": { - "text": "4.9.4", - "value": "4.9.4" - }, - "hide": 2, - "includeAll": false, - "multi": false, - "name": "monitoring_version", - "options": [ - { - "selected": true, - "text": "4.9.4", - "value": "4.9.4" - } - ], - "query": "4.9.4", - "skipUrlSync": false, - "type": "custom" - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "now": true, - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "browser", - "title": "Detailed", - "uid": "detailed-6-2", - "version": 1, - "weekStart": "" - } \ No newline at end of file diff --git a/kubernetes/linera-validator/grafana-dashboards/scylla/scylla-ks.6.2.json b/kubernetes/linera-validator/grafana-dashboards/scylla/scylla-ks.6.2.json deleted file mode 100644 index 3e8cffd95619..000000000000 --- a/kubernetes/linera-validator/grafana-dashboards/scylla/scylla-ks.6.2.json +++ /dev/null @@ -1,2755 +0,0 @@ -{ - "annotations": { - "class": "default_annotations", - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "enable": false, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - }, - { - "class": "annotation_restart", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "resets(scylla_gossip_heart_beat{cluster=\"$cluster\"}[$__rate_interval])>0", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "node_restart", - "showIn": 0, - "tagKeys": "instance,dc,cluster", - "tags": [], - "titleFormat": "restart", - "type": "tags" - }, - { - "class": "annotation_stall", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": false, - "expr": "changes(scylla_stall_detector_reported{cluster=\"$cluster\"}[$__rate_interval])>0", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "stall detector", - "showIn": 0, - "tagKeys": "dc,instance,shard", - "tags": [], - "titleFormat": "Stall found", - "type": "tags" - }, - { - "class": "annotation_schema_changed", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": false, - "expr": "changes(scylla_database_schema_changed{cluster=\"$cluster\"}[$__rate_interval])>0", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "Schema Changed", - "showIn": 0, - "tagKeys": "instance,dc,cluster", - "tags": [], - "titleFormat": "schema changed", - "type": "tags" - }, - { - "class": "annotation_manager_task", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "scylla_manager_task_active_count{type=~\"repair|backup\",cluster=\"$cluster\"}>0", - "hide": false, - "iconColor": "#73BF69", - "limit": 100, - "name": "Task", - "showIn": 0, - "tagKeys": "type", - "tags": [], - "titleFormat": "Running", - "type": "tags" - }, - { - "class": "annotation_hints_writes", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": false, - "expr": "changes(scylla_hints_manager_written{cluster=\"$cluster\"}[$__rate_interval])>0", - "hide": false, - "iconColor": "rgb(255, 176, 0, 128)", - "limit": 100, - "name": "Hints Write", - "showIn": 0, - "tagKeys": "instance,dc,cluster", - "tags": [], - "titleFormat": "Hints write", - "type": "tags" - }, - { - "class": "annotation_hints_sent", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": false, - "expr": "changes(scylla_hints_manager_sent{cluster=\"$cluster\"}[$__rate_interval])>0", - "hide": false, - "iconColor": "rgb(50, 176, 0, 128)", - "limit": 100, - "name": "Hints Sent", - "showIn": 0, - "tagKeys": "instance,dc,cluster", - "tags": [], - "titleFormat": "Hints Sent", - "type": "tags" - }, - { - "class": "mv_building", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "sum(scylla_view_builder_builds_in_progress{cluster=\"$cluster\"})>0", - "hide": false, - "iconColor": "rgb(50, 176, 0, 128)", - "limit": 100, - "name": "MV", - "showIn": 0, - "tagKeys": "instance,dc,cluster", - "tags": [], - "titleFormat": "Materialized View built", - "type": "tags" - }, - { - "class": "ops_annotation", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "10*min(scylla_node_ops_finished_percentage{cluster=\"$cluster\"}) by (ops, dc,instance) < 10", - "hide": false, - "iconColor": "rgb(50, 176, 0, 128)", - "limit": 100, - "name": "ops", - "showIn": 0, - "tagKeys": "ops,dc,instance", - "tags": [], - "titleFormat": "Operation", - "type": "tags" - }, - { - "class": "stream_annotation", - "dashversion": [ - ">5.2", - ">2023.1" - ], - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "10*min(scylla_streaming_finished_percentage{cluster=\"$cluster\"}) by (ops, dc,instance) < 10", - "hide": false, - "iconColor": "rgb(50, 176, 0, 128)", - "limit": 100, - "name": "streaming", - "showIn": 0, - "tagKeys": "ops,dc,instance", - "tags": [], - "titleFormat": "Streaming", - "type": "tags" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 1, - "links": [ - { - "asDropdown": true, - "icon": "external link", - "includeVars": true, - "keepTime": true, - "tags": [], - "type": "dashboards" - } - ], - "liveNow": false, - "panels": [ - { - "class": "text_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 3, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 1, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "
[[cluster]]
Keyspace and table level metrics are not available. To enable, set enable_keyspace_column_family_metrics to true in scylla.yaml. Note this has a significant effect on the monitoring stack sizing.

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "keyspace_table", - "columns": [ - { - "text": "Avg", - "value": "avg" - } - ], - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "custom": { - "cellOptions": { - "type": "auto" - }, - "filterable": true, - "inspect": false - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "fontSize": "100%", - "gridPos": { - "h": 8, - "w": 24, - "x": 0, - "y": 3 - }, - "id": 2, - "links": [], - "options": { - "cellHeight": "sm", - "footer": { - "countRows": false, - "fields": "", - "reducer": [ - "sum" - ], - "show": false - }, - "showHeader": true - }, - "pluginVersion": "10.1.1", - "scroll": true, - "showHeader": true, - "sort": { - "col": 0, - "desc": true - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "exemplar": false, - "expr": "sum(scylla_column_family_live_sstable{ks=\"$ks\", cf=~\"$table\"}) by(ks,cf)", - "format": "table", - "hide": false, - "instant": true, - "legendFormat": "__auto", - "range": false, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "exemplar": false, - "expr": "sum(rate(scylla_column_family_write_latency_count{ks=\"$ks\", cf=~\"$table\"}[1m])) by( ks,cf)", - "format": "table", - "hide": false, - "instant": true, - "legendFormat": "__auto", - "range": false, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "exemplar": false, - "expr": "wlatencyp95ks{ks=\"$ks\", cf=~\"$table\", by=\"cluster\", cluster=\"$cluster\"}", - "format": "table", - "hide": false, - "instant": true, - "legendFormat": "__auto", - "range": false, - "refId": "C" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "exemplar": false, - "expr": "wlatencyp99ks{ks=\"$ks\", cf=~\"$table\", by=\"cluster\", cluster=\"$cluster\"}", - "format": "table", - "hide": false, - "instant": true, - "legendFormat": "__auto", - "range": false, - "refId": "D" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "exemplar": false, - "expr": "sum(rate(scylla_column_family_read_latency_count{ks=\"$ks\", cf=~\"$table\"}[1m])) by( ks,cf)", - "format": "table", - "hide": false, - "instant": true, - "legendFormat": "__auto", - "range": false, - "refId": "E" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "exemplar": false, - "expr": "rlatencyp95ks{ks=\"$ks\", cf=~\"$table\", by=\"cluster\", cluster=\"$cluster\"}", - "format": "table", - "hide": false, - "instant": true, - "legendFormat": "__auto", - "range": false, - "refId": "F" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "exemplar": false, - "expr": "rlatencyp99ks{ks=\"$ks\", cf=~\"$table\", by=\"cluster\", cluster=\"$cluster\"}", - "format": "table", - "hide": false, - "instant": true, - "legendFormat": "__auto", - "range": false, - "refId": "G" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "exemplar": false, - "expr": "sum(scylla_column_family_total_disk_space{ks=\"$ks\", cf=~\"$table\", cluster=\"$cluster\"}) by (cf)", - "format": "table", - "hide": false, - "instant": true, - "legendFormat": "__auto", - "range": false, - "refId": "H" - } - ], - "title": "Keyspace tables", - "transform": "table", - "transformations": [ - { - "id": "joinByField", - "options": { - "byField": "cf", - "mode": "outer" - } - }, - { - "id": "filterFieldsByName", - "options": { - "include": { - "names": [ - "ks 1", - "Value #A", - "Value #B", - "Value #C", - "Value #D", - "Value #E", - "Value #F", - "Value #G", - "Value #H", - "cf" - ] - } - } - }, - { - "id": "organize", - "options": { - "excludeByName": {}, - "includeByName": {}, - "indexByName": { - "Value #A": 3, - "Value #B": 4, - "Value #C": 5, - "Value #D": 6, - "Value #E": 7, - "Value #F": 8, - "Value #G": 9, - "Value #H": 2, - "cf": 1, - "ks 1": 0 - }, - "renameByName": { - "Value #A": "sstables", - "Value #B": "writes/2", - "Value #C": "W P95", - "Value #D": "W P99", - "Value #E": "reads/2", - "Value #F": "R P95", - "Value #G": "R P99", - "Value #H": "Disk space", - "cf": "table", - "ks 1": "keyspace" - } - } - } - ], - "type": "table" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 11 - }, - "id": 3, - "panels": [], - "repeat": "table", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "$ks:$table", - "type": "row" - }, - { - "class": "wps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:writes/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 12 - }, - "id": 4, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_column_family_write_latency_count{ks=\"$ks\", cf=\"$table\", instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Writes by [[by]]", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 12 - }, - "id": 5, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "wlatencyaks{ks=\"$ks\", cf=\"$table\", by=\"[[by]]\", instance=~\"[[node]]|$^\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Average write latency by [[by]]", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 12 - }, - "id": 6, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "wlatencyp95ks{ks=\"$ks\", cf=\"$table\", by=\"[[by]]\", instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"} ", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "95th percentile write latency by [[by]]", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 12 - }, - "id": 7, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "wlatencyp99ks{ks=\"$ks\", cf=\"$table\", by=\"[[by]]\", instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"} ", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "99th percentile write latency by [[by]]", - "type": "timeseries" - }, - { - "class": "rps_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:reads/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 18 - }, - "id": 8, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_column_family_read_latency_count{ks=\"$ks\", cf=\"$table\", instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Reads by [[by]]", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 18 - }, - "id": 9, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "rlatencyaks{ks=\"$ks\", cf=\"$table\", by=\"[[by]]\", instance=~\"[[node]]|$^\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Average read latency by [[by]]", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 18 - }, - "id": 10, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "rlatencyp95ks{ks=\"$ks\", cf=\"$table\", by=\"[[by]]\", instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"} ", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "95th percentile read latency by [[by]]", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 18 - }, - "id": 11, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "rlatencyp99ks{ks=\"$ks\", cf=\"$table\", by=\"[[by]]\", instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"} ", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "99th percentile read latency by [[by]]", - "type": "timeseries" - }, - { - "class": "percentunit_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMax": 1, - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percentunit" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 24 - }, - "id": 12, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "avg(scylla_column_family_cache_hit_rate{ks=\"$ks\", cf=\"$table\", instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}) by([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "Avg cache hit rate by [[by]]", - "type": "timeseries" - }, - { - "class": "bytes_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 24 - }, - "id": 13, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(scylla_column_family_total_disk_space{ks=\"$ks\", cf=\"$table\", instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}) by([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "Total disk space by [[by]]", - "type": "timeseries" - }, - { - "class": "bytes_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 24 - }, - "id": 14, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(scylla_column_family_live_disk_space{ks=\"$ks\", cf=\"$table\", instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}) by([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "Live disk space by [[by]]", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 24 - }, - "id": 15, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(scylla_column_family_live_sstable{ks=\"$ks\", cf=\"$table\", instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}) by([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "Live sstables by [[by]]", - "type": "timeseries" - }, - { - "class": "graph_panel", - "dashversion": [ - ">6.0" - ], - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 30 - }, - "id": 16, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(scylla_column_family_tablet_count{ks=\"$ks\", cf=\"$table\", instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}) by([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "Tablets by [[by]]", - "type": "timeseries" - }, - { - "class": "heatmap_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": { - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "scaleDistribution": { - "type": "linear" - } - } - }, - "overrides": [] - }, - "gridPos": { - "h": 13, - "w": 24, - "x": 0, - "y": 36 - }, - "id": 17, - "links": [], - "options": { - "barRadius": 0, - "barWidth": 0.89, - "calculate": false, - "cellGap": 1, - "color": { - "exponent": 0.5, - "fill": "dark-orange", - "min": 0, - "mode": "scheme", - "reverse": false, - "scale": "exponential", - "scheme": "Oranges", - "steps": 64 - }, - "exemplars": { - "color": "rgba(255,0,255,0.7)" - }, - "filterValues": { - "le": 1e-9 - }, - "fullHighlight": false, - "groupWidth": 0.7, - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "show": true, - "showLegend": false - }, - "orientation": "auto", - "rowsFrame": { - "layout": "auto" - }, - "showValue": "always", - "stacking": "none", - "tooltip": { - "mode": "single", - "show": true, - "showColorScale": false, - "sort": "none", - "yHistogram": false - }, - "xTickLabelRotation": 0, - "xTickLabelSpacing": 0, - "yAxis": { - "axisPlacement": "left", - "reverse": false - } - }, - "pluginVersion": "10.1.1", - "span": 5, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "sum(scylla_column_family_tablet_count{ks=\"$ks\", cf=\"$table\", instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$\"}) by([[by]])", - "format": "time_series", - "instant": false, - "legendFormat": "{{dc}} {{instance}} {{shard}}", - "range": false, - "refId": "A" - } - ], - "title": "Tablets over time per [[by]]", - "type": "heatmap" - }, - { - "class": "barchart_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "fillOpacity": 80, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineWidth": 1, - "scaleDistribution": { - "type": "linear" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 24, - "x": 0, - "y": 49 - }, - "id": 18, - "links": [], - "options": { - "barRadius": 0, - "barWidth": 0.89, - "fullHighlight": false, - "groupWidth": 0.7, - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "orientation": "auto", - "showValue": "always", - "stacking": "none", - "tooltip": { - "mode": "single", - "sort": "none" - }, - "xTickLabelRotation": 0, - "xTickLabelSpacing": 0 - }, - "span": 12, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "sum(scylla_column_family_tablet_count{ks=\"$ks\", cf=\"$table\",instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$\"}) by([[by]])", - "format": "table", - "instant": true, - "legendFormat": "__auto", - "range": false, - "refId": "A" - } - ], - "title": "Tablets per [[by]]", - "type": "barchart" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 55 - }, - "id": 19, - "panels": [], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "type": "row" - }, - { - "class": "plain_text", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 56 - }, - "id": 20, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

Your Panels

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "user_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "This graph panel was left empty on purpose for ad-hoc usage. Change it when needed. Pay attention that changes to the panel will not be saved.\n\nIf you do need a panel that can be saved, create a new dashboard, or edit the panel inside the json file", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 58 - }, - "id": 21, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 6, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Your Graph here", - "type": "timeseries" - }, - { - "class": "user_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "This graph panel was left empty on purpose for ad-hoc usage. Change it when needed. Pay attention that changes to the panel will not be saved.\n\nIf you do need a panel that can be saved, create a new dashboard, or edit the panel inside the json file", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 12, - "x": 12, - "y": 58 - }, - "id": 22, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 6, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Your Graph here", - "type": "timeseries" - }, - { - "class": "plain_text", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 3, - "w": 24, - "x": 0, - "y": 64 - }, - "id": 23, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "
Scylla Monitoring version - 4.9.4
\n    
", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - } - ], - "refresh": "10s", - "schemaVersion": 38, - "style": "dark", - "tags": [ - "6.2" - ], - "templating": { - "list": [ - { - "class": "by_template_var", - "current": { - "tags": [], - "text": "Instance", - "value": "instance" - }, - "hide": 0, - "includeAll": false, - "label": "by", - "multi": false, - "name": "by", - "options": [ - { - "selected": false, - "text": "Cluster", - "value": "cluster" - }, - { - "selected": false, - "text": "DC", - "value": "dc" - }, - { - "selected": true, - "text": "Instance", - "value": "instance" - }, - { - "selected": false, - "text": "Shard", - "value": "instance,shard" - } - ], - "query": "Cluster : cluster,DC : dc, Instance : instance, Shard : instance\\,shard", - "skipUrlSync": false, - "type": "custom" - }, - { - "class": "template_variable_single", - "current": { - "selected": false, - "text": "scylla", - "value": "scylla" - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": false, - "label": "cluster", - "multi": false, - "name": "cluster", - "options": [], - "query": "label_values(scylla_reactor_utilization, cluster)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "label": "dc", - "multi": true, - "name": "dc", - "options": [], - "query": "label_values(scylla_reactor_utilization{cluster=~\"$cluster\"}, dc)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "label": "node", - "multi": true, - "name": "node", - "options": [], - "query": "label_values(scylla_reactor_utilization{cluster=\"$cluster\", dc=~\"$dc\"}, instance)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "label": "shard", - "multi": true, - "name": "shard", - "options": [], - "query": "label_values(scylla_reactor_utilization,shard)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 3, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "class": "template_variable_single", - "current": { - "selected": false, - "text": "kv", - "value": "kv" - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": false, - "label": "ks", - "multi": false, - "name": "ks", - "options": [], - "query": "label_values(scylla_column_family_cache_hit_rate{cluster=\"$cluster\"},ks)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 3, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "label": "table", - "multi": true, - "name": "table", - "options": [], - "query": "label_values(scylla_column_family_cache_hit_rate{cluster=\"$cluster\", ks=\"$ks\"},cf)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 3, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "class": "aggregation_function", - "current": { - "tags": [], - "text": "sum", - "value": "sum" - }, - "hide": 0, - "includeAll": false, - "label": "Function", - "multi": false, - "name": "func", - "options": [ - { - "selected": true, - "text": "sum", - "value": "sum" - }, - { - "selected": false, - "text": "avg", - "value": "avg" - }, - { - "selected": false, - "text": "max", - "value": "max" - }, - { - "selected": false, - "text": "min", - "value": "min" - }, - { - "selected": false, - "text": "stddev", - "value": "stddev" - }, - { - "selected": false, - "text": "stdvar", - "value": "stdvar" - } - ], - "query": "sum,avg,max,min,stddev,stdvar", - "skipUrlSync": false, - "type": "custom" - }, - { - "class": "template_variable_custom", - "current": { - "text": "6.2", - "value": "6.2" - }, - "hide": 2, - "includeAll": false, - "multi": false, - "name": "scylla_version", - "options": [ - { - "selected": true, - "text": "6.2", - "value": "6.2" - } - ], - "query": "6.2", - "skipUrlSync": false, - "type": "custom" - }, - { - "class": "monitor_version_var", - "current": { - "text": "4.9.4", - "value": "4.9.4" - }, - "hide": 2, - "includeAll": false, - "multi": false, - "name": "monitoring_version", - "options": [ - { - "selected": true, - "text": "4.9.4", - "value": "4.9.4" - } - ], - "query": "4.9.4", - "skipUrlSync": false, - "type": "custom" - }, - { - "current": { - "selected": false, - "text": "scylla_column_family_write_latency_count", - "value": "scylla_column_family_write_latency_count" - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "scylla_column_family_write_latency_count{cluster=\"$cluster\"}", - "hide": 2, - "includeAll": false, - "multi": false, - "name": "no_ks", - "options": [], - "query": { - "query": "scylla_column_family_write_latency_count{cluster=\"$cluster\"}", - "refId": "StandardVariableQuery" - }, - "refresh": 1, - "regex": "/^(scylla_column_family_write_latency_count)/", - "skipUrlSync": false, - "sort": 0, - "type": "query" - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "now": true, - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "browser", - "title": "Keyspace", - "uid": "ks-6-2", - "version": 1, - "weekStart": "" - } \ No newline at end of file diff --git a/kubernetes/linera-validator/grafana-dashboards/scylla/scylla-os.6.2.json b/kubernetes/linera-validator/grafana-dashboards/scylla/scylla-os.6.2.json deleted file mode 100644 index c90948f8e26a..000000000000 --- a/kubernetes/linera-validator/grafana-dashboards/scylla/scylla-os.6.2.json +++ /dev/null @@ -1,2215 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - }, - { - "class": "annotation_restart", - "datasource": "prometheus", - "enable": true, - "expr": "resets(scylla_gossip_heart_beat{cluster=\"$cluster\"}[$__rate_interval])>0", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "node_restart", - "showIn": 0, - "tagKeys": "instance,dc,cluster", - "tags": [], - "titleFormat": "restart", - "type": "tags" - }, - { - "class": "annotation_stall", - "datasource": "prometheus", - "enable": false, - "expr": "changes(scylla_stall_detector_reported{cluster=\"$cluster\"}[$__rate_interval])>0", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "stall detector", - "showIn": 0, - "tagKeys": "dc,instance,shard", - "tags": [], - "titleFormat": "Stall found", - "type": "tags" - }, - { - "class": "annotation_schema_changed", - "datasource": "prometheus", - "enable": false, - "expr": "changes(scylla_database_schema_changed{cluster=\"$cluster\"}[$__rate_interval])>0", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "Schema Changed", - "showIn": 0, - "tagKeys": "instance,dc,cluster", - "tags": [], - "titleFormat": "schema changed", - "type": "tags" - } - ] - }, - "class": "dashboard", - "editable": true, - "gnetId": null, - "graphTooltip": 1, - "hideControls": true, - "id": null, - "links": [ - { - "asDropdown": true, - "icon": "external link", - "includeVars": true, - "keepTime": true, - "tags": [], - "type": "dashboards" - } - ], - "overwrite": true, - "panels": [ - { - "class": "collapsible_row_panel", - "collapsed": false, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 1, - "panels": [], - "repeat": "", - "title": "", - "type": "row" - }, - { - "class": "text_panel", - "datasource": null, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "gridPos": { - "h": 3, - "w": 24, - "x": 0, - "y": 1 - }, - "id": 2, - "isNew": true, - "links": [], - "mode": "html", - "options": { - "content": "
\n\n [[cluster]]
", - "mode": "html" - }, - "span": 12, - "title": "", - "transparent": true, - "type": "text" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 4 - }, - "id": 3, - "panels": [], - "repeat": "", - "title": "", - "type": "row" - }, - { - "aliasColors": {}, - "class": "piechart_panel_percent", - "datasource": "prometheus", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - } - }, - "decimals": 0, - "mappings": [], - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 6, - "x": 0, - "y": 5 - }, - "height": "250px", - "id": 4, - "isNew": true, - "links": [], - "maxPerRow": 8, - "options": { - "displayLabels": [ - "name", - "value", - "percent" - ], - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "right", - "values": [ - "value" - ] - }, - "pieType": "pie", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "repeat": "node", - "repeatDirection": "h", - "targets": [ - { - "expr": "sum(node_filesystem_avail_bytes{mountpoint=~\"$mount_point\", instance=~\"$node\", job=~\"node_exporter.*\"})", - "instant": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": "Free", - "metric": "", - "refId": "A", - "step": 7200 - }, - { - "expr": "(sum(node_filesystem_size_bytes{mountpoint=~\"$mount_point\", instance=~\"$node\", job=~\"node_exporter.*\"})-sum(node_filesystem_avail_bytes{mountpoint=~\"$mount_point\", instance=~\"$node\", job=~\"node_exporter.*\"}))", - "instant": true, - "intervalFactor": 1, - "legendFormat": "Used", - "refId": "B", - "step": 7200 - } - ], - "title": "Total Storage $node", - "type": "piechart" - }, - { - "collapsed": false, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 13 - }, - "id": 5, - "panels": [], - "repeat": "mount_point", - "title": "Partition $mount_point", - "type": "row" - }, - { - "class": "percentunit_panel", - "datasource": "prometheus", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "class": "fieldConfig_defaults", - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMax": 1, - "axisSoftMin": 0, - "barAlignment": 0, - "class": "fieldConfig_defaults_custom", - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "unit": "percentunit" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 14 - }, - "id": 6, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "expr": "1-sum(node_filesystem_avail_bytes{mountpoint=\"$mount_point\", instance=~\"$node\", job=~\"node_exporter.*\"}) by ([[by]])/sum(node_filesystem_size_bytes{mountpoint=\"$mount_point\", instance=~\"$node\", job=~\"node_exporter.*\"}) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "Used disk by $by", - "type": "timeseries" - }, - { - "class": "bytes_panel", - "datasource": "prometheus", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "class": "fieldConfig_defaults", - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "class": "fieldConfig_defaults_custom", - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 14 - }, - "id": 7, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "expr": "sum(node_filesystem_size_bytes{mountpoint=\"$mount_point\", instance=~\"$node\", job=~\"node_exporter.*\"}) by ([[by]])-sum(node_filesystem_avail_bytes{mountpoint=\"$mount_point\", instance=~\"$node\", job=~\"node_exporter.*\"}) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - }, - { - "expr": "sum(node_filesystem_size{mountpoint=\"$mount_point\", instance=~\"$node\", job=~\"node_exporter.*\"}) by ([[by]])-sum(node_filesystem_avail{mountpoint=\"$mount_point\", instance=~\"$node\", job=~\"node_exporter.*\"}) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "B", - "step": 1 - } - ], - "title": "Used Bytes by $by", - "type": "timeseries" - }, - { - "class": "bytes_panel", - "datasource": "prometheus", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "class": "fieldConfig_defaults", - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "class": "fieldConfig_defaults_custom", - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 14 - }, - "id": 8, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "expr": "sum(node_filesystem_free_bytes{mountpoint=\"$mount_point\", instance=~\"$node\", job=~\"node_exporter.*\"}) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "Free Bytes by $by", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": "prometheus", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "class": "fieldConfig_defaults", - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "class": "fieldConfig_defaults_custom", - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 14 - }, - "id": 9, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "expr": "sum(node_filesystem_files{mountpoint=\"$mount_point\", instance=~\"$node\", job=~\"node_exporter.*\"}- node_filesystem_files_free{mountpoint=\"$mount_point\", instance=~\"$node\", job=~\"node_exporter.*\"}) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "Number of files by $by", - "type": "timeseries" - }, - { - "collapsed": false, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 20 - }, - "id": 10, - "panels": [], - "repeat": "monitor_disk", - "title": "Disk $monitor_disk", - "type": "row" - }, - { - "class": "text_panel", - "content": "

Disk $monitor_disk

", - "datasource": null, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 21 - }, - "id": 11, - "isNew": true, - "links": [], - "mode": "html", - "options": {}, - "span": 12, - "style": {}, - "title": "", - "transparent": true, - "type": "text" - }, - { - "class": "wps_panel", - "datasource": "prometheus", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "class": "fieldConfig_defaults", - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "class": "fieldConfig_defaults_custom", - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "unit": "si:writes/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 23 - }, - "id": 12, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "expr": "sum(rate(node_disk_writes_completed_total{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", device=\"$monitor_disk\", job=~\"node_exporter.*\"}[4m])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - }, - { - "expr": "sum(rate(node_disk_writes_completed{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", device=\"$monitor_disk\", job=~\"node_exporter.*\"}[4m])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "B", - "step": 1 - } - ], - "title": "Disk Writes per $by", - "type": "timeseries" - }, - { - "class": "rps_panel", - "datasource": "prometheus", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "class": "fieldConfig_defaults", - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "class": "fieldConfig_defaults_custom", - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "unit": "si:reads/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 23 - }, - "id": 13, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "expr": "sum(rate(node_disk_reads_completed_total{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", device=\"$monitor_disk\", job=~\"node_exporter.*\"}[4m])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - }, - { - "expr": "sum(rate(node_disk_reads_completed{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", device=\"$monitor_disk\", job=~\"node_exporter.*\"}[4m])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "B", - "step": 1 - } - ], - "title": "Disk Reads per $by", - "type": "timeseries" - }, - { - "class": "bps_panel", - "datasource": "prometheus", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "class": "fieldConfig_defaults", - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "class": "fieldConfig_defaults_custom", - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "unit": "Bps" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 23 - }, - "id": 14, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "expr": "sum(rate(node_disk_written_bytes_total{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", device=\"$monitor_disk\", job=~\"node_exporter.*\"}[4m])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - }, - { - "expr": "sum(rate(node_disk_bytes_written{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", device=\"$monitor_disk\", job=~\"node_exporter.*\"}[4m])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "B", - "step": 1 - } - ], - "title": "Disk Writes Bps per $by", - "type": "timeseries" - }, - { - "class": "bps_panel", - "datasource": "prometheus", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "class": "fieldConfig_defaults", - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "class": "fieldConfig_defaults_custom", - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "unit": "Bps" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 23 - }, - "id": 15, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "expr": "sum(rate(node_disk_read_bytes_total{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", device=\"$monitor_disk\", job=~\"node_exporter.*\"}[4m])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - }, - { - "expr": "sum(rate(node_disk_bytes_read{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", device=\"$monitor_disk\", job=~\"node_exporter.*\"}[4m])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "B", - "step": 1 - } - ], - "title": "Disk Read Bps per $by", - "type": "timeseries" - }, - { - "class": "seconds_panel", - "datasource": "prometheus", - "description": "The average read time from disk", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "class": "fieldConfig_defaults", - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "class": "fieldConfig_defaults_custom", - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "unit": "s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 29 - }, - "id": 16, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "expr": "rate(node_disk_read_time_seconds_total{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", device=\"$monitor_disk\", job=~\"node_exporter.*\"}[4m])/rate(node_disk_reads_completed_total{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", device=\"$monitor_disk\", job=~\"node_exporter.*\"}[4m])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Read AWait per instance", - "type": "timeseries" - }, - { - "class": "seconds_panel", - "datasource": "prometheus", - "description": "The average write time to disk", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "class": "fieldConfig_defaults", - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "class": "fieldConfig_defaults_custom", - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "unit": "s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 29 - }, - "id": 17, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "expr": "rate(node_disk_write_time_seconds_total{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", device=\"$monitor_disk\", job=~\"node_exporter.*\"}[4m])/rate(node_disk_writes_completed_total{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", device=\"$monitor_disk\", job=~\"node_exporter.*\"}[4m])", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 1 - } - ], - "title": "Write AWait per instance", - "type": "timeseries" - }, - { - "collapsed": false, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 35 - }, - "id": 18, - "panels": [], - "repeat": "monitor_network_interface", - "title": "Network Interface $monitor_network_interface", - "type": "row" - }, - { - "class": "text_panel", - "content": "

Network $monitor_network_interface

", - "datasource": null, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 36 - }, - "id": 19, - "isNew": true, - "links": [], - "mode": "html", - "options": {}, - "span": 12, - "style": {}, - "title": "", - "transparent": true, - "type": "text" - }, - { - "class": "pps_panel", - "datasource": "prometheus", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "class": "fieldConfig_defaults", - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "class": "fieldConfig_defaults_custom", - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "unit": "pps" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 38 - }, - "id": 20, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 6, - "targets": [ - { - "expr": "sum(rate(node_network_receive_packets_total{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", device=\"$monitor_network_interface\", job=~\"node_exporter.*\"}[4m])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - }, - { - "expr": "sum(rate(node_network_receive_packets{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", device=\"$monitor_network_interface\", job=~\"node_exporter.*\"}[4m])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "B", - "step": 1 - } - ], - "title": "Interface Rx Packets", - "type": "timeseries" - }, - { - "class": "pps_panel", - "datasource": "prometheus", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "class": "fieldConfig_defaults", - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "class": "fieldConfig_defaults_custom", - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "unit": "pps" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 12, - "x": 12, - "y": 38 - }, - "id": 21, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 6, - "targets": [ - { - "expr": "sum(rate(node_network_transmit_packets_total{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", device=\"$monitor_network_interface\", job=~\"node_exporter.*\"}[4m])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - }, - { - "expr": "sum(rate(node_network_transmit_packets{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", device=\"$monitor_network_interface\", job=~\"node_exporter.*\"}[4m])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "B", - "step": 1 - } - ], - "title": "Interface Tx Packets", - "type": "timeseries" - }, - { - "class": "bps_panel", - "datasource": "prometheus", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "class": "fieldConfig_defaults", - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "class": "fieldConfig_defaults_custom", - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "unit": "Bps" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 44 - }, - "id": 22, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 6, - "targets": [ - { - "expr": "sum(rate(node_network_receive_bytes_total{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", device=\"$monitor_network_interface\", job=~\"node_exporter.*\"}[4m])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - }, - { - "expr": "sum(rate(node_network_receive_bytes{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", device=\"$monitor_network_interface\", job=~\"node_exporter.*\"}[4m])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "B", - "step": 1 - } - ], - "title": "Interface Rx Bps", - "type": "timeseries" - }, - { - "class": "bps_panel", - "datasource": "prometheus", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "class": "fieldConfig_defaults", - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "class": "fieldConfig_defaults_custom", - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "unit": "Bps" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 12, - "x": 12, - "y": 44 - }, - "id": 23, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 6, - "targets": [ - { - "expr": "sum(rate(node_network_transmit_bytes_total{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", device=\"$monitor_network_interface\", job=~\"node_exporter.*\"}[4m])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - }, - { - "expr": "sum(rate(node_network_transmit_bytes{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", device=\"$monitor_network_interface\", job=~\"node_exporter.*\"}[4m])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "B", - "step": 1 - } - ], - "title": "Interface Tx Bps", - "type": "timeseries" - }, - { - "collapsed": false, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 50 - }, - "id": 24, - "panels": [], - "title": "CPU and Memory", - "type": "row" - }, - { - "class": "text_panel", - "content": "

CPU and Memory

", - "datasource": null, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 51 - }, - "id": 25, - "isNew": true, - "links": [], - "mode": "html", - "options": {}, - "span": 12, - "style": {}, - "title": "", - "transparent": true, - "type": "text" - }, - { - "class": "bytes_panel", - "datasource": "prometheus", - "description": "The available memory, note that in a production environment we expect this to be low, Scylla would use most of the available memory when possible", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "class": "fieldConfig_defaults", - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "class": "fieldConfig_defaults_custom", - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 53 - }, - "id": 26, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "expr": "sum(node_memory_MemAvailable_bytes{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", job=~\"node_exporter.*\"}) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "Available memory", - "type": "timeseries" - }, - { - "class": "percentunit_panel", - "datasource": "prometheus", - "description": "Percent of available memory, note that in a production environment we expect this to be low, Scylla would use most of the available memory when possible", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "class": "fieldConfig_defaults", - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMax": 1, - "axisSoftMin": 0, - "barAlignment": 0, - "class": "fieldConfig_defaults_custom", - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "unit": "percentunit" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 53 - }, - "id": 27, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "expr": "sum(node_memory_MemAvailable_bytes{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", job=~\"node_exporter.*\"}) by ([[by]])/sum(node_memory_MemTotal_bytes{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", job=~\"node_exporter.*\"}) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "Percent of Available memory", - "type": "timeseries" - }, - { - "class": "percentunit_panel", - "datasource": "prometheus", - "description": "Percent of CPU used, note that in production Scylla would try to use most of the CPU and this is not a problem", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "class": "fieldConfig_defaults", - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMax": 1, - "axisSoftMin": 0, - "barAlignment": 0, - "class": "fieldConfig_defaults_custom", - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "unit": "percentunit" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 53 - }, - "id": 28, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 3, - "targets": [ - { - "expr": "1-sum(rate(node_cpu_seconds_total{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", mode=\"idle\", job=~\"node_exporter.*\"}[3m])) by ([[by]])/count(node_cpu_seconds_total{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", mode=\"idle\", job=~\"node_exporter.*\"}) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "CPU used", - "type": "timeseries" - }, - { - "class": "graph_panel", - "datasource": "prometheus", - "description": "CPU frequency should be set for performance.\n\n The current frequency should match the max frequency. If that is not the case, check your host configuration.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "links": [], - "unit": "hertz" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 53 - }, - "id": 29, - "isNew": true, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - { - "$$hashKey": "object:211", - "alias": "Max", - "color": "#F2495C" - } - ], - "span": 3, - "targets": [ - { - "expr": "max(node_cpu_scaling_frequency_max_hertz{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", job=~\"node_exporter.*\"}) or on() max(node_cpu_frequency_max_hertz{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", job=~\"node_exporter.*\"})", - "intervalFactor": 1, - "legendFormat": "Max", - "metric": "", - "refId": "A", - "step": 1 - }, - { - "expr": "min(node_cpu_scaling_frequency_hertz{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", job=~\"node_exporter.*\"}) by ([[by]]) or on() min(node_cpu_frequency_hertz{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", job=~\"node_exporter.*\"}) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "B", - "step": 1 - } - ], - "title": "CPU Frequency", - "type": "timeseries" - }, - { - "class": "plain_text", - "datasource": null, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "gridPos": { - "h": 3, - "w": 24, - "x": 0, - "y": 59 - }, - "id": 30, - "isNew": true, - "links": [], - "mode": "html", - "options": { - "content": "
Scylla Monitoring version - 4.9.4
\n    
", - "mode": "html" - }, - "span": 12, - "style": {}, - "title": "", - "transparent": true, - "type": "text" - } - ], - "refresh": "10s", - "schemaVersion": 26, - "style": "dark", - "tags": [ - "6.2" - ], - "templating": { - "list": [ - { - "allValue": null, - "class": "template_variable_single", - "current": { - "isNone": true, - "selected": false, - "text": "None", - "value": "" - }, - "datasource": "prometheus", - "definition": "", - "error": null, - "hide": 0, - "includeAll": false, - "label": "cluster", - "multi": false, - "name": "cluster", - "options": [], - "query": "label_values(node_filesystem_avail_bytes, cluster)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": "prometheus", - "definition": "", - "error": null, - "hide": 0, - "includeAll": true, - "label": "dc", - "multi": true, - "name": "dc", - "options": [], - "query": "label_values(node_filesystem_avail_bytes{cluster=~\"$cluster\"}, dc)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "class": "template_variable_single", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": "prometheus", - "definition": "", - "error": null, - "hide": 0, - "includeAll": true, - "label": "node", - "multi": true, - "name": "node", - "options": [], - "query": "label_values(node_filesystem_avail_bytes{cluster=\"$cluster\", dc=~\"$dc\"}, instance)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - "tags": [], - "text": "Instance", - "value": "instance" - }, - "hide": 0, - "includeAll": false, - "label": "by", - "multi": false, - "name": "by", - "options": [ - { - "selected": false, - "text": "Cluster", - "value": "cluster" - }, - { - "selected": false, - "text": "DC", - "value": "dc" - }, - { - "selected": true, - "text": "Instance", - "value": "instance" - } - ], - "query": "Instance : instance,Cluster : cluster,DC : dc,Shard : instance\\,cpu", - "type": "custom" - }, - { - "allValue": ".*", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": "prometheus", - "definition": "", - "error": null, - "hide": 0, - "includeAll": true, - "label": null, - "multi": true, - "name": "monitor_disk", - "options": [], - "query": "node_disk_read_bytes_total", - "refresh": 2, - "regex": "/.*device=\"([^\\\"]*)\".*/", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - "isNone": true, - "text": "None", - "value": "" - }, - "datasource": "prometheus", - "hide": 0, - "includeAll": false, - "label": null, - "multi": true, - "name": "monitor_network_interface", - "options": [], - "query": "node_network_receive_packets_total", - "refresh": 2, - "regex": "/.*device=\"([^\\\"]*)\".*/", - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - "text": "/var/lib/scylla", - "value": "/var/lib/scylla" - }, - "datasource": "prometheus", - "hide": 0, - "includeAll": false, - "label": "Mount path", - "multi": true, - "name": "mount_point", - "options": [], - "query": "node_filesystem_avail_bytes", - "refresh": 2, - "regex": "/mountpoint=\"([^\"]*)\".*/", - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "class": "template_variable_custom", - "current": { - "text": "6.2", - "value": "6.2" - }, - "error": null, - "hide": 2, - "includeAll": false, - "label": null, - "multi": false, - "name": "scylla_version", - "options": [ - { - "selected": true, - "text": "6.2", - "value": "6.2" - } - ], - "query": "6.2", - "skipUrlSync": false, - "type": "custom" - }, - { - "allValue": null, - "class": "monitor_version_var", - "current": { - "text": "4.9.4", - "value": "4.9.4" - }, - "error": null, - "hide": 2, - "includeAll": false, - "label": null, - "multi": false, - "name": "monitoring_version", - "options": [ - { - "selected": true, - "text": "4.9.4", - "value": "4.9.4" - } - ], - "query": "4.9.4", - "skipUrlSync": false, - "type": "custom" - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "now": true, - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "browser", - "title": "OS Metrics", - "uid": "OS-6-2", - "version": 5 -} \ No newline at end of file diff --git a/kubernetes/linera-validator/grafana-dashboards/scylla/scylla-overview.6.2.json b/kubernetes/linera-validator/grafana-dashboards/scylla/scylla-overview.6.2.json deleted file mode 100644 index 53a75096922f..000000000000 --- a/kubernetes/linera-validator/grafana-dashboards/scylla/scylla-overview.6.2.json +++ /dev/null @@ -1,4418 +0,0 @@ -{ - "annotations": { - "class": "default_annotations", - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "enable": false, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - }, - { - "class": "annotation_restart", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "resets(scylla_gossip_heart_beat{cluster=\"$cluster\"}[$__rate_interval])>0", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "node_restart", - "showIn": 0, - "tagKeys": "instance,dc,cluster", - "tags": [], - "titleFormat": "restart", - "type": "tags" - }, - { - "class": "annotation_stall", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": false, - "expr": "changes(scylla_stall_detector_reported{cluster=\"$cluster\"}[$__rate_interval])>0", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "stall detector", - "showIn": 0, - "tagKeys": "dc,instance,shard", - "tags": [], - "titleFormat": "Stall found", - "type": "tags" - }, - { - "class": "annotation_schema_changed", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": false, - "expr": "changes(scylla_database_schema_changed{cluster=\"$cluster\"}[$__rate_interval])>0", - "hide": false, - "iconColor": "rgba(255, 96, 96, 1)", - "limit": 100, - "name": "Schema Changed", - "showIn": 0, - "tagKeys": "instance,dc,cluster", - "tags": [], - "titleFormat": "schema changed", - "type": "tags" - }, - { - "class": "annotation_manager_task", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "scylla_manager_task_active_count{type=~\"repair|backup\",cluster=\"$cluster\"}>0", - "hide": false, - "iconColor": "#73BF69", - "limit": 100, - "name": "Task", - "showIn": 0, - "tagKeys": "type", - "tags": [], - "titleFormat": "Running", - "type": "tags" - }, - { - "class": "annotation_hints_writes", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": false, - "expr": "changes(scylla_hints_manager_written{cluster=\"$cluster\"}[$__rate_interval])>0", - "hide": false, - "iconColor": "rgb(255, 176, 0, 128)", - "limit": 100, - "name": "Hints Write", - "showIn": 0, - "tagKeys": "instance,dc,cluster", - "tags": [], - "titleFormat": "Hints write", - "type": "tags" - }, - { - "class": "annotation_hints_sent", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": false, - "expr": "changes(scylla_hints_manager_sent{cluster=\"$cluster\"}[$__rate_interval])>0", - "hide": false, - "iconColor": "rgb(50, 176, 0, 128)", - "limit": 100, - "name": "Hints Sent", - "showIn": 0, - "tagKeys": "instance,dc,cluster", - "tags": [], - "titleFormat": "Hints Sent", - "type": "tags" - }, - { - "class": "mv_building", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "sum(scylla_view_builder_builds_in_progress{cluster=\"$cluster\"})>0", - "hide": false, - "iconColor": "rgb(50, 176, 0, 128)", - "limit": 100, - "name": "MV", - "showIn": 0, - "tagKeys": "instance,dc,cluster", - "tags": [], - "titleFormat": "Materialized View built", - "type": "tags" - }, - { - "class": "ops_annotation", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "10*min(scylla_node_ops_finished_percentage{cluster=\"$cluster\"}) by (ops, dc,instance) < 10", - "hide": false, - "iconColor": "rgb(50, 176, 0, 128)", - "limit": 100, - "name": "ops", - "showIn": 0, - "tagKeys": "ops,dc,instance", - "tags": [], - "titleFormat": "Operation", - "type": "tags" - }, - { - "class": "stream_annotation", - "dashversion": [ - ">5.2", - ">2023.1" - ], - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "expr": "10*min(scylla_streaming_finished_percentage{cluster=\"$cluster\"}) by (ops, dc,instance) < 10", - "hide": false, - "iconColor": "rgb(50, 176, 0, 128)", - "limit": 100, - "name": "streaming", - "showIn": 0, - "tagKeys": "ops,dc,instance", - "tags": [], - "titleFormat": "Streaming", - "type": "tags" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 1, - "links": [ - { - "asDropdown": true, - "icon": "external link", - "includeVars": true, - "keepTime": true, - "tags": [], - "type": "dashboards" - } - ], - "liveNow": false, - "panels": [ - { - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 1, - "panels": [], - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Cluster overview $cluster", - "type": "row" - }, - { - "class": "text_panel", - "dashproductreject": "no-version-check", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 1, - "w": 9, - "x": 0, - "y": 1 - }, - "id": 2, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "type": "text" - }, - { - "class": "text_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 1, - "w": 4, - "x": 9, - "y": 1 - }, - "id": 3, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "# ", - "mode": "markdown" - }, - "pluginVersion": "10.1.1", - "span": 12, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "type": "text" - }, - { - "class": "text_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 1, - "w": 4, - "x": 13, - "y": 1 - }, - "id": 4, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "# ", - "mode": "markdown" - }, - "pluginVersion": "10.1.1", - "span": 12, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "type": "text" - }, - { - "class": "text_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 1, - "w": 7, - "x": 17, - "y": 1 - }, - "id": 5, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "# ", - "mode": "markdown" - }, - "pluginVersion": "10.1.1", - "span": 12, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "type": "text" - }, - { - "class": "small_stat", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The number of nodes configured in the cluster.", - "fieldConfig": { - "defaults": { - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 0, - "y": 2 - }, - "id": 6, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "count(scylla_scylladb_current_version{job=\"scylla\", cluster=\"$cluster\"})", - "intervalFactor": 1, - "legendFormat": "Total Nodes", - "refId": "A", - "step": 40 - } - ], - "title": "# Nodes", - "type": "stat" - }, - { - "class": "small_stat", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The number of unreachable nodes.\nUsually because a machine is down or unreachable.", - "fieldConfig": { - "defaults": { - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 1 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 2, - "y": 2 - }, - "id": 7, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "(count(scrape_samples_scraped{job=\"scylla\", cluster=\"$cluster\"}==0) OR vector(0))", - "intervalFactor": 1, - "legendFormat": "Offline ", - "refId": "A", - "step": 20 - } - ], - "title": "Unreachable", - "type": "stat" - }, - { - "class": "small_stat", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The number of joining and leaving nodes.\nThe number of nodes that are up but not actively part of the cluster, either because they are still joining or because they are leaving.", - "fieldConfig": { - "defaults": { - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 1 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 4, - "y": 2 - }, - "id": 8, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "count(scylla_node_operation_mode{cluster=\"$cluster\"}!=3)OR vector(0)", - "intervalFactor": 1, - "legendFormat": "Offline ", - "refId": "A", - "step": 20 - } - ], - "thresholds": "1,2", - "title": "Inactive", - "type": "stat" - }, - { - "class": "small_stat", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "mappings": [], - "noValue": " Offline", - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "red", - "value": null - }, - { - "color": "green", - "value": 0 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byFrameRefID", - "options": "A" - }, - "properties": [ - { - "id": "mappings", - "value": [ - { - "options": { - "0": { - "index": 2, - "text": "Online" - }, - "1": { - "index": 3, - "text": "Repair" - }, - "2": { - "index": 4, - "text": "Backup" - }, - "3": { - "index": 1, - "text": "Backup Repair" - }, - "-1": { - "index": 0, - "text": "Offline" - } - }, - "type": "value" - } - ] - } - ] - }, - { - "matcher": { - "id": "byFrameRefID", - "options": "B" - }, - "properties": [ - { - "id": "unit", - "value": "percent" - }, - { - "id": "mappings", - "value": [ - { - "options": { - "0": { - "index": 0, - "text": " " - } - }, - "type": "value" - } - ] - } - ] - } - ] - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 6, - "y": 2 - }, - "id": 9, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "textMode": "value", - "wideLayout": true - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "(max(scylla_manager_scheduler_run_indicator{type=~\"repair\",cluster=\"$cluster\"}) or on() vector(0)) + (max(scylla_manager_scheduler_run_indicator{type=~\"backup\",cluster=\"$cluster\"})*2 or on() vector(0)) + (sum(scylla_manager_server_current_version{}) or on() vector(-1))", - "intervalFactor": 1, - "refId": "A", - "step": 40 - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "(avg(scylla_manager_repair_progress{cluster=\"$cluster\", job=\"scylla_manager\"}) * max(scylla_manager_scheduler_run_indicator{type=\"repair\",cluster=\"$cluster\"})) or on () (100*avg(manager:backup_progress{cluster=\"$cluster\"}) * max(scylla_manager_scheduler_run_indicator{type=\"backup\",cluster=\"$cluster\"})) or on () vector(0)", - "instant": true, - "interval": "", - "legendFormat": "", - "refId": "B" - } - ], - "title": "Manager", - "type": "stat" - }, - { - "class": "small_stat", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Average Write Latency", - "fieldConfig": { - "defaults": { - "decimals": 0, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 50000 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 9, - "y": 2 - }, - "id": 10, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "avg(wlatencya{by=\"cluster\", cluster=~\"$cluster|^$\",scheduling_group_name=~\"$sg\"}>0)", - "instant": true, - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 4 - } - ], - "title": "Avg Write", - "type": "stat" - }, - { - "class": "small_stat", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "99% write Latency", - "fieldConfig": { - "defaults": { - "decimals": 0, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 100000 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 11, - "y": 2 - }, - "id": 11, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "wlatencyp99{by=\"cluster\", cluster=~\"$cluster|^$\",scheduling_group_name=~\"$sg\"}>0", - "instant": true, - "intervalFactor": 1, - "legendFormat": "{{scheduling_group_name}}", - "refId": "A", - "step": 4 - } - ], - "title": "99% Write", - "type": "stat" - }, - { - "class": "small_stat", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Average Read Latency", - "fieldConfig": { - "defaults": { - "decimals": 0, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 50000 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 13, - "y": 2 - }, - "id": 12, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "avg(rlatencya{by=\"cluster\", cluster=~\"$cluster|^$\",scheduling_group_name=~\"$sg\"}>0)", - "instant": true, - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 4 - } - ], - "title": "Avg Read", - "type": "stat" - }, - { - "class": "small_stat", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "99% read Latency", - "fieldConfig": { - "defaults": { - "decimals": 0, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 100000 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 15, - "y": 2 - }, - "id": 13, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "rlatencyp99{by=\"cluster\", cluster=~\"$cluster|^$\",scheduling_group_name=~\"$sg\"}>0", - "instant": true, - "intervalFactor": 1, - "legendFormat": "{{scheduling_group_name}}", - "refId": "A", - "step": 4 - } - ], - "title": "99% Read", - "type": "stat" - }, - { - "class": "small_stat", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "decimals": 1, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "si:" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 17, - "y": 2 - }, - "id": 14, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "sum(rate(scylla_transport_requests_served{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) + (sum(rate(scylla_thrift_served{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) or on() vector(0))", - "instant": true, - "intervalFactor": 1, - "refId": "A", - "step": 40 - } - ], - "title": "Requests/s", - "type": "stat" - }, - { - "class": "small_stat", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The percentage of the time during which Scylla utilized the CPU. Note that because Scylla does busy polling for some time before going idle, CPU utilization as seen by the operating system may be much higher. Your system is not yet CPU-bottlenecked until this metric is high.", - "fieldConfig": { - "defaults": { - "decimals": 0, - "mappings": [], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 20, - "y": 2 - }, - "id": 15, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "avg(scylla_reactor_utilization{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"} )", - "instant": true, - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 4 - } - ], - "title": "Load", - "type": "stat" - }, - { - "class": "small_stat", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The rate of timeouts (read and write).\n\nTimeouts are an indication of an overloaded system", - "fieldConfig": { - "defaults": { - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 1 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 2, - "x": 22, - "y": 2 - }, - "id": 16, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "(sum(rate(scylla_storage_proxy_coordinator_write_timeouts{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) or on() vector(0)) + (sum(rate(scylla_storage_proxy_coordinator_read_timeouts{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) or on() vector(0))", - "instant": true, - "intervalFactor": 1, - "refId": "A", - "step": 40 - } - ], - "title": "Timeouts", - "type": "stat" - }, - { - "class": "alert_table", - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 0, - "y": 6 - }, - "id": 42, - "options": { - "alertInstanceLabelFilter": "job!=\"scylla_manager\"", - "alertName": "", - "dashboardAlerts": false, - "groupBy": [], - "groupMode": "default", - "maxItems": 20, - "sortOrder": 3, - "stateFilter": { - "error": true, - "firing": true, - "noData": false, - "normal": false, - "pending": false - }, - "viewMode": "list" - }, - "span": 4, - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "Active Alerts", - "type": "alertlist" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Write attempts - include all writes that reached the coordinator node, even if they will eventually fail", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 4, - "x": 8, - "y": 6 - }, - "id": 17, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 2, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_storage_proxy_coordinator_write_latency_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) or on ([[by]]) $func(rate(scylla_storage_proxy_coordinator_write_latency_summary_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval]))", - "intervalFactor": 1, - "legendFormat": "Writes", - "refId": "A", - "step": 1 - } - ], - "title": "Writes", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 4, - "x": 12, - "y": 6 - }, - "id": 18, - "legend": { - "alignAsTable": false, - "avg": false, - "class": "show_legend", - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": false - }, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 2, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "wlatencyp95{by=\"cluster\", cluster=\"$cluster\",scheduling_group_name=~\"$sg\"}>0", - "intervalFactor": 1, - "legendFormat": "{{scheduling_group_name}} 95%", - "refId": "A", - "step": 1 - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "wlatencyp99{by=\"cluster\", cluster=\"$cluster\",scheduling_group_name=~\"$sg\"}>0", - "intervalFactor": 1, - "legendFormat": "{{scheduling_group_name}} 99%", - "refId": "B", - "step": 1 - } - ], - "title": "Write Latencies", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Read attempts - include all reads that reached the coordinator node, even if they will eventually fail", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 4, - "x": 16, - "y": 6 - }, - "id": 19, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 2, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_storage_proxy_coordinator_read_latency_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) or on ([[by]]) $func(rate(scylla_storage_proxy_coordinator_read_latency_summary_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval]))", - "intervalFactor": 1, - "legendFormat": "Reads", - "refId": "A", - "step": 1 - } - ], - "title": "Reads", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 4, - "x": 20, - "y": 6 - }, - "id": 20, - "legend": { - "alignAsTable": false, - "avg": false, - "class": "show_legend", - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": false - }, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 2, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "rlatencyp95{by=\"cluster\", cluster=\"$cluster\",scheduling_group_name=~\"$sg\"}>0", - "intervalFactor": 1, - "legendFormat": "{{scheduling_group_name}} {{instance}} {{shard}} 95%", - "refId": "A", - "step": 1 - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "rlatencyp99{by=\"cluster\", cluster=\"$cluster\",scheduling_group_name=~\"$sg\"}>0", - "intervalFactor": 1, - "legendFormat": "{{scheduling_group_name}} 99%", - "refId": "B", - "step": 1 - } - ], - "title": "Read Latencies", - "type": "timeseries" - }, - { - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 12 - }, - "id": 21, - "panels": [], - "repeat": "dc", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "type": "row" - }, - { - "class": "plain_text", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 13 - }, - "id": 22, - "links": [], - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

Information for $dc

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "vertical_lcd", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "decimals": 0, - "mappings": [], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "orange", - "value": 85 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 1, - "x": 0, - "y": 15 - }, - "id": 23, - "options": { - "displayMode": "lcd", - "minVizHeight": 10, - "minVizWidth": 0, - "orientation": "vertical", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "showUnfilled": true, - "valueMode": "color" - }, - "pluginVersion": "10.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "avg(scylla_reactor_utilization{instance=~\"[[node]]\",cluster=~\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"} )", - "instant": true, - "interval": "", - "legendFormat": "", - "refId": "A" - } - ], - "title": "Load", - "type": "bargauge" - }, - { - "class": "bytes_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The average Disk usage per [[by]].\n\n The dashed line represent the total size.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byFrameRefID", - "options": "B" - }, - "properties": [ - { - "id": "custom.lineStyle", - "value": { - "dash": [ - 10, - 10 - ], - "fill": "dash" - } - }, - { - "id": "custom.lineWidth", - "value": 2 - } - ] - } - ] - }, - "gridPos": { - "h": 6, - "w": 3, - "x": 1, - "y": 15 - }, - "id": 24, - "links": [], - "options": { - "class": "desc_tooltip_options", - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 5, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "Avg(node_filesystem_size_bytes{mountpoint=\"$mount_point\", dc=~\"$dc\", instance=~\"$node\"}) by ([[by]])-avg(node_filesystem_avail_bytes{mountpoint=\"$mount_point\", dc=~\"$dc\", instance=~\"$node\"}) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "Avg Usage {{instance}} {{shard}}", - "metric": "", - "refId": "A", - "step": 1 - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "avg(node_filesystem_size_bytes{mountpoint=\"$mount_point\", dc=~\"$dc\", instance=~\"$node\"}) by ([[by]])", - "interval": "", - "legendFormat": "Size {{instance}} {{shard}}", - "refId": "B" - } - ], - "title": "Average Disk Usage", - "type": "timeseries" - }, - { - "class": "graph_panel_int", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Holds the number of currently active compactions.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 4, - "x": 4, - "y": 15 - }, - "id": 25, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "span": 2, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(scylla_compaction_manager_compactions{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 1 - } - ], - "title": "Running Compactions", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "The Hits and Misses", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 8, - "y": 15 - }, - "id": 26, - "legend": { - "alignAsTable": false, - "avg": false, - "class": "show_legend", - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": false - }, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_cache_row_hits{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "Hit {{instance}} {{shard}}", - "refId": "A", - "step": 10 - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_cache_row_misses{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "Misses {{instance}} {{shard}}", - "refId": "B", - "step": 10 - } - ], - "title": "Cache Hits/Misses", - "type": "timeseries" - }, - { - "class": "small_nodes_table", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "custom": { - "cellOptions": { - "type": "auto" - }, - "filterable": true, - "inspect": false - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "orange", - "value": 85 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Value #B" - }, - "properties": [ - { - "id": "custom.cellOptions", - "value": { - "mode": "lcd", - "type": "gauge" - } - }, - { - "id": "min", - "value": 0 - }, - { - "id": "max", - "value": 101 - }, - { - "id": "displayName", - "value": "Load" - }, - { - "id": "custom.width", - "value": 120 - }, - { - "id": "custom.filterable", - "value": false - }, - { - "id": "decimals", - "value": 0 - }, - { - "id": "unit", - "value": "percent" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "svr" - }, - "properties": [ - { - "id": "custom.width", - "value": 90 - }, - { - "id": "displayName", - "value": "Version" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "instance" - }, - "properties": [ - { - "id": "custom.width", - "value": 120 - }, - { - "id": "links", - "value": [ - { - "title": "Detailed view", - "url": "/d/detailed-[[dash_version]]/detailed?refresh=30s&orgId=1&var-by=instance&var-node=${__data.fields[0]}&from=${__from}&to=${__to}" - } - ] - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #A" - }, - "properties": [ - { - "id": "custom.width", - "value": 105 - }, - { - "id": "displayName", - "value": "Status" - }, - { - "id": "custom.cellOptions", - "value": { - "type": "color-text" - } - }, - { - "id": "thresholds", - "value": { - "mode": "absolute", - "steps": [ - { - "color": "yellow", - "value": null - }, - { - "color": "rgb(87, 128, 193)", - "value": 3 - }, - { - "color": "red", - "value": 4 - } - ] - } - }, - { - "id": "custom.align", - "value": "center" - }, - { - "id": "mappings", - "value": [ - { - "options": { - "1": { - "text": "Starting" - }, - "2": { - "text": "Joining" - }, - "3": { - "text": "Normal" - }, - "4": { - "text": "Leaving" - }, - "5": { - "text": "Decommissioned" - }, - "6": { - "text": "Draining" - }, - "7": { - "text": "Drained" - }, - "8": { - "text": "Moving" - }, - "9": { - "text": "Split-Cluster" - } - }, - "type": "value" - } - ] - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #C" - }, - "properties": [ - { - "id": "links", - "value": [ - { - "title": "OS Information Dashboard, an Error indicates there are OS related errors", - "url": "/d/OS-[[dash_version]]/os-metrics?refresh=30s&orgId=1&var-by=instance&var-node=${__data.fields[0]}&from=${__from}&to=${__to}" - } - ] - }, - { - "id": "custom.width", - "value": 90 - }, - { - "id": "custom.filterable", - "value": true - }, - { - "id": "mappings", - "value": [ - { - "options": { - "0": { - "text": "OS Info" - } - }, - "type": "value" - }, - { - "options": { - "from": 0, - "result": { - "text": "OS Errors" - }, - "to": 100000 - }, - "type": "range" - } - ] - }, - { - "id": "thresholds", - "value": { - "mode": "absolute", - "steps": [ - { - "color": "rgb(87, 128, 193)", - "value": null - }, - { - "color": "dark-orange", - "value": 0.001 - } - ] - } - }, - { - "id": "custom.cellOptions", - "value": { - "type": "color-text" - } - }, - { - "id": "custom.align", - "value": "left" - }, - { - "id": "displayName", - "value": "OS" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #D" - }, - "properties": [ - { - "id": "links", - "value": [ - { - "title": "Cordinator and Replica node errors", - "url": "/d/detailed-[[dash_version]]/detailed?refresh=30s&orgId=1&var-by=instance&var-node=${__data.fields[0]}&from=${__from}&to=${__to}" - } - ] - }, - { - "id": "custom.width", - "value": 80 - }, - { - "id": "custom.filterable", - "value": true - }, - { - "id": "mappings", - "value": [ - { - "options": { - "0": { - "text": "" - }, - "1": { - "text": "Errors" - } - }, - "type": "value" - } - ] - }, - { - "id": "thresholds", - "value": { - "mode": "absolute", - "steps": [ - { - "color": "rgb(87, 128, 193)", - "value": null - }, - { - "color": "dark-orange", - "value": 0.001 - } - ] - } - }, - { - "id": "custom.cellOptions", - "value": { - "type": "color-text" - } - }, - { - "id": "custom.align", - "value": "left" - }, - { - "id": "displayName", - "value": " " - } - ] - }, - { - "dashversion": [ - ">5.2", - ">2023.1" - ], - "matcher": { - "id": "byName", - "options": "Value #G" - }, - "properties": [ - { - "id": "custom.cellOptions", - "value": { - "mode": "lcd", - "type": "gauge" - } - }, - { - "id": "min", - "value": 0 - }, - { - "id": "max", - "value": 101 - }, - { - "id": "displayName", - "value": "Streaming" - }, - { - "id": "custom.width", - "value": 90 - }, - { - "id": "custom.filterable", - "value": false - }, - { - "id": "decimals", - "value": 0 - }, - { - "id": "thresholds", - "value": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - } - }, - { - "id": "unit", - "value": "percent" - } - ] - } - ] - }, - "gridPos": { - "h": 17, - "w": 10, - "x": 14, - "y": 15 - }, - "id": 27, - "options": { - "cellHeight": "sm", - "footer": { - "countRows": false, - "fields": "", - "reducer": [ - "sum" - ], - "show": false - }, - "showHeader": true - }, - "pluginVersion": "10.1.1", - "span": 8, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "0*scylla_scylladb_current_version{cluster=\"$cluster\", dc=~\"$dc\"} + on (instance) group_left() (scylla_node_operation_mode{cluster=\"$cluster\", dc=~\"$dc\"}!= 3 or on (instance) ((scylla_gossip_live{cluster=\"$cluster\", dc=~\"$dc\"}+1< bool scalar(count(scylla_node_operation_mode{cluster=\"$cluster\"}==3)))*6 + 3))", - "format": "table", - "hide": false, - "instant": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "avg(scylla_reactor_utilization{cluster=~\"$cluster\", dc=~\"$dc\"} ) by (instance)", - "format": "table", - "instant": true, - "interval": "", - "legendFormat": "", - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "sum(rate(scylla_reactor_aio_errors{cluster=~\"$cluster\", dc=~\"$dc\"}[$__rate_interval])) by (instance)", - "format": "table", - "instant": true, - "interval": "", - "legendFormat": "", - "refId": "C" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "sum(scylla_errors:nodes_total{cluster=~\"$cluster\", dc=~\"$dc\"}) by (instance) >bool 0", - "format": "table", - "instant": true, - "interval": "", - "legendFormat": "", - "refId": "D" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "(sum(scylla_cql:non_system_prepared1m{cluster=~\"$cluster\", dc=~\"$dc\"}) by (instance) >bool 1) + (sum(rate(scylla_cql_reverse_queries{cluster=~\"$cluster\", dc=~\"$dc\"}[$__rate_interval])) by(instance) >bool 1) + (sum(scylla_cql:non_paged_no_system1m{cluster=~\"$cluster\", dc=~\"$dc\"}) by (instance) >bool 1)", - "format": "table", - "instant": true, - "interval": "", - "legendFormat": "", - "refId": "E" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "sum(scylla_gossip_live{cluster=\"$cluster\"})by (instance)", - "format": "table", - "instant": true, - "interval": "", - "legendFormat": "", - "refId": "F" - }, - { - "dashversion": [ - ">5.2", - ">2023.1" - ], - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "(min(scylla_streaming_finished_percentage{cluster=\"$cluster\", dc=~\"$dc\"}*100) by (instance) < 100) or on (instance) 0*sum(scylla_scylladb_current_version{cluster=\"$cluster\", dc=~\"$dc\"}) by (instance)", - "format": "table", - "instant": true, - "interval": "", - "legendFormat": "", - "refId": "G" - } - ], - "title": "Nodes", - "transformations": [ - { - "id": "filterFieldsByName", - "options": { - "include": { - "names": [ - "instance", - "svr", - "Value #A", - "Value #B", - "Value #C", - "Value #D", - "Value #E", - "Value #F", - "Value #G" - ] - } - } - }, - { - "id": "seriesToColumns", - "options": { - "byField": "instance" - } - }, - { - "id": "organize", - "options": { - "excludeByName": {}, - "indexByName": { - "Value #A": 5, - "Value #B": 7, - "Value #C": 3, - "Value #D": 1, - "Value #E": 2, - "Value #F": 6, - "Value #G": 8, - "instance": 0, - "svr": 4 - }, - "renameByName": {} - } - } - ], - "type": "table" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Write attempts - include all writes that reached the coordinator node, even if they will eventually fail", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 21 - }, - "id": 28, - "legend": { - "alignAsTable": false, - "avg": false, - "class": "show_legend", - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": false - }, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - { - "alias": "1 Day Ago", - "dashLength": 4, - "dashes": true - }, - { - "alias": "1 Week Ago", - "dashLength": 2, - "dashes": true - } - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_storage_proxy_coordinator_write_latency_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]) or on([[by]]) $func(rate(scylla_storage_proxy_coordinator_write_latency_summary_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "Writes {{instance}} {{shard}}", - "refId": "A", - "step": 1 - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_storage_proxy_coordinator_write_latency_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval] offset 1d)) or on ([[by]]) $func(rate(scylla_storage_proxy_coordinator_write_latency_summary_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval] offset 1d))", - "interval": "", - "intervalFactor": 1, - "legendFormat": "1 Day Ago", - "refId": "B", - "step": 1 - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_storage_proxy_coordinator_write_latency_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval] offset 1w)) or on ([[by]]) $func(rate(scylla_storage_proxy_coordinator_write_latency_summary_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval] offset 1w))", - "interval": "", - "intervalFactor": 1, - "legendFormat": "1 Week Ago", - "refId": "C", - "step": 1 - } - ], - "title": "Writes", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 4, - "x": 6, - "y": 21 - }, - "id": 29, - "legend": { - "alignAsTable": false, - "avg": false, - "class": "show_legend", - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": false - }, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 2, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "avg(wlatencyp95{by=\"[[by]]\", instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"}>0) by (scheduling_group_name, [[by]])", - "intervalFactor": 1, - "legendFormat": "{{scheduling_group_name}} 95% {{instance}} {{shard}}", - "refId": "A", - "step": 1 - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "avg(wlatencyp99{by=\"[[by]]\", instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"}>0) by (scheduling_group_name, [[by]])", - "intervalFactor": 1, - "legendFormat": "{{scheduling_group_name}} 99% {{instance}} {{shard}}", - "refId": "B", - "step": 1 - } - ], - "title": "Write Latencies", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Requests that Scylla tried to write but timed out. Timeouts are counted in the node that received the request (the coordinator), not at the replicas.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 4, - "x": 10, - "y": 21 - }, - "id": 30, - "legend": { - "alignAsTable": false, - "avg": false, - "class": "show_legend", - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": false - }, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 2, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_storage_proxy_coordinator_write_timeouts{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "Writes {{instance}} {{shard}}", - "refId": "A", - "step": 10 - } - ], - "title": "Write Timeouts by [[by]]", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Read attempts - include all reads that reached the coordinator node, even if they will eventually fail", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 27 - }, - "id": 31, - "legend": { - "alignAsTable": false, - "avg": false, - "class": "show_legend", - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": false - }, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - { - "alias": "1 Day Ago", - "dashLength": 4, - "dashes": true - }, - { - "alias": "1 Week Ago", - "dashLength": 2, - "dashes": true - } - ], - "span": 3, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_storage_proxy_coordinator_read_latency_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\",scheduling_group_name=~\"$sg\"}[$__rate_interval])) by ([[by]]) or on([[by]]) $func(rate(scylla_storage_proxy_coordinator_read_latency_summary_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\",scheduling_group_name=~\"$sg\"}[$__rate_interval])) by ([[by]])", - "intervalFactor": 1, - "legendFormat": "Reads {{instance}} {{shard}}", - "refId": "A", - "step": 1 - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_storage_proxy_coordinator_read_latency_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\",scheduling_group_name=~\"$sg\"}[$__rate_interval] offset 1d)) or on ([[by]]) $func(rate(scylla_storage_proxy_coordinator_read_latency_summary_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\",scheduling_group_name=~\"$sg\"}[$__rate_interval] offset 1d))", - "intervalFactor": 1, - "legendFormat": "1 Day Ago", - "refId": "B", - "step": 1 - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "$func(rate(scylla_storage_proxy_coordinator_read_latency_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\",scheduling_group_name=~\"$sg\"}[$__rate_interval] offset 1w)) or on ([[by]]) $func(rate(scylla_storage_proxy_coordinator_read_latency_summary_count{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\",scheduling_group_name=~\"$sg\"}[$__rate_interval] offset 1w))", - "intervalFactor": 1, - "legendFormat": "1 Week Ago", - "refId": "C", - "step": 1 - } - ], - "title": "Reads", - "type": "timeseries" - }, - { - "class": "us_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "µs" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 4, - "x": 6, - "y": 27 - }, - "id": 32, - "legend": { - "alignAsTable": false, - "avg": false, - "class": "show_legend", - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": false - }, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 2, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "avg(rlatencyp95{by=\"[[by]]\", instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"}>0) by(scheduling_group_name, [[by]])", - "intervalFactor": 1, - "legendFormat": "{{scheduling_group_name}} 95% {{instance}} {{shard}}", - "refId": "A", - "step": 1 - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "avg(rlatencyp99{by=\"[[by]]\", instance=~\"[[node]]|^$\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]|$^\",scheduling_group_name=~\"$sg\"}>0) by(scheduling_group_name, [[by]])", - "intervalFactor": 1, - "legendFormat": "{{scheduling_group_name}} 99% {{instance}} {{shard}}", - "refId": "B", - "step": 1 - } - ], - "title": "Read Latencies", - "type": "timeseries" - }, - { - "class": "ops_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "Requests that Scylla tried to read but timed out. Timeouts are counted in the node that received the request (the coordinator), not at the replicas.", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 4, - "x": 10, - "y": 27 - }, - "id": 33, - "legend": { - "alignAsTable": false, - "avg": false, - "class": "show_legend", - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": false - }, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 2, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "($func(rate(scylla_storage_proxy_coordinator_read_timeouts{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]) or vector(0))+on([[by]]) ($func(rate(scylla_storage_proxy_coordinator_cas_read_timeouts{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]) or vector(0))+on([[by]]) ($func(rate(scylla_storage_proxy_coordinator_range_timeouts{instance=~\"[[node]]\",cluster=\"$cluster\", dc=~\"$dc\", shard=~\"[[shard]]\"}[$__rate_interval])) by ([[by]]) or vector(0))", - "intervalFactor": 1, - "legendFormat": "Read {{instance}} {{shard}}", - "refId": "A", - "step": 10 - } - ], - "title": "Read Timeouts by [[by]]", - "type": "timeseries" - }, - { - "class": "plain_text", - "dashproductreject": "no-version-check", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 1, - "w": 10, - "x": 14, - "y": 32 - }, - "id": 34, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "plain_text", - "dashproduc": "no-version-check", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 1, - "w": 10, - "x": 14, - "y": 33 - }, - "id": 35, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 34 - }, - "id": 36, - "panels": [], - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "type": "row" - }, - { - "class": "collapsible_row_panel", - "collapsed": false, - "dashproductreject": "no-your-pannels", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 35 - }, - "id": 37, - "panels": [], - "repeat": "", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Your panels", - "type": "row" - }, - { - "class": "plain_text", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 36 - }, - "id": 38, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "

Your Panels

", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - }, - { - "class": "user_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "This graph panel was left empty on purpose for ad-hoc usage. Change it when needed. Pay attention that changes to the panel will not be saved.\n\nIf you do need a panel that can be saved, create a new dashboard, or edit the panel inside the json file", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 38 - }, - "id": 39, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 6, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Your Graph here", - "type": "timeseries" - }, - { - "class": "user_panel", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "description": "This graph panel was left empty on purpose for ad-hoc usage. Change it when needed. Pay attention that changes to the panel will not be saved.\n\nIf you do need a panel that can be saved, create a new dashboard, or edit the panel inside the json file", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "si:ops/s" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 12, - "x": 12, - "y": 38 - }, - "id": 40, - "links": [], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "desc" - } - }, - "seriesOverrides": [ - {} - ], - "span": 6, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "title": "Your Graph here", - "type": "timeseries" - }, - { - "class": "plain_text", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editable": true, - "error": false, - "gridPos": { - "h": 3, - "w": 24, - "x": 0, - "y": 44 - }, - "id": 41, - "links": [], - "mode": "html", - "options": { - "code": { - "language": "plaintext", - "showLineNumbers": false, - "showMiniMap": false - }, - "content": "
Scylla Monitoring version - 4.9.4
\n    
", - "mode": "html" - }, - "pluginVersion": "10.1.1", - "span": 12, - "style": {}, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "refId": "A" - } - ], - "transparent": true, - "type": "text" - } - ], - "refresh": "10s", - "schemaVersion": 38, - "style": "dark", - "tags": [ - "6.2" - ], - "templating": { - "list": [ - { - "class": "by_template_var", - "current": { - "tags": [], - "text": "DC", - "value": "dc" - }, - "hide": 0, - "includeAll": false, - "label": "by", - "multi": false, - "name": "by", - "options": [ - { - "selected": false, - "text": "Cluster", - "value": "cluster" - }, - { - "selected": true, - "text": "DC", - "value": "dc" - }, - { - "selected": false, - "text": "Instance", - "value": "instance" - }, - { - "selected": false, - "text": "instance,shard", - "value": "instance,shard" - } - ], - "query": "Cluster : cluster,DC : dc, Instance : instance, Shard : instance\\,shard", - "skipUrlSync": false, - "type": "custom" - }, - { - "class": "template_variable_single", - "current": { - "selected": false, - "text": "scylla", - "value": "scylla" - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": false, - "label": "cluster", - "multi": false, - "name": "cluster", - "options": [], - "query": "label_values(scylla_reactor_utilization, cluster)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "label": "dc", - "multi": true, - "name": "dc", - "options": [], - "query": "label_values(scylla_reactor_utilization{cluster=~\"$cluster\"}, dc)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "label": "node", - "multi": true, - "name": "node", - "options": [], - "query": "label_values(scylla_reactor_utilization{cluster=\"$cluster\", dc=~\"$dc\"}, instance)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".+", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "label": "shard", - "multi": true, - "name": "shard", - "options": [], - "query": "label_values(scylla_reactor_utilization{cluster=\"$cluster\"},shard)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 3, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "class": "template_variable_single", - "current": { - "selected": false, - "text": "/mnt/disks/raid", - "value": "/mnt/disks/raid" - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": false, - "label": "Mount path", - "multi": false, - "name": "mount_point", - "options": [], - "query": "node_filesystem_avail_bytes", - "refresh": 2, - "regex": "/mountpoint=\"([^\"]*)\".*/", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "label": "SG", - "multi": true, - "name": "sg", - "options": [], - "query": "label_values(scylla_scheduler_runtime_ms{cluster=~\"$cluster\", group!~\"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache\"},group)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 3, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "class": "aggregation_function", - "current": { - "tags": [], - "text": "sum", - "value": "sum" - }, - "hide": 0, - "includeAll": false, - "label": "Function", - "multi": false, - "name": "func", - "options": [ - { - "selected": true, - "text": "sum", - "value": "sum" - }, - { - "selected": false, - "text": "avg", - "value": "avg" - }, - { - "selected": false, - "text": "max", - "value": "max" - }, - { - "selected": false, - "text": "min", - "value": "min" - }, - { - "selected": false, - "text": "stddev", - "value": "stddev" - }, - { - "selected": false, - "text": "stdvar", - "value": "stdvar" - } - ], - "query": "sum,avg,max,min,stddev,stdvar", - "skipUrlSync": false, - "type": "custom" - }, - { - "class": "template_variable_custom", - "current": { - "text": "6-2", - "value": "6-2" - }, - "hide": 2, - "includeAll": false, - "multi": false, - "name": "dash_version", - "options": [ - { - "selected": true, - "text": "6-2", - "value": "6-2" - } - ], - "query": "6-2", - "skipUrlSync": false, - "type": "custom" - }, - { - "allValue": ".*", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "", - "hide": 2, - "includeAll": true, - "multi": true, - "name": "all_scyllas_versions", - "options": [], - "query": "label_values(scylla_scylladb_current_version{cluster=\"$cluster\"}, version)", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "class": "template_variable_all", - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "query_result(count(up{job=\"scylla\"}) by (dc))", - "hide": 2, - "includeAll": true, - "multi": true, - "name": "count_dc", - "options": [], - "query": { - "query": "query_result(count(up{job=\"scylla\"}) by (dc))", - "refId": "StandardVariableQuery" - }, - "refresh": 2, - "regex": "/(?\\{dc=\"[^\"]+\".* \\d+) .*/", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "class": "template_variable_custom", - "current": { - "text": "6.2", - "value": "6.2" - }, - "hide": 2, - "includeAll": false, - "multi": false, - "name": "scylla_version", - "options": [ - { - "selected": true, - "text": "6.2", - "value": "6.2" - } - ], - "query": "6.2", - "skipUrlSync": false, - "type": "custom" - }, - { - "class": "monitor_version_var", - "current": { - "text": "4.9.4", - "value": "4.9.4" - }, - "hide": 2, - "includeAll": false, - "multi": false, - "name": "monitoring_version", - "options": [ - { - "selected": true, - "text": "4.9.4", - "value": "4.9.4" - } - ], - "query": "4.9.4", - "skipUrlSync": false, - "type": "custom" - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "now": true, - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "browser", - "title": "Overview", - "uid": "overview-6-2", - "version": 1, - "weekStart": "" - } \ No newline at end of file diff --git a/kubernetes/linera-validator/helmfile.yaml b/kubernetes/linera-validator/helmfile.yaml deleted file mode 100644 index 4a900ede80d7..000000000000 --- a/kubernetes/linera-validator/helmfile.yaml +++ /dev/null @@ -1,217 +0,0 @@ -environments: - default: - values: - - writeToGrafanaCloud: {{ env "LINERA_WRITE_TO_GRAFANA_CLOUD" | default "false" }} - validatorLabel: {{ env "LINERA_VALIDATOR_LABEL" | default (printf "local-%s" (env "USER")) }} - usingLocalSsd: {{ env "LINERA_HELMFILE_SET_USING_LOCAL_SSD" | default "false" }} - gcpRun: {{ env "LINERA_HELMFILE_SET_GCP_RUN" | default "false" }} - kubeContext: {{ env "LINERA_HELMFILE_SET_KUBE_CONTEXT" | default "" }} - kubeConfigPath: {{ env "KUBECONFIG" | default "" }} - dualStore: {{ env "LINERA_HELMFILE_SET_DUAL_STORE" | default "false" }} - -helmDefaults: - wait: true - recreatePods: false - kubeContext: {{ .Values.kubeContext | quote }} - -hooks: - - events: ["prepare"] - showlogs: true - command: bash - args: - - -c - - | - set -euxo pipefail - - kube_args=( - {{- if .Values.kubeContext }} - --context {{ .Values.kubeContext }} - {{- end }} - {{- if .Values.kubeConfigPath }} - --kubeconfig {{ .Values.kubeConfigPath }} - {{- end }} - ) - - echo "Installing Prometheus ServiceMonitor CRD…" - kubectl "${kube_args[@]}" apply -f crds/servicemonitor.yaml -{{- if and .Values.gcpRun .Values.usingLocalSsd }} - - events: ["prepare"] - showlogs: true - command: bash - args: - - -c - - | - set -euxo pipefail - - kube_args=( - {{- if .Values.kubeContext }} - --context {{ .Values.kubeContext }} - {{- end }} - {{- if .Values.kubeConfigPath }} - --kubeconfig {{ .Values.kubeConfigPath }} - {{- end }} - ) - - echo "Ensuring RAID0 and Local‑CSI driver are setup..." - - kubectl "${kube_args[@]}" apply -f ./scylla-setup/gke-daemonset-raid-disks.yaml - kubectl "${kube_args[@]}" -n default rollout status daemonset/gke-raid-disks -{{- end }} - ---- - -repositories: - - name: scylla - url: https://scylla-operator-charts.storage.googleapis.com/stable - - name: jetstack - url: https://charts.jetstack.io - - name: prometheus-community - url: https://prometheus-community.github.io/helm-charts - - name: grafana - url: https://grafana.github.io/helm-charts - -releases: - - name: linera-core - namespace: default - chart: . - timeout: 900 - needs: - - scylla/scylla - values: - {{ if .Values.writeToGrafanaCloud -}} - - grafanaCloudUsername: {{ fetchSecretValue (env "LINERA_GRAFANA_CLOUD_USERNAME_SECRET") | quote }} - grafanaCloudAPIToken: {{ fetchSecretValue (env "LINERA_GRAFANA_CLOUD_API_TOKEN_SECRET") | quote }} - {{- end }} - - writeToGrafanaCloud: {{ .Values.writeToGrafanaCloud }} - - {{ env "LINERA_HELMFILE_VALUES_LINERA_CORE" | default "values-local.yaml.gotmpl" }} - set: - - name: crds.enabled - value: "true" - - name: scylla - version: v1.16.0 - namespace: scylla - chart: scylla/scylla - timeout: 900 - needs: - - scylla-manager/scylla-manager - - scylla-operator/scylla-operator - values: - - {{ env "LINERA_HELMFILE_VALUES_SCYLLA" | default "scylla.values.yaml.gotmpl" }} - hooks: - - events: ["presync"] - showlogs: true - command: bash - args: - - -c - - | - set -euxo pipefail - - kube_args=( - {{- if .Values.kubeContext }} - --context {{ .Values.kubeContext }} - {{- end }} - {{- if .Values.kubeConfigPath }} - --kubeconfig {{ .Values.kubeConfigPath }} - {{- end }} - ) - - echo "Ensuring scylla namespace exists..." - kubectl "${kube_args[@]}" create namespace scylla 2>/dev/null || true - - echo "Ensuring scylla-config ConfigMap exists before deploying ScyllaCluster..." - kubectl "${kube_args[@]}" apply -f templates/scylla-config.yaml - - echo "Ensuring scylla-agent-config Secret exists for Manager backup..." - kubectl "${kube_args[@]}" apply -f templates/scylla-agent-gcs-config.yaml - {{- if and .Values.gcpRun .Values.usingLocalSsd }} - - events: ["presync"] - showlogs: true - command: bash - args: - - -c - - | - set -euxo pipefail - - kube_args=( - {{- if .Values.kubeContext }} - --context {{ .Values.kubeContext }} - {{- end }} - {{- if .Values.kubeConfigPath }} - --kubeconfig {{ .Values.kubeConfigPath }} - {{- end }} - ) - - echo "Deploy NodeConfig, Local-CSI driver and StorageClass" - - kubectl "${kube_args[@]}" apply -f ./scylla-setup/nodeconfig.yaml - kubectl "${kube_args[@]}" wait --for=condition=Progressing=False --timeout=10m nodeconfig/scylla-nvme - kubectl "${kube_args[@]}" wait --for=condition=Degraded=False --timeout=10m nodeconfig/scylla-nvme - kubectl "${kube_args[@]}" wait --for=condition=Available=True --timeout=10m nodeconfig/scylla-nvme - - kubectl "${kube_args[@]}" apply -f ./scylla-setup/local-csi-driver - kubectl "${kube_args[@]}" -n local-csi-driver rollout status daemonset/local-csi-driver --timeout=5m - - kubectl "${kube_args[@]}" apply -f ./scylla-setup/local-ssd-sc.yaml - {{- end }} - - name: scylla-manager - version: v1.16.0 - namespace: scylla-manager - chart: scylla/scylla-manager - timeout: 900 - needs: - - scylla-operator/scylla-operator - values: - - {{ env "LINERA_HELMFILE_VALUES_SCYLLA_MANAGER" | default "scylla-manager.values.yaml" }} - - name: scylla-operator - version: v1.16.0 - namespace: scylla-operator - chart: scylla/scylla-operator - timeout: 900 - needs: - - cert-manager/cert-manager - values: - - {{ env "LINERA_HELMFILE_VALUES_SCYLLA_OPERATOR" | default "scylla-operator.values.yaml" }} - - name: cert-manager - version: v1.17.0 - namespace: cert-manager - chart: jetstack/cert-manager - timeout: 900 - set: - - name: crds.enabled - value: "true" - - name: tempo - version: 1.23.3 - namespace: tempo - chart: grafana/tempo - timeout: 900 - installed: {{ ne (env "LINERA_HELMFILE_SET_OTLP_EXPORTER_ENDPOINT" | default "") "" }} - values: - - {{ env "LINERA_HELMFILE_VALUES_LINERA_CORE" | default "values-local.yaml.gotmpl" }} - - name: observability-alloy - version: 1.3.1 - namespace: monitoring - chart: grafana/alloy - timeout: 900 - installed: {{ eq (env "LINERA_HELMFILE_SET_ENABLE_OBSERVABILITY_ALLOY" | default "false") "true" }} - values: - - {{ env "LINERA_HELMFILE_VALUES_OBSERVABILITY_ALLOY" | default "values-observability-alloy.yaml.gotmpl" }} - hooks: - - events: ["presync"] - showlogs: true - command: bash - args: - - -c - - | - set -euxo pipefail - - kube_args=( - {{- if .Values.kubeContext }} - --context {{ .Values.kubeContext }} - {{- end }} - {{- if .Values.kubeConfigPath }} - --kubeconfig {{ .Values.kubeConfigPath }} - {{- end }} - ) - - echo "Ensuring monitoring namespace exists..." - kubectl "${kube_args[@]}" create namespace monitoring 2>/dev/null || true diff --git a/kubernetes/linera-validator/scylla-manager.values.yaml b/kubernetes/linera-validator/scylla-manager.values.yaml deleted file mode 100644 index 9aa789f52394..000000000000 --- a/kubernetes/linera-validator/scylla-manager.values.yaml +++ /dev/null @@ -1,31 +0,0 @@ -resources: - requests: - cpu: 100m - memory: 200Mi -# Resources allocated to Scylla Manager pods -controllerResources: - requests: - cpu: 100m - memory: 200Mi - -scylla: - developerMode: true - scyllaImage: - tag: 6.2.1 - agentImage: - tag: 3.4.1 - datacenter: validator - racks: - - name: manager-rack - members: 1 - storage: - capacity: 5Gi - resources: - limits: - cpu: 1 - memory: 2Gi - requests: - cpu: 1 - memory: 2Gi -serviceMonitor: - create: true diff --git a/kubernetes/linera-validator/scylla-operator.values.yaml b/kubernetes/linera-validator/scylla-operator.values.yaml deleted file mode 100644 index dfe5d2bb1539..000000000000 --- a/kubernetes/linera-validator/scylla-operator.values.yaml +++ /dev/null @@ -1,3 +0,0 @@ -webhook: - createSelfSignedCertificate: true - certificateSecretName: "" diff --git a/kubernetes/linera-validator/scylla-setup/gke-daemonset-raid-disks.yaml b/kubernetes/linera-validator/scylla-setup/gke-daemonset-raid-disks.yaml deleted file mode 100644 index 187cd87e0424..000000000000 --- a/kubernetes/linera-validator/scylla-setup/gke-daemonset-raid-disks.yaml +++ /dev/null @@ -1,68 +0,0 @@ -apiVersion: apps/v1 -kind: DaemonSet -metadata: - name: gke-raid-disks - namespace: default - labels: - k8s-app: gke-raid-disks -spec: - selector: - matchLabels: - name: gke-raid-disks - template: - metadata: - labels: - name: gke-raid-disks - spec: - nodeSelector: - cloud.google.com/gke-local-nvme-ssd: "true" - hostPID: true - containers: - - name: startup-script - image: registry.k8s.io/startup-script:v2 - securityContext: - privileged: true - env: - - name: STARTUP_SCRIPT - value: | - set -o errexit - set -o nounset - set -o pipefail - - # Ensure we have the XFS tools - if ! command -v mkfs.xfs >/dev/null; then - echo "mkfs.xfs not found! Installing xfsprogs..." - apt-get update - DEBIAN_FRONTEND=noninteractive \ - apt-get install -y --no-install-recommends xfsprogs - fi - - devices=() - for ssd in /dev/disk/by-id/google-local-ssd-block*; do - if [ -e "${ssd}" ]; then - devices+=("${ssd}") - fi - done - if [ "${#devices[@]}" -eq 0 ]; then - echo "No Local NVMe SSD disks found." - exit 1 - fi - - seen_arrays=(/dev/md/*) - device=${seen_arrays[0]} - echo "Setting RAID array with Local SSDs on device ${device}" - if [ ! -e "$device" ]; then - device="/dev/md/0" - echo "y" | mdadm --create "${device}" --level=0 --force --raid-devices=${#devices[@]} "${devices[@]}" - fi - - if ! blkid "${device}" >/dev/null 2>&1 ; then - echo "Formatting '${device}'" - mkfs.xfs -f "${device}" - fi - - mountpoint=/mnt/disks/raid - mkdir -p "${mountpoint}" - echo "Mounting '${device}' at '${mountpoint}'" - mount -o discard,prjquota,noatime,nodiratime "${device}" "${mountpoint}" - chmod a+w "${mountpoint}" diff --git a/kubernetes/linera-validator/scylla-setup/local-csi-driver/00_namespace.yaml b/kubernetes/linera-validator/scylla-setup/local-csi-driver/00_namespace.yaml deleted file mode 100644 index 56971bae6e57..000000000000 --- a/kubernetes/linera-validator/scylla-setup/local-csi-driver/00_namespace.yaml +++ /dev/null @@ -1,4 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: local-csi-driver diff --git a/kubernetes/linera-validator/scylla-setup/local-csi-driver/10_csidriver.yaml b/kubernetes/linera-validator/scylla-setup/local-csi-driver/10_csidriver.yaml deleted file mode 100644 index b8c07f29dfa7..000000000000 --- a/kubernetes/linera-validator/scylla-setup/local-csi-driver/10_csidriver.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: storage.k8s.io/v1 -kind: CSIDriver -metadata: - name: local.csi.scylladb.com -spec: - attachRequired: false - storageCapacity: true diff --git a/kubernetes/linera-validator/scylla-setup/local-csi-driver/10_driver_serviceaccount.yaml b/kubernetes/linera-validator/scylla-setup/local-csi-driver/10_driver_serviceaccount.yaml deleted file mode 100644 index 9a5ca4e31f25..000000000000 --- a/kubernetes/linera-validator/scylla-setup/local-csi-driver/10_driver_serviceaccount.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: v1 -kind: ServiceAccount -metadata: - name: local-csi-driver - namespace: local-csi-driver diff --git a/kubernetes/linera-validator/scylla-setup/local-csi-driver/10_provisioner_clusterrole.yaml b/kubernetes/linera-validator/scylla-setup/local-csi-driver/10_provisioner_clusterrole.yaml deleted file mode 100644 index c211a270b2fa..000000000000 --- a/kubernetes/linera-validator/scylla-setup/local-csi-driver/10_provisioner_clusterrole.yaml +++ /dev/null @@ -1,100 +0,0 @@ -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: scylladb:csi-external-provisioner -rules: -- apiGroups: - - "" - resources: - - "persistentvolumes" - verbs: - - "get" - - "list" - - "watch" - - "create" - - "delete" -- apiGroups: - - "" - resources: - - "persistentvolumeclaims" - verbs: - - "get" - - "list" - - "watch" - - "update" -- apiGroups: - - "storage.k8s.io" - resources: - - "storageclasses" - verbs: - - "get" - - "list" - - "watch" -- apiGroups: - - "" - resources: - - "events" - verbs: - - "list" - - "watch" - - "create" - - "update" - - "patch" -- apiGroups: - - "snapshot.storage.k8s.io" - resources: - - "volumesnapshots" - verbs: - - "get" - - "list" -- apiGroups: - - "snapshot.storage.k8s.io" - resources: - - "volumesnapshotcontents" - verbs: - - "get" - - "list" -- apiGroups: - - "storage.k8s.io" - resources: - - "csinodes" - verbs: - - "get" - - "list" - - "watch" -- apiGroups: - - "" - resources: - - "nodes" - verbs: - - "get" - - "list" - - "watch" -- apiGroups: - - "storage.k8s.io" - resources: - - "csistoragecapacities" - verbs: - - "get" - - "list" - - "watch" - - "create" - - "update" - - "patch" - - "delete" -# The GET permissions below are needed for walking up the ownership chain -# for CSIStorageCapacity. They are sufficient for deployment via -# StatefulSet (only needs to get Pod) and Deployment (needs to get -# Pod and then ReplicaSet to find the Deployment). -- apiGroups: - - "" - resources: - - "pods" - verbs: - - "get" -- apiGroups: - - "apps" - resources: - - "replicasets" - verbs: - - "get" diff --git a/kubernetes/linera-validator/scylla-setup/local-csi-driver/20_provisioner_clusterrolebinding.yaml b/kubernetes/linera-validator/scylla-setup/local-csi-driver/20_provisioner_clusterrolebinding.yaml deleted file mode 100644 index f86956a82593..000000000000 --- a/kubernetes/linera-validator/scylla-setup/local-csi-driver/20_provisioner_clusterrolebinding.yaml +++ /dev/null @@ -1,12 +0,0 @@ -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: scylladb:csi-external-provisioner -subjects: -- kind: ServiceAccount - name: local-csi-driver - namespace: local-csi-driver -roleRef: - kind: ClusterRole - name: scylladb:csi-external-provisioner - apiGroup: rbac.authorization.k8s.io diff --git a/kubernetes/linera-validator/scylla-setup/local-csi-driver/50_daemonset.yaml b/kubernetes/linera-validator/scylla-setup/local-csi-driver/50_daemonset.yaml deleted file mode 100644 index 73d7cb2b9c0a..000000000000 --- a/kubernetes/linera-validator/scylla-setup/local-csi-driver/50_daemonset.yaml +++ /dev/null @@ -1,125 +0,0 @@ -kind: DaemonSet -apiVersion: apps/v1 -metadata: - name: local-csi-driver - namespace: local-csi-driver - labels: - app.kubernetes.io/name: local-csi-driver -spec: - selector: - matchLabels: - app.kubernetes.io/name: local-csi-driver - template: - metadata: - labels: - app.kubernetes.io/name: local-csi-driver - spec: - nodeSelector: - kubernetes.io/os: linux - cloud.google.com/gke-local-nvme-ssd: "true" - serviceAccountName: local-csi-driver - tolerations: - - operator: Exists - containers: - - name: local-csi-driver - securityContext: - privileged: true - image: docker.io/scylladb/local-csi-driver:latest - imagePullPolicy: IfNotPresent - args: - - --listen=/csi/csi.sock - - --node-name=$(NODE_NAME) - - --volumes-dir=/mnt/disks/raid - - --v=2 - env: - - name: NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - volumeMounts: - - name: kubelet-dir - mountPath: /var/lib/kubelet - mountPropagation: "Bidirectional" - - name: plugin-dir - mountPath: /csi - - name: volumes-dir - mountPath: /mnt/disks/raid - ports: - - name: healthz - containerPort: 9809 - protocol: TCP - livenessProbe: - httpGet: - path: /healthz - port: healthz - initialDelaySeconds: 10 - timeoutSeconds: 3 - periodSeconds: 2 - failureThreshold: 5 - - name: csi-driver-registrar - image: registry.k8s.io/sig-storage/csi-node-driver-registrar@sha256:fdff3ee285341bc58033b6b2458a5d45fd90ec6922a8ba6ebdd49b0c41e2cd34 - imagePullPolicy: IfNotPresent - args: - - --csi-address=/csi/csi.sock - - --kubelet-registration-path=/var/lib/kubelet/plugins/local.csi.scylladb.com/csi.sock - volumeMounts: - - name: plugin-dir - mountPath: /csi - - name: registration-dir - mountPath: /registration - - name: liveness-probe - image: registry.k8s.io/sig-storage/livenessprobe@sha256:cacee2b5c36dd59d4c7e8469c05c9e4ef53ecb2df9025fa8c10cdaf61bce62f0 - imagePullPolicy: IfNotPresent - args: - - --csi-address=/csi/csi.sock - - --health-port=9809 - - --v=2 - volumeMounts: - - name: plugin-dir - mountPath: /csi - - name: csi-provisioner - image: registry.k8s.io/sig-storage/csi-provisioner@sha256:ee3b525d5b89db99da3b8eb521d9cd90cb6e9ef0fbb651e98bb37be78d36b5b8 - imagePullPolicy: IfNotPresent - args: - - --csi-address=/csi/csi.sock - - --v=2 - - --node-deployment - - --feature-gates=Topology=true - - --immediate-topology=false - - --enable-capacity - - --capacity-ownerref-level=0 - - --capacity-poll-interval=30s - - --default-fstype=xfs - env: - - name: NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - volumeMounts: - - name: plugin-dir - mountPath: /csi - volumes: - - name: kubelet-dir - hostPath: - path: /var/lib/kubelet - type: Directory - - name: plugin-dir - hostPath: - path: /var/lib/kubelet/plugins/local.csi.scylladb.com/ - type: DirectoryOrCreate - - name: registration-dir - hostPath: - path: /var/lib/kubelet/plugins_registry/ - type: Directory - - name: volumes-dir - hostPath: - path: /mnt/disks/raid - type: Directory diff --git a/kubernetes/linera-validator/scylla-setup/local-ssd-sc.yaml b/kubernetes/linera-validator/scylla-setup/local-ssd-sc.yaml deleted file mode 100644 index 9f5f70620bce..000000000000 --- a/kubernetes/linera-validator/scylla-setup/local-ssd-sc.yaml +++ /dev/null @@ -1,8 +0,0 @@ -apiVersion: storage.k8s.io/v1 -kind: StorageClass -metadata: - name: nvme-ssd-block -provisioner: local.csi.scylladb.com -volumeBindingMode: WaitForFirstConsumer -parameters: - csi.storage.k8s.io/fstype: xfs diff --git a/kubernetes/linera-validator/scylla-setup/nodeconfig.yaml b/kubernetes/linera-validator/scylla-setup/nodeconfig.yaml deleted file mode 100644 index 497eddc9545d..000000000000 --- a/kubernetes/linera-validator/scylla-setup/nodeconfig.yaml +++ /dev/null @@ -1,29 +0,0 @@ -apiVersion: scylla.scylladb.com/v1alpha1 -kind: NodeConfig -metadata: - name: scylla-nvme -spec: - localDiskSetup: - raids: - - name: nvmes - type: RAID0 - RAID0: - devices: - nameRegex: ^/dev/nvme\d+n\d+$ - filesystems: - - device: /dev/md/nvmes - type: xfs - mounts: - - device: /dev/md/nvmes - mountPoint: /mnt/disks/raid - unsupportedOptions: - - prjquota - placement: - nodeSelector: - cloud.google.com/gke-local-nvme-ssd: "true" - workload: scylla - tolerations: - - key: scylla-db - operator: Equal - value: "true" - effect: NoSchedule diff --git a/kubernetes/linera-validator/scylla.values.yaml.gotmpl b/kubernetes/linera-validator/scylla.values.yaml.gotmpl deleted file mode 100644 index 981312b7506f..000000000000 --- a/kubernetes/linera-validator/scylla.values.yaml.gotmpl +++ /dev/null @@ -1,19 +0,0 @@ -developerMode: true -sysctls: - - "fs.aio-max-nr=4082080" -datacenter: validator -racks: - - name: rack - members: {{ env "LINERA_HELMFILE_SET_STORAGE_REPLICATION_FACTOR" | default 1 }} - scyllaConfig: "scylla-config" - storage: - capacity: 2Gi - resources: - limits: - cpu: 1 - memory: 2Gi - requests: - cpu: 1 - memory: 2Gi -serviceMonitor: - create: true diff --git a/kubernetes/linera-validator/templates/NOTES.txt b/kubernetes/linera-validator/templates/NOTES.txt deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/kubernetes/linera-validator/templates/block-exporter.yaml b/kubernetes/linera-validator/templates/block-exporter.yaml deleted file mode 100644 index 5582baff8d4a..000000000000 --- a/kubernetes/linera-validator/templates/block-exporter.yaml +++ /dev/null @@ -1,235 +0,0 @@ -{{- if .Values.blockExporter.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: block-exporter-config -data: -{{- range $i := until (int .Values.blockExporter.replicas) }} - exporter-config-{{ $i }}.toml: | -{{ tpl ($.Files.Get "exporter-config.toml.tpl") (dict "exporterId" $i "Values" $.Values) | indent 4 }} -{{- end }} ---- -apiVersion: v1 -kind: Service -metadata: - name: linera-block-exporter - labels: - app: linera-block-exporter -spec: - clusterIP: None - ports: - - port: {{ .Values.blockExporter.port }} - name: http - - port: {{ .Values.blockExporter.metricsPort }} - name: metrics - selector: - app: linera-block-exporter ---- -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: linera-block-exporter -spec: - serviceName: linera-block-exporter - replicas: {{ .Values.blockExporter.replicas }} - selector: - matchLabels: - app: linera-block-exporter - template: - metadata: - labels: - app: linera-block-exporter - spec: - initContainers: - - name: linera-exporter-initializer - image: {{ .Values.lineraImage }} - imagePullPolicy: {{ .Values.lineraImagePullPolicy }} - securityContext: - runAsNonRoot: true - runAsUser: 65534 - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - resources: - requests: - memory: "64Mi" - cpu: "50m" - limits: - memory: "128Mi" - cpu: "100m" - command: - - bash - - -c - - | - set -euo pipefail - while true; do - output=$(./linera storage check-existence --storage "{{ .Values.storage }}" 2>&1) - status=$? - if [ "$status" -eq 0 ]; then - echo "Database already exists, no need to initialize." - exit 0 - else - if [ "$status" -eq 1 ]; then - echo "Database does not exist, retrying in {{ .Values.blockExporter.initRetryIntervalSeconds | default 5 }} seconds..." - else - echo "An unexpected error occurred (status: $status): $output" - echo "Retrying in {{ .Values.blockExporter.initRetryIntervalSeconds | default 5 }} seconds..." - fi - sleep {{ .Values.blockExporter.initRetryIntervalSeconds | default 5 }} - fi - done - - name: config-selector - image: busybox - command: - - sh - - -c - - | - ORDINAL=$(echo $HOSTNAME | sed 's/.*-//') - cp /configmap/exporter-config-${ORDINAL}.toml /config/exporter-config.toml - volumeMounts: - - name: configmap - mountPath: /configmap - - name: config - mountPath: /config - - name: indexer-readiness-check - image: curlimages/curl:latest - securityContext: - runAsNonRoot: true - runAsUser: 65534 - allowPrivilegeEscalation: false - readOnlyRootFilesystem: true - capabilities: - drop: - - ALL - resources: - requests: - memory: "32Mi" - cpu: "25m" - limits: - memory: "64Mi" - cpu: "50m" - env: - - name: INDEXER_ENDPOINT - value: {{ if .Values.blockExporter.indexerEndpoint }}"{{ .Values.blockExporter.indexerEndpoint }}"{{ else }}"linera-indexer-{{ .Values.networkName }}.linera-indexer.svc.cluster.local"{{ end }} - - name: INDEXER_PORT - value: {{ if .Values.blockExporter.indexerEndpoint }}"443"{{ else }}"{{ .Values.blockExporter.indexerPort }}"{{ end }} - - name: INDEXER_TLS - value: {{ if .Values.blockExporter.indexerEndpoint }}"true"{{ else }}"false"{{ end }} - command: - - sh - - -c - - | - set -eu - # Validate extracted values - if [ -z "$INDEXER_ENDPOINT" ] || [ -z "$INDEXER_PORT" ]; then - echo "Error: INDEXER_ENDPOINT or INDEXER_PORT is empty" - exit 1 - fi - - if [ "$INDEXER_TLS" = "true" ]; then - INDEXER_URL="https://${INDEXER_ENDPOINT}:${INDEXER_PORT}" - else - INDEXER_URL="http://${INDEXER_ENDPOINT}:${INDEXER_PORT}" - fi - - echo "Checking indexer readiness at ${INDEXER_URL}..." - - while true; do - # Try to connect to the indexer (just check if it's listening) - # Using --insecure for init container readiness check only - # This is acceptable because: - # 1. Only checking if service is reachable, not exchanging sensitive data - # 2. External endpoints may use self-signed certs in dev/staging - # 3. Actual exporter traffic uses proper TLS validation - if curl --max-time 5 --connect-timeout 5 --silent --fail --insecure "${INDEXER_URL}" > /dev/null 2>&1 || \ - curl --max-time 5 --connect-timeout 5 --silent --head --insecure "${INDEXER_URL}" > /dev/null 2>&1; then - echo "Indexer is reachable, exporter can start." - exit 0 - else - echo "Indexer not ready yet, retrying in {{ .Values.blockExporter.initRetryIntervalSeconds | default 5 }} seconds..." - sleep {{ .Values.blockExporter.initRetryIntervalSeconds | default 5 }} - fi - done - containers: - - name: linera-block-exporter - image: {{ .Values.blockExporter.image }} - imagePullPolicy: {{ .Values.blockExporter.imagePullPolicy }} - command: - - "./linera-exporter" - - "run" - - "--storage" - - "{{ .Values.storage }}" - - "--config-path" - - "/config/exporter-config.toml" - - "--metrics-port" - - "{{ .Values.blockExporter.metricsPort }}" - ports: - - containerPort: {{ .Values.blockExporter.port }} - name: http - - containerPort: {{ .Values.blockExporter.metricsPort }} - name: metrics - env: - - name: RUST_LOG - value: {{ .Values.blockExporter.logLevel }} - - name: RUST_BACKTRACE - value: "1" - volumeMounts: - - name: config - mountPath: /config - readOnly: true - - name: exporter-data - mountPath: /data - startupProbe: - httpGet: - path: /health - port: {{ .Values.blockExporter.metricsPort }} - failureThreshold: 30 - periodSeconds: 10 - livenessProbe: - httpGet: - path: /health - port: {{ .Values.blockExporter.metricsPort }} - periodSeconds: 10 - readinessProbe: - httpGet: - path: /health - port: {{ .Values.blockExporter.metricsPort }} - periodSeconds: 5 - volumes: - - name: configmap - configMap: - name: block-exporter-config - - name: config - emptyDir: {} - - name: exporter-data - persistentVolumeClaim: - claimName: exporter-data ---- -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: exporter-data -spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: {{ .Values.blockExporter.storageSize }} -{{- if .Values.blockExporter.serviceMonitor.enabled }} ---- -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: linera-block-exporter - labels: - app: linera-block-exporter -spec: - selector: - matchLabels: - app: linera-block-exporter - endpoints: - - port: metrics - path: /metrics -{{- end }} -{{- end }} diff --git a/kubernetes/linera-validator/templates/config.yaml b/kubernetes/linera-validator/templates/config.yaml deleted file mode 100644 index ad424501c6a7..000000000000 --- a/kubernetes/linera-validator/templates/config.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: validator-config -data: - serverConfig: {{ .Files.Get .Values.validator.serverConfig | quote | indent 4 }} - genesisConfig: {{ .Files.Get .Values.validator.genesisConfig | quote | indent 4 }} diff --git a/kubernetes/linera-validator/templates/explorer.yaml b/kubernetes/linera-validator/templates/explorer.yaml deleted file mode 100644 index acd19c514a7c..000000000000 --- a/kubernetes/linera-validator/templates/explorer.yaml +++ /dev/null @@ -1,110 +0,0 @@ -{{- if .Values.explorer.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: linera-explorer - labels: - app: linera-explorer -spec: - ports: - - port: {{ .Values.explorer.frontendPort }} - name: frontend - - port: {{ .Values.explorer.apiPort }} - name: api - selector: - app: linera-explorer ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: linera-explorer -spec: - replicas: 1 - selector: - matchLabels: - app: linera-explorer - template: - metadata: - labels: - app: linera-explorer - spec: - containers: - - name: linera-explorer - image: {{ .Values.explorer.image }} - imagePullPolicy: {{ .Values.explorer.imagePullPolicy }} - ports: - - containerPort: {{ .Values.explorer.frontendPort }} - name: frontend - - containerPort: {{ .Values.explorer.apiPort }} - name: api - env: - - name: NODE_ENV - value: "production" - - name: DB_PATH - value: "/data/indexer.db" - - name: EXPLORER_FRONTEND_PORT - value: "{{ .Values.explorer.frontendPort }}" - - name: EXPLORER_API_PORT - value: "{{ .Values.explorer.apiPort }}" - - name: LOG_LEVEL - value: {{ .Values.explorer.logLevel }} - volumeMounts: - - name: indexer-data - mountPath: /data - readOnly: true - livenessProbe: - httpGet: - path: /api/health - port: {{ .Values.explorer.apiPort }} - initialDelaySeconds: 30 - periodSeconds: 30 - readinessProbe: - httpGet: - path: /api/health - port: {{ .Values.explorer.apiPort }} - initialDelaySeconds: 10 - periodSeconds: 10 - volumes: - - name: indexer-data - persistentVolumeClaim: - claimName: indexer-data -{{- if .Values.explorer.ingress.enabled }} ---- -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: linera-explorer - labels: - app: linera-explorer - {{- with .Values.explorer.ingress.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - {{- if .Values.explorer.ingress.tls }} - tls: - {{- range .Values.explorer.ingress.tls }} - - hosts: - {{- range .hosts }} - - {{ . | quote }} - {{- end }} - secretName: {{ .secretName }} - {{- end }} - {{- end }} - rules: - {{- range .Values.explorer.ingress.hosts }} - - host: {{ .host | quote }} - http: - paths: - {{- range .paths }} - - path: {{ .path }} - pathType: {{ .pathType }} - backend: - service: - name: linera-explorer - port: - number: {{ $.Values.explorer.frontendPort }} - {{- end }} - {{- end }} -{{- end }} -{{- end }} diff --git a/kubernetes/linera-validator/templates/grafana-cloud-auth-secret.yaml b/kubernetes/linera-validator/templates/grafana-cloud-auth-secret.yaml deleted file mode 100644 index ebf74a60e35b..000000000000 --- a/kubernetes/linera-validator/templates/grafana-cloud-auth-secret.yaml +++ /dev/null @@ -1,10 +0,0 @@ -{{- if .Values.writeToGrafanaCloud }} -apiVersion: v1 -kind: Secret -metadata: - name: grafana-cloud-auth-secret -type: kubernetes.io/basic-auth -stringData: - username: {{ .Values.grafanaCloudUsername | quote }} - password: {{ .Values.grafanaCloudAPIToken | quote }} -{{- end }} diff --git a/kubernetes/linera-validator/templates/grafana-linera-dashboards-config.yaml b/kubernetes/linera-validator/templates/grafana-linera-dashboards-config.yaml deleted file mode 100644 index 105d190855d1..000000000000 --- a/kubernetes/linera-validator/templates/grafana-linera-dashboards-config.yaml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: grafana-linera-dashboards-config - labels: - grafana_dashboard: "1" - annotations: - grafana_folder: "Linera" -data: - linera_general.json: {{ .Files.Get "grafana-dashboards/linera/general.json" | quote | indent 4 }} - linera_execution.json: {{ .Files.Get "grafana-dashboards/linera/execution.json" | quote | indent 4 }} - linera_storage.json: {{ .Files.Get "grafana-dashboards/linera/storage/storage.json" | quote | indent 4 }} - linera_storage_rocksdb.json: {{ .Files.Get "grafana-dashboards/linera/storage/rocksdb.json" | quote | indent 4 }} - linera_storage_scylladb.json: {{ .Files.Get "grafana-dashboards/linera/storage/scylladb.json" | quote | indent 4 }} - linera_views.json: {{ .Files.Get "grafana-dashboards/linera/views.json" | quote | indent 4 }} - linera_logs.json: {{ .Files.Get "grafana-dashboards/linera/logs.json" | quote | indent 4 }} - linera_traces.json: {{ .Files.Get "grafana-dashboards/linera/traces.json" | quote | indent 4 }} diff --git a/kubernetes/linera-validator/templates/grafana-linera-vms-dashboards-config.yaml b/kubernetes/linera-validator/templates/grafana-linera-vms-dashboards-config.yaml deleted file mode 100644 index 9ebeb86a980b..000000000000 --- a/kubernetes/linera-validator/templates/grafana-linera-vms-dashboards-config.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: grafana-linera-vms-dashboards-config - labels: - grafana_dashboard: "1" - annotations: - grafana_folder: "Linera/VMs" -data: - linera_vms_ethereum.json: {{ .Files.Get "grafana-dashboards/linera/vms/ethereum.json" | quote | indent 4 }} diff --git a/kubernetes/linera-validator/templates/grafana-pyroscope-dashboard-config.yaml b/kubernetes/linera-validator/templates/grafana-pyroscope-dashboard-config.yaml deleted file mode 100644 index b553a4d713e3..000000000000 --- a/kubernetes/linera-validator/templates/grafana-pyroscope-dashboard-config.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: grafana-pyroscope-dashboard-config - labels: - grafana_dashboard: "1" - annotations: - grafana_folder: "Profiling" -data: - cpu_profiling.json: {{ .Files.Get "grafana-dashboards/profiling/cpu.json" | quote }} - memory_profiling.json: {{ .Files.Get "grafana-dashboards/profiling/jemalloc-memory.json" | quote }} \ No newline at end of file diff --git a/kubernetes/linera-validator/templates/grafana-scylla-dashboards-config-0.yaml b/kubernetes/linera-validator/templates/grafana-scylla-dashboards-config-0.yaml deleted file mode 100644 index 3e06cebf34e1..000000000000 --- a/kubernetes/linera-validator/templates/grafana-scylla-dashboards-config-0.yaml +++ /dev/null @@ -1,13 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: scylla-dashboards-config-0 - labels: - grafana_dashboard: "1" - annotations: - grafana_folder: "Scylla" -data: - # ConfigMaps can't be bigger than 1048576 bytes, so we need to split the dashboards into multiple ConfigMaps - scylla-advanced.6.2.json: {{ .Files.Get "grafana-dashboards/scylla/scylla-advanced.6.2.json" | quote | indent 4 }} - scylla-alternator.6.2.json: {{ .Files.Get "grafana-dashboards/scylla/scylla-alternator.6.2.json" | quote | indent 4 }} - scylla-cql.6.2.json: {{ .Files.Get "grafana-dashboards/scylla/scylla-cql.6.2.json" | quote | indent 4 }} diff --git a/kubernetes/linera-validator/templates/grafana-scylla-dashboards-config-1.yaml b/kubernetes/linera-validator/templates/grafana-scylla-dashboards-config-1.yaml deleted file mode 100644 index ad295c977fa9..000000000000 --- a/kubernetes/linera-validator/templates/grafana-scylla-dashboards-config-1.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: scylla-dashboards-config-1 - labels: - grafana_dashboard: "1" - annotations: - grafana_folder: "Scylla" -data: - # ConfigMaps can't be bigger than 1048576 bytes, so we need to split the dashboards into multiple ConfigMaps - scylla-detailed.6.2.json: {{ .Files.Get "grafana-dashboards/scylla/scylla-detailed.6.2.json" | quote | indent 4 }} - scylla-ks.6.2.json: {{ .Files.Get "grafana-dashboards/scylla/scylla-ks.6.2.json" | quote | indent 4 }} - scylla-os.6.2.json: {{ .Files.Get "grafana-dashboards/scylla/scylla-os.6.2.json" | quote | indent 4 }} - scylla-overview.6.2.json: {{ .Files.Get "grafana-dashboards/scylla/scylla-overview.6.2.json" | quote | indent 4 }} diff --git a/kubernetes/linera-validator/templates/grafana-scylla-manager-dashboards-config.yaml b/kubernetes/linera-validator/templates/grafana-scylla-manager-dashboards-config.yaml deleted file mode 100644 index 706bf326f8a3..000000000000 --- a/kubernetes/linera-validator/templates/grafana-scylla-manager-dashboards-config.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: scylla-manager-dashboards-config - labels: - grafana_dashboard: "1" - annotations: - grafana_folder: "Scylla Manager" -data: - scylla-manager.3.4.json: {{ .Files.Get "grafana-dashboards/scylla-manager/scylla-manager.3.4.json" | quote | indent 4 }} diff --git a/kubernetes/linera-validator/templates/indexer.yaml b/kubernetes/linera-validator/templates/indexer.yaml deleted file mode 100644 index d5f5bc66638b..000000000000 --- a/kubernetes/linera-validator/templates/indexer.yaml +++ /dev/null @@ -1,75 +0,0 @@ -{{- if .Values.indexer.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: linera-indexer - labels: - app: linera-indexer -spec: - ports: - - port: {{ .Values.indexer.port }} - name: grpc - selector: - app: linera-indexer ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: linera-indexer -spec: - replicas: 1 - selector: - matchLabels: - app: linera-indexer - template: - metadata: - labels: - app: linera-indexer - spec: - containers: - - name: linera-indexer - image: {{ .Values.indexer.image }} - imagePullPolicy: {{ .Values.indexer.imagePullPolicy }} - command: - - "./linera-indexer-grpc" - - "--port" - - "{{ .Values.indexer.port }}" - - "--database-path" - - "{{ .Values.indexer.databasePath }}" - ports: - - containerPort: {{ .Values.indexer.port }} - name: grpc - env: - - name: RUST_LOG - value: {{ .Values.indexer.logLevel }} - - name: RUST_BACKTRACE - value: "1" - volumeMounts: - - name: indexer-data - mountPath: /data - livenessProbe: - tcpSocket: - port: {{ .Values.indexer.port }} - initialDelaySeconds: 30 - periodSeconds: 10 - readinessProbe: - tcpSocket: - port: {{ .Values.indexer.port }} - initialDelaySeconds: 5 - periodSeconds: 5 - volumes: - - name: indexer-data - persistentVolumeClaim: - claimName: indexer-data ---- -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: indexer-data -spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: {{ .Values.indexer.storageSize }} -{{- end }} diff --git a/kubernetes/linera-validator/templates/ingress.yaml b/kubernetes/linera-validator/templates/ingress.yaml deleted file mode 100644 index faf572b5f449..000000000000 --- a/kubernetes/linera-validator/templates/ingress.yaml +++ /dev/null @@ -1,39 +0,0 @@ -{{- if eq .Values.environment "GCP" }} -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: validator-ingress - annotations: - cloud.google.com/backend-config: '{"default":"proxy-backend-config"}' - kubernetes.io/ingress.global-static-ip-name: {{ .Values.staticIpGcpName }} - networking.gke.io/managed-certificates: managed-cert - spec.ingressClassName: "gce" -spec: - defaultBackend: - service: - name: proxy - port: - number: 443 - ---- - -apiVersion: networking.gke.io/v1 -kind: ManagedCertificate -metadata: - name: managed-cert -spec: - domains: - - {{ .Values.validatorDomainName }} - ---- - -apiVersion: cloud.google.com/v1 -kind: BackendConfig -metadata: - name: proxy-backend-config -spec: - timeoutSec: 2147483647 # Maximum possible value - logging: - enable: false # GKE default sampleRate=1.0 was costing ~$1.6k/mo across our LBs. Re-enable on-demand for debugging via `kubectl patch`. - -{{- end }} diff --git a/kubernetes/linera-validator/templates/linera-recording-rules.yaml b/kubernetes/linera-validator/templates/linera-recording-rules.yaml deleted file mode 100644 index a0720e23f8fe..000000000000 --- a/kubernetes/linera-validator/templates/linera-recording-rules.yaml +++ /dev/null @@ -1,160 +0,0 @@ -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: linera-recording-rules - namespace: default - labels: - release: linera-core -spec: - groups: - - name: linera.execution.rules - rules: - # Block execution latencies - - record: linera:block_execution_latency:rate1m - expr: sum(rate(linera_block_execution_latency_bucket{job="linera-linera-server"}[1m])) by (le, validator) - - record: linera:operation_execution_latency:rate1m - expr: sum(rate(linera_operation_execution_latency_bucket{job="linera-linera-server"}[1m])) by (le, validator) - - record: linera:message_execution_latency:rate1m - expr: sum(rate(linera_message_execution_latency_bucket{job="linera-linera-server"}[1m])) by (le, validator) - - record: linera:bytecode_decompression_latency:rate1m - expr: sum(rate(linera_bytecode_decompression_latency_bucket{job="linera-linera-server"}[1m])) by (le, validator) - - record: linera:state_hash_computation_latency:rate1m - expr: sum(rate(linera_state_hash_computation_latency_bucket{job="linera-linera-server"}[1m])) by (le, validator) - - record: linera:cross_chain_queue_wait_time:rate1m - expr: sum(rate(linera_cross_chain_queue_wait_time_bucket{job="linera-linera-server"}[1m])) by (le, validator) - - record: linera:chain_worker_request_queue_wait_time:rate1m - expr: sum(rate(linera_chain_worker_request_queue_wait_time_bucket{job="linera-linera-server"}[1m])) by (le, validator) - - record: linera:create_network_actions_latency:rate1m - expr: sum(rate(linera_create_network_actions_latency_bucket{job="linera-linera-server"}[1m])) by (le, validator) - # Per-block distributions - - record: linera:num_inboxes:rate1m - expr: sum(rate(linera_num_inboxes_bucket{job="linera-linera-server"}[1m])) by (le, validator) - - record: linera:num_outboxes:rate1m - expr: sum(rate(linera_num_outboxes_bucket{job="linera-linera-server"}[1m])) by (le, validator) - - record: linera:inbox_size:rate1m - expr: sum(rate(linera_inbox_size_bucket{job="linera-linera-server"}[1m])) by (le, validator) - - record: linera:outbox_size:rate1m - expr: sum(rate(linera_outbox_size_bucket{job="linera-linera-server"}[1m])) by (le, validator) - - record: linera:removed_bundles:rate1m - expr: sum(rate(linera_removed_bundles_bucket{job="linera-linera-server"}[1m])) by (le, validator) - # Rounds (extra dimensions) - - record: linera:num_rounds_in_block_proposal:rate1m - expr: sum(rate(linera_num_rounds_in_block_proposal_bucket{job="linera-linera-server"}[1m])) by (le, validator, round_type) - - record: linera:num_rounds_in_certificate:rate1m - expr: sum(rate(linera_num_rounds_in_certificate_bucket{job="linera-linera-server"}[1m])) by (le, validator, certificate_value, round_type) - # Block composition - - record: linera:transactions_per_block:rate1m - expr: sum(rate(linera_transactions_per_block_bucket{job="linera-linera-server"}[1m])) by (le, validator) - - record: linera:operations_per_block:rate1m - expr: sum(rate(linera_operations_per_block_bucket{job="linera-linera-server"}[1m])) by (le, validator) - - record: linera:incoming_bundles_per_block:rate1m - expr: sum(rate(linera_incoming_bundles_per_block_bucket{job="linera-linera-server"}[1m])) by (le, validator) - # Wasm performance - - record: linera:wasm_contract_instantiation_latency:rate1m - expr: sum(rate(linera_wasm_contract_instantiation_latency_bucket{job="linera-linera-server"}[1m])) by (le, validator) - - record: linera:wasm_service_instantiation_latency:rate1m - expr: sum(rate(linera_wasm_service_instantiation_latency_bucket{job="linera-linera-server"}[1m])) by (le, validator) - - record: linera:wasm_fuel_used_per_block:rate1m - expr: sum(rate(linera_wasm_fuel_used_per_block_bucket{job="linera-linera-server"}[1m])) by (le, validator) - - record: linera:wasm_num_reads_per_block:rate1m - expr: sum(rate(linera_wasm_num_reads_per_block_bucket{job="linera-linera-server"}[1m])) by (le, validator) - - record: linera:wasm_bytes_read_per_block:rate1m - expr: sum(rate(linera_wasm_bytes_read_per_block_bucket{job="linera-linera-server"}[1m])) by (le, validator) - - record: linera:wasm_bytes_written_per_block:rate1m - expr: sum(rate(linera_wasm_bytes_written_per_block_bucket{job="linera-linera-server"}[1m])) by (le, validator) - - - name: linera.request.rules - rules: - - record: linera:proxy_request_latency:rate1m - expr: sum(rate(linera_proxy_request_latency_bucket{job=~"linera-linera-server|linera-linera-proxy"}[1m])) by (le, validator, method_name, traffic_type) - - record: linera:server_request_latency:rate1m - expr: sum(rate(linera_server_request_latency_bucket{job=~"linera-linera-server|linera-linera-proxy"}[1m])) by (le, validator, method_name, traffic_type) - - - name: linera.storage.rules - rules: - # High-level storage ops (server+proxy) - - record: linera:load_chain_latency:rate1m - expr: sum(rate(linera_load_chain_latency_bucket{job=~"linera-linera-server|linera-linera-proxy"}[1m])) by (le, validator) - - record: linera:load_contract_latency:rate1m - expr: sum(rate(linera_load_contract_latency_bucket{job=~"linera-linera-server|linera-linera-proxy"}[1m])) by (le, validator) - - record: linera:load_service_latency:rate1m - expr: sum(rate(linera_load_service_latency_bucket{job=~"linera-linera-server|linera-linera-proxy"}[1m])) by (le, validator) - - record: linera:read_certificate_latency:rate1m - expr: sum(rate(linera_read_certificate_latency_bucket{job=~"linera-linera-server|linera-linera-proxy"}[1m])) by (le, validator) - - record: linera:read_blob_latency:rate1m - expr: sum(rate(linera_read_blob_latency_bucket{job=~"linera-linera-server|linera-linera-proxy"}[1m])) by (le, validator) - - record: linera:write_blob_latency:rate1m - expr: sum(rate(linera_write_blob_latency_bucket{job=~"linera-linera-server|linera-linera-proxy"}[1m])) by (le, validator) - - record: linera:read_event_latency:rate1m - expr: sum(rate(linera_read_event_latency_bucket{job=~"linera-linera-server|linera-linera-proxy"}[1m])) by (le, validator) - - record: linera:write_event_latency:rate1m - expr: sum(rate(linera_write_event_latency_bucket{job=~"linera-linera-server|linera-linera-proxy"}[1m])) by (le, validator) - - record: linera:write_batch_latency:rate1m - expr: sum(rate(linera_write_batch_latency_bucket{job=~"linera-linera-server|linera-linera-proxy"}[1m])) by (le, validator) - - record: linera:contains_certificate_latency:rate1m - expr: sum(rate(linera_contains_certificate_latency_bucket{job=~"linera-linera-server|linera-linera-proxy"}[1m])) by (le, validator) - - record: linera:contains_blob_latency:rate1m - expr: sum(rate(linera_contains_blob_latency_bucket{job=~"linera-linera-server|linera-linera-proxy"}[1m])) by (le, validator) - - record: linera:contains_event_latency:rate1m - expr: sum(rate(linera_contains_event_latency_bucket{job=~"linera-linera-server|linera-linera-proxy"}[1m])) by (le, validator) - # ScyllaDB internal (server+proxy) - - record: linera:journaling_scylladb_internal_write_batch_latency:rate1m - expr: sum(rate(linera_journaling_scylladb_internal_write_batch_latency_bucket{job=~"linera-linera-server|linera-linera-proxy"}[1m])) by (le, validator) - - record: linera:journaling_scylladb_internal_read_value_bytes_latency:rate1m - expr: sum(rate(linera_journaling_scylladb_internal_read_value_bytes_latency_bucket{job=~"linera-linera-server|linera-linera-proxy"}[1m])) by (le, validator) - - record: linera:journaling_scylladb_internal_contains_key_latency:rate1m - expr: sum(rate(linera_journaling_scylladb_internal_contains_key_latency_bucket{job=~"linera-linera-server|linera-linera-proxy"}[1m])) by (le, validator) - - record: linera:journaling_scylladb_internal_find_keys_by_prefix_latency:rate1m - expr: sum(rate(linera_journaling_scylladb_internal_find_keys_by_prefix_latency_bucket{job=~"linera-linera-server|linera-linera-proxy"}[1m])) by (le, validator) - - record: linera:journaling_scylladb_internal_write_batch_size:rate1m - expr: sum(rate(linera_journaling_scylladb_internal_write_batch_size_bucket{job=~"linera-linera-server|linera-linera-proxy"}[1m])) by (le, validator) - - record: linera:journaling_scylladb_internal_read_value_key_size:rate1m - expr: sum(rate(linera_journaling_scylladb_internal_read_value_key_size_bucket{job=~"linera-linera-server|linera-linera-proxy"}[1m])) by (le, validator) - - record: linera:journaling_scylladb_internal_read_value_value_size:rate1m - expr: sum(rate(linera_journaling_scylladb_internal_read_value_value_size_bucket{job=~"linera-linera-server|linera-linera-proxy"}[1m])) by (le, validator) - - record: linera:journaling_scylladb_internal_contains_keys_latency:rate1m - expr: sum(rate(linera_journaling_scylladb_internal_contains_keys_latency_bucket{job=~"linera-linera-server|linera-linera-proxy"}[1m])) by (le, validator) - - record: linera:journaling_scylladb_internal_read_multi_value_bytes_latency:rate1m - expr: sum(rate(linera_journaling_scylladb_internal_read_multi_value_bytes_latency_bucket{job=~"linera-linera-server|linera-linera-proxy"}[1m])) by (le, validator) - - record: linera:journaling_scylladb_internal_read_multi_values_num_entries:rate1m - expr: sum(rate(linera_journaling_scylladb_internal_read_multi_values_num_entries_bucket{job=~"linera-linera-server|linera-linera-proxy"}[1m])) by (le, validator) - - record: linera:journaling_scylladb_internal_find_key_values_by_prefix_latency:rate1m - expr: sum(rate(linera_journaling_scylladb_internal_find_key_values_by_prefix_latency_bucket{job=~"linera-linera-server|linera-linera-proxy"}[1m])) by (le, validator) - - record: linera:journaling_scylladb_internal_find_keys_by_prefix_keys_size:rate1m - expr: sum(rate(linera_journaling_scylladb_internal_find_keys_by_prefix_keys_size_bucket{job=~"linera-linera-server|linera-linera-proxy"}[1m])) by (le, validator) - - record: linera:journaling_scylladb_internal_find_keys_by_prefix_num_keys:rate1m - expr: sum(rate(linera_journaling_scylladb_internal_find_keys_by_prefix_num_keys_bucket{job=~"linera-linera-server|linera-linera-proxy"}[1m])) by (le, validator) - # RocksDB internal (no job filter — dashboard uses $job variable) - - record: linera:rocksdb_internal_write_batch_latency:rate1m - expr: sum(rate(linera_rocksdb_internal_write_batch_latency_bucket[1m])) by (le, job) - - record: linera:rocksdb_internal_read_value_bytes_latency:rate1m - expr: sum(rate(linera_rocksdb_internal_read_value_bytes_latency_bucket[1m])) by (le, job) - - record: linera:rocksdb_internal_contains_key_latency:rate1m - expr: sum(rate(linera_rocksdb_internal_contains_key_latency_bucket[1m])) by (le, job) - - record: linera:rocksdb_internal_find_keys_by_prefix_latency:rate1m - expr: sum(rate(linera_rocksdb_internal_find_keys_by_prefix_latency_bucket[1m])) by (le, job) - - record: linera:rocksdb_internal_write_batch_size:rate1m - expr: sum(rate(linera_rocksdb_internal_write_batch_size_bucket[1m])) by (le, job) - - record: linera:rocksdb_internal_read_value_key_size:rate1m - expr: sum(rate(linera_rocksdb_internal_read_value_key_size_bucket[1m])) by (le, job) - - record: linera:rocksdb_internal_read_value_value_size:rate1m - expr: sum(rate(linera_rocksdb_internal_read_value_value_size_bucket[1m])) by (le, job) - - record: linera:rocksdb_internal_contains_keys_latency:rate1m - expr: sum(rate(linera_rocksdb_internal_contains_keys_latency_bucket[1m])) by (le, job) - - record: linera:rocksdb_internal_read_multi_value_bytes_latency:rate1m - expr: sum(rate(linera_rocksdb_internal_read_multi_value_bytes_latency_bucket[1m])) by (le, job) - - record: linera:rocksdb_internal_read_multi_values_num_entries:rate1m - expr: sum(rate(linera_rocksdb_internal_read_multi_values_num_entries_bucket[1m])) by (le, job) - - record: linera:rocksdb_internal_find_key_values_by_prefix_latency:rate1m - expr: sum(rate(linera_rocksdb_internal_find_key_values_by_prefix_latency_bucket[1m])) by (le, job) - - record: linera:rocksdb_internal_find_keys_by_prefix_keys_size:rate1m - expr: sum(rate(linera_rocksdb_internal_find_keys_by_prefix_keys_size_bucket[1m])) by (le, job) - - record: linera:rocksdb_internal_find_keys_by_prefix_num_keys:rate1m - expr: sum(rate(linera_rocksdb_internal_find_keys_by_prefix_num_keys_bucket[1m])) by (le, job) - - - name: linera.view.rules - rules: - - record: linera:load_view_latency:rate1m - expr: sum(rate(linera_load_view_latency_bucket{job=~"linera-linera-server|linera-linera-proxy"}[1m])) by (le, validator) - - record: linera:save_view_latency:rate1m - expr: sum(rate(linera_save_view_latency_bucket{job=~"linera-linera-server|linera-linera-proxy"}[1m])) by (le, validator, type) diff --git a/kubernetes/linera-validator/templates/prometheus.yaml b/kubernetes/linera-validator/templates/prometheus.yaml deleted file mode 100644 index 74d09af49fb2..000000000000 --- a/kubernetes/linera-validator/templates/prometheus.yaml +++ /dev/null @@ -1,51 +0,0 @@ -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - labels: - release: linera-core - name: shards -spec: - endpoints: - - port: metrics - path: /metrics - scheme: http - relabelings: - - targetLabel: job - replacement: linera-linera-server - namespaceSelector: - matchNames: - - default - selector: - matchLabels: - app: shards ---- -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - labels: - release: linera-core - name: proxy -spec: - endpoints: - - port: metrics - path: /metrics - scheme: http - relabelings: - - targetLabel: job - replacement: linera-linera-proxy - namespaceSelector: - matchNames: - - default - selector: - matchLabels: - app: proxy ---- -apiVersion: storage.k8s.io/v1 -kind: StorageClass -metadata: - name: gce-pd-balanced -provisioner: kubernetes.io/gce-pd -parameters: - type: pd-balanced -reclaimPolicy: Retain -allowVolumeExpansion: true diff --git a/kubernetes/linera-validator/templates/proxy.yaml b/kubernetes/linera-validator/templates/proxy.yaml deleted file mode 100644 index a0826a71b207..000000000000 --- a/kubernetes/linera-validator/templates/proxy.yaml +++ /dev/null @@ -1,141 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - annotations: - cloud.google.com/app-protocols: '{"linera-port":"HTTP2"}' - cloud.google.com/backend-config: '{"default": "proxy-backend-config"}' - name: proxy - labels: - app: proxy -spec: - ports: - - port: {{ .Values.proxyPort }} - name: linera-port - targetPort: {{ .Values.proxyPort }} - - port: {{ .Values.metricsPort }} - name: metrics - selector: - app: proxy - ---- -apiVersion: v1 -kind: Service -metadata: - name: proxy-internal - labels: - app: proxy -spec: - ports: - - port: 20100 - name: proxy-internal - clusterIP: None - selector: - app: proxy ---- - -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: proxy -spec: - serviceName: "proxy-internal" - selector: - matchLabels: - app: proxy - replicas: {{ .Values.numProxies }} - podManagementPolicy: Parallel - template: - metadata: - labels: - app: proxy - spec: - terminationGracePeriodSeconds: 10 - initContainers: - - name: linera-proxy-initializer - image: {{ .Values.lineraImage }} - imagePullPolicy: {{ .Values.lineraImagePullPolicy }} - command: - - sh - - -c - - | - while true; do - ./linera storage check-existence --storage "scylladb:tcp:scylla-client.scylla.svc.cluster.local:9042" - status=$? - if [ "$status" -eq 0 ]; then - echo "Database already exists, no need to initialize." - exit 0 - else - if [ "$status" -eq 1 ]; then - echo "Database does not exist, retrying in 5 seconds..." - else - echo "An unexpected error occurred (status: $status), retrying in 5 seconds..." - fi - sleep 5 - fi - done - env: - - name: RUST_LOG - value: {{ .Values.logLevel }} - - name: RUST_BACKTRACE - value: "1" - - name: LINERA_OTLP_EXPORTER_ENDPOINT - value: {{ .Values.otlpExporterEndpoint }} - containers: - - name: linera-proxy - imagePullPolicy: {{ .Values.lineraImagePullPolicy }} - image: {{ .Values.lineraImage }} - ports: - - containerPort: {{ .Values.proxyPort }} - name: linera-port - - containerPort: 20100 - name: private-port - - containerPort: {{ .Values.metricsPort }} - name: metrics - command: - - sh - - -c - - | - ORDINAL="${HOSTNAME##*-}" - exec ./linera-proxy \ - --storage scylladb:tcp:scylla-client.scylla.svc.cluster.local:9042 \ - --storage-replication-factor {{ .Values.storageReplicationFactor | quote }} \ - --storage-max-cache-size {{ .Values.storageCacheConfig.maxCacheSize | int }} \ - --storage-max-cache-entries {{ .Values.storageCacheConfig.maxCacheEntries | int }} \ - --storage-max-value-entry-size {{ .Values.storageCacheConfig.maxValueEntrySize | int }} \ - --storage-max-find-keys-entry-size {{ .Values.storageCacheConfig.maxFindKeysEntrySize | int }} \ - --storage-max-find-key-values-entry-size {{ .Values.storageCacheConfig.maxFindKeyValuesEntrySize | int }} \ - --storage-max-cache-value-size {{ .Values.storageCacheConfig.maxCacheValueSize | int }} \ - --storage-max-cache-find-keys-size {{ .Values.storageCacheConfig.maxCacheFindKeysSize | int }} \ - --storage-max-cache-find-key-values-size {{ .Values.storageCacheConfig.maxCacheFindKeyValuesSize | int }} \ - --blob-cache-size {{ .Values.storageCacheSizes.blobCacheSize | int }} \ - --confirmed-block-cache-size {{ .Values.storageCacheSizes.confirmedBlockCacheSize | int }} \ - --certificate-cache-size {{ .Values.storageCacheSizes.certificateCacheSize | int }} \ - --certificate-raw-cache-size {{ .Values.storageCacheSizes.certificateRawCacheSize | int }} \ - --event-cache-size {{ .Values.storageCacheSizes.eventCacheSize | int }} \ - --id "$ORDINAL" \ - /config/server.json - env: - - name: RUST_LOG - value: {{ .Values.logLevel }} - - name: LINERA_OTLP_EXPORTER_ENDPOINT - value: {{ .Values.otlpExporterEndpoint }} - livenessProbe: - tcpSocket: - port: {{ .Values.proxyPort }} - initialDelaySeconds: 60 - periodSeconds: 30 - timeoutSeconds: 10 - failureThreshold: 3 - volumeMounts: - - name: config - mountPath: "/config" - readOnly: true - volumes: - - name: config - configMap: - name: validator-config - items: - - key: serverConfig - path: server.json - - key: genesisConfig - path: genesis.json diff --git a/kubernetes/linera-validator/templates/scylla-agent-gcs-config.yaml b/kubernetes/linera-validator/templates/scylla-agent-gcs-config.yaml deleted file mode 100644 index 28bfe1cddb3e..000000000000 --- a/kubernetes/linera-validator/templates/scylla-agent-gcs-config.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: v1 -kind: Secret -metadata: - name: scylla-agent-config - namespace: scylla - labels: - app.kubernetes.io/managed-by: Helm - annotations: - meta.helm.sh/release-name: linera-core - meta.helm.sh/release-namespace: default -type: Opaque -stringData: - scylla-manager-agent.yaml: | - gcs: {} diff --git a/kubernetes/linera-validator/templates/scylla-config.yaml b/kubernetes/linera-validator/templates/scylla-config.yaml deleted file mode 100644 index a027bfd4aede..000000000000 --- a/kubernetes/linera-validator/templates/scylla-config.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: scylla-config - namespace: scylla - labels: - app.kubernetes.io/managed-by: Helm - annotations: - meta.helm.sh/release-name: linera-core - meta.helm.sh/release-namespace: default -data: - scylla.yaml: | - query_tombstone_page_limit: 200000 - commitlog_segment_size_in_mb: 64 diff --git a/kubernetes/linera-validator/templates/scylla-recording-rules.yaml b/kubernetes/linera-validator/templates/scylla-recording-rules.yaml deleted file mode 100644 index 695ad64abbc5..000000000000 --- a/kubernetes/linera-validator/templates/scylla-recording-rules.yaml +++ /dev/null @@ -1,525 +0,0 @@ -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: scylla-recording-rules - namespace: default - labels: - release: linera-core -spec: - groups: - - name: scylla.latency.rules - rules: - - record: cql:all_shardrate1m - expr: sum(rate(scylla_cql_reads[60s])) by (cluster, dc, instance, shard) + sum(rate(scylla_cql_inserts[60s]) ) by (cluster, dc, instance, shard) + sum( rate(scylla_cql_updates[60s]) ) by (cluster, dc, instance, shard) + sum( rate(scylla_cql_deletes[60s])) by (cluster, dc, instance, shard) - - record: cql:all_system_shardrate1m - expr: sum(rate(scylla_cql_reads_per_ks{ks="system"}[60s])) by (cluster, dc, instance, shard) + sum(rate(scylla_cql_inserts_per_ks{ks="system"}[60s]) ) by (cluster, dc, instance, shard) + sum( rate(scylla_cql_updates_per_ks{ks="system"}[60s]) ) by (cluster, dc, instance, shard) + sum( rate(scylla_cql_deletes_per_ks{ks="system"}[60s])) by (cluster, dc, instance, shard) - - record: cql:local_shardrate1m - expr: sum(rate(scylla_storage_proxy_coordinator_reads_local_node[60s])) by (cluster, dc, instance, shard) + sum(rate(scylla_storage_proxy_coordinator_total_write_attempts_local_node[60s]) ) by (cluster, dc, instance, shard) - - record: cql:all_rate1m - expr: sum(cql:all_shardrate1m) by (cluster, dc, instance) - - record: cql:non_token_aware - expr: (sum(cql:all_rate1m) by (cluster) >bool 100) * clamp_min(1-(sum(cql:local_shardrate1m) by (cluster) / sum(cql:all_rate1m) by (cluster)), 0) - - record: cql:non_system_prepared1m - expr: clamp_min(sum(rate(scylla_query_processor_statements_prepared[1m])) by (cluster, dc, instance, shard) - cql:all_system_shardrate1m, 0) - - record: cql:non_prepared - expr: (sum(cql:non_system_prepared1m) by (cluster) >bool 100) * (sum(cql:non_system_prepared1m) by (cluster) / clamp_min(sum(cql:all_rate1m) by (cluster)- sum(cql:all_system_shardrate1m) by (cluster), 0.001)) - - record: cql:non_paged_no_system1m - expr: clamp_min(sum(rate(scylla_cql_unpaged_select_queries[60s])) by (cluster, dc, instance) - sum(rate(scylla_cql_unpaged_select_queries_per_ks{ks="system"}[60s])) by (cluster, dc, instance), 0) - - record: cql:non_paged_no_system - expr: (sum(cql:non_paged_no_system1m) by (cluster, dc, instance) >bool 100) * sum(cql:non_paged_no_system) by (cluster, dc, instance)/clamp_min(sum(rate(scylla_cql_reads[60s]))by (cluster, dc, instance) - sum(rate(scylla_cql_unpaged_select_queries_per_ks{ks="system"}[60s])) by (cluster, dc, instance), 0.01) - - record: cql:non_paged - expr: (sum(cql:non_paged_no_system1m) by (cluster) >bool 100) * sum(cql:non_paged_no_system1m) by (cluster)/clamp_min(sum(rate(scylla_cql_reads[60s]))by (cluster) - sum(rate(scylla_cql_unpaged_select_queries_per_ks{ks="system"}[60s])) by (cluster), 0.01) - - record: cql:reverse_queries - expr: sum(rate(scylla_cql_reverse_queries[60s])) by (cluster)/ sum(rate(scylla_cql_reads[60s])) by (cluster) - - record: cql:allow_filtering - expr: sum(rate(scylla_cql_filtered_read_requests[60s])) by (cluster)/ sum(rate(scylla_cql_reads[60s])) by (cluster) - - record: cql:any_queries - expr: sum(rate(scylla_query_processor_queries{consistency_level="ANY"}[60s])) by (cluster) >bool 0 - - record: cql:all_queries - expr: sum(rate(scylla_query_processor_queries{consistency_level="ALL"}[60s])) by (cluster) >bool 0 - - record: errors:operation_unavailable - expr: sum(rate(scylla_storage_proxy_coordinator_read_unavailable[60s])) by (cluster, dc, instance) + sum(rate(scylla_storage_proxy_coordinator_write_unavailable[60s])) by (cluster, dc, instance) + sum(rate(scylla_storage_proxy_coordinator_range_unavailable[60s])) by (cluster, dc, instance) - - record: errors:local_failed - expr: sum(rate(scylla_storage_proxy_coordinator_read_errors_local_node[60s])) by (cluster, dc, instance) + sum(rate(scylla_storage_proxy_coordinator_write_errors_local_node[60s])) by (cluster, dc, instance) - - record: errors:nodes_total - expr: errors:local_failed + errors:operation_unavailable - - record: manager:repair_done_ts - expr: timestamp(sum(changes(scylla_manager_scheduler_run_total{status="DONE",type="repair"}[2m])) by (cluster) > 0) or on(cluster) manager:repair_done_ts - labels: - dd: "1" - by: "cluster" - - record: manager:backup_done_ts - expr: timestamp(sum(changes(scylla_manager_scheduler_run_total{status="DONE",type="backup"}[2m])) by (cluster) > 0) or on(cluster) manager:backup_done_ts - labels: - dd: "1" - by: "cluster" - - record: manager:repair_fail_ts - expr: timestamp(sum(changes(scylla_manager_scheduler_run_total{status="ERROR",type="repair"}[2m])) by (cluster) > 0) or on(cluster) manager:repair_fail_ts - labels: - dd: "1" - by: "cluster" - - record: manager:backup_fail_ts - expr: timestamp(sum(changes(scylla_manager_scheduler_run_total{status="ERROR",type="backup"}[2m])) by (cluster) > 0) or on(cluster) manager:backup_fail_ts - labels: - dd: "1" - by: "cluster" - - record: manager:repair_progress - expr: (max(scylla_manager_scheduler_run_indicator{type="repair"}) by (cluster) >bool 0)*((max(scylla_manager_repair_token_ranges_total) by(cluster)<= 0)*0 or on(cluster) (sum(scylla_manager_repair_token_ranges_success>=0) by (cluster) + sum(scylla_manager_repair_token_ranges_error>=0) by (cluster))/sum(scylla_manager_repair_token_ranges_total>=0) by (cluster)) - - record: manager:backup_progress - expr: (max(scylla_manager_scheduler_run_indicator{type="backup"}) by (cluster) >bool 0)*((max(scylla_manager_backup_files_size_bytes) by(cluster)<= 0)*0 or on(cluster) (sum(scylla_manager_backup_files_uploaded_bytes) by (cluster) + sum(scylla_manager_backup_files_skipped_bytes) by (cluster) + sum(scylla_manager_backup_files_failed_bytes)by(cluster))/sum(scylla_manager_backup_files_size_bytes>=0) by (cluster)) - - record: scylla_manager_backup_progress - expr: sum(manager:backup_progress) by (cluster) - labels: - dd: "1" - by: "cluster" - - record: wlatencyp99 - expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{shard=~".+", scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le)) - labels: - by: "instance,shard" - dd: "2" - - record: wlatencyp99 - expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name, le)) - labels: - by: "instance" - dd: "1" - - record: wlatencyp99 - expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, le)) - labels: - by: "dc" - dd: "1" - - record: wlatencyp99 - expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name, le)) - labels: - by: "cluster" - dd: "1" - - record: rlatencyp99 - expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_read_latency_bucket{shard=~".+", scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le)) - labels: - by: "instance,shard" - dd: "2" - - record: rlatencyp99 - expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_read_latency_bucket{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name, le)) - labels: - by: "instance" - dd: "1" - - record: rlatencyp99 - expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_read_latency_bucket{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, le)) - labels: - by: "dc" - dd: "1" - - record: rlatencyp99 - expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_read_latency_bucket{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name, le)) - labels: - by: "cluster" - dd: "1" - - record: wlatencyp95 - expr: histogram_quantile(0.95, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{shard=~".+", scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le)) - labels: - by: "instance,shard" - dd: "2" - - record: wlatencyp95 - expr: histogram_quantile(0.95, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name, le)) - labels: - by: "instance" - dd: "1" - - record: wlatencyp95 - expr: histogram_quantile(0.95, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, le)) - labels: - by: "dc" - dd: "1" - - record: wlatencyp95 - expr: histogram_quantile(0.95, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name, le)) - labels: - by: "cluster" - dd: "1" - - record: rlatencyp95 - expr: histogram_quantile(0.95, sum(rate(scylla_storage_proxy_coordinator_read_latency_bucket{shard=~".+", scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le)) - labels: - by: "instance,shard" - dd: "2" - - record: rlatencyp95 - expr: histogram_quantile(0.95, sum(rate(scylla_storage_proxy_coordinator_read_latency_bucket{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name, le)) - labels: - by: "instance" - dd: "1" - - record: rlatencyp95 - expr: histogram_quantile(0.95, sum(rate(scylla_storage_proxy_coordinator_read_latency_bucket{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, le)) - labels: - by: "dc" - dd: "1" - - record: rlatencyp95 - expr: histogram_quantile(0.95, sum(rate(scylla_storage_proxy_coordinator_read_latency_bucket{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name, le)) - labels: - by: "cluster" - dd: "1" - - record: wlatencya - expr: histogram_quantile(0.5, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{shard=~".+", scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le)) - labels: - by: "instance,shard" - dd: "2" - - record: wlatencya - expr: histogram_quantile(0.5, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name, le)) - labels: - by: "instance" - dd: "1" - - record: wlatencya - expr: histogram_quantile(0.5, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, le)) - labels: - by: "dc" - dd: "1" - - record: wlatencya - expr: histogram_quantile(0.5, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name, le)) - labels: - by: "cluster" - dd: "1" - - record: rlatencya - expr: histogram_quantile(0.5, sum(rate(scylla_storage_proxy_coordinator_read_latency_bucket{shard=~".+", scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le)) - labels: - by: "instance,shard" - dd: "2" - - record: rlatencya - expr: histogram_quantile(0.5, sum(rate(scylla_storage_proxy_coordinator_read_latency_bucket{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name, le)) - labels: - by: "instance" - dd: "1" - - record: rlatencya - expr: histogram_quantile(0.5, sum(rate(scylla_storage_proxy_coordinator_read_latency_bucket{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, le)) - labels: - by: "dc" - dd: "1" - - record: rlatencya - expr: histogram_quantile(0.5, sum(rate(scylla_storage_proxy_coordinator_read_latency_bucket{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name, le)) - labels: - by: "cluster" - dd: "1" - - record: wlatencyp99 - expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{shard=~".+", scheduling_group_name=~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le)) - labels: - by: "instance,shard" - - record: wlatencyp99 - expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{scheduling_group_name=~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name, le)) - labels: - by: "instance" - - - record: wlatencyp99 - expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{scheduling_group_name=~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, le)) - labels: - by: "dc" - - record: wlatencyp99 - expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{scheduling_group_name=~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name, le)) - labels: - by: "cluster" - - record: rlatencyp99 - expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_read_latency_bucket{shard=~".+", scheduling_group_name=~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le)) - labels: - by: "instance,shard" - - record: rlatencyp99 - expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_read_latency_bucket{scheduling_group_name=~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name, le)) - labels: - by: "instance" - - record: rlatencyp99 - expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_read_latency_bucket{scheduling_group_name=~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, le)) - labels: - by: "dc" - - record: rlatencyp99 - expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_read_latency_bucket{scheduling_group_name=~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name, le)) - labels: - by: "cluster" - - record: wlatencyp95 - expr: histogram_quantile(0.95, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{shard=~".+", scheduling_group_name=~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le)) - labels: - by: "instance,shard" - - record: wlatencyp95 - expr: histogram_quantile(0.95, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{scheduling_group_name=~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name, le)) - labels: - by: "instance" - - record: wlatencyp95 - expr: histogram_quantile(0.95, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{scheduling_group_name=~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, le)) - labels: - by: "dc" - - record: wlatencyp95 - expr: histogram_quantile(0.95, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{scheduling_group_name=~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name, le)) - labels: - by: "cluster" - - record: rlatencyp95 - expr: histogram_quantile(0.95, sum(rate(scylla_storage_proxy_coordinator_read_latency_bucket{shard=~".+", scheduling_group_name=~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le)) - labels: - by: "instance,shard" - - record: rlatencyp95 - expr: histogram_quantile(0.95, sum(rate(scylla_storage_proxy_coordinator_read_latency_bucket{scheduling_group_name=~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name, le)) - labels: - by: "instance" - - record: rlatencyp95 - expr: histogram_quantile(0.95, sum(rate(scylla_storage_proxy_coordinator_read_latency_bucket{scheduling_group_name=~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, le)) - labels: - by: "dc" - - record: rlatencyp95 - expr: histogram_quantile(0.95, sum(rate(scylla_storage_proxy_coordinator_read_latency_bucket{scheduling_group_name=~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name, le)) - labels: - by: "cluster" - - record: wlatencya - expr: histogram_quantile(0.5, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{shard=~".+", scheduling_group_name=~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le)) - labels: - by: "instance,shard" - - record: wlatencya - expr: histogram_quantile(0.5, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{scheduling_group_name=~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name, le)) - labels: - by: "instance" - - record: wlatencya - expr: histogram_quantile(0.5, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{scheduling_group_name=~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, le)) - labels: - by: "dc" - - record: wlatencya - expr: histogram_quantile(0.5, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{scheduling_group_name=~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name, le)) - labels: - by: "cluster" - - record: rlatencya - expr: histogram_quantile(0.5, sum(rate(scylla_storage_proxy_coordinator_read_latency_bucket{shard=~".+", scheduling_group_name=~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le)) - labels: - by: "instance,shard" - - record: rlatencya - expr: histogram_quantile(0.5, sum(rate(scylla_storage_proxy_coordinator_read_latency_bucket{scheduling_group_name=~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name, le)) - labels: - by: "instance" - - record: rlatencya - expr: histogram_quantile(0.5, sum(rate(scylla_storage_proxy_coordinator_read_latency_bucket{scheduling_group_name=~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, le)) - labels: - by: "dc" - - record: rlatencya - expr: histogram_quantile(0.5, sum(rate(scylla_storage_proxy_coordinator_read_latency_bucket{scheduling_group_name=~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name, le)) - labels: - by: "cluster" - - record: casrlatencyp95 - expr: histogram_quantile(0.95, sum(rate(scylla_storage_proxy_coordinator_cas_read_latency_bucket{shard=~".+", scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, le, scheduling_group_name)) - labels: - by: "instance,shard" - dd: "2" - - record: casrlatencyp95 - expr: histogram_quantile(0.95, sum(rate(scylla_storage_proxy_coordinator_cas_read_latency_bucket{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, le, scheduling_group_name)) - labels: - by: "instance" - dd: "1" - - record: casrlatencyp95 - expr: histogram_quantile(0.95, sum(rate(scylla_storage_proxy_coordinator_cas_read_latency_bucket{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, le, scheduling_group_name)) - labels: - by: "dc" - dd: "1" - - record: casrlatencyp95 - expr: histogram_quantile(0.95, sum(rate(scylla_storage_proxy_coordinator_cas_read_latency_bucket{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, le, scheduling_group_name)) - labels: - by: "cluster" - dd: "1" - - record: caswlatencyp95 - expr: histogram_quantile(0.95, sum(rate(scylla_storage_proxy_coordinator_cas_write_latency_bucket{shard=~".+", scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, le, scheduling_group_name)) - labels: - by: "instance,shard" - dd: "2" - - record: caswlatencyp95 - expr: histogram_quantile(0.95, sum(rate(scylla_storage_proxy_coordinator_cas_write_latency_bucket{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, le, scheduling_group_name)) - labels: - by: "instance" - dd: "1" - - record: caswlatencyp95 - expr: histogram_quantile(0.95, sum(rate(scylla_storage_proxy_coordinator_cas_write_latency_bucket{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, le, scheduling_group_name)) - labels: - by: "dc" - dd: "1" - - record: caswlatencyp95 - expr: histogram_quantile(0.95, sum(rate(scylla_storage_proxy_coordinator_cas_write_latency_bucket{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, le, scheduling_group_name)) - labels: - by: "cluster" - dd: "1" - - record: casrlatencya - expr: histogram_quantile(0.5, sum(rate(scylla_storage_proxy_coordinator_cas_read_latency_bucket{shard=~".+", scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, le, scheduling_group_name)) - labels: - by: "instance,shard" - dd: "2" - - record: casrlatencya - expr: histogram_quantile(0.5, sum(rate(scylla_storage_proxy_coordinator_cas_read_latency_bucket{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, le, scheduling_group_name)) - labels: - by: "instance" - dd: "1" - - record: casrlatencya - expr: histogram_quantile(0.5, sum(rate(scylla_storage_proxy_coordinator_cas_read_latency_bucket{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, le, scheduling_group_name)) - labels: - by: "dc" - dd: "1" - - record: casrlatencya - expr: histogram_quantile(0.5, sum(rate(scylla_storage_proxy_coordinator_cas_read_latency_bucket{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, le, scheduling_group_name)) - labels: - by: "cluster" - dd: "1" - - record: caswlatencya - expr: histogram_quantile(0.5, sum(rate(scylla_storage_proxy_coordinator_cas_write_latency_bucket{shard=~".+", scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, le, scheduling_group_name)) - labels: - by: "instance,shard" - dd: "2" - - record: caswlatencya - expr: histogram_quantile(0.5, sum(rate(scylla_storage_proxy_coordinator_cas_write_latency_bucket{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, le, scheduling_group_name)) - labels: - by: "instance" - dd: "1" - - record: caswlatencya - expr: histogram_quantile(0.5, sum(rate(scylla_storage_proxy_coordinator_cas_write_latency_bucket{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, le, scheduling_group_name)) - labels: - by: "dc" - dd: "1" - - record: caswlatencya - expr: histogram_quantile(0.5, sum(rate(scylla_storage_proxy_coordinator_cas_write_latency_bucket{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, le, scheduling_group_name)) - labels: - by: "cluster" - dd: "1" - - record: scylla_alternator_op_latency_summary - expr: histogram_quantile(0.5, sum(rate(scylla_alternator_op_latency_bucket[60s])>0) by (cluster, dc, instance, le, op)) - labels: - by: "instance" - quantile: "0.5" - dd: "1" - - record: scylla_alternator_op_latency_summary - expr: histogram_quantile(0.5, sum(rate(scylla_alternator_op_latency_bucket[60s])>0) by (cluster, dc, le, op)) - labels: - by: "dc" - quantile: "0.5" - dd: "1" - - record: scylla_alternator_op_latency_summary - expr: histogram_quantile(0.5, sum(rate(scylla_alternator_op_latency_bucket[60s])>0) by (cluster, op)) - labels: - by: "cluster" - quantile: "0.5" - dd: "1" - - record: scylla_alternator_op_latency_summary - expr: histogram_quantile(0.95, sum(rate(scylla_alternator_op_latency_bucket[60s])>0) by (cluster, dc, instance, le, op)) - labels: - by: "instance" - quantile: "0.95" - dd: "1" - - record: scylla_alternator_op_latency_summary - expr: histogram_quantile(0.95, sum(rate(scylla_alternator_op_latency_bucket[60s])>0) by (cluster, dc, le, op)) - labels: - by: "dc" - quantile: "0.95" - dd: "1" - - record: scylla_alternator_op_latency_summary - expr: histogram_quantile(0.95, sum(rate(scylla_alternator_op_latency_bucket[60s])>0) by (cluster, op)) - labels: - by: "cluster" - quantile: "0.95" - dd: "1" - - record: scylla_alternator_op_latency_summary - expr: histogram_quantile(0.99, sum(rate(scylla_alternator_op_latency_bucket[60s])>0) by (cluster, dc, instance, le, op)) - labels: - by: "instance" - quantile: "0.99" - dd: "1" - - record: scylla_alternator_op_latency_summary - expr: histogram_quantile(0.99, sum(rate(scylla_alternator_op_latency_bucket[60s])>0) by (cluster, dc, le, op)) - labels: - by: "dc" - quantile: "0.99" - dd: "1" - - record: scylla_alternator_op_latency_summary - expr: histogram_quantile(0.99, sum(rate(scylla_alternator_op_latency_bucket[60s])>0) by (cluster, op)) - labels: - by: "cluster" - quantile: "0.99" - dd: "1" - - record: all_scheduling_group - expr: sum by (cluster, scheduling_group_name) (scylla_storage_proxy_coordinator_write_latency_count + scylla_storage_proxy_coordinator_read_latency_count) > 0 - - name: scylla.table.rules - rules: - - record: wlatencyp99ks - expr: histogram_quantile(0.99, sum(rate(scylla_column_family_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, le,ks,cf)) - labels: - by: "instance,shard" - - record: wlatencyp99ks - expr: histogram_quantile(0.99, sum(rate(scylla_column_family_write_latency_bucket{}[60s])) by (cluster, dc, instance, le,ks,cf)) - labels: - by: "instance" - - record: wlatencyp99ks - expr: histogram_quantile(0.99, sum(rate(scylla_column_family_write_latency_bucket{}[60s])) by (cluster, dc, le,ks,cf)) - labels: - by: "dc" - - record: wlatencyp99ks - expr: histogram_quantile(0.99, sum(rate(scylla_column_family_write_latency_bucket{}[60s])) by (cluster, le,ks,cf)) - labels: - by: "cluster" - - record: rlatencyp99ks - expr: histogram_quantile(0.99, sum(rate(scylla_column_family_read_latency_bucket{}[60s])) by (cluster, dc, instance, shard, le,ks,cf)) - labels: - by: "instance,shard" - - record: rlatencyp99ks - expr: histogram_quantile(0.99, sum(rate(scylla_column_family_read_latency_bucket{}[60s])) by (cluster, dc, instance, le,ks,cf)) - labels: - by: "instance" - - record: rlatencyp99ks - expr: histogram_quantile(0.99, sum(rate(scylla_column_family_read_latency_bucket{}[60s])) by (cluster, dc, le,ks,cf)) - labels: - by: "dc" - - record: rlatencyp99ks - expr: histogram_quantile(0.99, sum(rate(scylla_column_family_read_latency_bucket{}[60s])) by (cluster, le,ks,cf)) - labels: - by: "cluster" - - record: wlatencyp95ks - expr: histogram_quantile(0.95, sum(rate(scylla_column_family_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, le,ks,cf)) - labels: - by: "instance,shard" - - record: wlatencyp95ks - expr: histogram_quantile(0.95, sum(rate(scylla_column_family_write_latency_bucket{}[60s])) by (cluster, dc, instance, le,ks,cf)) - labels: - by: "instance" - - record: wlatencyp95ks - expr: histogram_quantile(0.95, sum(rate(scylla_column_family_write_latency_bucket{}[60s])) by (cluster, dc, le,ks,cf)) - labels: - by: "dc" - - record: wlatencyp95ks - expr: histogram_quantile(0.95, sum(rate(scylla_column_family_write_latency_bucket{}[60s])) by (cluster, le,ks,cf)) - labels: - by: "cluster" - - record: rlatencyp95ks - expr: histogram_quantile(0.95, sum(rate(scylla_column_family_read_latency_bucket{}[60s])) by (cluster, dc, instance, shard, le,ks,cf)) - labels: - by: "instance,shard" - - record: rlatencyp95ks - expr: histogram_quantile(0.95, sum(rate(scylla_column_family_read_latency_bucket{}[60s])) by (cluster, dc, instance, le,ks,cf)) - labels: - by: "instance" - - record: rlatencyp95ks - expr: histogram_quantile(0.95, sum(rate(scylla_column_family_read_latency_bucket{}[60s])) by (cluster, dc, le,ks,cf)) - labels: - by: "dc" - - record: rlatencyp95ks - expr: histogram_quantile(0.95, sum(rate(scylla_column_family_read_latency_bucket{}[60s])) by (cluster, le,ks,cf)) - labels: - by: "cluster" - - record: wlatencyaks - expr: sum(rate(scylla_column_family_write_latency_sum{}[60s])) by (cluster, dc, instance, shard,ks,cf)/sum(rate(scylla_column_family_write_latency_count{}[60s])) by (cluster, dc, instance, shard,ks,cf) - labels: - by: "instance,shard" - - record: wlatencyaks - expr: sum(rate(scylla_column_family_write_latency_sum{}[60s])) by (cluster, dc, instance,ks,cf)/sum(rate(scylla_column_family_write_latency_count{}[60s])) by (cluster, dc, instance,ks,cf) - labels: - by: "instance" - - record: wlatencyaks - expr: sum(rate(scylla_column_family_write_latency_sum{}[60s])) by (cluster, dc,ks,cf)/sum(rate(scylla_column_family_write_latency_count{}[60s])) by (cluster, dc,ks,cf) - labels: - by: "dc" - - record: wlatencyaks - expr: sum(rate(scylla_column_family_write_latency_sum{}[60s])) by (cluster,ks,cf)/sum(rate(scylla_column_family_write_latency_count{}[60s])) by (cluster,ks,cf) - labels: - by: "cluster" - - record: rlatencyaks - expr: sum(rate(scylla_column_family_read_latency_sum{}[60s])) by (cluster, dc, instance, shard,ks,cf)/sum(rate(scylla_column_family_read_latency_count{}[60s])) by (cluster, dc, instance, shard,ks,cf) - labels: - by: "instance,shard" - - record: rlatencyaks - expr: sum(rate(scylla_column_family_read_latency_sum{}[60s])) by (cluster, dc, instance,ks,cf)/sum(rate(scylla_column_family_read_latency_count{}[60s])) by (cluster, dc, instance,ks,cf) - labels: - by: "instance" - - record: rlatencyaks - expr: sum(rate(scylla_column_family_read_latency_sum{}[60s])) by (cluster, dc,ks,cf)/sum(rate(scylla_column_family_read_latency_count{}[60s])) by (cluster, dc,ks,cf) - labels: - by: "dc" - - record: rlatencyaks - expr: sum(rate(scylla_column_family_read_latency_sum{}[60s])) by (cluster,ks,cf)/sum(rate(scylla_column_family_read_latency_count{}[60s])) by (cluster,ks,cf) - labels: - by: "cluster" diff --git a/kubernetes/linera-validator/templates/shards.yaml b/kubernetes/linera-validator/templates/shards.yaml deleted file mode 100644 index fcef0a615d20..000000000000 --- a/kubernetes/linera-validator/templates/shards.yaml +++ /dev/null @@ -1,159 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: shards - labels: - app: shards -spec: - ports: - - port: {{ .Values.shardPort }} - name: http - - port: {{ .Values.metricsPort }} - name: metrics - clusterIP: None - selector: - app: shards ---- -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: shards -spec: - serviceName: "shards" - replicas: {{ .Values.numShards }} - podManagementPolicy: Parallel - selector: - matchLabels: - app: shards - template: - metadata: - labels: - app: shards - spec: - terminationGracePeriodSeconds: 10 - initContainers: - - name: linera-server-initializer - image: {{ .Values.lineraImage }} - imagePullPolicy: {{ .Values.lineraImagePullPolicy }} - command: - - sh - - -c - - | - while true; do - ./linera storage check-existence --storage {{ .Values.storage | quote }} - status=$? - if [ $status -eq 0 ]; then - echo "Database already exists, no need to initialize." - exit 0 - elif [ $status -eq 1 ]; then - echo "Database does not exist, attempting to initialize..." - if ./linera storage initialize \ - --storage {{ .Values.storage | quote }} \ - --genesis /config/genesis.json \ - --storage-replication-factor {{ .Values.storageReplicationFactor | quote }}; then - echo "Initialization successful." - exit 0 - else - echo "Initialization failed, retrying in 5 seconds..." - sleep 5 - fi - else - echo "An unexpected error occurred (status: $status), retrying in 5 seconds..." - sleep 5 - fi - done - env: - - name: RUST_LOG - value: {{ .Values.logLevel }} - - name: RUST_BACKTRACE - value: "1" - - name: LINERA_OTLP_EXPORTER_ENDPOINT - value: {{ .Values.otlpExporterEndpoint }} - volumeMounts: - - name: config - mountPath: "/config" - readOnly: true - {{- if .Values.dualStore }} - - name: linera-db - mountPath: "/linera.db" - {{- end }} - containers: - - name: linera-server - image: {{ .Values.lineraImage }} - imagePullPolicy: {{ .Values.lineraImagePullPolicy }} - ports: - - containerPort: {{ .Values.shardPort }} - name: grpc - - containerPort: {{ .Values.metricsPort }} - name: metrics - livenessProbe: - tcpSocket: - port: {{ .Values.shardPort }} - initialDelaySeconds: 60 - periodSeconds: 30 - timeoutSeconds: 10 - failureThreshold: 3 - command: - - sh - - -c - - | - ORDINAL="${HOSTNAME##*-}" - exec ./linera-server run \ - --storage {{ .Values.storage | quote }} \ - --server /config/server.json \ - --shard $ORDINAL \ - --storage-replication-factor {{ .Values.storageReplicationFactor | quote }} \ - --storage-max-cache-size {{ .Values.storageCacheConfig.maxCacheSize | int }} \ - --storage-max-cache-entries {{ .Values.storageCacheConfig.maxCacheEntries | int }} \ - --storage-max-value-entry-size {{ .Values.storageCacheConfig.maxValueEntrySize | int }} \ - --storage-max-find-keys-entry-size {{ .Values.storageCacheConfig.maxFindKeysEntrySize | int }} \ - --storage-max-find-key-values-entry-size {{ .Values.storageCacheConfig.maxFindKeyValuesEntrySize | int }} \ - --storage-max-cache-value-size {{ .Values.storageCacheConfig.maxCacheValueSize | int }} \ - --storage-max-cache-find-keys-size {{ .Values.storageCacheConfig.maxCacheFindKeysSize | int }} \ - --storage-max-cache-find-key-values-size {{ .Values.storageCacheConfig.maxCacheFindKeyValuesSize | int }} \ - --blob-cache-size {{ .Values.storageCacheSizes.blobCacheSize | int }} \ - --confirmed-block-cache-size {{ .Values.storageCacheSizes.confirmedBlockCacheSize | int }} \ - --certificate-cache-size {{ .Values.storageCacheSizes.certificateCacheSize | int }} \ - --certificate-raw-cache-size {{ .Values.storageCacheSizes.certificateRawCacheSize | int }} \ - --event-cache-size {{ .Values.storageCacheSizes.eventCacheSize | int }} \ - --block-cache-size {{ .Values.blockCacheSize | int }} \ - --execution-state-cache-size {{ .Values.executionStateCacheSize | int }} \ - env: - - name: RUST_LOG - value: {{ .Values.logLevel }} - - name: LINERA_OTLP_EXPORTER_ENDPOINT - value: {{ .Values.otlpExporterEndpoint }} - {{- if .Values.serverTokioThreads }} - - name: LINERA_SERVER_TOKIO_THREADS - value: "{{ .Values.serverTokioThreads }}" - {{- end }} - volumeMounts: - - name: config - mountPath: "/config" - readOnly: true - {{- if .Values.dualStore }} - - name: linera-db - mountPath: "/linera.db" - {{- end }} - volumes: - - name: config - configMap: - name: validator-config - items: - - key: serverConfig - path: server.json - - key: genesisConfig - path: genesis.json - {{- if .Values.dualStore }} - volumeClaimTemplates: - - metadata: - name: linera-db - spec: - accessModes: ["ReadWriteOnce"] - {{- if .Values.usingLocalSsd }} - storageClassName: nvme-ssd-block - {{- end }} - resources: - requests: - storage: {{ .Values.rocksdbStorageSize }} - {{- end }} diff --git a/kubernetes/linera-validator/values-local.yaml.gotmpl b/kubernetes/linera-validator/values-local.yaml.gotmpl deleted file mode 100644 index cb368715ea66..000000000000 --- a/kubernetes/linera-validator/values-local.yaml.gotmpl +++ /dev/null @@ -1,208 +0,0 @@ -# Values for charts linera-validator for local validators. - -# Linera -lineraImage: {{ env "LINERA_HELMFILE_LINERA_IMAGE" | default "linera:latest" }} -lineraImagePullPolicy: Never -logLevel: "debug" -# OTLP Exporter Endpoint configuration: -# - If observability-alloy is enabled with traces, route through Alloy for fan-out to both local and central -# - Otherwise, use the direct endpoint (local Tempo or empty to disable) -{{- $observabilityAlloyEnabled := eq (env "LINERA_HELMFILE_SET_ENABLE_OBSERVABILITY_ALLOY" | default "false") "true" }} -{{- $tempoEnabled := eq (env "LINERA_HELMFILE_SET_TEMPO_ENABLED" | default "false") "true" }} -{{- $explicitEndpoint := env "LINERA_HELMFILE_SET_OTLP_EXPORTER_ENDPOINT" }} -{{- if $explicitEndpoint }} -{{- if and $observabilityAlloyEnabled $tempoEnabled }} -# Observability-alloy is enabled with traces - route through Alloy for k8sattributes enrichment -otlpExporterEndpoint: "http://observability-alloy.monitoring.svc.cluster.local:4317" -{{- else }} -# Direct endpoint -otlpExporterEndpoint: {{ $explicitEndpoint }} -{{- end }} -{{- else }} -# No otel_endpoint configured - tracing disabled -otlpExporterEndpoint: "" -{{- end }} -proxyPort: 19100 -metricsPort: 21100 -numShards: {{ env "LINERA_HELMFILE_SET_NUM_SHARDS" | default 10 }} -numProxies: {{ env "LINERA_HELMFILE_SET_NUM_PROXIES" | default 1 }} -serverTokioThreads: {{ env "LINERA_HELMFILE_SET_SERVER_TOKIO_THREADS" | default "" }} -# Size of the RocksDB storage per shard, IF using `DualStore`. Otherwise will be ignored. -rocksdbStorageSize: {{ env "LINERA_HELMFILE_SET_ROCKSDB_STORAGE_SIZE" | default "2Gi" }} -storage: {{ env "LINERA_HELMFILE_SET_STORAGE" | default "scylladb:tcp:scylla-client.scylla.svc.cluster.local:9042" }} -dualStore: {{ env "LINERA_HELMFILE_SET_DUAL_STORE" | default "false" }} -usingLocalSsd: {{ env "LINERA_HELMFILE_SET_USING_LOCAL_SSD" | default "false" }} -gcpRun: {{ env "LINERA_HELMFILE_SET_GCP_RUN" | default "false" }} -storageReplicationFactor: {{ env "LINERA_HELMFILE_SET_STORAGE_REPLICATION_FACTOR" | default 1 }} - -# Explorer Services (Indexer, Block Exporter, Web Explorer) -blockExporter: - enabled: {{ env "LINERA_HELMFILE_SET_EXPLORER_ENABLED" | default "false" }} - replicas: {{ env "LINERA_HELMFILE_NUM_BLOCK_EXPORTERS" | default "1" }} - port: {{ env "LINERA_HELMFILE_BLOCK_EXPORTER_PORT" | default "8882" }} - metricsPort: 9091 - storageSize: 1Gi - logLevel: {{ env "LINERA_HELMFILE_SET_BLOCK_EXPORTER_LOG_LEVEL" | default "info" }} - serviceMonitor: - enabled: true - -indexer: - enabled: {{ env "LINERA_HELMFILE_SET_EXPLORER_ENABLED" | default "false" }} - image: {{ env "LINERA_HELMFILE_INDEXER_IMAGE" | default "linera-indexer:latest" }} - imagePullPolicy: Never - port: 8081 - databasePath: /data/indexer.db - storageSize: 2Gi - logLevel: {{ env "LINERA_HELMFILE_SET_INDEXER_LOG_LEVEL" | default "info" }} - -explorer: - enabled: {{ env "LINERA_HELMFILE_SET_EXPLORER_ENABLED" | default "false" }} - image: {{ env "LINERA_HELMFILE_EXPLORER_IMAGE" | default "linera-explorer:latest" }} - imagePullPolicy: Never - frontendPort: 3001 - apiPort: 3002 - logLevel: {{ env "LINERA_HELMFILE_SET_EXPLORER_LOG_LEVEL" | default "info" }} - ingress: - enabled: {{ env "LINERA_HELMFILE_SET_EXPLORER_ENABLED" | default "false" }} - hosts: - - host: linera-explorer.local - paths: - - path: / - pathType: Prefix - -# Loki -loki-stack: - enabled: {{ env "LINERA_HELMFILE_SET_LOKI_STACK_ENABLED" | default "true" }} - loki: - enabled: true - isDefault: false - persistence: - enabled: true - size: 1Gi - config: - limits_config: - reject_old_samples_max_age: 24h - promtail: - enabled: true - config: - clients: - - url: http://linera-core-loki:3100/loki/api/v1/push - -# Prometheus/Grafana -kube-prometheus-stack: - enabled: {{ env "LINERA_HELMFILE_SET_PROMETHEUS_STACK_ENABLED" | default "true" }} - crds: - enabled: true - grafana: - sidecar: - dashboards: - enabled: true - label: grafana_dashboard - labelValue: "1" - folderAnnotation: grafana_folder - provider: - foldersFromFilesStructure: true - persistence: - enabled: true - size: 1Gi - plugins: - - grafana-piechart-panel - prometheus: - prometheusSpec: - {{- if .Values.writeToGrafanaCloud }} - scrapeInterval: 90s - remoteWrite: - - url: https://prometheus-prod-13-prod-us-east-0.grafana.net/api/prom/push - basicAuth: - username: - name: grafana-cloud-auth-secret - key: username - password: - name: grafana-cloud-auth-secret - key: password - writeRelabelConfigs: - - sourceLabels: [__name__] - regex: (apiextensions|apiserver|csi|kube|kubelet|kubernetes|node|prober|prometheus|rest|storage|volume|etcd|net|grafana|authentication|code|workqueue|cluster|go|alertmanager|authorization|namespace|scrape|up|field|registered|process|scylla).+ - action: drop - - regex: endpoint|instance|namespace|pod|prometheus|prometheus_replica|service|name|resource|id - action: labeldrop - {{- end }} - externalLabels: - validator: {{ .Values.validatorLabel }} - retention: 2d - retentionSize: 1GB - storageSpec: - volumeClaimTemplate: - spec: - storageClassName: standard - accessModes: ["ReadWriteOnce"] - resources: - requests: - storage: 1Gi - # Instruct prometheus operator to search for any ServiceMonitor - serviceMonitorSelector: {} - serviceMonitorNamespaceSelector: {} - # This prevents from adding any Helm label to serviceMonitorSelector if - # above is empty. - serviceMonitorSelectorNilUsesHelmValues: false - ruleSelector: {} - ruleSelectorNilUsesHelmValues: false - # Relabelings needed for Scylla dashboards - additionalScrapeConfigs: - - job_name: scylla - relabel_configs: - - source_labels: [ __address__ ] - regex: '([^:]+)' - target_label: __address__ - replacement: '${1}:9180' - - source_labels: [ __address__ ] - regex: '(.*):.+' - target_label: instance - replacement: '${1}' - metric_relabel_configs: - - source_labels: [ version ] - regex: '(.+)' - target_label: CPU - replacement: 'cpu' - - source_labels: [ version ] - regex: '(.+)' - target_label: CQL - replacement: 'cql' - - source_labels: [ version ] - regex: '(.+)' - target_label: OS - replacement: 'os' - - source_labels: [ version ] - regex: '(.+)' - target_label: IO - replacement: 'io' - - source_labels: [ version ] - regex: '(.+)' - target_label: Errors - replacement: 'errors' - - regex: 'help|exported_instance|type' - action: labeldrop - - source_labels: [ version ] - regex: '([0-9]+\.[0-9]+)(\.?[0-9]*).*' - replacement: '$1$2' - target_label: svr - -# Pyroscope (controlled by --with-memory-profiling flag) -pyroscope: - enabled: {{ env "LINERA_HELMFILE_SET_ENABLE_MEMORY_PROFILING" | default "false" }} - -# Pyroscope Alloy (eBPF profiling - internal to cluster) -pyroscope-alloy: - enabled: {{ env "LINERA_HELMFILE_SET_ENABLE_MEMORY_PROFILING" | default "false" }} - -# Observability Alloy (External metrics/logs/traces export - optional) -observability-alloy: - enabled: {{ env "LINERA_HELMFILE_SET_ENABLE_OBSERVABILITY_ALLOY" | default "false" }} - -# Environment -environment: "kind" - -# Validator -validator: - serverConfig: {{ env "LINERA_HELMFILE_SET_SERVER_CONFIG" | default "working/server_1.json" }} - genesisConfig: {{ env "LINERA_HELMFILE_SET_GENESIS_CONFIG" | default "working/genesis.json" }} diff --git a/kubernetes/linera-validator/values-observability-alloy.yaml.gotmpl b/kubernetes/linera-validator/values-observability-alloy.yaml.gotmpl deleted file mode 100644 index cb3dcd9a8f4b..000000000000 --- a/kubernetes/linera-validator/values-observability-alloy.yaml.gotmpl +++ /dev/null @@ -1,418 +0,0 @@ -# Values for observability-alloy - External metrics/logs/traces export -# Deployed in monitoring namespace, scrapes from default namespace -# This is COMPLETELY SEPARATE from pyroscope-alloy (eBPF profiling) - -alloy: - controller: - type: daemonset - # Expose OTLP receiver ports for traces ingestion - extraPorts: - - name: otlp-grpc - port: 4317 - targetPort: 4317 - protocol: TCP - - name: otlp-http - port: 4318 - targetPort: 4318 - protocol: TCP - configMap: - create: true - content: |- - // Grafana Alloy configuration for Linera validator observability - // Collects metrics, logs, and traces and forwards to central stack - - // ==================== Prometheus Metrics Scraping ==================== - - // Discover Kubernetes pods for scraping (in default namespace) - discovery.kubernetes "pods" { - role = "pod" - namespaces { - names = ["default"] - } - } - - // Relabel discovered pods to scrape all pods in namespace - discovery.relabel "linera_metrics" { - targets = discovery.kubernetes.pods.targets - - rule { - source_labels = ["__meta_kubernetes_pod_container_name"] - target_label = "job" - replacement = "linera-${1}" - } - - rule { - source_labels = ["__meta_kubernetes_pod_name"] - target_label = "instance" - } - - rule { - source_labels = ["__meta_kubernetes_namespace"] - target_label = "namespace" - } - - rule { - target_label = "cluster" - replacement = env("CLUSTER_NAME") - } - - rule { - target_label = "validator" - replacement = env("VALIDATOR_NAME") - } - - // Keep pods with a port named "metrics" (covers shards 21100, proxy 21100, block-exporter 9091) - rule { - source_labels = ["__meta_kubernetes_pod_container_port_name"] - regex = "metrics" - action = "keep" - } - - rule { - source_labels = ["__meta_kubernetes_pod_ip", "__meta_kubernetes_pod_container_port_number"] - separator = ":" - target_label = "__address__" - } - } - - {{- if eq (env "LINERA_HELMFILE_SET_PROMETHEUS_ENABLED" | default "false") "true" }} - // ==================== Prometheus Metrics Export ==================== - - // Scrape metrics and forward to Prometheus exporter - prometheus.scrape "linera_metrics" { - targets = discovery.relabel.linera_metrics.output - forward_to = [otelcol.receiver.prometheus.default.receiver] - scrape_interval = "15s" - scrape_timeout = "10s" - } - - prometheus.exporter.self "alloy" {} - - prometheus.scrape "alloy_metrics" { - targets = prometheus.exporter.self.alloy.targets - forward_to = [otelcol.receiver.prometheus.default.receiver] - } - - // Convert Prometheus metrics to OTLP format - otelcol.receiver.prometheus "default" { - output { - metrics = [otelcol.exporter.otlphttp.prometheus.input] - } - } - - // Export Prometheus metrics as OTLP - otelcol.exporter.otlphttp "prometheus" { - client { - endpoint = env("PROMETHEUS_OTLP_URL") - auth = otelcol.auth.basic.prometheus_credentials.handler - - tls { - insecure_skip_verify = false - } - - compression = "gzip" - } - } - - // Basic auth for Prometheus OTLP - otelcol.auth.basic "prometheus_credentials" { - username = env("PROMETHEUS_OTLP_USER") - password = env("PROMETHEUS_OTLP_PASS") - } - {{- else }} - // Prometheus export disabled - scrape but don't forward - prometheus.scrape "linera_metrics" { - targets = discovery.relabel.linera_metrics.output - forward_to = [] - scrape_interval = "15s" - scrape_timeout = "10s" - } - - prometheus.exporter.self "alloy" {} - - prometheus.scrape "alloy_metrics" { - targets = prometheus.exporter.self.alloy.targets - forward_to = [] - } - {{- end }} - - {{- if eq (env "LINERA_HELMFILE_SET_LOKI_ENABLED" | default "false") "true" }} - // ==================== Loki Logs Collection ==================== - - // Discover Kubernetes pods for log collection (in default namespace) - discovery.kubernetes "pod_logs" { - role = "pod" - namespaces { - names = ["default"] - } - } - - // Relabel discovered pods for log collection - discovery.relabel "pod_logs" { - targets = discovery.kubernetes.pod_logs.targets - - rule { - source_labels = ["__meta_kubernetes_pod_name"] - target_label = "pod" - } - - rule { - source_labels = ["__meta_kubernetes_pod_container_name"] - target_label = "container" - } - - rule { - source_labels = ["__meta_kubernetes_namespace"] - target_label = "namespace" - } - - rule { - target_label = "cluster" - replacement = env("CLUSTER_NAME") - } - - rule { - target_label = "validator" - replacement = env("VALIDATOR_NAME") - } - } - - // Read pod logs and forward to Loki - loki.source.kubernetes "pods" { - targets = discovery.relabel.pod_logs.output - forward_to = [loki.write.central.receiver] - } - - // Write logs to external Loki - loki.write "central" { - endpoint { - url = env("LOKI_PUSH_URL") - - basic_auth { - username = env("LOKI_PUSH_USER") - password = env("LOKI_PUSH_PASS") - } - - tls_config { - insecure_skip_verify = false - } - } - - external_labels = { - cluster = env("CLUSTER_NAME"), - validator = env("VALIDATOR_NAME"), - } - } - {{- end }} - - // ==================== Trace Pipeline (always active) ==================== - // Receives traces via OTLP, enriches with k8s metadata, forwards to local Tempo. - // If TEMPO_ENABLED, also forwards to central Tempo. - - // OTLP receiver for traces - otelcol.receiver.otlp "default" { - grpc { - endpoint = "0.0.0.0:4317" - } - - http { - endpoint = "0.0.0.0:4318" - } - - output { - traces = [otelcol.processor.k8sattributes.default.input] - } - } - - otelcol.processor.k8sattributes "default" { - extract { - metadata = [ - "k8s.namespace.name", - "k8s.pod.name", - "k8s.container.name", - "k8s.node.name", - "k8s.deployment.name", - "k8s.statefulset.name", - ] - } - - pod_association { - source { - from = "connection" - } - } - - output { - traces = [ - otelcol.exporter.otlp.local_tempo.input, - {{- if eq (env "LINERA_HELMFILE_SET_TEMPO_ENABLED" | default "false") "true" }} - otelcol.exporter.otlphttp.central.input, - {{- end }} - ] - } - } - - // Export traces to LOCAL Tempo (always active) - otelcol.exporter.otlp "local_tempo" { - client { - endpoint = "tempo.tempo.svc.cluster.local:4317" - - tls { - insecure = true - } - } - } - - {{- if eq (env "LINERA_HELMFILE_SET_TEMPO_ENABLED" | default "false") "true" }} - // Export traces to external/central Tempo - otelcol.exporter.otlphttp "central" { - client { - endpoint = env("TEMPO_OTLP_URL") - auth = otelcol.auth.basic.credentials.handler - - tls { - insecure_skip_verify = false - } - } - } - - // Basic auth for central OTLP - otelcol.auth.basic "credentials" { - username = env("TEMPO_OTLP_USER") - password = env("TEMPO_OTLP_PASS") - } - {{- end }} - - {{- if eq (env "LINERA_HELMFILE_SET_PYROSCOPE_PUSH_ENABLED" | default "false") "true" }} - // ==================== Pyroscope Profile Forwarding ==================== - // Scrapes pprof memory profiles from validator pods and forwards to central Pyroscope - - // Relabel pods for pprof scraping (shards and proxies expose pprof on port 21100) - discovery.relabel "pprof_targets" { - targets = discovery.kubernetes.pods.targets - - // Keep pods with a port named "metrics" (shards 21100, proxy 21100) - rule { - source_labels = ["__meta_kubernetes_pod_container_port_name"] - regex = "metrics" - action = "keep" - } - - rule { - source_labels = ["__meta_kubernetes_pod_ip", "__meta_kubernetes_pod_container_port_number"] - separator = ":" - target_label = "__address__" - } - - rule { - source_labels = ["__meta_kubernetes_pod_container_name"] - target_label = "service_name" - replacement = "memory/default/${1}" - } - - rule { - source_labels = ["__meta_kubernetes_pod_name"] - target_label = "instance" - } - - rule { - source_labels = ["__meta_kubernetes_namespace"] - target_label = "namespace" - } - - rule { - target_label = "cluster" - replacement = env("CLUSTER_NAME") - } - - rule { - target_label = "validator" - replacement = env("VALIDATOR_NAME") - } - } - - // Scrape pprof memory profiles from validator pods - pyroscope.scrape "memory" { - targets = discovery.relabel.pprof_targets.output - forward_to = [pyroscope.write.central.receiver] - - profiling_config { - profile.memory { - enabled = true - path = "/debug/pprof/allocs" - } - profile.process_cpu { - enabled = false - } - profile.goroutine { - enabled = false - } - profile.block { - enabled = false - } - profile.mutex { - enabled = false - } - profile.fgprof { - enabled = false - } - } - - scrape_interval = "30s" - scrape_timeout = "45s" - } - - // Write profiles to central Pyroscope - pyroscope.write "central" { - endpoint { - url = env("PYROSCOPE_PUSH_URL") - - basic_auth { - username = env("PYROSCOPE_PUSH_USER") - password = env("PYROSCOPE_PUSH_PASS") - } - } - - external_labels = { - cluster = env("CLUSTER_NAME"), - validator = env("VALIDATOR_NAME"), - } - } - {{- end }} - extraEnv: - - name: CLUSTER_NAME - value: {{ env "LINERA_HELMFILE_SET_NETWORK_NAME" | default "" | quote }} - - name: VALIDATOR_NAME - value: {{ env "LINERA_HELMFILE_VALIDATOR_DOMAIN_NAME" | default "" | quote }} - - name: PROMETHEUS_ENABLED - value: {{ env "LINERA_HELMFILE_SET_PROMETHEUS_ENABLED" | default "false" | quote }} - - name: PROMETHEUS_OTLP_URL - value: {{ env "LINERA_HELMFILE_SET_PROMETHEUS_OTLP_URL" | default "" | quote }} - - name: PROMETHEUS_OTLP_USER - value: {{ env "LINERA_HELMFILE_SET_PROMETHEUS_OTLP_USER" | default "" | quote }} - - name: PROMETHEUS_OTLP_PASS - value: {{ env "LINERA_HELMFILE_SET_PROMETHEUS_OTLP_PASS" | default "" | quote }} - - name: LOKI_ENABLED - value: {{ env "LINERA_HELMFILE_SET_LOKI_ENABLED" | default "false" | quote }} - - name: LOKI_PUSH_URL - value: {{ env "LINERA_HELMFILE_SET_LOKI_PUSH_URL" | default "" | quote }} - - name: LOKI_PUSH_USER - value: {{ env "LINERA_HELMFILE_SET_LOKI_PUSH_USER" | default "" | quote }} - - name: LOKI_PUSH_PASS - value: {{ env "LINERA_HELMFILE_SET_LOKI_PUSH_PASS" | default "" | quote }} - - name: TEMPO_ENABLED - value: {{ env "LINERA_HELMFILE_SET_TEMPO_ENABLED" | default "false" | quote }} - - name: TEMPO_OTLP_URL - value: {{ env "LINERA_HELMFILE_SET_TEMPO_OTLP_URL" | default "" | quote }} - - name: TEMPO_OTLP_USER - value: {{ env "LINERA_HELMFILE_SET_TEMPO_OTLP_USER" | default "" | quote }} - - name: TEMPO_OTLP_PASS - value: {{ env "LINERA_HELMFILE_SET_TEMPO_OTLP_PASS" | default "" | quote }} - - name: PYROSCOPE_PUSH_ENABLED - value: {{ env "LINERA_HELMFILE_SET_PYROSCOPE_PUSH_ENABLED" | default "false" | quote }} - - name: PYROSCOPE_PUSH_URL - value: {{ env "LINERA_HELMFILE_SET_PYROSCOPE_PUSH_URL" | default "" | quote }} - - name: PYROSCOPE_PUSH_USER - value: {{ env "LINERA_HELMFILE_SET_PYROSCOPE_PUSH_USER" | default "" | quote }} - - name: PYROSCOPE_PUSH_PASS - value: {{ env "LINERA_HELMFILE_SET_PYROSCOPE_PUSH_PASS" | default "" | quote }} \ No newline at end of file diff --git a/kubernetes/linera-validator/values.yaml b/kubernetes/linera-validator/values.yaml deleted file mode 100644 index 75ba0e44a12a..000000000000 --- a/kubernetes/linera-validator/values.yaml +++ /dev/null @@ -1,705 +0,0 @@ -# Default values for linera-validator chart -# This file provides sane defaults for all configuration options. -# Override these values using environment variables or custom values files. - -# ============================================================================ -# Core Linera Configuration -# ============================================================================ - -# Container image configuration -lineraImage: "linera:latest" -lineraImagePullPolicy: "IfNotPresent" - -# Logging configuration -logLevel: "info" - -# OpenTelemetry configuration -# Set to empty string to disable OTLP tracing -otlpExporterEndpoint: "" - -# Network ports -proxyPort: 19100 -shardPort: 19100 -metricsPort: 21100 - -# Deployment scaling -numShards: 4 -numProxies: 1 - -# Performance tuning -# Set to empty string to use default Tokio thread count -serverTokioThreads: "" - -# ============================================================================ -# Storage Configuration -# ============================================================================ - -# Primary storage backend -# Default: ScyllaDB connection string -storage: "scylladb:tcp:scylla-client.scylla.svc.cluster.local:9042" - -# Storage replication factor -storageReplicationFactor: 1 - -# LRU cache configuration for storage operations -# These settings control memory usage for caching storage queries -storageCacheConfig: - # Maximum total cache size in bytes - maxCacheSize: 1000000000 - # Maximum number of entries in the cache - maxCacheEntries: 500000 - # Maximum size of a single value entry in bytes - maxValueEntrySize: 1000000 - # Maximum size of a single find-keys entry in bytes - maxFindKeysEntrySize: 1000000 - # Maximum size of a single find-key-values entry in bytes - maxFindKeyValuesEntrySize: 1000000 - # Maximum total size of value entries in bytes - maxCacheValueSize: 500000000 - # Maximum total size of find-keys entries in bytes - maxCacheFindKeysSize: 200000000 - # Maximum total size of find-key-values entries in bytes - maxCacheFindKeyValuesSize: 10000000 - -# Individual cache sizes for DbStorage ValueCaches -# These control the number of entries in each in-memory LRU cache -storageCacheSizes: - blobCacheSize: 1000 - confirmedBlockCacheSize: 10000 - certificateCacheSize: 5000 - certificateRawCacheSize: 50000 - eventCacheSize: 20000 - -# Block cache size (number of entries) -blockCacheSize: 20000 - -# Execution state cache size (number of entries) -executionStateCacheSize: 20000 - -# Dual storage mode (RocksDB + ScyllaDB) -dualStore: false - -# RocksDB storage size per shard (only used if dualStore is true) -rocksdbStorageSize: "2Gi" - -# Local SSD usage flag (GCP-specific) -usingLocalSsd: false - -# GCP-specific run flag -gcpRun: false - -# ============================================================================ -# Validator Configuration -# ============================================================================ - -validator: - # Server configuration file path - serverConfig: "working/server_1.json" - # Genesis configuration file path - genesisConfig: "working/genesis.json" - -# ============================================================================ -# Explorer Services (Indexer, Block Exporter, Web Explorer) -# ============================================================================ - -# Block Exporter - exports blocks for indexing -blockExporter: - enabled: false - image: "linera-exporter:latest" - imagePullPolicy: "IfNotPresent" - replicas: 1 - port: 8882 - metricsPort: 9091 - storageSize: "1Gi" - logLevel: "info" - serviceMonitor: - enabled: false - -# Indexer - indexes blockchain data -indexer: - enabled: false - image: "linera-indexer:latest" - imagePullPolicy: "IfNotPresent" - port: 8081 - databasePath: "/data/indexer.db" - storageSize: "2Gi" - logLevel: "info" - -# Explorer - web interface for blockchain exploration -explorer: - enabled: false - image: "linera-explorer:latest" - imagePullPolicy: "IfNotPresent" - frontendPort: 3001 - apiPort: 3002 - logLevel: "info" - ingress: - enabled: false - annotations: {} - hosts: - - host: "linera-explorer.local" - paths: - - path: "/" - pathType: "Prefix" - tls: [] - # Example TLS configuration: - # tls: - # - secretName: explorer-tls - # hosts: - # - linera-explorer.example.com - -# ============================================================================ -# Environment Configuration -# ============================================================================ - -# Environment type: "kind" (local), "GCP", etc. -environment: "kind" - -# GCP-specific configuration (only used when environment is "GCP") -staticIpGcpName: "" -validatorDomainName: "" - -# ============================================================================ -# Monitoring & Observability -# ============================================================================ - -# Grafana Cloud integration -writeToGrafanaCloud: false -grafanaCloudUsername: "" -grafanaCloudAPIToken: "" - -# Validator label for external metrics systems -validatorLabel: "validator-1" - -# ============================================================================ -# Optional Monitoring Stack Dependencies -# ============================================================================ -# These are disabled by default. Enable explicitly when needed. - -# Pyroscope Alloy - eBPF and memory profiling (ORIGINAL FUNCTIONALITY) -# Enable via LINERA_HELMFILE_SET_ENABLE_MEMORY_PROFILING=true or --with-memory-profiling CLI flag -# This is dedicated to continuous profiling and sends data to local Pyroscope server -pyroscope-alloy: - enabled: false - alloy: - controller: - type: daemonset - hostPID: true - configMap: - create: true - # Original Pyroscope profiling configuration - DO NOT MODIFY - # This config does eBPF profiling and memory profiling for local Pyroscope - content: |- - // Alloy configuration for eBPF profiling of Linera components - // This is the ORIGINAL configuration for Pyroscope profiling only - - // Kubernetes service discovery for shards - discovery.kubernetes "shards" { - role = "pod" - namespaces { - names = ["default"] - } - selectors { - role = "pod" - label = "app=shards" - } - } - - // Kubernetes service discovery for proxies - discovery.kubernetes "proxies" { - role = "pod" - namespaces { - names = ["default"] - } - selectors { - role = "pod" - label = "app=proxy" - } - } - - // Add service_name labels to shards targets - discovery.relabel "shards" { - targets = discovery.kubernetes.shards.targets - rule { - source_labels = ["__meta_kubernetes_namespace", "__meta_kubernetes_pod_label_app"] - separator = "/" - target_label = "service_name" - replacement = "ebpf/${1}/${2}" - } - rule { - source_labels = ["__meta_kubernetes_pod_name"] - target_label = "pod_name" - } - } - - // Add service_name labels to proxy targets - discovery.relabel "proxies" { - targets = discovery.kubernetes.proxies.targets - rule { - source_labels = ["__meta_kubernetes_namespace", "__meta_kubernetes_pod_label_app"] - separator = "/" - target_label = "service_name" - replacement = "ebpf/${1}/${2}" - } - rule { - source_labels = ["__meta_kubernetes_pod_name"] - target_label = "pod_name" - } - } - - // eBPF CPU profiling for shards - pyroscope.ebpf "shards_profiling" { - forward_to = [pyroscope.write.endpoint.receiver] - sample_rate = 99 - targets = discovery.relabel.shards.output - } - - // eBPF CPU profiling for proxies - pyroscope.ebpf "proxies_profiling" { - forward_to = [pyroscope.write.endpoint.receiver] - sample_rate = 99 - targets = discovery.relabel.proxies.output - } - - // Relabel shards targets for memory profiling on port 21100 - discovery.relabel "shards_memory" { - targets = discovery.kubernetes.shards.targets - rule { - source_labels = ["__meta_kubernetes_pod_ip"] - target_label = "__address__" - replacement = "${1}:21100" - } - rule { - source_labels = ["__meta_kubernetes_namespace", "__meta_kubernetes_pod_label_app"] - separator = "/" - target_label = "service_name" - replacement = "memory/${1}/${2}" - } - rule { - source_labels = ["__meta_kubernetes_pod_name"] - target_label = "pod_name" - } - } - - // Relabel proxy targets for memory profiling on port 21100 - discovery.relabel "proxies_memory" { - targets = discovery.kubernetes.proxies.targets - rule { - source_labels = ["__meta_kubernetes_pod_ip"] - target_label = "__address__" - replacement = "${1}:21100" - } - rule { - source_labels = ["__meta_kubernetes_namespace", "__meta_kubernetes_pod_label_app"] - separator = "/" - target_label = "service_name" - replacement = "memory/${1}/${2}" - } - rule { - source_labels = ["__meta_kubernetes_pod_name"] - target_label = "pod_name" - } - } - - // Memory profiling via jemalloc pprof HTTP endpoints - pyroscope.scrape "memory_profiling" { - targets = array.concat( - discovery.relabel.shards_memory.output, - discovery.relabel.proxies_memory.output, - ) - forward_to = [pyroscope.write.endpoint.receiver] - profiling_config { - profile.memory { - enabled = true - path = "/debug/pprof" - } - profile.process_cpu { - enabled = false - } - profile.goroutine { - enabled = false - } - profile.block { - enabled = false - } - profile.mutex { - enabled = false - } - } - job_name = "memory-profiling" - scrape_interval = "30s" - scrape_timeout = "45s" - } - - // Write profiles to local Pyroscope server - pyroscope.write "endpoint" { - endpoint { - url = "http://linera-core-pyroscope:4040" - } - } - - // Logging configuration - logging { - level = "info" - format = "logfmt" - write_to = [loki.write.logs.receiver] - } - - // Forward Alloy logs to Loki - loki.write "logs" { - endpoint { - url = "http://linera-core-loki:3100/loki/api/v1/push" - } - external_labels = { - "component" = "alloy-pyroscope", - } - } - securityContext: - privileged: true - runAsGroup: 0 - runAsUser: 0 - -# Observability Alloy - External metrics/logs/traces export (NEW FEATURE) -# Enable via LINERA_HELMFILE_SET_OBSERVABILITY_ALLOY_ENABLED=true or --alloy-enabled CLI flag -# This is dedicated to exporting observability data to external authenticated endpoints -observability-alloy: - enabled: false - alloy: - controller: - type: daemonset - configMap: - create: true - # This config exports to external Prometheus, Loki, and Tempo with authentication - # Uses conditional forwarding based on ENABLED flags - content: |- - // Grafana Alloy configuration for Linera validator observability - // Collects metrics, logs, and traces and forwards to central stack - - // ==================== Prometheus Metrics Scraping ==================== - - // Discover Kubernetes pods for scraping - discovery.kubernetes "pods" { - role = "pod" - - namespaces { - names = [env("NAMESPACE")] - } - } - - // Relabel discovered pods to scrape all pods in namespace - discovery.relabel "linera_metrics" { - targets = discovery.kubernetes.pods.targets - - // Set job label based on container name - rule { - source_labels = ["__meta_kubernetes_pod_container_name"] - target_label = "job" - replacement = "linera-${1}" - } - - // Set instance label to pod name - rule { - source_labels = ["__meta_kubernetes_pod_name"] - target_label = "instance" - } - - // Set namespace label - rule { - source_labels = ["__meta_kubernetes_namespace"] - target_label = "namespace" - } - - // Set cluster label - rule { - target_label = "cluster" - replacement = env("CLUSTER_NAME") - } - - // Set validator label - rule { - target_label = "validator" - replacement = env("VALIDATOR_NAME") - } - - // Keep pods with a port named "metrics" (covers shards 21100, proxy 21100, block-exporter 9091) - rule { - source_labels = ["__meta_kubernetes_pod_container_port_name"] - regex = "metrics" - action = "keep" - } - - // Set __address__ to pod IP:port - rule { - source_labels = ["__meta_kubernetes_pod_ip", "__meta_kubernetes_pod_container_port_number"] - separator = ":" - target_label = "__address__" - } - } - - // Scrape metrics from discovered pods - prometheus.scrape "linera_metrics" { - targets = discovery.relabel.linera_metrics.output - - // Conditional forwarding - only export if PROMETHEUS_ENABLED is set to "true" - forward_to = env("PROMETHEUS_ENABLED") == "true" ? [otelcol.receiver.prometheus.default.receiver] : [] - - scrape_interval = "15s" - scrape_timeout = "10s" - } - - // Expose Alloy's own metrics - prometheus.exporter.self "alloy" {} - - prometheus.scrape "alloy_metrics" { - targets = prometheus.exporter.self.alloy.targets - // Conditional forwarding - only export if PROMETHEUS_ENABLED is set to "true" - forward_to = env("PROMETHEUS_ENABLED") == "true" ? [otelcol.receiver.prometheus.default.receiver] : [] - } - - // ==================== Prometheus Metrics Export (Optional) ==================== - - // Convert Prometheus metrics to OTLP and send to external Prometheus - // Enabled via PROMETHEUS_ENABLED environment variable - // Requires: PROMETHEUS_OTLP_URL, PROMETHEUS_OTLP_USER, PROMETHEUS_OTLP_PASS - - // Export Prometheus metrics as OTLP (only if enabled) - otelcol.exporter.otlphttp "prometheus" { - client { - endpoint = env("PROMETHEUS_OTLP_URL") - - auth = otelcol.auth.basic.prometheus_credentials.handler - - tls { - insecure_skip_verify = false - } - - compression = "gzip" - - headers = { - "Content-Type" = "application/x-protobuf", - } - } - - encoding = "proto" - } - - // Basic auth for Prometheus OTLP - otelcol.auth.basic "prometheus_credentials" { - username = env("PROMETHEUS_OTLP_USER") - password = env("PROMETHEUS_OTLP_PASS") - } - - // Convert Prometheus metrics to OTLP format (only if enabled) - otelcol.receiver.prometheus "default" { - output { - metrics = [otelcol.exporter.otlphttp.prometheus.input] - } - } - - // ==================== Loki Logs Collection ==================== - - // Discover Kubernetes pods for log collection - discovery.kubernetes "pod_logs" { - role = "pod" - - namespaces { - names = [env("NAMESPACE")] - } - } - - // Relabel discovered pods for log collection - discovery.relabel "pod_logs" { - targets = discovery.kubernetes.pod_logs.targets - - // Set pod label - rule { - source_labels = ["__meta_kubernetes_pod_name"] - target_label = "pod" - } - - // Set container label - rule { - source_labels = ["__meta_kubernetes_pod_container_name"] - target_label = "container" - } - - // Set namespace label - rule { - source_labels = ["__meta_kubernetes_namespace"] - target_label = "namespace" - } - - // Set cluster label - rule { - target_label = "cluster" - replacement = env("CLUSTER_NAME") - } - - // Set validator label - rule { - target_label = "validator" - replacement = env("VALIDATOR_NAME") - } - } - - // Read pod logs - loki.source.kubernetes "pods" { - targets = discovery.relabel.pod_logs.output - // Conditional forwarding - only export if LOKI_ENABLED is set to "true" - forward_to = env("LOKI_ENABLED") == "true" ? [loki.write.central.receiver] : [] - } - - // Write logs to external Loki (only if enabled) - // Enabled via LOKI_ENABLED environment variable - // Requires: LOKI_PUSH_URL, LOKI_PUSH_USER, LOKI_PUSH_PASS - loki.write "central" { - endpoint { - url = env("LOKI_PUSH_URL") - - basic_auth { - username = env("LOKI_PUSH_USER") - password = env("LOKI_PUSH_PASS") - } - - tls_config { - insecure_skip_verify = false - } - } - - external_labels = { - cluster = env("CLUSTER_NAME"), - validator = env("VALIDATOR_NAME"), - } - } - - // ==================== Tempo Traces Collection ==================== - - // OTLP receiver for traces - otelcol.receiver.otlp "default" { - grpc { - endpoint = "0.0.0.0:4317" - } - - http { - endpoint = "0.0.0.0:4318" - } - - output { - // Conditional forwarding - only export if TEMPO_ENABLED is set to "true" - traces = env("TEMPO_ENABLED") == "true" ? [otelcol.exporter.otlphttp.central.input] : [] - } - } - - // Export traces to external Tempo (only if enabled) - // Enabled via TEMPO_ENABLED environment variable - // Requires: TEMPO_OTLP_URL, TEMPO_OTLP_USER, TEMPO_OTLP_PASS - otelcol.exporter.otlphttp "central" { - client { - endpoint = env("TEMPO_OTLP_URL") - - auth = otelcol.auth.basic.credentials.handler - - tls { - insecure_skip_verify = false - } - } - } - - // Basic auth for OTLP - otelcol.auth.basic "credentials" { - username = env("TEMPO_OTLP_USER") - password = env("TEMPO_OTLP_PASS") - } - extraEnv: - - name: NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: CLUSTER_NAME - value: "" - - name: VALIDATOR_NAME - value: "" - - name: PROMETHEUS_ENABLED - value: "false" - - name: PROMETHEUS_OTLP_URL - value: "" - - name: PROMETHEUS_OTLP_USER - value: "" - - name: PROMETHEUS_OTLP_PASS - value: "" - - name: LOKI_ENABLED - value: "false" - - name: LOKI_PUSH_URL - value: "" - - name: LOKI_PUSH_USER - value: "" - - name: LOKI_PUSH_PASS - value: "" - - name: TEMPO_ENABLED - value: "false" - - name: TEMPO_OTLP_URL - value: "" - - name: TEMPO_OTLP_USER - value: "" - - name: TEMPO_OTLP_PASS - value: "" - -# Loki Stack - log aggregation -loki-stack: - enabled: false - loki: - enabled: false - isDefault: false - persistence: - enabled: true - size: "1Gi" - config: - limits_config: - reject_old_samples_max_age: "24h" - promtail: - enabled: false - config: - clients: - - url: "http://linera-core-loki:3100/loki/api/v1/push" - -# Kube Prometheus Stack - metrics and alerting -kube-prometheus-stack: - enabled: false - grafana: - sidecar: - dashboards: - enabled: true - label: "grafana_dashboard" - labelValue: "1" - folderAnnotation: "grafana_folder" - provider: - foldersFromFilesStructure: true - persistence: - enabled: true - size: "1Gi" - plugins: - - "grafana-piechart-panel" - prometheus: - prometheusSpec: - scrapeInterval: "30s" - retention: "2d" - retentionSize: "1GB" - storageSpec: - volumeClaimTemplate: - spec: - storageClassName: "standard" - accessModes: - - "ReadWriteOnce" - resources: - requests: - storage: "1Gi" - # Auto-discover ServiceMonitors across all namespaces - serviceMonitorSelector: {} - serviceMonitorNamespaceSelector: {} - serviceMonitorSelectorNilUsesHelmValues: false - ruleSelector: {} - ruleSelectorNilUsesHelmValues: false - -# Pyroscope - continuous profiling -pyroscope: - enabled: false diff --git a/kubernetes/linera-validator/working/.placeholder b/kubernetes/linera-validator/working/.placeholder deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/linera-service/Cargo.toml b/linera-service/Cargo.toml index aa41fd28fcba..211b2e42b772 100644 --- a/linera-service/Cargo.toml +++ b/linera-service/Cargo.toml @@ -50,7 +50,6 @@ scylladb = [ "linera-core/scylladb", "linera-storage-runtime/scylladb", ] -kubernetes = ["dep:k8s-openapi", "dep:kube", "dep:pathdiff", "dep:fs_extra"] remote-net = [] metrics = [ "prometheus", @@ -95,13 +94,10 @@ colored.workspace = true convert_case.workspace = true current_platform = "0.2.0" fs-err = { workspace = true, features = ["tokio"] } -fs_extra = { workspace = true, optional = true } futures.workspace = true heck.workspace = true http.workspace = true indicatif.workspace = true -k8s-openapi = { workspace = true, optional = true } -kube = { workspace = true, optional = true } linera-base.workspace = true linera-chain.workspace = true linera-client = { workspace = true, features = ["fs"] } @@ -131,7 +127,6 @@ linera-wallet-json.workspace = true lru.workspace = true nonzero_lit.workspace = true papaya.workspace = true -pathdiff = { workspace = true, optional = true } port-selector.workspace = true prometheus = { workspace = true, optional = true } prost = { workspace = true } diff --git a/linera-service/src/cli/command.rs b/linera-service/src/cli/command.rs index 3552d4e9dbbe..9a2cf32d6b74 100644 --- a/linera-service/src/cli/command.rs +++ b/linera-service/src/cli/command.rs @@ -208,8 +208,6 @@ impl BenchmarkCommand { } } -#[cfg(feature = "kubernetes")] -use crate::cli_wrappers::local_kubernetes_net::BuildMode; use crate::util::{ DEFAULT_PAUSE_AFTER_GQL_MUTATIONS_SECS, DEFAULT_PAUSE_AFTER_LINERA_SERVICE_SECS, }; @@ -1253,33 +1251,6 @@ pub enum NetCommand { #[arg(long)] testing_prng_seed: Option, - /// Start the local network on a local Kubernetes deployment. - #[cfg(feature = "kubernetes")] - #[arg(long)] - kubernetes: bool, - - /// If this is not set, we'll build the binaries from within the Docker container - /// If it's set, but with no directory path arg, we'll look for the binaries based on `current_binary_parent` - /// If it's set, but with a directory path arg, we'll get the binaries from that path directory - #[cfg(feature = "kubernetes")] - #[arg(long, num_args=0..=1)] - binaries: Option>, - - /// Don't build docker image. This assumes that the image is already built. - #[cfg(feature = "kubernetes")] - #[arg(long, default_value = "false")] - no_build: bool, - - /// The name of the docker image to use. - #[cfg(feature = "kubernetes")] - #[arg(long, default_value = "linera:latest")] - docker_image_name: String, - - /// The build mode to use. - #[cfg(feature = "kubernetes")] - #[arg(long, default_value = "release")] - build_mode: BuildMode, - /// Run with a specific path where the wallet and validator input files are. /// If none, then a temporary directory is created. #[arg(long)] @@ -1323,22 +1294,6 @@ pub enum NetCommand { #[arg(long, default_value = "8081")] exporter_port: NonZeroU16, - /// The name of the indexer docker image to use. - #[cfg(feature = "kubernetes")] - #[arg(long, default_value = "linera-indexer:latest")] - indexer_image_name: String, - - /// The name of the explorer docker image to use. - #[cfg(feature = "kubernetes")] - #[arg(long, default_value = "linera-explorer:latest")] - explorer_image_name: String, - - /// Use dual store (rocksdb and scylladb) instead of just scylladb. This is exclusive for - /// kubernetes deployments. - #[cfg(feature = "kubernetes")] - #[arg(long, default_value = "false")] - dual_store: bool, - /// Set the list of hosts that contracts and services can send HTTP requests to. #[arg(long, value_delimiter = ',')] http_request_allow_list: Option>, diff --git a/linera-service/src/cli/main.rs b/linera-service/src/cli/main.rs index 0ed85587c1fd..884f750c07a5 100644 --- a/linera-service/src/cli/main.rs +++ b/linera-service/src/cli/main.rs @@ -2328,56 +2328,6 @@ async fn run(options: &Options) -> Result { } ClientCommand::Net(net_command) => match net_command { - #[cfg(feature = "kubernetes")] - NetCommand::Up { - other_initial_chains, - initial_amount, - validators, - shards, - testing_prng_seed, - policy_config, - kubernetes: true, - binaries, - no_build, - docker_image_name, - build_mode, - with_faucet, - faucet_chain, - faucet_port, - faucet_amount, - with_block_exporter, - num_block_exporters, - indexer_image_name, - explorer_image_name, - dual_store, - .. - } => { - net_up_utils::handle_net_up_kubernetes( - *other_initial_chains, - *initial_amount, - *validators, - *shards, - *testing_prng_seed, - binaries, - *no_build, - docker_image_name.clone(), - build_mode.clone(), - *policy_config, - *with_faucet, - *faucet_chain, - *faucet_port, - *faucet_amount, - *with_block_exporter, - *num_block_exporters, - indexer_image_name.clone(), - explorer_image_name.clone(), - *dual_store, - ) - .boxed() - .await?; - Ok(0) - } - NetCommand::Up { other_initial_chains, initial_amount, diff --git a/linera-service/src/cli/net_up_utils.rs b/linera-service/src/cli/net_up_utils.rs index fab82253b7a1..a2d06f7a2a0d 100644 --- a/linera-service/src/cli/net_up_utils.rs +++ b/linera-service/src/cli/net_up_utils.rs @@ -14,11 +14,6 @@ use linera_storage_service::{ }; use tokio_util::sync::CancellationToken; use tracing::info; -#[cfg(feature = "kubernetes")] -use { - crate::cli_wrappers::local_kubernetes_net::{BuildMode, LocalKubernetesNetConfig}, - std::path::PathBuf, -}; use crate::{ cli_wrappers::{ @@ -104,88 +99,6 @@ impl StorageConfigProvider { } } -/// Starts a local test network and, optionally, a faucet and block exporter. -#[expect(clippy::too_many_arguments)] -#[cfg(feature = "kubernetes")] -pub async fn handle_net_up_kubernetes( - num_other_initial_chains: u32, - initial_amount: u128, - num_initial_validators: usize, - num_shards: usize, - testing_prng_seed: Option, - binaries: &Option>, - no_build: bool, - docker_image_name: String, - build_mode: BuildMode, - policy_config: ResourceControlPolicyConfig, - with_faucet: bool, - faucet_chain: Option, - faucet_port: NonZeroU16, - faucet_amount: Amount, - with_block_exporter: bool, - num_block_exporters: usize, - indexer_image_name: String, - explorer_image_name: String, - dual_store: bool, -) -> anyhow::Result<()> { - assert!( - num_initial_validators >= 1, - "The local test network must have at least one validator." - ); - assert!( - num_shards >= 1, - "The local test network must have at least one shard per validator." - ); - if faucet_chain.is_some() { - assert!( - with_faucet, - "--faucet-chain must be provided only with --with-faucet" - ); - } - - let shutdown_notifier = CancellationToken::new(); - tokio::spawn(listen_for_shutdown_signals(shutdown_notifier.clone())); - - let num_block_exporters = if with_block_exporter { - assert!( - num_block_exporters > 0, - "If --with-block-exporter is provided, --num-block-exporters must be greater than 0" - ); - num_block_exporters - } else { - 0 - }; - - let config = LocalKubernetesNetConfig { - network: Network::Grpc, - testing_prng_seed, - num_other_initial_chains, - initial_amount: Amount::from_tokens(initial_amount), - num_initial_validators, - num_shards, - binaries: binaries.clone().into(), - no_build, - docker_image_name, - build_mode, - policy_config, - num_block_exporters, - indexer_image_name, - explorer_image_name, - dual_store, - }; - let (mut net, client) = config.instantiate().await?; - let faucet_service = print_messages_and_create_faucet( - client, - with_faucet, - faucet_chain, - faucet_port, - faucet_amount, - num_other_initial_chains, - ) - .await?; - wait_for_shutdown(shutdown_notifier, &mut net, faucet_service).await -} - /// Starts a local test network using native processes and, optionally, a faucet and block exporter. #[expect(clippy::too_many_arguments)] pub async fn handle_net_up_service( diff --git a/linera-service/src/cli_wrappers/docker.rs b/linera-service/src/cli_wrappers/docker.rs deleted file mode 100644 index 83fa98209d2d..000000000000 --- a/linera-service/src/cli_wrappers/docker.rs +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright (c) Zefchain Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -use std::path::PathBuf; - -use anyhow::{Context, Result}; -use linera_base::command::{current_binary_parent, CommandExt}; -use pathdiff::diff_paths; -use tokio::process::Command; - -use crate::cli_wrappers::local_kubernetes_net::BuildMode; - -/// A Dockerfile used to build one of the Linera images. -pub enum Dockerfile { - /// The main Linera node Dockerfile. - Main, - /// The indexer Dockerfile. - Indexer, - /// The explorer Dockerfile. - Explorer, -} - -impl Dockerfile { - /// Returns the path to this Dockerfile, relative to the repository root. - pub fn path(&self) -> &'static str { - match self { - Dockerfile::Main => "docker/Dockerfile", - Dockerfile::Indexer => "docker/Dockerfile.indexer", - Dockerfile::Explorer => "docker/Dockerfile.explorer", - } - } -} - -/// A Docker image built from the Linera sources. -pub struct DockerImage { - name: String, -} - -impl DockerImage { - /// Returns the name of the Docker image. - pub fn name(&self) -> &String { - &self.name - } - - /// Builds the Docker image from the given Dockerfile and returns it. - pub async fn build( - name: String, - binaries: BuildArg, - github_root: PathBuf, - build_mode: BuildMode, - dual_store: bool, - dockerfile: Dockerfile, - ) -> Result { - let docker_image = Self { - name: name.to_owned(), - }; - let mut command = Command::new("docker"); - command - .current_dir(github_root.clone()) - .arg("build") - .args(["-f", dockerfile.path()]); - - if let Dockerfile::Main = dockerfile { - let build_arg = match binaries { - BuildArg::Directory(bin_path) => { - // Get the binaries from the specified path - let bin_path = diff_paths(bin_path, github_root) - .context("Getting relative path failed")?; - let bin_path_str = bin_path.to_str().context("Getting str failed")?; - format!("binaries={bin_path_str}") - } - BuildArg::ParentDirectory => { - // Get the binaries from current_binary_parent - let parent_path = current_binary_parent() - .expect("Fetching current binaries path should not fail"); - let bin_path = diff_paths(parent_path, github_root) - .context("Getting relative path failed")?; - let bin_path_str = bin_path.to_str().context("Getting str failed")?; - format!("binaries={bin_path_str}") - } - BuildArg::Build => { - // Build inside the Docker container - let arch = std::env::consts::ARCH; - // Translate architecture for Docker build arg - let docker_arch = match arch { - "arm" => "aarch", - _ => arch, - }; - format!("target={docker_arch}-unknown-linux-gnu") - } - }; - - command.args(["--build-arg", &build_arg]); - - match build_mode { - // Release is the default, so no need to add any arguments - BuildMode::Release => {} - BuildMode::Debug => { - command.args(["--build-arg", "build_folder=debug"]); - command.args(["--build-arg", "build_flag="]); - } - } - - if dual_store { - command.args(["--build-arg", "build_features=rocksdb,scylladb,metrics"]); - } - - #[cfg(not(with_testing))] - command - .args([ - "--build-arg", - &format!( - "git_commit={}", - linera_version::VersionInfo::get()?.git_commit - ), - ]) - .args([ - "--build-arg", - &format!( - "build_date={}", - // Same format as $(TZ=UTC date) - chrono::Utc::now().format("%a %b %d %T UTC %Y") - ), - ]); - } - - command - .arg(".") - .args(["-t", &name]) - .spawn_and_wait() - .await?; - Ok(docker_image) - } -} - -/// Which binaries to use in the Docker container. -#[derive(Clone)] -pub enum BuildArg { - /// Build the binaries within the container. - Build, - /// Look for the binaries in the parent directory of the current binary. - ParentDirectory, - /// Look for the binaries in the specified path. - Directory(PathBuf), -} - -impl From>> for BuildArg { - fn from(arg: Option>) -> Self { - match arg { - None => BuildArg::Build, - Some(None) => BuildArg::ParentDirectory, - Some(Some(path)) => BuildArg::Directory(path), - } - } -} diff --git a/linera-service/src/cli_wrappers/helmfile.rs b/linera-service/src/cli_wrappers/helmfile.rs deleted file mode 100644 index 4e5302cdc85a..000000000000 --- a/linera-service/src/cli_wrappers/helmfile.rs +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright (c) Zefchain Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -use std::path::Path; - -use anyhow::Result; -use fs_extra::dir::CopyOptions; -use linera_base::command::CommandExt; -use tokio::process::Command; - -pub const DEFAULT_BLOCK_EXPORTER_PORT: u16 = 8882; - -pub struct HelmFile; - -impl HelmFile { - #[expect(clippy::too_many_arguments)] - pub async fn sync( - server_config_id: usize, - github_root: &Path, - num_shards: usize, - cluster_id: u32, - docker_image_name: String, - with_block_exporter: bool, - num_block_exporters: usize, - indexer_image_name: String, - explorer_image_name: String, - dual_store: bool, - ) -> Result<()> { - let chart_dir = format!("{}/kubernetes/linera-validator", github_root.display()); - - let temp_dir = tempfile::tempdir()?; - fs_extra::copy_items(&[&chart_dir], temp_dir.path(), &CopyOptions::new())?; - - let mut command = Command::new("helmfile"); - command.current_dir(temp_dir.path().join("linera-validator")); - - if dual_store { - command.env( - "LINERA_HELMFILE_SET_STORAGE", - "dualrocksdbscylladb:/linera.db:spawn_blocking:tcp:scylla-client.scylla.svc.cluster.local:9042", - ); - command.env("LINERA_HELMFILE_SET_DUAL_STORE", "true"); - } - - if with_block_exporter { - command.env("LINERA_HELMFILE_SET_EXPLORER_ENABLED", "true"); - command.env( - "LINERA_HELMFILE_NUM_BLOCK_EXPORTERS", - num_block_exporters.to_string(), - ); - command.env( - "LINERA_HELMFILE_BLOCK_EXPORTER_PORT", - DEFAULT_BLOCK_EXPORTER_PORT.to_string(), - ); - command.env("LINERA_HELMFILE_INDEXER_IMAGE", indexer_image_name); - command.env("LINERA_HELMFILE_EXPLORER_IMAGE", explorer_image_name); - } - - command - .env( - "LINERA_HELMFILE_SET_SERVER_CONFIG", - format!("working/server_{server_config_id}.json"), - ) - .env("LINERA_HELMFILE_SET_NUM_SHARDS", num_shards.to_string()) - .env("LINERA_HELMFILE_LINERA_IMAGE", docker_image_name) - .arg("sync") - .arg("--wait") - .args(["--kube-context", &format!("kind-{cluster_id}")]) - .spawn_and_wait() - .await - } -} diff --git a/linera-service/src/cli_wrappers/kind.rs b/linera-service/src/cli_wrappers/kind.rs deleted file mode 100644 index 48ff65207035..000000000000 --- a/linera-service/src/cli_wrappers/kind.rs +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright (c) Zefchain Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -use anyhow::Result; -use linera_base::command::CommandExt; -use rand::Rng; -use tokio::process::Command; - -#[derive(Clone)] -pub struct KindCluster { - id: u32, -} - -impl KindCluster { - fn get_random_cluster_id() -> u32 { - rand::thread_rng().gen_range(0..99999) - } - - pub async fn create() -> Result { - let cluster = Self { - id: Self::get_random_cluster_id(), - }; - - Command::new("kind") - .args(["create", "cluster"]) - .args(["--name", cluster.id().to_string().as_str()]) - .spawn_and_wait() - .await?; - - Ok(cluster) - } - - pub fn id(&self) -> u32 { - self.id - } - - pub async fn delete(&self) -> Result<()> { - Command::new("kind") - .args(["delete", "cluster"]) - .args(["--name", &self.id.to_string()]) - .spawn_and_wait() - .await - } - - pub async fn load_docker_image(&self, docker_image: &str) -> Result<()> { - Command::new("kind") - .args(["load", "docker-image", docker_image]) - .args(["--name", self.id.to_string().as_str()]) - .spawn_and_wait() - .await - } -} diff --git a/linera-service/src/cli_wrappers/kubectl.rs b/linera-service/src/cli_wrappers/kubectl.rs deleted file mode 100644 index 05d62e2a4113..000000000000 --- a/linera-service/src/cli_wrappers/kubectl.rs +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) Zefchain Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -use anyhow::{Context, Result}; -use tokio::process::{Child, Command}; - -pub struct KubectlInstance { - pub port_forward_children: Vec, -} - -impl KubectlInstance { - pub fn new(port_forward_children: Vec) -> Self { - Self { - port_forward_children, - } - } - - pub fn port_forward(&mut self, resource: &str, ports: &str, cluster_id: u32) -> Result<()> { - let port_forward_child = Command::new("kubectl") - .arg("port-forward") - .arg(resource) - .arg(ports) - .args(["--context", &format!("kind-{cluster_id}")]) - .spawn() - .context("Port forwarding failed")?; - - self.port_forward_children.push(port_forward_child); - Ok(()) - } -} diff --git a/linera-service/src/cli_wrappers/local_kubernetes_net.rs b/linera-service/src/cli_wrappers/local_kubernetes_net.rs deleted file mode 100644 index 7a2b892aba5e..000000000000 --- a/linera-service/src/cli_wrappers/local_kubernetes_net.rs +++ /dev/null @@ -1,612 +0,0 @@ -// Copyright (c) Zefchain Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -use std::sync::Arc; - -use anyhow::{anyhow, bail, ensure, Result}; -use async_trait::async_trait; -use futures::{future, lock::Mutex}; -use k8s_openapi::api::core::v1::Pod; -use kube::{api::ListParams, Api, Client}; -use linera_base::{ - command::{resolve_binary, CommandExt}, - data_types::Amount, -}; -use linera_client::client_options::ResourceControlPolicyConfig; -use tempfile::{tempdir, TempDir}; -use tokio::{process::Command, task::JoinSet}; -#[cfg(with_testing)] -use {linera_base::command::current_binary_parent, tokio::sync::OnceCell}; - -use crate::cli_wrappers::{ - docker::{BuildArg, DockerImage, Dockerfile}, - helmfile::{HelmFile, DEFAULT_BLOCK_EXPORTER_PORT}, - kind::KindCluster, - kubectl::KubectlInstance, - local_net::PathProvider, - util::get_github_root, - ClientWrapper, LineraNet, LineraNetConfig, Network, OnClientDrop, -}; - -#[cfg(with_testing)] -static SHARED_LOCAL_KUBERNETES_TESTING_NET: OnceCell<( - Arc>, - ClientWrapper, -)> = OnceCell::const_new(); - -/// Whether to build the binaries in debug or release mode. -#[derive(Clone, clap::Parser, clap::ValueEnum, Debug, Default)] -pub enum BuildMode { - /// Builds the binaries in debug mode. - Debug, - /// Builds the binaries in release mode. - #[default] - Release, -} - -impl std::str::FromStr for BuildMode { - type Err = String; - - fn from_str(s: &str) -> Result { - clap::ValueEnum::from_str(s, true) - } -} - -impl std::fmt::Display for BuildMode { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - write!(f, "{self:?}") - } -} - -/// The information needed to start a [`LocalKubernetesNet`]. -pub struct LocalKubernetesNetConfig { - /// The network configuration shared by the validators. - pub network: Network, - /// The seed used to make key generation deterministic in tests, if any. - pub testing_prng_seed: Option, - /// The number of additional chains to create in the genesis configuration. - pub num_other_initial_chains: u32, - /// The initial balance granted to each genesis chain. - pub initial_amount: Amount, - /// The number of validators to start. - pub num_initial_validators: usize, - /// The number of shards to run per validator. - pub num_shards: usize, - /// The source of the binaries baked into the Docker image. - pub binaries: BuildArg, - /// Whether to skip building the Docker image. - pub no_build: bool, - /// The name of the Docker image to run for the validators. - pub docker_image_name: String, - /// The mode used to build the binaries. - pub build_mode: BuildMode, - /// The resource control policy applied by the validators. - pub policy_config: ResourceControlPolicyConfig, - /// The number of block exporters to run per validator. - pub num_block_exporters: usize, - /// The name of the Docker image to run for the indexer. - pub indexer_image_name: String, - /// The name of the Docker image to run for the explorer. - pub explorer_image_name: String, - /// Whether to use dual storage for the validators. - pub dual_store: bool, -} - -/// A wrapper of [`LocalKubernetesNetConfig`] to create a shared local Kubernetes network -/// or use an existing one. -#[cfg(with_testing)] -pub struct SharedLocalKubernetesNetTestingConfig(LocalKubernetesNetConfig); - -/// A set of Linera validators running locally as native processes. -#[derive(Clone)] -pub struct LocalKubernetesNet { - network: Network, - testing_prng_seed: Option, - next_client_id: usize, - tmp_dir: Arc, - binaries: BuildArg, - no_build: bool, - docker_image_name: String, - build_mode: BuildMode, - kubectl_instance: Arc>, - kind_clusters: Vec, - num_initial_validators: usize, - num_shards: usize, - num_block_exporters: usize, - indexer_image_name: String, - explorer_image_name: String, - dual_store: bool, -} - -#[cfg(with_testing)] -impl SharedLocalKubernetesNetTestingConfig { - /// Creates a new configuration for a shared local Kubernetes testing network. - // The second argument is sometimes used locally to use specific binaries for tests. - pub fn new(network: Network, mut binaries: BuildArg) -> Self { - if std::env::var("LINERA_TRY_RELEASE_BINARIES").unwrap_or_default() == "true" - && matches!(binaries, BuildArg::Build) - { - // For cargo test, current binary should be in debug mode - let current_binary_parent = - current_binary_parent().expect("Fetching current binaries path should not fail"); - // But binaries for cluster should be release mode - let binaries_dir = current_binary_parent - .parent() - .expect("Getting parent should not fail") - .join("release"); - if binaries_dir.exists() { - // If release exists, use those binaries - binaries = BuildArg::Directory(binaries_dir); - } - } - Self(LocalKubernetesNetConfig { - network, - testing_prng_seed: Some(37), - num_other_initial_chains: 2, - initial_amount: Amount::from_tokens(2000), - num_initial_validators: 4, - num_shards: 4, - binaries, - no_build: false, - docker_image_name: String::from("linera:latest"), - build_mode: BuildMode::Release, - policy_config: ResourceControlPolicyConfig::Testnet, - num_block_exporters: 0, - indexer_image_name: String::from("linera-indexer:latest"), - explorer_image_name: String::from("linera-explorer:latest"), - dual_store: false, - }) - } -} - -#[async_trait] -impl LineraNetConfig for LocalKubernetesNetConfig { - type Net = LocalKubernetesNet; - - async fn instantiate(self) -> Result<(Self::Net, ClientWrapper)> { - ensure!( - self.num_initial_validators > 0, - "There should be at least one initial validator" - ); - - let clusters = future::join_all((0..self.num_initial_validators).map(|_| async { - KindCluster::create() - .await - .expect("Creating kind cluster should not fail") - })) - .await; - - let mut net = LocalKubernetesNet::new( - self.network, - self.testing_prng_seed, - self.binaries, - self.no_build, - self.docker_image_name, - self.build_mode, - KubectlInstance::new(Vec::new()), - clusters, - self.num_initial_validators, - self.num_shards, - self.num_block_exporters, - self.indexer_image_name, - self.explorer_image_name, - self.dual_store, - )?; - - let client = net.make_client().await; - net.generate_initial_validator_config().await.unwrap(); - client - .create_genesis_config( - self.num_other_initial_chains, - self.initial_amount, - self.policy_config, - Some(vec!["localhost".to_owned()]), - ) - .await - .unwrap(); - net.run().await.unwrap(); - - Ok((net, client)) - } -} - -#[cfg(with_testing)] -#[async_trait] -impl LineraNetConfig for SharedLocalKubernetesNetTestingConfig { - type Net = Arc>; - - async fn instantiate(self) -> Result<(Self::Net, ClientWrapper)> { - let (net, initial_client) = SHARED_LOCAL_KUBERNETES_TESTING_NET - .get_or_init(|| async { - let (net, initial_client) = self - .0 - .instantiate() - .await - .expect("Instantiating LocalKubernetesNetConfig should not fail"); - (Arc::new(Mutex::new(net)), initial_client) - }) - .await; - - let mut net = net.clone(); - let client = net.make_client().await; - // The tests assume we've created a genesis config with 2 - // chains with 10 tokens each. - client.wallet_init(None).await.unwrap(); - for _ in 0..2 { - initial_client - .open_and_assign(&client, Amount::from_tokens(10)) - .await - .unwrap(); - } - - Ok((net, client)) - } -} - -#[async_trait] -impl LineraNet for Arc> { - async fn ensure_is_running(&mut self) -> Result<()> { - let self_clone = self.clone(); - let mut self_lock = self_clone.lock().await; - - self_lock.ensure_is_running().await - } - - async fn make_client(&mut self) -> ClientWrapper { - let self_clone = self.clone(); - let mut self_lock = self_clone.lock().await; - - self_lock.make_client().await - } - - async fn terminate(&mut self) -> Result<()> { - // Users are responsible for killing the clusters if they want to - Ok(()) - } -} - -#[async_trait] -impl LineraNet for LocalKubernetesNet { - async fn ensure_is_running(&mut self) -> Result<()> { - let client = Client::try_default().await?; - let pods: Api = Api::namespaced(client, "default"); - - let list_params = ListParams::default().labels("app=proxy"); - for pod in pods.list(&list_params).await? { - if let Some(status) = pod.status { - if let Some(phase) = status.phase { - if phase != "Running" { - bail!( - "Validator {} is not Running", - pod.metadata - .name - .expect("Fetching pod name should not fail") - ); - } - } - } - } - - let list_params = ListParams::default().labels("app=shards"); - for pod in pods.list(&list_params).await? { - if let Some(status) = pod.status { - if let Some(phase) = status.phase { - if phase != "Running" { - bail!( - "Shard {} is not Running", - pod.metadata - .name - .expect("Fetching pod name should not fail") - ); - } - } - } - } - - Ok(()) - } - - async fn make_client(&mut self) -> ClientWrapper { - let path_provider = PathProvider::TemporaryDirectory { - tmp_dir: self.tmp_dir.clone(), - }; - let client = ClientWrapper::new( - path_provider, - self.network, - self.testing_prng_seed, - self.next_client_id, - OnClientDrop::LeakChains, - ); - if let Some(seed) = self.testing_prng_seed { - self.testing_prng_seed = Some(seed + 1); - } - self.next_client_id += 1; - client - } - - async fn terminate(&mut self) -> Result<()> { - let mut kubectl_instance = self.kubectl_instance.lock().await; - let mut errors = Vec::new(); - for port_forward_child in &mut kubectl_instance.port_forward_children { - if let Err(e) = port_forward_child.kill().await { - errors.push(e.into()); - } - } - - for kind_cluster in &mut self.kind_clusters { - if let Err(e) = kind_cluster.delete().await { - errors.push(e); - } - } - - if errors.is_empty() { - Ok(()) - } else { - let err_str = if errors.len() > 1 { - "Multiple errors" - } else { - "One error" - }; - - Err(errors - .into_iter() - .fold(anyhow!("{err_str} occurred"), |acc, e: anyhow::Error| { - acc.context(e) - })) - } - } -} - -impl LocalKubernetesNet { - #[expect(clippy::too_many_arguments)] - fn new( - network: Network, - testing_prng_seed: Option, - binaries: BuildArg, - no_build: bool, - docker_image_name: String, - build_mode: BuildMode, - kubectl_instance: KubectlInstance, - kind_clusters: Vec, - num_initial_validators: usize, - num_shards: usize, - num_block_exporters: usize, - indexer_image_name: String, - explorer_image_name: String, - dual_store: bool, - ) -> Result { - Ok(Self { - network, - testing_prng_seed, - next_client_id: 0, - tmp_dir: Arc::new(tempdir()?), - binaries, - no_build, - docker_image_name, - build_mode, - kubectl_instance: Arc::new(Mutex::new(kubectl_instance)), - kind_clusters, - num_initial_validators, - num_shards, - num_block_exporters, - indexer_image_name, - explorer_image_name, - dual_store, - }) - } - - async fn command_for_binary(&self, name: &'static str) -> Result { - let path = resolve_binary(name, env!("CARGO_PKG_NAME")).await?; - let mut command = Command::new(path); - command.current_dir(self.tmp_dir.path()); - Ok(command) - } - - fn configuration_string(&self, server_number: usize) -> Result { - let n = server_number; - let path = self.tmp_dir.path().join(format!("validator_{n}.toml")); - let port = 19100 + server_number; - let internal_port = 20100; - let metrics_port = 21100; - let mut content = format!( - r#" - server_config_path = "server_{n}.json" - host = "127.0.0.1" - port = {port} - [external_protocol] - Grpc = "ClearText" - [internal_protocol] - Grpc = "ClearText" - - [[proxies]] - host = "proxy-0.default.svc.cluster.local" - public_port = {port} - private_port = {internal_port} - metrics_port = {metrics_port} - "# - ); - - for k in 0..self.num_shards { - let shard_port = 19100; - let shard_metrics_port = 21100; - content.push_str(&format!( - r#" - - [[shards]] - host = "shards-{k}.shards.default.svc.cluster.local" - port = {shard_port} - metrics_port = {shard_metrics_port} - "# - )); - } - - if self.num_block_exporters > 0 { - for exporter_num in 0..self.num_block_exporters { - let block_exporter_port = DEFAULT_BLOCK_EXPORTER_PORT; - let block_exporter_host = - format!("linera-block-exporter-{exporter_num}.linera-block-exporter"); - let config_content = format!( - r#" - - [[block_exporters]] - host = "{block_exporter_host}" - port = {block_exporter_port} - "# - ); - - content.push_str(&config_content); - } - } - - fs_err::write(&path, content)?; - path.into_os_string().into_string().map_err(|error| { - anyhow!( - "could not parse OS string into string: {}", - error.to_string_lossy() - ) - }) - } - - async fn generate_initial_validator_config(&mut self) -> Result<()> { - let mut command = self.command_for_binary("linera-server").await?; - command.arg("generate"); - if let Some(seed) = self.testing_prng_seed { - command.arg("--testing-prng-seed").arg(seed.to_string()); - self.testing_prng_seed = Some(seed + 1); - } - command.arg("--validators"); - for i in 0..self.num_initial_validators { - command.arg(&self.configuration_string(i)?); - } - command - .args(["--committee", "committee.json"]) - .spawn_and_wait_for_stdout() - .await?; - Ok(()) - } - - async fn run(&self) -> Result<()> { - let github_root = get_github_root().await?; - // Build Docker images - let (docker_image_name, indexer_image_name, explorer_image_name) = if self.no_build { - ( - self.docker_image_name.clone(), - self.indexer_image_name.clone(), - self.explorer_image_name.clone(), - ) - } else { - let mut join_set = JoinSet::new(); - join_set.spawn(DockerImage::build( - self.docker_image_name.clone(), - self.binaries.clone(), - github_root.clone(), - self.build_mode.clone(), - self.dual_store, - Dockerfile::Main, - )); - if self.num_block_exporters > 0 { - join_set.spawn(DockerImage::build( - self.indexer_image_name.clone(), - self.binaries.clone(), - github_root.clone(), - self.build_mode.clone(), - self.dual_store, - Dockerfile::Indexer, - )); - join_set.spawn(DockerImage::build( - self.explorer_image_name.clone(), - self.binaries.clone(), - github_root.clone(), - self.build_mode.clone(), - self.dual_store, - Dockerfile::Explorer, - )); - } - - join_set - .join_all() - .await - .into_iter() - .collect::>>()?; - - ( - self.docker_image_name.clone(), - self.indexer_image_name.clone(), - self.explorer_image_name.clone(), - ) - }; - - let base_dir = github_root - .join("kubernetes") - .join("linera-validator") - .join("working"); - fs_err::copy( - self.tmp_dir.path().join("genesis.json"), - base_dir.join("genesis.json"), - )?; - - let kubectl_instance_clone = self.kubectl_instance.clone(); - let tmp_dir_path_clone = self.tmp_dir.path().to_path_buf(); - let num_shards = self.num_shards; - - let mut validators_initialization_futures = Vec::new(); - for (i, kind_cluster) in self.kind_clusters.iter().cloned().enumerate() { - let base_dir = base_dir.clone(); - let github_root = github_root.clone(); - - let kubectl_instance = kubectl_instance_clone.clone(); - let tmp_dir_path = tmp_dir_path_clone.clone(); - - let docker_image_name = docker_image_name.clone(); - let indexer_image_name = indexer_image_name.clone(); - let explorer_image_name = explorer_image_name.clone(); - let dual_store = self.dual_store; - let num_block_exporters = self.num_block_exporters; - let future = async move { - let cluster_id = kind_cluster.id(); - kind_cluster.load_docker_image(&docker_image_name).await?; - kind_cluster.load_docker_image(&indexer_image_name).await?; - kind_cluster.load_docker_image(&explorer_image_name).await?; - - let server_config_filename = format!("server_{i}.json"); - fs_err::copy( - tmp_dir_path.join(&server_config_filename), - base_dir.join(&server_config_filename), - )?; - - HelmFile::sync( - i, - &github_root, - num_shards, - cluster_id, - docker_image_name, - num_block_exporters > 0, - num_block_exporters, - indexer_image_name, - explorer_image_name, - dual_store, - ) - .await?; - - let mut kubectl_instance = kubectl_instance.lock().await; - let proxy_service = "svc/proxy"; - - let local_port = 19100 + i; - kubectl_instance.port_forward( - proxy_service, - &format!("{local_port}:{local_port}"), - cluster_id, - )?; - - Result::<(), anyhow::Error>::Ok(()) - }; - - validators_initialization_futures.push(future); - } - - future::join_all(validators_initialization_futures) - .await - .into_iter() - .collect() - } -} diff --git a/linera-service/src/cli_wrappers/mod.rs b/linera-service/src/cli_wrappers/mod.rs index 7c993f3ac889..00a753e52285 100644 --- a/linera-service/src/cli_wrappers/mod.rs +++ b/linera-service/src/cli_wrappers/mod.rs @@ -4,30 +4,11 @@ //! Helper module to call the binaries of `linera-service` with appropriate command-line //! arguments. -#[cfg(feature = "kubernetes")] -/// How to run Docker operations -pub mod docker; - -#[cfg(feature = "kubernetes")] -/// How to run helmfile operations -mod helmfile; -#[cfg(feature = "kubernetes")] -/// How to run kind operations -mod kind; -#[cfg(feature = "kubernetes")] -/// How to run `kubectl` operations -mod kubectl; -#[cfg(feature = "kubernetes")] -/// How to run Linera validators locally as a Kubernetes deployment. -pub mod local_kubernetes_net; /// How to run Linera validators locally as native processes. pub mod local_net; #[cfg(all(with_testing, feature = "remote-net"))] /// How to connect to running GCP devnet. pub mod remote_net; -#[cfg(feature = "kubernetes")] -/// Utility functions for the wrappers -mod util; /// How to run a Linera wallet and its GraphQL service. mod wallet; diff --git a/linera-service/src/cli_wrappers/util.rs b/linera-service/src/cli_wrappers/util.rs deleted file mode 100644 index a0d07d0df8da..000000000000 --- a/linera-service/src/cli_wrappers/util.rs +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) Zefchain Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -use std::path::PathBuf; - -use anyhow::Result; -use linera_base::command::CommandExt; -use tokio::process::Command; - -pub async fn get_github_root() -> Result { - let github_root = Command::new("git") - .arg("rev-parse") - .arg("--show-toplevel") - .spawn_and_wait_for_stdout() - .await?; - Ok(PathBuf::from( - github_root - .strip_suffix('\n') - .expect("Stripping suffix should not fail") - .to_string(), - )) -} diff --git a/linera-service/tests/linera_net_tests.rs b/linera-service/tests/linera_net_tests.rs index 21d1366c190a..48dd0c0aad6f 100644 --- a/linera-service/tests/linera_net_tests.rs +++ b/linera-service/tests/linera_net_tests.rs @@ -5,7 +5,6 @@ #![cfg(any( feature = "scylladb", feature = "storage-service", - feature = "kubernetes", feature = "remote-net" ))] @@ -38,16 +37,8 @@ use linera_sdk::{ }; #[cfg(any(feature = "scylladb", feature = "storage-service",))] use linera_service::cli_wrappers::local_net::{Database, LocalNetConfig}; -#[cfg(any( - feature = "scylladb", - feature = "storage-service", - feature = "kubernetes", -))] +#[cfg(any(feature = "scylladb", feature = "storage-service",))] use linera_service::cli_wrappers::Network; -#[cfg(feature = "kubernetes")] -use linera_service::cli_wrappers::{ - docker::BuildArg, local_kubernetes_net::SharedLocalKubernetesNetTestingConfig, -}; #[cfg(feature = "remote-net")] use linera_service::cli_wrappers::{remote_net::RemoteNetTestingConfig, OnClientDrop::*}; use linera_service::{ @@ -424,7 +415,6 @@ impl AmmApp { #[cfg(with_revm)] #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(CloseChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_evm_end_to_end_counter(config: impl LineraNetConfig) -> Result<()> { @@ -504,7 +494,6 @@ async fn test_evm_end_to_end_counter(config: impl LineraNetConfig) -> Result<()> #[cfg(with_revm)] #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(CloseChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_evm_event(config: impl LineraNetConfig) -> Result<()> { @@ -616,7 +605,6 @@ async fn test_evm_event(config: impl LineraNetConfig) -> Result<()> { #[cfg(with_revm)] #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(CloseChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_wasm_call_evm_end_to_end_counter(config: impl LineraNetConfig) -> Result<()> { @@ -714,7 +702,6 @@ async fn test_wasm_call_evm_end_to_end_counter(config: impl LineraNetConfig) -> #[cfg(with_revm)] #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(CloseChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_evm_call_evm_end_to_end_counter(config: impl LineraNetConfig) -> Result<()> { @@ -822,7 +809,6 @@ async fn test_evm_call_evm_end_to_end_counter(config: impl LineraNetConfig) -> R #[cfg(with_revm)] #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(CloseChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_evm_call_wasm_end_to_end_counter(config: impl LineraNetConfig) -> Result<()> { @@ -916,7 +902,6 @@ async fn test_evm_call_wasm_end_to_end_counter(config: impl LineraNetConfig) -> #[cfg(with_revm)] #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(CloseChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_evm_execute_message_end_to_end_counter(config: impl LineraNetConfig) -> Result<()> { @@ -1034,7 +1019,6 @@ async fn test_evm_execute_message_end_to_end_counter(config: impl LineraNetConfi #[cfg(with_revm)] #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(CloseChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_evm_empty_instantiate(config: impl LineraNetConfig) -> Result<()> { @@ -1109,7 +1093,6 @@ async fn test_evm_empty_instantiate(config: impl LineraNetConfig) -> Result<()> #[cfg(with_revm)] #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(CloseChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_evm_process_streams_end_to_end_counters(config: impl LineraNetConfig) -> Result<()> { @@ -1232,7 +1215,6 @@ async fn test_evm_process_streams_end_to_end_counters(config: impl LineraNetConf #[cfg(with_revm)] #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(CloseChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_evm_msg_sender(config: impl LineraNetConfig) -> Result<()> { @@ -1325,7 +1307,6 @@ async fn test_evm_msg_sender(config: impl LineraNetConfig) -> Result<()> { #[cfg(with_revm)] #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(CloseChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_evm_linera_features(config: impl LineraNetConfig) -> Result<()> { @@ -1439,7 +1420,6 @@ async fn test_evm_linera_features(config: impl LineraNetConfig) -> Result<()> { #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] #[cfg_attr(all(feature = "rocksdb", feature = "scylladb"), test_case(LocalNetConfig::new_test(Database::DualRocksDbScyllaDb, Network::Grpc) ; "dualrocksdbscylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(CloseChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_wasm_end_to_end_counter(config: impl LineraNetConfig) -> Result<()> { @@ -1690,7 +1670,6 @@ async fn test_wasm_end_to_end_counter_subscription_ttl(config: impl LineraNetCon #[cfg(with_revm)] #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(CloseChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_evm_erc20_shared(config: impl LineraNetConfig) -> Result<()> { @@ -1825,7 +1804,6 @@ async fn test_evm_erc20_shared(config: impl LineraNetConfig) -> Result<()> { #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(CloseChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_wasm_end_to_end_counter_no_graphql(config: impl LineraNetConfig) -> Result<()> { @@ -1882,7 +1860,6 @@ async fn test_wasm_end_to_end_counter_no_graphql(config: impl LineraNetConfig) - #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(CloseChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_wasm_end_to_end_counter_publish_create(config: impl LineraNetConfig) -> Result<()> { @@ -1935,7 +1912,6 @@ async fn test_wasm_end_to_end_counter_publish_create(config: impl LineraNetConfi #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(CloseChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_publish_module_with_formats_registers_formats( @@ -2028,7 +2004,6 @@ async fn test_publish_module_with_formats_registers_formats( /// chain can assert and read that blob across chains. #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(CloseChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_publish_module_with_formats_remote_registration( @@ -2151,7 +2126,6 @@ async fn test_publish_module_with_formats_remote_registration( #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(LeakChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_wasm_end_to_end_social_event_streams(config: impl LineraNetConfig) -> Result<()> { @@ -2360,7 +2334,6 @@ async fn test_wasm_end_to_end_social_event_streams(config: impl LineraNetConfig) #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(CloseChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_wasm_end_to_end_allowances_fungible(config: impl LineraNetConfig) -> Result<()> { @@ -2566,8 +2539,6 @@ async fn publish_and_create_native_fungible( #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc), "fungible" ; "storage_test_service_grpc"))] #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc), "native-fungible" ; "native_storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc), "native-fungible" ; "native_scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build), "fungible" ; "kubernetes_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build), "native-fungible" ; "native_kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(LeakChains), "fungible" ; "remote_net_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(LeakChains), "native-fungible" ; "native_remote_net_grpc"))] #[test_log::test(tokio::test)] @@ -2713,8 +2684,6 @@ async fn test_wasm_end_to_end_fungible( #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc), "native-fungible" ; "native_storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc), "fungible" ; "scylladb_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc), "native-fungible" ; "native_scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build), "fungible" ; "kubernetes_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build), "native-fungible" ; "native_kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(CloseChains), "fungible" ; "remote_net_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(CloseChains), "native-fungible" ; "native_remote_net_grpc"))] #[test_log::test(tokio::test)] @@ -2811,7 +2780,6 @@ async fn test_wasm_end_to_end_same_wallet_fungible( #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(LeakChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_wasm_end_to_end_non_fungible(config: impl LineraNetConfig) -> Result<()> { @@ -3098,7 +3066,6 @@ async fn test_wasm_end_to_end_non_fungible(config: impl LineraNetConfig) -> Resu #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(LeakChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_wasm_end_to_end_crowd_funding(config: impl LineraNetConfig) -> Result<()> { @@ -3224,7 +3191,6 @@ async fn test_wasm_end_to_end_crowd_funding(config: impl LineraNetConfig) -> Res #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(LeakChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_wasm_end_to_end_matching_engine(config: impl LineraNetConfig) -> Result<()> { @@ -3474,7 +3440,6 @@ async fn test_wasm_end_to_end_matching_engine(config: impl LineraNetConfig) -> R #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] #[cfg_attr(all(feature = "rocksdb", feature = "scylladb"), test_case(LocalNetConfig::new_test(Database::DualRocksDbScyllaDb, Network::Grpc) ; "dualrocksdbscylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(LeakChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_wasm_end_to_end_amm(config: impl LineraNetConfig) -> Result<()> { @@ -4208,7 +4173,6 @@ async fn test_wasm_end_to_end_amm(config: impl LineraNetConfig) -> Result<()> { #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(LeakChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_open_chain_node_service(config: impl LineraNetConfig) -> Result<()> { @@ -4318,7 +4282,6 @@ async fn test_open_chain_node_service(config: impl LineraNetConfig) -> Result<() #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(LeakChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_end_to_end_multiple_wallets(config: impl LineraNetConfig) -> Result<()> { @@ -4363,7 +4326,6 @@ async fn test_end_to_end_multiple_wallets(config: impl LineraNetConfig) -> Resul #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(CloseChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_end_to_end_open_multi_owner_chain(config: impl LineraNetConfig) -> Result<()> { @@ -4430,7 +4392,6 @@ async fn test_end_to_end_open_multi_owner_chain(config: impl LineraNetConfig) -> #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(LeakChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_end_to_end_change_ownership(config: impl LineraNetConfig) -> Result<()> { @@ -4471,7 +4432,6 @@ async fn test_end_to_end_change_ownership(config: impl LineraNetConfig) -> Resul #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(LeakChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_end_to_end_assign_greatgrandchild_chain(config: impl LineraNetConfig) -> Result<()> { @@ -4539,7 +4499,6 @@ async fn test_end_to_end_assign_greatgrandchild_chain(config: impl LineraNetConf #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(LeakChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_end_to_end_publish_data_blob_in_cli(config: impl LineraNetConfig) -> Result<()> { @@ -4570,7 +4529,6 @@ async fn test_end_to_end_publish_data_blob_in_cli(config: impl LineraNetConfig) #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(CloseChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_end_to_end_faucet(config: impl LineraNetConfig) -> Result<()> { @@ -4650,7 +4608,6 @@ async fn test_end_to_end_faucet(config: impl LineraNetConfig) -> Result<()> { /// Tests creating a new wallet using a faucet that has already created a lot of microchains. #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(CloseChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] #[ignore = "This test takes a long time to run"] @@ -4730,7 +4687,6 @@ async fn test_end_to_end_faucet_with_long_chains(config: impl LineraNetConfig) - /// Tests faucet batch processing with multiple concurrent chain creation requests #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(CloseChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_end_to_end_faucet_batch_processing(config: impl LineraNetConfig) -> Result<()> { @@ -4817,7 +4773,6 @@ async fn test_end_to_end_faucet_batch_processing(config: impl LineraNetConfig) - #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(CloseChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_end_to_end_fungible_client_benchmark(config: impl LineraNetConfig) -> Result<()> { @@ -4862,7 +4817,6 @@ async fn test_end_to_end_fungible_client_benchmark(config: impl LineraNetConfig) #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(CloseChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_end_to_end_listen_for_new_rounds(config: impl LineraNetConfig) -> Result<()> { @@ -4951,7 +4905,6 @@ async fn test_end_to_end_listen_for_new_rounds(config: impl LineraNetConfig) -> /// the receiving block, and the resulting `NewBlock` notification. #[cfg_attr(feature = "storage-service", test_case(LocalNetConfig::new_test(Database::Service, Network::Grpc) ; "storage_test_service_grpc"))] #[cfg_attr(feature = "scylladb", test_case(LocalNetConfig::new_test(Database::ScyllaDb, Network::Grpc) ; "scylladb_grpc"))] -#[cfg_attr(feature = "kubernetes", test_case(SharedLocalKubernetesNetTestingConfig::new(Network::Grpc, BuildArg::Build) ; "kubernetes_grpc"))] #[cfg_attr(feature = "remote-net", test_case(RemoteNetTestingConfig::new(LeakChains) ; "remote_net_grpc"))] #[test_log::test(tokio::test)] async fn test_end_to_end_repeated_transfers(config: impl LineraNetConfig) -> Result<()> {

;$@~7dBD;gTl@WPA0Y% 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%0AXih-LNMMeRQ7wIX( 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