This is an automated email from the ASF dual-hosted git repository.
warren pushed a commit to branch feat/q-dev-logging-dashboard-enrichment
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git
The following commit(s) were added to
refs/heads/feat/q-dev-logging-dashboard-enrichment by this push:
new 1edef6d61 fix(q-dev): prevent data inflation in user_report JOIN
user_data
1edef6d61 is described below
commit 1edef6d61fca57daa27ad827a023e12545838c94
Author: warren <[email protected]>
AuthorDate: Sun Mar 15 15:44:49 2026 +0800
fix(q-dev): prevent data inflation in user_report JOIN user_data
user_report has multiple rows per (user_id, date) due to client_type
(KIRO_IDE, KIRO_CLI), but user_data has only one row per (user_id, date).
A direct JOIN causes user_data metrics to be counted multiple times.
Fix: pre-aggregate user_report by (user_id, date) in a subquery before
joining, so the JOIN is always 1:1.
Affects: Credits Efficiency stat and User Productivity table.
---
grafana/dashboards/qdev_executive.json | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/grafana/dashboards/qdev_executive.json
b/grafana/dashboards/qdev_executive.json
index 6ef510855..c6e2524d7 100644
--- a/grafana/dashboards/qdev_executive.json
+++ b/grafana/dashboards/qdev_executive.json
@@ -129,7 +129,7 @@
"editorMode": "code",
"format": "table",
"rawQuery": true,
- "rawSql": "SELECT ROUND(SUM(r.credits_used) /
NULLIF(SUM(d.inline_ai_code_lines + d.chat_ai_code_lines +
d.code_fix_accepted_lines + d.dev_accepted_lines), 0), 2) as 'Credits per
Accepted Line'\nFROM lake._tool_q_dev_user_report r\nJOIN
lake._tool_q_dev_user_data d ON r.user_id = d.user_id AND r.date =
d.date\nWHERE $__timeFilter(r.date)",
+ "rawSql": "SELECT ROUND(SUM(r.credits_used) /
NULLIF(SUM(d.total_accepted), 0), 2) as 'Credits per Accepted Line'\nFROM (\n
SELECT user_id, date, SUM(credits_used) as credits_used\n FROM
lake._tool_q_dev_user_report\n WHERE $__timeFilter(date)\n GROUP BY user_id,
date\n) r\nJOIN (\n SELECT user_id, date,\n (inline_ai_code_lines +
chat_ai_code_lines + code_fix_accepted_lines + dev_accepted_lines) as
total_accepted\n FROM lake._tool_q_dev_user_data\n WHERE $__timeFilter [...]
"refId": "A"
}
],
@@ -865,7 +865,7 @@
"editorMode": "code",
"format": "table",
"rawQuery": true,
- "rawSql": "SELECT\n COALESCE(MAX(d.display_name), d.user_id) as
'User',\n COALESCE(MAX(r.subscription_tier), '') as 'Tier',\n
ROUND(SUM(r.credits_used), 1) as 'Credits Used',\n SUM(d.chat_ai_code_lines +
d.inline_ai_code_lines + d.code_fix_accepted_lines + d.dev_accepted_lines) as
'Total Accepted Lines',\n CASE WHEN SUM(d.chat_ai_code_lines +
d.inline_ai_code_lines + d.code_fix_accepted_lines + d.dev_accepted_lines) >
0\n THEN ROUND(SUM(r.credits_used) / SUM(d.chat_ai_c [...]
+ "rawSql": "SELECT\n COALESCE(MAX(d.display_name), d.user_id) as
'User',\n COALESCE(MAX(r.subscription_tier), '') as 'Tier',\n
ROUND(SUM(r.credits_used), 1) as 'Credits Used',\n SUM(d.chat_ai_code_lines +
d.inline_ai_code_lines + d.code_fix_accepted_lines + d.dev_accepted_lines) as
'Total Accepted Lines',\n CASE WHEN SUM(d.chat_ai_code_lines +
d.inline_ai_code_lines + d.code_fix_accepted_lines + d.dev_accepted_lines) >
0\n THEN ROUND(SUM(r.credits_used) / SUM(d.chat_ai_c [...]
"refId": "A"
}
],