| { |
| "annotations": { |
| "list": [ |
| { |
| "builtIn": 1, |
| "datasource": "-- Grafana --", |
| "enable": true, |
| "hide": true, |
| "iconColor": "rgba(0, 211, 255, 1)", |
| "name": "Annotations & Alerts", |
| "type": "dashboard" |
| } |
| ] |
| }, |
| "editable": true, |
| "gnetId": null, |
| "graphTooltip": 0, |
| "id": 7, |
| "iteration": 1682062968493, |
| "links": [], |
| "panels": [ |
| { |
| "datasource": null, |
| "gridPos": { |
| "h": 3, |
| "w": 24, |
| "x": 0, |
| "y": 0 |
| }, |
| "id": 142, |
| "options": { |
| "content": "- Use Cases: This dashboard shows the engineering throughput and and cycle time, which helps to identify productivity and bottlenecks of the development process.\n- Data Source Required: GitHub and Jira([transformation](https://devlake.apache.org/docs/UserManuals/ConfigUI/Jira#step-3---adding-transformation-rules-optional) required to tell DevLake what the story_points field is). You also need to do [team configuration](https://devlake.apache.org/docs/Configuration/TeamConfiguration) to use this dashboard.", |
| "mode": "markdown" |
| }, |
| "pluginVersion": "8.0.6", |
| "targets": [ |
| { |
| "queryType": "randomWalk", |
| "refId": "A" |
| } |
| ], |
| "title": "Dashboard Introduction", |
| "type": "text" |
| }, |
| { |
| "collapsed": false, |
| "datasource": null, |
| "gridPos": { |
| "h": 1, |
| "w": 24, |
| "x": 0, |
| "y": 3 |
| }, |
| "id": 89, |
| "panels": [], |
| "title": "1. Total and Avg PRs Opened/Merged", |
| "type": "row" |
| }, |
| { |
| "datasource": "mysql", |
| "description": "", |
| "fieldConfig": { |
| "defaults": { |
| "color": { |
| "fixedColor": "blue", |
| "mode": "fixed" |
| }, |
| "custom": { |
| "axisLabel": "Pull Request Count", |
| "axisPlacement": "auto", |
| "barAlignment": 1, |
| "drawStyle": "line", |
| "fillOpacity": 0, |
| "gradientMode": "none", |
| "hideFrom": { |
| "legend": false, |
| "tooltip": false, |
| "viz": false |
| }, |
| "lineInterpolation": "linear", |
| "lineStyle": { |
| "fill": "solid" |
| }, |
| "lineWidth": 1, |
| "pointSize": 12, |
| "scaleDistribution": { |
| "type": "linear" |
| }, |
| "showPoints": "auto", |
| "spanNulls": false, |
| "stacking": { |
| "group": "A", |
| "mode": "none" |
| }, |
| "thresholdsStyle": { |
| "mode": "off" |
| } |
| }, |
| "mappings": [], |
| "thresholds": { |
| "mode": "absolute", |
| "steps": [ |
| { |
| "color": "green", |
| "value": null |
| } |
| ] |
| } |
| }, |
| "overrides": [ |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team1: Total PR Opened" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "orange", |
| "mode": "fixed" |
| } |
| } |
| ] |
| }, |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team2: Total PR Opened" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "green", |
| "mode": "fixed" |
| } |
| } |
| ] |
| } |
| ] |
| }, |
| "gridPos": { |
| "h": 7, |
| "w": 12, |
| "x": 0, |
| "y": 4 |
| }, |
| "id": 111, |
| "options": { |
| "legend": { |
| "calcs": [ |
| "mean" |
| ], |
| "displayMode": "list", |
| "placement": "bottom" |
| }, |
| "tooltip": { |
| "mode": "multi" |
| } |
| }, |
| "pluginVersion": "8.0.6", |
| "targets": [ |
| { |
| "format": "time_series", |
| "group": [], |
| "hide": false, |
| "metricColumn": "none", |
| "rawQuery": true, |
| "rawSql": "with _prs as(\n SELECT\n pr.id,\n pr.url,\n pr.created_date,\n pr.merged_date,\n pr.author_id,\n u.id as user_id,\n u.name as user_name,\n t.id as team_id,\n t.name as team\n FROM pull_requests pr\n join user_accounts ua on pr.author_id = ua.account_id\n join users u on ua.user_id = u.id\n join team_users tu on u.id = tu.user_id\n join teams t on tu.team_id = t.id\n join project_mapping pm on pr.base_repo_id = pm.row_id\n WHERE\n $__timeFilter(pr.created_date)\n and pm.project_name in ($project)\n)\n\nSELECT\n DATE_ADD(date(created_date), INTERVAL -$interval(date(created_date))+1 DAY) as time,\n count(distinct case when team_id in ($team1) then id else null end) as \"Team1: Total PR Opened\",\n count(distinct case when team_id in ($team2) then id else null end) as \"Team2: Total PR Opened\"\nFROM _prs\nGROUP BY 1", |
| "refId": "A", |
| "select": [ |
| [ |
| { |
| "params": [ |
| "id" |
| ], |
| "type": "column" |
| } |
| ] |
| ], |
| "table": "ae_projects", |
| "timeColumn": "ae_create_time", |
| "timeColumnType": "timestamp", |
| "where": [ |
| { |
| "name": "$__timeFilter", |
| "params": [], |
| "type": "macro" |
| } |
| ] |
| } |
| ], |
| "title": "Total PRs Opened", |
| "type": "timeseries" |
| }, |
| { |
| "datasource": "mysql", |
| "description": "", |
| "fieldConfig": { |
| "defaults": { |
| "color": { |
| "fixedColor": "blue", |
| "mode": "fixed" |
| }, |
| "custom": { |
| "axisLabel": "Pull Request Count", |
| "axisPlacement": "auto", |
| "barAlignment": 1, |
| "drawStyle": "line", |
| "fillOpacity": 0, |
| "gradientMode": "none", |
| "hideFrom": { |
| "legend": false, |
| "tooltip": false, |
| "viz": false |
| }, |
| "lineInterpolation": "linear", |
| "lineStyle": { |
| "fill": "solid" |
| }, |
| "lineWidth": 1, |
| "pointSize": 12, |
| "scaleDistribution": { |
| "type": "linear" |
| }, |
| "showPoints": "auto", |
| "spanNulls": false, |
| "stacking": { |
| "group": "A", |
| "mode": "none" |
| }, |
| "thresholdsStyle": { |
| "mode": "off" |
| } |
| }, |
| "mappings": [], |
| "thresholds": { |
| "mode": "absolute", |
| "steps": [ |
| { |
| "color": "green", |
| "value": null |
| } |
| ] |
| } |
| }, |
| "overrides": [ |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team1: PR Opened per Member" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "orange", |
| "mode": "fixed" |
| } |
| } |
| ] |
| }, |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team2: PR Opened per Member" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "green", |
| "mode": "fixed" |
| } |
| } |
| ] |
| } |
| ] |
| }, |
| "gridPos": { |
| "h": 7, |
| "w": 12, |
| "x": 12, |
| "y": 4 |
| }, |
| "id": 110, |
| "options": { |
| "legend": { |
| "calcs": [ |
| "sum" |
| ], |
| "displayMode": "list", |
| "placement": "bottom" |
| }, |
| "tooltip": { |
| "mode": "multi" |
| } |
| }, |
| "pluginVersion": "8.0.6", |
| "targets": [ |
| { |
| "format": "time_series", |
| "group": [], |
| "hide": false, |
| "metricColumn": "none", |
| "rawQuery": true, |
| "rawSql": "with _prs as(\n SELECT\n pr.id,\n pr.url,\n pr.created_date,\n pr.merged_date,\n pr.author_id,\n u.id as user_id,\n u.name as user_name,\n t.id as team_id,\n t.name as team\n FROM pull_requests pr\n join project_mapping pm on pr.base_repo_id = pm.row_id\n join user_accounts ua on pr.author_id = ua.account_id\n join users u on ua.user_id = u.id\n join team_users tu on u.id = tu.user_id\n join teams t on tu.team_id = t.id\n WHERE\n $__timeFilter(pr.created_date)\n and pm.project_name in ($project)\n)\n\nSELECT\n DATE_ADD(date(created_date), INTERVAL -$interval(date(created_date))+1 DAY) as time,\n count(distinct case when team_id in ($team1) then id else null end)/(select count(distinct user_id) from team_users where team_id in ($team1)) as \"Team1: PR Opened per Member\",\n count(distinct case when team_id in ($team2) then id else null end)/(select count(distinct user_id) from team_users where team_id in ($team2)) as \"Team2: PR Opened per Member\",\n count(distinct id)/(select count(*) from users) as \"Org: PR Opened per Member\"\nFROM _prs\nGROUP BY 1", |
| "refId": "A", |
| "select": [ |
| [ |
| { |
| "params": [ |
| "id" |
| ], |
| "type": "column" |
| } |
| ] |
| ], |
| "table": "ae_projects", |
| "timeColumn": "ae_create_time", |
| "timeColumnType": "timestamp", |
| "where": [ |
| { |
| "name": "$__timeFilter", |
| "params": [], |
| "type": "macro" |
| } |
| ] |
| } |
| ], |
| "title": "PRs Opened per Member", |
| "type": "timeseries" |
| }, |
| { |
| "datasource": "mysql", |
| "description": "", |
| "fieldConfig": { |
| "defaults": { |
| "color": { |
| "fixedColor": "blue", |
| "mode": "fixed" |
| }, |
| "custom": { |
| "axisLabel": "Pull Request Count", |
| "axisPlacement": "auto", |
| "barAlignment": 1, |
| "drawStyle": "line", |
| "fillOpacity": 0, |
| "gradientMode": "none", |
| "hideFrom": { |
| "legend": false, |
| "tooltip": false, |
| "viz": false |
| }, |
| "lineInterpolation": "linear", |
| "lineStyle": { |
| "fill": "solid" |
| }, |
| "lineWidth": 1, |
| "pointSize": 12, |
| "scaleDistribution": { |
| "type": "linear" |
| }, |
| "showPoints": "auto", |
| "spanNulls": false, |
| "stacking": { |
| "group": "A", |
| "mode": "none" |
| }, |
| "thresholdsStyle": { |
| "mode": "off" |
| } |
| }, |
| "mappings": [], |
| "thresholds": { |
| "mode": "absolute", |
| "steps": [ |
| { |
| "color": "green", |
| "value": null |
| } |
| ] |
| } |
| }, |
| "overrides": [ |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team1: Total PR Merged" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "orange", |
| "mode": "fixed" |
| } |
| } |
| ] |
| }, |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team2: Total PR Merged" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "green", |
| "mode": "fixed" |
| } |
| } |
| ] |
| } |
| ] |
| }, |
| "gridPos": { |
| "h": 7, |
| "w": 12, |
| "x": 0, |
| "y": 11 |
| }, |
| "id": 79, |
| "options": { |
| "legend": { |
| "calcs": [ |
| "mean" |
| ], |
| "displayMode": "list", |
| "placement": "bottom" |
| }, |
| "tooltip": { |
| "mode": "multi" |
| } |
| }, |
| "pluginVersion": "8.0.6", |
| "targets": [ |
| { |
| "format": "time_series", |
| "group": [], |
| "hide": false, |
| "metricColumn": "none", |
| "rawQuery": true, |
| "rawSql": "with _prs as(\n SELECT\n pr.id,\n pr.url,\n pr.created_date,\n pr.merged_date,\n pr.author_id,\n u.id as user_id,\n u.name as user_name,\n t.id as team_id,\n t.name as team\n FROM pull_requests pr\n join project_mapping pm on pr.base_repo_id = pm.row_id\n join user_accounts ua on pr.author_id = ua.account_id\n join users u on ua.user_id = u.id\n join team_users tu on u.id = tu.user_id\n join teams t on tu.team_id = t.id\n WHERE\n $__timeFilter(pr.created_date)\n and pm.project_name in ($project)\n)\n\nSELECT\n DATE_ADD(date(created_date), INTERVAL -$interval(date(created_date))+1 DAY) as time,\n count(distinct case \n when team_id in ($team1) and merged_date is not null then id \n when team_id in ($team1) and merged_date is null then null end) as \"Team1: Total PR Merged\",\n count(distinct case \n when team_id in ($team2) and merged_date is not null then id \n when team_id in ($team2) and merged_date is null then null end) as \"Team2: Total PR Merged\"\nFROM _prs\nGROUP BY 1", |
| "refId": "A", |
| "select": [ |
| [ |
| { |
| "params": [ |
| "id" |
| ], |
| "type": "column" |
| } |
| ] |
| ], |
| "table": "ae_projects", |
| "timeColumn": "ae_create_time", |
| "timeColumnType": "timestamp", |
| "where": [ |
| { |
| "name": "$__timeFilter", |
| "params": [], |
| "type": "macro" |
| } |
| ] |
| } |
| ], |
| "title": "Total PRs Merged", |
| "type": "timeseries" |
| }, |
| { |
| "datasource": "mysql", |
| "description": "", |
| "fieldConfig": { |
| "defaults": { |
| "color": { |
| "fixedColor": "blue", |
| "mode": "fixed" |
| }, |
| "custom": { |
| "axisLabel": "Pull Request Count", |
| "axisPlacement": "auto", |
| "barAlignment": 1, |
| "drawStyle": "line", |
| "fillOpacity": 0, |
| "gradientMode": "none", |
| "hideFrom": { |
| "legend": false, |
| "tooltip": false, |
| "viz": false |
| }, |
| "lineInterpolation": "linear", |
| "lineStyle": { |
| "fill": "solid" |
| }, |
| "lineWidth": 1, |
| "pointSize": 12, |
| "scaleDistribution": { |
| "type": "linear" |
| }, |
| "showPoints": "auto", |
| "spanNulls": false, |
| "stacking": { |
| "group": "A", |
| "mode": "none" |
| }, |
| "thresholdsStyle": { |
| "mode": "off" |
| } |
| }, |
| "mappings": [], |
| "thresholds": { |
| "mode": "absolute", |
| "steps": [ |
| { |
| "color": "green", |
| "value": null |
| } |
| ] |
| } |
| }, |
| "overrides": [ |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team1: PR Merged per Member" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "orange", |
| "mode": "fixed" |
| } |
| } |
| ] |
| }, |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team2: PR Merged per Member" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "green", |
| "mode": "fixed" |
| } |
| } |
| ] |
| } |
| ] |
| }, |
| "gridPos": { |
| "h": 7, |
| "w": 12, |
| "x": 12, |
| "y": 11 |
| }, |
| "id": 112, |
| "options": { |
| "legend": { |
| "calcs": [ |
| "sum" |
| ], |
| "displayMode": "list", |
| "placement": "bottom" |
| }, |
| "tooltip": { |
| "mode": "multi" |
| } |
| }, |
| "pluginVersion": "8.0.6", |
| "targets": [ |
| { |
| "format": "time_series", |
| "group": [], |
| "hide": false, |
| "metricColumn": "none", |
| "rawQuery": true, |
| "rawSql": "with _prs as(\n SELECT\n pr.id,\n pr.url,\n pr.created_date,\n pr.merged_date,\n pr.author_id,\n u.id as user_id,\n u.name as user_name,\n t.id as team_id,\n t.name as team\n FROM pull_requests pr\n join project_mapping pm on pr.base_repo_id = pm.row_id\n join user_accounts ua on pr.author_id = ua.account_id\n join users u on ua.user_id = u.id\n join team_users tu on u.id = tu.user_id\n join teams t on tu.team_id = t.id\n WHERE\n $__timeFilter(pr.created_date)\n and pm.project_name in ($project)\n)\n\nSELECT\n DATE_ADD(date(created_date), INTERVAL -$interval(date(created_date))+1 DAY) as time,\n count(distinct case \n when team_id in ($team1) and merged_date is not null then id \n when team_id in ($team1) and merged_date is null then null end)/(select count(distinct user_id) from team_users where team_id in ($team1)) as \"Team1: PR Merged per Member\",\n count(distinct case \n when team_id in ($team2) and merged_date is not null then id\n when team_id in ($team2) and merged_date is null then null end)/(select count(distinct user_id) from team_users where team_id in ($team2)) as \"Team2: PR Merged per Member\",\n count(distinct case when merged_date is not null then id end)/(select count(*) from users) as \"Org: PR Merged per Member\"\nFROM _prs\nGROUP BY 1", |
| "refId": "A", |
| "select": [ |
| [ |
| { |
| "params": [ |
| "id" |
| ], |
| "type": "column" |
| } |
| ] |
| ], |
| "table": "ae_projects", |
| "timeColumn": "ae_create_time", |
| "timeColumnType": "timestamp", |
| "where": [ |
| { |
| "name": "$__timeFilter", |
| "params": [], |
| "type": "macro" |
| } |
| ] |
| } |
| ], |
| "title": "PRs Merged per Member", |
| "type": "timeseries" |
| }, |
| { |
| "collapsed": false, |
| "datasource": null, |
| "gridPos": { |
| "h": 1, |
| "w": 24, |
| "x": 0, |
| "y": 18 |
| }, |
| "id": 114, |
| "panels": [], |
| "title": "2. Issue Completed", |
| "type": "row" |
| }, |
| { |
| "datasource": "mysql", |
| "description": "", |
| "fieldConfig": { |
| "defaults": { |
| "color": { |
| "mode": "palette-classic" |
| }, |
| "custom": { |
| "axisLabel": "Issue Count", |
| "axisPlacement": "auto", |
| "barAlignment": 0, |
| "drawStyle": "line", |
| "fillOpacity": 0, |
| "gradientMode": "none", |
| "hideFrom": { |
| "legend": false, |
| "tooltip": false, |
| "viz": false |
| }, |
| "lineInterpolation": "linear", |
| "lineWidth": 1, |
| "pointSize": 12, |
| "scaleDistribution": { |
| "type": "linear" |
| }, |
| "showPoints": "auto", |
| "spanNulls": false, |
| "stacking": { |
| "group": "A", |
| "mode": "none" |
| }, |
| "thresholdsStyle": { |
| "mode": "off" |
| } |
| }, |
| "mappings": [], |
| "thresholds": { |
| "mode": "absolute", |
| "steps": [ |
| { |
| "color": "green", |
| "value": null |
| }, |
| { |
| "color": "red", |
| "value": 80 |
| } |
| ] |
| } |
| }, |
| "overrides": [ |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team1: Issues Completed" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "orange", |
| "mode": "fixed" |
| } |
| } |
| ] |
| }, |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team2: Issues Completed" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "green", |
| "mode": "fixed" |
| } |
| } |
| ] |
| } |
| ] |
| }, |
| "gridPos": { |
| "h": 7, |
| "w": 12, |
| "x": 0, |
| "y": 19 |
| }, |
| "id": 74, |
| "options": { |
| "legend": { |
| "calcs": [ |
| "mean" |
| ], |
| "displayMode": "list", |
| "placement": "bottom" |
| }, |
| "tooltip": { |
| "mode": "multi" |
| } |
| }, |
| "pluginVersion": "8.0.6", |
| "targets": [ |
| { |
| "format": "time_series", |
| "group": [], |
| "hide": false, |
| "metricColumn": "none", |
| "rawQuery": true, |
| "rawSql": "with _issues as(\n SELECT\n i.id,\n i.url,\n i.created_date,\n i.status,\n i.assignee_id,\n i.story_point,\n i.priority,\n u.id as user_id,\n u.name as user_name,\n t.id as team_id,\n t.name as team\n FROM issues 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\t join project_mapping pm on b.id = pm.row_id\n \tjoin user_accounts ua on i.assignee_id = ua.account_id\n join users u on ua.user_id = u.id\n join team_users tu on u.id = tu.user_id\n join teams t on tu.team_id = t.id\n WHERE\n $__timeFilter(i.created_date)\n and pm.project_name in ($project)\n)\n\nSELECT\n DATE_ADD(date(created_date), INTERVAL -$interval(date(created_date))+1 DAY) as time,\n -- count(i.id) as 'Issues Opened',\n count(case when status = 'DONE' and team_id in ($team1) then id else null end) as 'Team1: Issues Completed',\n count(case when status = 'DONE' and team_id in ($team2) then id else null end) as 'Team2: Issues Completed'\nFROM _issues\nGROUP BY 1", |
| "refId": "A", |
| "select": [ |
| [ |
| { |
| "params": [ |
| "id" |
| ], |
| "type": "column" |
| } |
| ] |
| ], |
| "table": "ae_projects", |
| "timeColumn": "ae_create_time", |
| "timeColumnType": "timestamp", |
| "where": [ |
| { |
| "name": "$__timeFilter", |
| "params": [], |
| "type": "macro" |
| } |
| ] |
| } |
| ], |
| "title": "Total Issue Completed", |
| "type": "timeseries" |
| }, |
| { |
| "datasource": "mysql", |
| "description": "", |
| "fieldConfig": { |
| "defaults": { |
| "color": { |
| "mode": "palette-classic" |
| }, |
| "custom": { |
| "axisLabel": "Issue Count", |
| "axisPlacement": "auto", |
| "barAlignment": 0, |
| "drawStyle": "line", |
| "fillOpacity": 0, |
| "gradientMode": "none", |
| "hideFrom": { |
| "legend": false, |
| "tooltip": false, |
| "viz": false |
| }, |
| "lineInterpolation": "linear", |
| "lineWidth": 1, |
| "pointSize": 12, |
| "scaleDistribution": { |
| "type": "linear" |
| }, |
| "showPoints": "auto", |
| "spanNulls": false, |
| "stacking": { |
| "group": "A", |
| "mode": "none" |
| }, |
| "thresholdsStyle": { |
| "mode": "off" |
| } |
| }, |
| "mappings": [], |
| "thresholds": { |
| "mode": "absolute", |
| "steps": [ |
| { |
| "color": "green", |
| "value": null |
| }, |
| { |
| "color": "red", |
| "value": 80 |
| } |
| ] |
| } |
| }, |
| "overrides": [ |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team1: Issues Completed" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "orange", |
| "mode": "fixed" |
| } |
| } |
| ] |
| }, |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team2: Issues Completed" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "green", |
| "mode": "fixed" |
| } |
| } |
| ] |
| } |
| ] |
| }, |
| "gridPos": { |
| "h": 7, |
| "w": 12, |
| "x": 12, |
| "y": 19 |
| }, |
| "id": 115, |
| "options": { |
| "legend": { |
| "calcs": [ |
| "mean" |
| ], |
| "displayMode": "list", |
| "placement": "bottom" |
| }, |
| "tooltip": { |
| "mode": "multi" |
| } |
| }, |
| "pluginVersion": "8.0.6", |
| "targets": [ |
| { |
| "format": "time_series", |
| "group": [], |
| "hide": false, |
| "metricColumn": "none", |
| "rawQuery": true, |
| "rawSql": "with _issues as(\n SELECT\n i.id,\n i.url,\n i.created_date,\n i.status,\n i.assignee_id,\n i.story_point,\n i.priority,\n u.id as user_id,\n u.name as user_name,\n t.id as team_id,\n t.name as team\n FROM issues 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\t join project_mapping pm on b.id = pm.row_id\n \tjoin user_accounts ua on i.assignee_id = ua.account_id\n join users u on ua.user_id = u.id\n join team_users tu on u.id = tu.user_id\n join teams t on tu.team_id = t.id\n WHERE\n $__timeFilter(i.created_date)\n and pm.project_name in ($project)\n)\n\nSELECT\n DATE_ADD(date(created_date), INTERVAL -$interval(date(created_date))+1 DAY) as time,\n count(case when status = 'DONE' and team_id in ($team1) then id else null end)/(select count(distinct user_id) from team_users where team_id in ($team1)) as 'Team1: Issues Completed per Member',\n count(case when status = 'DONE' and team_id in ($team2) then id else null end)/(select count(distinct user_id) from team_users where team_id in ($team2)) as 'Team2: Issues Completed per Member',\n count(distinct id)/(select count(*) from users) as \"Org: Issues Completed per Member\"\nFROM _issues\nGROUP BY 1", |
| "refId": "A", |
| "select": [ |
| [ |
| { |
| "params": [ |
| "id" |
| ], |
| "type": "column" |
| } |
| ] |
| ], |
| "table": "ae_projects", |
| "timeColumn": "ae_create_time", |
| "timeColumnType": "timestamp", |
| "where": [ |
| { |
| "name": "$__timeFilter", |
| "params": [], |
| "type": "macro" |
| } |
| ] |
| } |
| ], |
| "title": "Issue Completed per Member", |
| "type": "timeseries" |
| }, |
| { |
| "collapsed": false, |
| "datasource": null, |
| "gridPos": { |
| "h": 1, |
| "w": 24, |
| "x": 0, |
| "y": 26 |
| }, |
| "id": 126, |
| "panels": [], |
| "title": "3. Story Points Completed", |
| "type": "row" |
| }, |
| { |
| "datasource": "mysql", |
| "description": "", |
| "fieldConfig": { |
| "defaults": { |
| "color": { |
| "mode": "palette-classic" |
| }, |
| "custom": { |
| "axisLabel": "Issue Count", |
| "axisPlacement": "auto", |
| "barAlignment": 0, |
| "drawStyle": "line", |
| "fillOpacity": 0, |
| "gradientMode": "none", |
| "hideFrom": { |
| "legend": false, |
| "tooltip": false, |
| "viz": false |
| }, |
| "lineInterpolation": "linear", |
| "lineWidth": 1, |
| "pointSize": 12, |
| "scaleDistribution": { |
| "type": "linear" |
| }, |
| "showPoints": "auto", |
| "spanNulls": false, |
| "stacking": { |
| "group": "A", |
| "mode": "none" |
| }, |
| "thresholdsStyle": { |
| "mode": "off" |
| } |
| }, |
| "mappings": [], |
| "thresholds": { |
| "mode": "absolute", |
| "steps": [ |
| { |
| "color": "green", |
| "value": null |
| }, |
| { |
| "color": "red", |
| "value": 80 |
| } |
| ] |
| } |
| }, |
| "overrides": [ |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team1: Story Points Completed" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "orange", |
| "mode": "fixed" |
| } |
| } |
| ] |
| }, |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team2: Story Points Completed" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "green", |
| "mode": "fixed" |
| } |
| } |
| ] |
| } |
| ] |
| }, |
| "gridPos": { |
| "h": 7, |
| "w": 12, |
| "x": 0, |
| "y": 27 |
| }, |
| "id": 116, |
| "options": { |
| "legend": { |
| "calcs": [ |
| "mean" |
| ], |
| "displayMode": "list", |
| "placement": "bottom" |
| }, |
| "tooltip": { |
| "mode": "multi" |
| } |
| }, |
| "pluginVersion": "8.0.6", |
| "targets": [ |
| { |
| "format": "time_series", |
| "group": [], |
| "hide": false, |
| "metricColumn": "none", |
| "rawQuery": true, |
| "rawSql": "with _issues as(\n SELECT\n i.id,\n i.url,\n i.created_date,\n i.status,\n i.assignee_id,\n i.story_point,\n i.priority,\n u.id as user_id,\n u.name as user_name,\n t.id as team_id,\n t.name as team\n FROM issues 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\t join project_mapping pm on b.id = pm.row_id\n \tjoin user_accounts ua on i.assignee_id = ua.account_id\n join users u on ua.user_id = u.id\n join team_users tu on u.id = tu.user_id\n join teams t on tu.team_id = t.id\n WHERE\n $__timeFilter(i.created_date)\n and pm.project_name in ($project)\n)\n\nSELECT\n DATE_ADD(date(created_date), INTERVAL -$interval(date(created_date))+1 DAY) as time,\n -- count(i.id) as 'Issues Opened',\n sum(case when status = 'DONE' and team_id in ($team1) then story_point else 0 end) as 'Team1: Story Points Completed',\n sum(case when status = 'DONE' and team_id in ($team2) then story_point else 0 end) as 'Team2: Story Points Completed'\nFROM _issues\nGROUP BY 1", |
| "refId": "A", |
| "select": [ |
| [ |
| { |
| "params": [ |
| "id" |
| ], |
| "type": "column" |
| } |
| ] |
| ], |
| "table": "ae_projects", |
| "timeColumn": "ae_create_time", |
| "timeColumnType": "timestamp", |
| "where": [ |
| { |
| "name": "$__timeFilter", |
| "params": [], |
| "type": "macro" |
| } |
| ] |
| } |
| ], |
| "title": "Total Story Points Completed", |
| "type": "timeseries" |
| }, |
| { |
| "datasource": "mysql", |
| "description": "", |
| "fieldConfig": { |
| "defaults": { |
| "color": { |
| "mode": "palette-classic" |
| }, |
| "custom": { |
| "axisLabel": "Issue Count", |
| "axisPlacement": "auto", |
| "barAlignment": 0, |
| "drawStyle": "line", |
| "fillOpacity": 0, |
| "gradientMode": "none", |
| "hideFrom": { |
| "legend": false, |
| "tooltip": false, |
| "viz": false |
| }, |
| "lineInterpolation": "linear", |
| "lineWidth": 1, |
| "pointSize": 12, |
| "scaleDistribution": { |
| "type": "linear" |
| }, |
| "showPoints": "auto", |
| "spanNulls": false, |
| "stacking": { |
| "group": "A", |
| "mode": "none" |
| }, |
| "thresholdsStyle": { |
| "mode": "off" |
| } |
| }, |
| "mappings": [], |
| "thresholds": { |
| "mode": "absolute", |
| "steps": [ |
| { |
| "color": "green", |
| "value": null |
| }, |
| { |
| "color": "red", |
| "value": 80 |
| } |
| ] |
| } |
| }, |
| "overrides": [ |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team1: Story Points Completed per Member" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "orange", |
| "mode": "fixed" |
| } |
| } |
| ] |
| }, |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team2: Story Points Completed per Member" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "green", |
| "mode": "fixed" |
| } |
| } |
| ] |
| } |
| ] |
| }, |
| "gridPos": { |
| "h": 7, |
| "w": 12, |
| "x": 12, |
| "y": 27 |
| }, |
| "id": 117, |
| "options": { |
| "legend": { |
| "calcs": [ |
| "mean" |
| ], |
| "displayMode": "list", |
| "placement": "bottom" |
| }, |
| "tooltip": { |
| "mode": "multi" |
| } |
| }, |
| "pluginVersion": "8.0.6", |
| "targets": [ |
| { |
| "format": "time_series", |
| "group": [], |
| "hide": false, |
| "metricColumn": "none", |
| "rawQuery": true, |
| "rawSql": "with _issues as(\n SELECT\n i.id,\n i.url,\n i.created_date,\n i.status,\n i.assignee_id,\n i.story_point,\n i.priority,\n u.id as user_id,\n u.name as user_name,\n t.id as team_id,\n t.name as team\n FROM issues 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\t join project_mapping pm on b.id = pm.row_id\n \tjoin user_accounts ua on i.assignee_id = ua.account_id\n join users u on ua.user_id = u.id\n join team_users tu on u.id = tu.user_id\n join teams t on tu.team_id = t.id\n WHERE\n $__timeFilter(i.created_date)\n and pm.project_name in ($project)\n)\n\nSELECT\n DATE_ADD(date(created_date), INTERVAL -$interval(date(created_date))+1 DAY) as time,\n sum(case when status = 'DONE' and team_id in ($team1) then story_point else 0 end)/(select count(distinct user_id) from team_users where team_id in ($team1)) as 'Team1: Story Points Completed per Member',\n sum(case when status = 'DONE' and team_id in ($team2) then story_point else 0 end)/(select count(distinct user_id) from team_users where team_id in ($team2)) as 'Team2: Story Points Completed per Member',\n count(distinct id)/(select count(*) FROM users) as \"Org: Story Points Completed per Member\"\nFROM _issues\nGROUP BY 1", |
| "refId": "A", |
| "select": [ |
| [ |
| { |
| "params": [ |
| "id" |
| ], |
| "type": "column" |
| } |
| ] |
| ], |
| "table": "ae_projects", |
| "timeColumn": "ae_create_time", |
| "timeColumnType": "timestamp", |
| "where": [ |
| { |
| "name": "$__timeFilter", |
| "params": [], |
| "type": "macro" |
| } |
| ] |
| } |
| ], |
| "title": "Story Points Completed per Member", |
| "type": "timeseries" |
| }, |
| { |
| "collapsed": false, |
| "datasource": null, |
| "gridPos": { |
| "h": 1, |
| "w": 24, |
| "x": 0, |
| "y": 34 |
| }, |
| "id": 124, |
| "panels": [], |
| "title": "4. PR Review Depth and PR Size", |
| "type": "row" |
| }, |
| { |
| "datasource": "mysql", |
| "description": "", |
| "fieldConfig": { |
| "defaults": { |
| "color": { |
| "fixedColor": "blue", |
| "mode": "fixed" |
| }, |
| "custom": { |
| "axisLabel": "Pull Request Count", |
| "axisPlacement": "auto", |
| "barAlignment": 1, |
| "drawStyle": "line", |
| "fillOpacity": 0, |
| "gradientMode": "none", |
| "hideFrom": { |
| "legend": false, |
| "tooltip": false, |
| "viz": false |
| }, |
| "lineInterpolation": "linear", |
| "lineStyle": { |
| "fill": "solid" |
| }, |
| "lineWidth": 1, |
| "pointSize": 12, |
| "scaleDistribution": { |
| "type": "linear" |
| }, |
| "showPoints": "auto", |
| "spanNulls": false, |
| "stacking": { |
| "group": "A", |
| "mode": "none" |
| }, |
| "thresholdsStyle": { |
| "mode": "off" |
| } |
| }, |
| "mappings": [], |
| "thresholds": { |
| "mode": "absolute", |
| "steps": [ |
| { |
| "color": "green", |
| "value": null |
| } |
| ] |
| } |
| }, |
| "overrides": [ |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team1: PR Review Depth" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "orange", |
| "mode": "fixed" |
| } |
| } |
| ] |
| }, |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team2: PR Review Depth" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "green", |
| "mode": "fixed" |
| } |
| } |
| ] |
| } |
| ] |
| }, |
| "gridPos": { |
| "h": 7, |
| "w": 12, |
| "x": 0, |
| "y": 35 |
| }, |
| "id": 122, |
| "options": { |
| "legend": { |
| "calcs": [ |
| "mean" |
| ], |
| "displayMode": "list", |
| "placement": "bottom" |
| }, |
| "tooltip": { |
| "mode": "multi" |
| } |
| }, |
| "pluginVersion": "8.0.6", |
| "targets": [ |
| { |
| "format": "table", |
| "group": [], |
| "hide": false, |
| "metricColumn": "none", |
| "rawQuery": true, |
| "rawSql": "with _merged_prs as(\n SELECT\n pr.id,\n pr.url,\n pr.created_date,\n pr.merged_date,\n pr.author_id,\n prc.id as comment_id,\n u.id as user_id,\n u.name as user_name,\n t.id as team_id,\n t.name as team\n FROM pull_requests pr\n join project_mapping pm on pr.base_repo_id = pm.row_id\n left join pull_request_comments prc on pr.id = prc.pull_request_id\n join user_accounts ua on pr.author_id = ua.account_id\n join users u on ua.user_id = u.id\n join team_users tu on u.id = tu.user_id\n join teams t on tu.team_id = t.id\n WHERE\n $__timeFilter(pr.created_date)\n and pm.project_name in ($project)\n and pr.merged_date is not null\n)\n\nselect\n DATE_ADD(date(created_date), INTERVAL -$interval(date(created_date))+1 DAY) as time,\n count(distinct case when team_id in ($team1) then comment_id else null end)/(select count(distinct user_id) from team_users where team_id in ($team1)) as \"Team1: PR Review Depth\",\n count(distinct case when team_id in ($team2) then comment_id else null end)/(select count(distinct user_id) from team_users where team_id in ($team2)) as \"Team2: PR Review Depth\",\n count(distinct comment_id)/(select count(*) FROM users) as \"Org: PR Review Depth\"\nFROM _merged_prs\nGROUP BY 1", |
| "refId": "A", |
| "select": [ |
| [ |
| { |
| "params": [ |
| "id" |
| ], |
| "type": "column" |
| } |
| ] |
| ], |
| "table": "ae_projects", |
| "timeColumn": "ae_create_time", |
| "timeColumnType": "timestamp", |
| "where": [ |
| { |
| "name": "$__timeFilter", |
| "params": [], |
| "type": "macro" |
| } |
| ] |
| } |
| ], |
| "title": " Average PR Review Depth per Team", |
| "type": "timeseries" |
| }, |
| { |
| "datasource": "mysql", |
| "description": "", |
| "fieldConfig": { |
| "defaults": { |
| "color": { |
| "fixedColor": "blue", |
| "mode": "fixed" |
| }, |
| "custom": { |
| "axisLabel": "Pull Request Count", |
| "axisPlacement": "auto", |
| "barAlignment": 1, |
| "drawStyle": "line", |
| "fillOpacity": 0, |
| "gradientMode": "none", |
| "hideFrom": { |
| "legend": false, |
| "tooltip": false, |
| "viz": false |
| }, |
| "lineInterpolation": "linear", |
| "lineStyle": { |
| "fill": "solid" |
| }, |
| "lineWidth": 1, |
| "pointSize": 12, |
| "scaleDistribution": { |
| "type": "linear" |
| }, |
| "showPoints": "auto", |
| "spanNulls": false, |
| "stacking": { |
| "group": "A", |
| "mode": "none" |
| }, |
| "thresholdsStyle": { |
| "mode": "off" |
| } |
| }, |
| "mappings": [], |
| "thresholds": { |
| "mode": "absolute", |
| "steps": [ |
| { |
| "color": "green", |
| "value": null |
| } |
| ] |
| } |
| }, |
| "overrides": [ |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team1: PR Size" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "orange", |
| "mode": "fixed" |
| } |
| } |
| ] |
| }, |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team2: PR Size" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "green", |
| "mode": "fixed" |
| } |
| } |
| ] |
| } |
| ] |
| }, |
| "gridPos": { |
| "h": 7, |
| "w": 12, |
| "x": 12, |
| "y": 35 |
| }, |
| "id": 127, |
| "options": { |
| "legend": { |
| "calcs": [ |
| "mean" |
| ], |
| "displayMode": "list", |
| "placement": "bottom" |
| }, |
| "tooltip": { |
| "mode": "multi" |
| } |
| }, |
| "pluginVersion": "8.0.6", |
| "targets": [ |
| { |
| "format": "time_series", |
| "group": [], |
| "hide": false, |
| "metricColumn": "none", |
| "rawQuery": true, |
| "rawSql": "with _prs as(\n SELECT\n pr.id,\n pr.url,\n pr.created_date,\n pr.merged_date,\n pr.author_id,\n prc.commit_sha,\n c.additions + c.deletions as loc,\n u.id as user_id,\n u.name as user_name,\n t.id as team_id,\n t.name as team\n FROM pull_requests pr\n join project_mapping pm on pr.base_repo_id = pm.row_id\n left join pull_request_commits prc on pr.id = prc.pull_request_id\n left join commits c on prc.commit_sha = c.sha\n join user_accounts ua on pr.author_id = ua.account_id\n join users u on ua.user_id = u.id\n join team_users tu on u.id = tu.user_id\n join teams t on tu.team_id = t.id\n WHERE\n $__timeFilter(pr.created_date)\n and pm.project_name in ($project)\n)\n\nselect\n DATE_ADD(date(created_date), INTERVAL -$interval(date(created_date))+1 DAY) as time,\n sum(case when team_id in ($team1) then loc else null end)/(select count(distinct user_id) from team_users where team_id in ($team1)) as \"Team1: PR Size\",\n sum(case when team_id in ($team2) then loc else null end)/(select count(distinct user_id) from team_users where team_id in ($team2)) as \"Team2: PR Size\",\n sum(loc)/(select count(*) FROM users) as \"Org: PR Size\"\nFROM _prs\nGROUP BY 1\nORDER BY 1", |
| "refId": "A", |
| "select": [ |
| [ |
| { |
| "params": [ |
| "id" |
| ], |
| "type": "column" |
| } |
| ] |
| ], |
| "table": "ae_projects", |
| "timeColumn": "ae_create_time", |
| "timeColumnType": "timestamp", |
| "where": [ |
| { |
| "name": "$__timeFilter", |
| "params": [], |
| "type": "macro" |
| } |
| ] |
| } |
| ], |
| "title": " Average PR Size by Team", |
| "type": "timeseries" |
| }, |
| { |
| "collapsed": false, |
| "datasource": null, |
| "gridPos": { |
| "h": 1, |
| "w": 24, |
| "x": 0, |
| "y": 42 |
| }, |
| "id": 119, |
| "panels": [], |
| "title": "5. P0/P1 Bugs", |
| "type": "row" |
| }, |
| { |
| "datasource": "mysql", |
| "description": "", |
| "fieldConfig": { |
| "defaults": { |
| "color": { |
| "mode": "palette-classic" |
| }, |
| "custom": { |
| "axisLabel": "Bug Count", |
| "axisPlacement": "auto", |
| "barAlignment": 0, |
| "drawStyle": "line", |
| "fillOpacity": 0, |
| "gradientMode": "none", |
| "hideFrom": { |
| "legend": false, |
| "tooltip": false, |
| "viz": false |
| }, |
| "lineInterpolation": "linear", |
| "lineWidth": 1, |
| "pointSize": 12, |
| "scaleDistribution": { |
| "type": "linear" |
| }, |
| "showPoints": "auto", |
| "spanNulls": false, |
| "stacking": { |
| "group": "A", |
| "mode": "none" |
| }, |
| "thresholdsStyle": { |
| "mode": "off" |
| } |
| }, |
| "mappings": [], |
| "thresholds": { |
| "mode": "absolute", |
| "steps": [ |
| { |
| "color": "green", |
| "value": null |
| }, |
| { |
| "color": "red", |
| "value": 80 |
| } |
| ] |
| } |
| }, |
| "overrides": [ |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team1: P0/P1 Bugs" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "orange", |
| "mode": "fixed" |
| } |
| } |
| ] |
| }, |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team2: P0/P1 Bugs" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "green", |
| "mode": "fixed" |
| } |
| } |
| ] |
| } |
| ] |
| }, |
| "gridPos": { |
| "h": 7, |
| "w": 12, |
| "x": 0, |
| "y": 43 |
| }, |
| "id": 100, |
| "options": { |
| "legend": { |
| "calcs": [ |
| "mean" |
| ], |
| "displayMode": "list", |
| "placement": "bottom" |
| }, |
| "tooltip": { |
| "mode": "single" |
| } |
| }, |
| "pluginVersion": "8.0.6", |
| "targets": [ |
| { |
| "format": "time_series", |
| "group": [], |
| "hide": false, |
| "metricColumn": "none", |
| "rawQuery": true, |
| "rawSql": "with _bugs as(\n SELECT\n i.id,\n i.url,\n i.created_date,\n i.status,\n i.assignee_id,\n i.story_point,\n i.priority,\n u.id as user_id,\n u.name as user_name,\n t.id as team_id,\n t.name as team\n FROM issues 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\t join project_mapping pm on b.id = pm.row_id\n \tjoin user_accounts ua on i.assignee_id = ua.account_id\n join users u on ua.user_id = u.id\n join team_users tu on u.id = tu.user_id\n join teams t on tu.team_id = t.id\n WHERE\n $__timeFilter(i.created_date)\n and pm.project_name in ($project)\n and i.type = 'BUG'\n)\n\nSELECT\n DATE_ADD(date(created_date), INTERVAL -$interval(date(created_date))+1 DAY) as time,\n count(case when team_id in ($team1) then id else null end) as 'Team1: P0/P1 Bugs',\n count(case when team_id in ($team2) then id else null end) as 'Team2: P0/P1 Bugs'\nFROM _bugs\nWHERE\n -- please choose the priorities in the filter above\n priority in ($priority)\nGROUP BY 1\nORDER BY 1", |
| "refId": "A", |
| "select": [ |
| [ |
| { |
| "params": [ |
| "id" |
| ], |
| "type": "column" |
| } |
| ] |
| ], |
| "table": "ae_projects", |
| "timeColumn": "ae_create_time", |
| "timeColumnType": "timestamp", |
| "where": [ |
| { |
| "name": "$__timeFilter", |
| "params": [], |
| "type": "macro" |
| } |
| ] |
| } |
| ], |
| "title": "Total P0/P1 Bugs", |
| "type": "timeseries" |
| }, |
| { |
| "datasource": "mysql", |
| "description": "", |
| "fieldConfig": { |
| "defaults": { |
| "color": { |
| "mode": "palette-classic" |
| }, |
| "custom": { |
| "axisLabel": "Bug Count", |
| "axisPlacement": "auto", |
| "barAlignment": 0, |
| "drawStyle": "line", |
| "fillOpacity": 0, |
| "gradientMode": "none", |
| "hideFrom": { |
| "legend": false, |
| "tooltip": false, |
| "viz": false |
| }, |
| "lineInterpolation": "linear", |
| "lineWidth": 1, |
| "pointSize": 12, |
| "scaleDistribution": { |
| "type": "linear" |
| }, |
| "showPoints": "auto", |
| "spanNulls": false, |
| "stacking": { |
| "group": "A", |
| "mode": "none" |
| }, |
| "thresholdsStyle": { |
| "mode": "off" |
| } |
| }, |
| "mappings": [], |
| "thresholds": { |
| "mode": "absolute", |
| "steps": [ |
| { |
| "color": "green", |
| "value": null |
| }, |
| { |
| "color": "red", |
| "value": 80 |
| } |
| ] |
| } |
| }, |
| "overrides": [ |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team1: P0/P1 Bugs" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "orange", |
| "mode": "fixed" |
| } |
| } |
| ] |
| }, |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team2: P0/P1 Bugs" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "green", |
| "mode": "fixed" |
| } |
| } |
| ] |
| } |
| ] |
| }, |
| "gridPos": { |
| "h": 7, |
| "w": 12, |
| "x": 12, |
| "y": 43 |
| }, |
| "id": 121, |
| "options": { |
| "legend": { |
| "calcs": [ |
| "mean" |
| ], |
| "displayMode": "list", |
| "placement": "bottom" |
| }, |
| "tooltip": { |
| "mode": "single" |
| } |
| }, |
| "pluginVersion": "8.0.6", |
| "targets": [ |
| { |
| "format": "time_series", |
| "group": [], |
| "hide": false, |
| "metricColumn": "none", |
| "rawQuery": true, |
| "rawSql": "with _bugs as(\n SELECT\n i.id,\n i.url,\n i.created_date,\n i.status,\n i.assignee_id,\n i.story_point,\n i.priority,\n u.id as user_id,\n u.name as user_name,\n t.id as team_id,\n t.name as team\n FROM issues 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\t join project_mapping pm on b.id = pm.row_id\n \tjoin user_accounts ua on i.assignee_id = ua.account_id\n join users u on ua.user_id = u.id\n join team_users tu on u.id = tu.user_id\n join teams t on tu.team_id = t.id\n WHERE\n $__timeFilter(i.created_date)\n and pm.project_name in ($project)\n and i.type = 'BUG'\n)\n\nSELECT\n DATE_ADD(date(created_date), INTERVAL -$interval(date(created_date))+1 DAY) as time,\n count(case when team_id in ($team1) then id else null end)/(select count(distinct user_id) from team_users where team_id in ($team1)) as 'Team1: P0/P1 Bugs per Member',\n count(case when team_id in ($team2) then id else null end)/(select count(distinct user_id) from team_users where team_id in ($team2)) as 'Team2: P0/P1 Bugs per Member',\n count(distinct id)/(select count(*) FROM users) as \"Org: P0/P1 Bugs per Member\"\nFROM _bugs\nWHERE\n -- please choose the priorities in the filter above\n priority in ($priority)\nGROUP BY 1\nORDER BY 1", |
| "refId": "A", |
| "select": [ |
| [ |
| { |
| "params": [ |
| "id" |
| ], |
| "type": "column" |
| } |
| ] |
| ], |
| "table": "ae_projects", |
| "timeColumn": "ae_create_time", |
| "timeColumnType": "timestamp", |
| "where": [ |
| { |
| "name": "$__timeFilter", |
| "params": [], |
| "type": "macro" |
| } |
| ] |
| } |
| ], |
| "title": "P0/P1 Bugs per Member", |
| "type": "timeseries" |
| }, |
| { |
| "collapsed": false, |
| "datasource": null, |
| "gridPos": { |
| "h": 1, |
| "w": 24, |
| "x": 0, |
| "y": 50 |
| }, |
| "id": 103, |
| "panels": [], |
| "title": "6. Cycle Time", |
| "type": "row" |
| }, |
| { |
| "datasource": "mysql", |
| "description": "", |
| "fieldConfig": { |
| "defaults": { |
| "color": { |
| "fixedColor": "blue", |
| "mode": "fixed" |
| }, |
| "custom": { |
| "axisLabel": "", |
| "axisPlacement": "auto", |
| "barAlignment": 0, |
| "drawStyle": "line", |
| "fillOpacity": 0, |
| "gradientMode": "none", |
| "hideFrom": { |
| "legend": false, |
| "tooltip": false, |
| "viz": false |
| }, |
| "lineInterpolation": "linear", |
| "lineWidth": 1, |
| "pointSize": 12, |
| "scaleDistribution": { |
| "type": "linear" |
| }, |
| "showPoints": "auto", |
| "spanNulls": false, |
| "stacking": { |
| "group": "A", |
| "mode": "none" |
| }, |
| "thresholdsStyle": { |
| "mode": "off" |
| } |
| }, |
| "mappings": [], |
| "thresholds": { |
| "mode": "absolute", |
| "steps": [ |
| { |
| "color": "green", |
| "value": null |
| } |
| ] |
| } |
| }, |
| "overrides": [ |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team1: Avg Cycle Time(h)" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "orange", |
| "mode": "fixed" |
| } |
| } |
| ] |
| }, |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team2: Avg Cycle Time(h)" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "green", |
| "mode": "fixed" |
| } |
| } |
| ] |
| } |
| ] |
| }, |
| "gridPos": { |
| "h": 7, |
| "w": 24, |
| "x": 0, |
| "y": 51 |
| }, |
| "id": 136, |
| "options": { |
| "legend": { |
| "calcs": [ |
| "mean" |
| ], |
| "displayMode": "list", |
| "placement": "bottom" |
| }, |
| "tooltip": { |
| "mode": "single" |
| } |
| }, |
| "pluginVersion": "8.0.6", |
| "targets": [ |
| { |
| "format": "table", |
| "group": [], |
| "hide": false, |
| "metricColumn": "none", |
| "rawQuery": true, |
| "rawSql": "with _prs as(\n SELECT\n pr.id,\n pr.created_date as pr_issued_date,\n -- convert null to 0 if a PR has no cycle_time to make sure cycle_time equals the sum of the four metrics below\n\t\tcoalesce(prm.pr_cycle_time/60,0) as cycle_time,\n\t\tpr.author_id,\n u.id as user_id,\n u.name as user_name,\n t.id as team_id,\n t.name as team\n FROM pull_requests pr\n join project_mapping pm on pr.base_repo_id = pm.row_id\n\t\tleft join project_pr_metrics prm on pr.id = prm.id\n left join user_accounts ua on pr.author_id = ua.account_id\n left join users u on ua.user_id = u.id\n left join team_users tu on u.id = tu.user_id\n left join teams t on tu.team_id = t.id\n WHERE\n $__timeFilter(pr.created_date)\n and pm.project_name in ($project)\n GROUP BY 1,2,3,4,5,6,7,8\n)\n\nSELECT \n DATE_ADD(date(pr_issued_date), INTERVAL -$interval(date(pr_issued_date))+1 DAY) as time,\n avg(case when team_id in ($team1) then cycle_time end) as 'Team1: Avg Cycle Time(h)',\n avg(case when team_id in ($team2) then cycle_time end) as 'Team2: Avg Cycle Time(h)'\nFROM _prs\nGROUP BY 1\nORDER BY 1", |
| "refId": "A", |
| "select": [ |
| [ |
| { |
| "params": [ |
| "id" |
| ], |
| "type": "column" |
| } |
| ] |
| ], |
| "table": "ae_projects", |
| "timeColumn": "ae_create_time", |
| "timeColumnType": "timestamp", |
| "where": [ |
| { |
| "name": "$__timeFilter", |
| "params": [], |
| "type": "macro" |
| } |
| ] |
| } |
| ], |
| "title": "Total Cycle Time(h)", |
| "type": "timeseries" |
| }, |
| { |
| "datasource": "mysql", |
| "description": "", |
| "fieldConfig": { |
| "defaults": { |
| "color": { |
| "fixedColor": "blue", |
| "mode": "fixed" |
| }, |
| "custom": { |
| "axisLabel": "", |
| "axisPlacement": "auto", |
| "barAlignment": 0, |
| "drawStyle": "line", |
| "fillOpacity": 0, |
| "gradientMode": "none", |
| "hideFrom": { |
| "legend": false, |
| "tooltip": false, |
| "viz": false |
| }, |
| "lineInterpolation": "linear", |
| "lineWidth": 1, |
| "pointSize": 12, |
| "scaleDistribution": { |
| "type": "linear" |
| }, |
| "showPoints": "auto", |
| "spanNulls": false, |
| "stacking": { |
| "group": "A", |
| "mode": "none" |
| }, |
| "thresholdsStyle": { |
| "mode": "off" |
| } |
| }, |
| "mappings": [], |
| "thresholds": { |
| "mode": "absolute", |
| "steps": [ |
| { |
| "color": "green", |
| "value": null |
| } |
| ] |
| } |
| }, |
| "overrides": [ |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team1: Avg Coding Time(h)" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "orange", |
| "mode": "fixed" |
| } |
| } |
| ] |
| }, |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team2: Avg Coding Time(h)" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "green", |
| "mode": "fixed" |
| } |
| } |
| ] |
| } |
| ] |
| }, |
| "gridPos": { |
| "h": 7, |
| "w": 6, |
| "x": 0, |
| "y": 58 |
| }, |
| "id": 140, |
| "options": { |
| "legend": { |
| "calcs": [ |
| "mean" |
| ], |
| "displayMode": "list", |
| "placement": "bottom" |
| }, |
| "tooltip": { |
| "mode": "single" |
| } |
| }, |
| "pluginVersion": "8.0.6", |
| "targets": [ |
| { |
| "format": "table", |
| "group": [], |
| "hide": false, |
| "metricColumn": "none", |
| "rawQuery": true, |
| "rawSql": "with _prs as(\n SELECT\n pr.id,\n pr.created_date as pr_issued_date,\n -- convert null to 0 if a PR has no coding_time to make sure cycle_time equals the sum of the four sub-metrics\n\t\tcoalesce(prm.pr_coding_time/60,0) as coding_time,\n\t\tpr.author_id,\n u.id as user_id,\n u.name as user_name,\n t.id as team_id,\n t.name as team\n FROM pull_requests pr\n join project_mapping pm on pr.base_repo_id = pm.row_id\n\t\tleft join project_pr_metrics prm on pr.id = prm.id\n left join user_accounts ua on pr.author_id = ua.account_id\n left join users u on ua.user_id = u.id\n left join team_users tu on u.id = tu.user_id\n left join teams t on tu.team_id = t.id\n WHERE\n $__timeFilter(pr.created_date)\n and pm.project_name in ($project)\n GROUP BY 1,2,3,4,5,6,7,8\n)\n\nSELECT \n DATE_ADD(date(pr_issued_date), INTERVAL -$interval(date(pr_issued_date))+1 DAY) as time,\n avg(case when team_id in ($team1) then coding_time end) as 'Team1: Avg Coding Time(h)',\n avg(case when team_id in ($team2) then coding_time end) as 'Team2: Avg Coding Time(h)'\nFROM _prs\nGROUP BY 1\nORDER BY 1", |
| "refId": "A", |
| "select": [ |
| [ |
| { |
| "params": [ |
| "id" |
| ], |
| "type": "column" |
| } |
| ] |
| ], |
| "table": "ae_projects", |
| "timeColumn": "ae_create_time", |
| "timeColumnType": "timestamp", |
| "where": [ |
| { |
| "name": "$__timeFilter", |
| "params": [], |
| "type": "macro" |
| } |
| ] |
| } |
| ], |
| "title": "PR Coding Time(h)", |
| "type": "timeseries" |
| }, |
| { |
| "datasource": "mysql", |
| "description": "", |
| "fieldConfig": { |
| "defaults": { |
| "color": { |
| "fixedColor": "blue", |
| "mode": "fixed" |
| }, |
| "custom": { |
| "axisLabel": "", |
| "axisPlacement": "auto", |
| "barAlignment": 0, |
| "drawStyle": "line", |
| "fillOpacity": 0, |
| "gradientMode": "none", |
| "hideFrom": { |
| "legend": false, |
| "tooltip": false, |
| "viz": false |
| }, |
| "lineInterpolation": "linear", |
| "lineWidth": 1, |
| "pointSize": 12, |
| "scaleDistribution": { |
| "type": "linear" |
| }, |
| "showPoints": "auto", |
| "spanNulls": false, |
| "stacking": { |
| "group": "A", |
| "mode": "none" |
| }, |
| "thresholdsStyle": { |
| "mode": "off" |
| } |
| }, |
| "mappings": [], |
| "thresholds": { |
| "mode": "absolute", |
| "steps": [ |
| { |
| "color": "green", |
| "value": null |
| } |
| ] |
| } |
| }, |
| "overrides": [ |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team1: Avg Pickup Time(h)" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "orange", |
| "mode": "fixed" |
| } |
| } |
| ] |
| }, |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team2: Avg Pickup Time(h)" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "green", |
| "mode": "fixed" |
| } |
| } |
| ] |
| } |
| ] |
| }, |
| "gridPos": { |
| "h": 7, |
| "w": 6, |
| "x": 6, |
| "y": 58 |
| }, |
| "id": 134, |
| "options": { |
| "legend": { |
| "calcs": [ |
| "mean" |
| ], |
| "displayMode": "list", |
| "placement": "bottom" |
| }, |
| "tooltip": { |
| "mode": "single" |
| } |
| }, |
| "pluginVersion": "8.0.6", |
| "targets": [ |
| { |
| "format": "table", |
| "group": [], |
| "hide": false, |
| "metricColumn": "none", |
| "rawQuery": true, |
| "rawSql": "with _prs as(\n SELECT\n pr.id,\n pr.created_date as pr_issued_date,\n -- convert null to 0 if a PR has no pickup_time to make sure cycle_time equals the sum of the four sub-metrics\n\t\tcoalesce(prm.pr_pickup_time/60,0) as pickup_time,\n\t\tpr.author_id,\n u.id as user_id,\n u.name as user_name,\n t.id as team_id,\n t.name as team\n FROM pull_requests pr\n join project_mapping pm on pr.base_repo_id = pm.row_id\n\t\tleft join project_pr_metrics prm on pr.id = prm.id\n left join user_accounts ua on pr.author_id = ua.account_id\n left join users u on ua.user_id = u.id\n left join team_users tu on u.id = tu.user_id\n left join teams t on tu.team_id = t.id\n WHERE\n $__timeFilter(pr.created_date)\n and pm.project_name in ($project)\n GROUP BY 1,2,3,4,5,6,7,8\n)\n\nSELECT \n DATE_ADD(date(pr_issued_date), INTERVAL -$interval(date(pr_issued_date))+1 DAY) as time,\n avg(case when team_id in ($team1) then pickup_time end) as 'Team1: Avg Pickup Time(h)',\n avg(case when team_id in ($team2) then pickup_time end) as 'Team2: Avg Pickup Time(h)'\nFROM _prs\nGROUP BY 1\nORDER BY 1", |
| "refId": "A", |
| "select": [ |
| [ |
| { |
| "params": [ |
| "id" |
| ], |
| "type": "column" |
| } |
| ] |
| ], |
| "table": "ae_projects", |
| "timeColumn": "ae_create_time", |
| "timeColumnType": "timestamp", |
| "where": [ |
| { |
| "name": "$__timeFilter", |
| "params": [], |
| "type": "macro" |
| } |
| ] |
| } |
| ], |
| "title": "PR Pickup Time(h)", |
| "type": "timeseries" |
| }, |
| { |
| "datasource": "mysql", |
| "description": "", |
| "fieldConfig": { |
| "defaults": { |
| "color": { |
| "fixedColor": "blue", |
| "mode": "fixed" |
| }, |
| "custom": { |
| "axisLabel": "", |
| "axisPlacement": "auto", |
| "barAlignment": 0, |
| "drawStyle": "line", |
| "fillOpacity": 0, |
| "gradientMode": "none", |
| "hideFrom": { |
| "legend": false, |
| "tooltip": false, |
| "viz": false |
| }, |
| "lineInterpolation": "linear", |
| "lineWidth": 1, |
| "pointSize": 12, |
| "scaleDistribution": { |
| "type": "linear" |
| }, |
| "showPoints": "auto", |
| "spanNulls": false, |
| "stacking": { |
| "group": "A", |
| "mode": "none" |
| }, |
| "thresholdsStyle": { |
| "mode": "off" |
| } |
| }, |
| "mappings": [], |
| "thresholds": { |
| "mode": "absolute", |
| "steps": [ |
| { |
| "color": "green", |
| "value": null |
| } |
| ] |
| } |
| }, |
| "overrides": [ |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team1: Avg Review Time(h)" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "orange", |
| "mode": "fixed" |
| } |
| } |
| ] |
| }, |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team2: Avg Review Time(h)" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "green", |
| "mode": "fixed" |
| } |
| } |
| ] |
| } |
| ] |
| }, |
| "gridPos": { |
| "h": 7, |
| "w": 6, |
| "x": 12, |
| "y": 58 |
| }, |
| "id": 135, |
| "options": { |
| "legend": { |
| "calcs": [ |
| "mean" |
| ], |
| "displayMode": "list", |
| "placement": "bottom" |
| }, |
| "tooltip": { |
| "mode": "single" |
| } |
| }, |
| "pluginVersion": "8.0.6", |
| "targets": [ |
| { |
| "format": "table", |
| "group": [], |
| "hide": false, |
| "metricColumn": "none", |
| "rawQuery": true, |
| "rawSql": "with _prs as(\n SELECT\n pr.id,\n pr.created_date as pr_issued_date,\n -- convert null to 0 if a PR has no review_time to make sure cycle_time equals the sum of the four sub-metrics\n\t\tcoalesce(prm.pr_review_time/60,0) as review_time,\n\t\tpr.author_id,\n u.id as user_id,\n u.name as user_name,\n t.id as team_id,\n t.name as team\n FROM pull_requests pr\n join project_mapping pm on pr.base_repo_id = pm.row_id\n\t\tleft join project_pr_metrics prm on pr.id = prm.id\n left join user_accounts ua on pr.author_id = ua.account_id\n left join users u on ua.user_id = u.id\n left join team_users tu on u.id = tu.user_id\n left join teams t on tu.team_id = t.id\n WHERE\n $__timeFilter(pr.created_date)\n and pm.project_name in ($project)\n GROUP BY 1,2,3,4,5,6,7,8\n)\n\nSELECT \n DATE_ADD(date(pr_issued_date), INTERVAL -$interval(date(pr_issued_date))+1 DAY) as time,\n avg(case when team_id in ($team1) then review_time end) as 'Team1: Avg Review Time(h)',\n avg(case when team_id in ($team2) then review_time end) as 'Team2: Avg Review Time(h)'\nFROM _prs\nGROUP BY 1\nORDER BY 1", |
| "refId": "A", |
| "select": [ |
| [ |
| { |
| "params": [ |
| "id" |
| ], |
| "type": "column" |
| } |
| ] |
| ], |
| "table": "ae_projects", |
| "timeColumn": "ae_create_time", |
| "timeColumnType": "timestamp", |
| "where": [ |
| { |
| "name": "$__timeFilter", |
| "params": [], |
| "type": "macro" |
| } |
| ] |
| } |
| ], |
| "title": "PR Review Time(h)", |
| "type": "timeseries" |
| }, |
| { |
| "datasource": "mysql", |
| "description": "", |
| "fieldConfig": { |
| "defaults": { |
| "color": { |
| "fixedColor": "blue", |
| "mode": "fixed" |
| }, |
| "custom": { |
| "axisLabel": "", |
| "axisPlacement": "auto", |
| "barAlignment": 0, |
| "drawStyle": "line", |
| "fillOpacity": 0, |
| "gradientMode": "none", |
| "hideFrom": { |
| "legend": false, |
| "tooltip": false, |
| "viz": false |
| }, |
| "lineInterpolation": "linear", |
| "lineWidth": 1, |
| "pointSize": 12, |
| "scaleDistribution": { |
| "type": "linear" |
| }, |
| "showPoints": "auto", |
| "spanNulls": false, |
| "stacking": { |
| "group": "A", |
| "mode": "none" |
| }, |
| "thresholdsStyle": { |
| "mode": "off" |
| } |
| }, |
| "mappings": [], |
| "thresholds": { |
| "mode": "absolute", |
| "steps": [ |
| { |
| "color": "green", |
| "value": null |
| } |
| ] |
| } |
| }, |
| "overrides": [ |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team1: Avg Review Time(h)" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "orange", |
| "mode": "fixed" |
| } |
| } |
| ] |
| }, |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team2: Avg Review Time(h)" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "green", |
| "mode": "fixed" |
| } |
| } |
| ] |
| } |
| ] |
| }, |
| "gridPos": { |
| "h": 7, |
| "w": 6, |
| "x": 18, |
| "y": 58 |
| }, |
| "id": 145, |
| "options": { |
| "legend": { |
| "calcs": [ |
| "mean" |
| ], |
| "displayMode": "list", |
| "placement": "bottom" |
| }, |
| "tooltip": { |
| "mode": "single" |
| } |
| }, |
| "pluginVersion": "8.0.6", |
| "targets": [ |
| { |
| "format": "table", |
| "group": [], |
| "hide": false, |
| "metricColumn": "none", |
| "rawQuery": true, |
| "rawSql": "with _prs as(\n SELECT\n pr.id,\n pr.created_date as pr_issued_date,\n -- convert null to 0 if a PR has no deploy_time to make sure cycle_time equals the sum of the four sub-metrics\n\t\tcoalesce(prm.pr_deploy_time/60,0) as deploy_time,\n\t\tpr.author_id,\n u.id as user_id,\n u.name as user_name,\n t.id as team_id,\n t.name as team\n FROM pull_requests pr\n join project_mapping pm on pr.base_repo_id = pm.row_id\n\t\tleft join project_pr_metrics prm on pr.id = prm.id\n left join user_accounts ua on pr.author_id = ua.account_id\n left join users u on ua.user_id = u.id\n left join team_users tu on u.id = tu.user_id\n left join teams t on tu.team_id = t.id\n WHERE\n $__timeFilter(pr.created_date)\n and pm.project_name in ($project)\n GROUP BY 1,2,3,4,5,6,7,8\n)\n\nSELECT \n DATE_ADD(date(pr_issued_date), INTERVAL -$interval(date(pr_issued_date))+1 DAY) as time,\n avg(case when team_id in ($team1) then deploy_time end) as 'Team1: Avg Deploy Time(h)',\n avg(case when team_id in ($team2) then deploy_time end) as 'Team2: Avg Deploy Time(h)'\nFROM _prs\nGROUP BY 1\nORDER BY 1", |
| "refId": "A", |
| "select": [ |
| [ |
| { |
| "params": [ |
| "id" |
| ], |
| "type": "column" |
| } |
| ] |
| ], |
| "table": "ae_projects", |
| "timeColumn": "ae_create_time", |
| "timeColumnType": "timestamp", |
| "where": [ |
| { |
| "name": "$__timeFilter", |
| "params": [], |
| "type": "macro" |
| } |
| ] |
| } |
| ], |
| "title": "PR Deploy Time(h)", |
| "type": "timeseries" |
| }, |
| { |
| "collapsed": false, |
| "datasource": null, |
| "gridPos": { |
| "h": 1, |
| "w": 24, |
| "x": 0, |
| "y": 65 |
| }, |
| "id": 139, |
| "panels": [], |
| "title": "7. PRs Merged w/o Review", |
| "type": "row" |
| }, |
| { |
| "datasource": "mysql", |
| "description": "", |
| "fieldConfig": { |
| "defaults": { |
| "color": { |
| "fixedColor": "blue", |
| "mode": "fixed" |
| }, |
| "custom": { |
| "axisLabel": "", |
| "axisPlacement": "auto", |
| "barAlignment": 0, |
| "drawStyle": "line", |
| "fillOpacity": 0, |
| "gradientMode": "none", |
| "hideFrom": { |
| "legend": false, |
| "tooltip": false, |
| "viz": false |
| }, |
| "lineInterpolation": "linear", |
| "lineWidth": 1, |
| "pointSize": 12, |
| "scaleDistribution": { |
| "type": "linear" |
| }, |
| "showPoints": "auto", |
| "spanNulls": false, |
| "stacking": { |
| "group": "A", |
| "mode": "none" |
| }, |
| "thresholdsStyle": { |
| "mode": "off" |
| } |
| }, |
| "mappings": [], |
| "thresholds": { |
| "mode": "absolute", |
| "steps": [ |
| { |
| "color": "green", |
| "value": null |
| } |
| ] |
| } |
| }, |
| "overrides": [ |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team1: PRs Merged w/o Review" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "orange", |
| "mode": "fixed" |
| } |
| } |
| ] |
| }, |
| { |
| "matcher": { |
| "id": "byName", |
| "options": "Team2: PRs Merged w/o Review" |
| }, |
| "properties": [ |
| { |
| "id": "color", |
| "value": { |
| "fixedColor": "green", |
| "mode": "fixed" |
| } |
| } |
| ] |
| } |
| ] |
| }, |
| "gridPos": { |
| "h": 7, |
| "w": 12, |
| "x": 0, |
| "y": 66 |
| }, |
| "id": 108, |
| "options": { |
| "legend": { |
| "calcs": [ |
| "mean" |
| ], |
| "displayMode": "list", |
| "placement": "bottom" |
| }, |
| "tooltip": { |
| "mode": "single" |
| } |
| }, |
| "pluginVersion": "8.0.6", |
| "targets": [ |
| { |
| "format": "table", |
| "group": [], |
| "hide": false, |
| "metricColumn": "none", |
| "rawQuery": true, |
| "rawSql": "with _merged_prs as(\n SELECT\n pr.id,\n pr.url,\n pr.created_date,\n pr.merged_date,\n pr.author_id,\n u.id as user_id,\n u.name as user_name,\n t.id as team_id,\n t.name as team\n FROM pull_requests pr\n join project_mapping pm on pr.base_repo_id = pm.row_id\n join user_accounts ua on pr.author_id = ua.account_id\n join users u on ua.user_id = u.id\n join team_users tu on u.id = tu.user_id\n join teams t on tu.team_id = t.id\n WHERE\n $__timeFilter(pr.created_date)\n and pm.project_name in ($project)\n and pr.merged_date is not null\n)\n\nSELECT\n DATE_ADD(date(created_date), INTERVAL -$interval(date(created_date))+1 DAY) as time,\n count(distinct case when team_id in ($team1) and id not in (SELECT pull_request_id FROM pull_request_comments) then id else null end) as \"Team1: PRs Merged w/o Review\",\n count(distinct case when team_id in ($team2) and id not in (SELECT pull_request_id FROM pull_request_comments) then id else null end) as \"Team2: PRs Merged w/o Review\"\nFROM _merged_prs\nGROUP BY 1", |
| "refId": "A", |
| "select": [ |
| [ |
| { |
| "params": [ |
| "id" |
| ], |
| "type": "column" |
| } |
| ] |
| ], |
| "table": "ae_projects", |
| "timeColumn": "ae_create_time", |
| "timeColumnType": "timestamp", |
| "where": [ |
| { |
| "name": "$__timeFilter", |
| "params": [], |
| "type": "macro" |
| } |
| ] |
| } |
| ], |
| "title": "PRs Merged w/o Review", |
| "type": "timeseries" |
| }, |
| { |
| "datasource": null, |
| "gridPos": { |
| "h": 2, |
| "w": 24, |
| "x": 0, |
| "y": 73 |
| }, |
| "id": 144, |
| "options": { |
| "content": "<br/>\n\nThis dashboard is created based on this [data schema](https://devlake.apache.org/docs/DataModels/DevLakeDomainLayerSchema). Want to add more metrics? Please follow the [guide](https://devlake.apache.org/docs/Configuration/Dashboards/GrafanaUserGuide).", |
| "mode": "markdown" |
| }, |
| "pluginVersion": "8.0.6", |
| "targets": [ |
| { |
| "queryType": "randomWalk", |
| "refId": "A" |
| } |
| ], |
| "type": "text" |
| } |
| ], |
| "refresh": "", |
| "schemaVersion": 30, |
| "style": "dark", |
| "tags": [], |
| "templating": { |
| "list": [ |
| { |
| "allValue": null, |
| "current": { |
| "selected": false, |
| "text": "All", |
| "value": "$__all" |
| }, |
| "datasource": "mysql", |
| "definition": "select distinct name from projects", |
| "description": null, |
| "error": null, |
| "hide": 0, |
| "includeAll": true, |
| "label": "Project", |
| "multi": true, |
| "name": "project", |
| "options": [], |
| "query": "select distinct name from projects", |
| "refresh": 1, |
| "regex": "", |
| "skipUrlSync": false, |
| "sort": 0, |
| "type": "query" |
| }, |
| { |
| "allValue": "", |
| "current": { |
| "isNone": true, |
| "selected": false, |
| "text": "None", |
| "value": "" |
| }, |
| "datasource": "mysql", |
| "definition": "select concat(name, '--', id) as text from teams", |
| "description": null, |
| "error": null, |
| "hide": 0, |
| "includeAll": false, |
| "label": "Team1", |
| "multi": false, |
| "name": "team1", |
| "options": [], |
| "query": "select concat(name, '--', id) as text from teams", |
| "refresh": 1, |
| "regex": "/^(?<text>.*)--(?<value>.*)$/", |
| "skipUrlSync": false, |
| "sort": 0, |
| "type": "query" |
| }, |
| { |
| "allValue": "", |
| "current": { |
| "isNone": true, |
| "selected": false, |
| "text": "None", |
| "value": "" |
| }, |
| "datasource": "mysql", |
| "definition": "select concat(name, '--', id) as text from teams", |
| "description": null, |
| "error": null, |
| "hide": 0, |
| "includeAll": false, |
| "label": "Team2", |
| "multi": false, |
| "name": "team2", |
| "options": [], |
| "query": "select concat(name, '--', id) as text from teams", |
| "refresh": 1, |
| "regex": "/^(?<text>.*)--(?<value>.*)$/", |
| "skipUrlSync": false, |
| "sort": 0, |
| "type": "query" |
| }, |
| { |
| "allValue": "", |
| "current": { |
| "selected": true, |
| "text": [ |
| "All" |
| ], |
| "value": [ |
| "$__all" |
| ] |
| }, |
| "datasource": "mysql", |
| "definition": "select distinct priority from issues where priority != ''", |
| "description": null, |
| "error": null, |
| "hide": 0, |
| "includeAll": true, |
| "label": "P0+P1 Priority", |
| "multi": true, |
| "name": "priority", |
| "options": [], |
| "query": "select distinct priority from issues where priority != ''", |
| "refresh": 1, |
| "regex": "", |
| "skipUrlSync": false, |
| "sort": 0, |
| "type": "query" |
| }, |
| { |
| "allValue": null, |
| "current": { |
| "selected": false, |
| "text": "Month", |
| "value": "DAYOFMONTH" |
| }, |
| "description": "", |
| "error": null, |
| "hide": 0, |
| "includeAll": false, |
| "label": "Time Interval", |
| "multi": false, |
| "name": "interval", |
| "options": [ |
| { |
| "selected": true, |
| "text": "Month", |
| "value": "DAYOFMONTH" |
| }, |
| { |
| "selected": false, |
| "text": "Week", |
| "value": "WEEKDAY" |
| } |
| ], |
| "query": "Month : DAYOFMONTH, Week : WEEKDAY", |
| "queryValue": "", |
| "skipUrlSync": false, |
| "type": "custom" |
| } |
| ] |
| }, |
| "time": { |
| "from": "now-6M", |
| "to": "now" |
| }, |
| "timepicker": {}, |
| "timezone": "", |
| "title": "Engineering Throughput and Cycle Time - Team View", |
| "uid": "nJ1ijje7k", |
| "version": 6 |
| } |