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"
         }
       ],

Reply via email to