diff --git a/.changeset/ten-cups-jam.md b/.changeset/ten-cups-jam.md new file mode 100644 index 00000000..cd056799 --- /dev/null +++ b/.changeset/ten-cups-jam.md @@ -0,0 +1,5 @@ +--- +"@hyperdx/app": patch +--- + +fix: Fix queries/minute calculation in Services Dashboard diff --git a/packages/app/src/ServicesDashboardPage.tsx b/packages/app/src/ServicesDashboardPage.tsx index c75e19c6..d5526b2a 100644 --- a/packages/app/src/ServicesDashboardPage.tsx +++ b/packages/app/src/ServicesDashboardPage.tsx @@ -631,7 +631,9 @@ function HttpTab({ selectGroupBy: false, groupBy: expressions.endpoint, orderBy: '"Total (ms)" DESC', - filters: getScopedFilters({ appliedConfig, expressions }), + filters: [ + ...getScopedFilters({ appliedConfig, expressions }), + ], dateRange: searchedTimeRange, numberFormat: MS_NUMBER_FORMAT, limit: { limit: 20 }, @@ -803,11 +805,16 @@ function DatabaseTab({ where: appliedConfig.where || '', whereLanguage: appliedConfig.whereLanguage || 'sql', select: [ + // Separate the aggregations from the conversion to ms so that AggregatingMergeTree MVs can be used + { + alias: 'total_query_time_ns', + aggFn: 'sum', + valueExpression: expressions.duration, + aggCondition: '', + }, { alias: 'total_query_time_ms', - aggFn: 'sum', - valueExpression: expressions.durationInMillis, - aggCondition: '', + valueExpression: `total_query_time_ns / ${expressions.durationDivisorForMillis}`, }, { alias: 'Statement', @@ -1090,6 +1097,12 @@ function DatabaseTab({ valueColumn="Total" hoverCardPosition="top-start" getRowSearchLink={getRowSearchLink} + hiddenSeries={[ + 'total_duration_ns', + 'total_queries', + 'p95_duration_ns', + 'p50_duration_ns', + ]} config={{ ...source, where: appliedConfig.where || '', @@ -1099,35 +1112,51 @@ function DatabaseTab({ selectGroupBy: false, orderBy: '"Total" DESC', select: [ + // Separate the aggregations from the conversion to ms and rate so that AggregatingMergeTree MVs can be used { alias: 'Statement', valueExpression: expressions.dbStatement, }, { - alias: 'Total', + alias: 'total_duration_ns', aggFn: 'sum', + valueExpression: expressions.duration, aggCondition: '', - valueExpression: expressions.durationInMillis, + }, + { + alias: 'Total', + valueExpression: `total_duration_ns / ${expressions.durationDivisorForMillis}`, + }, + { + alias: 'total_queries', + aggFn: 'count', + valueExpression: '', }, { alias: 'Queries/Min', - aggFn: 'count', - valueExpression: `value / age('mi', toDateTime(${searchedTimeRange[0].getTime() / 1000}), toDateTime(${searchedTimeRange[1].getTime() / 1000}))`, + valueExpression: `total_queries / age('mi', toDateTime(${searchedTimeRange[0].getTime() / 1000}), toDateTime(${searchedTimeRange[1].getTime() / 1000}))`, + }, + { + alias: 'p95_duration_ns', + aggFn: 'quantile', + level: 0.95, + valueExpression: expressions.duration, aggCondition: '', }, { alias: 'P95 (ms)', + valueExpression: `p95_duration_ns / ${expressions.durationDivisorForMillis}`, + }, + { + alias: 'p50_duration_ns', aggFn: 'quantile', - valueExpression: expressions.durationInMillis, + level: 0.5, + valueExpression: expressions.duration, aggCondition: '', - level: 0.95, }, { alias: 'Median (ms)', - aggFn: 'quantile', - valueExpression: expressions.durationInMillis, - aggCondition: '', - level: 0.5, + valueExpression: `p50_duration_ns / ${expressions.durationDivisorForMillis}`, }, ], filters: [ @@ -1144,6 +1173,12 @@ function DatabaseTab({ ) : ( Query Throughput - {source && ( + {source && expressions && (