You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@devlake.apache.org by ab...@apache.org on 2023/07/14 12:31:02 UTC

[incubator-devlake-helm-chart] branch main updated: adjust for version 0.18.0 (#144)

This is an automated email from the ASF dual-hosted git repository.

abeizn pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-devlake-helm-chart.git


The following commit(s) were added to refs/heads/main by this push:
     new 47d4b97  adjust for version 0.18.0 (#144)
47d4b97 is described below

commit 47d4b97b3e01bd3f26e8fe4c137eecca3e92e8c8
Author: ZhangNing10 <13...@users.noreply.github.com>
AuthorDate: Fri Jul 14 20:30:57 2023 +0800

    adjust for version 0.18.0 (#144)
    
    * adjust for version 0.18.0
    
    * adjust the action deploy-test.yml
    
    * TZ mandantory
    
    * remove the unnecessary charts
    
    * add grafana enabled switch
    
    * set autocreatesecret
    
    * make grafana datasource a configmap that can be imported by grafana sidecar
    
    * add mysql auth secret to grafana env
    
    * adjust HelmSetup
    
    * add grafana-piechart-panel plugins
    
    * adjust the validate
    
    * adjust the README for upgrade note
    
    * adjust the README for upgrade note
    
    * adjust the README for upgrade note
    
    * adjust the README for upgrade note
    
    * adjust the validate fail msg
    
    * adjust the validate fail message
    
    * remove the unneeded file which was pushed by mistake
    
    * adjust README
    
    * adjust readme
    
    * adjust readme
    
    * adjust readme
    
    * use envFromSecrets instead of envFromSecret
    
    * adjust the grafana dashboards
    
    * cp grafana env from lake grafana dockerfile
    
    * add debug info for deploy test
    
    * enable ci manual trigger
    
    * remove debug
    
    * split the grafana dashboards to multiple configmaps
    
    * remove empty line
    
    * enable grafana dashboard sidecar
---
 .github/workflows/deploy-test.yml                  |   5 +-
 HelmSetup.md                                       | 133 +--
 README.md                                          |  16 +-
 charts/devlake/Chart.lock                          |   4 +-
 charts/devlake/Chart.yaml                          |   7 +-
 charts/devlake/dashboards/DORAByTeam.json          | 574 +++++++-----
 charts/devlake/dashboards/EngineeringOverview.json |  12 +-
 .../EngineeringThroughputAndCycleTime.json         |  20 +-
 .../EngineeringThroughputAndCycleTimeTeamView.json |  24 +-
 charts/devlake/dashboards/GitHub.json              | 523 +++++++++--
 charts/devlake/dashboards/WeeklyBugRetro.json      | 422 +++++++--
 .../devlake/dashboards/WeeklyCommunityRetro.json   | 981 ++++++++++++++++-----
 charts/devlake/templates/_helpers.tpl              |  24 +
 charts/devlake/templates/configmaps.yaml           |  28 +-
 charts/devlake/templates/deployments.yaml          | 120 ++-
 .../templates/grafana-dashboard-configmap.yaml     |  64 --
 .../grafana-dashboard-configmaps/bitbucket.yaml    |  11 +
 .../componentandfilelevelmetrics.yaml              |  11 +
 .../contributorexperience.yaml                     |  11 +
 .../demoaveragerequirementleadtimebyassignee.yaml  |  11 +
 .../democommitcountbyauthor.yaml                   |  11 +
 .../demodetailedbuginfo.yaml                       |  11 +
 .../grafana-dashboard-configmaps/demohomepage.yaml |  11 +
 ...mohowfastdowerespondtocustomerrequirements.yaml |  10 +
 .../demoisthismonthmoreproductivethanlast.yaml     |  10 +
 .../demowasourqualityimprovedornot.yaml            |  10 +
 .../grafana-dashboard-configmaps/dora.yaml         |  10 +
 .../grafana-dashboard-configmaps/dorabyteam.yaml   |  10 +
 .../grafana-dashboard-configmaps/doradebug.yaml    |  10 +
 .../engineeringoverview.yaml                       |  10 +
 .../engineeringthroughputandcycletime.yaml         |  10 +
 .../engineeringthroughputandcycletimeteamview.yaml |  10 +
 .../grafana-dashboard-configmaps/github.yaml       |  10 +
 ...ithubreleasequalityandcontributionanalysis.yaml |  10 +
 .../grafana-dashboard-configmaps/gitlab.yaml       |  10 +
 .../grafana-dashboard-configmaps/homepage.yaml     |  10 +
 .../grafana-dashboard-configmaps/jenkins.yaml      |  10 +
 .../grafana-dashboard-configmaps/jira.yaml         |  10 +
 .../grafana-dashboard-configmaps/sonarqube.yaml    |  10 +
 .../grafana-dashboard-configmaps/tapd.yaml         |  10 +
 .../grafana-dashboard-configmaps/teambition.yaml   |  10 +
 .../weeklybugretro.yaml                            |  10 +
 .../weeklycommunityretro.yaml                      |  10 +
 .../grafana-dashboard-configmaps/zentao.yaml       |  10 +
 charts/devlake/templates/ingresses.yaml            |   6 +-
 charts/devlake/templates/secrets.yaml              |  20 +-
 charts/devlake/templates/services.yaml             |   5 +-
 charts/devlake/templates/statefulsets.yaml         | 170 +---
 charts/devlake/templates/validate.yaml             |  21 +
 charts/devlake/values.yaml                         | 121 ++-
 50 files changed, 2523 insertions(+), 1064 deletions(-)

diff --git a/.github/workflows/deploy-test.yml b/.github/workflows/deploy-test.yml
index 186684b..23b8d9e 100644
--- a/.github/workflows/deploy-test.yml
+++ b/.github/workflows/deploy-test.yml
@@ -30,6 +30,7 @@ on:
       - charts/devlake/**
       - .github/workflows/deploy-test.yml
       - "!**.md"
+  workflow_dispatch:
 
 jobs:
   deploy-with-helm:
@@ -66,7 +67,7 @@ jobs:
             --set service.uiPort=30000 \
             --set mysql.useExternal=true \
             --set mysql.externalServer=mysql \
-            --set option.localtime=""
+            --set lake.encryptionSecret.secret=$(openssl rand -base64 2000 | tr -dc 'A-Z' | fold -w 128 | head -n 1)
           kubectl get pods -o wide
           kubectl get services -o wide
 
@@ -80,7 +81,7 @@ jobs:
           helm install --wait --timeout 300s deploy-test charts/devlake \
             --set service.uiPort=30000 \
             --set mysql.image.tag=8-debian \
-            --set option.localtime=""
+            --set lake.encryptionSecret.secret=$(openssl rand -base64 2000 | tr -dc 'A-Z' | fold -w 128 | head -n 1)
           kubectl get pods -o wide
           kubectl get services -o wide
 
diff --git a/HelmSetup.md b/HelmSetup.md
index 699ec53..958aadb 100644
--- a/HelmSetup.md
+++ b/HelmSetup.md
@@ -23,7 +23,8 @@ To install the chart with release name `devlake`:
 ```shell
 helm repo add devlake https://apache.github.io/incubator-devlake-helm-chart
 helm repo update
-helm install devlake devlake/devlake --version=0.17.0-beta13
+ENCRYPTION_SECRET=$(openssl rand -base64 2000 | tr -dc 'A-Z' | fold -w 128 | head -n 1)
+helm install devlake devlake/devlake --version=0.18.0-beta1 --set lake.encryptionSecret.secret=$ENCRYPTION_SECRET
 ```
 
 Visit your devlake from the node port (32001 by default): http://YOUR-NODE-IP:32001.
@@ -36,9 +37,10 @@ _Notes for mac users with minikube:_
 
 ### 2.2 Update
 
+if you upgrade from 0.17* to 0.18*, please copy the ENCODE_KEY value from /app/config/.env of the pod devlake-lake-0, and replace <ENCRYPTION_SECRET> of below upgrade cmd
 ```shell
 helm repo update
-helm upgrade --install devlake devlake/devlake --version=0.17.0-beta13
+helm upgrade --install devlake devlake/devlake --version=0.18.0-beta1 --set lake.encryptionSecret.secret=<ENCRYPTION_SECRET>
 ```
 
 ### 2.3 Uninstall
@@ -61,7 +63,8 @@ Conditions:
 - Want to visit devlake with port 30000.
 
 ```
-helm install devlake devlake/devlake --set service.uiPort=30000
+ENCRYPTION_SECRET=$(openssl rand -base64 2000 | tr -dc 'A-Z' | fold -w 128 | head -n 1)
+helm install devlake devlake/devlake --set service.uiPort=30000 --set lake.encryptionSecret.secret=$ENCRYPTION_SECRET
 ```
 
 After deployed, visit devlake: http://192.168.0.6:30000
@@ -74,7 +77,8 @@ Conditions:
 - I want to use http://devlake.example.com for visiting devlake
 
 ```
-helm install devlake devlake/devlake --set "ingress.enabled=true,ingress.hostname=devlake.example.com"
+ENCRYPTION_SECRET=$(openssl rand -base64 2000 | tr -dc 'A-Z' | fold -w 128 | head -n 1)
+helm install devlake devlake/devlake --set "ingress.enabled=true,ingress.hostname=devlake.example.com,lake.encryptionSecret.secret=$ENCRYPTION_SECRET"
 ```
 
 After deployed, visit devlake: http://devlake.example.com, and grafana at http://devlake.example.com/grafana
@@ -96,10 +100,12 @@ kubectl create secret tls ssl-certificate --cert cert.pem --key secret.pem
 Then, deploy the devlake:
 
 ```
+ENCRYPTION_SECRET=$(openssl rand -base64 2000 | tr -dc 'A-Z' | fold -w 128 | head -n 1)
 helm install devlake devlake/devlake \
     --set "ingress.enabled=true,ingress.enableHttps=true,ingress.hostname=devlake-0.example.com" \
     --set "ingress.className=nginx,ingress.httpsPort=8443" \
     --set "ingress.tlsSecretName=ssl-certificate"
+    --set "lake.encryptionSecret.secret=$ENCRYPTION_SECRET"
 ```
 
 After deployed, visit devlake: https://devlake-0.example.com:8443, and grafana at https://devlake-0.example.com:8443/grafana
@@ -110,64 +116,61 @@ After deployed, visit devlake: https://devlake-0.example.com:8443, and grafana a
 
 Some useful parameters for the chart, you could also check them in values.yaml
 
-| Parameter                         | Description                                                                           | Default                  |
-| --------------------------------- | ------------------------------------------------------------------------------------- | ------------------------ |
-| replicaCount                      | Replica Count for devlake, currently not used                                         | 1                        |
-| imageTag                          | The version tag for all images                                                        | see Values.yaml          |
-| mysql.useExternal                 | If use external mysql server, set true                                                | false                    |
-| mysql.externalServer              | External mysql server address                                                         | 127.0.0.1                |
-| mysql.externalPort                | External mysql server port                                                            | 3306                     |
-| mysql.username                    | username for mysql                                                                    | merico                   |
-| mysql.password                    | password for mysql                                                                    | merico                   |
-| mysql.database                    | database for mysql                                                                    | lake                     |
-| mysql.rootPassword                | root password for mysql                                                               | admin                    |
-| mysql.storage.class               | storage class for mysql's volume                                                      | ""                       |
-| mysql.storage.size                | volume size for mysql's data                                                          | 5Gi                      |
-| mysql.image.repository            | repository for mysql's image                                                          | mysql                    |
-| mysql.image.tag                   | image tag for mysql's image                                                           | 8                        |
-| mysql.image.pullPolicy            | pullPolicy for mysql's image                                                          | IfNotPresent             |
-| mysql.extraLabels                 | extra labels for mysql's statefulset                                                  | {}                       |
-| mysql.securityContext             | pod security context values                                                           | {}                       |
-| mysql.containerSecurityContext    | container security context values                                                     | {}                       |
-| externalGrafana.useExternal       | If use external grafana server                                                        | false                    |
-| externalGrafana.grafanaUrl        | external grafana server if use external                                               | ""                       |
-| grafana                           | dashboard, datasource, etc. settings for grafana, installed by grafana official chart |                          |
-| lake.storage.class                | storage class for lake's volume                                                       | ""                       |
-| lake.storage.size                 | volume size for lake's data                                                           | 100Mi                    |
-| lake.image.repository             | repository for lake's image                                                           | apache/devlake           |
-| lake.image.pullPolicy             | pullPolicy for lake's image                                                           | Always                   |
-| lake.loggingDir                   | log dir for the lake server                                                           | /app/logs                |
-| lake.loggingLevel                 | log level for the lake server                                                         | info                     |
-| lake.dotenv                       | initial configurations for injecting to lake's .env                                   | see Values.yaml          |
-| lake.extraLabels                  | extra labels for lake's statefulset                                                   | {}                       |
-| lake.securityContext              | pod security context values                                                           | {}                       |
-| lake.containerSecurityContext     | container security context values                                                     | {}                       |
-| ui.image.repository               | repository for ui's image                                                             | apache/devlake-config-ui |
-| ui.image.pullPolicy               | pullPolicy for ui's image                                                             | Always                   |
-| ui.basicAuth.enabled              | If the basic auth in ui is enabled                                                    | false                    |
-| ui.basicAuth.user                 | The user name for the basic auth                                                      | "admin"                  |
-| ui.basicAuth.password             | The password for the basic auth                                                       | "admin"                  |
-| ui.basicAuth.useSecret            | If use secret instead of configmap for basic auth                                     | false                    |
-| ui.basicAuth.autoCreateSecret     | If let the helm chart create the secret                                               | true                     |
-| ui.basicAuth.secretName           | The basic auth secret name                                                            | devlake-auth             |
-| ui.extraLabels                    | extra labels for ui's statefulset                                                     | {}                       |
-| ui.securityContext                | pod security context values                                                           | {}                       |
-| ui.containerSecurityContext       | container security context values                                                     | {}                       |
-| service.type                      | Service type for exposed service                                                      | NodePort                 |
-| service.uiPort                    | Node port for config ui                                                               | 32001                    |
-| service.ingress.enabled           | If enable ingress                                                                     | false                    |
-| service.ingress.enableHttps       | If enable https                                                                       | false                    |
-| service.ingress.className         | Name for ingressClass. leave empty for using default                                  | ""                       |
-| service.ingress.hostname          | The hostname/domainname for ingress                                                   | localhost                |
-| service.ingress.prefix            | The prefix for endpoints, currently not used                                          | /                        |
-| service.ingress.tlsSecretName     | The secret name for tls's certificate for https                                       | ""                       |
-| service.ingress.httpPort          | The http port for ingress                                                             | 80                       |
-| service.ingress.httpsPort         | The https port for ingress                                                            | 443                      |
-| option.localtime                  | The hostpath for mount as /etc/localtime                                              | /etc/localtime           |
-| option.database                   | The database type, valids: mysql                                                      | mysql                    |
-| option.useConnectionDetailsSecret | If use secret instead of configmap for db connection                                  | false                    |
-| option.connectionSecretName       | The database connection details secret name                                           | devlake-db-connection    |
-| option.autoCreateSecret           | If let the helm chart create the secret                                               | true                     |
+| Parameter                                 | Description                                                                           | Default                  |
+| ----------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------ |
+| replicaCount                              | Replica Count for devlake, currently not used                                         | 1                        |
+| imageTag                                  | The version tag for all images                                                        | see Values.yaml          |
+| envs                                      | The common envs for all pods                                                          | []                       |
+| mysql.useExternal                         | If use external mysql server, set true                                                | false                    |
+| mysql.externalServer                      | External mysql server address                                                         | 127.0.0.1                |
+| mysql.externalPort                        | External mysql server port                                                            | 3306                     |
+| mysql.username                            | username for mysql                                                                    | merico                   |
+| mysql.password                            | password for mysql                                                                    | merico                   |
+| mysql.database                            | database for mysql                                                                    | lake                     |
+| mysql.rootPassword                        | root password for mysql                                                               | admin                    |
+| mysql.storage.class                       | storage class for mysql's volume                                                      | ""                       |
+| mysql.storage.size                        | volume size for mysql's data                                                          | 5Gi                      |
+| mysql.image.repository                    | repository for mysql's image                                                          | mysql                    |
+| mysql.image.tag                           | image tag for mysql's image                                                           | 8                        |
+| mysql.image.pullPolicy                    | pullPolicy for mysql's image                                                          | IfNotPresent             |
+| mysql.extraLabels                         | extra labels for mysql's statefulset                                                  | {}                       |
+| mysql.securityContext                     | pod security context values                                                           | {}                       |
+| mysql.containerSecurityContext            | container security context values                                                     | {}                       |
+| grafana                                   | dashboard, datasource, etc. settings for grafana, installed by grafana official chart |                          |
+| lake.image.repository                     | repository for lake's image                                                           | apache/devlake           |
+| lake.image.pullPolicy                     | pullPolicy for lake's image                                                           | Always                   |
+| lake.port                                 | the port of devlake backend                                                           | 8080                     |
+| lake.envs                                 | initial envs for lake                                                                 | see Values.yaml          |
+| lake.encryptionSecret.secretName          | the k8s secret name for ENCRYPTION_SECRET                                             | ""                       |
+| lake.encryptionSecret.secret              | the secret for ENCRYPTION_SECRET                                                      | ""                       |
+| lake.encryptionSecret.autoCreateSecret    | whether let the helm chart create the secret                                          | true                     |
+| lake.extraLabels                          | extra labels for lake's statefulset                                                   | {}                       |
+| lake.securityContext                      | pod security context values                                                           | {}                       |
+| lake.containerSecurityContext             | container security context values                                                     | {}                       |
+| ui.image.repository                       | repository for ui's image                                                             | apache/devlake-config-ui |
+| ui.image.pullPolicy                       | pullPolicy for ui's image                                                             | Always                   |
+| ui.basicAuth.enabled                      | If the basic auth in ui is enabled                                                    | false                    |
+| ui.basicAuth.user                         | The user name for the basic auth                                                      | "admin"                  |
+| ui.basicAuth.password                     | The password for the basic auth                                                       | "admin"                  |
+| ui.basicAuth.autoCreateSecret             | If let the helm chart create the secret                                               | true                     |
+| ui.basicAuth.secretName                   | The basic auth secret name                                                            | ""                       |
+| ui.extraLabels                            | extra labels for ui's statefulset                                                     | {}                       |
+| ui.securityContext                        | pod security context values                                                           | {}                       |
+| ui.containerSecurityContext               | container security context values                                                     | {}                       |
+| service.type                              | Service type for exposed service                                                      | NodePort                 |
+| service.uiPort                            | Node port for config ui                                                               | 32001                    |
+| service.ingress.enabled                   | If enable ingress                                                                     | false                    |
+| service.ingress.enableHttps               | If enable https                                                                       | false                    |
+| service.ingress.className                 | Name for ingressClass. leave empty for using default                                  | ""                       |
+| service.ingress.hostname                  | The hostname/domainname for ingress                                                   | localhost                |
+| service.ingress.prefix                    | The prefix for endpoints, currently not used                                          | /                        |
+| service.ingress.tlsSecretName             | The secret name for tls's certificate for https                                       | ""                       |
+| service.ingress.httpPort                  | The http port for ingress                                                             | 80                       |
+| service.ingress.httpsPort                 | The https port for ingress                                                            | 443                      |
+| option.database                           | The database type, valids: mysql                                                      | mysql                    |
+| option.connectionSecretName               | The database connection details secret name                                           | "devlake-mysql-auth"                       |
+| option.autoCreateSecret                   | If let the helm chart create the secret                                               | true                     |
+
 
 ---
 
@@ -192,6 +195,7 @@ Here is the example:
 ```
 helm repo add devlake https://apache.github.io/incubator-devlake-helm-chart
 helm repo update
+ENCRYPTION_SECRET=$(openssl rand -base64 2000 | tr -dc 'A-Z' | fold -w 128 | head -n 1)
 helm install devlake devlake/devlake \
   --set mysql.useExternal=true \
   --set mysql.externalServer=db.example.com \
@@ -199,6 +203,8 @@ helm install devlake devlake/devlake \
   --set mysql.username=admin \
   --set mysql.password=password_4_admin \
   --set mysql.database=devlake
+  --set lake.encryptionSecret.secret=$ENCRYPTION_SECRET
+
 ```
 
 2. Can I use a secret to store the database connection details?
@@ -225,9 +231,12 @@ Here is the example:
 ```
 helm repo add devlake https://apache.github.io/incubator-devlake-helm-chart
 helm repo update
+ENCRYPTION_SECRET=$(openssl rand -base64 2000 | tr -dc 'A-Z' | fold -w 128 | head -n 1)
 helm install devlake devlake/devlake \
   --set grafana.useExternal=true \
   --set grafana.externalUrl=https://grafana.example.com
+  --set lake.encryptionSecret.secret=$ENCRYPTION_SECRET
+
 ```
 
 ---
diff --git a/README.md b/README.md
index 0b8c0a2..32453aa 100644
--- a/README.md
+++ b/README.md
@@ -36,7 +36,8 @@ helm install devlake devlake/devlake
 ```shell
 helm repo add devlake https://apache.github.io/incubator-devlake-helm-chart
 helm repo update
-helm install devlake devlake/devlake --version=0.17.0-beta13
+ENCRYPTION_SECRET=$(openssl rand -base64 2000 | tr -dc 'A-Z' | fold -w 128 | head -n 1)
+helm install devlake devlake/devlake --version=0.18.0-beta1 --set lake.encryptionSecret.secret=$ENCRYPTION_SECRET
 ```
 
 If you are using minikube inside your mac, please use the following command to forward the port:
@@ -55,11 +56,20 @@ Then you can visit:
 config-ui by url `http://YOUR-NODE-IP:30090`
 grafana by url `http://YOUR-NODE-IP:30091`
 
-## Update
+## Upgrade
+
+Note:
+If you're upgrading from DevLake v0.17.x or earlier versions to v0.18.x or later versions:
+
+1. Copy the ENCODE_KEY value from /app/config/.env of the lake pod (e.g. devlake-lake-0), and replace the <ENCRYPTION_SECRET> in the upgrade command below.
+
+2. You may encounter the below error when upgrading because the built-in grafana has been replaced by the official grafana dependency. So you may need to delete the grafana deployment first.
+
+> Error: UPGRADE FAILED: cannot patch "devlake-grafana" with kind Deployment: Deployment.apps "devlake-grafana" is invalid: spec.selector: Invalid value: v1.LabelSelector{MatchLabels:map[string]string{"app.kubernetes.io/instance":"devlake", "app.kubernetes.io/name":"grafana"}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable
 
 ```shell
 helm repo update
-helm upgrade --install devlake devlake/devlake --version=0.17.0-beta13
+helm upgrade --install devlake devlake/devlake --version=0.18.0-beta1 --set lake.encryptionSecret.secret=<ENCRYPTION_SECRET>
 ```
 
 ## Uninstall
diff --git a/charts/devlake/Chart.lock b/charts/devlake/Chart.lock
index 9bc65a8..fc8e31a 100644
--- a/charts/devlake/Chart.lock
+++ b/charts/devlake/Chart.lock
@@ -2,5 +2,5 @@ dependencies:
 - name: grafana
   repository: https://grafana.github.io/helm-charts
   version: 6.56.6
-digest: sha256:cbe6f07dc05e6699e46ce6da0db5eb937bd3c6203f6a19fc8adcf72f9f7005fb
-generated: "2023-05-28T13:53:10.903912+08:00"
+digest: sha256:1542c49419e0dc22b2483b1209f102bd669f53c5321d9180152fe3485a6d51e7
+generated: "2023-07-06T21:44:11.0947005+08:00"
diff --git a/charts/devlake/Chart.yaml b/charts/devlake/Chart.yaml
index 6e11f43..7749ce3 100644
--- a/charts/devlake/Chart.yaml
+++ b/charts/devlake/Chart.yaml
@@ -28,12 +28,13 @@ keywords:
 type: application
 
 # Chart version
-version: 0.17.0-beta13
+version: 0.18.0-beta1
 
 # devlake version
-appVersion: v0.17.0-beta13
+appVersion: v0.18.0-beta1
 
 dependencies:
-- name: grafana
+- condition: grafana.enabled
+  name: grafana
   version: "6.56.6"
   repository: "https://grafana.github.io/helm-charts"
diff --git a/charts/devlake/dashboards/DORAByTeam.json b/charts/devlake/dashboards/DORAByTeam.json
index 611cdeb..fafbcac 100644
--- a/charts/devlake/dashboards/DORAByTeam.json
+++ b/charts/devlake/dashboards/DORAByTeam.json
@@ -3,7 +3,10 @@
     "list": [
       {
         "builtIn": 1,
-        "datasource": "-- Grafana --",
+        "datasource": {
+          "type": "datasource",
+          "uid": "grafana"
+        },
         "enable": true,
         "hide": true,
         "iconColor": "rgba(0, 211, 255, 1)",
@@ -21,12 +24,15 @@
   "editable": true,
   "fiscalYearStartMonth": 0,
   "graphTooltip": 0,
-  "id": 44,
-  "iteration": 1683291538967,
+  "id": 8,
   "links": [],
   "liveNow": false,
   "panels": [
     {
+      "datasource": {
+        "type": "datasource",
+        "uid": "grafana"
+      },
       "gridPos": {
         "h": 6,
         "w": 24,
@@ -35,15 +41,32 @@
       },
       "id": 16,
       "options": {
-				"content": "- See [how to config](https://devlake.apache.org/docs/DORA) this dashboard\n- Data Sources Required: \n  - `Deployments` from Jenkins, GitLab CI, GitHub Action, webhook, etc. \n  - `Pull Requests` from GitHub PRs, GitLab MRs, BitBucket PRs, Azure DevOps PRs, etc.\n  - `Incidents` from Jira issues, GitHub issues, TAPD issues, PagerDuty Incidents, etc. \n- Transformation Required: Define `deployments` and `incidents` in [data transformations](https://devlake.apache.org/docs [...]
+        "code": {
+          "language": "plaintext",
+          "showLineNumbers": false,
+          "showMiniMap": false
+        },
+        "content": "- See [how to config](https://devlake.apache.org/docs/DORA) this dashboard\n- Data Sources Required: \n  - `Deployments` from Jenkins, GitLab CI, GitHub Action, webhook, etc. \n  - `Pull Requests` from GitHub PRs, GitLab MRs, BitBucket PRs, Azure DevOps PRs, etc.\n  - `Incidents` from Jira issues, GitHub issues, TAPD issues, PagerDuty Incidents, etc. \n- Transformation Required: Define `deployments` and `incidents` in [data transformations](https://devlake.apache.org/ [...]
         "mode": "markdown"
       },
-      "pluginVersion": "8.4.7",
+      "pluginVersion": "9.5.1",
+      "targets": [
+        {
+          "datasource": {
+            "type": "datasource",
+            "uid": "grafana"
+          },
+          "refId": "A"
+        }
+      ],
       "title": "Dashboard Introduction",
       "type": "text"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -53,8 +76,11 @@
           },
           "custom": {
             "align": "auto",
-            "displayMode": "auto",
-            "filterable": false
+            "cellOptions": {
+              "type": "auto"
+            },
+            "filterable": false,
+            "inspect": false
           },
           "mappings": [],
           "noValue": "-",
@@ -76,8 +102,10 @@
             },
             "properties": [
               {
-                "id": "custom.displayMode",
-                "value": "color-text"
+                "id": "custom.cellOptions",
+                "value": {
+                  "type": "color-text"
+                }
               },
               {
                 "id": "color",
@@ -95,8 +123,10 @@
             },
             "properties": [
               {
-                "id": "custom.displayMode",
-                "value": "color-text"
+                "id": "custom.cellOptions",
+                "value": {
+                  "type": "color-text"
+                }
               },
               {
                 "id": "color",
@@ -114,8 +144,10 @@
             },
             "properties": [
               {
-                "id": "custom.displayMode",
-                "value": "color-text"
+                "id": "custom.cellOptions",
+                "value": {
+                  "type": "color-text"
+                }
               },
               {
                 "id": "color",
@@ -133,8 +165,10 @@
             },
             "properties": [
               {
-                "id": "custom.displayMode",
-                "value": "color-text"
+                "id": "custom.cellOptions",
+                "value": {
+                  "type": "color-text"
+                }
               },
               {
                 "id": "color",
@@ -151,11 +185,13 @@
         "h": 6,
         "w": 24,
         "x": 0,
-        "y": 2
+        "y": 6
       },
       "id": 8,
       "options": {
+        "cellHeight": "sm",
         "footer": {
+          "countRows": false,
           "fields": "",
           "reducer": [
             "sum"
@@ -165,44 +201,46 @@
         "showHeader": true,
         "sortBy": []
       },
-      "pluginVersion": "8.4.7",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
-          "datasource": "mysql",
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
+          "editorMode": "code",
           "format": "table",
-          "group": [],
-          "metricColumn": "none",
-          "queryType": "randomWalk",
+          "hide": false,
           "rawQuery": true,
-          "rawSql": "-- Metric 1: Deployment Frequency\nwith last_few_calendar_months as(\n-- construct the last few calendar months within the selected time period in the top-right corner\n\tSELECT CAST((SYSDATE()-INTERVAL (H+T+U) DAY) AS date) day\n\tFROM ( SELECT 0 H\n\t\t\tUNION ALL SELECT 100 UNION ALL SELECT 200 UNION ALL SELECT 300\n\t\t) H CROSS JOIN ( SELECT 0 T\n\t\t\tUNION ALL SELECT  10 UNION ALL SELECT  20 UNION ALL SELECT  30\n\t\t\tUNION ALL SELECT  40 UNION ALL SELECT  50 [...]
+          "rawSql": "-- Metric 1: Deployment Frequency\nwith last_few_calendar_months as(\n-- construct the last few calendar months within the selected time period in the top-right corner\n\tSELECT CAST((SYSDATE()-INTERVAL (H+T+U) DAY) AS date) day\n\tFROM ( SELECT 0 H\n\t\t\tUNION ALL SELECT 100 UNION ALL SELECT 200 UNION ALL SELECT 300\n\t\t) H CROSS JOIN ( SELECT 0 T\n\t\t\tUNION ALL SELECT  10 UNION ALL SELECT  20 UNION ALL SELECT  30\n\t\t\tUNION ALL SELECT  40 UNION ALL SELECT  50 [...]
           "refId": "A",
-          "select": [
-            [
+          "sql": {
+            "columns": [
               {
-                "params": [
-                  "id"
-                ],
-                "type": "column"
+                "parameters": [],
+                "type": "function"
               }
-            ]
-          ],
-          "table": "_devlake_blueprints",
-          "timeColumn": "created_at",
-          "timeColumnType": "timestamp",
-          "where": [
-            {
-              "name": "$__timeFilter",
-              "params": [],
-              "type": "macro"
-            }
-          ]
+            ],
+            "groupBy": [
+              {
+                "property": {
+                  "type": "string"
+                },
+                "type": "groupBy"
+              }
+            ],
+            "limit": 50
+          }
         }
       ],
       "title": "Overall DORA Metrics",
       "type": "table"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "fieldConfig": {
         "defaults": {
           "color": {
@@ -247,7 +285,7 @@
         "h": 5,
         "w": 6,
         "x": 0,
-        "y": 8
+        "y": 12
       },
       "id": 11,
       "options": {
@@ -265,16 +303,20 @@
         "text": {},
         "textMode": "auto"
       },
-      "pluginVersion": "8.4.7",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
-          "datasource": "mysql",
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
+          "editorMode": "code",
           "format": "table",
           "group": [],
           "metricColumn": "none",
           "queryType": "randomWalk",
           "rawQuery": true,
-          "rawSql": "-- Metric 1: Deployment Frequency\nwith last_few_calendar_months as(\n-- construct the last few calendar months within the selected time period in the top-right corner\n\tSELECT CAST((SYSDATE()-INTERVAL (H+T+U) DAY) AS date) day\n\tFROM ( SELECT 0 H\n\t\t\tUNION ALL SELECT 100 UNION ALL SELECT 200 UNION ALL SELECT 300\n\t\t) H CROSS JOIN ( SELECT 0 T\n\t\t\tUNION ALL SELECT  10 UNION ALL SELECT  20 UNION ALL SELECT  30\n\t\t\tUNION ALL SELECT  40 UNION ALL SELECT  50 [...]
+          "rawSql": "-- Metric 1: Deployment Frequency\nwith last_few_calendar_months as(\n-- construct the last few calendar months within the selected time period in the top-right corner\n\tSELECT CAST((SYSDATE()-INTERVAL (H+T+U) DAY) AS date) day\n\tFROM ( SELECT 0 H\n\t\t\tUNION ALL SELECT 100 UNION ALL SELECT 200 UNION ALL SELECT 300\n\t\t) H CROSS JOIN ( SELECT 0 T\n\t\t\tUNION ALL SELECT  10 UNION ALL SELECT  20 UNION ALL SELECT  30\n\t\t\tUNION ALL SELECT  40 UNION ALL SELECT  50 [...]
           "refId": "A",
           "select": [
             [
@@ -286,6 +328,23 @@
               }
             ]
           ],
+          "sql": {
+            "columns": [
+              {
+                "parameters": [],
+                "type": "function"
+              }
+            ],
+            "groupBy": [
+              {
+                "property": {
+                  "type": "string"
+                },
+                "type": "groupBy"
+              }
+            ],
+            "limit": 50
+          },
           "table": "_devlake_tasks",
           "timeColumn": "created_at",
           "timeColumnType": "timestamp",
@@ -302,7 +361,10 @@
       "type": "stat"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "fieldConfig": {
         "defaults": {
           "color": {
@@ -347,7 +409,7 @@
         "h": 5,
         "w": 6,
         "x": 6,
-        "y": 8
+        "y": 12
       },
       "id": 12,
       "options": {
@@ -365,44 +427,46 @@
         "text": {},
         "textMode": "auto"
       },
-      "pluginVersion": "8.4.7",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
-          "datasource": "mysql",
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
+          "editorMode": "code",
           "format": "table",
-          "group": [],
-          "metricColumn": "none",
-          "queryType": "randomWalk",
+          "hide": false,
           "rawQuery": true,
-          "rawSql": "-- Metric 2: median lead time for changes\nwith _pr_stats as (\n-- get the cycle time of PRs deployed by the deployments finished in the selected period\n\tSELECT\n\t\tdistinct pr.id,\n\t\tppm.pr_cycle_time\n\tFROM\n\t\tpull_requests pr\n\t\tjoin user_accounts ua on pr.author_id = ua.account_id\n    \tjoin users u on ua.user_id = u.id\n    \tjoin team_users tu on u.id = tu.user_id\n    \tjoin teams t on tu.team_id = t.id\n\t\tjoin project_pr_metrics ppm on ppm.id = p [...]
+          "rawSql": "-- Metric 2: median lead time for changes\nwith _pr_stats as (\n-- get the cycle time of PRs deployed by the deployments finished in the selected period\n\tSELECT\n\t\tdistinct pr.id,\n\t\tppm.pr_cycle_time\n\tFROM\n\t\tpull_requests pr\n\t\tjoin user_accounts ua on pr.author_id = ua.account_id\n    \tjoin users u on ua.user_id = u.id\n    \tjoin team_users tu on u.id = tu.user_id\n    \tjoin teams t on tu.team_id = t.id\n\t\tjoin project_pr_metrics ppm on ppm.id = p [...]
           "refId": "A",
-          "select": [
-            [
+          "sql": {
+            "columns": [
               {
-                "params": [
-                  "id"
-                ],
-                "type": "column"
+                "parameters": [],
+                "type": "function"
               }
-            ]
-          ],
-          "table": "_devlake_tasks",
-          "timeColumn": "created_at",
-          "timeColumnType": "timestamp",
-          "where": [
-            {
-              "name": "$__timeFilter",
-              "params": [],
-              "type": "macro"
-            }
-          ]
+            ],
+            "groupBy": [
+              {
+                "property": {
+                  "type": "string"
+                },
+                "type": "groupBy"
+              }
+            ],
+            "limit": 50
+          }
         }
       ],
       "title": "Median Lead Time for Changes",
       "type": "stat"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "fieldConfig": {
         "defaults": {
           "color": {
@@ -451,7 +515,7 @@
         "h": 5,
         "w": 6,
         "x": 12,
-        "y": 8
+        "y": 12
       },
       "id": 13,
       "options": {
@@ -469,44 +533,46 @@
         "text": {},
         "textMode": "auto"
       },
-      "pluginVersion": "8.4.7",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
-          "datasource": "mysql",
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
+          "editorMode": "code",
           "format": "table",
-          "group": [],
-          "metricColumn": "none",
-          "queryType": "randomWalk",
+          "hide": false,
           "rawQuery": true,
-          "rawSql": "-- Metric 3: Median time to restore service \nwith _incidents as (\n-- get the incidents created within the selected time period in the top-right corner\n\tSELECT\n\t  distinct i.id,\n\t\tcast(lead_time_minutes as signed) as lead_time_minutes\n\tFROM\n\t\tissues 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\t  join user_accounts ua on i.assignee_id = ua.account_id\n      j [...]
+          "rawSql": "-- Metric 3: Median time to restore service \nwith _incidents as (\n-- get the incidents created within the selected time period in the top-right corner\n\tSELECT\n\t  distinct i.id,\n\t\tcast(lead_time_minutes as signed) as lead_time_minutes\n\tFROM\n\t\tissues 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 and pm.`table` = 'boards'\n\t  join user_accounts ua on i.assignee_i [...]
           "refId": "A",
-          "select": [
-            [
+          "sql": {
+            "columns": [
               {
-                "params": [
-                  "id"
-                ],
-                "type": "column"
+                "parameters": [],
+                "type": "function"
               }
-            ]
-          ],
-          "table": "_devlake_tasks",
-          "timeColumn": "created_at",
-          "timeColumnType": "timestamp",
-          "where": [
-            {
-              "name": "$__timeFilter",
-              "params": [],
-              "type": "macro"
-            }
-          ]
+            ],
+            "groupBy": [
+              {
+                "property": {
+                  "type": "string"
+                },
+                "type": "groupBy"
+              }
+            ],
+            "limit": 50
+          }
         }
       ],
       "title": "Median Time to Restore Service",
       "type": "stat"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "fieldConfig": {
         "defaults": {
           "color": {
@@ -551,7 +617,7 @@
         "h": 5,
         "w": 6,
         "x": 18,
-        "y": 8
+        "y": 12
       },
       "id": 14,
       "options": {
@@ -569,50 +635,54 @@
         "text": {},
         "textMode": "auto"
       },
-      "pluginVersion": "8.4.7",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
-          "datasource": "mysql",
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
+          "editorMode": "code",
           "format": "table",
-          "group": [],
-          "metricColumn": "none",
-          "queryType": "randomWalk",
+          "hide": false,
           "rawQuery": true,
-          "rawSql": "-- Metric 4: change failure rate\nwith _deployments as (\n-- When deploying multiple commits in one pipeline, GitLab and BitBucket may generate more than one deployment. However, DevLake consider these deployments as ONE production deployment and use the last one's finished_date as the finished date.\n\tSELECT\n\t\tcdc.cicd_deployment_id as deployment_id,\n\t\tmax(cdc.finished_date) as deployment_finished_date\n\tFROM \n\t\tcicd_deployment_commits cdc\n\t    JOIN com [...]
+          "rawSql": "-- Metric 4: change failure rate\nwith _deployments as (\n-- When deploying multiple commits in one pipeline, GitLab and BitBucket may generate more than one deployment. However, DevLake consider these deployments as ONE production deployment and use the last one's finished_date as the finished date.\n\tSELECT\n\t\tcdc.cicd_deployment_id as deployment_id,\n\t\tmax(cdc.finished_date) as deployment_finished_date\n\tFROM \n\t\tcicd_deployment_commits cdc\n\t    JOIN com [...]
           "refId": "A",
-          "select": [
-            [
+          "sql": {
+            "columns": [
               {
-                "params": [
-                  "id"
-                ],
-                "type": "column"
+                "parameters": [],
+                "type": "function"
               }
-            ]
-          ],
-          "table": "_devlake_tasks",
-          "timeColumn": "created_at",
-          "timeColumnType": "timestamp",
-          "where": [
-            {
-              "name": "$__timeFilter",
-              "params": [],
-              "type": "macro"
-            }
-          ]
+            ],
+            "groupBy": [
+              {
+                "property": {
+                  "type": "string"
+                },
+                "type": "groupBy"
+              }
+            ],
+            "limit": 50
+          }
         }
       ],
       "title": "Change Failure Rate",
       "type": "stat"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "fieldConfig": {
         "defaults": {
           "color": {
             "mode": "palette-classic"
           },
           "custom": {
+            "axisCenteredZero": false,
+            "axisColorMode": "text",
             "axisLabel": "",
             "axisPlacement": "auto",
             "axisSoftMin": 0,
@@ -626,6 +696,9 @@
             "lineWidth": 1,
             "scaleDistribution": {
               "type": "linear"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
             }
           },
           "mappings": [],
@@ -649,17 +722,19 @@
         "h": 8,
         "w": 12,
         "x": 0,
-        "y": 13
+        "y": 17
       },
       "id": 2,
       "options": {
         "barRadius": 0,
         "barWidth": 0.6,
+        "fullHighlight": false,
         "groupWidth": 0.7,
         "legend": {
           "calcs": [],
           "displayMode": "list",
-          "placement": "bottom"
+          "placement": "bottom",
+          "showLegend": true
         },
         "orientation": "auto",
         "showValue": "auto",
@@ -674,41 +749,43 @@
       },
       "targets": [
         {
-          "datasource": "mysql",
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
+          "editorMode": "code",
           "format": "table",
-          "group": [],
-          "metricColumn": "none",
-          "queryType": "randomWalk",
+          "hide": false,
           "rawQuery": true,
-          "rawSql": "-- Metric 1: Number of deployments per month\nwith _deployments as(\n-- When deploying multiple commits in one pipeline, GitLab and BitBucket may generate more than one deployment. However, DevLake consider these deployments as ONE production deployment and use the last one's finished_date as the finished date.\n\tSELECT \n\t\tdate_format(deployment_finished_date,'%y/%m') as month,\n\t\tcount(cicd_deployment_id) as deployment_count\n\tFROM (\n\t\tSELECT\n\t\t\tcdc.ci [...]
+          "rawSql": "-- Metric 1: Number of deployments per month\nwith _deployments as(\n-- When deploying multiple commits in one pipeline, GitLab and BitBucket may generate more than one deployment. However, DevLake consider these deployments as ONE production deployment and use the last one's finished_date as the finished date.\n\tSELECT \n\t\tdate_format(deployment_finished_date,'%y/%m') as month,\n\t\tcount(cicd_deployment_id) as deployment_count\n\tFROM (\n\t\tSELECT\n\t\t\tcdc.ci [...]
           "refId": "A",
-          "select": [
-            [
+          "sql": {
+            "columns": [
               {
-                "params": [
-                  "id"
-                ],
-                "type": "column"
+                "parameters": [],
+                "type": "function"
               }
-            ]
-          ],
-          "table": "_devlake_blueprints",
-          "timeColumn": "created_at",
-          "timeColumnType": "timestamp",
-          "where": [
-            {
-              "name": "$__timeFilter",
-              "params": [],
-              "type": "macro"
-            }
-          ]
+            ],
+            "groupBy": [
+              {
+                "property": {
+                  "type": "string"
+                },
+                "type": "groupBy"
+              }
+            ],
+            "limit": 50
+          }
         }
       ],
       "title": "Monthly deployments",
       "type": "barchart"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -716,6 +793,8 @@
             "mode": "palette-classic"
           },
           "custom": {
+            "axisCenteredZero": false,
+            "axisColorMode": "text",
             "axisLabel": "Hours",
             "axisPlacement": "auto",
             "axisSoftMin": 0,
@@ -729,6 +808,9 @@
             "lineWidth": 1,
             "scaleDistribution": {
               "type": "linear"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
             }
           },
           "mappings": [],
@@ -748,17 +830,19 @@
         "h": 8,
         "w": 12,
         "x": 12,
-        "y": 13
+        "y": 17
       },
       "id": 6,
       "options": {
         "barRadius": 0,
         "barWidth": 0.7,
+        "fullHighlight": false,
         "groupWidth": 0.7,
         "legend": {
           "calcs": [],
           "displayMode": "list",
-          "placement": "bottom"
+          "placement": "bottom",
+          "showLegend": true
         },
         "orientation": "auto",
         "showValue": "auto",
@@ -774,41 +858,43 @@
       "pluginVersion": "8.0.6",
       "targets": [
         {
-          "datasource": "mysql",
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
+          "editorMode": "code",
           "format": "table",
-          "group": [],
           "hide": false,
-          "metricColumn": "none",
           "rawQuery": true,
-          "rawSql": "-- Metric 2: median change lead time per month\nwith _pr_stats as (\n-- get the cycle time of PRs deployed by the deployments finished each month\n\tSELECT\n\t\tdistinct pr.id,\n\t\tdate_format(cdc.finished_date,'%y/%m') as month,\n\t\tppm.pr_cycle_time\n\tFROM\n\t\tpull_requests pr\n\t\tjoin user_accounts ua on pr.author_id = ua.account_id\n    \tjoin users u on ua.user_id = u.id\n    \tjoin team_users tu on u.id = tu.user_id\n    \tjoin teams t on tu.team_id = t.id [...]
+          "rawSql": "-- Metric 2: median change lead time per month\nwith _pr_stats as (\n-- get the cycle time of PRs deployed by the deployments finished each month\n\tSELECT\n\t\tdistinct pr.id,\n\t\tdate_format(cdc.finished_date,'%y/%m') as month,\n\t\tppm.pr_cycle_time\n\tFROM\n\t\tpull_requests pr\n\t\tjoin user_accounts ua on pr.author_id = ua.account_id\n    \tjoin users u on ua.user_id = u.id\n    \tjoin team_users tu on u.id = tu.user_id\n    \tjoin teams t on tu.team_id = t.id [...]
           "refId": "A",
-          "select": [
-            [
+          "sql": {
+            "columns": [
               {
-                "params": [
-                  "id"
-                ],
-                "type": "column"
+                "parameters": [],
+                "type": "function"
               }
-            ]
-          ],
-          "table": "ae_projects",
-          "timeColumn": "ae_create_time",
-          "timeColumnType": "timestamp",
-          "where": [
-            {
-              "name": "$__timeFilter",
-              "params": [],
-              "type": "macro"
-            }
-          ]
+            ],
+            "groupBy": [
+              {
+                "property": {
+                  "type": "string"
+                },
+                "type": "groupBy"
+              }
+            ],
+            "limit": 50
+          }
         }
       ],
       "title": "Median Lead Time for Changes",
       "type": "barchart"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -816,6 +902,8 @@
             "mode": "palette-classic"
           },
           "custom": {
+            "axisCenteredZero": false,
+            "axisColorMode": "text",
             "axisLabel": "Hours",
             "axisPlacement": "auto",
             "axisSoftMin": 0,
@@ -829,6 +917,9 @@
             "lineWidth": 1,
             "scaleDistribution": {
               "type": "linear"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
             }
           },
           "mappings": [],
@@ -869,17 +960,19 @@
         "h": 8,
         "w": 12,
         "x": 0,
-        "y": 21
+        "y": 25
       },
       "id": 9,
       "options": {
         "barRadius": 0,
         "barWidth": 0.6,
+        "fullHighlight": false,
         "groupWidth": 0.7,
         "legend": {
           "calcs": [],
           "displayMode": "list",
-          "placement": "bottom"
+          "placement": "bottom",
+          "showLegend": true
         },
         "orientation": "auto",
         "showValue": "auto",
@@ -895,41 +988,43 @@
       "pluginVersion": "8.0.6",
       "targets": [
         {
-          "datasource": "mysql",
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
+          "editorMode": "code",
           "format": "table",
-          "group": [],
           "hide": false,
-          "metricColumn": "none",
           "rawQuery": true,
-          "rawSql": "-- Metric 3: median time to restore service - MTTR\nwith _incidents as (\n-- get the number of incidents created each month\n\tSELECT\n\t  distinct i.id,\n\t\tdate_format(i.created_date,'%y/%m') as month,\n\t\tcast(lead_time_minutes as signed) as lead_time_minutes\n\tFROM\n\t\tissues 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\t  join user_accounts ua on i.assignee_id =  [...]
+          "rawSql": "-- Metric 3: median time to restore service - MTTR\nwith _incidents as (\n-- get the number of incidents created each month\n\tSELECT\n\t  distinct i.id,\n\t\tdate_format(i.created_date,'%y/%m') as month,\n\t\tcast(lead_time_minutes as signed) as lead_time_minutes\n\tFROM\n\t\tissues 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 and pm.`table` = 'boards'\n\t  join user_accou [...]
           "refId": "A",
-          "select": [
-            [
+          "sql": {
+            "columns": [
               {
-                "params": [
-                  "id"
-                ],
-                "type": "column"
+                "parameters": [],
+                "type": "function"
               }
-            ]
-          ],
-          "table": "ae_projects",
-          "timeColumn": "ae_create_time",
-          "timeColumnType": "timestamp",
-          "where": [
-            {
-              "name": "$__timeFilter",
-              "params": [],
-              "type": "macro"
-            }
-          ]
+            ],
+            "groupBy": [
+              {
+                "property": {
+                  "type": "string"
+                },
+                "type": "groupBy"
+              }
+            ],
+            "limit": 50
+          }
         }
       ],
       "title": "Median Time to Restore Service",
       "type": "barchart"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -937,6 +1032,8 @@
             "mode": "palette-classic"
           },
           "custom": {
+            "axisCenteredZero": false,
+            "axisColorMode": "text",
             "axisLabel": "",
             "axisPlacement": "auto",
             "axisSoftMin": 0,
@@ -950,6 +1047,9 @@
             "lineWidth": 1,
             "scaleDistribution": {
               "type": "linear"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
             }
           },
           "mappings": [],
@@ -988,17 +1088,19 @@
         "h": 8,
         "w": 12,
         "x": 12,
-        "y": 21
+        "y": 25
       },
       "id": 5,
       "options": {
         "barRadius": 0,
         "barWidth": 0.6,
+        "fullHighlight": false,
         "groupWidth": 0.7,
         "legend": {
           "calcs": [],
           "displayMode": "list",
-          "placement": "bottom"
+          "placement": "bottom",
+          "showLegend": true
         },
         "orientation": "auto",
         "showValue": "auto",
@@ -1014,34 +1116,33 @@
       "pluginVersion": "8.0.6",
       "targets": [
         {
-          "datasource": "mysql",
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
+          "editorMode": "code",
           "format": "table",
-          "group": [],
           "hide": false,
-          "metricColumn": "none",
           "rawQuery": true,
-          "rawSql": "-- Metric 4: change failure rate per month\nwith _deployments as (\n-- When deploying multiple commits in one pipeline, GitLab and BitBucket may generate more than one deployment. However, DevLake consider these deployments as ONE production deployment and use the last one's finished_date as the finished date.\n\tSELECT\n\t\tcdc.cicd_deployment_id as deployment_id,\n\t\tmax(cdc.finished_date) as deployment_finished_date\n\tFROM \n\t\tcicd_deployment_commits cdc\n\t\t [...]
+          "rawSql": "-- Metric 4: change failure rate per month\nwith _deployments as (\n-- When deploying multiple commits in one pipeline, GitLab and BitBucket may generate more than one deployment. However, DevLake consider these deployments as ONE production deployment and use the last one's finished_date as the finished date.\n\tSELECT\n\t\tcdc.cicd_deployment_id as deployment_id,\n\t\tmax(cdc.finished_date) as deployment_finished_date\n\tFROM \n\t\tcicd_deployment_commits cdc\n\t\t [...]
           "refId": "A",
-          "select": [
-            [
+          "sql": {
+            "columns": [
               {
-                "params": [
-                  "id"
-                ],
-                "type": "column"
+                "parameters": [],
+                "type": "function"
               }
-            ]
-          ],
-          "table": "ae_projects",
-          "timeColumn": "ae_create_time",
-          "timeColumnType": "timestamp",
-          "where": [
-            {
-              "name": "$__timeFilter",
-              "params": [],
-              "type": "macro"
-            }
-          ]
+            ],
+            "groupBy": [
+              {
+                "property": {
+                  "type": "string"
+                },
+                "type": "groupBy"
+              }
+            ],
+            "limit": 50
+          }
         }
       ],
       "title": "Change Failure Rate",
@@ -1049,27 +1150,26 @@
     }
   ],
   "refresh": "",
-  "schemaVersion": 35,
+  "schemaVersion": 38,
   "style": "dark",
   "tags": [],
   "templating": {
     "list": [
       {
         "current": {
-          "selected": true,
-          "text": [
-            "Experience"
-          ],
-          "value": [
-            "Experience"
-          ]
+          "selected": false,
+          "text": "All",
+          "value": "$__all"
+        },
+        "datasource": {
+          "type": "mysql",
+          "uid": "P430005175C4C7810"
         },
-        "datasource": "mysql",
         "definition": "select distinct name from teams",
         "hide": 0,
         "includeAll": true,
         "label": "Team",
-        "multi": true,
+        "multi": false,
         "name": "team",
         "options": [],
         "query": "select distinct name from teams",
@@ -1089,6 +1189,6 @@
   "timezone": "",
   "title": "DORA (by Team)",
   "uid": "66YkL8y4z",
-  "version": 14,
+  "version": 33,
   "weekStart": ""
-}
+}
\ No newline at end of file
diff --git a/charts/devlake/dashboards/EngineeringOverview.json b/charts/devlake/dashboards/EngineeringOverview.json
index 4749fda..95ea4d6 100644
--- a/charts/devlake/dashboards/EngineeringOverview.json
+++ b/charts/devlake/dashboards/EngineeringOverview.json
@@ -833,7 +833,7 @@
           "metricColumn": "none",
           "queryType": "randomWalk",
           "rawQuery": true,
-          "rawSql": "select\n  count(*)\nfrom\n  lake.pull_requests pr\n  join project_mapping pm on pr.base_repo_id = pm.row_id\nwhere\n  pr.merged_date is not null \n  and date(pr.merged_date) between\n    STR_TO_DATE('$month','%Y-%m-%d')\n  and STR_TO_DATE('$month','%Y-%m-%d') + INTERVAL 1 MONTH - INTERVAL 1 DAY \n  and pm.project_name in ($project);",
+          "rawSql": "select\n  count(*)\nfrom\n  lake.pull_requests pr\n  join project_mapping pm on pr.base_repo_id = pm.row_id and pm.table = 'repos' \nwhere\n  pr.merged_date is not null \n  and date(pr.merged_date) between\n    STR_TO_DATE('$month','%Y-%m-%d')\n  and STR_TO_DATE('$month','%Y-%m-%d') + INTERVAL 1 MONTH - INTERVAL 1 DAY \n  and pm.project_name in ($project);",
           "refId": "A",
           "select": [
             [
@@ -930,7 +930,7 @@
           "metricColumn": "none",
           "queryType": "randomWalk",
           "rawQuery": true,
-          "rawSql": "with _merged_prs as(\n  select\n    DATE_ADD(date(pr.merged_date), INTERVAL -DAY(date(pr.merged_date))+1 DAY) as time,\n    count(*) as pr_merged_count\n  from\n    lake.pull_requests pr\n    join project_mapping pm on pr.base_repo_id = pm.row_id\n  where\n    pm.project_name in ($project)\n    and pr.merged_date is not null\n    and $__timeFilter(pr.merged_date)\n    and pr.merged_date >= DATE_ADD(DATE_ADD($__timeFrom(), INTERVAL -DAY($__timeFrom())+1 DAY), INTERVAL [...]
+          "rawSql": "with _merged_prs as(\n  select\n    DATE_ADD(date(pr.merged_date), INTERVAL -DAY(date(pr.merged_date))+1 DAY) as time,\n    count(*) as pr_merged_count\n  from\n    lake.pull_requests pr\n    join project_mapping pm on pr.base_repo_id = pm.row_id and pm.table = 'repos' \n  where\n    pm.project_name in ($project)\n    and pr.merged_date is not null\n    and $__timeFilter(pr.merged_date)\n    and pr.merged_date >= DATE_ADD(DATE_ADD($__timeFrom(), INTERVAL -DAY($__time [...]
           "refId": "A",
           "select": [
             [
@@ -1016,7 +1016,7 @@
           "metricColumn": "none",
           "queryType": "randomWalk",
           "rawQuery": true,
-          "rawSql": "select \n  100*sum(case when id in (select pull_request_id from pull_request_issues) then 1 else 0 end)/count(*) as unlinked_pr_rate\nfrom lake.pull_requests pr\njoin project_mapping pm on pr.base_repo_id = pm.row_id\nwhere pm.project_name in ($project)",
+          "rawSql": "select \n  100*sum(case when id in (select pull_request_id from pull_request_issues) then 1 else 0 end)/count(*) as unlinked_pr_rate\nfrom lake.pull_requests pr\njoin project_mapping pm on pr.base_repo_id = pm.row_id and pm.table = 'repos' \nwhere pm.project_name in ($project)",
           "refId": "A",
           "select": [
             [
@@ -1121,7 +1121,7 @@
           "metricColumn": "none",
           "queryType": "randomWalk",
           "rawQuery": true,
-          "rawSql": "select\n  DATE_ADD(date(created_date), INTERVAL -DAY(date(created_date))+1 DAY) as time,\n  100*sum(case when id in (select pull_request_id from pull_request_issues) then 1 else 0 end)/count(*) as unlinked_pr_rate\nfrom lake.pull_requests pr\njoin project_mapping pm on pr.base_repo_id = pm.row_id\nwhere pm.project_name in ($project)\nand $__timeFilter(created_date)\nand created_date >= DATE_ADD(DATE_ADD($__timeFrom(), INTERVAL -DAY($__timeFrom())+1 DAY), INTERVAL +1  [...]
+          "rawSql": "select\n  DATE_ADD(date(created_date), INTERVAL -DAY(date(created_date))+1 DAY) as time,\n  100*sum(case when id in (select pull_request_id from pull_request_issues) then 1 else 0 end)/count(*) as unlinked_pr_rate\nfrom lake.pull_requests pr\njoin project_mapping pm on pr.base_repo_id = pm.row_id and pm.table = 'repos' \nwhere pm.project_name in ($project)\nand $__timeFilter(created_date)\nand created_date >= DATE_ADD(DATE_ADD($__timeFrom(), INTERVAL -DAY($__timeFrom [...]
           "refId": "A",
           "select": [
             [
@@ -1392,7 +1392,7 @@
           "metricColumn": "none",
           "queryType": "randomWalk",
           "rawQuery": true,
-          "rawSql": "select\n  AVG(TIMESTAMPDIFF(MINUTE, pr.created_date, pr.merged_date) / 1440)\nfrom\n  lake.pull_requests pr\n  join project_mapping pm on pr.base_repo_id = pm.row_id\nwhere\n  pm.project_name in ($project) and\n  pr.merged_date is not null\n  and date(pr.created_date) between\n    STR_TO_DATE('$month','%Y-%m-%d') \n    and STR_TO_DATE('$month','%Y-%m-%d') + INTERVAL 1 MONTH - INTERVAL 1 DAY",
+          "rawSql": "select\n  AVG(TIMESTAMPDIFF(MINUTE, pr.created_date, pr.merged_date) / 1440)\nfrom\n  lake.pull_requests pr\n  join project_mapping pm on pr.base_repo_id = pm.row_id and pm.table = 'repos' \nwhere\n  pm.project_name in ($project) and\n  pr.merged_date is not null\n  and date(pr.created_date) between\n    STR_TO_DATE('$month','%Y-%m-%d') \n    and STR_TO_DATE('$month','%Y-%m-%d') + INTERVAL 1 MONTH - INTERVAL 1 DAY",
           "refId": "A",
           "select": [
             [
@@ -1499,7 +1499,7 @@
           "metricColumn": "none",
           "queryType": "randomWalk",
           "rawQuery": true,
-          "rawSql": "select\n  DATE_ADD(date(pr.created_date), INTERVAL -DAY(date(pr.created_date))+1 DAY) as time,\n  AVG(TIMESTAMPDIFF(MINUTE, pr.created_date, pr.merged_date) / 1440) as pr_cycle_time_in_days\nfrom\n  lake.pull_requests pr\n  join project_mapping pm on pr.base_repo_id = pm.row_id\nwhere\n  pm.project_name in ($project) and\n  pr.merged_date is not null\n  and $__timeFilter(pr.created_date)\n  and pr.created_date >= DATE_ADD(DATE_ADD($__timeFrom(), INTERVAL -DAY($__time [...]
+          "rawSql": "select\n  DATE_ADD(date(pr.created_date), INTERVAL -DAY(date(pr.created_date))+1 DAY) as time,\n  AVG(TIMESTAMPDIFF(MINUTE, pr.created_date, pr.merged_date) / 1440) as pr_cycle_time_in_days\nfrom\n  lake.pull_requests pr\n  join project_mapping pm on pr.base_repo_id = pm.row_id and pm.table = 'repos' \nwhere\n  pm.project_name in ($project) and\n  pr.merged_date is not null\n  and $__timeFilter(pr.created_date)\n  and pr.created_date >= DATE_ADD(DATE_ADD($__timeFrom( [...]
           "refId": "A",
           "select": [
             [
diff --git a/charts/devlake/dashboards/EngineeringThroughputAndCycleTime.json b/charts/devlake/dashboards/EngineeringThroughputAndCycleTime.json
index eeeb80e..cadd47d 100644
--- a/charts/devlake/dashboards/EngineeringThroughputAndCycleTime.json
+++ b/charts/devlake/dashboards/EngineeringThroughputAndCycleTime.json
@@ -167,7 +167,7 @@
           "hide": false,
           "metricColumn": "none",
           "rawQuery": true,
-          "rawSql": "SELECT\n  DATE_ADD(date(pr.created_date), INTERVAL -$interval(date(pr.created_date))+1 DAY) as time,\n  count(distinct pr.id) as \"PR: Opened\",\n  count(distinct case when pr.merged_date is not null then id else null end) as \"PR: Merged\"\nFROM pull_requests pr\n  join project_mapping pm on pr.base_repo_id = pm.row_id\nWHERE\n  $__timeFilter(pr.created_date)\n  and pm.project_name in ($project)\ngroup by 1\n",
+          "rawSql": "SELECT\n  DATE_ADD(date(pr.created_date), INTERVAL -$interval(date(pr.created_date))+1 DAY) as time,\n  count(distinct pr.id) as \"PR: Opened\",\n  count(distinct case when pr.merged_date is not null then id else null end) as \"PR: Merged\"\nFROM pull_requests pr\n  join project_mapping pm on pr.base_repo_id = pm.row_id and pm.table = 'repos' \nWHERE\n  $__timeFilter(pr.created_date)\n  and pm.project_name in ($project)\ngroup by 1\n",
           "refId": "A",
           "select": [
             [
@@ -412,7 +412,7 @@
           "hide": false,
           "metricColumn": "none",
           "rawQuery": true,
-          "rawSql": "SELECT\n  DATE_ADD(date(i.created_date), INTERVAL -$interval(date(i.created_date))+1 DAY) as time,\n  sum(case when i.status = 'DONE' then i.story_point else 0 end) as 'Story Points Completed'\nFROM issues i\n\tjoin board_issues bi on i.id = bi.issue_id\n\tjoin boards b on bi.board_id = b.id\n\tjoin project_mapping pm on b.id = pm.row_id\nWHERE\n  $__timeFilter(i.created_date)\n  and pm.project_name in ($project)\ngroup by 1",
+          "rawSql": "SELECT\n  DATE_ADD(date(i.resolution_date), INTERVAL -$interval(date(i.resolution_date))+1 DAY) as time,\n  sum(case when i.status = 'DONE' then i.story_point else 0 end) as 'Story Points Completed'\nFROM issues i\n\tjoin board_issues bi on i.id = bi.issue_id\n\tjoin boards b on bi.board_id = b.id\n\tjoin project_mapping pm on b.id = pm.row_id\nWHERE\n  $__timeFilter(i.resolution_date)\n  and pm.project_name in ($project)\ngroup by 1\norder by 1",
           "refId": "A",
           "select": [
             [
@@ -519,7 +519,7 @@
           "hide": false,
           "metricColumn": "none",
           "rawQuery": true,
-          "rawSql": "SELECT\n  DATE_ADD(date(pr.created_date), INTERVAL -$interval(date(pr.created_date))+1 DAY) as time,\n  count(distinct prc.id)/count(distinct pr.id) as \"PR Review Depth\"\nFROM \n  pull_requests pr\n  left join pull_request_comments prc on pr.id = prc.pull_request_id\n  join project_mapping pm on pr.base_repo_id = pm.row_id\nWHERE\n  $__timeFilter(pr.created_date)\n  and pm.project_name in ($project)\n  and pr.merged_date is not null\ngroup by 1\n",
+          "rawSql": "SELECT\n  DATE_ADD(date(pr.created_date), INTERVAL -$interval(date(pr.created_date))+1 DAY) as time,\n  count(distinct prc.id)/count(distinct pr.id) as \"PR Review Depth\"\nFROM \n  pull_requests pr\n  left join pull_request_comments prc on pr.id = prc.pull_request_id\n  join project_mapping pm on pr.base_repo_id = pm.row_id and pm.table = 'repos' \nWHERE\n  $__timeFilter(pr.created_date)\n  and pm.project_name in ($project)\n  and pr.merged_date is not null\ngroup by 1\n",
           "refId": "A",
           "select": [
             [
@@ -734,7 +734,7 @@
           "hide": false,
           "metricColumn": "none",
           "rawQuery": true,
-          "rawSql": "with _pr_commits_data as(\n  SELECT\n    DATE_ADD(date(pr.created_date), INTERVAL -$interval(date(pr.created_date))+1 DAY) as time,\n    pr.id as pr_id,\n    prc.commit_sha,\n    sum(c.additions)+sum(c.deletions) as loc\n  FROM \n    pull_requests pr\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 project_mapping pm on pr.base_repo_id = pm.row_id\n  WHERE\n    $__timeFilter(pr.created [...]
+          "rawSql": "with _pr_commits_data as(\n  SELECT\n    DATE_ADD(date(pr.created_date), INTERVAL -$interval(date(pr.created_date))+1 DAY) as time,\n    pr.id as pr_id,\n    prc.commit_sha,\n    sum(c.additions)+sum(c.deletions) as loc\n  FROM \n    pull_requests pr\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 project_mapping pm on pr.base_repo_id = pm.row_id and pm.table = 'repos' \n  WHERE\n     [...]
           "refId": "A",
           "select": [
             [
@@ -838,7 +838,7 @@
           "hide": false,
           "metricColumn": "none",
           "rawQuery": true,
-          "rawSql": "SELECT\n  DATE_ADD(date(pr.created_date), INTERVAL -$interval(date(pr.created_date))+1 DAY) as time,\n  sum(case when pr.id not in (SELECT pull_request_id FROM pull_request_comments) then 1 else 0 end) as \"PRs Merged w/o Review\"\nFROM \n  pull_requests pr\n  join project_mapping pm on pr.base_repo_id = pm.row_id\nWHERE\n  $__timeFilter(pr.created_date)\n  and pm.project_name in ($project)\n  and pr.merged_date is not null\nGROUP BY 1\nORDER BY 1",
+          "rawSql": "SELECT\n  DATE_ADD(date(pr.created_date), INTERVAL -$interval(date(pr.created_date))+1 DAY) as time,\n  sum(case when pr.id not in (SELECT pull_request_id FROM pull_request_comments) then 1 else 0 end) as \"PRs Merged w/o Review\"\nFROM \n  pull_requests pr\n  join project_mapping pm on pr.base_repo_id = pm.row_id and pm.table = 'repos' \nWHERE\n  $__timeFilter(pr.created_date)\n  and pm.project_name in ($project)\n  and pr.merged_date is not null\nGROUP BY 1\nORDER BY 1",
           "refId": "A",
           "select": [
             [
@@ -987,7 +987,7 @@
           "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  FROM pull_requests pr\n    left join project_pr_metrics prm on pr.id = prm.id\n    join project_mapping pm on pr.base_repo_id = pm.row_id\n  WHERE\n    $__timeFilter(pr.created_date)\n    and pr.created_date >= DATE_ADD(DAT [...]
+          "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  FROM pull_requests pr\n    left join project_pr_metrics prm on pr.id = prm.id\n    join project_mapping pm on pr.base_repo_id = pm.row_id and pm.table = 'repos' \n  WHERE\n    $__timeFilter(pr.created_date)\n    and pr.crea [...]
           "refId": "A",
           "select": [
             [
@@ -1091,7 +1091,7 @@
           "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  FROM pull_requests pr\n    left join project_pr_metrics prm on pr.id = prm.id\n    join project_mapping pm on pr.base_repo_id = pm.row_id\n  WHERE\n    $__timeFilter(pr.created_date)\n    and pr.created_date >= DATE_ADD(DA [...]
+          "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  FROM pull_requests pr\n    left join project_pr_metrics prm on pr.id = prm.id\n    join project_mapping pm on pr.base_repo_id = pm.row_id and pm.table = 'repos' \n  WHERE\n    $__timeFilter(pr.created_date)\n    and pr.cre [...]
           "refId": "A",
           "select": [
             [
@@ -1226,7 +1226,7 @@
           "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  FROM pull_requests pr\n    left join project_pr_metrics prm on pr.id = prm.id\n    join project_mapping pm on pr.base_repo_id = pm.row_id\n  WHERE\n    $__timeFilter(pr.created_date)\n    and pr.created_date >= DATE_ADD(DA [...]
+          "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  FROM pull_requests pr\n    left join project_pr_metrics prm on pr.id = prm.id\n    join project_mapping pm on pr.base_repo_id = pm.row_id and pm.table = 'repos' \n  WHERE\n    $__timeFilter(pr.created_date)\n    and pr.cre [...]
           "refId": "A",
           "select": [
             [
@@ -1361,7 +1361,7 @@
           "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  FROM pull_requests pr\n    left join project_pr_metrics prm on pr.id = prm.id\n    join project_mapping pm on pr.base_repo_id = pm.row_id\n  WHERE\n    $__timeFilter(pr.created_date)\n    and pr.created_date >= DATE_ADD(DA [...]
+          "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  FROM pull_requests pr\n    left join project_pr_metrics prm on pr.id = prm.id\n    join project_mapping pm on pr.base_repo_id = pm.row_id and pm.table = 'repos' \n  WHERE\n    $__timeFilter(pr.created_date)\n    and pr.cre [...]
           "refId": "A",
           "select": [
             [
@@ -1496,7 +1496,7 @@
           "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  FROM pull_requests pr\n    left join project_pr_metrics prm on pr.id = prm.id\n    join project_mapping pm on pr.base_repo_id = pm.row_id\n  WHERE\n    $__timeFilter(pr.created_date)\n    and pr.created_date >= DATE_ADD(DA [...]
+          "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  FROM pull_requests pr\n    left join project_pr_metrics prm on pr.id = prm.id\n    join project_mapping pm on pr.base_repo_id = pm.row_id and pm.table = 'repos' \n  WHERE\n    $__timeFilter(pr.created_date)\n    and pr.cre [...]
           "refId": "A",
           "select": [
             [
diff --git a/charts/devlake/dashboards/EngineeringThroughputAndCycleTimeTeamView.json b/charts/devlake/dashboards/EngineeringThroughputAndCycleTimeTeamView.json
index dad862b..04fdc8c 100644
--- a/charts/devlake/dashboards/EngineeringThroughputAndCycleTimeTeamView.json
+++ b/charts/devlake/dashboards/EngineeringThroughputAndCycleTimeTeamView.json
@@ -167,7 +167,7 @@
           "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   [...]
+          "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 and [...]
           "refId": "A",
           "select": [
             [
@@ -305,7 +305,7 @@
           "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   [...]
+          "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 and pm.table = 'repos' \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  [...]
           "refId": "A",
           "select": [
             [
@@ -443,7 +443,7 @@
           "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   [...]
+          "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 and pm.table = 'repos' \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  [...]
           "refId": "A",
           "select": [
             [
@@ -581,7 +581,7 @@
           "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   [...]
+          "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 and pm.table = 'repos' \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  [...]
           "refId": "A",
           "select": [
             [
@@ -1313,7 +1313,7 @@
           "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 [...]
+          "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 and pm.table = 'repos' \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 [...]
           "refId": "A",
           "select": [
             [
@@ -1451,7 +1451,7 @@
           "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   [...]
+          "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 and pm.table = 'repos' \n    left join pull_request_commits prc on pr.id = prc.pull_request_id\n    left join commits c on pr [...]
           "refId": "A",
           "select": [
             [
@@ -1890,7 +1890,7 @@
           "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_metri [...]
+          "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 and pm.table = 'repos' \n\t\tle [...]
           "refId": "A",
           "select": [
             [
@@ -2025,7 +2025,7 @@
           "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_metr [...]
+          "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 and pm.table = 'repos' \n\t\tl [...]
           "refId": "A",
           "select": [
             [
@@ -2160,7 +2160,7 @@
           "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_metr [...]
+          "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 and pm.table = 'repos' \n\t\tl [...]
           "refId": "A",
           "select": [
             [
@@ -2295,7 +2295,7 @@
           "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_metr [...]
+          "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 and pm.table = 'repos' \n\t\tl [...]
           "refId": "A",
           "select": [
             [
@@ -2430,7 +2430,7 @@
           "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_metr [...]
+          "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 and pm.table = 'repos' \n\t\tl [...]
           "refId": "A",
           "select": [
             [
@@ -2579,7 +2579,7 @@
           "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 [...]
+          "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 and pm.table = 'repos' \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 t [...]
           "refId": "A",
           "select": [
             [
diff --git a/charts/devlake/dashboards/GitHub.json b/charts/devlake/dashboards/GitHub.json
index 5dd0ce3..b775681 100644
--- a/charts/devlake/dashboards/GitHub.json
+++ b/charts/devlake/dashboards/GitHub.json
@@ -3,7 +3,10 @@
     "list": [
       {
         "builtIn": 1,
-        "datasource": "-- Grafana --",
+        "datasource": {
+          "type": "datasource",
+          "uid": "grafana"
+        },
         "enable": true,
         "hide": true,
         "iconColor": "rgba(0, 211, 255, 1)",
@@ -13,14 +16,17 @@
     ]
   },
   "editable": true,
-  "gnetId": null,
+  "fiscalYearStartMonth": 0,
   "graphTooltip": 0,
-  "id": 26,
-  "iteration": 1683710488565,
+  "id": 18,
   "links": [],
+  "liveNow": false,
   "panels": [
     {
-      "datasource": null,
+      "datasource": {
+        "type": "datasource",
+        "uid": "grafana"
+      },
       "gridPos": {
         "h": 3,
         "w": 13,
@@ -29,12 +35,21 @@
       },
       "id": 99,
       "options": {
+        "code": {
+          "language": "plaintext",
+          "showLineNumbers": false,
+          "showMiniMap": false
+        },
         "content": "- Use Cases: This dashboard shows the basic Git and Code Review metrics from GitHub.\n- Data Source Required: GitHub",
         "mode": "markdown"
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "datasource",
+            "uid": "grafana"
+          },
           "queryType": "randomWalk",
           "refId": "A"
         }
@@ -44,7 +59,10 @@
     },
     {
       "collapsed": false,
-      "datasource": null,
+      "datasource": {
+        "type": "datasource",
+        "uid": "grafana"
+      },
       "gridPos": {
         "h": 1,
         "w": 24,
@@ -53,11 +71,23 @@
       },
       "id": 89,
       "panels": [],
+      "targets": [
+        {
+          "datasource": {
+            "type": "datasource",
+            "uid": "grafana"
+          },
+          "refId": "A"
+        }
+      ],
       "title": "1. User Requirements (Issues)",
       "type": "row"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -103,9 +133,13 @@
         "text": {},
         "textMode": "auto"
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "hide": false,
@@ -139,7 +173,10 @@
       "type": "stat"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -147,6 +184,8 @@
             "mode": "palette-classic"
           },
           "custom": {
+            "axisCenteredZero": false,
+            "axisColorMode": "text",
             "axisLabel": "Issue Count",
             "axisPlacement": "auto",
             "axisSoftMin": 0,
@@ -157,7 +196,13 @@
               "tooltip": false,
               "viz": false
             },
-            "lineWidth": 1
+            "lineWidth": 1,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
           },
           "mappings": [],
           "thresholds": {
@@ -184,27 +229,38 @@
       },
       "id": 74,
       "options": {
+        "barRadius": 0,
         "barWidth": 0.5,
+        "fullHighlight": false,
         "groupWidth": 0.7,
         "legend": {
           "calcs": [
             "mean"
           ],
           "displayMode": "list",
-          "placement": "bottom"
+          "placement": "bottom",
+          "showLegend": true
         },
         "orientation": "auto",
         "showValue": "auto",
+        "stacking": "none",
         "text": {
           "valueSize": 12
         },
         "tooltip": {
-          "mode": "single"
-        }
+          "mode": "single",
+          "sort": "none"
+        },
+        "xTickLabelRotation": 0,
+        "xTickLabelSpacing": 0
       },
       "pluginVersion": "8.0.6",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "hide": false,
@@ -239,7 +295,10 @@
     },
     {
       "collapsed": false,
-      "datasource": null,
+      "datasource": {
+        "type": "datasource",
+        "uid": "grafana"
+      },
       "gridPos": {
         "h": 1,
         "w": 24,
@@ -248,11 +307,23 @@
       },
       "id": 87,
       "panels": [],
+      "targets": [
+        {
+          "datasource": {
+            "type": "datasource",
+            "uid": "grafana"
+          },
+          "refId": "A"
+        }
+      ],
       "title": "2. How issues are handled?",
       "type": "row"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -298,9 +369,13 @@
         "text": {},
         "textMode": "auto"
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "hide": false,
@@ -334,7 +409,10 @@
       "type": "stat"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -342,6 +420,8 @@
             "mode": "fixed"
           },
           "custom": {
+            "axisCenteredZero": false,
+            "axisColorMode": "text",
             "axisLabel": "Issue Count",
             "axisPlacement": "auto",
             "barAlignment": 1,
@@ -415,15 +495,21 @@
             "sum"
           ],
           "displayMode": "list",
-          "placement": "bottom"
+          "placement": "bottom",
+          "showLegend": true
         },
         "tooltip": {
-          "mode": "multi"
+          "mode": "multi",
+          "sort": "none"
         }
       },
       "pluginVersion": "8.0.6",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "time_series",
           "group": [],
           "hide": false,
@@ -457,7 +543,10 @@
       "type": "timeseries"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -503,9 +592,13 @@
         "text": {},
         "textMode": "auto"
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "hide": false,
@@ -539,7 +632,10 @@
       "type": "stat"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -547,6 +643,8 @@
             "mode": "palette-classic"
           },
           "custom": {
+            "axisCenteredZero": false,
+            "axisColorMode": "text",
             "axisLabel": "",
             "axisPlacement": "auto",
             "axisSoftMin": 0,
@@ -557,7 +655,13 @@
               "tooltip": false,
               "viz": false
             },
-            "lineWidth": 1
+            "lineWidth": 1,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
           },
           "mappings": [],
           "thresholds": {
@@ -584,25 +688,36 @@
       },
       "id": 75,
       "options": {
+        "barRadius": 0,
         "barWidth": 0.5,
+        "fullHighlight": false,
         "groupWidth": 0.7,
         "legend": {
           "calcs": [],
           "displayMode": "list",
-          "placement": "bottom"
+          "placement": "bottom",
+          "showLegend": true
         },
         "orientation": "auto",
         "showValue": "auto",
+        "stacking": "none",
         "text": {
           "valueSize": 12
         },
         "tooltip": {
-          "mode": "single"
-        }
+          "mode": "single",
+          "sort": "none"
+        },
+        "xTickLabelRotation": 0,
+        "xTickLabelSpacing": 0
       },
       "pluginVersion": "8.0.6",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "hide": false,
@@ -636,7 +751,10 @@
       "type": "barchart"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -644,17 +762,25 @@
             "mode": "palette-classic"
           },
           "custom": {
+            "axisCenteredZero": false,
+            "axisColorMode": "text",
             "axisLabel": "Queue Time (Days)",
             "axisPlacement": "auto",
             "axisSoftMin": 0,
-            "fillOpacity": 80,
+            "fillOpacity": 100,
             "gradientMode": "none",
             "hideFrom": {
               "legend": false,
               "tooltip": false,
               "viz": false
             },
-            "lineWidth": 1
+            "lineWidth": 1,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "thresholdsStyle": {
+              "mode": "line"
+            }
           },
           "mappings": [],
           "thresholds": {
@@ -666,7 +792,7 @@
               },
               {
                 "color": "red",
-                "value": 80
+                "value": 30
               }
             ]
           },
@@ -682,31 +808,43 @@
       },
       "id": 93,
       "options": {
+        "barRadius": 0,
         "barWidth": 0.1,
+        "fullHighlight": false,
         "groupWidth": 0.7,
         "legend": {
           "calcs": [
             "mean"
           ],
           "displayMode": "list",
-          "placement": "bottom"
+          "placement": "bottom",
+          "showLegend": true
         },
         "orientation": "auto",
         "showValue": "auto",
+        "stacking": "none",
         "text": {},
         "tooltip": {
-          "mode": "single"
-        }
+          "mode": "multi",
+          "sort": "none"
+        },
+        "xTickLabelRotation": 45,
+        "xTickLabelSpacing": 0
       },
       "pluginVersion": "8.0.6",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
+          "editorMode": "code",
           "format": "table",
           "group": [],
           "metricColumn": "none",
           "queryType": "randomWalk",
           "rawQuery": true,
-          "rawSql": "-- Get the queue time of all outstanding bugs\nwith _outstanding_issues as(\n  select \n    b.name as repo_name,\n    i.issue_key as issue_key,\n    i.title,\n    i.created_date,\n    (TIMESTAMPDIFF(MINUTE, i.created_date,NOW()))/1440 as queue_time_in_days,\n    concat(b.url,'/',i.issue_key) as url\n  from \n    issues i\n    left join board_issues bi on i.id = bi.issue_id\n    left join boards b on bi.board_id = b.id\n  where\n    b.id in ($repo_id)\n    and $__time [...]
+          "rawSql": "-- Get the queue time of all outstanding bugs\nwith _outstanding_issues as(\n  select \n    DISTINCT\n    b.name as repo_name,\n    i.issue_key as issue_key,\n    i.title,\n    i.created_date,\n    (TIMESTAMPDIFF(MINUTE, i.created_date,NOW()))/1440 as queue_time_in_days,\n    concat(b.url,'/',i.issue_key) as url\n  from \n    issues i\n    left join board_issues bi on i.id = bi.issue_id\n    left join boards b on bi.board_id = b.id\n  where\n    b.id in ($repo_id)\n  [...]
           "refId": "A",
           "select": [
             [
@@ -718,6 +856,23 @@
               }
             ]
           ],
+          "sql": {
+            "columns": [
+              {
+                "parameters": [],
+                "type": "function"
+              }
+            ],
+            "groupBy": [
+              {
+                "property": {
+                  "type": "string"
+                },
+                "type": "groupBy"
+              }
+            ],
+            "limit": 50
+          },
           "table": "ae_projects",
           "timeColumn": "ae_create_time",
           "timeColumnType": "timestamp",
@@ -734,7 +889,10 @@
       "type": "barchart"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -743,7 +901,10 @@
           },
           "custom": {
             "align": "auto",
-            "displayMode": "auto"
+            "cellOptions": {
+              "type": "auto"
+            },
+            "inspect": false
           },
           "mappings": [],
           "thresholds": {
@@ -862,12 +1023,25 @@
       },
       "id": 92,
       "options": {
+        "cellHeight": "sm",
+        "footer": {
+          "countRows": false,
+          "fields": "",
+          "reducer": [
+            "sum"
+          ],
+          "show": false
+        },
         "showHeader": true,
         "sortBy": []
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "metricColumn": "none",
@@ -902,7 +1076,10 @@
     },
     {
       "collapsed": false,
-      "datasource": null,
+      "datasource": {
+        "type": "datasource",
+        "uid": "grafana"
+      },
       "gridPos": {
         "h": 1,
         "w": 24,
@@ -911,11 +1088,23 @@
       },
       "id": 83,
       "panels": [],
+      "targets": [
+        {
+          "datasource": {
+            "type": "datasource",
+            "uid": "grafana"
+          },
+          "refId": "A"
+        }
+      ],
       "title": "3. Contribution (PRs)",
       "type": "row"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -961,9 +1150,13 @@
         "text": {},
         "textMode": "auto"
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "hide": false,
@@ -997,7 +1190,10 @@
       "type": "stat"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -1005,6 +1201,8 @@
             "mode": "palette-classic"
           },
           "custom": {
+            "axisCenteredZero": false,
+            "axisColorMode": "text",
             "axisLabel": "",
             "axisPlacement": "auto",
             "axisSoftMin": 0,
@@ -1015,7 +1213,13 @@
               "tooltip": false,
               "viz": false
             },
-            "lineWidth": 1
+            "lineWidth": 1,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
           },
           "mappings": [],
           "thresholds": {
@@ -1042,25 +1246,36 @@
       },
       "id": 77,
       "options": {
+        "barRadius": 0,
         "barWidth": 0.5,
+        "fullHighlight": false,
         "groupWidth": 0.7,
         "legend": {
           "calcs": [],
           "displayMode": "list",
-          "placement": "bottom"
+          "placement": "bottom",
+          "showLegend": true
         },
         "orientation": "auto",
         "showValue": "auto",
+        "stacking": "none",
         "text": {
           "valueSize": 12
         },
         "tooltip": {
-          "mode": "single"
-        }
+          "mode": "single",
+          "sort": "none"
+        },
+        "xTickLabelRotation": 0,
+        "xTickLabelSpacing": 0
       },
       "pluginVersion": "8.0.6",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "hide": false,
@@ -1094,7 +1309,10 @@
       "type": "barchart"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -1102,6 +1320,8 @@
             "mode": "palette-classic"
           },
           "custom": {
+            "axisCenteredZero": false,
+            "axisColorMode": "text",
             "axisLabel": "Merged PR Count",
             "axisPlacement": "auto",
             "axisSoftMin": 0,
@@ -1112,7 +1332,13 @@
               "tooltip": false,
               "viz": false
             },
-            "lineWidth": 1
+            "lineWidth": 1,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
           },
           "mappings": [],
           "thresholds": {
@@ -1140,25 +1366,36 @@
       },
       "id": 59,
       "options": {
+        "barRadius": 0,
         "barWidth": 0.5,
+        "fullHighlight": false,
         "groupWidth": 0.7,
         "legend": {
           "calcs": [],
           "displayMode": "list",
-          "placement": "bottom"
+          "placement": "bottom",
+          "showLegend": true
         },
         "orientation": "auto",
         "showValue": "auto",
+        "stacking": "none",
         "text": {
           "valueSize": 12
         },
         "tooltip": {
-          "mode": "multi"
-        }
+          "mode": "multi",
+          "sort": "none"
+        },
+        "xTickLabelRotation": 0,
+        "xTickLabelSpacing": 0
       },
       "pluginVersion": "8.0.6",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "hide": false,
@@ -1193,7 +1430,10 @@
     },
     {
       "collapsed": false,
-      "datasource": null,
+      "datasource": {
+        "type": "datasource",
+        "uid": "grafana"
+      },
       "gridPos": {
         "h": 1,
         "w": 24,
@@ -1202,11 +1442,23 @@
       },
       "id": 85,
       "panels": [],
+      "targets": [
+        {
+          "datasource": {
+            "type": "datasource",
+            "uid": "grafana"
+          },
+          "refId": "A"
+        }
+      ],
       "title": "4. How PRs are handled?",
       "type": "row"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -1251,9 +1503,13 @@
         "text": {},
         "textMode": "auto"
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "hide": false,
@@ -1287,7 +1543,10 @@
       "type": "stat"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -1295,6 +1554,8 @@
             "mode": "palette-classic"
           },
           "custom": {
+            "axisCenteredZero": false,
+            "axisColorMode": "text",
             "axisLabel": "Pull Request Count",
             "axisPlacement": "auto",
             "barAlignment": 1,
@@ -1348,15 +1609,21 @@
             "sum"
           ],
           "displayMode": "list",
-          "placement": "bottom"
+          "placement": "bottom",
+          "showLegend": true
         },
         "tooltip": {
-          "mode": "multi"
+          "mode": "multi",
+          "sort": "none"
         }
       },
       "pluginVersion": "8.0.6",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "time_series",
           "group": [],
           "hide": false,
@@ -1390,7 +1657,10 @@
       "type": "timeseries"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -1436,9 +1706,13 @@
         "text": {},
         "textMode": "auto"
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "hide": false,
@@ -1472,7 +1746,10 @@
       "type": "stat"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -1480,6 +1757,8 @@
             "mode": "palette-classic"
           },
           "custom": {
+            "axisCenteredZero": false,
+            "axisColorMode": "text",
             "axisLabel": "Ratio",
             "axisPlacement": "auto",
             "barAlignment": 1,
@@ -1535,15 +1814,21 @@
         "legend": {
           "calcs": [],
           "displayMode": "list",
-          "placement": "bottom"
+          "placement": "bottom",
+          "showLegend": true
         },
         "tooltip": {
-          "mode": "multi"
+          "mode": "multi",
+          "sort": "none"
         }
       },
       "pluginVersion": "8.0.6",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "time_series",
           "group": [],
           "hide": false,
@@ -1577,7 +1862,10 @@
       "type": "timeseries"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -1623,9 +1911,13 @@
         "text": {},
         "textMode": "auto"
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "hide": false,
@@ -1659,7 +1951,10 @@
       "type": "stat"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -1667,6 +1962,8 @@
             "mode": "palette-classic"
           },
           "custom": {
+            "axisCenteredZero": false,
+            "axisColorMode": "text",
             "axisLabel": "",
             "axisPlacement": "auto",
             "axisSoftMin": 0,
@@ -1677,7 +1974,13 @@
               "tooltip": false,
               "viz": false
             },
-            "lineWidth": 1
+            "lineWidth": 1,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
           },
           "mappings": [],
           "thresholds": {
@@ -1704,25 +2007,36 @@
       },
       "id": 95,
       "options": {
+        "barRadius": 0,
         "barWidth": 0.5,
+        "fullHighlight": false,
         "groupWidth": 0.7,
         "legend": {
           "calcs": [],
           "displayMode": "list",
-          "placement": "bottom"
+          "placement": "bottom",
+          "showLegend": true
         },
         "orientation": "auto",
         "showValue": "auto",
+        "stacking": "none",
         "text": {
           "valueSize": 12
         },
         "tooltip": {
-          "mode": "single"
-        }
+          "mode": "single",
+          "sort": "none"
+        },
+        "xTickLabelRotation": 0,
+        "xTickLabelSpacing": 0
       },
       "pluginVersion": "8.0.6",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "hide": false,
@@ -1756,7 +2070,10 @@
       "type": "barchart"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -1800,9 +2117,13 @@
         "text": {},
         "textMode": "auto"
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "hide": false,
@@ -1836,7 +2157,10 @@
       "type": "stat"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -1844,6 +2168,8 @@
             "mode": "palette-classic"
           },
           "custom": {
+            "axisCenteredZero": false,
+            "axisColorMode": "text",
             "axisLabel": "",
             "axisPlacement": "auto",
             "axisSoftMin": 0,
@@ -1854,7 +2180,13 @@
               "tooltip": false,
               "viz": false
             },
-            "lineWidth": 1
+            "lineWidth": 1,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
           },
           "mappings": [],
           "thresholds": {
@@ -1881,25 +2213,36 @@
       },
       "id": 97,
       "options": {
+        "barRadius": 0,
         "barWidth": 0.5,
+        "fullHighlight": false,
         "groupWidth": 0.7,
         "legend": {
           "calcs": [],
           "displayMode": "list",
-          "placement": "bottom"
+          "placement": "bottom",
+          "showLegend": true
         },
         "orientation": "auto",
         "showValue": "auto",
+        "stacking": "none",
         "text": {
           "valueSize": 12
         },
         "tooltip": {
-          "mode": "single"
-        }
+          "mode": "single",
+          "sort": "none"
+        },
+        "xTickLabelRotation": 0,
+        "xTickLabelSpacing": 0
       },
       "pluginVersion": "8.0.6",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "hide": false,
@@ -1933,7 +2276,10 @@
       "type": "barchart"
     },
     {
-      "datasource": null,
+      "datasource": {
+        "type": "datasource",
+        "uid": "grafana"
+      },
       "gridPos": {
         "h": 2,
         "w": 24,
@@ -1942,12 +2288,21 @@
       },
       "id": 101,
       "options": {
+        "code": {
+          "language": "plaintext",
+          "showLineNumbers": false,
+          "showMiniMap": false
+        },
         "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",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "datasource",
+            "uid": "grafana"
+          },
           "queryType": "randomWalk",
           "refId": "A"
         }
@@ -1956,7 +2311,7 @@
     }
   ],
   "refresh": "",
-  "schemaVersion": 30,
+  "schemaVersion": 38,
   "style": "dark",
   "tags": [],
   "templating": {
@@ -1972,10 +2327,11 @@
             "$__all"
           ]
         },
-        "datasource": "mysql",
+        "datasource": {
+          "type": "mysql",
+          "uid": "P430005175C4C7810"
+        },
         "definition": "select concat(name, '--', id) as text from repos where id like 'github%'",
-        "description": null,
-        "error": null,
         "hide": 0,
         "includeAll": true,
         "label": "Repo",
@@ -1999,5 +2355,6 @@
   "timezone": "",
   "title": "GitHub",
   "uid": "KXWvOFQnz",
-  "version": 10
+  "version": 2,
+  "weekStart": ""
 }
\ No newline at end of file
diff --git a/charts/devlake/dashboards/WeeklyBugRetro.json b/charts/devlake/dashboards/WeeklyBugRetro.json
index 7e33ce8..abee645 100644
--- a/charts/devlake/dashboards/WeeklyBugRetro.json
+++ b/charts/devlake/dashboards/WeeklyBugRetro.json
@@ -3,7 +3,10 @@
     "list": [
       {
         "builtIn": 1,
-        "datasource": "-- Grafana --",
+        "datasource": {
+          "type": "datasource",
+          "uid": "grafana"
+        },
         "enable": true,
         "hide": true,
         "iconColor": "rgba(0, 211, 255, 1)",
@@ -13,14 +16,17 @@
     ]
   },
   "editable": true,
-  "gnetId": null,
+  "fiscalYearStartMonth": 0,
   "graphTooltip": 0,
-  "id": 13,
-  "iteration": 1681785827220,
+  "id": 3,
   "links": [],
+  "liveNow": false,
   "panels": [
     {
-      "datasource": null,
+      "datasource": {
+        "type": "datasource",
+        "uid": "grafana"
+      },
       "gridPos": {
         "h": 3,
         "w": 24,
@@ -29,12 +35,21 @@
       },
       "id": 28,
       "options": {
+        "code": {
+          "language": "plaintext",
+          "showLineNumbers": false,
+          "showMiniMap": false
+        },
         "content": "- Use Cases: This dashboard can be used to track bugs with metrics such as [Bug Age](https://devlake.apache.org/docs/Metrics/BugAge).\n- Data Source Required: GitHub ([transformation](https://devlake.apache.org/docs/UserManuals/ConfigUI/GitHub#step-3---adding-transformation-rules-optional) required) or Jira ([transformation](https://devlake.apache.org/docs/UserManuals/ConfigUI/Jira#step-3---adding-transformation-rules-optional) required). Transformation is the configu [...]
         "mode": "markdown"
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "datasource",
+            "uid": "grafana"
+          },
           "queryType": "randomWalk",
           "refId": "A"
         }
@@ -43,7 +58,10 @@
       "type": "text"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "fieldConfig": {
         "defaults": {
           "color": {
@@ -88,9 +106,13 @@
         "text": {},
         "textMode": "auto"
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "metricColumn": "none",
@@ -124,7 +146,10 @@
       "type": "stat"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "fieldConfig": {
         "defaults": {
           "color": {
@@ -156,6 +181,7 @@
         "legend": {
           "displayMode": "list",
           "placement": "bottom",
+          "showLegend": true,
           "values": [
             "percent",
             "value"
@@ -168,12 +194,17 @@
           "values": true
         },
         "tooltip": {
-          "mode": "multi"
+          "mode": "multi",
+          "sort": "none"
         }
       },
       "pluginVersion": "8.0.6",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "metricColumn": "none",
@@ -207,7 +238,10 @@
       "type": "piechart"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "fieldConfig": {
         "defaults": {
           "color": {
@@ -215,7 +249,10 @@
           },
           "custom": {
             "align": "auto",
-            "displayMode": "auto"
+            "cellOptions": {
+              "type": "auto"
+            },
+            "inspect": false
           },
           "mappings": [],
           "thresholds": {
@@ -320,12 +357,25 @@
       },
       "id": 4,
       "options": {
+        "cellHeight": "sm",
+        "footer": {
+          "countRows": false,
+          "fields": "",
+          "reducer": [
+            "sum"
+          ],
+          "show": false
+        },
         "showHeader": true,
         "sortBy": []
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "metricColumn": "none",
@@ -359,7 +409,10 @@
       "type": "table"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "fieldConfig": {
         "defaults": {
           "color": {
@@ -404,9 +457,13 @@
         "text": {},
         "textMode": "auto"
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "metricColumn": "none",
@@ -440,7 +497,10 @@
       "type": "stat"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "fieldConfig": {
         "defaults": {
           "color": {
@@ -490,9 +550,13 @@
         "text": {},
         "textMode": "auto"
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "metricColumn": "none",
@@ -526,7 +590,10 @@
       "type": "stat"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "fieldConfig": {
         "defaults": {
           "color": {
@@ -534,7 +601,10 @@
           },
           "custom": {
             "align": "auto",
-            "displayMode": "auto"
+            "cellOptions": {
+              "type": "auto"
+            },
+            "inspect": false
           },
           "mappings": [],
           "thresholds": {
@@ -595,8 +665,10 @@
             },
             "properties": [
               {
-                "id": "custom.displayMode",
-                "value": "color-text"
+                "id": "custom.cellOptions",
+                "value": {
+                  "type": "color-text"
+                }
               }
             ]
           }
@@ -610,12 +682,25 @@
       },
       "id": 10,
       "options": {
+        "cellHeight": "sm",
+        "footer": {
+          "countRows": false,
+          "fields": "",
+          "reducer": [
+            "sum"
+          ],
+          "show": false
+        },
         "showHeader": true,
         "sortBy": []
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "metricColumn": "none",
@@ -649,13 +734,18 @@
       "type": "table"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "fieldConfig": {
         "defaults": {
           "color": {
             "mode": "palette-classic"
           },
           "custom": {
+            "axisCenteredZero": false,
+            "axisColorMode": "text",
             "axisLabel": "",
             "axisPlacement": "auto",
             "axisSoftMin": 0,
@@ -666,7 +756,13 @@
               "tooltip": false,
               "viz": false
             },
-            "lineWidth": 1
+            "lineWidth": 1,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
           },
           "decimals": 1,
           "mappings": [],
@@ -694,25 +790,36 @@
       },
       "id": 23,
       "options": {
+        "barRadius": 0,
         "barWidth": 0.3,
+        "fullHighlight": false,
         "groupWidth": 0.7,
         "legend": {
           "calcs": [
             "mean"
           ],
           "displayMode": "list",
-          "placement": "bottom"
+          "placement": "bottom",
+          "showLegend": true
         },
         "orientation": "horizontal",
         "showValue": "auto",
+        "stacking": "none",
         "text": {},
         "tooltip": {
-          "mode": "single"
-        }
+          "mode": "single",
+          "sort": "none"
+        },
+        "xTickLabelRotation": 0,
+        "xTickLabelSpacing": 0
       },
       "pluginVersion": "8.0.6",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "metricColumn": "none",
@@ -746,7 +853,10 @@
       "type": "barchart"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "fieldConfig": {
         "defaults": {
           "color": {
@@ -791,9 +901,13 @@
         "text": {},
         "textMode": "auto"
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "metricColumn": "none",
@@ -827,7 +941,10 @@
       "type": "stat"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "fieldConfig": {
         "defaults": {
           "color": {
@@ -872,9 +989,13 @@
         "text": {},
         "textMode": "auto"
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "metricColumn": "none",
@@ -908,7 +1029,10 @@
       "type": "stat"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "fieldConfig": {
         "defaults": {
           "color": {
@@ -916,7 +1040,10 @@
           },
           "custom": {
             "align": "auto",
-            "displayMode": "auto"
+            "cellOptions": {
+              "type": "auto"
+            },
+            "inspect": false
           },
           "mappings": [],
           "thresholds": {
@@ -989,8 +1116,10 @@
             },
             "properties": [
               {
-                "id": "custom.displayMode",
-                "value": "color-text"
+                "id": "custom.cellOptions",
+                "value": {
+                  "type": "color-text"
+                }
               }
             ]
           },
@@ -1001,8 +1130,7 @@
             },
             "properties": [
               {
-                "id": "custom.width",
-                "value": null
+                "id": "custom.width"
               }
             ]
           }
@@ -1016,12 +1144,25 @@
       },
       "id": 14,
       "options": {
+        "cellHeight": "sm",
+        "footer": {
+          "countRows": false,
+          "fields": "",
+          "reducer": [
+            "sum"
+          ],
+          "show": false
+        },
         "showHeader": true,
         "sortBy": []
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "metricColumn": "none",
@@ -1055,13 +1196,18 @@
       "type": "table"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "fieldConfig": {
         "defaults": {
           "color": {
             "mode": "palette-classic"
           },
           "custom": {
+            "axisCenteredZero": false,
+            "axisColorMode": "text",
             "axisLabel": "Queue Time in Days",
             "axisPlacement": "auto",
             "axisSoftMin": 0,
@@ -1072,7 +1218,13 @@
               "tooltip": false,
               "viz": false
             },
-            "lineWidth": 1
+            "lineWidth": 1,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
           },
           "mappings": [],
           "thresholds": {
@@ -1099,7 +1251,9 @@
       },
       "id": 18,
       "options": {
+        "barRadius": 0,
         "barWidth": 0.3,
+        "fullHighlight": false,
         "groupWidth": 0.7,
         "legend": {
           "calcs": [
@@ -1107,20 +1261,29 @@
             "max"
           ],
           "displayMode": "list",
-          "placement": "bottom"
+          "placement": "bottom",
+          "showLegend": true
         },
         "orientation": "auto",
         "showValue": "always",
+        "stacking": "none",
         "text": {
           "valueSize": 12
         },
         "tooltip": {
-          "mode": "single"
-        }
+          "mode": "single",
+          "sort": "none"
+        },
+        "xTickLabelRotation": 45,
+        "xTickLabelSpacing": 0
       },
       "pluginVersion": "8.0.6",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "metricColumn": "none",
@@ -1154,7 +1317,10 @@
       "type": "barchart"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "fieldConfig": {
         "defaults": {
           "color": {
@@ -1162,7 +1328,10 @@
           },
           "custom": {
             "align": "auto",
-            "displayMode": "auto"
+            "cellOptions": {
+              "type": "auto"
+            },
+            "inspect": false
           },
           "mappings": [],
           "thresholds": {
@@ -1223,8 +1392,10 @@
             },
             "properties": [
               {
-                "id": "custom.displayMode",
-                "value": "color-text"
+                "id": "custom.cellOptions",
+                "value": {
+                  "type": "color-text"
+                }
               }
             ]
           }
@@ -1238,12 +1409,25 @@
       },
       "id": 31,
       "options": {
+        "cellHeight": "sm",
+        "footer": {
+          "countRows": false,
+          "fields": "",
+          "reducer": [
+            "sum"
+          ],
+          "show": false
+        },
         "showHeader": true,
         "sortBy": []
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "metricColumn": "none",
@@ -1277,13 +1461,18 @@
       "type": "table"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "fieldConfig": {
         "defaults": {
           "color": {
             "mode": "palette-classic"
           },
           "custom": {
+            "axisCenteredZero": false,
+            "axisColorMode": "text",
             "axisLabel": "",
             "axisPlacement": "auto",
             "axisSoftMin": 0,
@@ -1294,7 +1483,13 @@
               "tooltip": false,
               "viz": false
             },
-            "lineWidth": 1
+            "lineWidth": 1,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
           },
           "mappings": [],
           "thresholds": {
@@ -1321,24 +1516,35 @@
       },
       "id": 2,
       "options": {
+        "barRadius": 0,
         "barWidth": 0.71,
+        "fullHighlight": false,
         "groupWidth": 0.7,
         "legend": {
           "calcs": [],
           "displayMode": "list",
-          "placement": "bottom"
+          "placement": "bottom",
+          "showLegend": true
         },
         "orientation": "auto",
         "showValue": "auto",
+        "stacking": "none",
         "text": {
           "valueSize": 12
         },
         "tooltip": {
-          "mode": "single"
-        }
+          "mode": "single",
+          "sort": "none"
+        },
+        "xTickLabelRotation": 45,
+        "xTickLabelSpacing": 0
       },
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "metricColumn": "none",
@@ -1372,13 +1578,18 @@
       "type": "barchart"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "fieldConfig": {
         "defaults": {
           "color": {
             "mode": "palette-classic"
           },
           "custom": {
+            "axisCenteredZero": false,
+            "axisColorMode": "text",
             "axisLabel": "",
             "axisPlacement": "auto",
             "axisSoftMin": 0,
@@ -1389,7 +1600,13 @@
               "tooltip": false,
               "viz": false
             },
-            "lineWidth": 1
+            "lineWidth": 1,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
           },
           "mappings": [],
           "thresholds": {
@@ -1416,24 +1633,35 @@
       },
       "id": 20,
       "options": {
+        "barRadius": 0,
         "barWidth": 0.71,
+        "fullHighlight": false,
         "groupWidth": 0.7,
         "legend": {
           "calcs": [],
           "displayMode": "list",
-          "placement": "bottom"
+          "placement": "bottom",
+          "showLegend": true
         },
         "orientation": "auto",
         "showValue": "auto",
+        "stacking": "none",
         "text": {
           "valueSize": 12
         },
         "tooltip": {
-          "mode": "single"
-        }
+          "mode": "single",
+          "sort": "none"
+        },
+        "xTickLabelRotation": 45,
+        "xTickLabelSpacing": 0
       },
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "metricColumn": "none",
@@ -1467,13 +1695,18 @@
       "type": "barchart"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "fieldConfig": {
         "defaults": {
           "color": {
             "mode": "palette-classic"
           },
           "custom": {
+            "axisCenteredZero": false,
+            "axisColorMode": "text",
             "axisLabel": "",
             "axisPlacement": "auto",
             "axisSoftMin": 0,
@@ -1484,7 +1717,13 @@
               "tooltip": false,
               "viz": false
             },
-            "lineWidth": 1
+            "lineWidth": 1,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
           },
           "mappings": [],
           "thresholds": {
@@ -1511,26 +1750,37 @@
       },
       "id": 21,
       "options": {
+        "barRadius": 0,
         "barWidth": 0.71,
+        "fullHighlight": false,
         "groupWidth": 0.7,
         "legend": {
           "calcs": [
             "mean"
           ],
           "displayMode": "list",
-          "placement": "bottom"
+          "placement": "bottom",
+          "showLegend": true
         },
         "orientation": "auto",
         "showValue": "auto",
+        "stacking": "none",
         "text": {
           "valueSize": 12
         },
         "tooltip": {
-          "mode": "single"
-        }
+          "mode": "single",
+          "sort": "none"
+        },
+        "xTickLabelRotation": 45,
+        "xTickLabelSpacing": 0
       },
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "metricColumn": "none",
@@ -1564,7 +1814,10 @@
       "type": "barchart"
     },
     {
-      "datasource": null,
+      "datasource": {
+        "type": "datasource",
+        "uid": "grafana"
+      },
       "gridPos": {
         "h": 2,
         "w": 24,
@@ -1573,12 +1826,21 @@
       },
       "id": 30,
       "options": {
+        "code": {
+          "language": "plaintext",
+          "showLineNumbers": false,
+          "showMiniMap": false
+        },
         "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/UserManuals/Dashboards/GrafanaUserGuide).",
         "mode": "markdown"
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "datasource",
+            "uid": "grafana"
+          },
           "queryType": "randomWalk",
           "refId": "A"
         }
@@ -1586,22 +1848,23 @@
       "type": "text"
     }
   ],
-  "schemaVersion": 30,
+  "refresh": "",
+  "schemaVersion": 38,
   "style": "dark",
   "tags": [],
   "templating": {
     "list": [
       {
-        "allValue": null,
         "current": {
           "selected": false,
           "text": "All",
           "value": "$__all"
         },
-        "datasource": "mysql",
+        "datasource": {
+          "type": "mysql",
+          "uid": "P430005175C4C7810"
+        },
         "definition": "select concat(name, '-', id) as text from boards",
-        "description": null,
-        "error": null,
         "hide": 0,
         "includeAll": true,
         "label": "Board",
@@ -1616,16 +1879,16 @@
         "type": "query"
       },
       {
-        "allValue": null,
         "current": {
           "selected": false,
           "text": "BUG",
           "value": "BUG"
         },
-        "datasource": "mysql",
+        "datasource": {
+          "type": "mysql",
+          "uid": "P430005175C4C7810"
+        },
         "definition": "select distinct type from issues",
-        "description": null,
-        "error": null,
         "hide": 0,
         "includeAll": true,
         "label": "Issue Type",
@@ -1640,7 +1903,6 @@
         "type": "query"
       },
       {
-        "allValue": null,
         "current": {
           "selected": true,
           "text": [
@@ -1650,10 +1912,11 @@
             "$__all"
           ]
         },
-        "datasource": "mysql",
+        "datasource": {
+          "type": "mysql",
+          "uid": "P430005175C4C7810"
+        },
         "definition": "select distinct priority from issues",
-        "description": null,
-        "error": null,
         "hide": 0,
         "includeAll": true,
         "label": "Priority",
@@ -1677,5 +1940,6 @@
   "timezone": "",
   "title": "Weekly Bug Retro",
   "uid": "-5EKA5w7k",
-  "version": 23
+  "version": 2,
+  "weekStart": ""
 }
\ No newline at end of file
diff --git a/charts/devlake/dashboards/WeeklyCommunityRetro.json b/charts/devlake/dashboards/WeeklyCommunityRetro.json
index d219c91..539fbae 100644
--- a/charts/devlake/dashboards/WeeklyCommunityRetro.json
+++ b/charts/devlake/dashboards/WeeklyCommunityRetro.json
@@ -3,7 +3,10 @@
     "list": [
       {
         "builtIn": 1,
-        "datasource": "-- Grafana --",
+        "datasource": {
+          "type": "datasource",
+          "uid": "grafana"
+        },
         "enable": true,
         "hide": true,
         "iconColor": "rgba(0, 211, 255, 1)",
@@ -13,28 +16,40 @@
     ]
   },
   "editable": true,
-  "gnetId": null,
+  "fiscalYearStartMonth": 0,
   "graphTooltip": 0,
-  "id": 27,
-  "iteration": 1682063086384,
+  "id": 28,
   "links": [],
+  "liveNow": false,
   "panels": [
     {
-      "datasource": null,
+      "datasource": {
+        "type": "datasource",
+        "uid": "grafana"
+      },
       "gridPos": {
-        "h": 3,
-        "w": 23,
+        "h": 4,
+        "w": 24,
         "x": 0,
         "y": 0
       },
       "id": 48,
       "options": {
-        "content": "- Use Cases: This dashboard can be used to track community growth by OSS maintainers.\n- Data Source Required: GitHub users' organizations are used to filter issues/PRs created by certain users. [Publicize users' org](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-your-membership-in-organizations/publicizing-or-hiding-organization-membership) so that Apache DevLake can collect users' org.",
+        "code": {
+          "language": "plaintext",
+          "showLineNumbers": false,
+          "showMiniMap": false
+        },
+        "content": "- Use Cases: This dashboard can be used to track community growth by OSS maintainers.\n- Data Source Required: GitHub users' organizations are used to filter issues/PRs created by certain users. [Publicize users' org](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-your-membership-in-organizations/publicizing-or-hiding-organization-membership) so that Apache DevLake can collect users' org.\n- This dashboa [...]
         "mode": "markdown"
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "datasource",
+            "uid": "grafana"
+          },
           "queryType": "randomWalk",
           "refId": "A"
         }
@@ -44,20 +59,35 @@
     },
     {
       "collapsed": false,
-      "datasource": null,
+      "datasource": {
+        "type": "datasource",
+        "uid": "grafana"
+      },
       "gridPos": {
         "h": 1,
         "w": 24,
         "x": 0,
-        "y": 3
+        "y": 4
       },
       "id": 42,
       "panels": [],
+      "targets": [
+        {
+          "datasource": {
+            "type": "datasource",
+            "uid": "grafana"
+          },
+          "refId": "A"
+        }
+      ],
       "title": "Community Issues",
       "type": "row"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "fieldConfig": {
         "defaults": {
           "color": {
@@ -84,7 +114,7 @@
         "h": 8,
         "w": 8,
         "x": 0,
-        "y": 4
+        "y": 5
       },
       "id": 6,
       "options": {
@@ -102,9 +132,13 @@
         "text": {},
         "textMode": "auto"
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "metricColumn": "none",
@@ -138,7 +172,10 @@
       "type": "stat"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "fieldConfig": {
         "defaults": {
           "color": {
@@ -165,7 +202,7 @@
         "h": 8,
         "w": 6,
         "x": 8,
-        "y": 4
+        "y": 5
       },
       "id": 22,
       "options": {
@@ -183,9 +220,13 @@
         "text": {},
         "textMode": "auto"
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "metricColumn": "none",
@@ -219,7 +260,10 @@
       "type": "stat"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "fieldConfig": {
         "defaults": {
           "color": {
@@ -247,7 +291,7 @@
         "h": 8,
         "w": 6,
         "x": 14,
-        "y": 4
+        "y": 5
       },
       "id": 23,
       "options": {
@@ -265,9 +309,13 @@
         "text": {},
         "textMode": "auto"
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "metricColumn": "none",
@@ -301,7 +349,10 @@
       "type": "stat"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "fieldConfig": {
         "defaults": {
           "color": {
@@ -309,7 +360,10 @@
           },
           "custom": {
             "align": "auto",
-            "displayMode": "auto"
+            "cellOptions": {
+              "type": "auto"
+            },
+            "inspect": false
           },
           "mappings": [],
           "thresholds": {
@@ -332,15 +386,28 @@
         "h": 8,
         "w": 4,
         "x": 20,
-        "y": 4
+        "y": 5
       },
       "id": 45,
       "options": {
+        "cellHeight": "sm",
+        "footer": {
+          "countRows": false,
+          "fields": "",
+          "reducer": [
+            "sum"
+          ],
+          "show": false
+        },
         "showHeader": true
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "metricColumn": "none",
@@ -374,7 +441,10 @@
       "type": "table"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "fieldConfig": {
         "defaults": {
           "color": {
@@ -406,7 +476,7 @@
         "h": 8,
         "w": 8,
         "x": 0,
-        "y": 12
+        "y": 13
       },
       "id": 24,
       "options": {
@@ -424,9 +494,13 @@
         "text": {},
         "textMode": "auto"
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "metricColumn": "none",
@@ -460,7 +534,10 @@
       "type": "stat"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "fieldConfig": {
         "defaults": {
           "color": {
@@ -468,7 +545,10 @@
           },
           "custom": {
             "align": "auto",
-            "displayMode": "auto"
+            "cellOptions": {
+              "type": "auto"
+            },
+            "inspect": false
           },
           "mappings": [],
           "thresholds": {
@@ -480,7 +560,7 @@
               },
               {
                 "color": "red",
-                "value": 80
+                "value": 3
               }
             ]
           }
@@ -537,12 +617,26 @@
           {
             "matcher": {
               "id": "byName",
-              "options": "issue_number"
+              "options": "queue_time_in_days"
+            },
+            "properties": [
+              {
+                "id": "custom.cellOptions",
+                "value": {
+                  "type": "color-text"
+                }
+              }
+            ]
+          },
+          {
+            "matcher": {
+              "id": "byName",
+              "options": "issue_key"
             },
             "properties": [
               {
                 "id": "custom.width",
-                "value": 125
+                "value": 95
               }
             ]
           }
@@ -552,22 +646,36 @@
         "h": 8,
         "w": 16,
         "x": 8,
-        "y": 12
+        "y": 13
       },
       "id": 25,
       "options": {
+        "cellHeight": "sm",
+        "footer": {
+          "countRows": false,
+          "fields": "",
+          "reducer": [
+            "sum"
+          ],
+          "show": false
+        },
         "showHeader": true,
         "sortBy": []
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
+          "editorMode": "code",
           "format": "table",
           "group": [],
           "metricColumn": "none",
           "queryType": "randomWalk",
           "rawQuery": true,
-          "rawSql": "with issue_comment_list as(\n  select\n    i.id as issue_id,\n    i.url,\n    i.title,\n    i.creator_name,\n    i.created_date as issue_created_date,\n    i.status,\n    ic.id as comment_id,\n    ic.created_date as comment_date,\n    ic.body,\n    case when ic.id is not null then rank() over (partition by i.id order by ic.created_date asc) else null end as comment_rank\n  from\n    issues i\n    join board_issues bi on i.id = bi.issue_id\n    join boards b on bi.boa [...]
+          "rawSql": "with issue_comment_list as(\n  select\n    i.id as issue_id,\n    i.url,\n    i.issue_key,\n    i.title,\n    i.creator_name,\n    i.created_date as issue_created_date,\n    i.status,\n    ic.id as comment_id,\n    ic.created_date as comment_date,\n    ic.body,\n    case when ic.id is not null then rank() over (partition by i.id order by ic.created_date asc) else null end as comment_rank\n  from\n    issues i\n    join board_issues bi on i.id = bi.issue_id\n    join  [...]
           "refId": "A",
           "select": [
             [
@@ -579,6 +687,23 @@
               }
             ]
           ],
+          "sql": {
+            "columns": [
+              {
+                "parameters": [],
+                "type": "function"
+              }
+            ],
+            "groupBy": [
+              {
+                "property": {
+                  "type": "string"
+                },
+                "type": "groupBy"
+              }
+            ],
+            "limit": 50
+          },
           "table": "_devlake_migration_history",
           "timeColumn": "created_at",
           "timeColumnType": "timestamp",
@@ -595,7 +720,10 @@
       "type": "table"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "fieldConfig": {
         "defaults": {
           "color": {
@@ -627,7 +755,7 @@
         "h": 8,
         "w": 8,
         "x": 0,
-        "y": 20
+        "y": 21
       },
       "id": 26,
       "options": {
@@ -645,9 +773,13 @@
         "text": {},
         "textMode": "auto"
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "metricColumn": "none",
@@ -681,7 +813,10 @@
       "type": "stat"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "fieldConfig": {
         "defaults": {
           "color": {
@@ -689,7 +824,10 @@
           },
           "custom": {
             "align": "auto",
-            "displayMode": "auto"
+            "cellOptions": {
+              "type": "auto"
+            },
+            "inspect": false
           },
           "mappings": [],
           "thresholds": {
@@ -699,13 +837,9 @@
                 "color": "green",
                 "value": null
               },
-              {
-                "color": "#EAB839",
-                "value": 0.2
-              },
               {
                 "color": "red",
-                "value": 0.5
+                "value": 3
               }
             ]
           },
@@ -715,60 +849,60 @@
           {
             "matcher": {
               "id": "byName",
-              "options": "body"
+              "options": "title"
             },
             "properties": [
               {
                 "id": "custom.width",
-                "value": 364
+                "value": 451
               }
             ]
           },
           {
             "matcher": {
               "id": "byName",
-              "options": "url"
+              "options": "creator_name"
             },
             "properties": [
               {
                 "id": "custom.width",
-                "value": null
+                "value": 146
               }
             ]
           },
           {
             "matcher": {
               "id": "byName",
-              "options": "issue_id"
+              "options": "issue_created_date"
             },
             "properties": [
               {
                 "id": "custom.width",
-                "value": 73
+                "value": 162
               }
             ]
           },
           {
             "matcher": {
               "id": "byName",
-              "options": "comment_id"
+              "options": "comment_date"
             },
             "properties": [
               {
                 "id": "custom.width",
-                "value": 106
+                "value": 160
               }
             ]
           },
           {
             "matcher": {
               "id": "byName",
-              "options": "comment_rank"
+              "options": "issue_key"
             },
             "properties": [
               {
                 "id": "custom.width",
-                "value": 28
+                "value": 96
               }
             ]
           },
@@ -780,79 +914,13 @@
             "properties": [
               {
                 "id": "custom.width",
-                "value": 184
-              }
-            ]
-          },
-          {
-            "matcher": {
-              "id": "byName",
-              "options": "issue_nunber"
-            },
-            "properties": [
-              {
-                "id": "custom.width",
-                "value": 127
-              }
-            ]
-          },
-          {
-            "matcher": {
-              "id": "byName",
-              "options": "issue_number"
-            },
-            "properties": [
-              {
-                "id": "custom.width",
-                "value": 122
-              }
-            ]
-          },
-          {
-            "matcher": {
-              "id": "byName",
-              "options": "title"
-            },
-            "properties": [
-              {
-                "id": "custom.width",
-                "value": 451
-              }
-            ]
-          },
-          {
-            "matcher": {
-              "id": "byName",
-              "options": "creator_name"
-            },
-            "properties": [
-              {
-                "id": "custom.width",
-                "value": 146
-              }
-            ]
-          },
-          {
-            "matcher": {
-              "id": "byName",
-              "options": "issue_created_date"
-            },
-            "properties": [
-              {
-                "id": "custom.width",
-                "value": 162
-              }
-            ]
-          },
-          {
-            "matcher": {
-              "id": "byName",
-              "options": "comment_date"
-            },
-            "properties": [
+                "value": 211
+              },
               {
-                "id": "custom.width",
-                "value": 160
+                "id": "custom.cellOptions",
+                "value": {
+                  "type": "color-text"
+                }
               }
             ]
           }
@@ -862,22 +930,36 @@
         "h": 8,
         "w": 16,
         "x": 8,
-        "y": 20
+        "y": 21
       },
       "id": 28,
       "options": {
+        "cellHeight": "sm",
+        "footer": {
+          "countRows": false,
+          "fields": "",
+          "reducer": [
+            "sum"
+          ],
+          "show": false
+        },
         "showHeader": true,
         "sortBy": []
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
+          "editorMode": "code",
           "format": "table",
           "group": [],
           "metricColumn": "none",
           "queryType": "randomWalk",
           "rawQuery": true,
-          "rawSql": "with issue_comment_list as(\n  select\n    SUBSTRING_INDEX(i.url, '/', -1) as issue_number,\n    i.url,\n    i.title,\n    i.creator_name,\n    i.created_date as issue_created_date,\n    ic.id as comment_id,\n    ic.created_date as comment_date,\n    ic.body,\n    case when ic.id is not null then rank() over (partition by i.id order by ic.created_date asc) else null end as comment_rank\n  from\n    issues i\n    join board_issues bi on i.id = bi.issue_id\n    join bo [...]
+          "rawSql": "with issue_comment_list as(\n  select\n    SUBSTRING_INDEX(i.url, '/', -1) as issue_number,\n    i.url,\n    i.issue_key,\n    i.title,\n    i.creator_name,\n    i.created_date as issue_created_date,\n    ic.id as comment_id,\n    ic.created_date as comment_date,\n    ic.body,\n    case when ic.id is not null then rank() over (partition by i.id order by ic.created_date asc) else null end as comment_rank\n  from\n    issues i\n    join board_issues bi on i.id = bi.iss [...]
           "refId": "A",
           "select": [
             [
@@ -889,6 +971,23 @@
               }
             ]
           ],
+          "sql": {
+            "columns": [
+              {
+                "parameters": [],
+                "type": "function"
+              }
+            ],
+            "groupBy": [
+              {
+                "property": {
+                  "type": "string"
+                },
+                "type": "groupBy"
+              }
+            ],
+            "limit": 50
+          },
           "table": "_devlake_migration_history",
           "timeColumn": "created_at",
           "timeColumnType": "timestamp",
@@ -906,20 +1005,35 @@
     },
     {
       "collapsed": false,
-      "datasource": null,
+      "datasource": {
+        "type": "datasource",
+        "uid": "grafana"
+      },
       "gridPos": {
         "h": 1,
         "w": 24,
         "x": 0,
-        "y": 28
+        "y": 29
       },
       "id": 44,
       "panels": [],
+      "targets": [
+        {
+          "datasource": {
+            "type": "datasource",
+            "uid": "grafana"
+          },
+          "refId": "A"
+        }
+      ],
       "title": "Community PRs",
       "type": "row"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -947,7 +1061,7 @@
         "h": 8,
         "w": 8,
         "x": 0,
-        "y": 29
+        "y": 30
       },
       "id": 31,
       "options": {
@@ -965,9 +1079,13 @@
         "text": {},
         "textMode": "auto"
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "hide": false,
@@ -1001,7 +1119,10 @@
       "type": "stat"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -1027,9 +1148,9 @@
       },
       "gridPos": {
         "h": 8,
-        "w": 6,
+        "w": 8,
         "x": 8,
-        "y": 29
+        "y": 30
       },
       "id": 34,
       "options": {
@@ -1047,9 +1168,13 @@
         "text": {},
         "textMode": "auto"
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "hide": false,
@@ -1083,7 +1208,10 @@
       "type": "stat"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "fieldConfig": {
         "defaults": {
           "color": {
@@ -1109,9 +1237,9 @@
       },
       "gridPos": {
         "h": 8,
-        "w": 6,
-        "x": 14,
-        "y": 29
+        "w": 8,
+        "x": 16,
+        "y": 30
       },
       "id": 35,
       "options": {
@@ -1129,9 +1257,13 @@
         "text": {},
         "textMode": "auto"
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "metricColumn": "none",
@@ -1165,17 +1297,16 @@
       "type": "stat"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "description": "",
       "fieldConfig": {
         "defaults": {
           "color": {
             "mode": "thresholds"
           },
-          "custom": {
-            "align": "auto",
-            "displayMode": "auto"
-          },
           "mappings": [],
           "thresholds": {
             "mode": "absolute",
@@ -1195,23 +1326,39 @@
       },
       "gridPos": {
         "h": 8,
-        "w": 4,
-        "x": 20,
-        "y": 29
+        "w": 8,
+        "x": 0,
+        "y": 38
       },
-      "id": 46,
+      "id": 36,
       "options": {
-        "showHeader": true
+        "colorMode": "value",
+        "graphMode": "area",
+        "justifyMode": "auto",
+        "orientation": "auto",
+        "reduceOptions": {
+          "calcs": [
+            "lastNotNull"
+          ],
+          "fields": "",
+          "values": false
+        },
+        "text": {},
+        "textMode": "auto"
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "hide": false,
           "metricColumn": "none",
           "rawQuery": true,
-          "rawSql": "select\n  distinct author_name\nfrom \n\tpull_requests pr\nwhere\n  date(created_date) BETWEEN curdate() - INTERVAL WEEKDAY(curdate())+7 DAY AND curdate() - INTERVAL WEEKDAY(curdate())+1 DAY\n\tand base_repo_id in ($repo_id)\n\tand author_name not in (select distinct author_name from pull_requests where created_date < curdate() - INTERVAL WEEKDAY(curdate())+7 DAY and author_name is not null)",
+          "rawSql": "select\n\tcount(*) as merged_pull_request_count\nfrom \n\tpull_requests pr\nwhere\n  date(created_date) BETWEEN curdate() - INTERVAL WEEKDAY(curdate())+7 DAY AND curdate() - INTERVAL WEEKDAY(curdate())+1 DAY\n\tand base_repo_id in ($repo_id)\n\tand merged_date is not null\n\tand author_id not in (select distinct id from accounts where organization in ($org))",
           "refId": "A",
           "select": [
             [
@@ -1235,11 +1382,14 @@
           ]
         }
       ],
-      "title": "First time Contributor [Previous Week]",
-      "type": "table"
+      "title": "Number of Merged Pull Requests Created by the Community [Previous Week]",
+      "type": "stat"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -1256,20 +1406,21 @@
               },
               {
                 "color": "red",
-                "value": 80
+                "value": 7
               }
             ]
-          }
+          },
+          "unit": "d"
         },
         "overrides": []
       },
       "gridPos": {
         "h": 8,
         "w": 8,
-        "x": 0,
-        "y": 37
+        "x": 8,
+        "y": 38
       },
-      "id": 36,
+      "id": 39,
       "options": {
         "colorMode": "value",
         "graphMode": "area",
@@ -1285,15 +1436,19 @@
         "text": {},
         "textMode": "auto"
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "hide": false,
           "metricColumn": "none",
           "rawQuery": true,
-          "rawSql": "select\n\tcount(*) as merged_pull_request_count\nfrom \n\tpull_requests pr\nwhere\n  date(created_date) BETWEEN curdate() - INTERVAL WEEKDAY(curdate())+7 DAY AND curdate() - INTERVAL WEEKDAY(curdate())+1 DAY\n\tand base_repo_id in ($repo_id)\n\tand merged_date is not null\n\tand author_id not in (select distinct id from accounts where organization in ($org))",
+          "rawSql": "select\n\tavg(TIMESTAMPDIFF(Minute,created_date,merged_date)/1440)\nfrom \n\tpull_requests\nwhere \n  date(created_date) BETWEEN curdate() - INTERVAL WEEKDAY(curdate())+7 DAY AND curdate() - INTERVAL WEEKDAY(curdate())+1 DAY\n\tand base_repo_id in ($repo_id)\n\tand merged_date is not null\n\tand author_id not in (select distinct id from accounts where organization in ($org))",
           "refId": "A",
           "select": [
             [
@@ -1317,11 +1472,125 @@
           ]
         }
       ],
-      "title": "Number of Merged Pull Requests Created by the Community [Previous Week]",
+      "title": "Average Time to Merge of Community Pull Requests in Days [Previous Week]",
       "type": "stat"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
+      "description": "Contributors: the PR authors who have merged PR(s)",
+      "fieldConfig": {
+        "defaults": {
+          "color": {
+            "mode": "thresholds"
+          },
+          "custom": {
+            "align": "auto",
+            "cellOptions": {
+              "type": "auto"
+            },
+            "inspect": false
+          },
+          "mappings": [],
+          "thresholds": {
+            "mode": "absolute",
+            "steps": [
+              {
+                "color": "green",
+                "value": null
+              },
+              {
+                "color": "red",
+                "value": 80
+              }
+            ]
+          }
+        },
+        "overrides": []
+      },
+      "gridPos": {
+        "h": 8,
+        "w": 8,
+        "x": 16,
+        "y": 38
+      },
+      "id": 46,
+      "options": {
+        "cellHeight": "sm",
+        "footer": {
+          "countRows": false,
+          "fields": "",
+          "reducer": [
+            "sum"
+          ],
+          "show": false
+        },
+        "showHeader": true
+      },
+      "pluginVersion": "9.5.1",
+      "targets": [
+        {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
+          "editorMode": "code",
+          "format": "table",
+          "group": [],
+          "hide": false,
+          "metricColumn": "none",
+          "rawQuery": true,
+          "rawSql": "select\n  distinct author_name\nfrom \n\tpull_requests pr\nwhere\n  date(created_date) BETWEEN curdate() - INTERVAL WEEKDAY(curdate())+7 DAY AND curdate() - INTERVAL WEEKDAY(curdate())+1 DAY\n\tand merged_date is not null\n\tand base_repo_id in ($repo_id)\n\tand author_name not in (select distinct author_name from pull_requests where created_date < curdate() - INTERVAL WEEKDAY(curdate())+7 DAY and author_name is not null)",
+          "refId": "A",
+          "select": [
+            [
+              {
+                "params": [
+                  "id"
+                ],
+                "type": "column"
+              }
+            ]
+          ],
+          "sql": {
+            "columns": [
+              {
+                "parameters": [],
+                "type": "function"
+              }
+            ],
+            "groupBy": [
+              {
+                "property": {
+                  "type": "string"
+                },
+                "type": "groupBy"
+              }
+            ],
+            "limit": 50
+          },
+          "table": "ae_projects",
+          "timeColumn": "ae_create_time",
+          "timeColumnType": "timestamp",
+          "where": [
+            {
+              "name": "$__timeFilter",
+              "params": [],
+              "type": "macro"
+            }
+          ]
+        }
+      ],
+      "title": "First time Contributor [Previous Week]",
+      "type": "table"
+    },
+    {
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -1353,8 +1622,8 @@
       "gridPos": {
         "h": 8,
         "w": 8,
-        "x": 8,
-        "y": 37
+        "x": 0,
+        "y": 46
       },
       "id": 37,
       "options": {
@@ -1372,9 +1641,13 @@
         "text": {},
         "textMode": "auto"
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
           "format": "table",
           "group": [],
           "hide": false,
@@ -1408,13 +1681,22 @@
       "type": "stat"
     },
     {
-      "datasource": "mysql",
-      "description": "",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "fieldConfig": {
         "defaults": {
           "color": {
             "mode": "thresholds"
           },
+          "custom": {
+            "align": "auto",
+            "cellOptions": {
+              "type": "auto"
+            },
+            "inspect": false
+          },
           "mappings": [],
           "thresholds": {
             "mode": "absolute",
@@ -1425,58 +1707,105 @@
               },
               {
                 "color": "red",
-                "value": 3
+                "value": 7
               }
             ]
           },
-          "unit": "d"
+          "unit": "none"
         },
-        "overrides": []
+        "overrides": [
+          {
+            "matcher": {
+              "id": "byName",
+              "options": "title"
+            },
+            "properties": [
+              {
+                "id": "custom.width",
+                "value": 451
+              }
+            ]
+          },
+          {
+            "matcher": {
+              "id": "byName",
+              "options": "queue_time_in_days"
+            },
+            "properties": [
+              {
+                "id": "custom.cellOptions",
+                "value": {
+                  "type": "color-text"
+                }
+              }
+            ]
+          }
+        ]
       },
       "gridPos": {
         "h": 8,
-        "w": 8,
-        "x": 16,
-        "y": 37
+        "w": 16,
+        "x": 8,
+        "y": 46
       },
-      "id": 39,
+      "id": 51,
       "options": {
-        "colorMode": "value",
-        "graphMode": "area",
-        "justifyMode": "auto",
-        "orientation": "auto",
-        "reduceOptions": {
-          "calcs": [
-            "lastNotNull"
-          ],
+        "cellHeight": "sm",
+        "footer": {
+          "countRows": false,
           "fields": "",
-          "values": false
+          "reducer": [
+            "sum"
+          ],
+          "show": false
         },
-        "text": {},
-        "textMode": "auto"
+        "showHeader": true,
+        "sortBy": []
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
+          "editorMode": "code",
           "format": "table",
           "group": [],
-          "hide": false,
           "metricColumn": "none",
+          "queryType": "randomWalk",
           "rawQuery": true,
-          "rawSql": "select\n\tavg(TIMESTAMPDIFF(Minute,created_date,merged_date)/1440)\nfrom \n\tpull_requests\nwhere \n  date(created_date) BETWEEN curdate() - INTERVAL WEEKDAY(curdate())+7 DAY AND curdate() - INTERVAL WEEKDAY(curdate())+1 DAY\n\tand base_repo_id in ($repo_id)\n\tand merged_date is not null\n\tand author_id not in (select distinct id from accounts where organization in ($org))",
+          "rawSql": "select\n  pull_request_key,\n  title,\n  status,\n  author_name,\n  created_date,\n  (TIMESTAMPDIFF(MINUTE, created_date,curdate()))/1440 as queue_time_in_days,\n  url\nfrom \n\tpull_requests pr\nwhere\n  date(created_date) BETWEEN curdate() - INTERVAL WEEKDAY(curdate())+7 DAY AND curdate() - INTERVAL WEEKDAY(curdate())+1 DAY\n\tand base_repo_id in ($repo_id)\n\tand merged_date is null\n  and author_id not in (select distinct id from accounts where organization in ($org))",
           "refId": "A",
           "select": [
             [
               {
                 "params": [
-                  "id"
+                  "script_version"
                 ],
                 "type": "column"
               }
             ]
           ],
-          "table": "ae_projects",
-          "timeColumn": "ae_create_time",
+          "sql": {
+            "columns": [
+              {
+                "parameters": [],
+                "type": "function"
+              }
+            ],
+            "groupBy": [
+              {
+                "property": {
+                  "type": "string"
+                },
+                "type": "groupBy"
+              }
+            ],
+            "limit": 50
+          },
+          "table": "_devlake_migration_history",
+          "timeColumn": "created_at",
           "timeColumnType": "timestamp",
           "where": [
             {
@@ -1487,11 +1816,14 @@
           ]
         }
       ],
-      "title": "Average Time to Merge of Community Pull Requests in Days [Previous Week]",
-      "type": "stat"
+      "title": "List of New Community Issues' 1st Comment [Previous Week]",
+      "type": "table"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -1499,6 +1831,8 @@
             "mode": "palette-classic"
           },
           "custom": {
+            "axisCenteredZero": false,
+            "axisColorMode": "text",
             "axisLabel": "Merged PR Count",
             "axisPlacement": "auto",
             "axisSoftMin": 0,
@@ -1509,7 +1843,13 @@
               "tooltip": false,
               "viz": false
             },
-            "lineWidth": 1
+            "lineWidth": 1,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
           },
           "mappings": [],
           "thresholds": {
@@ -1531,37 +1871,49 @@
       },
       "gridPos": {
         "h": 9,
-        "w": 12,
+        "w": 10,
         "x": 0,
-        "y": 45
+        "y": 54
       },
       "id": 33,
       "options": {
+        "barRadius": 0,
         "barWidth": 0.5,
+        "fullHighlight": false,
         "groupWidth": 0.7,
         "legend": {
           "calcs": [],
           "displayMode": "list",
-          "placement": "bottom"
+          "placement": "bottom",
+          "showLegend": true
         },
         "orientation": "auto",
         "showValue": "auto",
+        "stacking": "none",
         "text": {
           "valueSize": 12
         },
         "tooltip": {
-          "mode": "multi"
-        }
+          "mode": "multi",
+          "sort": "none"
+        },
+        "xTickLabelRotation": 45,
+        "xTickLabelSpacing": 0
       },
       "pluginVersion": "8.0.6",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
+          "editorMode": "code",
           "format": "table",
           "group": [],
           "hide": false,
           "metricColumn": "none",
           "rawQuery": true,
-          "rawSql": "select\n  author_name,\n\tcount(*) as pull_request_count\nfrom \n\tpull_requests pr\nwhere\n  date(created_date) BETWEEN curdate() - INTERVAL WEEKDAY(curdate())+7 DAY AND curdate() - INTERVAL WEEKDAY(curdate())+1 DAY\n\tand base_repo_id in ($repo_id)\n\tand author_id not in (select distinct id from accounts where organization in ($org))\ngroup by 1\norder by 2 desc\nlimit 20\n",
+          "rawSql": "select\n  author_name,\n\tcount(*) as pull_request_count\nfrom \n\tpull_requests pr\nwhere\n  date(created_date) BETWEEN curdate() - INTERVAL WEEKDAY(curdate())+7 DAY AND curdate() - INTERVAL WEEKDAY(curdate())+1 DAY\n\tand base_repo_id in ($repo_id)\n\tand merged_date is not NULL\n\tand author_id not in (select distinct id from accounts where organization in ($org))\ngroup by 1\norder by 2 desc\nlimit 20\n",
           "refId": "A",
           "select": [
             [
@@ -1573,6 +1925,23 @@
               }
             ]
           ],
+          "sql": {
+            "columns": [
+              {
+                "parameters": [],
+                "type": "function"
+              }
+            ],
+            "groupBy": [
+              {
+                "property": {
+                  "type": "string"
+                },
+                "type": "groupBy"
+              }
+            ],
+            "limit": 50
+          },
           "table": "ae_projects",
           "timeColumn": "ae_create_time",
           "timeColumnType": "timestamp",
@@ -1585,11 +1954,14 @@
           ]
         }
       ],
-      "title": "Top Community Contributors By Number of PRs Created [Previous Week]",
+      "title": "Top 20 Community Contributors By Number of PRs Merged [Previous Week]",
       "type": "barchart"
     },
     {
-      "datasource": "mysql",
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
       "description": "",
       "fieldConfig": {
         "defaults": {
@@ -1598,15 +1970,113 @@
           },
           "mappings": [],
           "thresholds": {
-            "mode": "percentage",
+            "mode": "absolute",
             "steps": [
               {
                 "color": "green",
                 "value": null
-              },
+              }
+            ]
+          }
+        },
+        "overrides": []
+      },
+      "gridPos": {
+        "h": 9,
+        "w": 6,
+        "x": 10,
+        "y": 54
+      },
+      "id": 52,
+      "options": {
+        "colorMode": "value",
+        "graphMode": "area",
+        "justifyMode": "auto",
+        "orientation": "auto",
+        "reduceOptions": {
+          "calcs": [
+            "lastNotNull"
+          ],
+          "fields": "",
+          "values": false
+        },
+        "textMode": "auto"
+      },
+      "pluginVersion": "9.5.1",
+      "targets": [
+        {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
+          "editorMode": "code",
+          "format": "table",
+          "group": [],
+          "hide": false,
+          "metricColumn": "none",
+          "rawQuery": true,
+          "rawSql": "select\n\tcount(distinct author_id) as all_contributor_count\nfrom \n\tpull_requests pr\nwhere\n\tbase_repo_id in ($repo_id)\n\tand merged_date is not null\n\t-- and author_id not in (select distinct id from accounts where organization in ($org))\n",
+          "refId": "A",
+          "select": [
+            [
               {
-                "color": "red",
-                "value": 80
+                "params": [
+                  "id"
+                ],
+                "type": "column"
+              }
+            ]
+          ],
+          "sql": {
+            "columns": [
+              {
+                "parameters": [],
+                "type": "function"
+              }
+            ],
+            "groupBy": [
+              {
+                "property": {
+                  "type": "string"
+                },
+                "type": "groupBy"
+              }
+            ],
+            "limit": 50
+          },
+          "table": "ae_projects",
+          "timeColumn": "ae_create_time",
+          "timeColumnType": "timestamp",
+          "where": [
+            {
+              "name": "$__timeFilter",
+              "params": [],
+              "type": "macro"
+            }
+          ]
+        }
+      ],
+      "title": "Top Community Contributors By PRs Created [All History]",
+      "type": "stat"
+    },
+    {
+      "datasource": {
+        "type": "mysql",
+        "uid": "P430005175C4C7810"
+      },
+      "description": "",
+      "fieldConfig": {
+        "defaults": {
+          "color": {
+            "mode": "thresholds"
+          },
+          "mappings": [],
+          "thresholds": {
+            "mode": "absolute",
+            "steps": [
+              {
+                "color": "green",
+                "value": null
               }
             ]
           },
@@ -1616,13 +2086,15 @@
       },
       "gridPos": {
         "h": 9,
-        "w": 12,
-        "x": 12,
-        "y": 45
+        "w": 8,
+        "x": 16,
+        "y": 54
       },
       "id": 40,
       "options": {
         "displayMode": "gradient",
+        "minVizHeight": 10,
+        "minVizWidth": 0,
         "orientation": "horizontal",
         "reduceOptions": {
           "calcs": [
@@ -1634,17 +2106,23 @@
         "showUnfilled": true,
         "text": {
           "valueSize": 1
-        }
+        },
+        "valueMode": "color"
       },
-      "pluginVersion": "8.0.6",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "mysql",
+            "uid": "P430005175C4C7810"
+          },
+          "editorMode": "code",
           "format": "table",
           "group": [],
           "hide": false,
           "metricColumn": "none",
           "rawQuery": true,
-          "rawSql": "select\n  author_name,\n\tcount(*) as merged_pull_request_count\nfrom \n\tpull_requests pr\nwhere\n  $__timeFilter(created_date)\n\tand base_repo_id in ($repo_id)\n\tand author_id not in (select distinct id from accounts where organization in ($org))\ngroup by 1\norder by 2 desc\nlimit 20\n",
+          "rawSql": "select\n  author_name,\n\tcount(*) as merged_pull_request_count\nfrom \n\tpull_requests pr\nwhere\n\tbase_repo_id in ($repo_id)\n\tand merged_date is not NULL\n\t-- and author_id not in (select distinct id from accounts where organization in ($org))\ngroup by 1\norder by 2 desc\nlimit 20\n",
           "refId": "A",
           "select": [
             [
@@ -1656,6 +2134,23 @@
               }
             ]
           ],
+          "sql": {
+            "columns": [
+              {
+                "parameters": [],
+                "type": "function"
+              }
+            ],
+            "groupBy": [
+              {
+                "property": {
+                  "type": "string"
+                },
+                "type": "groupBy"
+              }
+            ],
+            "limit": 50
+          },
           "table": "ae_projects",
           "timeColumn": "ae_create_time",
           "timeColumnType": "timestamp",
@@ -1668,25 +2163,37 @@
           ]
         }
       ],
-      "title": "Top Community Contributors By PRs Created [All History]",
+      "title": "Top 20 Community Contributors By Merged PR Numbers [All History]",
       "type": "bargauge"
     },
     {
-      "datasource": null,
+      "datasource": {
+        "type": "datasource",
+        "uid": "grafana"
+      },
       "gridPos": {
         "h": 2,
         "w": 24,
         "x": 0,
-        "y": 54
+        "y": 63
       },
       "id": 50,
       "options": {
+        "code": {
+          "language": "plaintext",
+          "showLineNumbers": false,
+          "showMiniMap": false
+        },
         "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",
+      "pluginVersion": "9.5.1",
       "targets": [
         {
+          "datasource": {
+            "type": "datasource",
+            "uid": "grafana"
+          },
           "queryType": "randomWalk",
           "refId": "A"
         }
@@ -1695,13 +2202,12 @@
     }
   ],
   "refresh": "",
-  "schemaVersion": 30,
+  "schemaVersion": 38,
   "style": "dark",
   "tags": [],
   "templating": {
     "list": [
       {
-        "allValue": null,
         "current": {
           "selected": true,
           "text": [
@@ -1711,10 +2217,11 @@
             "$__all"
           ]
         },
-        "datasource": "mysql",
+        "datasource": {
+          "type": "mysql",
+          "uid": "P430005175C4C7810"
+        },
         "definition": "select concat(name, '-', id) as text from repos",
-        "description": null,
-        "error": null,
         "hide": 0,
         "includeAll": true,
         "label": "Repo",
@@ -1729,16 +2236,16 @@
         "type": "query"
       },
       {
-        "allValue": null,
         "current": {
           "selected": false,
           "text": "All",
           "value": "$__all"
         },
-        "datasource": "mysql",
+        "datasource": {
+          "type": "mysql",
+          "uid": "P430005175C4C7810"
+        },
         "definition": "select distinct type from issues",
-        "description": null,
-        "error": null,
         "hide": 0,
         "includeAll": true,
         "label": "Issue Type",
@@ -1753,7 +2260,6 @@
         "type": "query"
       },
       {
-        "allValue": null,
         "current": {
           "selected": true,
           "text": [
@@ -1763,10 +2269,12 @@
             "$__all"
           ]
         },
-        "datasource": "mysql",
+        "datasource": {
+          "type": "mysql",
+          "uid": "P430005175C4C7810"
+        },
         "definition": "select distinct organization from accounts where organization != ''",
         "description": "",
-        "error": null,
         "hide": 0,
         "includeAll": true,
         "label": "Community Definition - Issues and PRs NOT from Organization(s)",
@@ -1790,5 +2298,6 @@
   "timezone": "",
   "title": "Weekly Community Retro",
   "uid": "VTr6Y_q7z",
-  "version": 3
+  "version": 9,
+  "weekStart": ""
 }
\ No newline at end of file
diff --git a/charts/devlake/templates/_helpers.tpl b/charts/devlake/templates/_helpers.tpl
index bc80aa3..82b00d8 100644
--- a/charts/devlake/templates/_helpers.tpl
+++ b/charts/devlake/templates/_helpers.tpl
@@ -96,6 +96,30 @@ The ui endpoint
 {{- end }}
 {{- end }}
 
+{{- define "devlake.mysql.secret" -}}
+{{- if .Values.option.connectionSecretName -}}
+{{- .Values.option.connectionSecretName -}}
+{{- else -}}
+{{ include "devlake.fullname" . }}-db-connection
+{{- end -}}
+{{- end -}}
+
+{{- define "devlake.ui.auth.secret" -}}
+{{- if .Values.ui.basicAuth.secretName -}}
+{{- .Values.ui.basicAuth.secretName -}}
+{{- else -}}
+{{ include "devlake.fullname" . }}-ui-auth
+{{- end -}}
+{{- end -}}
+
+{{- define "devlake.lake.encryption.secret" -}}
+{{- if .Values.lake.encryptionSecret.secretName -}}
+{{- .Values.lake.encryptionSecret.secretName -}}
+{{- else -}}
+{{ include "devlake.fullname" . }}-encryption-secret
+{{- end -}}
+{{- end -}}
+
 {{/*
 The mysql server
 */}}
diff --git a/charts/devlake/templates/configmaps.yaml b/charts/devlake/templates/configmaps.yaml
index b975b8f..10cffb0 100644
--- a/charts/devlake/templates/configmaps.yaml
+++ b/charts/devlake/templates/configmaps.yaml
@@ -15,21 +15,25 @@
 # limitations under the License.
 #
 ---
+{{- if .Values.grafana.enabled }}
 apiVersion: v1
 kind: ConfigMap
 metadata:
-  name: {{ include "devlake.fullname" . }}-config
+  name: {{ include "devlake.fullname" . }}-grafana-datasource
+  labels:
+    {{ $.Values.grafana.sidecar.datasources.label }}: {{ $.Values.grafana.sidecar.datasources.labelValue | quote }}
 data:
-{{- if and  (eq .Values.option.database "mysql") (not .Values.option.useConnectionDetailsSecret) }}
-  MYSQL_USER: "{{ .Values.mysql.username }}"
-  MYSQL_PASSWORD: "{{ .Values.mysql.password }}"
-  MYSQL_DATABASE: "{{ .Values.mysql.database }}"
-  MYSQL_ROOT_PASSWORD: "{{ .Values.mysql.rootPassword }}"
-  DB_URL: "{{ include "database.url" . }}"
+{{- if eq .Values.option.database "mysql" }}
+  grafana-datasource.yml: |
+    apiVersion: 1
+    datasources:
+      - name: mysql
+        type: mysql
+        url: $MYSQL_URL
+        database: $MYSQL_DATABASE
+        user: $MYSQL_USER
+        secureJsonData:
+          password: $MYSQL_PASSWORD
+        editable: false
 {{- end }}
-  LOGGING_DIR: "{{ .Values.lake.loggingDir }}"
-  LOGGING_LEVEL: "{{ .Values.lake.loggingLevel }}"
-{{- if and .Values.ui.basicAuth.enabled (not .Values.ui.basicAuth.useSecret) }}
-  ADMIN_USER: "{{ .Values.ui.basicAuth.user }}"
-  ADMIN_PASS: "{{ .Values.ui.basicAuth.password }}"
 {{- end }}
diff --git a/charts/devlake/templates/deployments.yaml b/charts/devlake/templates/deployments.yaml
index dd7a1a4..5fb752c 100644
--- a/charts/devlake/templates/deployments.yaml
+++ b/charts/devlake/templates/deployments.yaml
@@ -50,31 +50,25 @@ spec:
           imagePullPolicy: {{ .Values.ui.image.pullPolicy }}
           ports:
             - containerPort: 4000
+          {{- if .Values.ui.basicAuth.enabled }}
           envFrom:
-            - configMapRef:
-                name: {{ include "devlake.fullname" . }}-config
-            {{- if .Values.ui.basicAuth.useSecret }}
             - secretRef:
-                name: {{ .Values.ui.basicAuth.secretName }}
-            {{- end }}
+                name: {{ include "devlake.ui.auth.secret" . }}
+          {{- end }}
           env:
             - name: DEVLAKE_ENDPOINT
               value: {{ include "devlake.fullname" . }}-lake.{{ .Release.Namespace }}.svc.cluster.local:8080
-{{- if .Values.externalGrafana.useExternal }}
+{{- if not .Values.grafana.enabled }}
             - name: GRAFANA_ENDPOINT
-              value: {{ .Values.externalGrafana.grafanaUrl }}
+              value: {{ .Values.grafana.external.url }}
             - name: USE_EXTERNAL_GRAFANA
               value: "true"
 {{- else }}
             - name: GRAFANA_ENDPOINT
               value: {{ .Release.Name }}-grafana.{{ .Release.Namespace }}.svc.cluster.local:80
 {{- end }}
-            
-          volumeMounts:
-            {{- if ne .Values.option.localtime "" }}
-            - name: {{ include "devlake.fullname" . }}-ui-localtime
-              mountPath: /etc/localtime
-              readOnly: true
+            {{- with .Values.envs }}
+            {{- toYaml . | nindent 12 }}
             {{- end }}
           {{- with .Values.ui.resources }}
           resources:
@@ -96,10 +90,96 @@ spec:
       tolerations:
         {{- toYaml . | nindent 8 }}
       {{- end }}
-      volumes:
-        {{- if ne .Values.option.localtime "" }}
-        - name: {{ include "devlake.fullname" . }}-ui-localtime
-          hostPath:
-            path: {{ .Values.option.localtime }}
-            type: File
-        {{- end }}
+
+---
+# devlake
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: {{ include "devlake.fullname" . }}-lake
+  labels:
+  {{- include "devlake.labels" . | nindent 4 }}
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+  {{- include "devlake.selectorLabels" . | nindent 6 }}
+  template:
+    metadata:
+      labels:
+        {{- include "devlake.selectorLabels" . | nindent 8 }}
+        devlakeComponent: lake
+        {{- with .Values.lake.extraLabels }}
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
+      annotations:
+        # Force reload on config changes
+        checksum/devlake-config: {{ include (print $.Template.BasePath "/configmaps.yaml") . | sha256sum }}
+    spec:
+      {{- with .Values.lake.securityContext }}
+      securityContext:
+      {{- toYaml . | nindent 8 }}
+      {{- end }}
+      initContainers:
+        {{- include "common.initContainerWaitDatabase" . | nindent 8 }}
+        {{- with .Values.lake.containerSecurityContext }}
+        securityContext:
+        {{- toYaml . | nindent 12 }}
+      {{- end }}
+      containers:
+        - name: lake
+          {{- if .Values.lake.image.tag }}
+          image: "{{ .Values.lake.image.repository }}:{{ .Values.lake.image.tag }}"
+          {{- else }}
+          image: "{{ .Values.lake.image.repository }}:{{ .Values.imageTag }}"
+          {{- end }}
+          imagePullPolicy: {{ .Values.lake.image.pullPolicy }}
+          ports:
+            - containerPort: {{ .Values.lake.port }}
+          livenessProbe:
+            httpGet:
+              path: /ping
+              port: {{ .Values.lake.port }}
+              scheme: HTTP
+            initialDelaySeconds: 60
+            timeoutSeconds: 30
+          envFrom:
+            - secretRef:
+                name: {{ include "devlake.mysql.secret" . }}
+            - secretRef:
+                name: {{ include "devlake.lake.encryption.secret" . }}
+          env:
+            - name: PORT
+              value: "{{ .Values.lake.port }}"
+            {{- with .Values.lake.envs }}
+            {{- toYaml . | nindent 12 }}
+            {{- end }}
+            {{- with .Values.envs }}
+            {{- toYaml . | nindent 12 }}
+          {{- end }}
+          {{- with .Values.lake.resources }}
+          resources:
+          {{- toYaml . | nindent 12 }}
+          {{- end }}
+          {{- with .Values.lake.containerSecurityContext }}
+          securityContext:
+          {{- toYaml . | nindent 12 }}
+      {{- end }}
+      {{- if .Values.lake.hostNetwork }}
+      hostNetwork: true
+      dnsPolicy: ClusterFirstWithHostNet
+      {{- end }}
+      {{- with .Values.lake.nodeSelector }}
+      nodeSelector:
+      {{- toYaml . | nindent 8 }}
+      {{- end }}
+      {{- with .Values.lake.affinity }}
+      affinity:
+      {{- toYaml . | nindent 8 }}
+      {{- end }}
+      {{- with .Values.lake.tolerations }}
+      tolerations:
+      {{- toYaml . | nindent 8 }}
+  {{- end }}
+
+
diff --git a/charts/devlake/templates/grafana-dashboard-configmap.yaml b/charts/devlake/templates/grafana-dashboard-configmap.yaml
deleted file mode 100644
index 01bb445..0000000
--- a/charts/devlake/templates/grafana-dashboard-configmap.yaml
+++ /dev/null
@@ -1,64 +0,0 @@
----
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: grafana-dashboards
-  labels:
-    grafana_dashboard: "1"
-data:
-  bitbucket.json: |
-{{ .Files.Get "dashboards/BitBucket.json" | indent 4 }}
-  componentandfilelevelmetrics.json: |
-{{ .Files.Get "dashboards/ComponentAndFileLevelMetrics.json" | indent 4 }}
-  contributorexperience.json: |
-{{ .Files.Get "dashboards/ContributorExperience.json" | indent 4 }}
-  dora.json: |
-{{ .Files.Get "dashboards/DORA.json" | indent 4 }}
-  dorabyteam.json: |
-{{ .Files.Get "dashboards/DORAByTeam.json" | indent 4 }}
-  doradebug.json: |
-{{ .Files.Get "dashboards/DORADebug.json" | indent 4 }}
-  demoaveragerequirementleadtimebyassignee.json: |
-{{ .Files.Get "dashboards/DemoAverageRequirementLeadTimeByAssignee.json" | indent 4 }}
-  democommitcountbyauthor.json: |
-{{ .Files.Get "dashboards/DemoCommitCountByAuthor.json" | indent 4 }}
-  demodetailedbuginfo.json: |
-{{ .Files.Get "dashboards/DemoDetailedBugInfo.json" | indent 4 }}
-  demohomepage.json: |
-{{ .Files.Get "dashboards/DemoHomepage.json" | indent 4 }}
-  demohowfastdowerespondtocustomerrequirements.json: |
-{{ .Files.Get "dashboards/DemoHowFastDoWeRespondToCustomerRequirements.json" | indent 4 }}
-  demoisthismonthmoreproductivethanlast.json: |
-{{ .Files.Get "dashboards/DemoIsThisMonthMoreProductiveThanLast.json" | indent 4 }}
-  demowasourqualityimprovedornot.json: |
-{{ .Files.Get "dashboards/DemoWasOurQualityImprovedOrNot.json" | indent 4 }}
-  engineeringoverview.json: |
-{{ .Files.Get "dashboards/EngineeringOverview.json" | indent 4 }}
-  engineeringthroughputandcycletime.json: |
-{{ .Files.Get "dashboards/EngineeringThroughputAndCycleTime.json" | indent 4 }}
-  engineeringthroughputandcycletimeteamview.json: |
-{{ .Files.Get "dashboards/EngineeringThroughputAndCycleTimeTeamView.json" | indent 4 }}
-  github.json: |
-{{ .Files.Get "dashboards/GitHub.json" | indent 4 }}
-  githubreleasequalityandcontributionanalysis.json: |
-{{ .Files.Get "dashboards/GithubReleaseQualityAndContributionAnalysis.json" | indent 4 }}
-  gitlab.json: |
-{{ .Files.Get "dashboards/Gitlab.json" | indent 4 }}
-  homepage.json: |
-{{ .Files.Get "dashboards/Homepage.json" | indent 4 }}
-  jenkins.json: |
-{{ .Files.Get "dashboards/Jenkins.json" | indent 4 }}
-  jira.json: |
-{{ .Files.Get "dashboards/Jira.json" | indent 4 }}
-  sonarqube.json: |
-{{ .Files.Get "dashboards/Sonarqube.json" | indent 4 }}
-  tapd.json: |
-{{ .Files.Get "dashboards/TAPD.json" | indent 4 }}
-  teambition.json: |
-{{ .Files.Get "dashboards/Teambition.json" | indent 4 }}
-  weeklybugretro.json: |
-{{ .Files.Get "dashboards/WeeklyBugRetro.json" | indent 4 }}
-  weeklycommunityretro.json: |
-{{ .Files.Get "dashboards/WeeklyCommunityRetro.json" | indent 4 }}
-  zentao.json: |
-{{ .Files.Get "dashboards/Zentao.json" | indent 4 }}
diff --git a/charts/devlake/templates/grafana-dashboard-configmaps/bitbucket.yaml b/charts/devlake/templates/grafana-dashboard-configmaps/bitbucket.yaml
new file mode 100644
index 0000000..38c1206
--- /dev/null
+++ b/charts/devlake/templates/grafana-dashboard-configmaps/bitbucket.yaml
@@ -0,0 +1,11 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: bitbucket-dashboard-cm
+  labels:
+    {{ $.Values.grafana.sidecar.dashboards.label }}: {{ $.Values.grafana.sidecar.dashboards.labelValue | quote }}
+data:
+  bitbucket.json: |
+{{ .Files.Get "dashboards/BitBucket.json" | indent 4 }}
+
diff --git a/charts/devlake/templates/grafana-dashboard-configmaps/componentandfilelevelmetrics.yaml b/charts/devlake/templates/grafana-dashboard-configmaps/componentandfilelevelmetrics.yaml
new file mode 100644
index 0000000..f9c3b04
--- /dev/null
+++ b/charts/devlake/templates/grafana-dashboard-configmaps/componentandfilelevelmetrics.yaml
@@ -0,0 +1,11 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: componentandfilelevelmetrics-dashboard-cm
+  labels:
+    {{ $.Values.grafana.sidecar.dashboards.label }}: {{ $.Values.grafana.sidecar.dashboards.labelValue | quote }}
+data:
+  componentandfilelevelmetrics.json: |
+{{ .Files.Get "dashboards/ComponentAndFileLevelMetrics.json" | indent 4 }}
+
diff --git a/charts/devlake/templates/grafana-dashboard-configmaps/contributorexperience.yaml b/charts/devlake/templates/grafana-dashboard-configmaps/contributorexperience.yaml
new file mode 100644
index 0000000..9ae7378
--- /dev/null
+++ b/charts/devlake/templates/grafana-dashboard-configmaps/contributorexperience.yaml
@@ -0,0 +1,11 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: contributorexperience-dashboard-cm
+  labels:
+    {{ $.Values.grafana.sidecar.dashboards.label }}: {{ $.Values.grafana.sidecar.dashboards.labelValue | quote }}
+data:
+  contributorexperience.json: |
+{{ .Files.Get "dashboards/ContributorExperience.json" | indent 4 }}
+
diff --git a/charts/devlake/templates/grafana-dashboard-configmaps/demoaveragerequirementleadtimebyassignee.yaml b/charts/devlake/templates/grafana-dashboard-configmaps/demoaveragerequirementleadtimebyassignee.yaml
new file mode 100644
index 0000000..d1aeb11
--- /dev/null
+++ b/charts/devlake/templates/grafana-dashboard-configmaps/demoaveragerequirementleadtimebyassignee.yaml
@@ -0,0 +1,11 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: demoaveragerequirementleadtimebyassignee-dashboard-cm
+  labels:
+    {{ $.Values.grafana.sidecar.dashboards.label }}: {{ $.Values.grafana.sidecar.dashboards.labelValue | quote }}
+data:
+  demoaveragerequirementleadtimebyassignee.json: |
+{{ .Files.Get "dashboards/DemoAverageRequirementLeadTimeByAssignee.json" | indent 4 }}
+
diff --git a/charts/devlake/templates/grafana-dashboard-configmaps/democommitcountbyauthor.yaml b/charts/devlake/templates/grafana-dashboard-configmaps/democommitcountbyauthor.yaml
new file mode 100644
index 0000000..10e3b03
--- /dev/null
+++ b/charts/devlake/templates/grafana-dashboard-configmaps/democommitcountbyauthor.yaml
@@ -0,0 +1,11 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: democommitcountbyauthor-dashboard-cm
+  labels:
+    {{ $.Values.grafana.sidecar.dashboards.label }}: {{ $.Values.grafana.sidecar.dashboards.labelValue | quote }}
+data:
+  democommitcountbyauthor.json: |
+{{ .Files.Get "dashboards/DemoCommitCountByAuthor.json" | indent 4 }}
+
diff --git a/charts/devlake/templates/grafana-dashboard-configmaps/demodetailedbuginfo.yaml b/charts/devlake/templates/grafana-dashboard-configmaps/demodetailedbuginfo.yaml
new file mode 100644
index 0000000..6905560
--- /dev/null
+++ b/charts/devlake/templates/grafana-dashboard-configmaps/demodetailedbuginfo.yaml
@@ -0,0 +1,11 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: demodetailedbuginfo-dashboard-cm
+  labels:
+    {{ $.Values.grafana.sidecar.dashboards.label }}: {{ $.Values.grafana.sidecar.dashboards.labelValue | quote }}
+data:
+  demodetailedbuginfo.json: |
+{{ .Files.Get "dashboards/DemoDetailedBugInfo.json" | indent 4 }}
+
diff --git a/charts/devlake/templates/grafana-dashboard-configmaps/demohomepage.yaml b/charts/devlake/templates/grafana-dashboard-configmaps/demohomepage.yaml
new file mode 100644
index 0000000..81db478
--- /dev/null
+++ b/charts/devlake/templates/grafana-dashboard-configmaps/demohomepage.yaml
@@ -0,0 +1,11 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: demohomepage-dashboard-cm
+  labels:
+    {{ $.Values.grafana.sidecar.dashboards.label }}: {{ $.Values.grafana.sidecar.dashboards.labelValue | quote }}
+data:
+  demohomepage.json: |
+{{ .Files.Get "dashboards/DemoHomepage.json" | indent 4 }}
+
diff --git a/charts/devlake/templates/grafana-dashboard-configmaps/demohowfastdowerespondtocustomerrequirements.yaml b/charts/devlake/templates/grafana-dashboard-configmaps/demohowfastdowerespondtocustomerrequirements.yaml
new file mode 100644
index 0000000..075f255
--- /dev/null
+++ b/charts/devlake/templates/grafana-dashboard-configmaps/demohowfastdowerespondtocustomerrequirements.yaml
@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: demohowfastdowerespondtocustomerrequirements-dashboard-cm
+  labels:
+    {{ $.Values.grafana.sidecar.dashboards.label }}: {{ $.Values.grafana.sidecar.dashboards.labelValue | quote }}
+data:
+  demohowfastdowerespondtocustomerrequirements.json: |
+{{ .Files.Get "dashboards/DemoHowFastDoWeRespondToCustomerRequirements.json" | indent 4 }}
diff --git a/charts/devlake/templates/grafana-dashboard-configmaps/demoisthismonthmoreproductivethanlast.yaml b/charts/devlake/templates/grafana-dashboard-configmaps/demoisthismonthmoreproductivethanlast.yaml
new file mode 100644
index 0000000..8fe2735
--- /dev/null
+++ b/charts/devlake/templates/grafana-dashboard-configmaps/demoisthismonthmoreproductivethanlast.yaml
@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: demoisthismonthmoreproductivethanlast-dashboard-cm
+  labels:
+    {{ $.Values.grafana.sidecar.dashboards.label }}: {{ $.Values.grafana.sidecar.dashboards.labelValue | quote }}
+data:
+  demoisthismonthmoreproductivethanlast.json: |
+{{ .Files.Get "dashboards/DemoIsThisMonthMoreProductiveThanLast.json" | indent 4 }}
diff --git a/charts/devlake/templates/grafana-dashboard-configmaps/demowasourqualityimprovedornot.yaml b/charts/devlake/templates/grafana-dashboard-configmaps/demowasourqualityimprovedornot.yaml
new file mode 100644
index 0000000..0d5e439
--- /dev/null
+++ b/charts/devlake/templates/grafana-dashboard-configmaps/demowasourqualityimprovedornot.yaml
@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: demowasourqualityimprovedornot-dashboard-cm
+  labels:
+    {{ $.Values.grafana.sidecar.dashboards.label }}: {{ $.Values.grafana.sidecar.dashboards.labelValue | quote }}
+data:
+  demowasourqualityimprovedornot.json: |
+{{ .Files.Get "dashboards/DemoWasOurQualityImprovedOrNot.json" | indent 4 }}
diff --git a/charts/devlake/templates/grafana-dashboard-configmaps/dora.yaml b/charts/devlake/templates/grafana-dashboard-configmaps/dora.yaml
new file mode 100644
index 0000000..555a61f
--- /dev/null
+++ b/charts/devlake/templates/grafana-dashboard-configmaps/dora.yaml
@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: dora-dashboard-cm
+  labels:
+    {{ $.Values.grafana.sidecar.dashboards.label }}: {{ $.Values.grafana.sidecar.dashboards.labelValue | quote }}
+data:
+  dora.json: |
+{{ .Files.Get "dashboards/DORA.json" | indent 4 }}
diff --git a/charts/devlake/templates/grafana-dashboard-configmaps/dorabyteam.yaml b/charts/devlake/templates/grafana-dashboard-configmaps/dorabyteam.yaml
new file mode 100644
index 0000000..9f92487
--- /dev/null
+++ b/charts/devlake/templates/grafana-dashboard-configmaps/dorabyteam.yaml
@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: dorabyteam-dashboard-cm
+  labels:
+    {{ $.Values.grafana.sidecar.dashboards.label }}: {{ $.Values.grafana.sidecar.dashboards.labelValue | quote }}
+data:
+  dorabyteam.json: |
+{{ .Files.Get "dashboards/DORAByTeam.json" | indent 4 }}
diff --git a/charts/devlake/templates/grafana-dashboard-configmaps/doradebug.yaml b/charts/devlake/templates/grafana-dashboard-configmaps/doradebug.yaml
new file mode 100644
index 0000000..56ced53
--- /dev/null
+++ b/charts/devlake/templates/grafana-dashboard-configmaps/doradebug.yaml
@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: doradebug-dashboard-cm
+  labels:
+    {{ $.Values.grafana.sidecar.dashboards.label }}: {{ $.Values.grafana.sidecar.dashboards.labelValue | quote }}
+data:
+  doradebug.json: |
+{{ .Files.Get "dashboards/DORADebug.json" | indent 4 }}
diff --git a/charts/devlake/templates/grafana-dashboard-configmaps/engineeringoverview.yaml b/charts/devlake/templates/grafana-dashboard-configmaps/engineeringoverview.yaml
new file mode 100644
index 0000000..6def481
--- /dev/null
+++ b/charts/devlake/templates/grafana-dashboard-configmaps/engineeringoverview.yaml
@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: engineeringoverview-dashboard-cm
+  labels:
+    {{ $.Values.grafana.sidecar.dashboards.label }}: {{ $.Values.grafana.sidecar.dashboards.labelValue | quote }}
+data:
+  engineeringoverview.json: |
+{{ .Files.Get "dashboards/EngineeringOverview.json" | indent 4 }}
diff --git a/charts/devlake/templates/grafana-dashboard-configmaps/engineeringthroughputandcycletime.yaml b/charts/devlake/templates/grafana-dashboard-configmaps/engineeringthroughputandcycletime.yaml
new file mode 100644
index 0000000..d38cad1
--- /dev/null
+++ b/charts/devlake/templates/grafana-dashboard-configmaps/engineeringthroughputandcycletime.yaml
@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: engineeringthroughputandcycletime-dashboard-cm
+  labels:
+    {{ $.Values.grafana.sidecar.dashboards.label }}: {{ $.Values.grafana.sidecar.dashboards.labelValue | quote }}
+data:
+  engineeringthroughputandcycletime.json: |
+{{ .Files.Get "dashboards/EngineeringThroughputAndCycleTime.json" | indent 4 }}
diff --git a/charts/devlake/templates/grafana-dashboard-configmaps/engineeringthroughputandcycletimeteamview.yaml b/charts/devlake/templates/grafana-dashboard-configmaps/engineeringthroughputandcycletimeteamview.yaml
new file mode 100644
index 0000000..88fbe68
--- /dev/null
+++ b/charts/devlake/templates/grafana-dashboard-configmaps/engineeringthroughputandcycletimeteamview.yaml
@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: engineeringthroughputandcycletimeteamview-dashboard-cm
+  labels:
+    {{ $.Values.grafana.sidecar.dashboards.label }}: {{ $.Values.grafana.sidecar.dashboards.labelValue | quote }}
+data:
+  engineeringthroughputandcycletimeteamview.json: |
+{{ .Files.Get "dashboards/EngineeringThroughputAndCycleTimeTeamView.json" | indent 4 }}
diff --git a/charts/devlake/templates/grafana-dashboard-configmaps/github.yaml b/charts/devlake/templates/grafana-dashboard-configmaps/github.yaml
new file mode 100644
index 0000000..28fd820
--- /dev/null
+++ b/charts/devlake/templates/grafana-dashboard-configmaps/github.yaml
@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: github-dashboard-cm
+  labels:
+    {{ $.Values.grafana.sidecar.dashboards.label }}: {{ $.Values.grafana.sidecar.dashboards.labelValue | quote }}
+data:
+  github.json: |
+{{ .Files.Get "dashboards/GitHub.json" | indent 4 }}
diff --git a/charts/devlake/templates/grafana-dashboard-configmaps/githubreleasequalityandcontributionanalysis.yaml b/charts/devlake/templates/grafana-dashboard-configmaps/githubreleasequalityandcontributionanalysis.yaml
new file mode 100644
index 0000000..245bb3a
--- /dev/null
+++ b/charts/devlake/templates/grafana-dashboard-configmaps/githubreleasequalityandcontributionanalysis.yaml
@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: githubreleasequalityandcontributionanalysis-dashboard-cm
+  labels:
+    {{ $.Values.grafana.sidecar.dashboards.label }}: {{ $.Values.grafana.sidecar.dashboards.labelValue | quote }}
+data:
+  githubreleasequalityandcontributionanalysis.json: |
+{{ .Files.Get "dashboards/GithubReleaseQualityAndContributionAnalysis.json" | indent 4 }}
diff --git a/charts/devlake/templates/grafana-dashboard-configmaps/gitlab.yaml b/charts/devlake/templates/grafana-dashboard-configmaps/gitlab.yaml
new file mode 100644
index 0000000..88d6dee
--- /dev/null
+++ b/charts/devlake/templates/grafana-dashboard-configmaps/gitlab.yaml
@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: gitlab-dashboard-cm
+  labels:
+    {{ $.Values.grafana.sidecar.dashboards.label }}: {{ $.Values.grafana.sidecar.dashboards.labelValue | quote }}
+data:
+  gitlab.json: |
+{{ .Files.Get "dashboards/Gitlab.json" | indent 4 }}
diff --git a/charts/devlake/templates/grafana-dashboard-configmaps/homepage.yaml b/charts/devlake/templates/grafana-dashboard-configmaps/homepage.yaml
new file mode 100644
index 0000000..52db5d8
--- /dev/null
+++ b/charts/devlake/templates/grafana-dashboard-configmaps/homepage.yaml
@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: homepage-dashboard-cm
+  labels:
+    {{ $.Values.grafana.sidecar.dashboards.label }}: {{ $.Values.grafana.sidecar.dashboards.labelValue | quote }}
+data:
+  homepage.json: |
+{{ .Files.Get "dashboards/Homepage.json" | indent 4 }}
diff --git a/charts/devlake/templates/grafana-dashboard-configmaps/jenkins.yaml b/charts/devlake/templates/grafana-dashboard-configmaps/jenkins.yaml
new file mode 100644
index 0000000..bfa2d5a
--- /dev/null
+++ b/charts/devlake/templates/grafana-dashboard-configmaps/jenkins.yaml
@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: jenkins-dashboard-cm
+  labels:
+    {{ $.Values.grafana.sidecar.dashboards.label }}: {{ $.Values.grafana.sidecar.dashboards.labelValue | quote }}
+data:
+  jenkins.json: |
+{{ .Files.Get "dashboards/Jenkins.json" | indent 4 }}
diff --git a/charts/devlake/templates/grafana-dashboard-configmaps/jira.yaml b/charts/devlake/templates/grafana-dashboard-configmaps/jira.yaml
new file mode 100644
index 0000000..dc4e427
--- /dev/null
+++ b/charts/devlake/templates/grafana-dashboard-configmaps/jira.yaml
@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: jira-dashboard-cm
+  labels:
+    {{ $.Values.grafana.sidecar.dashboards.label }}: {{ $.Values.grafana.sidecar.dashboards.labelValue | quote }}
+data:
+  jira.json: |
+{{ .Files.Get "dashboards/Jira.json" | indent 4 }}
diff --git a/charts/devlake/templates/grafana-dashboard-configmaps/sonarqube.yaml b/charts/devlake/templates/grafana-dashboard-configmaps/sonarqube.yaml
new file mode 100644
index 0000000..13adf7c
--- /dev/null
+++ b/charts/devlake/templates/grafana-dashboard-configmaps/sonarqube.yaml
@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: sonarqube-dashboard-cm
+  labels:
+    {{ $.Values.grafana.sidecar.dashboards.label }}: {{ $.Values.grafana.sidecar.dashboards.labelValue | quote }}
+data:
+  sonarqube.json: |
+{{ .Files.Get "dashboards/Sonarqube.json" | indent 4 }}
diff --git a/charts/devlake/templates/grafana-dashboard-configmaps/tapd.yaml b/charts/devlake/templates/grafana-dashboard-configmaps/tapd.yaml
new file mode 100644
index 0000000..8a5cd47
--- /dev/null
+++ b/charts/devlake/templates/grafana-dashboard-configmaps/tapd.yaml
@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: tapd-dashboard-cm
+  labels:
+    {{ $.Values.grafana.sidecar.dashboards.label }}: {{ $.Values.grafana.sidecar.dashboards.labelValue | quote }}
+data:
+  tapd.json: |
+{{ .Files.Get "dashboards/TAPD.json" | indent 4 }}
diff --git a/charts/devlake/templates/grafana-dashboard-configmaps/teambition.yaml b/charts/devlake/templates/grafana-dashboard-configmaps/teambition.yaml
new file mode 100644
index 0000000..fceed22
--- /dev/null
+++ b/charts/devlake/templates/grafana-dashboard-configmaps/teambition.yaml
@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: teambition-dashboard-cm
+  labels:
+    {{ $.Values.grafana.sidecar.dashboards.label }}: {{ $.Values.grafana.sidecar.dashboards.labelValue | quote }}
+data:
+  teambition.json: |
+{{ .Files.Get "dashboards/Teambition.json" | indent 4 }}
diff --git a/charts/devlake/templates/grafana-dashboard-configmaps/weeklybugretro.yaml b/charts/devlake/templates/grafana-dashboard-configmaps/weeklybugretro.yaml
new file mode 100644
index 0000000..a055c47
--- /dev/null
+++ b/charts/devlake/templates/grafana-dashboard-configmaps/weeklybugretro.yaml
@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: weeklybugretro-dashboard-cm
+  labels:
+    {{ $.Values.grafana.sidecar.dashboards.label }}: {{ $.Values.grafana.sidecar.dashboards.labelValue | quote }}
+data:
+  weeklybugretro.json: |
+{{ .Files.Get "dashboards/WeeklyBugRetro.json" | indent 4 }}
diff --git a/charts/devlake/templates/grafana-dashboard-configmaps/weeklycommunityretro.yaml b/charts/devlake/templates/grafana-dashboard-configmaps/weeklycommunityretro.yaml
new file mode 100644
index 0000000..faa6bd3
--- /dev/null
+++ b/charts/devlake/templates/grafana-dashboard-configmaps/weeklycommunityretro.yaml
@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: weeklycommunityretro-dashboard-cm
+  labels:
+    {{ $.Values.grafana.sidecar.dashboards.label }}: {{ $.Values.grafana.sidecar.dashboards.labelValue | quote }}
+data:
+  weeklycommunityretro.json: |
+{{ .Files.Get "dashboards/WeeklyCommunityRetro.json" | indent 4 }}
diff --git a/charts/devlake/templates/grafana-dashboard-configmaps/zentao.yaml b/charts/devlake/templates/grafana-dashboard-configmaps/zentao.yaml
new file mode 100644
index 0000000..31731c7
--- /dev/null
+++ b/charts/devlake/templates/grafana-dashboard-configmaps/zentao.yaml
@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: zentao-dashboard-cm
+  labels:
+    {{ $.Values.grafana.sidecar.dashboards.label }}: {{ $.Values.grafana.sidecar.dashboards.labelValue | quote }}
+data:
+  zentao.json: |
+{{ .Files.Get "dashboards/Zentao.json" | indent 4 }}
diff --git a/charts/devlake/templates/ingresses.yaml b/charts/devlake/templates/ingresses.yaml
index 5426419..b27ec20 100644
--- a/charts/devlake/templates/ingresses.yaml
+++ b/charts/devlake/templates/ingresses.yaml
@@ -55,7 +55,7 @@ spec:
     - host: {{ .Values.ingress.hostname | quote }}
       http:
         paths:
-          {{- if not .Values.externalGrafana.useExternal }}
+          {{- if .Values.grafana.enabled }}
           {{- if .Values.ingress.useDefaultNginx }}
           - path: /{{ include "devlake.grafanaEndpointPrefix" . }}(/|$)(.*)
           {{- else }}
@@ -94,7 +94,7 @@ spec:
               servicePort: 4000
               {{- end }}
 
-{{- if and .Values.ingress.useDefaultNginx .Values.externalGrafana.useExternal }}
+{{- if and .Values.ingress.useDefaultNginx (not .Values.grafana.enabled) }}
 ---
 {{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}}
 apiVersion: networking.k8s.io/v1
@@ -110,7 +110,7 @@ metadata:
     {{- include "devlake.labels" . | nindent 4 }}
   annotations:
     nginx.ingress.kubernetes.io/rewrite-target: /$2
-    nginx.ingress.kubernetes.io/permanent-redirect: {{ .Values.externalGrafana.grafanaUrl }}
+    nginx.ingress.kubernetes.io/permanent-redirect: {{ .Values.grafana.external.url }}
   {{- with .Values.ingress.annotations }}
     {{- toYaml . | nindent 4 }}
   {{- end }}
diff --git a/charts/devlake/templates/secrets.yaml b/charts/devlake/templates/secrets.yaml
index d639516..421c3c1 100644
--- a/charts/devlake/templates/secrets.yaml
+++ b/charts/devlake/templates/secrets.yaml
@@ -14,12 +14,12 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-{{- if and .Values.option.useConnectionDetailsSecret .Values.option.autoCreateSecret }}
+{{- if .Values.option.autoCreateSecret }}
 ---
 apiVersion: v1
 kind: Secret
 metadata:
-  name: {{ .Values.option.connectionSecretName }}
+  name: {{ include "devlake.mysql.secret" . }}
 stringData:
 {{- if (eq .Values.option.database "mysql") }}
   MYSQL_USER: "{{ .Values.mysql.username }}"
@@ -27,6 +27,7 @@ stringData:
   MYSQL_DATABASE: "{{ .Values.mysql.database }}"
   MYSQL_ROOT_PASSWORD: "{{ .Values.mysql.rootPassword }}"
   DB_URL: "{{ include "database.url" . }}"
+  MYSQL_URL: "{{ include "mysql.server" . }}:{{ include "mysql.port" . }}"
 #{{- else if (eq .Values.option.database "pgsql")}}
 #  POSTGRES_USER: "{{ .Values.pgsql.username }}"
 #  POSTGRES_PASSWORD: "{{ .Values.pgsql.password }}"
@@ -34,13 +35,24 @@ stringData:
 #  DB_URL: "{{ include "database.url" . }}"
 {{- end }}
 {{- end }}
-{{- if and .Values.ui.basicAuth.enabled .Values.ui.basicAuth.useSecret .Values.ui.basicAuth.autoCreateSecret }}
+
+{{- if and .Values.ui.basicAuth.enabled .Values.ui.basicAuth.autoCreateSecret }}
 ---
 apiVersion: v1
 kind: Secret
 metadata:
-  name: {{ .Values.ui.basicAuth.secretName }}
+  name: {{ include "devlake.ui.auth.secret" . }}
 stringData:
   ADMIN_USER: "{{ .Values.ui.basicAuth.user }}"
   ADMIN_PASS: "{{ .Values.ui.basicAuth.password }}"
 {{- end }}
+
+{{- if .Values.lake.encryptionSecret.autoCreateSecret }}
+---
+apiVersion: v1
+kind: Secret
+metadata:
+  name: {{ include "devlake.lake.encryption.secret" . }}
+stringData:
+  ENCRYPTION_SECRET: {{ .Values.lake.encryptionSecret.secret }}
+{{- end }}
diff --git a/charts/devlake/templates/services.yaml b/charts/devlake/templates/services.yaml
index d8972c5..20a67e4 100644
--- a/charts/devlake/templates/services.yaml
+++ b/charts/devlake/templates/services.yaml
@@ -51,8 +51,9 @@ spec:
   ports:
     - protocol: TCP
       name: devlake
-      port: 8080
-      targetPort: 8080
+      port: {{ .Values.lake.port }}
+      targetPort: {{ .Values.lake.port }}
+
 ---
 # ui
 apiVersion: v1
diff --git a/charts/devlake/templates/statefulsets.yaml b/charts/devlake/templates/statefulsets.yaml
index 62e21d7..09545db 100644
--- a/charts/devlake/templates/statefulsets.yaml
+++ b/charts/devlake/templates/statefulsets.yaml
@@ -61,7 +61,7 @@ spec:
               command:
                 - "sh"
                 - "-c"
-                - "mysqladmin ping -u root -p{{ .Values.mysql.rootPassword }}"
+                - "mysqladmin ping -u root -p$MYSQL_ROOT_PASSWORD"
             initialDelaySeconds: 60
             timeoutSeconds: 30
           readinessProbe:
@@ -69,7 +69,7 @@ spec:
               command:
                 - "sh"
                 - "-c"
-                - "mysqladmin ping -u root -p{{ .Values.mysql.rootPassword }}"
+                - "mysqladmin ping -u root -p$MYSQL_ROOT_PASSWORD"
             initialDelaySeconds: 5
             timeoutSeconds: 10
           {{- with .Values.mysql.resources }}
@@ -77,20 +77,15 @@ spec:
             {{- toYaml . | nindent 12 }}
           {{- end }}
           envFrom:
-            - configMapRef:
-                name: {{ include "devlake.fullname" . }}-config
-            {{- if .Values.option.useConnectionDetailsSecret }}
             - secretRef:
-                name: {{ .Values.option.connectionSecretName }}
-            {{- end }}
+                name: {{ include "devlake.mysql.secret" . }}
+          {{- with .Values.envs }}
+          env:
+            {{- toYaml . | nindent 12 }}
+          {{- end }}
           volumeMounts:
             - mountPath: /var/lib/mysql
               name: {{ include "devlake.fullname" . }}-mysql-data
-            {{- if ne .Values.option.localtime "" }}
-            - name: {{ include "devlake.fullname" . }}-mysql-localtime
-              mountPath: /etc/localtime
-              readOnly: true
-            {{- end }}
           {{- with .Values.mysql.containerSecurityContext }}
           securityContext:
             {{- toYaml . | nindent 12 }}
@@ -107,13 +102,6 @@ spec:
       tolerations:
         {{- toYaml . | nindent 8 }}
       {{- end }}
-      volumes:
-        {{- if ne .Values.option.localtime "" }}
-        - name: {{ include "devlake.fullname" . }}-mysql-localtime
-          hostPath:
-            path: {{ .Values.option.localtime }}
-            type: File
-        {{- end }}
   volumeClaimTemplates:
     - metadata:
         name: {{ include "devlake.fullname" . }}-mysql-data
@@ -127,145 +115,5 @@ spec:
             storage: "{{ .Values.mysql.storage.size }}"
 {{- end }}
 {{- end }}
----
-# devlake
-apiVersion: apps/v1
-kind: StatefulSet
-metadata:
-  name: {{ include "devlake.fullname" . }}-lake
-  labels:
-    {{- include "devlake.labels" . | nindent 4 }}
-spec:
-  replicas: 1
-  serviceName: {{ include "devlake.fullname" . }}-lake
-  selector:
-    matchLabels:
-      {{- include "devlake.selectorLabels" . | nindent 6 }}
-  template:
-    metadata:
-      labels:
-        {{- include "devlake.selectorLabels" . | nindent 8 }}
-        devlakeComponent: lake
-        {{- with .Values.lake.extraLabels }}
-        {{- toYaml . | nindent 8 }}
-        {{- end }}
-      annotations:
-        # Force reload on config changes
-        checksum/devlake-config: {{ include (print $.Template.BasePath "/configmaps.yaml") . | sha256sum }}
-    spec:
-      {{- with .Values.lake.securityContext }}
-      securityContext:
-        {{- toYaml . | nindent 8 }}
-      {{- end }}
-      initContainers:
-        {{- include "common.initContainerWaitDatabase" . | nindent 8 }}
-          {{- with .Values.lake.containerSecurityContext }}
-          securityContext:
-            {{- toYaml . | nindent 12 }}
-          {{- end }}
-        - name: patch-env
-          image: "{{ .Values.alpine.image.repository }}:{{ .Values.alpine.image.tag }}"
-          imagePullPolicy: {{ .Values.alpine.image.pullPolicy }}
-          command:
-            - 'sh'
-            - '-c'
-            - |
-              touch /app/config/.env
-              function patch_env() {
-                if grep -w ${key}= /app/config/.env ; then
-                  echo ${key} already set
-                else
-                  echo >> /app/config/.env
-                  echo ${key}=${val} >> /app/config/.env
-                  echo ${key}=${val} patched
-                  grep -w ${key}= /app/config/.env
-                fi
-              }
-              {{- range $k, $v := .Values.lake.dotenv }}
-                key={{ $k }} val={{ $v }} patch_env
-              {{- end }}
-              exit 0
-          volumeMounts:
-            - mountPath: /app/config
-              name: {{ include "devlake.fullname" . }}-lake-config
-          {{- with .Values.lake.containerSecurityContext }}
-          securityContext:
-            {{- toYaml . | nindent 12 }}
-          {{- end }}
-      containers:
-        - name: lake
-{{- if .Values.lake.image.tag }}
-          image: "{{ .Values.lake.image.repository }}:{{ .Values.lake.image.tag }}"
-{{- else }}
-          image: "{{ .Values.lake.image.repository }}:{{ .Values.imageTag }}"
-{{- end }}
-          imagePullPolicy: {{ .Values.lake.image.pullPolicy }}
-          ports:
-            - containerPort: 8080
-          livenessProbe:
-            httpGet:
-              path: /ping
-              port: 8080
-              scheme: HTTP
-            initialDelaySeconds: 60
-            timeoutSeconds: 30
-          envFrom:
-            - configMapRef:
-                name: {{ include "devlake.fullname" . }}-config
-            {{- if .Values.option.useConnectionDetailsSecret }}
-            - secretRef:
-                name: {{ .Values.option.connectionSecretName }}
-            {{- end }}
-          env:
-            - name: ENV_PATH
-              value: /app/config/.env
-          volumeMounts:
-            - mountPath: /app/config
-              name: {{ include "devlake.fullname" . }}-lake-config
-            {{- if ne .Values.option.localtime "" }}
-            - name: {{ include "devlake.fullname" . }}-lake-localtime
-              mountPath: /etc/localtime
-              readOnly: true
-            {{- end }}
-          {{- with .Values.lake.resources }}
-          resources:
-            {{- toYaml . | nindent 12 }}
-          {{- end }}
-          {{- with .Values.lake.containerSecurityContext }}
-          securityContext:
-            {{- toYaml . | nindent 12 }}
-          {{- end }}
-      {{- if .Values.lake.hostNetwork }}
-      hostNetwork: true
-      dnsPolicy: ClusterFirstWithHostNet
-      {{- end }}
-      {{- with .Values.lake.nodeSelector }}
-      nodeSelector:
-        {{- toYaml . | nindent 8 }}
-      {{- end }}
-      {{- with .Values.lake.affinity }}
-      affinity:
-        {{- toYaml . | nindent 8 }}
-      {{- end }}
-      {{- with .Values.lake.tolerations }}
-      tolerations:
-        {{- toYaml . | nindent 8 }}
-      {{- end }}
-      volumes:
-        {{- if ne .Values.option.localtime "" }}
-        - name: {{ include "devlake.fullname" . }}-lake-localtime
-          hostPath:
-            path: {{ .Values.option.localtime }}
-            type: File
-        {{- end }}
-  volumeClaimTemplates:
-    - metadata:
-        name: {{ include "devlake.fullname" . }}-lake-config
-      spec:
-        accessModes: ["ReadWriteOnce"]
-        {{- with .Values.lake.storage.class }}
-        storageClassName: "{{ . }}"
-        {{- end }}
-        resources:
-          requests:
-            storage: "{{ .Values.lake.storage.size }}"
+
+
diff --git a/charts/devlake/templates/validate.yaml b/charts/devlake/templates/validate.yaml
new file mode 100644
index 0000000..bedc9b0
--- /dev/null
+++ b/charts/devlake/templates/validate.yaml
@@ -0,0 +1,21 @@
+{{- if and .Values.lake.encryptionSecret.autoCreateSecret (not .Values.lake.encryptionSecret.secret) }}
+{{- fail
+"Helm test requires lake.encryptionSecret.secret.\n\n  - If you're upgrading from DevLake v0.17.x or earlier versions, please get the encryption secret by copying the ENCODE_KEY value from /app/config/.env of the lake pod (e.g. devlake-lake-0);\n  - If not, get the encryption secret via command `openssl rand -base64 2000 | tr -dc 'A-Z' | fold -w 128 | head -n 1`.\n\nFor more information, please check https://github.com/apache/incubator-devlake-helm-chart"
+}}
+{{- end }}
+
+{{- if and .Values.ui.basicAuth.enabled .Values.ui.basicAuth.autoCreateSecret (or (not .Values.ui.basicAuth.user) (not .Values.ui.basicAuth.password)) }}
+{{- fail "Helm test requires ui.basicAuth.user and ui.basicAuth.password" }}
+{{- end }}
+
+{{- if and (eq .Values.option.database "mysql") .Values.option.autoCreateSecret (or (not .Values.mysql.username) (not .Values.mysql.password) (not .Values.mysql.database)) }}
+{{- fail "Helm test requires mysql.username, mysql.password and mysql.database" }}
+{{- end }}
+
+{{- if and .Values.option.autoCreateSecret (eq .Values.option.database "mysql") (not .Values.mysql.useExternal) (not .Values.mysql.rootPassword) }}
+{{- fail "Helm test requires mysql.rootPassword" }}
+{{- end }}
+
+{{- if and (not .Values.grafana.enabled) (not .Values.grafana.external.url) }}
+{{- fail "Helm test requires grafana.enabled to be true or grafana.external.url to be provided" }}
+{{- end }}
diff --git a/charts/devlake/values.yaml b/charts/devlake/values.yaml
index dea133e..d51da81 100644
--- a/charts/devlake/values.yaml
+++ b/charts/devlake/values.yaml
@@ -17,11 +17,16 @@
 
 # replica count for dev
 replicaCount: 1
-imageTag: v0.17.0-beta13
+imageTag: v0.18.0-beta1
+
+#the common environments for all pods
+envs:
+  - name: TZ
+    value: "UTC"
 
 mysql:
   # if use external mysql server, please set true
-  #   by default using false, chart will create a single mysql instance
+  # by default using false, chart will create a single mysql instance
   useExternal: false
 
   # the external mysql server address
@@ -121,43 +126,34 @@ mysql:
 
 #   containerSecurityContext: {}
 
-externalGrafana:
-  useExternal: false
-  grafanaUrl: ""
-
 # dependency chart values
 grafana:
+  enabled: true
+  #if grafana enabled is false, then external url should be provided
+  external:
+    url: ""
   grafana.ini:
     server:
       root_url: "%(protocol)s://%(domain)s/grafana"
-  dashboardProviders:
-    dashboard.yaml:
-      apiVersion: 1
-      providers:
-        - name: default
-          org_id: 1
-          folder: ""
-          type: "file"
-          disableDeletion: false
-          editable: true
-          updateIntervalSeconds: 5
-          allowUiUpdates: true
-          options:
-            path: /var/lib/grafana/dashboards/default
-  dashboardsConfigMaps:
-    default: "grafana-dashboards"
-  datasources:
-    datasource.yaml:
-      apiVersion: 1
-      datasources:
-        - name: mysql
-          type: mysql
-          url: devlake-mysql:3306
-          database: lake
-          user: merico
-          secureJsonData:
-            password: merico
-          editable: false
+  plugins:
+    - grafana-piechart-panel
+  sidecar:
+    dashboards:
+      enabled: true
+      label: grafana_dashboard
+      labelValue: "1"
+    datasources:
+      enabled: true
+      label: grafana_datasource
+      labelValue: "1"
+  #the secret name should be as same as .Values.option.connectionSecretName
+  envFromSecrets:
+    - name: "devlake-mysql-auth"
+  env:
+    GF_USERS_ALLOW_SIGN_UP: "false"
+    GF_SERVER_SERVE_FROM_SUB_PATH: "true"
+    GF_DASHBOARDS_JSON_ENABLED: "true"
+    GF_LIVE_ALLOWED_ORIGINS: "*"
 
 lake:
   image:
@@ -166,16 +162,31 @@ lake:
     # defaults to imageTag; if set, lake.image.tag will override imageTag
     # tag:
   # storage for config
-  storage:
-    # the storage class for pv, leave empty will using default
-    class: ""
-    size: 100Mi
-  dotenv:
-    API_TIMEOUT: "120s"
-    API_RETRY: "3"
-    API_REQUESTS_PER_HOUR: "10000"
-    PIPELINE_MAX_PARALLEL: "1"
-    IN_SECURE_SKIP_VERIFY: "false"
+  port: 8080
+  envs:
+    - name: API_TIMEOUT
+      value: "120s"
+    - name: API_RETRY
+      value: "3"
+    - name: API_REQUESTS_PER_HOUR
+      value: "10000"
+    - name: PIPELINE_MAX_PARALLEL
+      value: "1"
+    - name: IN_SECURE_SKIP_VERIFY
+      value: "false"
+    - name: LOGGING_DIR
+      value: "/app/logs"
+    # debug, info, warn, error
+    - name: LOGGING_LEVEL
+      value: "info"
+
+  encryptionSecret:
+    # The name of secret which contains keys named ENCRYPTION_SECRET
+    secretName: ""
+    # if secretName is empty, secret should be set
+    # you can generate the encryption secret via cmd `openssl rand -base64 2000 | tr -dc 'A-Z' | fold -w 128 | head -n 1`
+    secret: ""
+    autoCreateSecret: true
 
   # If hostNetwork is true, then dnsPolicy is set to ClusterFirstWithHostNet
   hostNetwork: false
@@ -188,10 +199,6 @@ lake:
 
   affinity: {}
 
-  loggingDir: "/app/logs"
-  # debug, info, warn, error
-  loggingLevel: "info"
-
   extraLabels: {}
 
   securityContext: {}
@@ -216,9 +223,8 @@ ui:
     enabled: false
     user: admin
     password: admin
-    useSecret: false
     autoCreateSecret: true
-    secretName: devlake-auth
+    secretName: ""
 
   extraLabels: {}
 
@@ -288,19 +294,8 @@ ingress:
   httpsPort: 443
 
 option:
-  # localtime zone info from host path.
-  localtime: /etc/localtime
-
   # database type, supported: [mysql]
   database: mysql
-
-  # if true, will not add the database connection details
-  # to the configmap and will let them be obtained from a secret.
-  useConnectionDetailsSecret: false
-
-  # the secret name if useConnectionDetailsSecret is true.
-  connectionSecretName: devlake-db-connection
-
-  # if true, will create the secret as part of the chart
-  # when useConnectionDetailSecret is also true.
+  # the existing k8s secret name of db connection auth. The secret name should be as same as .Values.grafana.envFromSecret
+  connectionSecretName: "devlake-mysql-auth"
   autoCreateSecret: true