Skip to content

Commit f239d48

Browse files
committed
Aggregate multiprocess replica metrics for console overview view
We use this query in the Console to power the Environment Overview page and cluster replica graphs for the 14 day time period.
1 parent 1f0f20a commit f239d48

File tree

2 files changed

+60
-34
lines changed

2 files changed

+60
-34
lines changed

src/catalog/src/builtin.rs

Lines changed: 42 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -8104,7 +8104,8 @@ JOIN root_times r USING (id)",
81048104

81058105
/**
81068106
* This view is used to display the cluster utilization over 14 days bucketed by 8 hours.
8107-
* It's specifically for the Console's environment overview page to speed up load times
8107+
* It's specifically for the Console's environment overview page to speed up load times.
8108+
* This query should be kept in sync with MaterializeInc/console/src/api/materialize/cluster/replicaUtilizationHistory.ts
81088109
*/
81098110
pub static MZ_CONSOLE_CLUSTER_UTILIZATION_OVERVIEW: LazyLock<BuiltinView> = LazyLock::new(|| {
81108111
BuiltinView {
@@ -8142,70 +8143,87 @@ pub static MZ_CONSOLE_CLUSTER_UTILIZATION_OVERVIEW: LazyLock<BuiltinView> = Lazy
81428143
cluster_id
81438144
FROM mz_catalog.mz_cluster_replicas
81448145
),
8146+
replica_metrics_history AS (
8147+
SELECT
8148+
m.occurred_at,
8149+
m.replica_id,
8150+
r.size,
8151+
(SUM(m.cpu_nano_cores::float8) / s.cpu_nano_cores) / s.processes AS cpu_percent,
8152+
(SUM(m.memory_bytes::float8) / s.memory_bytes) / s.processes AS memory_percent,
8153+
(SUM(m.disk_bytes::float8) / s.disk_bytes) / s.processes AS disk_percent,
8154+
SUM(m.disk_bytes::float8) AS disk_bytes,
8155+
SUM(m.memory_bytes::float8) AS memory_bytes,
8156+
s.disk_bytes::numeric * s.processes AS total_disk_bytes,
8157+
s.memory_bytes::numeric * s.processes AS total_memory_bytes
8158+
FROM
8159+
replica_history AS r
8160+
INNER JOIN mz_catalog.mz_cluster_replica_sizes AS s ON r.size = s.size
8161+
INNER JOIN mz_internal.mz_cluster_replica_metrics_history AS m ON m.replica_id = r.replica_id
8162+
GROUP BY
8163+
m.occurred_at,
8164+
m.replica_id,
8165+
r.size,
8166+
s.cpu_nano_cores,
8167+
s.memory_bytes,
8168+
s.disk_bytes,
8169+
s.processes
8170+
),
81458171
replica_utilization_history_binned AS (
81468172
SELECT m.occurred_at,
81478173
m.replica_id,
8148-
m.process_id,
8149-
(m.cpu_nano_cores::float8 / s.cpu_nano_cores) AS cpu_percent,
8150-
(m.memory_bytes::float8 / s.memory_bytes) AS memory_percent,
8151-
(m.disk_bytes::float8 / s.disk_bytes) AS disk_percent,
8152-
m.disk_bytes::float8 AS disk_bytes,
8153-
m.memory_bytes::float8 AS memory_bytes,
8154-
s.disk_bytes AS total_disk_bytes,
8155-
s.memory_bytes AS total_memory_bytes,
8156-
r.size,
8174+
m.cpu_percent,
8175+
m.memory_percent,
8176+
m.memory_bytes,
8177+
m.disk_percent,
8178+
m.disk_bytes,
8179+
m.total_disk_bytes,
8180+
m.total_memory_bytes,
8181+
m.size,
81578182
date_bin(
81588183
'8 HOURS',
81598184
occurred_at,
81608185
'1970-01-01'::timestamp
81618186
) AS bucket_start
81628187
FROM replica_history AS r
8163-
JOIN mz_catalog.mz_cluster_replica_sizes AS s ON r.size = s.size
8164-
JOIN mz_internal.mz_cluster_replica_metrics_history AS m ON m.replica_id = r.replica_id
8188+
JOIN replica_metrics_history AS m ON m.replica_id = r.replica_id
81658189
WHERE mz_now() <= date_bin(
81668190
'8 HOURS',
81678191
occurred_at,
81688192
'1970-01-01'::timestamp
81698193
) + INTERVAL '14 DAYS'
81708194
),
8171-
-- For each (replica, process_id, bucket), take the (replica, process_id, bucket) with the highest memory
8195+
-- For each (replica, bucket), take the (replica, bucket) with the highest memory
81728196
max_memory AS (
8173-
SELECT DISTINCT ON (bucket_start, replica_id, process_id) bucket_start,
8197+
SELECT DISTINCT ON (bucket_start, replica_id) bucket_start,
81748198
replica_id,
8175-
process_id,
81768199
memory_percent,
81778200
occurred_at
81788201
FROM replica_utilization_history_binned
81798202
OPTIONS (DISTINCT ON INPUT GROUP SIZE = 480)
81808203
ORDER BY bucket_start,
81818204
replica_id,
8182-
process_id,
81838205
COALESCE(memory_bytes, 0) DESC
81848206
),
81858207
max_disk AS (
8186-
SELECT DISTINCT ON (bucket_start, replica_id, process_id) bucket_start,
8208+
SELECT DISTINCT ON (bucket_start, replica_id) bucket_start,
81878209
replica_id,
8188-
process_id,
81898210
disk_percent,
81908211
occurred_at
81918212
FROM replica_utilization_history_binned
81928213
OPTIONS (DISTINCT ON INPUT GROUP SIZE = 480)
81938214
ORDER BY bucket_start,
81948215
replica_id,
8195-
process_id,
81968216
COALESCE(disk_bytes, 0) DESC
81978217
),
81988218
max_cpu AS (
8199-
SELECT DISTINCT ON (bucket_start, replica_id, process_id) bucket_start,
8219+
SELECT DISTINCT ON (bucket_start, replica_id) bucket_start,
82008220
replica_id,
8201-
process_id,
82028221
cpu_percent,
82038222
occurred_at
82048223
FROM replica_utilization_history_binned
82058224
OPTIONS (DISTINCT ON INPUT GROUP SIZE = 480)
82068225
ORDER BY bucket_start,
82078226
replica_id,
8208-
process_id,
82098227
COALESCE(cpu_percent, 0) DESC
82108228
),
82118229
/*
@@ -8215,7 +8233,7 @@ max_cpu AS (
82158233
values may not occur at the same time if the bucket interval is large.
82168234
*/
82178235
max_memory_and_disk AS (
8218-
SELECT DISTINCT ON (bucket_start, replica_id, process_id) bucket_start,
8236+
SELECT DISTINCT ON (bucket_start, replica_id) bucket_start,
82198237
replica_id,
82208238
memory_percent,
82218239
disk_percent,
@@ -8241,10 +8259,9 @@ max_memory_and_disk AS (
82418259
OPTIONS (DISTINCT ON INPUT GROUP SIZE = 480)
82428260
ORDER BY bucket_start,
82438261
replica_id,
8244-
process_id,
82458262
COALESCE(memory_and_disk_percent, 0) DESC
82468263
),
8247-
-- For each (replica, process_id, bucket), get its offline events at that time
8264+
-- For each (replica, bucket), get its offline events at that time
82488265
replica_offline_event_history AS (
82498266
SELECT date_bin(
82508267
'8 HOURS',

test/sqllogictest/distinct_arrangements.slt

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -958,6 +958,13 @@ ArrangeBy[[CallUnary { func: CastStringToVarChar(CastStringToVarChar { length: N
958958
ArrangeBy[[CallUnary { func: CastStringToVarChar(CastStringToVarChar { length: None, fail_on_len: false }), expr: Column(1) }, CallUnary { func: CastInt64ToString(CastInt64ToString), expr: Column(0) }]]-errors
959959
ArrangeBy[[Column(0), Column(1)]]
960960
ArrangeBy[[Column(0), Column(1)]]-errors
961+
ArrangeBy[[Column(0)]]
962+
ArrangeBy[[Column(0)]]
963+
ArrangeBy[[Column(0)]]
964+
ArrangeBy[[Column(0)]]-errors
965+
Arranged DistinctBy
966+
DistinctBy
967+
DistinctByErrorCheck
961968

962969
statement ok
963970
DROP TABLE t CASCADE
@@ -980,12 +987,13 @@ WHERE mdod.dataflow_name NOT LIKE '%introspection-subscribe%'
980987
GROUP BY mdod.name
981988
ORDER BY mdod.name;
982989
----
983-
AccumulableErrorCheck 9
990+
AccumulableErrorCheck 11
984991
Arrange␠ReduceMinsMaxes 3
992+
Arrange␠bundle␠err 1
985993
Arrange␠export␠iterative 2
986994
Arrange␠export␠iterative␠err 2
987995
Arrange␠recursive␠err 4
988-
ArrangeAccumulable␠[val:␠empty] 9
996+
ArrangeAccumulable␠[val:␠empty] 11
989997
ArrangeBy[[CallBinary␠{␠func:␠JsonbGetString␠{␠stringify:␠true␠},␠expr1:␠Column(1),␠expr2:␠Literal(Ok(Row{[String("id")]}),␠ColumnType␠{␠scalar_type:␠String,␠nullable:␠false␠})␠}]] 2
990998
ArrangeBy[[CallBinary␠{␠func:␠JsonbGetString␠{␠stringify:␠true␠},␠expr1:␠Column(2),␠expr2:␠Literal(Ok(Row{[String("id")]}),␠ColumnType␠{␠scalar_type:␠String,␠nullable:␠false␠})␠}]] 1
991999
ArrangeBy[[CallVariadic␠{␠func:␠Coalesce,␠exprs:␠[Column(2),␠Column(3)]␠}]] 2
@@ -1000,16 +1008,17 @@ ArrangeBy[[Column(0),␠Column(1),␠Column(2),␠Column(3),␠Column(4),␠Colu
10001008
ArrangeBy[[Column(0),␠Column(1),␠Column(2),␠Column(3),␠Column(4),␠Column(5)]]-errors 1
10011009
ArrangeBy[[Column(0),␠Column(1),␠Column(2),␠Column(3),␠Column(4)]] 1
10021010
ArrangeBy[[Column(0),␠Column(1),␠Column(2),␠Column(3),␠Column(4)]]-errors 1
1003-
ArrangeBy[[Column(0),␠Column(1)]] 2
1011+
ArrangeBy[[Column(0),␠Column(1)]] 5
10041012
ArrangeBy[[Column(0),␠Column(2)]] 4
10051013
ArrangeBy[[Column(0),␠Column(3)]] 4
10061014
ArrangeBy[[Column(0),␠Column(4)]] 1
1007-
ArrangeBy[[Column(0)]] 154
1015+
ArrangeBy[[Column(0)]] 157
10081016
ArrangeBy[[Column(0)]]-errors 44
1017+
ArrangeBy[[Column(1),␠CallVariadic␠{␠func:␠ListIndex,␠exprs:␠[Column(2),␠Literal(Ok(Row{[Int64(1)]}),␠ColumnType␠{␠scalar_type:␠Int64,␠nullable:␠false␠})]␠}]] 2
10091018
ArrangeBy[[Column(1),␠Column(0)]] 1
10101019
ArrangeBy[[Column(1),␠Column(2)]] 2
10111020
ArrangeBy[[Column(1),␠Column(3)]] 1
1012-
ArrangeBy[[Column(1)]] 25
1021+
ArrangeBy[[Column(1)]] 26
10131022
ArrangeBy[[Column(1)]]-errors 7
10141023
ArrangeBy[[Column(13)]] 1
10151024
ArrangeBy[[Column(15)]] 1
@@ -1027,14 +1036,14 @@ ArrangeBy[[Column(6)]] 3
10271036
ArrangeBy[[Column(6)]]-errors 2
10281037
ArrangeBy[[Column(9)]] 1
10291038
ArrangeBy[[]] 11
1030-
Arranged␠DistinctBy 47
1039+
Arranged␠DistinctBy 48
10311040
Arranged␠MinsMaxesHierarchical␠input 14
10321041
Arranged␠ReduceInaccumulable 3
10331042
Arranged␠TopK␠input 68
10341043
Distinct␠recursive␠err 4
1035-
DistinctBy 47
1036-
DistinctByErrorCheck 47
1037-
ReduceAccumulable 9
1044+
DistinctBy 48
1045+
DistinctByErrorCheck 48
1046+
ReduceAccumulable 11
10381047
ReduceInaccumulable 3
10391048
ReduceInaccumulable␠Error␠Check 3
10401049
ReduceMinsMaxes 3

0 commit comments

Comments
 (0)