blob: 8df95d940af92e5bef93ab36a307f6ee7d9fd32b [file] [log] [blame]
{
"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": 3,
"iteration": 1637051247070,
"links": [
{
"asDropdown": false,
"icon": "bolt",
"includeVars": false,
"keepTime": true,
"tags": [],
"targetBlank": false,
"title": "Homepage",
"tooltip": "",
"type": "link",
"url": "/grafana/d/RXJZNpMnz/user-value-specific-dashboards-homepage?orgId=1"
},
{
"asDropdown": false,
"icon": "external link",
"includeVars": false,
"keepTime": true,
"tags": [
"user_value"
],
"targetBlank": false,
"title": "Metric dashboards",
"tooltip": "",
"type": "dashboards",
"url": ""
}
],
"panels": [
{
"cacheTimeout": null,
"datasource": null,
"gridPos": {
"h": 5,
"w": 24,
"x": 0,
"y": 0
},
"id": 89,
"interval": null,
"links": [],
"options": {
"content": "<div style=\"text-align:center;\">\n <div style=\"display:inline-block;text-align:center;padding-top:10px;\">\n <img border=\"0\" src=\"/grafana/public/img/lake/practice_process_delivery_velocity.png\" alt=\"R&D Process\" width=\"60%\">\n </div>\n</div>",
"mode": "html"
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "time_series",
"group": [],
"metricColumn": "none",
"rawQuery": false,
"rawSql": "SELECT\n create_time AS \"time\",\n progress\nFROM ca_analysis\nWHERE\n $__timeFilter(create_time)\nORDER BY 1",
"refId": "A",
"select": [
[
{
"params": [
"progress"
],
"type": "column"
}
]
],
"table": "ca_analysis",
"timeColumn": "create_time",
"timeColumnType": "timestamp",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"timeFrom": null,
"timeShift": null,
"title": "Charts are organized by the Research & Development stages below",
"transparent": true,
"type": "text"
},
{
"datasource": null,
"gridPos": {
"h": 4,
"w": 24,
"x": 0,
"y": 5
},
"id": 76,
"options": {
"content": "<div style=\"display: block;text-align: center;margin-top: 56px;\">\n <div style=\"display: inline-flex;\">\n <img src=\"/public/img/lake/practice_cross_domain.png\" alt=\"Cross-stage\" width=\"56\">\n <p style=\"font-size:24px; margin:10px;color:#CCCCDC;\"><b>Cross-stage Metrics<b></b></b></p><b><b>\n </div>\n</div>",
"mode": "html"
},
"pluginVersion": "8.0.6",
"targets": [
{
"queryType": "randomWalk",
"refId": "A"
}
],
"transparent": true,
"type": "text"
},
{
"datasource": "mysql",
"description": "1. The average lead time of requirements.\n2. Lead time refers to the length of time from requirement creation to delivery.\n3. The requirements being calculated are filtered by \"requirement resolution time\" (time filter at the upper-right corner) and \"Jira board\"(\"Choose Board\" filter at the upper-left corner)",
"fieldConfig": {
"defaults": {
"decimals": 1,
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": 14
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 6,
"x": 0,
"y": 9
},
"id": 12,
"options": {
"colorMode": "value",
"graphMode": "area",
"justifyMode": "auto",
"orientation": "auto",
"reduceOptions": {
"calcs": [
"mean"
],
"fields": "/^value$/",
"values": false
},
"text": {},
"textMode": "auto"
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "time_series",
"group": [],
"metricColumn": "none",
"rawQuery": true,
"rawSql": "select \r\n now() as time,\r\n avg(lead_time/1440) as value\r\nfrom jira_issues ji\r\n join jira_board_issues jbi on ji.issue_id = jbi.issue_id\r\nwhere \r\n std_type = 'Requirement'\r\n and std_status = 'Resolved'\r\n and $__timeFilter(resolution_date)\r\n and jbi.board_id = $board_id\r\ngroup by 1;",
"refId": "A",
"select": [
[
{
"params": [
"progress"
],
"type": "column"
}
]
],
"table": "ca_analysis",
"timeColumn": "create_time",
"timeColumnType": "timestamp",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"timeFrom": null,
"timeShift": null,
"title": "Avg Requirement Lead Time (day)",
"type": "stat"
},
{
"datasource": "mysql",
"description": "1. The lead time at which 80% requirements‘ lead time lies below it.\n2. The requirements being calculated are filtered by \"requirement resolution time\" (time filter at the upper-right corner) and \"Jira board\" (\"Choose Board\" filter at the upper-left corner)",
"fieldConfig": {
"defaults": {
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": 21
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 6,
"x": 6,
"y": 9
},
"id": 13,
"options": {
"colorMode": "value",
"graphMode": "area",
"justifyMode": "auto",
"orientation": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"text": {},
"textMode": "auto"
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "time_series",
"group": [],
"metricColumn": "none",
"rawQuery": true,
"rawSql": "with _ranks as(\r\n select \r\n ji.lead_time,\r\n percent_rank() over (order by lead_time asc) as ranks\r\n from jira_issues ji\r\n join jira_board_issues jbi on ji.issue_id = jbi.issue_id\r\n where \r\n std_type = 'Requirement'\r\n and std_status = 'Resolved'\r\n and $__timeFilter(resolution_date)\r\n and jbi.board_id = $board_id\r\n)\r\n\r\nselect\r\n now() as time,\r\n max(lead_time/1440) as value\r\nfrom _ranks\r\nwhere \r\n ranks <= 0.8\r\ngroup by 1",
"refId": "A",
"select": [
[
{
"params": [
"progress"
],
"type": "column"
}
]
],
"table": "ca_analysis",
"timeColumn": "create_time",
"timeColumnType": "timestamp",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"timeFrom": null,
"timeShift": null,
"title": "80th Percentile Requirement Lead Time (day)",
"type": "stat"
},
{
"aliasColors": {},
"bars": false,
"dashLength": 10,
"dashes": false,
"datasource": "mysql",
"description": "1. The average requirement lead time over time.\n2. The time granularity can be switched to Week or Month by \"Time Interval\" above. \n3. When Time Interval is set to \"Month\", the average_lead_time of \"2021-06-01\" refers to the average lead time of requirements whose resolution time falls under [2020-06-01, 2020-07-01).",
"fieldConfig": {
"defaults": {
"unit": "short"
},
"overrides": []
},
"fill": 1,
"fillGradient": 0,
"gridPos": {
"h": 6,
"w": 12,
"x": 12,
"y": 9
},
"hiddenSeries": false,
"id": 17,
"interval": "",
"legend": {
"avg": false,
"current": false,
"max": false,
"min": false,
"show": true,
"total": false,
"values": false
},
"lines": true,
"linewidth": 1,
"nullPointMode": "null",
"options": {
"alertThreshold": true
},
"percentage": false,
"pluginVersion": "8.0.6",
"pointradius": 2,
"points": false,
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
"stack": false,
"steppedLine": false,
"targets": [
{
"format": "time_series",
"group": [],
"metricColumn": "none",
"rawQuery": true,
"rawSql": "with _requirement as(\r\n select \r\n DATE_ADD(date(resolution_date), INTERVAL -$interval(date(resolution_date))+1 DAY) as time,\r\n lead_time\r\n from jira_issues ji\r\n join jira_board_issues jbi on ji.issue_id = jbi.issue_id\r\n where \r\n std_type = 'Requirement'\r\n and std_status = 'Resolved'\r\n and $__timeFilter(resolution_date)\r\n and jbi.board_id = $board_id\r\n)\r\n\r\nselect \r\n timestamp(time) as time,\r\n avg(lead_time/1440) as average_lead_time\r\nfrom _requirement\r\ngroup by 1\r\norder by 1 asc",
"refId": "A",
"select": [
[
{
"params": [
"progress"
],
"type": "column"
}
]
],
"table": "ca_analysis",
"timeColumn": "create_time",
"timeColumnType": "timestamp",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"thresholds": [],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
"title": "Requirement Lead Time over Time",
"tooltip": {
"shared": true,
"sort": 0,
"value_type": "individual"
},
"type": "graph",
"xaxis": {
"buckets": null,
"mode": "time",
"name": null,
"show": true,
"values": []
},
"yaxes": [
{
"$$hashKey": "object:242",
"format": "short",
"label": "Lead Time(day)",
"logBase": 1,
"max": null,
"min": null,
"show": true
},
{
"$$hashKey": "object:243",
"format": "short",
"label": "",
"logBase": 1,
"max": null,
"min": null,
"show": true
}
],
"yaxis": {
"align": false,
"alignLevel": null
}
},
{
"aliasColors": {},
"bars": false,
"dashLength": 10,
"dashes": false,
"datasource": "mysql",
"description": "1. The cumulative distribution of requirement lead time. \n2. Each point refers to the percent rank of a lead time.",
"fill": 0,
"fillGradient": 4,
"gridPos": {
"h": 6,
"w": 24,
"x": 0,
"y": 15
},
"hiddenSeries": false,
"id": 15,
"legend": {
"alignAsTable": false,
"avg": false,
"current": false,
"max": false,
"min": false,
"rightSide": false,
"show": false,
"total": false,
"values": false
},
"lines": true,
"linewidth": 8,
"nullPointMode": "null",
"options": {
"alertThreshold": false
},
"percentage": false,
"pluginVersion": "8.0.6",
"pointradius": 0.5,
"points": false,
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
"stack": false,
"steppedLine": false,
"targets": [
{
"format": "time_series",
"group": [],
"metricColumn": "none",
"rawQuery": true,
"rawSql": "with _ranks as(\r\n select \r\n round(ji.lead_time/1440) as lead_time_day\r\n from jira_issues ji\r\n join jira_board_issues jbi on ji.issue_id = jbi.issue_id\r\n where \r\n std_type = 'Requirement'\r\n and std_status = 'Resolved'\r\n and $__timeFilter(resolution_date)\r\n and jbi.board_id = $board_id\r\n order by lead_time_day asc\r\n)\r\n\r\nselect \r\n now() as time,\r\n lpad(concat(lead_time_day,'d'), 4, ' ') as metric,\r\n percent_rank() over (order by lead_time_day asc) as value\r\nfrom _ranks\r\norder by lead_time_day asc",
"refId": "A",
"select": [
[
{
"params": [
"progress"
],
"type": "column"
}
]
],
"table": "ca_analysis",
"timeColumn": "create_time",
"timeColumnType": "timestamp",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"thresholds": [
{
"$$hashKey": "object:469",
"colorMode": "ok",
"fill": true,
"line": true,
"op": "lt",
"value": 0.8,
"yaxis": "right"
}
],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
"title": "Requirement Lead Time (Cumulative Distribution)",
"tooltip": {
"shared": false,
"sort": 0,
"value_type": "individual"
},
"transformations": [],
"type": "graph",
"xaxis": {
"buckets": null,
"mode": "series",
"name": null,
"show": true,
"values": [
"current"
]
},
"yaxes": [
{
"$$hashKey": "object:76",
"format": "percentunit",
"label": "Percent Rank (%)",
"logBase": 1,
"max": "1.2",
"min": null,
"show": true
},
{
"$$hashKey": "object:77",
"format": "short",
"label": null,
"logBase": 1,
"max": null,
"min": null,
"show": false
}
],
"yaxis": {
"align": false,
"alignLevel": null
}
},
{
"datasource": "mysql",
"description": "The average lead time of requirements under different Jira Epics.",
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"axisLabel": "Lead Time (day)",
"axisPlacement": "auto",
"axisSoftMin": 0,
"fillOpacity": 80,
"gradientMode": "none",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"lineWidth": 1
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": 80
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 24,
"x": 0,
"y": 21
},
"id": 18,
"options": {
"barWidth": 0.5,
"groupWidth": 0.7,
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom"
},
"orientation": "auto",
"showValue": "auto",
"text": {},
"tooltip": {
"mode": "single"
}
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "table",
"group": [],
"metricColumn": "none",
"queryType": "randomWalk",
"rawQuery": true,
"rawSql": "with _requirement as(\r\n select\r\n ji.issue_id,\r\n epic_key,\r\n ji.lead_time\r\n from\r\n jira_issues ji\r\n join jira_board_issues jbi on ji.issue_id = jbi.issue_id\r\n where \r\n ji.std_type = 'Requirement'\r\n and ji.std_status = 'Resolved'\r\n and ji.epic_key is not null\r\n and ji.epic_key != ''\r\n and $__timeFilter(resolution_date)\r\n and jbi.board_id = $board_id\r\n)\r\n\r\nselect \r\n now() as time,\r\n epic_key as \"Epic Key\",\r\n avg(lead_time/1440) as value\r\nfrom _requirement\r\ngroup by 1,2\r\norder by 3 desc\r\nlimit 20",
"refId": "A",
"select": [
[
{
"params": [
"value"
],
"type": "column"
}
]
],
"timeColumn": "time",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"timeFrom": null,
"timeShift": null,
"title": "Average Requirement Lead Time by Epic",
"type": "barchart"
},
{
"datasource": "mysql",
"description": "The average time spent in each state of a requirement, including all history states that have been used.",
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"axisLabel": "Lead Time(day)",
"axisPlacement": "auto",
"axisSoftMin": 0,
"fillOpacity": 74,
"gradientMode": "none",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"lineWidth": 1
},
"decimals": 1,
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": 80
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 24,
"x": 0,
"y": 27
},
"id": 97,
"options": {
"barWidth": 0.5,
"groupWidth": 0.7,
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom"
},
"orientation": "auto",
"showValue": "auto",
"text": {},
"tooltip": {
"mode": "single"
}
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "table",
"group": [],
"metricColumn": "none",
"queryType": "randomWalk",
"rawQuery": true,
"rawSql": "with operation_history as(\n\tSELECT\n\t\tjc.issue_id,\n\t\tjc.created as operation_time,\n\t\tjci.changelog_id,\n\t\tjci.from,\n\t\tjci.from_string,\n\t\tjci.to,\n\t\tjci.to_string,\n\t\tji.created as issue_creation_time,\n\t\tcase \n\t\t\twhen lag(jc.created) over(PARTITION BY jc.issue_id ORDER BY jc.created ASC) is not null then\n\t\t\tTIMESTAMPDIFF(MINUTE, lag(jc.created) over(PARTITION BY jc.issue_id ORDER BY jc.created ASC), jc.created)\n\t\t\telse TIMESTAMPDIFF(MINUTE, ji.created, jc.created) end as time_in_status\n\tFROM\n\t\tjira_changelogs jc\n\t\tJOIN jira_changelog_items jci ON jc.changelog_id = jci.changelog_id\n\t\tJOIN jira_issues ji ON jc.issue_id = ji.issue_id\n\t\tjoin jira_board_issues jbi on ji.issue_id = jbi.issue_id\n\tWHERE\n\t\tjci.field = 'status'\n\t\tand ji.std_type = 'Requirement'\n\t\tand ji.std_status = 'Resolved'\n\t\tand $__timeFilter(ji.resolution_date)\n and jbi.board_id = $board_id\n)\n\nSELECT\n now() as time,\n\tfrom_string as \"Requirement Status\",\n\tavg(time_in_status)/1440 as \"Time in Status\"\nFROM operation_history\nGROUP BY 1,2\nORDER BY 3 desc",
"refId": "A",
"select": [
[
{
"params": [
"value"
],
"type": "column"
}
]
],
"timeColumn": "time",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"timeFrom": null,
"timeShift": null,
"title": "Average Requirement Lead Time by Status",
"type": "barchart"
},
{
"datasource": "mysql",
"description": "1. Compare the average time spent in each state of a requirement in the last 2 months.\n2. The requirements being calculated are the requirements delivered in the last 2 months.",
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"axisLabel": "Lead Time(day)",
"axisPlacement": "auto",
"axisSoftMin": 0,
"fillOpacity": 74,
"gradientMode": "none",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"lineWidth": 1
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": 80
}
]
},
"unit": "short"
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 24,
"x": 0,
"y": 33
},
"id": 98,
"options": {
"barWidth": 0.9,
"groupWidth": 0.6,
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom"
},
"orientation": "auto",
"showValue": "auto",
"text": {},
"tooltip": {
"mode": "single"
}
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "table",
"group": [],
"metricColumn": "none",
"queryType": "randomWalk",
"rawQuery": true,
"rawSql": "with status_change_history as(\n\tSELECT\n\t\tjc.issue_id,\n\t\tjc.created as operation_time,\n\t\tjci.changelog_id,\n\t\tjci.from,\n\t\tjci.from_string,\n\t\tjci.to,\n\t\tjci.to_string,\n\t\tji.created as issue_creation_time,\n\t\tlag(jc.created) over(PARTITION BY jc.issue_id ORDER BY jc.created ASC) as last_operation_time,\n\t\tcase \n\t\t\twhen lag(jc.created) over(PARTITION BY jc.issue_id ORDER BY jc.created ASC) is not null then\n\t\t\tTIMESTAMPDIFF(MINUTE, lag(jc.created) over(PARTITION BY jc.issue_id ORDER BY jc.created ASC), jc.created)\n\t\t\telse TIMESTAMPDIFF(MINUTE, ji.created, jc.created) end as time_in_status\n\tFROM\n\t\tjira_changelogs jc\n\t\tJOIN jira_changelog_items jci ON jc.changelog_id = jci.changelog_id\n\t\tJOIN jira_issues ji ON jc.issue_id = ji.issue_id\n\t\tjoin jira_board_issues jbi on ji.issue_id = jbi.issue_id\n\tWHERE\n\t\tjci.field = 'status'\n\t\tand ji.std_type = 'Requirement'\n\t\tand ji.std_status = 'Resolved'\n\t\tand $__timeFilter(ji.resolution_date)\n and jbi.board_id = $board_id\n),\n\ntime_in_status as(\n\tSELECT \n\t\tDATE_ADD(date(issue_creation_time), INTERVAL -DAY(date(issue_creation_time))+1 DAY) as time,\n\t\tfrom_string,\n\t\tavg(time_in_status)/60 as time_in_status\n\tFROM status_change_history\n\tGROUP BY 1,2\n),\n\nlast_month as(\n\tselect \n\t\tDATE_ADD(date(CURDATE()), INTERVAL -DAY(date(CURDATE()))+1 DAY) as last_month\n),\n\nmonth_before_last_month as(\n\tSELECT \n\t\tDATE_ADD(DATE_ADD(date(CURDATE()), INTERVAL -DAY(date(CURDATE()))+1 DAY), INTERVAL -1 MONTH) as two_month_before\n),\n\n\nlast_month_record as(\n\tSELECT\n\t\tfrom_string as issue_status,\n\t\tcase when time in (SELECT last_month from last_month) then time_in_status else null end as last_month\n\tfrom time_in_status\n\tWHERE \n\t\ttime in (SELECT last_month from last_month)\n),\n\ntwo_month_before_record as(\n\tSELECT\n\t\tfrom_string as issue_status,\n\t\tcase when time in (SELECT two_month_before from month_before_last_month) then time_in_status else null end as two_month_before\n\tfrom time_in_status\n\tWHERE \n\t\ttime in (SELECT two_month_before from month_before_last_month)\n)\n\nSELECT\n\tnow() as time,\n\tmbr.two_month_before AS \"The Month Before Last\",\n\tlmr.last_month AS \"Last Month\",\n\tlmr.issue_status\nFROM last_month_record lmr\nleft join two_month_before_record mbr on lmr.issue_status = mbr.issue_status ",
"refId": "A",
"select": [
[
{
"params": [
"value"
],
"type": "column"
}
]
],
"timeColumn": "time",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"timeFrom": null,
"timeShift": null,
"title": "Average Requirement Lead Time by Status in Last 2 Months",
"type": "barchart"
},
{
"datasource": null,
"gridPos": {
"h": 4,
"w": 24,
"x": 0,
"y": 39
},
"id": 92,
"options": {
"content": "<div style=\"display: block;text-align: center;margin-top: 56px;\">\n <div style=\"display: inline-flex;\">\n <img src=\"/public/img/lake/1.png\" alt=\"No.1\" width=\"56\">\n <p style=\"font-size:24px; margin:10px; color:#BFC1C8;\"><b>Requirement<b></b></b></p><b><b>\n </div>\n</div>",
"mode": "html"
},
"pluginVersion": "8.0.6",
"targets": [
{
"queryType": "randomWalk",
"refId": "A"
}
],
"transparent": true,
"type": "text"
},
{
"datasource": "mysql",
"description": "1. Total number of requirements created.\n2. The requirements being calculated are filtered by \"requirement creation time\" (time filter at the upper-right corner) and \"Jira board\" (\"Choose Board\" filter at the upper-left corner)",
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 6,
"x": 0,
"y": 43
},
"id": 2,
"options": {
"colorMode": "value",
"graphMode": "area",
"justifyMode": "auto",
"orientation": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"text": {},
"textMode": "auto"
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "time_series",
"group": [],
"metricColumn": "none",
"queryType": "randomWalk",
"rawQuery": true,
"rawSql": "select \r\n now() as time,\r\n count(*) as value\r\nfrom jira_issues ji\r\n join jira_board_issues jbi on ji.issue_id = jbi.issue_id\r\nwhere \r\n std_type = 'Requirement'\r\n and created is not null \r\n and $__timeFilter(created)\r\n and jbi.board_id = $board_id\r\ngroup by 1;",
"refId": "A",
"select": [
[
{
"params": [
"value"
],
"type": "column"
}
]
],
"timeColumn": "time",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"title": "Requirement Count",
"type": "stat"
},
{
"datasource": "mysql",
"description": "1. The number of requirements created over time.\n2. The time granularity can be switched to week or month by \"Time Interval\" above. \n3. When Time Interval is set to \"month\", the requirement_count of \"2021-06-01\" refers to the number of requirements whose creation time falls under [2020-06-01, 2020-07-01)",
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"axisLabel": "",
"axisPlacement": "auto",
"barAlignment": 0,
"drawStyle": "line",
"fillOpacity": 0,
"gradientMode": "none",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"lineInterpolation": "linear",
"lineWidth": 1,
"pointSize": 5,
"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
}
]
},
"unit": "short"
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 18,
"x": 6,
"y": 43
},
"id": 6,
"interval": null,
"options": {
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "single"
}
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "time_series",
"group": [],
"metricColumn": "none",
"queryType": "randomWalk",
"rawQuery": true,
"rawSql": "with _requirement as(\r\n select\r\n ji.issue_id AS id,\r\n DATE_ADD(date(created), INTERVAL -$interval(date(created))+1 DAY) as time\r\n from\r\n jira_issues ji\r\n join jira_board_issues jbi on ji.issue_id = jbi.issue_id\r\n where \r\n std_type = 'Requirement'\r\n and created is not null \r\n and $__timeFilter(created)\r\n and jbi.board_id = $board_id\r\n)\r\n\r\nselect\r\n timestamp(time) as time,\r\n count(distinct id) as requirement_count\r\nfrom _requirement\r\ngroup by 1\r\norder by 1 asc",
"refId": "A",
"select": [
[
{
"params": [
"value"
],
"type": "column"
}
]
],
"timeColumn": "time",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"timeFrom": null,
"timeShift": null,
"title": "Requirement Count over Time",
"type": "timeseries"
},
{
"datasource": "mysql",
"description": "1. The number of requirements under different Jira Epics.",
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"axisLabel": "No. of Requirement",
"axisPlacement": "auto",
"axisSoftMin": 0,
"fillOpacity": 80,
"gradientMode": "none",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"lineWidth": 1
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": 80
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 24,
"x": 0,
"y": 49
},
"id": 7,
"options": {
"barWidth": 0.5,
"groupWidth": 0.7,
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom"
},
"orientation": "auto",
"showValue": "auto",
"text": {},
"tooltip": {
"mode": "single"
}
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "table",
"group": [],
"metricColumn": "none",
"queryType": "randomWalk",
"rawQuery": true,
"rawSql": "with _requirement as(\r\n select\r\n ji.issue_id,\r\n ji.epic_key\r\n from\r\n jira_issues ji\r\n join jira_board_issues jbi on ji.issue_id = jbi.issue_id\r\n where \r\n std_type = 'Requirement'\r\n and created is not null\r\n and epic_key is not null\r\n and epic_key != ''\r\n and std_status = 'Resolved'\r\n and $__timeFilter(created)\r\n and jbi.board_id = $board_id\r\n)\r\n\r\nselect \r\n now() as time,\r\n epic_key as \"Epic Key\",\r\n count(*) as value\r\nfrom _requirement\r\ngroup by 1,2\r\norder by 3 desc\r\nlimit 20",
"refId": "A",
"select": [
[
{
"params": [
"value"
],
"type": "column"
}
]
],
"timeColumn": "time",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"timeFrom": null,
"timeShift": null,
"title": "Requirement Count by Epic",
"type": "barchart"
},
{
"datasource": "mysql",
"description": "1. Number of requirements that have been delivered.\n2. A requirement is delivered when its status equals 'delivered'.\n3. The requirements being calculated are filtered by \"requirement creation time\" (time filter at the upper-right corner) and \"Jira board\" (\"Choose Board\" filter at the upper-left corner)",
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
}
]
},
"unit": "none"
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 6,
"x": 0,
"y": 55
},
"id": 25,
"options": {
"colorMode": "value",
"graphMode": "area",
"justifyMode": "auto",
"orientation": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"text": {},
"textMode": "auto"
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "time_series",
"group": [],
"metricColumn": "none",
"queryType": "randomWalk",
"rawQuery": true,
"rawSql": "select\r\n now() as time,\r\n count(*) as delivered_count\r\nfrom jira_issues ji\r\n join jira_board_issues jbi on ji.issue_id = jbi.issue_id\r\nwhere \r\n std_type = 'Requirement'\r\n and ji.std_status = 'Resolved'\r\n and $__timeFilter(created)\r\n and jbi.board_id = $board_id",
"refId": "A",
"select": [
[
{
"params": [
"value"
],
"type": "column"
}
]
],
"timeColumn": "time",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"title": "Delivered Requirement Count",
"type": "stat"
},
{
"datasource": "mysql",
"description": "Delivered Requirement Count/Requirement Count (Total)",
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "percentage",
"steps": [
{
"color": "red",
"value": null
},
{
"color": "green",
"value": 50
}
]
},
"unit": "percentunit"
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 6,
"x": 6,
"y": 55
},
"id": 22,
"options": {
"colorMode": "value",
"graphMode": "area",
"justifyMode": "auto",
"orientation": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"text": {},
"textMode": "auto"
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "time_series",
"group": [],
"metricColumn": "none",
"queryType": "randomWalk",
"rawQuery": true,
"rawSql": "with _requirement as(\r\n select\r\n count(distinct ji.issue_id) as total_count,\r\n count(distinct case when ji.std_status = 'Resolved' then ji.issue_id else null end) as delivered_count\r\n from jira_issues ji\r\n join jira_board_issues jbi on ji.issue_id = jbi.issue_id\r\n where \r\n std_type = 'Requirement'\r\n and $__timeFilter(created)\r\n and jbi.board_id = $board_id\r\n)\r\n\r\n\r\nselect \r\n now() as time,\r\n 1.0 * delivered_count/total_count as requirement_delivery_rate\r\nfrom _requirement",
"refId": "A",
"select": [
[
{
"params": [
"value"
],
"type": "column"
}
]
],
"timeColumn": "time",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"title": "Requirement Delivery Rate",
"type": "stat"
},
{
"cacheTimeout": null,
"datasource": "mysql",
"description": "1. The requirement delivery rate over time.\n2. When Time Interval is set to \"month\", value \"requirement_delivery_rate\" of \"2021-06-01\" calculates the requirements whose creation time falls under [2020-06-01, 2020-07-01)",
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"axisLabel": "Delivery Rate (%)",
"axisPlacement": "auto",
"barAlignment": 0,
"drawStyle": "line",
"fillOpacity": 0,
"gradientMode": "none",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"lineInterpolation": "linear",
"lineWidth": 1,
"pointSize": 5,
"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
}
]
},
"unit": "percentunit"
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 12,
"x": 12,
"y": 55
},
"id": 23,
"links": [],
"options": {
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "single"
}
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "time_series",
"group": [],
"metricColumn": "none",
"queryType": "randomWalk",
"rawQuery": true,
"rawSql": "with _requirement as(\r\n select\r\n DATE_ADD(date(created), INTERVAL -$interval(date(created))+1 DAY) as time,\r\n count(distinct ji.issue_id) as total_count,\r\n count(distinct case when ji.std_status = 'Resolved' then ji.issue_id else null end) as delivered_count\r\n from jira_issues ji\r\n join jira_board_issues jbi on ji.issue_id = jbi.issue_id\r\n where \r\n std_type = 'Requirement'\r\n and $__timeFilter(created)\r\n and jbi.board_id = $board_id\r\n group by 1\r\n)\r\n\r\n\r\nselect \r\n timestamp(time) as time,\r\n 1.0 * delivered_count/total_count as requirement_delivery_rate\r\nfrom _requirement\r\norder by 1",
"refId": "A",
"select": [
[
{
"params": [
"value"
],
"type": "column"
}
]
],
"timeColumn": "time",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"timeFrom": null,
"timeShift": null,
"title": "Requirement Delivery Rate over Time",
"type": "timeseries"
},
{
"cacheTimeout": null,
"datasource": "mysql",
"description": "The average delivery rate of requirements under different Jira Epics.",
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"axisLabel": "Delivery Rate(%)",
"axisPlacement": "auto",
"axisSoftMin": 0,
"fillOpacity": 80,
"gradientMode": "none",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"lineWidth": 1
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": 80
}
]
},
"unit": "percentunit"
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 24,
"x": 0,
"y": 61
},
"id": 24,
"links": [],
"options": {
"barWidth": 0.5,
"groupWidth": 0.7,
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom"
},
"orientation": "auto",
"showValue": "auto",
"text": {},
"tooltip": {
"mode": "single"
}
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "table",
"group": [],
"metricColumn": "none",
"queryType": "randomWalk",
"rawQuery": true,
"rawSql": "with _requirement as(\r\n select\r\n ji.epic_key as metric,\r\n count(distinct ji.issue_id) as total_count,\r\n count(distinct case when ji.std_status = 'Resolved' then ji.issue_id else null end) as delivered_count\r\n from jira_issues ji\r\n join jira_board_issues jbi on ji.issue_id = jbi.issue_id\r\n where \r\n std_type = 'Requirement'\r\n and epic_key is not null\r\n and epic_key != ''\r\n and $__timeFilter(created)\r\n and jbi.board_id = $board_id\r\n group by 1\r\n)\r\n\r\n\r\nselect \r\n now() as time,\r\n metric,\r\n 1.0 * delivered_count/total_count as requirement_delivery_rate\r\nfrom _requirement\r\norder by 3 desc\r\nlimit 20",
"refId": "A",
"select": [
[
{
"params": [
"value"
],
"type": "column"
}
]
],
"timeColumn": "time",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"timeFrom": null,
"timeShift": null,
"title": "Requirement Delivery Rate by Epic",
"type": "barchart"
},
{
"datasource": "mysql",
"description": "1. The average story point (workload) of requirements.\n2. The requirements being calculated are filtered by \"requirement creation time\" (time filter at the upper-right corner) and \"Jira board\" (\"Choose Board\" filter at the upper-left corner)",
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"decimals": 1,
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 6,
"x": 0,
"y": 67
},
"id": 93,
"options": {
"colorMode": "value",
"graphMode": "area",
"justifyMode": "auto",
"orientation": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"text": {},
"textMode": "auto"
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "time_series",
"group": [],
"metricColumn": "none",
"queryType": "randomWalk",
"rawQuery": true,
"rawSql": "select \r\n now() as time,\r\n avg(std_story_point) as value\r\nfrom jira_issues ji\r\n join jira_board_issues jbi on ji.issue_id = jbi.issue_id\r\nwhere \r\n std_type = 'Requirement'\r\n and std_story_point != 0\r\n and $__timeFilter(created)\r\n and jbi.board_id = $board_id\r\ngroup by 1;",
"refId": "A",
"select": [
[
{
"params": [
"value"
],
"type": "column"
}
]
],
"timeColumn": "time",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"title": "Avg Requirement Granunarity(Story Point)",
"type": "stat"
},
{
"datasource": "mysql",
"description": "1. The story point/estimated hours at which 80% requirements' story point/estimated hours lies below it.\n2. The requirements being calculated are filtered by \"requirement creation time\" (time filter at the upper-right corner) and \"Jira board\" (\"Choose Board\" filter at the upper-left corner)",
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 6,
"x": 6,
"y": 67
},
"id": 94,
"options": {
"colorMode": "value",
"graphMode": "area",
"justifyMode": "auto",
"orientation": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"text": {},
"textMode": "auto"
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "time_series",
"group": [],
"metricColumn": "none",
"queryType": "randomWalk",
"rawQuery": true,
"rawSql": "with _ranks as(\r\n select \r\n std_story_point,\r\n percent_rank() over (order by std_story_point asc) as ranks\r\n from jira_issues ji\r\n join jira_board_issues jbi on ji.issue_id = jbi.issue_id\r\n where \r\n std_type = 'Requirement'\r\n and std_story_point != 0\r\n and $__timeFilter(created)\r\n and jbi.board_id = $board_id\r\n)\r\n\r\nselect\r\n now() as time,\r\n max(std_story_point) as value\r\nfrom _ranks\r\nwhere \r\n ranks <= 0.8\r\ngroup by 1",
"refId": "A",
"select": [
[
{
"params": [
"value"
],
"type": "column"
}
]
],
"timeColumn": "time",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"title": "80th Percentile Requirement Granunarity(Story point)",
"type": "stat"
},
{
"aliasColors": {},
"bars": false,
"dashLength": 10,
"dashes": false,
"datasource": "mysql",
"description": "The average and 80th percentile requirement granularity over time.",
"fieldConfig": {
"defaults": {
"unit": "short"
},
"overrides": []
},
"fill": 1,
"fillGradient": 0,
"gridPos": {
"h": 6,
"w": 12,
"x": 12,
"y": 67
},
"hiddenSeries": false,
"id": 96,
"interval": "",
"legend": {
"avg": false,
"current": false,
"max": false,
"min": false,
"show": true,
"total": false,
"values": false
},
"lines": true,
"linewidth": 1,
"nullPointMode": "null",
"options": {
"alertThreshold": true
},
"percentage": false,
"pluginVersion": "8.0.6",
"pointradius": 2,
"points": false,
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
"stack": false,
"steppedLine": false,
"targets": [
{
"format": "time_series",
"group": [],
"metricColumn": "none",
"rawQuery": true,
"rawSql": "with _requirement as(\r\n select \r\n ji.issue_id,\r\n DATE_ADD(date(resolution_date), INTERVAL -$interval(date(resolution_date))+1 DAY) as time,\r\n std_story_point\r\n from jira_issues ji\r\n join jira_board_issues jbi on ji.issue_id = jbi.issue_id\r\n where \r\n std_type = 'Requirement'\r\n and std_story_point != 0\r\n and $__timeFilter(created)\r\n and jbi.board_id = $board_id\r\n)\r\n\r\nselect \r\n timestamp(time) as time,\r\n avg(std_story_point) as average_story_point\r\nfrom _requirement\r\ngroup by 1\r\norder by 1 asc",
"refId": "A",
"select": [
[
{
"params": [
"progress"
],
"type": "column"
}
]
],
"table": "ca_analysis",
"timeColumn": "create_time",
"timeColumnType": "timestamp",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"thresholds": [],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
"title": "Requirement Granularity over Time",
"tooltip": {
"shared": true,
"sort": 0,
"value_type": "individual"
},
"type": "graph",
"xaxis": {
"buckets": null,
"mode": "time",
"name": null,
"show": true,
"values": []
},
"yaxes": [
{
"$$hashKey": "object:242",
"format": "short",
"label": "Story Points",
"logBase": 1,
"max": null,
"min": null,
"show": true
},
{
"$$hashKey": "object:243",
"format": "short",
"label": "",
"logBase": 1,
"max": null,
"min": null,
"show": true
}
],
"yaxis": {
"align": false,
"alignLevel": null
}
},
{
"aliasColors": {},
"bars": false,
"dashLength": 10,
"dashes": false,
"datasource": "mysql",
"description": "1. The cumulative distribution of requirement granularity.\n2. Each point refers to the percent rank of a value of granularity.",
"fill": 0,
"fillGradient": 4,
"gridPos": {
"h": 6,
"w": 24,
"x": 0,
"y": 73
},
"hiddenSeries": false,
"id": 95,
"legend": {
"alignAsTable": false,
"avg": false,
"current": false,
"max": false,
"min": false,
"rightSide": false,
"show": false,
"total": false,
"values": false
},
"lines": false,
"linewidth": 8,
"nullPointMode": "null",
"options": {
"alertThreshold": false
},
"percentage": false,
"pluginVersion": "8.0.6",
"pointradius": 5,
"points": true,
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
"stack": false,
"steppedLine": false,
"targets": [
{
"format": "time_series",
"group": [],
"metricColumn": "none",
"rawQuery": true,
"rawSql": "with _ranks as(\r\n select \r\n round(std_story_point) as std_story_point\r\n from jira_issues ji\r\n join jira_board_issues jbi on ji.issue_id = jbi.issue_id\r\n where \r\n std_type = 'Requirement'\r\n and std_story_point != 0\r\n and $__timeFilter(created)\r\n and jbi.board_id = $board_id\r\n order by std_story_point asc\r\n)\r\n\r\nselect \r\n now() as time,\r\n lpad(std_story_point, 4, ' ') as metric,\r\n percent_rank() over (order by std_story_point asc) as value\r\nfrom _ranks\r\norder by std_story_point asc",
"refId": "A",
"select": [
[
{
"params": [
"progress"
],
"type": "column"
}
]
],
"table": "ca_analysis",
"timeColumn": "create_time",
"timeColumnType": "timestamp",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"thresholds": [
{
"$$hashKey": "object:469",
"colorMode": "ok",
"fill": true,
"line": true,
"op": "lt",
"value": 0.8,
"yaxis": "right"
}
],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
"title": "Requirement Granularity (Cumulative Distribution)",
"tooltip": {
"shared": false,
"sort": 0,
"value_type": "individual"
},
"transformations": [],
"type": "graph",
"xaxis": {
"buckets": null,
"mode": "series",
"name": null,
"show": true,
"values": [
"current"
]
},
"yaxes": [
{
"$$hashKey": "object:76",
"format": "percentunit",
"label": "Percent Rank (%)",
"logBase": 1,
"max": "1.2",
"min": null,
"show": true
},
{
"$$hashKey": "object:77",
"format": "short",
"label": null,
"logBase": 1,
"max": null,
"min": null,
"show": false
}
],
"yaxis": {
"align": false,
"alignLevel": null
}
},
{
"datasource": null,
"gridPos": {
"h": 4,
"w": 24,
"x": 0,
"y": 79
},
"id": 71,
"options": {
"content": "<div style=\"display: block;text-align: center;margin-top: 56px;\">\n <div style=\"display: inline-flex;\">\n <img src=\"/public/img/lake/2.png\" alt=\"No.2\" width=\"56\">\n <p style=\"font-size:24px; margin:10px; color:#BFC1C8;\"><b>Development<b></b></b></p><b><b>\n </div>\n</div>",
"mode": "html"
},
"pluginVersion": "8.0.6",
"targets": [
{
"queryType": "randomWalk",
"refId": "A"
}
],
"transparent": true,
"type": "text"
},
{
"datasource": "mysql",
"description": "1. Average PR/MR review time.\n2. PR/MR review time refers to the time between the creation time and merged time of a PR/MR.\n3. The PR/MR being calculated are filtered by \"PR/MR creation time\" (time filter at the upper-right corner) and \"Gitlab repo\"(\"Choose Repo\" filter at the upper-left corner)",
"fieldConfig": {
"defaults": {
"decimals": 1,
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": 3
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 6,
"x": 0,
"y": 83
},
"id": 80,
"options": {
"colorMode": "value",
"graphMode": "area",
"justifyMode": "auto",
"orientation": "auto",
"reduceOptions": {
"calcs": [
"mean"
],
"fields": "",
"values": false
},
"text": {},
"textMode": "auto"
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "time_series",
"group": [],
"metricColumn": "none",
"rawQuery": true,
"rawSql": "select \n now() as time,\n avg(TIMESTAMPDIFF(MINUTE,gitlab_created_at,merged_at))/1440 as value\nfrom gitlab_merge_requests\nWHERE\n merged_at is not null\n and $__timeFilter(gitlab_created_at)\n and project_id = $repo_id",
"refId": "A",
"select": [
[
{
"params": [
"progress"
],
"type": "column"
}
]
],
"table": "ca_analysis",
"timeColumn": "create_time",
"timeColumnType": "timestamp",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"timeFrom": null,
"timeShift": null,
"title": "Avg Pull Request Review Time (day)",
"type": "stat"
},
{
"datasource": "mysql",
"description": "1. The 80th percentile PR/MR review time.\n2. The PR/MR being calculated are filtered by \"PR/MR creation time\" (time filter at the upper-right corner) and \"Gitlab repo\"(\"Choose Repo\" filter at the upper-left corner)",
"fieldConfig": {
"defaults": {
"decimals": 1,
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": 7
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 6,
"x": 6,
"y": 83
},
"id": 83,
"options": {
"colorMode": "value",
"graphMode": "area",
"justifyMode": "auto",
"orientation": "auto",
"reduceOptions": {
"calcs": [
"mean"
],
"fields": "",
"values": false
},
"text": {},
"textMode": "auto"
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "time_series",
"group": [],
"metricColumn": "none",
"rawQuery": true,
"rawSql": "with _ranks as(\n select \n TIMESTAMPDIFF(SECOND,gitlab_created_at,merged_at)/86400 as metric,\n percent_rank() over (order by TIMESTAMPDIFF(MINUTE,gitlab_created_at,merged_at) asc) as ranks\n from gitlab_merge_requests\n WHERE\n merged_at is not null\n and $__timeFilter(gitlab_created_at)\n and project_id = $repo_id\n )\n \nselect\n now() as time,\n max(metric) as value\nfrom _ranks\nwhere \n ranks <= 0.8\ngroup by 1",
"refId": "A",
"select": [
[
{
"params": [
"progress"
],
"type": "column"
}
]
],
"table": "ca_analysis",
"timeColumn": "create_time",
"timeColumnType": "timestamp",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"timeFrom": null,
"timeShift": null,
"title": "80th Percentile Pull Request Review Time(day)",
"type": "stat"
},
{
"datasource": "mysql",
"description": "1. The average and 80th percentile PR/MR review time over time.\n2. The time granularity can be switched to week or month by \"Time Interval\" above. \n3. When Time Interval is set to \"month\", the average review time of \"2021-06-01\" refers to the review time of PR/MR whose creation time falls under [2020-06-01, 2020-07-01)",
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"axisLabel": "Review Time (day)",
"axisPlacement": "auto",
"axisSoftMin": -3,
"barAlignment": 0,
"drawStyle": "line",
"fillOpacity": 0,
"gradientMode": "none",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"lineInterpolation": "linear",
"lineWidth": 1,
"pointSize": 5,
"scaleDistribution": {
"type": "linear"
},
"showPoints": "auto",
"spanNulls": false,
"stacking": {
"group": "A",
"mode": "none"
},
"thresholdsStyle": {
"mode": "off"
}
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
}
]
},
"unit": "none"
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 12,
"x": 12,
"y": 83
},
"id": 82,
"options": {
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "single"
}
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "time_series",
"group": [],
"metricColumn": "none",
"rawQuery": true,
"rawSql": "with reviewed_mr as(\n select\n DATE_ADD(date(gitlab_created_at), INTERVAL -$interval(date(gitlab_created_at))+1 DAY) as time,\n TIMESTAMPDIFF(SECOND,first_comment_time,merged_at)/86400 as review_time\n from gitlab_merge_requests\n WHERE\n merged_at is not null\n and $__timeFilter(gitlab_created_at)\n and project_id = $repo_id\n)\n\nselect \n timestamp(time) as time,\n avg(review_time) as \"Average Review Time\"\nfrom reviewed_mr\ngroup by 1\norder by 1 asc",
"refId": "A",
"select": [
[
{
"params": [
"progress"
],
"type": "column"
}
]
],
"table": "ca_analysis",
"timeColumn": "create_time",
"timeColumnType": "timestamp",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"timeFrom": null,
"timeShift": null,
"title": "Pull Request Review Time over Time",
"type": "timeseries"
},
{
"datasource": "mysql",
"description": "1. Total number of commits created.\n2. The commits being calculated are filtered by \"authored_date\" (time filter at the upper-right corner) and \"Gitlab repo\"(\"Choose Repo\" filter at the upper-left corner)",
"fieldConfig": {
"defaults": {
"decimals": 1,
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": 80
}
]
},
"unit": "short"
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 6,
"x": 0,
"y": 89
},
"id": 34,
"options": {
"colorMode": "value",
"graphMode": "area",
"justifyMode": "auto",
"orientation": "auto",
"reduceOptions": {
"calcs": [
"mean"
],
"fields": "",
"values": false
},
"text": {},
"textMode": "auto"
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "time_series",
"group": [],
"metricColumn": "none",
"rawQuery": true,
"rawSql": "SELECT\n now() AS \"time\",\n count(*) as value\nFROM gitlab_commits\nWHERE\n $__timeFilter(authored_date)\n and project_id = $repo_id\ngroup by 1\nORDER BY 1",
"refId": "A",
"select": [
[
{
"params": [
"progress"
],
"type": "column"
}
]
],
"table": "ca_analysis",
"timeColumn": "create_time",
"timeColumnType": "timestamp",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"timeFrom": null,
"timeShift": null,
"title": "Commit Count",
"type": "stat"
},
{
"datasource": "mysql",
"description": "1. Number of commits created over time.\n2. When Time Interval is set to \"month\", the commit_count\" of \"2021-06-01\" calculates the commits whose creation time falls under [2020-06-01, 2020-07-01)",
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"axisLabel": "Commit Count",
"axisPlacement": "auto",
"barAlignment": 0,
"drawStyle": "line",
"fillOpacity": 0,
"gradientMode": "none",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"lineInterpolation": "linear",
"lineWidth": 1,
"pointSize": 5,
"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
}
]
},
"unit": "none"
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 12,
"x": 6,
"y": 89
},
"id": 36,
"options": {
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "single"
}
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "time_series",
"group": [],
"metricColumn": "none",
"rawQuery": true,
"rawSql": "with _commits as(\n SELECT\n DATE_ADD(date(authored_date), INTERVAL -$interval(date(authored_date))+1 DAY) as time,\n count(*) as commit_count\n FROM gitlab_commits\n WHERE\n $__timeFilter(authored_date)\n and project_id = $repo_id\n group by 1\n)\n\nSELECT \n timestamp(time) as time,\n commit_count as \"Commit Count\"\nFROM _commits\nORDER BY 1",
"refId": "A",
"select": [
[
{
"params": [
"progress"
],
"type": "column"
}
]
],
"table": "ca_analysis",
"timeColumn": "create_time",
"timeColumnType": "timestamp",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"timeFrom": null,
"timeShift": null,
"title": "Commit Count over Time",
"type": "timeseries"
},
{
"aliasColors": {},
"bars": true,
"dashLength": 10,
"dashes": false,
"datasource": "mysql",
"description": "The number of commits from different repos.",
"fill": 1,
"fillGradient": 0,
"gridPos": {
"h": 6,
"w": 6,
"x": 18,
"y": 89
},
"hiddenSeries": false,
"id": 37,
"legend": {
"avg": false,
"current": false,
"max": false,
"min": false,
"show": false,
"total": false,
"values": false
},
"lines": false,
"linewidth": 1,
"nullPointMode": "null",
"options": {
"alertThreshold": true
},
"percentage": false,
"pluginVersion": "8.0.6",
"pointradius": 2,
"points": false,
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
"stack": false,
"steppedLine": false,
"targets": [
{
"format": "time_series",
"group": [],
"metricColumn": "none",
"rawQuery": true,
"rawSql": "SELECT\n now() as time,\n gp.name as metric,\n count(*) as value\nFROM gitlab_commits gc\n join gitlab_projects gp on gc.project_id = gp.gitlab_id\nWHERE\n $__timeFilter(authored_date)\n and gc.project_id = $repo_id\ngroup by 1,2\norder by 1",
"refId": "A",
"select": [
[
{
"params": [
"progress"
],
"type": "column"
}
]
],
"table": "ca_analysis",
"timeColumn": "create_time",
"timeColumnType": "timestamp",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"thresholds": [],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
"title": "Commit Count by Repo",
"tooltip": {
"shared": false,
"sort": 0,
"value_type": "individual"
},
"type": "graph",
"xaxis": {
"buckets": null,
"mode": "series",
"name": null,
"show": true,
"values": [
"total"
]
},
"yaxes": [
{
"$$hashKey": "object:89",
"format": "short",
"label": null,
"logBase": 1,
"max": null,
"min": null,
"show": true
},
{
"$$hashKey": "object:90",
"format": "short",
"label": null,
"logBase": 1,
"max": null,
"min": null,
"show": true
}
],
"yaxis": {
"align": false,
"alignLevel": null
}
},
{
"datasource": "mysql",
"description": "The number of commits from different commit authors.",
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"axisLabel": "",
"axisPlacement": "auto",
"axisSoftMin": 0,
"fillOpacity": 80,
"gradientMode": "none",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"lineWidth": 1
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": 80
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 24,
"x": 0,
"y": 95
},
"id": 38,
"options": {
"barWidth": 0.5,
"groupWidth": 0.7,
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom"
},
"orientation": "auto",
"showValue": "auto",
"text": {},
"tooltip": {
"mode": "single"
}
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "table",
"group": [],
"metricColumn": "none",
"rawQuery": true,
"rawSql": "SELECT\n now() as time,\n gc.author_name as \"Author Name\",\n count(*) as value\nFROM gitlab_commits gc \n join gitlab_projects gp on gc.project_id = gp.gitlab_id\nWHERE\n $__timeFilter(authored_date)\n and gc.project_id = $repo_id\ngroup by 1,2\norder by 3 desc\nlimit 20",
"refId": "A",
"select": [
[
{
"params": [
"progress"
],
"type": "column"
}
]
],
"table": "ca_analysis",
"timeColumn": "create_time",
"timeColumnType": "timestamp",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"timeFrom": null,
"timeShift": null,
"title": "Commit Count by Author",
"type": "barchart"
},
{
"datasource": "mysql",
"description": "1. Sum of the number of added lines of code under all commits.\n2. The commits being calculated are filtered by \"authored_date\" (time filter at the upper-right corner) and \"Gitlab repo\"(\"Choose Repo\" filter at the upper-left corner)",
"fieldConfig": {
"defaults": {
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": 80
}
]
},
"unit": "short"
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 6,
"x": 0,
"y": 101
},
"id": 42,
"options": {
"colorMode": "value",
"graphMode": "area",
"justifyMode": "center",
"orientation": "auto",
"reduceOptions": {
"calcs": [
"mean"
],
"fields": "",
"values": false
},
"text": {},
"textMode": "auto"
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "time_series",
"group": [],
"metricColumn": "none",
"rawQuery": true,
"rawSql": "SELECT\n now() AS time,\n sum(additions) as value\nFROM gitlab_commits gc\n join gitlab_projects gp on gc.project_id = gp.gitlab_id \nWHERE\n message not like '%Merge branch%'\n and $__timeFilter(authored_date)\n and gc.project_id = $repo_id\ngroup by 1\nORDER BY 1",
"refId": "A",
"select": [
[
{
"params": [
"progress"
],
"type": "column"
}
]
],
"table": "ca_analysis",
"timeColumn": "create_time",
"timeColumnType": "timestamp",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"timeFrom": null,
"timeShift": null,
"title": "Added LOC",
"type": "stat"
},
{
"datasource": "mysql",
"description": "1. Sum of the number of deleted lines of code under all commits.\n2. The commits being calculated are filtered by \"authored_date\" (time filter at the upper-right corner) and \"Gitlab repo\"(\"Choose Repo\" filter at the upper-left corner)",
"fieldConfig": {
"defaults": {
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": 80
}
]
},
"unit": "short"
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 6,
"x": 6,
"y": 101
},
"id": 43,
"options": {
"colorMode": "value",
"graphMode": "area",
"justifyMode": "center",
"orientation": "auto",
"reduceOptions": {
"calcs": [
"mean"
],
"fields": "",
"values": false
},
"text": {},
"textMode": "auto"
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "time_series",
"group": [],
"metricColumn": "none",
"rawQuery": true,
"rawSql": "SELECT\n now() AS time,\n sum(deletions) as value\nFROM gitlab_commits gc\n join gitlab_projects gp on gc.project_id = gp.gitlab_id \nWHERE\n message not like '%Merge branch%'\n and $__timeFilter(authored_date)\n and gc.project_id = $repo_id\ngroup by 1\nORDER BY 1",
"refId": "A",
"select": [
[
{
"params": [
"progress"
],
"type": "column"
}
]
],
"table": "ca_analysis",
"timeColumn": "create_time",
"timeColumnType": "timestamp",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"timeFrom": null,
"timeShift": null,
"title": "Deleted LOC",
"type": "stat"
},
{
"datasource": "mysql",
"description": "Added/deleted number of lines of code over time.",
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"axisLabel": "LOC",
"axisPlacement": "auto",
"barAlignment": 0,
"drawStyle": "line",
"fillOpacity": 0,
"gradientMode": "none",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"lineInterpolation": "linear",
"lineWidth": 1,
"pointSize": 5,
"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
}
]
},
"unit": "short"
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 12,
"x": 12,
"y": 101
},
"id": 47,
"options": {
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "single"
}
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "time_series",
"group": [],
"metricColumn": "none",
"rawQuery": true,
"rawSql": "with loc as(\n SELECT\n DATE_ADD(date(authored_date), INTERVAL -$interval(date(authored_date))+1 DAY) as time,\n sum(additions) as added_LOC,\n sum(deletions) as deleted_LOC\n FROM gitlab_commits\n WHERE\n message not like '%Merge branch%'\n and $__timeFilter(authored_date)\n and project_id = $repo_id\n group by 1\n)\n\nSELECT \n timestamp(time) as time,\n added_LOC as \"Added LOC\",\n deleted_LOC as \"Deleted LOC\"\nFROM loc\nORDER BY 1",
"refId": "A",
"select": [
[
{
"params": [
"progress"
],
"type": "column"
}
]
],
"table": "ca_analysis",
"timeColumn": "create_time",
"timeColumnType": "timestamp",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"timeFrom": null,
"timeShift": null,
"title": "Added and Deleted LOC over Time",
"type": "timeseries"
},
{
"datasource": "mysql",
"description": "The number of added/deleted LOC from different commit authors.",
"fieldConfig": {
"defaults": {
"color": {
"fixedColor": "orange",
"mode": "palette-classic"
},
"custom": {
"axisLabel": "LOC",
"axisPlacement": "auto",
"axisSoftMin": 0,
"fillOpacity": 80,
"gradientMode": "none",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"lineWidth": 1
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
}
]
},
"unit": "short"
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 24,
"x": 0,
"y": 107
},
"id": 49,
"options": {
"barWidth": 0.9,
"groupWidth": 0.6,
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom"
},
"orientation": "auto",
"showValue": "auto",
"text": {},
"tooltip": {
"mode": "multi"
}
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "table",
"group": [],
"metricColumn": "none",
"rawQuery": true,
"rawSql": "SELECT\n now() as time,\n sum(additions) as \"Added LOC\",\n sum(deletions) as \"Removed LOC\",\n gc.author_name\nFROM gitlab_commits gc \n join gitlab_projects gp on gc.project_id = gp.gitlab_id\nWHERE\n author_name is not null\n and message not like '%Merge branch%'\n and $__timeFilter(authored_date)\n and gc.project_id = $repo_id\ngroup by 1,4\norder by 2 desc\nlimit 20",
"refId": "A",
"select": [
[
{
"params": [
"progress"
],
"type": "column"
}
]
],
"table": "ca_analysis",
"timeColumn": "create_time",
"timeColumnType": "timestamp",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"timeFrom": null,
"timeShift": null,
"title": "Added and Deleted LOC by Author",
"type": "barchart"
},
{
"datasource": null,
"gridPos": {
"h": 4,
"w": 24,
"x": 0,
"y": 113
},
"id": 77,
"options": {
"content": "<div style=\"display: block;text-align: center;margin-top: 56px;\">\n <div style=\"display: inline-flex;\">\n <img src=\"/public/img/lake/3.png\" alt=\"No.3\" width=\"56\">\n <p style=\"font-size:24px; margin:10px; color:#BFC1C8;\"><b>Test<b></b></b></p><b><b>\n </div>\n</div>",
"mode": "html"
},
"pluginVersion": "8.0.6",
"targets": [
{
"queryType": "randomWalk",
"refId": "A"
}
],
"transparent": true,
"type": "text"
},
{
"datasource": "mysql",
"description": "1. The average bug age.\n2. Bug age refers to the length of time from bug creation to resolution.\n3. The bugs being calculated are filtered by \"bug resolution time\" (time filter at the upper-right corner) and \"Jira board\"(\"Choose Board\" filter at the upper-left corner)",
"fieldConfig": {
"defaults": {
"decimals": 1,
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": 7
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 6,
"x": 0,
"y": 117
},
"id": 53,
"options": {
"colorMode": "value",
"graphMode": "area",
"justifyMode": "auto",
"orientation": "auto",
"reduceOptions": {
"calcs": [
"mean"
],
"fields": "/^value$/",
"values": false
},
"text": {},
"textMode": "auto"
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "time_series",
"group": [],
"metricColumn": "none",
"rawQuery": true,
"rawSql": "select \r\n now() as time,\r\n avg(lead_time/1440) as value\r\nfrom jira_issues ji\r\n join jira_board_issues jbi on ji.issue_id = jbi.issue_id\r\nwhere \r\n std_type = 'Bug'\r\n and std_status = 'Resolved'\r\n and $__timeFilter(resolution_date)\r\n and jbi.board_id = $board_id\r\ngroup by 1;",
"refId": "A",
"select": [
[
{
"params": [
"progress"
],
"type": "column"
}
]
],
"table": "ca_analysis",
"timeColumn": "create_time",
"timeColumnType": "timestamp",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"timeFrom": null,
"timeShift": null,
"title": "Average Bug Age (day)",
"type": "stat"
},
{
"datasource": "mysql",
"description": "1. The bug age at which 80% bugs‘ age lies below it.\n2. The bugs being calculated are filtered by \"bug resolution time\" (time filter at the upper-right corner) and \"Jira board\" (\"Choose Board\" filter at the upper-left corner)",
"fieldConfig": {
"defaults": {
"decimals": 1,
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": 14
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 6,
"x": 6,
"y": 117
},
"id": 65,
"options": {
"colorMode": "value",
"graphMode": "area",
"justifyMode": "auto",
"orientation": "auto",
"reduceOptions": {
"calcs": [
"mean"
],
"fields": "",
"values": false
},
"text": {},
"textMode": "auto"
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "time_series",
"group": [],
"metricColumn": "none",
"rawQuery": true,
"rawSql": "with _ranks as(\r\n select \r\n ji.lead_time,\r\n percent_rank() over (order by lead_time asc) as ranks\r\n from jira_issues ji\r\n join jira_board_issues jbi on ji.issue_id = jbi.issue_id\r\n where \r\n std_type = 'Bug'\r\n and std_status = 'Resolved'\r\n and $__timeFilter(resolution_date)\r\n and jbi.board_id = $board_id\r\n)\r\n\r\nselect\r\n now() as time,\r\n max(lead_time/1440) as value\r\nfrom _ranks\r\nwhere \r\n ranks <= 0.8\r\ngroup by 1",
"refId": "A",
"select": [
[
{
"params": [
"progress"
],
"type": "column"
}
]
],
"table": "ca_analysis",
"timeColumn": "create_time",
"timeColumnType": "timestamp",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"timeFrom": null,
"timeShift": null,
"title": "80th Percentile Bug Age (day)",
"type": "stat"
},
{
"datasource": "mysql",
"description": "1. The average and 80th percentile bug age over time.\n2. The time granularity can be switched to Week or Month by \"Time Interval\" above. \n3. When Time Interval is set to \"Month\", the average_bug_age of \"2021-06-01\" refers to the average age of bugs whose resolution time falls under [2020-06-01, 2020-07-01).",
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"axisLabel": "Bug Age (day)",
"axisPlacement": "auto",
"barAlignment": 0,
"drawStyle": "line",
"fillOpacity": 0,
"gradientMode": "none",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"lineInterpolation": "linear",
"lineWidth": 1,
"pointSize": 5,
"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
}
]
},
"unit": "short"
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 12,
"x": 12,
"y": 117
},
"id": 66,
"interval": "",
"options": {
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "single"
}
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "time_series",
"group": [],
"metricColumn": "none",
"rawQuery": true,
"rawSql": "with _bugs as(\r\n select \r\n ji.issue_id,\r\n DATE_ADD(date(resolution_date), INTERVAL -$interval(date(resolution_date))+1 DAY) as time,\r\n lead_time,\r\n round(lead_time/1440) as lead_time_day\r\n from jira_issues ji\r\n join jira_board_issues jbi on ji.issue_id = jbi.issue_id\r\n where \r\n std_type = 'Bug'\r\n and std_status = 'Resolved'\r\n and $__timeFilter(resolution_date)\r\n and jbi.board_id = $board_id\r\n)\r\n\r\nselect \r\n timestamp(time) as time,\r\n avg(lead_time/1440) as \"Average Lead Time\"\r\nfrom _bugs\r\ngroup by 1\r\norder by 1 asc",
"refId": "A",
"select": [
[
{
"params": [
"progress"
],
"type": "column"
}
]
],
"table": "ca_analysis",
"timeColumn": "create_time",
"timeColumnType": "timestamp",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"timeFrom": null,
"timeShift": null,
"title": "Average Bug Age over Time",
"type": "timeseries"
},
{
"aliasColors": {},
"bars": false,
"dashLength": 10,
"dashes": false,
"datasource": "mysql",
"description": "1. The cumulative distribution of bug age. \n2. Each point refers to the percent rank of a bug age.",
"fieldConfig": {
"defaults": {
"unit": "percentunit"
},
"overrides": []
},
"fill": 0,
"fillGradient": 4,
"gridPos": {
"h": 6,
"w": 24,
"x": 0,
"y": 123
},
"hiddenSeries": false,
"id": 61,
"legend": {
"alignAsTable": false,
"avg": false,
"current": false,
"max": false,
"min": false,
"rightSide": false,
"show": false,
"total": false,
"values": false
},
"lines": true,
"linewidth": 8,
"nullPointMode": "null",
"options": {
"alertThreshold": false
},
"percentage": false,
"pluginVersion": "8.0.6",
"pointradius": 0.5,
"points": false,
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
"stack": false,
"steppedLine": false,
"targets": [
{
"format": "time_series",
"group": [],
"metricColumn": "none",
"rawQuery": true,
"rawSql": "with _ranks as(\r\n select \r\n round(ji.lead_time/1440) as lead_time_day\r\n from jira_issues ji\r\n join jira_board_issues jbi on ji.issue_id = jbi.issue_id\r\n where \r\n std_type = 'Bug'\r\n and std_status = 'Resolved'\r\n and $__timeFilter(resolution_date)\r\n and jbi.board_id = $board_id\r\n order by lead_time_day asc\r\n)\r\n\r\nselect \r\n now() as time,\r\n lpad(concat(lead_time_day,'d'), 4, ' ') as metric,\r\n percent_rank() over (order by lead_time_day asc) as value\r\nfrom _ranks\r\norder by lead_time_day asc",
"refId": "A",
"select": [
[
{
"params": [
"progress"
],
"type": "column"
}
]
],
"table": "ca_analysis",
"timeColumn": "create_time",
"timeColumnType": "timestamp",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"thresholds": [
{
"$$hashKey": "object:912",
"colorMode": "ok",
"fill": true,
"line": true,
"op": "lt",
"value": 0.8,
"yaxis": "right"
}
],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
"title": "Bug Age (Cumulative Distribution)",
"tooltip": {
"shared": false,
"sort": 0,
"value_type": "individual"
},
"type": "graph",
"xaxis": {
"buckets": null,
"mode": "series",
"name": null,
"show": true,
"values": [
"total"
]
},
"yaxes": [
{
"$$hashKey": "object:76",
"format": "percentunit",
"label": "Percent Rank (%)",
"logBase": 1,
"max": "1.2",
"min": null,
"show": true
},
{
"$$hashKey": "object:77",
"format": "short",
"label": null,
"logBase": 1,
"max": null,
"min": null,
"show": false
}
],
"yaxis": {
"align": false,
"alignLevel": null
}
},
{
"datasource": "mysql",
"description": "The average time spent on fixing bugs under different Jira Epics.",
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"axisLabel": "Bug Age(day)",
"axisPlacement": "auto",
"axisSoftMin": 0,
"fillOpacity": 80,
"gradientMode": "none",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"lineWidth": 1
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": 80
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 24,
"x": 0,
"y": 129
},
"id": 59,
"options": {
"barWidth": 0.5,
"groupWidth": 0.7,
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom"
},
"orientation": "auto",
"showValue": "auto",
"text": {},
"tooltip": {
"mode": "single"
}
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "table",
"group": [],
"metricColumn": "none",
"queryType": "randomWalk",
"rawQuery": true,
"rawSql": "with _bugs as(\r\n select\r\n ji.issue_id,\r\n ji.epic_key,\r\n ji.lead_time\r\n from\r\n jira_issues ji\r\n join jira_board_issues jbi on ji.issue_id = jbi.issue_id\r\n where \r\n std_type = 'Bug'\r\n and std_status = 'Resolved'\r\n and epic_key is not null\r\n and epic_key != ''\r\n and $__timeFilter(resolution_date)\r\n and jbi.board_id = $board_id\r\n)\r\n\r\nselect \r\n now() as time,\r\n epic_key as \"Epic Key\",\r\n avg(lead_time)/1440 as \"Bug Age\"\r\nfrom _bugs\r\ngroup by 1,2\r\norder by 3 desc\r\nlimit 20",
"refId": "A",
"select": [
[
{
"params": [
"value"
],
"type": "column"
}
]
],
"timeColumn": "time",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"timeFrom": null,
"timeShift": null,
"title": "Average Bug Age by Epic",
"type": "barchart"
},
{
"datasource": null,
"gridPos": {
"h": 4,
"w": 24,
"x": 0,
"y": 135
},
"id": 78,
"options": {
"content": "<div style=\"display: block;text-align: center;margin-top: 56px;\">\n <div style=\"display: inline-flex;\">\n <img src=\"/public/img/lake/4.png\" alt=\"No.4\" width=\"56\">\n <p style=\"font-size:24px; margin:10px; color:#BFC1C8;\"><b>Operation<b></b></b></p><b><b>\n </div>\n</div>",
"mode": "html"
},
"pluginVersion": "8.0.6",
"targets": [
{
"queryType": "randomWalk",
"refId": "A"
}
],
"transparent": true,
"type": "text"
},
{
"datasource": "mysql",
"description": "1. The average incident age.\n2. Incident age refers to the length of time from incident creation to resolution.\n3. The incidents being calculated are filtered by \"incident resolution time\" (time filter at the upper-right corner) and \"Jira board\"(\"Choose Board\" filter at the upper-left corner)",
"fieldConfig": {
"defaults": {
"decimals": 1,
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": 3
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 6,
"x": 0,
"y": 139
},
"id": 64,
"options": {
"colorMode": "value",
"graphMode": "area",
"justifyMode": "auto",
"orientation": "auto",
"reduceOptions": {
"calcs": [
"mean"
],
"fields": "/^value$/",
"values": false
},
"text": {},
"textMode": "auto"
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "time_series",
"group": [],
"metricColumn": "none",
"rawQuery": true,
"rawSql": "select \r\n now() as time,\r\n avg(lead_time/1440) as value\r\nfrom jira_issues ji\r\n join jira_board_issues jbi on ji.issue_id = jbi.issue_id\r\nwhere \r\n std_type = 'Incident'\r\n and std_status = 'Resolved'\r\n and $__timeFilter(resolution_date)\r\n and jbi.board_id = $board_id\r\ngroup by 1;",
"refId": "A",
"select": [
[
{
"params": [
"progress"
],
"type": "column"
}
]
],
"table": "ca_analysis",
"timeColumn": "create_time",
"timeColumnType": "timestamp",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"timeFrom": null,
"timeShift": null,
"title": "Average Incident Age (day)",
"type": "stat"
},
{
"datasource": "mysql",
"description": "1. The incident age at which 80% incidents‘ age lies below it.\n2. The incidents being calculated are filtered by \"incident resolution time\" (time filter at the upper-right corner) and \"Jira board\" (\"Choose Board\" filter at the upper-left corner)",
"fieldConfig": {
"defaults": {
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": 7
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 6,
"x": 6,
"y": 139
},
"id": 55,
"options": {
"colorMode": "value",
"graphMode": "area",
"justifyMode": "auto",
"orientation": "auto",
"reduceOptions": {
"calcs": [
"mean"
],
"fields": "",
"values": false
},
"text": {},
"textMode": "auto"
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "time_series",
"group": [],
"metricColumn": "none",
"rawQuery": true,
"rawSql": "with _ranks as(\r\n select \r\n ji.lead_time,\r\n percent_rank() over (order by lead_time asc) as ranks\r\n from jira_issues ji\r\n join jira_board_issues jbi on ji.issue_id = jbi.issue_id\r\n where \r\n std_type = 'Incident'\r\n and std_status = 'Resolved'\r\n and $__timeFilter(resolution_date)\r\n and jbi.board_id = $board_id\r\n)\r\n\r\nselect\r\n now() as time,\r\n max(lead_time/1440) as value\r\nfrom _ranks\r\nwhere \r\n ranks <= 0.8\r\ngroup by 1",
"refId": "A",
"select": [
[
{
"params": [
"progress"
],
"type": "column"
}
]
],
"table": "ca_analysis",
"timeColumn": "create_time",
"timeColumnType": "timestamp",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"timeFrom": null,
"timeShift": null,
"title": "80th Percentile Incident Age (day)",
"type": "stat"
},
{
"datasource": "mysql",
"description": "1. The average and 80th percentile incident age over time.\n2. The time granularity can be switched to Week or Month by \"Time Interval\" above. \n3. When Time Interval is set to \"Month\", the average_incident_age of \"2021-06-01\" refers to the average age of incidents whose resolution time falls under [2020-06-01, 2020-07-01).",
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"axisLabel": "Incident Age (day)",
"axisPlacement": "auto",
"barAlignment": 0,
"drawStyle": "line",
"fillOpacity": 0,
"gradientMode": "none",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"lineInterpolation": "linear",
"lineWidth": 1,
"pointSize": 5,
"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
}
]
},
"unit": "short"
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 12,
"x": 12,
"y": 139
},
"id": 57,
"interval": "",
"options": {
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "single"
}
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "time_series",
"group": [],
"metricColumn": "none",
"rawQuery": true,
"rawSql": "with _incidents as(\r\n select \r\n ji.issue_id,\r\n DATE_ADD(date(resolution_date), INTERVAL -$interval(date(resolution_date))+1 DAY) as time,\r\n lead_time,\r\n round(lead_time/1440) as lead_time_day\r\n from jira_issues ji\r\n join jira_board_issues jbi on ji.issue_id = jbi.issue_id\r\n where \r\n std_type = 'Incident'\r\n and std_status = 'Resolved'\r\n and $__timeFilter(resolution_date)\r\n and jbi.board_id = $board_id\r\n)\r\n\r\nselect \r\n timestamp(time) as time,\r\n avg(lead_time/1440) as \"Average Lead Time\"\r\nfrom _incidents\r\ngroup by 1\r\norder by 1 asc",
"refId": "A",
"select": [
[
{
"params": [
"progress"
],
"type": "column"
}
]
],
"table": "ca_analysis",
"timeColumn": "create_time",
"timeColumnType": "timestamp",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"timeFrom": null,
"timeShift": null,
"title": "Average Incident Age over Time",
"type": "timeseries"
},
{
"aliasColors": {},
"bars": false,
"dashLength": 10,
"dashes": false,
"datasource": "mysql",
"description": "1. The cumulative distribution of incident age.\n2. Each point refers to the percent rank of a incident age.",
"fieldConfig": {
"defaults": {
"unit": "percentunit"
},
"overrides": []
},
"fill": 0,
"fillGradient": 4,
"gridPos": {
"h": 6,
"w": 24,
"x": 0,
"y": 145
},
"hiddenSeries": false,
"id": 68,
"legend": {
"alignAsTable": false,
"avg": false,
"current": false,
"max": false,
"min": false,
"rightSide": false,
"show": false,
"total": false,
"values": false
},
"lines": true,
"linewidth": 8,
"nullPointMode": "null",
"options": {
"alertThreshold": false
},
"percentage": false,
"pluginVersion": "8.0.6",
"pointradius": 0.5,
"points": false,
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
"stack": false,
"steppedLine": false,
"targets": [
{
"format": "time_series",
"group": [],
"metricColumn": "none",
"rawQuery": true,
"rawSql": "with _ranks as(\r\n select \r\n round(ji.lead_time/1440) as lead_time_day\r\n from jira_issues ji\r\n join jira_board_issues jbi on ji.issue_id = jbi.issue_id\r\n where \r\n std_type = 'Incident'\r\n and std_status = 'Resolved'\r\n and $__timeFilter(resolution_date)\r\n and jbi.board_id = $board_id\r\n order by lead_time_day asc\r\n)\r\n\r\nselect \r\n now() as time,\r\n lpad(concat(lead_time_day,'d'), 4, ' ') as metric,\r\n percent_rank() over (order by lead_time_day asc) as value\r\nfrom _ranks\r\norder by lead_time_day asc",
"refId": "A",
"select": [
[
{
"params": [
"progress"
],
"type": "column"
}
]
],
"table": "ca_analysis",
"timeColumn": "create_time",
"timeColumnType": "timestamp",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"thresholds": [
{
"$$hashKey": "object:1070",
"colorMode": "ok",
"fill": true,
"line": true,
"op": "lt",
"value": 0.8,
"yaxis": "right"
}
],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
"title": "Incident Age (Cumulative Distribution)",
"tooltip": {
"shared": false,
"sort": 0,
"value_type": "individual"
},
"type": "graph",
"xaxis": {
"buckets": null,
"mode": "series",
"name": null,
"show": true,
"values": [
"total"
]
},
"yaxes": [
{
"$$hashKey": "object:76",
"format": "percentunit",
"label": "Percent Rank (%)",
"logBase": 1,
"max": "1.2",
"min": null,
"show": true
},
{
"$$hashKey": "object:77",
"format": "short",
"label": null,
"logBase": 1,
"max": null,
"min": null,
"show": false
}
],
"yaxis": {
"align": false,
"alignLevel": null
}
},
{
"datasource": "mysql",
"description": "The average time spent on fixing incidents under different Jira Epics.",
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"axisLabel": "Incident Age(day)",
"axisPlacement": "auto",
"axisSoftMin": 0,
"fillOpacity": 80,
"gradientMode": "none",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"lineWidth": 1
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 24,
"x": 0,
"y": 151
},
"id": 67,
"options": {
"barWidth": 0.5,
"groupWidth": 0.7,
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom"
},
"orientation": "auto",
"showValue": "auto",
"text": {
"valueSize": 1
},
"tooltip": {
"mode": "single"
}
},
"pluginVersion": "8.0.6",
"targets": [
{
"format": "table",
"group": [],
"metricColumn": "none",
"queryType": "randomWalk",
"rawQuery": true,
"rawSql": "with _incidents as(\r\n select\r\n ji.issue_id,\r\n ji.epic_key,\r\n ji.lead_time\r\n from\r\n jira_issues ji\r\n join jira_board_issues jbi on ji.issue_id = jbi.issue_id\r\n where \r\n std_type = 'Incident'\r\n and std_status = 'Resolved'\r\n and epic_key is not null\r\n and epic_key != ''\r\n and $__timeFilter(resolution_date)\r\n and jbi.board_id = $board_id\r\n)\r\n\r\nselect \r\n now() as time,\r\n epic_key as \"Epic Key\",\r\n avg(lead_time)/1440 as \"Incident Age\"\r\nfrom _incidents\r\ngroup by 1,2\r\norder by 3 desc\r\nlimit 20",
"refId": "A",
"select": [
[
{
"params": [
"value"
],
"type": "column"
}
]
],
"timeColumn": "time",
"where": [
{
"name": "$__timeFilter",
"params": [],
"type": "macro"
}
]
}
],
"timeFrom": null,
"timeShift": null,
"title": "Average Incident Age by Epic",
"type": "barchart"
}
],
"refresh": "",
"schemaVersion": 30,
"style": "dark",
"tags": [
"velocity",
"user_value"
],
"templating": {
"list": [
{
"allValue": null,
"current": {
"selected": false,
"text": "Month",
"value": "DAY"
},
"description": null,
"error": null,
"hide": 0,
"includeAll": false,
"label": "Time Interval",
"multi": false,
"name": "interval",
"options": [
{
"selected": false,
"text": "Week",
"value": "DAYOFWEEK"
},
{
"selected": true,
"text": "Month",
"value": "DAY"
}
],
"query": "Week : DAYOFWEEK, Month : DAY",
"queryValue": "",
"skipUrlSync": false,
"type": "custom"
},
{
"allValue": null,
"current": {
"selected": true,
"text": [
"All"
],
"value": [
"$__all"
]
},
"datasource": "mysql",
"definition": "select distinct concat(name, ': ', board_id) from jira_boards",
"description": null,
"error": null,
"hide": 0,
"includeAll": true,
"label": "Choose Board",
"multi": true,
"name": "board_id",
"options": [],
"query": "select distinct concat(name, ': ', board_id) from jira_boards",
"refresh": 1,
"regex": "/^(?<text>[^:]+): (?<value>\\d+)$/",
"skipUrlSync": false,
"sort": 0,
"type": "query"
},
{
"allValue": null,
"current": {
"selected": true,
"text": [
"All"
],
"value": [
"$__all"
]
},
"datasource": "mysql",
"definition": "select distinct concat(name, ': ', gitlab_id) from gitlab_projects",
"description": null,
"error": null,
"hide": 0,
"includeAll": true,
"label": "Choose Repo",
"multi": true,
"name": "repo_id",
"options": [],
"query": "select distinct concat(name, ': ', gitlab_id) from gitlab_projects",
"refresh": 1,
"regex": "/^(?<text>[^:]+): (?<value>\\d+)$/",
"skipUrlSync": false,
"sort": 0,
"type": "query"
}
]
},
"time": {
"from": "now-5y",
"to": "now"
},
"timepicker": {},
"timezone": "",
"title": "Delivery Velocity (require Jira and Gitlab data)",
"uid": "ZfaFQeM7k",
"version": 20
}