Skip to content

Commit 776e392

Browse files
authored
fix: Fix queries/minute calculation in Services Dashboard (#1457)
Closes HDX-2973 # Summary This PR updates the queries on the services dashboard to 1. Fix the queries/min calculation, which was previously just the total number of queries 2. Support materialized views in the enterprise edition by separating aggregations from conversions to rates and millisecond values. ## Queries/Min Before: <img width="779" height="100" alt="Screenshot 2025-12-09 at 11 28 00 AM" src="https://github.com/user-attachments/assets/52f2581f-5af4-4528-bdb6-5505e5ed7709" /> <img width="1511" height="842" alt="Screenshot 2025-12-09 at 11 27 17 AM" src="https://github.com/user-attachments/assets/94ea121d-02ce-4460-a1c9-cc6f9e9cd8d3" /> After: <img width="776" height="129" alt="Screenshot 2025-12-09 at 11 28 27 AM" src="https://github.com/user-attachments/assets/5c23bd73-23ea-4d44-a2e9-e4f01b93dc3c" /> <img width="1511" height="787" alt="Screenshot 2025-12-09 at 11 28 33 AM" src="https://github.com/user-attachments/assets/9c8d1932-f1ac-49bc-b122-7229cd8ad360" />
1 parent b564a36 commit 776e392

3 files changed

Lines changed: 87 additions & 26 deletions

File tree

‎.changeset/ten-cups-jam.md‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@hyperdx/app": patch
3+
---
4+
5+
fix: Fix queries/minute calculation in Services Dashboard

‎packages/app/src/ServicesDashboardPage.tsx‎

Lines changed: 72 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -631,7 +631,9 @@ function HttpTab({
631631
selectGroupBy: false,
632632
groupBy: expressions.endpoint,
633633
orderBy: '"Total (ms)" DESC',
634-
filters: getScopedFilters({ appliedConfig, expressions }),
634+
filters: [
635+
...getScopedFilters({ appliedConfig, expressions }),
636+
],
635637
dateRange: searchedTimeRange,
636638
numberFormat: MS_NUMBER_FORMAT,
637639
limit: { limit: 20 },
@@ -803,12 +805,17 @@ function DatabaseTab({
803805
where: appliedConfig.where || '',
804806
whereLanguage: appliedConfig.whereLanguage || 'sql',
805807
select: [
808+
// Separate the aggregations from the conversion to ms so that AggregatingMergeTree MVs can be used
806809
{
807-
alias: 'total_query_time_ms',
810+
alias: 'total_query_time_ns',
808811
aggFn: 'sum',
809-
valueExpression: expressions.durationInMillis,
812+
valueExpression: expressions.duration,
810813
aggCondition: '',
811814
},
815+
{
816+
alias: 'total_query_time_ms',
817+
valueExpression: `total_query_time_ns / ${expressions.durationDivisorForMillis}`,
818+
},
812819
{
813820
alias: 'Statement',
814821
valueExpression: expressions.dbStatement,
@@ -1090,6 +1097,12 @@ function DatabaseTab({
10901097
valueColumn="Total"
10911098
hoverCardPosition="top-start"
10921099
getRowSearchLink={getRowSearchLink}
1100+
hiddenSeries={[
1101+
'total_duration_ns',
1102+
'total_queries',
1103+
'p95_duration_ns',
1104+
'p50_duration_ns',
1105+
]}
10931106
config={{
10941107
...source,
10951108
where: appliedConfig.where || '',
@@ -1099,35 +1112,51 @@ function DatabaseTab({
10991112
selectGroupBy: false,
11001113
orderBy: '"Total" DESC',
11011114
select: [
1115+
// Separate the aggregations from the conversion to ms and rate so that AggregatingMergeTree MVs can be used
11021116
{
11031117
alias: 'Statement',
11041118
valueExpression: expressions.dbStatement,
11051119
},
11061120
{
1107-
alias: 'Total',
1121+
alias: 'total_duration_ns',
11081122
aggFn: 'sum',
1123+
valueExpression: expressions.duration,
11091124
aggCondition: '',
1110-
valueExpression: expressions.durationInMillis,
11111125
},
11121126
{
1113-
alias: 'Queries/Min',
1127+
alias: 'Total',
1128+
valueExpression: `total_duration_ns / ${expressions.durationDivisorForMillis}`,
1129+
},
1130+
{
1131+
alias: 'total_queries',
11141132
aggFn: 'count',
1115-
valueExpression: `value / age('mi', toDateTime(${searchedTimeRange[0].getTime() / 1000}), toDateTime(${searchedTimeRange[1].getTime() / 1000}))`,
1133+
valueExpression: '',
1134+
},
1135+
{
1136+
alias: 'Queries/Min',
1137+
valueExpression: `total_queries / age('mi', toDateTime(${searchedTimeRange[0].getTime() / 1000}), toDateTime(${searchedTimeRange[1].getTime() / 1000}))`,
1138+
},
1139+
{
1140+
alias: 'p95_duration_ns',
1141+
aggFn: 'quantile',
1142+
level: 0.95,
1143+
valueExpression: expressions.duration,
11161144
aggCondition: '',
11171145
},
11181146
{
11191147
alias: 'P95 (ms)',
1148+
valueExpression: `p95_duration_ns / ${expressions.durationDivisorForMillis}`,
1149+
},
1150+
{
1151+
alias: 'p50_duration_ns',
11201152
aggFn: 'quantile',
1121-
valueExpression: expressions.durationInMillis,
1153+
level: 0.5,
1154+
valueExpression: expressions.duration,
11221155
aggCondition: '',
1123-
level: 0.95,
11241156
},
11251157
{
11261158
alias: 'Median (ms)',
1127-
aggFn: 'quantile',
1128-
valueExpression: expressions.durationInMillis,
1129-
aggCondition: '',
1130-
level: 0.5,
1159+
valueExpression: `p50_duration_ns / ${expressions.durationDivisorForMillis}`,
11311160
},
11321161
],
11331162
filters: [
@@ -1144,6 +1173,12 @@ function DatabaseTab({
11441173
) : (
11451174
<DBTableChart
11461175
getRowSearchLink={getRowSearchLink}
1176+
hiddenColumns={[
1177+
'duration_ns',
1178+
'total_count',
1179+
'p95_duration_ns',
1180+
'p50_duration_ns',
1181+
]}
11471182
config={{
11481183
...source,
11491184
where: appliedConfig.where || '',
@@ -1158,31 +1193,46 @@ function DatabaseTab({
11581193
valueExpression: expressions.dbStatement,
11591194
},
11601195
{
1161-
alias: 'Total',
1196+
alias: 'duration_ns',
11621197
aggFn: 'sum',
1198+
valueExpression: expressions.duration,
11631199
aggCondition: '',
1164-
valueExpression: expressions.durationInMillis,
11651200
},
11661201
{
1167-
alias: 'Queries/Min',
1202+
alias: 'Total',
1203+
valueExpression: `duration_ns / ${expressions.durationDivisorForMillis}`,
1204+
},
1205+
{
1206+
alias: 'total_count',
11681207
aggFn: 'count',
1169-
valueExpression: `value / age('mi', toDateTime(${searchedTimeRange[0].getTime() / 1000}), toDateTime(${searchedTimeRange[1].getTime() / 1000}))`,
1170-
aggCondition: '',
1208+
valueExpression: '',
11711209
},
11721210
{
1173-
alias: 'P95 (ms)',
1211+
alias: 'Queries/Min',
1212+
valueExpression: `total_count / age('mi', toDateTime(${searchedTimeRange[0].getTime() / 1000}), toDateTime(${searchedTimeRange[1].getTime() / 1000}))`,
1213+
},
1214+
{
1215+
alias: 'p95_duration_ns',
11741216
aggFn: 'quantile',
1175-
valueExpression: expressions.durationInMillis,
1217+
valueExpression: expressions.duration,
11761218
aggCondition: '',
11771219
level: 0.95,
11781220
},
11791221
{
1180-
alias: 'Median (ms)',
1222+
alias: 'P95 (ms)',
1223+
valueExpression: `p95_duration_ns / ${expressions.durationDivisorForMillis}`,
1224+
},
1225+
{
1226+
alias: 'p50_duration_ns',
11811227
aggFn: 'quantile',
1182-
valueExpression: expressions.durationInMillis,
1228+
valueExpression: expressions.duration,
11831229
aggCondition: '',
11841230
level: 0.5,
11851231
},
1232+
{
1233+
alias: 'Median (ms)',
1234+
valueExpression: `p50_duration_ns / ${expressions.durationDivisorForMillis}`,
1235+
},
11861236
],
11871237
filters: [
11881238
...getScopedFilters({

‎packages/app/src/components/ServiceDashboardDbQuerySidePanel.tsx‎

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,17 +94,23 @@ export default function ServiceDashboardDbQuerySidePanel({
9494
{source && expressions && (
9595
<DBTimeChart
9696
sourceId={sourceId}
97+
hiddenSeries={['total_duration_ns']}
9798
config={{
9899
...source,
99100
where: '',
100101
whereLanguage: 'sql',
101102
select: [
103+
// Separate the aggregations from the conversion to ms so that AggregatingMergeTree MVs can be used
102104
{
103-
aggFn: 'sum' as const,
104-
valueExpression: expressions.durationInMillis,
105-
alias: 'Total Query Time',
105+
aggFn: 'sum',
106+
valueExpression: expressions.duration,
107+
alias: 'total_duration_ns',
106108
aggCondition: '',
107109
},
110+
{
111+
valueExpression: `total_duration_ns / ${expressions.durationDivisorForMillis}`,
112+
alias: 'Total Query Time',
113+
},
108114
],
109115
numberFormat: MS_NUMBER_FORMAT,
110116
filters: dbQueryFilters,
@@ -119,7 +125,7 @@ export default function ServiceDashboardDbQuerySidePanel({
119125
<Group justify="space-between" align="center" mb="sm">
120126
<Text size="sm">Query Throughput</Text>
121127
</Group>
122-
{source && (
128+
{source && expressions && (
123129
<DBTimeChart
124130
sourceId={sourceId}
125131
config={{

0 commit comments

Comments
 (0)