diff --git a/grafana/dashboards/WeeklyBugRetro.json b/grafana/dashboards/WeeklyBugRetro.json index ab297f14004..3587c0bdaa0 100644 --- a/grafana/dashboards/WeeklyBugRetro.json +++ b/grafana/dashboards/WeeklyBugRetro.json @@ -18,7 +18,6 @@ "editable": true, "fiscalYearStartMonth": 0, "graphTooltip": 0, - "id": 12, "links": [], "liveNow": false, "panels": [ @@ -40,7 +39,7 @@ "showLineNumbers": false, "showMiniMap": false }, - "content": "- Use Cases: This dashboard can be used to track bugs with metrics such as [Bug Age](https://devlake.apache.org/docs/Metrics/BugAge).\n- Data Source Required: GitHub ([transformation](https://devlake.apache.org/docs/UserManuals/ConfigUI/GitHub#step-3---adding-transformation-rules-optional) required) or Jira ([transformation](https://devlake.apache.org/docs/UserManuals/ConfigUI/Jira#step-3---adding-transformation-rules-optional) required). Transformation is the configuration for you to tell DevLake what is a bug.", + "content": "- Use Cases: This dashboard can be used to track bugs with metrics such as [Bug Age](https://devlake.apache.org/docs/Metrics/BugAge).\n- Data Source Required: GitHub ([Scope Config](https://devlake.apache.org/docs/UserManuals/ConfigUI/GitHub#step-3---adding-transformation-rules-optional) required) or Jira ([Scope Config](https://devlake.apache.org/docs/UserManuals/ConfigUI/Jira#step-3---adding-transformation-rules-optional) required). Scope config is the settings to define which issues are bugs.", "mode": "markdown" }, "pluginVersion": "11.0.0", @@ -57,12 +56,47 @@ "title": "Dashboard Introduction", "type": "text" }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 3 + }, + "id": 32, + "panels": [], + "title": "Overall Bug Count", + "type": "row" + }, { "datasource": "mysql", "fieldConfig": { "defaults": { "color": { - "mode": "thresholds" + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "axisSoftMin": 0, + "fillOpacity": 46, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineWidth": 1, + "scaleDistribution": { + "type": "linear" + }, + "thresholdsStyle": { + "mode": "off" + } }, "mappings": [], "thresholds": { @@ -82,12 +116,12 @@ "overrides": [] }, "gridPos": { - "h": 8, - "w": 6, + "h": 9, + "w": 24, "x": 0, - "y": 3 + "y": 4 }, - "id": 6, + "id": 2, "links": [ { "targetBlank": true, @@ -96,23 +130,30 @@ } ], "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", + "barRadius": 0, + "barWidth": 0.71, + "fullHighlight": false, + "groupWidth": 0.7, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false + "showValue": "auto", + "stacking": "none", + "text": { + "valueSize": 12 }, - "showPercentChange": false, - "text": {}, - "textMode": "auto", - "wideLayout": true + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + }, + "xTickLabelRotation": 45, + "xTickLabelSpacing": 0 }, - "pluginVersion": "11.0.0", "targets": [ { "datasource": "mysql", @@ -122,7 +163,7 @@ "metricColumn": "none", "queryType": "randomWalk", "rawQuery": true, - "rawSql": "select\n count(distinct i.id)\nfrom\n issues as i\n join board_issues bi on i.id = bi.issue_id\n join boards b on bi.board_id = b.id\nwhere\n i.type in (${issue_type})\n and i.created_date BETWEEN curdate() - INTERVAL WEEKDAY(curdate())+7 DAY AND curdate() - INTERVAL WEEKDAY(curdate()) DAY\n and b.id in (${board_id})", + "rawSql": "with bugs as ( \n select \n DATE_ADD(date(i.created_date), INTERVAL -WEEKDAY(date(i.created_date)) DAY) as time,\n count(distinct i.id) as bug_count\n from\n issues as i\n\t join board_issues bi on i.id = bi.issue_id\n\t join boards b on bi.board_id = b.id\n where \n i.type in (${issue_type})\n and $__timeFilter(i.created_date)\n and b.id in (${board_id})\n group by time\n order by time desc\n),\n\ncalendar_date as(\n\tSELECT CAST(($__timeTo()-INTERVAL (H+T+U) DAY) AS date) d\n\tFROM ( SELECT 0 H\n\t\t\tUNION ALL SELECT 100 UNION ALL SELECT 200 UNION ALL SELECT 300\n\t\t) H CROSS JOIN ( SELECT 0 T\n\t\t\tUNION ALL SELECT 10 UNION ALL SELECT 20 UNION ALL SELECT 30\n\t\t\tUNION ALL SELECT 40 UNION ALL SELECT 50 UNION ALL SELECT 60\n\t\t\tUNION ALL SELECT 70 UNION ALL SELECT 80 UNION ALL SELECT 90\n\t\t) T CROSS JOIN ( SELECT 0 U\n\t\t\tUNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3\n\t\t\tUNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6\n\t\t\tUNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9\n\t\t) U\n\tWHERE\n\t\t($__timeTo()-INTERVAL (H+T+U) DAY) >= ($__timeTo()-INTERVAL 6 MONTH)\n),\n\ncalendar_weeks as(\n select \n \tdistinct date(DATE_ADD(date(d), INTERVAL -WEEKDAY(date(d)) DAY)) as start_of_week\n FROM calendar_date\n ORDER BY 1 asc\n)\n\n\nselect \n concat(date_format(cw.start_of_week,'%m/%d'), ' - ', date_format(DATE_ADD(cw.start_of_week, INTERVAL +7 DAY),'%m/%d')) as week,\n case when bug_count is not null then bug_count else 0 end as 'Weekly New Bugs'\nfrom calendar_weeks cw left join bugs b on cw.start_of_week = b.time\norder by cw.start_of_week asc\n", "refId": "A", "select": [ [ @@ -163,8 +204,8 @@ ] } ], - "title": "Previous Week New Bug Count", - "type": "stat" + "title": "Weekly New Bugs [Selected Time Range]", + "type": "barchart" }, { "datasource": "mysql", @@ -174,23 +215,51 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "axisSoftMin": 0, + "fillOpacity": 46, + "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false + }, + "lineWidth": 1, + "scaleDistribution": { + "type": "linear" + }, + "thresholdsStyle": { + "mode": "off" } }, - "mappings": [] + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } }, "overrides": [] }, "gridPos": { - "h": 8, - "w": 6, - "x": 6, - "y": 3 + "h": 10, + "w": 24, + "x": 0, + "y": 13 }, - "id": 26, + "id": 20, "links": [ { "targetBlank": true, @@ -199,32 +268,30 @@ } ], "options": { - "displayLabels": [ - "name", - "value" - ], + "barRadius": 0, + "barWidth": 0.71, + "fullHighlight": false, + "groupWidth": 0.7, "legend": { + "calcs": [], "displayMode": "list", "placement": "bottom", - "showLegend": true, - "values": [ - "percent", - "value" - ] + "showLegend": true }, - "pieType": "donut", - "reduceOptions": { - "calcs": [], - "fields": "", - "values": true + "orientation": "auto", + "showValue": "auto", + "stacking": "none", + "text": { + "valueSize": 12 }, "tooltip": { "maxHeight": 600, - "mode": "multi", + "mode": "single", "sort": "none" - } + }, + "xTickLabelRotation": 45, + "xTickLabelSpacing": 0 }, - "pluginVersion": "8.0.6", "targets": [ { "datasource": "mysql", @@ -234,7 +301,7 @@ "metricColumn": "none", "queryType": "randomWalk", "rawQuery": true, - "rawSql": "select\n priority,\n count(distinct i.id) as 'Issue Number'\nfrom\n issues as i\n join board_issues bi on i.id = bi.issue_id\n join boards b on bi.board_id = b.id\nwhere\n i.type in (${issue_type})\n and i.created_date BETWEEN curdate() - INTERVAL WEEKDAY(curdate())+7 DAY AND curdate() - INTERVAL WEEKDAY(curdate()) DAY\n and b.id in (${board_id})\ngroup by 1", + "rawSql": "with bugs as (\n select \n DATE_ADD(date(i.resolution_date), INTERVAL -WEEKDAY(date(i.resolution_date)) DAY) as time,\n count(distinct i.id) as bug_count\n from\n issues as i\n\t join board_issues bi on i.id = bi.issue_id\n\t join boards b on bi.board_id = b.id\n where \n i.type in (${issue_type})\n and status = 'DONE'\n and $__timeFilter(i.resolution_date)\n and b.id in (${board_id})\n group by time\n order by time desc\n),\n\ncalendar_date as(\n\tSELECT CAST(($__timeTo()-INTERVAL (H+T+U) DAY) AS date) d\n\tFROM ( SELECT 0 H\n\t\t\tUNION ALL SELECT 100 UNION ALL SELECT 200 UNION ALL SELECT 300\n\t\t) H CROSS JOIN ( SELECT 0 T\n\t\t\tUNION ALL SELECT 10 UNION ALL SELECT 20 UNION ALL SELECT 30\n\t\t\tUNION ALL SELECT 40 UNION ALL SELECT 50 UNION ALL SELECT 60\n\t\t\tUNION ALL SELECT 70 UNION ALL SELECT 80 UNION ALL SELECT 90\n\t\t) T CROSS JOIN ( SELECT 0 U\n\t\t\tUNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3\n\t\t\tUNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6\n\t\t\tUNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9\n\t\t) U\n\tWHERE\n\t\t($__timeTo()-INTERVAL (H+T+U) DAY) >= ($__timeTo()-INTERVAL 6 MONTH)\n),\n\ncalendar_weeks as(\n select \n \tdistinct date(DATE_ADD(date(d), INTERVAL -WEEKDAY(date(d)) DAY)) as start_of_week\n FROM calendar_date\n ORDER BY 1 asc\n)\n\nselect \n concat(date_format(cw.start_of_week,'%m/%d'), ' - ', date_format(DATE_ADD(cw.start_of_week, INTERVAL +7 DAY),'%m/%d')) as week,\n case when bug_count is not null then bug_count else 0 end as 'Weekly Closed Bugs'\nfrom calendar_weeks cw left join bugs b on cw.start_of_week = b.time\norder by cw.start_of_week asc", "refId": "A", "select": [ [ @@ -275,22 +342,37 @@ ] } ], - "title": "Previous Week New Bug Count by Priority", - "type": "piechart" + "title": "Weekly Closed Bugs [Selected Time Range]", + "type": "barchart" }, { "datasource": "mysql", "fieldConfig": { "defaults": { "color": { - "mode": "thresholds" + "mode": "palette-classic" }, "custom": { - "align": "auto", - "cellOptions": { - "type": "auto" + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "axisSoftMin": 0, + "fillOpacity": 46, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - "inspect": false + "lineWidth": 1, + "scaleDistribution": { + "type": "linear" + }, + "thresholdsStyle": { + "mode": "off" + } }, "mappings": [], "thresholds": { @@ -307,62 +389,15 @@ ] } }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Issue Number" - }, - "properties": [ - { - "id": "custom.width", - "value": 124 - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Title" - }, - "properties": [ - { - "id": "custom.width", - "value": 640 - }, - { - "id": "links", - "value": [ - { - "targetBlank": true, - "title": "", - "url": "${__data.fields.Url}" - } - ] - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Url" - }, - "properties": [ - { - "id": "custom.hidden", - "value": true - } - ] - } - ] + "overrides": [] }, "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 3 + "h": 10, + "w": 24, + "x": 0, + "y": 23 }, - "id": 4, + "id": 21, "links": [ { "targetBlank": true, @@ -371,19 +406,32 @@ } ], "options": { - "cellHeight": "sm", - "footer": { - "countRows": false, - "fields": "", - "reducer": [ - "sum" + "barRadius": 0, + "barWidth": 0.71, + "fullHighlight": false, + "groupWidth": 0.7, + "legend": { + "calcs": [ + "mean" ], - "show": false + "displayMode": "list", + "placement": "bottom", + "showLegend": true }, - "showHeader": true, - "sortBy": [] + "orientation": "auto", + "showValue": "auto", + "stacking": "none", + "text": { + "valueSize": 12 + }, + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + }, + "xTickLabelRotation": 45, + "xTickLabelSpacing": 0 }, - "pluginVersion": "11.0.0", "targets": [ { "datasource": "mysql", @@ -393,7 +441,7 @@ "metricColumn": "none", "queryType": "randomWalk", "rawQuery": true, - "rawSql": "select\n i.issue_key as 'Issue Number',\n i.title as 'Title',\n i.url as 'Url',\n i.creator_name as 'Creator'\nfrom\n issues as i\n\tjoin board_issues bi on i.id = bi.issue_id\n\tjoin boards b on bi.board_id = b.id\nwhere\n i.type in (${issue_type})\n and i.created_date BETWEEN curdate() - INTERVAL WEEKDAY(curdate())+7 DAY AND curdate() - INTERVAL WEEKDAY(curdate()) DAY\n and b.id in (${board_id})", + "rawSql": "with calendar_date as(\n\tSELECT CAST(($__timeTo()-INTERVAL (H+T+U) DAY) AS date) d\n\tFROM ( SELECT 0 H\n\t\t\tUNION ALL SELECT 100 UNION ALL SELECT 200 UNION ALL SELECT 300\n\t\t) H CROSS JOIN ( SELECT 0 T\n\t\t\tUNION ALL SELECT 10 UNION ALL SELECT 20 UNION ALL SELECT 30\n\t\t\tUNION ALL SELECT 40 UNION ALL SELECT 50 UNION ALL SELECT 60\n\t\t\tUNION ALL SELECT 70 UNION ALL SELECT 80 UNION ALL SELECT 90\n\t\t) T CROSS JOIN ( SELECT 0 U\n\t\t\tUNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3\n\t\t\tUNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6\n\t\t\tUNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9\n\t\t) U\n\tWHERE\n\t\t($__timeTo()-INTERVAL (H+T+U) DAY) >= ($__timeTo()-INTERVAL 6 MONTH)\n),\n\ncalendar_weeks as(\n select \n \tdistinct date(DATE_ADD(date(d), INTERVAL -WEEKDAY(date(d)) DAY)) as start_of_week\n FROM calendar_date\n ORDER BY 1 asc\n),\n\ncreated_bugs as ( \n select \n DATE_ADD(date(i.created_date), INTERVAL -WEEKDAY(date(i.created_date)) DAY) as time,\n count(distinct i.id) as bug_count\n from\n issues as i\n\t join board_issues bi on i.id = bi.issue_id\n\t join boards b on bi.board_id = b.id\n where \n i.type in (${issue_type})\n and $__timeFilter(i.created_date)\n and b.id in (${board_id})\n group by time\n order by time desc\n),\n\nresolved_bugs as (\n select \n DATE_ADD(date(i.resolution_date), INTERVAL -WEEKDAY(date(i.resolution_date)) DAY) as time,\n count(distinct i.id) as bug_count\n from\n issues as i\n\t join board_issues bi on i.id = bi.issue_id\n\t join boards b on bi.board_id = b.id\n where \n i.type in (${issue_type})\n and status = 'DONE'\n and $__timeFilter(i.resolution_date)\n and b.id in (${board_id})\n group by time\n order by time desc\n),\n\nweekly_new_bug as(\n select\n cw.start_of_week as week,\n case when bug_count is not null then bug_count else 0 end as weekly_new_bug\n from calendar_weeks cw left join created_bugs cb on cw.start_of_week = cb.time\n),\n\nweekly_closed_bug as(\n select\n cw.start_of_week as week,\n case when bug_count is not null then bug_count else 0 end as weekly_closed_bug\n from calendar_weeks cw left join resolved_bugs cb on cw.start_of_week = cb.time\n),\n\nweekly_updates as(\n SELECT t1.week, weekly_new_bug, weekly_closed_bug FROM weekly_new_bug t1\n LEFT JOIN weekly_closed_bug t2 ON t1.week = t2.week\n UNION\n SELECT t1.week, weekly_new_bug, weekly_closed_bug FROM weekly_new_bug t1\n RIGHT JOIN weekly_closed_bug t2 ON t1.week = t2.week\n),\n\n\noriginal_open_bugs as (\n SELECT \n count(distinct i.id) as original_open_bug_count\n FROM\n issues as i\n\t join board_issues bi on i.id = bi.issue_id\n\t join boards b on bi.board_id = b.id\n where \n i.type in (${issue_type})\n and i.created_date < $__timeFrom()\n and (i.status != 'DONE' or $__timeFilter(i.resolution_date))\n and b.id in (${board_id})\n),\n\nweekly_updated_without_null as(\n SELECT \n week, \n COALESCE(weekly_new_bug,0) as weekly_new_bug, \n COALESCE(weekly_closed_bug,0) as weekly_closed_bug,\n original_open_bug_count\n from weekly_updates, original_open_bugs\n where week is not null\n),\n\nweekly_delta as(\n SELECT \n *,\n (weekly_new_bug - weekly_closed_bug) as weekly_delta\n from weekly_updated_without_null\n order by week asc\n),\n\nfinal_data as(\n SELECT \n *,\n concat(date_format(week,'%m/%d'), ' - ', date_format(DATE_ADD(week, INTERVAL +7 DAY),'%m/%d')) as _week,\n sum(weekly_delta) over(order by week asc) as weekly_accumulated\n from weekly_delta\n)\n\nSELECT \n _week,\n (original_open_bug_count + weekly_accumulated) as \"Total No. of Outstanding Bugs By the End of Week\" from final_data", "refId": "A", "select": [ [ @@ -434,8 +482,21 @@ ] } ], - "title": "Last Week's New Bugs", - "type": "table" + "title": "Total Outstanding Bug Count by Week [Selected Time Range]", + "type": "barchart" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 33 + }, + "id": 33, + "panels": [], + "title": "Detailed Bug Info", + "type": "row" }, { "datasource": "mysql", @@ -465,9 +526,9 @@ "h": 8, "w": 6, "x": 0, - "y": 11 + "y": 34 }, - "id": 8, + "id": 6, "links": [ { "targetBlank": true, @@ -502,7 +563,7 @@ "metricColumn": "none", "queryType": "randomWalk", "rawQuery": true, - "rawSql": "select\n count(distinct i.id)\nfrom\n issues as i\n join board_issues bi on i.id = bi.issue_id\n\tjoin boards b on bi.board_id = b.id\nwhere\n i.type in (${issue_type})\n and status = 'DONE'\n and i.resolution_date BETWEEN curdate() - INTERVAL WEEKDAY(curdate())+7 DAY AND curdate() - INTERVAL WEEKDAY(curdate()) DAY\n and b.id in (${board_id})", + "rawSql": "select\n count(distinct i.id)\nfrom\n issues as i\n join board_issues bi on i.id = bi.issue_id\n join boards b on bi.board_id = b.id\nwhere\n i.type in (${issue_type})\n and i.created_date BETWEEN curdate() - INTERVAL WEEKDAY(curdate())+7 DAY AND curdate() - INTERVAL WEEKDAY(curdate()) DAY\n and b.id in (${board_id})", "refId": "A", "select": [ [ @@ -543,7 +604,7 @@ ] } ], - "title": "Last Week's Fixed Bugs Count", + "title": "Last Week's New Bug Count", "type": "stat" }, { @@ -551,27 +612,16 @@ "fieldConfig": { "defaults": { "color": { - "mode": "thresholds" + "mode": "palette-classic" }, - "decimals": 1, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "yellow", - "value": 14 - }, - { - "color": "red", - "value": 21 - } - ] - } + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "mappings": [] }, "overrides": [] }, @@ -579,34 +629,43 @@ "h": 8, "w": 6, "x": 6, - "y": 11 + "y": 34 }, - "id": 24, + "id": 26, "links": [ { "targetBlank": true, - "title": "Bug Age", - "url": "https://devlake.apache.org/docs/Metrics/BugAge" + "title": "Bug Count per 1k Lines of Code", + "url": "https://devlake.apache.org/docs/Metrics/BugCountPer1kLinesOfCode" } ], "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", + "displayLabels": [ + "name", + "value" + ], + "legend": { + "displayMode": "list", + "placement": "bottom", + "showLegend": true, + "values": [ + "percent", + "value" + ] + }, + "pieType": "donut", "reduceOptions": { - "calcs": [ - "lastNotNull" - ], + "calcs": [], "fields": "", - "values": false + "values": true }, - "showPercentChange": false, - "text": {}, - "textMode": "auto", - "wideLayout": true + "tooltip": { + "maxHeight": 600, + "mode": "multi", + "sort": "none" + } }, - "pluginVersion": "11.0.0", + "pluginVersion": "8.0.6", "targets": [ { "datasource": "mysql", @@ -616,7 +675,7 @@ "metricColumn": "none", "queryType": "randomWalk", "rawQuery": true, - "rawSql": "select\n avg(lead_time_minutes / 1440)\nfrom\n issues as i\n\tjoin board_issues bi on i.id = bi.issue_id\n\tjoin boards b on bi.board_id = b.id\nwhere\n i.type in (${issue_type})\n and status = 'DONE'\n and i.resolution_date BETWEEN curdate() - INTERVAL WEEKDAY(curdate())+7 DAY AND curdate() - INTERVAL WEEKDAY(curdate()) DAY\n and b.id in (${board_id})", + "rawSql": "select\n priority,\n count(distinct i.id) as 'Issue Number'\nfrom\n issues as i\n join board_issues bi on i.id = bi.issue_id\n join boards b on bi.board_id = b.id\nwhere\n i.type in (${issue_type})\n and i.created_date BETWEEN curdate() - INTERVAL WEEKDAY(curdate())+7 DAY AND curdate() - INTERVAL WEEKDAY(curdate()) DAY\n and b.id in (${board_id})\ngroup by 1", "refId": "A", "select": [ [ @@ -657,8 +716,8 @@ ] } ], - "title": "Average Lead Time of Last Week's Resolved Bugs in Days", - "type": "stat" + "title": "Last Week's New Bug Count by Priority", + "type": "piechart" }, { "datasource": "mysql", @@ -684,7 +743,7 @@ }, { "color": "red", - "value": 21 + "value": 80 } ] } @@ -698,7 +757,7 @@ "properties": [ { "id": "custom.width", - "value": 125 + "value": 124 } ] }, @@ -710,7 +769,7 @@ "properties": [ { "id": "custom.width", - "value": 639 + "value": 640 }, { "id": "links", @@ -735,30 +794,16 @@ "value": true } ] - }, - { - "matcher": { - "id": "byName", - "options": "Lead Time in Days" - }, - "properties": [ - { - "id": "custom.cellOptions", - "value": { - "type": "color-text" - } - } - ] } ] }, "gridPos": { - "h": 16, + "h": 8, "w": 12, "x": 12, - "y": 11 + "y": 34 }, - "id": 10, + "id": 4, "links": [ { "targetBlank": true, @@ -789,7 +834,7 @@ "metricColumn": "none", "queryType": "randomWalk", "rawQuery": true, - "rawSql": "select\n i.issue_key as 'Issue Number',\n i.title as 'Title',\n lead_time_minutes/1440 as 'Lead Time in Days',\n i.url as 'Url'\nfrom\n issues as i\n\tjoin board_issues bi on i.id = bi.issue_id\n\tjoin boards b on bi.board_id = b.id\nwhere\n i.type in (${issue_type})\n and status = 'DONE'\n and i.resolution_date BETWEEN curdate() - INTERVAL WEEKDAY(curdate())+7 DAY AND curdate() - INTERVAL WEEKDAY(curdate()) DAY\n and b.id in (${board_id})", + "rawSql": "select\n i.issue_key as 'Issue Number',\n i.title as 'Title',\n i.url as 'Url',\n i.creator_name as 'Creator'\nfrom\n issues as i\n\tjoin board_issues bi on i.id = bi.issue_id\n\tjoin boards b on bi.board_id = b.id\nwhere\n i.type in (${issue_type})\n and i.created_date BETWEEN curdate() - INTERVAL WEEKDAY(curdate())+7 DAY AND curdate() - INTERVAL WEEKDAY(curdate()) DAY\n and b.id in (${board_id})", "refId": "A", "select": [ [ @@ -830,7 +875,7 @@ ] } ], - "title": "Last Week's Fixed Bugs", + "title": "Last Week's New Bugs", "type": "table" }, { @@ -838,31 +883,8 @@ "fieldConfig": { "defaults": { "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "fillOpacity": 80, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineWidth": 1, - "scaleDistribution": { - "type": "linear" - }, - "thresholdsStyle": { - "mode": "off" - } + "mode": "thresholds" }, - "decimals": 1, "mappings": [], "thresholds": { "mode": "absolute", @@ -882,11 +904,11 @@ }, "gridPos": { "h": 8, - "w": 12, + "w": 6, "x": 0, - "y": 19 + "y": 42 }, - "id": 23, + "id": 8, "links": [ { "targetBlank": true, @@ -895,31 +917,23 @@ } ], "options": { - "barRadius": 0, - "barWidth": 0.3, - "fullHighlight": false, - "groupWidth": 0.7, - "legend": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { "calcs": [ - "mean" + "lastNotNull" ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "fields": "", + "values": false }, - "orientation": "horizontal", - "showValue": "auto", - "stacking": "none", + "showPercentChange": false, "text": {}, - "tooltip": { - "maxHeight": 600, - "mode": "single", - "sort": "none" - }, - "xTickLabelRotation": 0, - "xTickLabelSpacing": 0 + "textMode": "auto", + "wideLayout": true }, - "pluginVersion": "8.0.6", + "pluginVersion": "11.0.0", "targets": [ { "datasource": "mysql", @@ -929,7 +943,7 @@ "metricColumn": "none", "queryType": "randomWalk", "rawQuery": true, - "rawSql": "select\n concat('#',i.issue_key, ' ', i.title) as issue_key,\n lead_time_minutes/1440 as lead_time\nfrom\n issues as i\n\tjoin board_issues bi on i.id = bi.issue_id\n\tjoin boards b on bi.board_id = b.id\nwhere\n i.type in (${issue_type})\n and status = 'DONE'\n and i.resolution_date BETWEEN curdate() - INTERVAL WEEKDAY(curdate())+7 DAY AND curdate() - INTERVAL WEEKDAY(curdate()) DAY\n and b.id in (${board_id})\norder by lead_time desc\nlimit 10", + "rawSql": "select\n count(distinct i.id)\nfrom\n issues as i\n join board_issues bi on i.id = bi.issue_id\n\tjoin boards b on bi.board_id = b.id\nwhere\n i.type in (${issue_type})\n and status = 'DONE'\n and i.resolution_date BETWEEN curdate() - INTERVAL WEEKDAY(curdate())+7 DAY AND curdate() - INTERVAL WEEKDAY(curdate()) DAY\n and b.id in (${board_id})", "refId": "A", "select": [ [ @@ -970,8 +984,8 @@ ] } ], - "title": "Top 10 Issue Lead Time [Last Week's Resolved Bugs in Days]", - "type": "barchart" + "title": "Last Week's Fixed Bugs Count", + "type": "stat" }, { "datasource": "mysql", @@ -980,6 +994,7 @@ "color": { "mode": "thresholds" }, + "decimals": 1, "mappings": [], "thresholds": { "mode": "absolute", @@ -988,9 +1003,13 @@ "color": "green", "value": null }, + { + "color": "yellow", + "value": 14 + }, { "color": "red", - "value": 80 + "value": 21 } ] } @@ -998,17 +1017,17 @@ "overrides": [] }, "gridPos": { - "h": 9, + "h": 8, "w": 6, - "x": 0, - "y": 27 + "x": 6, + "y": 42 }, - "id": 16, + "id": 24, "links": [ { "targetBlank": true, - "title": "Bug Count per 1k Lines of Code", - "url": "https://devlake.apache.org/docs/Metrics/BugCountPer1kLinesOfCode" + "title": "Bug Age", + "url": "https://devlake.apache.org/docs/Metrics/BugAge" } ], "options": { @@ -1038,7 +1057,7 @@ "metricColumn": "none", "queryType": "randomWalk", "rawQuery": true, - "rawSql": "select\n count(distinct i.id)\nfrom \n issues i\n\tjoin board_issues bi on i.id = bi.issue_id\n\tjoin boards b on bi.board_id = b.id\nwhere\n i.type in (${issue_type})\n and i.status != 'DONE'\n and b.id in (${board_id})", + "rawSql": "select\n avg(lead_time_minutes / 1440)\nfrom\n issues as i\n\tjoin board_issues bi on i.id = bi.issue_id\n\tjoin boards b on bi.board_id = b.id\nwhere\n i.type in (${issue_type})\n and status = 'DONE'\n and i.resolution_date BETWEEN curdate() - INTERVAL WEEKDAY(curdate())+7 DAY AND curdate() - INTERVAL WEEKDAY(curdate()) DAY\n and b.id in (${board_id})", "refId": "A", "select": [ [ @@ -1079,7 +1098,7 @@ ] } ], - "title": "Total Number of Outstanding Bugs", + "title": "Average Lead Time of Last Week's Resolved Bugs in Days", "type": "stat" }, { @@ -1089,6 +1108,13 @@ "color": { "mode": "thresholds" }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, "mappings": [], "thresholds": { "mode": "absolute", @@ -1099,54 +1125,112 @@ }, { "color": "red", - "value": 30 + "value": 21 } ] } }, - "overrides": [] - }, - "gridPos": { - "h": 9, - "w": 6, - "x": 6, - "y": 27 - }, - "id": 25, - "links": [ - { - "targetBlank": true, - "title": "Bug Count per 1k Lines of Code", - "url": "https://devlake.apache.org/docs/Metrics/BugCountPer1kLinesOfCode" - } - ], - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Issue Number" + }, + "properties": [ + { + "id": "custom.width", + "value": 125 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Title" + }, + "properties": [ + { + "id": "custom.width", + "value": 639 + }, + { + "id": "links", + "value": [ + { + "targetBlank": true, + "title": "", + "url": "${__data.fields.Url}" + } + ] + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Url" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Lead Time in Days" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "type": "color-text" + } + } + ] + } + ] + }, + "gridPos": { + "h": 16, + "w": 12, + "x": 12, + "y": 42 + }, + "id": 10, + "links": [ + { + "targetBlank": true, + "title": "Bug Count per 1k Lines of Code", + "url": "https://devlake.apache.org/docs/Metrics/BugCountPer1kLinesOfCode" + } + ], + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false }, - "showPercentChange": false, - "text": {}, - "textMode": "auto", - "wideLayout": true + "showHeader": true, + "sortBy": [] }, "pluginVersion": "11.0.0", "targets": [ { "datasource": "mysql", + "editorMode": "code", "format": "table", "group": [], "metricColumn": "none", "queryType": "randomWalk", "rawQuery": true, - "rawSql": "select \n avg((TIMESTAMPDIFF(MINUTE, i.created_date,NOW()))/1440)\nfrom \n issues i\n\tjoin board_issues bi on i.id = bi.issue_id\n\tjoin boards b on bi.board_id = b.id\nwhere\n i.type in (${issue_type})\n and i.status != 'DONE'\n and b.id in (${board_id})", + "rawSql": "select\n i.issue_key as 'Issue Number',\n i.title as 'Title',\n lead_time_minutes/1440 as 'Lead Time in Days',\n i.url as 'Url'\nfrom\n issues as i\n\tjoin board_issues bi on i.id = bi.issue_id\n\tjoin boards b on bi.board_id = b.id\nwhere\n i.type in (${issue_type})\n and status = 'DONE'\n and i.resolution_date BETWEEN curdate() - INTERVAL WEEKDAY(curdate())+7 DAY AND curdate() - INTERVAL WEEKDAY(curdate()) DAY\n and b.id in (${board_id})", "refId": "A", "select": [ [ @@ -1158,6 +1242,23 @@ } ] ], + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + }, "table": "_devlake_migration_history", "timeColumn": "created_at", "timeColumnType": "timestamp", @@ -1170,23 +1271,39 @@ ] } ], - "title": "Average Age of Outstanding Bugs in Days", - "type": "stat" + "title": "Last Week's Fixed Bugs", + "type": "table" }, { "datasource": "mysql", "fieldConfig": { "defaults": { "color": { - "mode": "thresholds" + "mode": "palette-classic" }, "custom": { - "align": "auto", - "cellOptions": { - "type": "auto" + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "axisSoftMin": 0, + "fillOpacity": 80, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - "inspect": false + "lineWidth": 1, + "scaleDistribution": { + "type": "linear" + }, + "thresholdsStyle": { + "mode": "off" + } }, + "decimals": 1, "mappings": [], "thresholds": { "mode": "absolute", @@ -1197,105 +1314,137 @@ }, { "color": "red", - "value": 30 + "value": 80 } ] } }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Issue Number" - }, - "properties": [ + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 50 + }, + "id": 23, + "links": [ + { + "targetBlank": true, + "title": "Bug Count per 1k Lines of Code", + "url": "https://devlake.apache.org/docs/Metrics/BugCountPer1kLinesOfCode" + } + ], + "options": { + "barRadius": 0, + "barWidth": 0.3, + "fullHighlight": false, + "groupWidth": 0.7, + "legend": { + "calcs": [ + "mean" + ], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "orientation": "horizontal", + "showValue": "auto", + "stacking": "none", + "text": {}, + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + }, + "xTickLabelRotation": 0, + "xTickLabelSpacing": 0 + }, + "pluginVersion": "8.0.6", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "table", + "group": [], + "metricColumn": "none", + "queryType": "randomWalk", + "rawQuery": true, + "rawSql": "select\n concat('#',i.issue_key, ' ', i.title) as issue_key,\n lead_time_minutes/1440 as lead_time\nfrom\n issues as i\n\tjoin board_issues bi on i.id = bi.issue_id\n\tjoin boards b on bi.board_id = b.id\nwhere\n i.type in (${issue_type})\n and status = 'DONE'\n and i.resolution_date BETWEEN curdate() - INTERVAL WEEKDAY(curdate())+7 DAY AND curdate() - INTERVAL WEEKDAY(curdate()) DAY\n and b.id in (${board_id})\norder by lead_time desc\nlimit 10", + "refId": "A", + "select": [ + [ { - "id": "custom.width", - "value": 121 + "params": [ + "script_version" + ], + "type": "column" } ] - }, - { - "matcher": { - "id": "byName", - "options": "Title" - }, - "properties": [ - { - "id": "custom.width", - "value": 641 - }, + ], + "sql": { + "columns": [ { - "id": "links", - "value": [ - { - "targetBlank": true, - "title": "", - "url": "${__data.fields.Url}" - } - ] + "parameters": [], + "type": "function" } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Queue Time in Days" - }, - "properties": [ + ], + "groupBy": [ { - "id": "custom.cellOptions", - "value": { - "type": "color-text" - } + "property": { + "type": "string" + }, + "type": "groupBy" } - ] + ], + "limit": 50 }, - { - "matcher": { - "id": "byName", - "options": "Url" - }, - "properties": [ - { - "id": "custom.hidden", - "value": true - } - ] + "table": "_devlake_migration_history", + "timeColumn": "created_at", + "timeColumnType": "timestamp", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "Top 10 Issue Lead Time [Last Week's Resolved Bugs in Days]", + "type": "barchart" + }, + { + "datasource": "mysql", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" }, - { - "matcher": { - "id": "byName", - "options": "Priority" - }, - "properties": [ + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ { - "id": "custom.width", - "value": 104 - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Severity" - }, - "properties": [ + "color": "green", + "value": null + }, { - "id": "custom.width", - "value": 112 + "color": "red", + "value": 80 } ] } - ] + }, + "overrides": [] }, "gridPos": { "h": 9, - "w": 12, - "x": 12, - "y": 27 + "w": 6, + "x": 0, + "y": 58 }, - "id": 14, + "id": 16, "links": [ { "targetBlank": true, @@ -1304,17 +1453,21 @@ } ], "options": { - "cellHeight": "sm", - "footer": { - "countRows": false, - "fields": "", - "reducer": [ - "sum" + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" ], - "show": false + "fields": "", + "values": false }, - "showHeader": true, - "sortBy": [] + "showPercentChange": false, + "text": {}, + "textMode": "auto", + "wideLayout": true }, "pluginVersion": "11.0.0", "targets": [ @@ -1326,7 +1479,7 @@ "metricColumn": "none", "queryType": "randomWalk", "rawQuery": true, - "rawSql": "select \n i.issue_key as 'Issue Number',\n i.title as 'Title',\n priority as 'Priority',\n severity as 'Severity',\n (TIMESTAMPDIFF(MINUTE, i.created_date,NOW()))/1440 as 'Queue Time in Days',\n i.url as 'Url'\nfrom \n issues i\n\tjoin board_issues bi on i.id = bi.issue_id\n\tjoin boards b on bi.board_id = b.id\nwhere\n i.type in (${issue_type})\n and i.status != 'DONE'\n and b.id in (${board_id})\n and priority in (${priority})\norder by 'Queue Time' desc", + "rawSql": "select\n count(distinct i.id)\nfrom \n issues i\n\tjoin board_issues bi on i.id = bi.issue_id\n\tjoin boards b on bi.board_id = b.id\nwhere\n i.type in (${issue_type})\n and i.status != 'DONE'\n and b.id in (${board_id})", "refId": "A", "select": [ [ @@ -1367,37 +1520,15 @@ ] } ], - "title": "Outstanding Bugs Sort by Queue Time [All History]", - "type": "table" + "title": "Total Number of Outstanding Bugs", + "type": "stat" }, { "datasource": "mysql", "fieldConfig": { "defaults": { "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "Queue Time in Days", - "axisPlacement": "auto", - "axisSoftMin": 0, - "fillOpacity": 80, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineWidth": 1, - "scaleDistribution": { - "type": "linear" - }, - "thresholdsStyle": { - "mode": "off" - } + "mode": "thresholds" }, "mappings": [], "thresholds": { @@ -1409,7 +1540,7 @@ }, { "color": "red", - "value": 21 + "value": 30 } ] } @@ -1418,55 +1549,45 @@ }, "gridPos": { "h": 9, - "w": 12, - "x": 0, - "y": 36 + "w": 6, + "x": 6, + "y": 58 }, - "id": 18, + "id": 25, "links": [ { "targetBlank": true, - "title": "Bug Age", - "url": "https://devlake.apache.org/docs/Metrics/BugAge" + "title": "Bug Count per 1k Lines of Code", + "url": "https://devlake.apache.org/docs/Metrics/BugCountPer1kLinesOfCode" } ], "options": { - "barRadius": 0, - "barWidth": 0.3, - "fullHighlight": false, - "groupWidth": 0.7, - "legend": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { "calcs": [ - "mean", - "max" + "lastNotNull" ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "fields": "", + "values": false }, - "orientation": "auto", - "showValue": "always", - "stacking": "none", + "showPercentChange": false, "text": {}, - "tooltip": { - "maxHeight": 600, - "mode": "multi", - "sort": "none" - }, - "xTickLabelRotation": 45, - "xTickLabelSpacing": 100 + "textMode": "auto", + "wideLayout": true }, - "pluginVersion": "8.0.6", + "pluginVersion": "11.0.0", "targets": [ { "datasource": "mysql", - "editorMode": "code", "format": "table", "group": [], "metricColumn": "none", "queryType": "randomWalk", "rawQuery": true, - "rawSql": "select \n concat('#', i.issue_key) as issue_key,\n (TIMESTAMPDIFF(MINUTE, i.created_date,NOW()))/1440 as 'Queue Time in Days'\nfrom \n issues i\n\tjoin board_issues bi on i.id = bi.issue_id\n\tjoin boards b on bi.board_id = b.id\nwhere\n i.type in (${issue_type})\n and i.status != 'DONE'\n and b.id in (${board_id})\norder by 2 desc\nlimit 100", + "rawSql": "select \n avg((TIMESTAMPDIFF(MINUTE, i.created_date,NOW()))/1440)\nfrom \n issues i\n\tjoin board_issues bi on i.id = bi.issue_id\n\tjoin boards b on bi.board_id = b.id\nwhere\n i.type in (${issue_type})\n and i.status != 'DONE'\n and b.id in (${board_id})", "refId": "A", "select": [ [ @@ -1478,23 +1599,6 @@ } ] ], - "sql": { - "columns": [ - { - "parameters": [], - "type": "function" - } - ], - "groupBy": [ - { - "property": { - "type": "string" - }, - "type": "groupBy" - } - ], - "limit": 50 - }, "table": "_devlake_migration_history", "timeColumn": "created_at", "timeColumnType": "timestamp", @@ -1507,8 +1611,8 @@ ] } ], - "title": "Top 100 Bug Queue Time in Days [Outstanding Bugs]", - "type": "barchart" + "title": "Average Age of Outstanding Bugs in Days", + "type": "stat" }, { "datasource": "mysql", @@ -1534,7 +1638,7 @@ }, { "color": "red", - "value": 7 + "value": 30 } ] } @@ -1608,7 +1712,7 @@ "properties": [ { "id": "custom.width", - "value": 103 + "value": 104 } ] }, @@ -1618,148 +1722,21 @@ "options": "Severity" }, "properties": [ - { - "id": "custom.width", - "value": 112 - } - ] - } - ] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 36 - }, - "id": 31, - "links": [ - { - "targetBlank": true, - "title": "Bug Age", - "url": "https://devlake.apache.org/docs/Metrics/BugAge" - } - ], - "options": { - "cellHeight": "sm", - "footer": { - "countRows": false, - "fields": "", - "reducer": [ - "sum" - ], - "show": false - }, - "showHeader": true, - "sortBy": [] - }, - "pluginVersion": "11.0.0", - "targets": [ - { - "datasource": "mysql", - "editorMode": "code", - "format": "table", - "group": [], - "metricColumn": "none", - "queryType": "randomWalk", - "rawQuery": true, - "rawSql": "select \n i.issue_key as 'Issue Number',\n i.title as 'Title',\n priority as 'Priority',\n severity as 'Severity',\n (TIMESTAMPDIFF(MINUTE, i.created_date,NOW()))/1440 as 'Queue Time in Days',\n i.url as 'Url'\nfrom \n issues i\n\tjoin board_issues bi on i.id = bi.issue_id\n\tjoin boards b on bi.board_id = b.id\nwhere\n i.type in (${issue_type})\n and i.status != 'DONE'\n and i.assignee_name = ''\n and b.id in (${board_id})\norder by 'Queue Time' desc", - "refId": "A", - "select": [ - [ - { - "params": [ - "script_version" - ], - "type": "column" - } - ] - ], - "sql": { - "columns": [ - { - "parameters": [], - "type": "function" - } - ], - "groupBy": [ - { - "property": { - "type": "string" - }, - "type": "groupBy" - } - ], - "limit": 50 - }, - "table": "_devlake_migration_history", - "timeColumn": "created_at", - "timeColumnType": "timestamp", - "where": [ - { - "name": "$__timeFilter", - "params": [], - "type": "macro" - } - ] - } - ], - "title": "Bugs to be Triaged Sort by Queue Time [All History]", - "type": "table" - }, - { - "datasource": "mysql", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "fillOpacity": 46, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineWidth": 1, - "scaleDistribution": { - "type": "linear" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 + { + "id": "custom.width", + "value": 112 } ] } - }, - "overrides": [] + ] }, "gridPos": { "h": 9, - "w": 24, - "x": 0, - "y": 45 + "w": 12, + "x": 12, + "y": 58 }, - "id": 2, + "id": 14, "links": [ { "targetBlank": true, @@ -1768,30 +1745,19 @@ } ], "options": { - "barRadius": 0, - "barWidth": 0.71, - "fullHighlight": false, - "groupWidth": 0.7, - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "orientation": "auto", - "showValue": "auto", - "stacking": "none", - "text": { - "valueSize": 12 - }, - "tooltip": { - "maxHeight": 600, - "mode": "single", - "sort": "none" + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false }, - "xTickLabelRotation": 45, - "xTickLabelSpacing": 0 + "showHeader": true, + "sortBy": [] }, + "pluginVersion": "11.0.0", "targets": [ { "datasource": "mysql", @@ -1801,7 +1767,7 @@ "metricColumn": "none", "queryType": "randomWalk", "rawQuery": true, - "rawSql": "with bugs as ( \n select \n DATE_ADD(date(i.created_date), INTERVAL -WEEKDAY(date(i.created_date)) DAY) as time,\n count(distinct i.id) as bug_count\n from\n issues as i\n\t join board_issues bi on i.id = bi.issue_id\n\t join boards b on bi.board_id = b.id\n where \n i.type in (${issue_type})\n and $__timeFilter(i.created_date)\n and b.id in (${board_id})\n group by time\n order by time desc\n),\n\ncalendar_date as(\n\tSELECT CAST(($__timeTo()-INTERVAL (H+T+U) DAY) AS date) d\n\tFROM ( SELECT 0 H\n\t\t\tUNION ALL SELECT 100 UNION ALL SELECT 200 UNION ALL SELECT 300\n\t\t) H CROSS JOIN ( SELECT 0 T\n\t\t\tUNION ALL SELECT 10 UNION ALL SELECT 20 UNION ALL SELECT 30\n\t\t\tUNION ALL SELECT 40 UNION ALL SELECT 50 UNION ALL SELECT 60\n\t\t\tUNION ALL SELECT 70 UNION ALL SELECT 80 UNION ALL SELECT 90\n\t\t) T CROSS JOIN ( SELECT 0 U\n\t\t\tUNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3\n\t\t\tUNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6\n\t\t\tUNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9\n\t\t) U\n\tWHERE\n\t\t($__timeTo()-INTERVAL (H+T+U) DAY) >= ($__timeTo()-INTERVAL 6 MONTH)\n),\n\ncalendar_weeks as(\n select \n \tdistinct date(DATE_ADD(date(d), INTERVAL -WEEKDAY(date(d)) DAY)) as start_of_week\n FROM calendar_date\n ORDER BY 1 asc\n)\n\n\nselect \n concat(date_format(cw.start_of_week,'%m/%d'), ' - ', date_format(DATE_ADD(cw.start_of_week, INTERVAL +7 DAY),'%m/%d')) as week,\n case when bug_count is not null then bug_count else 0 end as 'Weekly New Bugs'\nfrom calendar_weeks cw left join bugs b on cw.start_of_week = b.time\norder by cw.start_of_week asc\n", + "rawSql": "select \n i.issue_key as 'Issue Number',\n i.title as 'Title',\n priority as 'Priority',\n severity as 'Severity',\n (TIMESTAMPDIFF(MINUTE, i.created_date,NOW()))/1440 as 'Queue Time in Days',\n i.url as 'Url'\nfrom \n issues i\n\tjoin board_issues bi on i.id = bi.issue_id\n\tjoin boards b on bi.board_id = b.id\nwhere\n i.type in (${issue_type})\n and i.status != 'DONE'\n and b.id in (${board_id})\n and priority in (${priority})\norder by 'Queue Time' desc", "refId": "A", "select": [ [ @@ -1842,8 +1808,8 @@ ] } ], - "title": "Weekly New Bugs [Selected Time Range]", - "type": "barchart" + "title": "Outstanding Bugs Sort by Queue Time [All History]", + "type": "table" }, { "datasource": "mysql", @@ -1856,10 +1822,10 @@ "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", - "axisLabel": "", + "axisLabel": "Queue Time in Days", "axisPlacement": "auto", "axisSoftMin": 0, - "fillOpacity": 46, + "fillOpacity": 80, "gradientMode": "none", "hideFrom": { "legend": false, @@ -1884,7 +1850,7 @@ }, { "color": "red", - "value": 80 + "value": 21 } ] } @@ -1892,44 +1858,46 @@ "overrides": [] }, "gridPos": { - "h": 10, - "w": 24, + "h": 9, + "w": 12, "x": 0, - "y": 54 + "y": 67 }, - "id": 20, + "id": 18, "links": [ { "targetBlank": true, - "title": "Bug Count per 1k Lines of Code", - "url": "https://devlake.apache.org/docs/Metrics/BugCountPer1kLinesOfCode" + "title": "Bug Age", + "url": "https://devlake.apache.org/docs/Metrics/BugAge" } ], "options": { "barRadius": 0, - "barWidth": 0.71, + "barWidth": 0.3, "fullHighlight": false, "groupWidth": 0.7, "legend": { - "calcs": [], + "calcs": [ + "mean", + "max" + ], "displayMode": "list", "placement": "bottom", "showLegend": true }, "orientation": "auto", - "showValue": "auto", + "showValue": "always", "stacking": "none", - "text": { - "valueSize": 12 - }, + "text": {}, "tooltip": { "maxHeight": 600, - "mode": "single", + "mode": "multi", "sort": "none" }, "xTickLabelRotation": 45, - "xTickLabelSpacing": 0 + "xTickLabelSpacing": 100 }, + "pluginVersion": "8.0.6", "targets": [ { "datasource": "mysql", @@ -1939,7 +1907,7 @@ "metricColumn": "none", "queryType": "randomWalk", "rawQuery": true, - "rawSql": "with bugs as (\n select \n DATE_ADD(date(i.resolution_date), INTERVAL -WEEKDAY(date(i.resolution_date)) DAY) as time,\n count(distinct i.id) as bug_count\n from\n issues as i\n\t join board_issues bi on i.id = bi.issue_id\n\t join boards b on bi.board_id = b.id\n where \n i.type in (${issue_type})\n and status = 'DONE'\n and $__timeFilter(i.resolution_date)\n and b.id in (${board_id})\n group by time\n order by time desc\n),\n\ncalendar_date as(\n\tSELECT CAST(($__timeTo()-INTERVAL (H+T+U) DAY) AS date) d\n\tFROM ( SELECT 0 H\n\t\t\tUNION ALL SELECT 100 UNION ALL SELECT 200 UNION ALL SELECT 300\n\t\t) H CROSS JOIN ( SELECT 0 T\n\t\t\tUNION ALL SELECT 10 UNION ALL SELECT 20 UNION ALL SELECT 30\n\t\t\tUNION ALL SELECT 40 UNION ALL SELECT 50 UNION ALL SELECT 60\n\t\t\tUNION ALL SELECT 70 UNION ALL SELECT 80 UNION ALL SELECT 90\n\t\t) T CROSS JOIN ( SELECT 0 U\n\t\t\tUNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3\n\t\t\tUNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6\n\t\t\tUNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9\n\t\t) U\n\tWHERE\n\t\t($__timeTo()-INTERVAL (H+T+U) DAY) >= ($__timeTo()-INTERVAL 6 MONTH)\n),\n\ncalendar_weeks as(\n select \n \tdistinct date(DATE_ADD(date(d), INTERVAL -WEEKDAY(date(d)) DAY)) as start_of_week\n FROM calendar_date\n ORDER BY 1 asc\n)\n\nselect \n concat(date_format(cw.start_of_week,'%m/%d'), ' - ', date_format(DATE_ADD(cw.start_of_week, INTERVAL +7 DAY),'%m/%d')) as week,\n case when bug_count is not null then bug_count else 0 end as 'Weekly Closed Bugs'\nfrom calendar_weeks cw left join bugs b on cw.start_of_week = b.time\norder by cw.start_of_week asc", + "rawSql": "select \n concat('#', i.issue_key) as issue_key,\n (TIMESTAMPDIFF(MINUTE, i.created_date,NOW()))/1440 as 'Queue Time in Days'\nfrom \n issues i\n\tjoin board_issues bi on i.id = bi.issue_id\n\tjoin boards b on bi.board_id = b.id\nwhere\n i.type in (${issue_type})\n and i.status != 'DONE'\n and b.id in (${board_id})\norder by 2 desc\nlimit 100", "refId": "A", "select": [ [ @@ -1980,7 +1948,7 @@ ] } ], - "title": "Weekly Closed Bugs [Selected Time Range]", + "title": "Top 100 Bug Queue Time in Days [Outstanding Bugs]", "type": "barchart" }, { @@ -1988,29 +1956,14 @@ "fieldConfig": { "defaults": { "color": { - "mode": "palette-classic" + "mode": "thresholds" }, "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "fillOpacity": 46, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineWidth": 1, - "scaleDistribution": { - "type": "linear" + "align": "auto", + "cellOptions": { + "type": "auto" }, - "thresholdsStyle": { - "mode": "off" - } + "inspect": false }, "mappings": [], "thresholds": { @@ -2022,54 +1975,126 @@ }, { "color": "red", - "value": 80 + "value": 7 } ] } }, - "overrides": [] + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Issue Number" + }, + "properties": [ + { + "id": "custom.width", + "value": 121 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Title" + }, + "properties": [ + { + "id": "custom.width", + "value": 641 + }, + { + "id": "links", + "value": [ + { + "targetBlank": true, + "title": "", + "url": "${__data.fields.Url}" + } + ] + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Queue Time in Days" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "type": "color-text" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Url" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Priority" + }, + "properties": [ + { + "id": "custom.width", + "value": 103 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Severity" + }, + "properties": [ + { + "id": "custom.width", + "value": 112 + } + ] + } + ] }, "gridPos": { - "h": 10, - "w": 24, - "x": 0, - "y": 64 + "h": 9, + "w": 12, + "x": 12, + "y": 67 }, - "id": 21, + "id": 31, "links": [ { "targetBlank": true, - "title": "Bug Count per 1k Lines of Code", - "url": "https://devlake.apache.org/docs/Metrics/BugCountPer1kLinesOfCode" + "title": "Bug Age", + "url": "https://devlake.apache.org/docs/Metrics/BugAge" } ], "options": { - "barRadius": 0, - "barWidth": 0.71, - "fullHighlight": false, - "groupWidth": 0.7, - "legend": { - "calcs": [ - "mean" + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "orientation": "auto", - "showValue": "auto", - "stacking": "none", - "text": { - "valueSize": 12 - }, - "tooltip": { - "maxHeight": 600, - "mode": "single", - "sort": "none" + "show": false }, - "xTickLabelRotation": 45, - "xTickLabelSpacing": 0 + "showHeader": true, + "sortBy": [] }, + "pluginVersion": "11.0.0", "targets": [ { "datasource": "mysql", @@ -2079,7 +2104,7 @@ "metricColumn": "none", "queryType": "randomWalk", "rawQuery": true, - "rawSql": "with calendar_date as(\n\tSELECT CAST(($__timeTo()-INTERVAL (H+T+U) DAY) AS date) d\n\tFROM ( SELECT 0 H\n\t\t\tUNION ALL SELECT 100 UNION ALL SELECT 200 UNION ALL SELECT 300\n\t\t) H CROSS JOIN ( SELECT 0 T\n\t\t\tUNION ALL SELECT 10 UNION ALL SELECT 20 UNION ALL SELECT 30\n\t\t\tUNION ALL SELECT 40 UNION ALL SELECT 50 UNION ALL SELECT 60\n\t\t\tUNION ALL SELECT 70 UNION ALL SELECT 80 UNION ALL SELECT 90\n\t\t) T CROSS JOIN ( SELECT 0 U\n\t\t\tUNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3\n\t\t\tUNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6\n\t\t\tUNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9\n\t\t) U\n\tWHERE\n\t\t($__timeTo()-INTERVAL (H+T+U) DAY) >= ($__timeTo()-INTERVAL 6 MONTH)\n),\n\ncalendar_weeks as(\n select \n \tdistinct date(DATE_ADD(date(d), INTERVAL -WEEKDAY(date(d)) DAY)) as start_of_week\n FROM calendar_date\n ORDER BY 1 asc\n),\n\ncreated_bugs as ( \n select \n DATE_ADD(date(i.created_date), INTERVAL -WEEKDAY(date(i.created_date)) DAY) as time,\n count(distinct i.id) as bug_count\n from\n issues as i\n\t join board_issues bi on i.id = bi.issue_id\n\t join boards b on bi.board_id = b.id\n where \n i.type in (${issue_type})\n and $__timeFilter(i.created_date)\n and b.id in (${board_id})\n group by time\n order by time desc\n),\n\nresolved_bugs as (\n select \n DATE_ADD(date(i.resolution_date), INTERVAL -WEEKDAY(date(i.resolution_date)) DAY) as time,\n count(distinct i.id) as bug_count\n from\n issues as i\n\t join board_issues bi on i.id = bi.issue_id\n\t join boards b on bi.board_id = b.id\n where \n i.type in (${issue_type})\n and status = 'DONE'\n and $__timeFilter(i.resolution_date)\n and b.id in (${board_id})\n group by time\n order by time desc\n),\n\nweekly_new_bug as(\n select\n cw.start_of_week as week,\n case when bug_count is not null then bug_count else 0 end as weekly_new_bug\n from calendar_weeks cw left join created_bugs cb on cw.start_of_week = cb.time\n),\n\nweekly_closed_bug as(\n select\n cw.start_of_week as week,\n case when bug_count is not null then bug_count else 0 end as weekly_closed_bug\n from calendar_weeks cw left join resolved_bugs cb on cw.start_of_week = cb.time\n),\n\nweekly_updates as(\n SELECT t1.week, weekly_new_bug, weekly_closed_bug FROM weekly_new_bug t1\n LEFT JOIN weekly_closed_bug t2 ON t1.week = t2.week\n UNION\n SELECT t1.week, weekly_new_bug, weekly_closed_bug FROM weekly_new_bug t1\n RIGHT JOIN weekly_closed_bug t2 ON t1.week = t2.week\n),\n\n\noriginal_open_bugs as (\n SELECT \n count(distinct i.id) as original_open_bug_count\n FROM\n issues as i\n\t join board_issues bi on i.id = bi.issue_id\n\t join boards b on bi.board_id = b.id\n where \n i.type in (${issue_type})\n and i.created_date < $__timeFrom()\n and (i.status != 'DONE' or $__timeFilter(i.resolution_date))\n and b.id in (${board_id})\n),\n\nweekly_updated_without_null as(\n SELECT \n week, \n COALESCE(weekly_new_bug,0) as weekly_new_bug, \n COALESCE(weekly_closed_bug,0) as weekly_closed_bug,\n original_open_bug_count\n from weekly_updates, original_open_bugs\n where week is not null\n),\n\nweekly_delta as(\n SELECT \n *,\n (weekly_new_bug - weekly_closed_bug) as weekly_delta\n from weekly_updated_without_null\n order by week asc\n),\n\nfinal_data as(\n SELECT \n *,\n concat(date_format(week,'%m/%d'), ' - ', date_format(DATE_ADD(week, INTERVAL +7 DAY),'%m/%d')) as _week,\n sum(weekly_delta) over(order by week asc) as weekly_accumulated\n from weekly_delta\n)\n\nSELECT \n _week,\n (original_open_bug_count + weekly_accumulated) as \"Total No. of Outstanding Bugs By the End of Week\" from final_data", + "rawSql": "select \n i.issue_key as 'Issue Number',\n i.title as 'Title',\n priority as 'Priority',\n severity as 'Severity',\n (TIMESTAMPDIFF(MINUTE, i.created_date,NOW()))/1440 as 'Queue Time in Days',\n i.url as 'Url'\nfrom \n issues i\n\tjoin board_issues bi on i.id = bi.issue_id\n\tjoin boards b on bi.board_id = b.id\nwhere\n i.type in (${issue_type})\n and i.status != 'DONE'\n and i.assignee_name = ''\n and b.id in (${board_id})\norder by 'Queue Time' desc", "refId": "A", "select": [ [ @@ -2120,8 +2145,8 @@ ] } ], - "title": "Total Outstanding Bug Count by Week [Selected Time Range]", - "type": "barchart" + "title": "Bugs to be Triaged Sort by Queue Time [All History]", + "type": "table" }, { "datasource": { @@ -2132,7 +2157,7 @@ "h": 2, "w": 24, "x": 0, - "y": 74 + "y": 76 }, "id": 30, "options": { @@ -2168,7 +2193,7 @@ "list": [ { "current": { - "selected": false, + "selected": true, "text": "All", "value": "$__all" }, @@ -2210,7 +2235,7 @@ }, { "current": { - "selected": false, + "selected": true, "text": [ "All" ], @@ -2239,7 +2264,6 @@ "from": "now-6M", "to": "now" }, - "timeRangeUpdatedDuringEditOrView": false, "timepicker": {}, "timezone": "utc", "title": "Weekly Bug Retro",