+
+ Average KV CPU time spent executing within the specified time
+ interval. This can be thought of as KV work that is on the
+ critical path of serving the query. It does not include any
+ asynchronous replication related work. The gray bar indicates mean
+ KV CPU time. The blue bar indicates one standard deviation from
+ the mean.
+
+ >
+ }
+ >
+ {getLabel("kvCPUTime")}
+
+ );
+ },
maxMemUsage: (statType: StatisticType) => {
let contentModifier = "";
let fingerprintModifier = "";
diff --git a/pkg/ui/workspaces/cluster-ui/src/transactionDetails/transactionDetailsUtils.tsx b/pkg/ui/workspaces/cluster-ui/src/transactionDetails/transactionDetailsUtils.tsx
index fd5bbf408913..daa3f0ef9e59 100644
--- a/pkg/ui/workspaces/cluster-ui/src/transactionDetails/transactionDetailsUtils.tsx
+++ b/pkg/ui/workspaces/cluster-ui/src/transactionDetails/transactionDetailsUtils.tsx
@@ -158,6 +158,12 @@ function addTransactionStats(
countB,
),
exec_stats: addExecStats(a.exec_stats, b.exec_stats),
+ kv_cpu_time_nanos: aggregateNumericStats(
+ a.kv_cpu_time_nanos,
+ b.kv_cpu_time_nanos,
+ countA,
+ countB,
+ ),
};
}
diff --git a/pkg/ui/workspaces/cluster-ui/src/transactionsTable/transactionsBarCharts.ts b/pkg/ui/workspaces/cluster-ui/src/transactionsTable/transactionsBarCharts.ts
index 282d1384c5dc..6b10884d6e07 100644
--- a/pkg/ui/workspaces/cluster-ui/src/transactionsTable/transactionsBarCharts.ts
+++ b/pkg/ui/workspaces/cluster-ui/src/transactionsTable/transactionsBarCharts.ts
@@ -75,6 +75,15 @@ const cpuStdDev = bar(cx("cpu-dev"), (d: Transaction) =>
d.stats_data.stats.exec_stats.count,
),
);
+const kvCPUTimeBar = [
+ bar(
+ "kv-cpu-time",
+ (d: TransactionInfo) => d.stats_data.stats.kv_cpu_time_nanos?.mean,
+ ),
+];
+const kvCPUTimeStdDev = bar(cx("kv-cpu-time-dev"), (d: Transaction) =>
+ stdDevLong(d.stats_data.stats.kv_cpu_time_nanos, d.stats_data.stats.count),
+);
const maxMemUsageBar = [
bar("max-mem-usage", (d: TransactionInfo) =>
longToInt(d.stats_data.stats.exec_stats.max_mem_usage?.mean),
@@ -138,6 +147,12 @@ export const transactionsCPUBarChart = barChartFactory(
v => Duration(v),
cpuStdDev,
);
+export const transactionsKVCPUTimeBarChart = barChartFactory(
+ "grey",
+ kvCPUTimeBar,
+ v => Duration(v),
+ kvCPUTimeStdDev,
+);
export const transactionsMaxMemUsageBarChart = barChartFactory(
"grey",
maxMemUsageBar,
diff --git a/pkg/ui/workspaces/cluster-ui/src/transactionsTable/transactionsTable.tsx b/pkg/ui/workspaces/cluster-ui/src/transactionsTable/transactionsTable.tsx
index 8411de957a76..0b8446906efd 100644
--- a/pkg/ui/workspaces/cluster-ui/src/transactionsTable/transactionsTable.tsx
+++ b/pkg/ui/workspaces/cluster-ui/src/transactionsTable/transactionsTable.tsx
@@ -40,6 +40,7 @@ import {
transactionsServiceLatencyBarChart,
transactionsContentionBarChart,
transactionsCPUBarChart,
+ transactionsKVCPUTimeBarChart,
transactionsMaxMemUsageBarChart,
transactionsNetworkBytesBarChart,
transactionsRetryBarChart,
@@ -131,6 +132,10 @@ export function makeTransactionsColumns(
transactions,
sampledExecStatsBarChartOptions,
);
+ const kvCPUTimeBar = transactionsKVCPUTimeBarChart(
+ transactions,
+ defaultBarChartOptions, // kvCPUTime is always collected, it is not part of the sampled exec stats.
+ );
const maxMemUsageBar = transactionsMaxMemUsageBarChart(
transactions,
sampledExecStatsBarChartOptions,
@@ -239,6 +244,14 @@ export function makeTransactionsColumns(
sort: (item: TransactionInfo) =>
FixLong(Number(item.stats_data.stats.exec_stats.cpu_sql_nanos?.mean)),
},
+ {
+ name: "kvCPUTime",
+ title: statisticsTableTitles.kvCPUTime(statType),
+ cell: kvCPUTimeBar,
+ className: cx("statements-table__col-kv-cpu-time"),
+ sort: (item: TransactionInfo) =>
+ FixLong(Number(item.stats_data.stats.kv_cpu_time_nanos?.mean)),
+ },
{
name: "maxMemUsage",
title: statisticsTableTitles.maxMemUsage(statType),
diff --git a/pkg/ui/workspaces/cluster-ui/src/util/appStats/appStats.ts b/pkg/ui/workspaces/cluster-ui/src/util/appStats/appStats.ts
index dcc417f1f46b..124f1708272c 100644
--- a/pkg/ui/workspaces/cluster-ui/src/util/appStats/appStats.ts
+++ b/pkg/ui/workspaces/cluster-ui/src/util/appStats/appStats.ts
@@ -231,6 +231,12 @@ export function addStatementStats(
countA,
countB,
),
+ kv_cpu_time_nanos: aggregateNumericStats(
+ a.kv_cpu_time_nanos,
+ b.kv_cpu_time_nanos,
+ countA,
+ countB,
+ ),
rows_read: aggregateNumericStats(a.rows_read, b.rows_read, countA, countB),
rows_written: aggregateNumericStats(
a.rows_written,