Repository: NetApp/harvest
Pull request #1381 (2022-10-31 12:06:56)

test: add unit test that finds metrics used in dashboards with confli…
…cting units

test: add unit test that finds metrics without units

fix: mismatched and missing units in dashboards


Patch:
diff --git a/cmd/collectors/rest/plugins/qtree/qtree.go b/cmd/collectors/rest/plugins/qtree/qtree.go
index 69b390cf..d492b9c3 100644
--- a/cmd/collectors/rest/plugins/qtree/qtree.go
+++ b/cmd/collectors/rest/plugins/qtree/qtree.go
@@ -180,7 +180,7 @@ func (my *Qtree) Run(data *matrix.Matrix) ([]*matrix.Matrix, error) {
 				}
 			}
 			if attrValue := quota.Get(attribute); attrValue.Exists() {
-				// space limits are in bytes, converted to kilobytes
+				// space limits are in bytes, converted to kilobytes to match ZAPI
 				if attribute == "space.hard_limit" || attribute == "space.soft_limit" || attribute == "space.used.total" {
 					value = attrValue.Float() / 1024
 					quotaInstance.SetLabel("unit", "Kbyte")
diff --git a/cmd/tools/grafana/units.yaml b/cmd/tools/grafana/units.yaml
new file mode 100644
index 00000000..11897edc
--- /dev/null
+++ b/cmd/tools/grafana/units.yaml
@@ -0,0 +1,143 @@
+#
+# Grafana Notes
+# short  turns 12990 into 13.0 K
+# locale turns 12990 into 12,990
+# string turns 12990 into 12990
+
+- metric: aggr_space_total
+  ontapUnit: bytes
+  grafanaJson: bytes
+  grafanaDisplay: bytes(IEC)
+  comment: ""
+
+- metric: iscsi_lif_avg_write_latency
+  ontapUnit: microsec
+  grafanaJson: µs
+  grafanaDisplay: microseconds(µs)
+  comment: ""
+
+- metric: svm_nfs_throughput
+  ontapUnit: per_sec
+  grafanaJson: ops
+  grafanaDisplay: ops/sec(ops)
+  comment: ""
+
+- metric: snapmirror_lag_time
+  ontapUnit: seconds
+  grafanaJson: s
+  grafanaDisplay: seconds(s)
+  comment: ""
+
+- metric: quota_files_used
+  ontapUnit: none
+  grafanaJson: locale
+  grafanaDisplay: locale
+  comment: "Current number of files used by the quota target"
+
+- metric: quota_file_limit
+  ontapUnit: none
+  grafanaJson: locale
+  grafanaDisplay: locale
+  comment: Maximum number of files allowed for the quota target (hard files limit).  The value is "-" if the limit is unlimited.
+
+- metric: scan_noti_received_rate
+  ontapUnit: per_sec
+  grafanaJson: ops
+  grafanaDisplay: ops/sec(ops)
+  comment: Total number of scan notifications received by the dispatcher per second
+
+- metric: scan_request_dispatched_rate
+  ontapUnit: per_sec
+  grafanaJson: ops
+  grafanaDisplay: ops/sec(ops)
+  comment: Total number of scan requests sent to the Vscanner per second
+
+- metric: svm_nfs_read_throughput
+  ontapUnit: per_sec
+  grafanaJson: ops
+  grafanaDisplay: ops/sec(ops)
+  comment: ""
+
+- metric: svm_nfs_write_throughput
+  ontapUnit: per_sec
+  grafanaJson: ops
+  grafanaDisplay: ops/sec(ops)
+  comment: ""
+
+- metric: volume_avg_latency
+  ontapUnit: microsec
+  grafanaJson: µs
+  grafanaDisplay: microseconds(µs)
+  comment: ""
+
+- metric: volume_read_latency
+  ontapUnit: microsec
+  grafanaJson: µs
+  grafanaDisplay: microseconds(µs)
+  comment: ""
+
+- metric: volume_write_latency
+  ontapUnit: microsec
+  grafanaJson: µs
+  grafanaDisplay: microseconds(µs)
+  comment: ""
+
+- metric: quota_files_used
+  ontapUnit: integer
+  grafanaJson: locale
+  grafanaDisplay: locale
+  comment: ""
+
+- metric: volume_snapshots_size_used
+  ontapUnit: bytes
+  grafanaJson: bytes
+  grafanaDisplay: bytes(IEC)
+  comment: ""
+
+- metric: lun_write_ops
+  ontapUnit: per_sec
+  grafanaJson: iops
+  grafanaDisplay: iops
+  comment: ""
+
+- metric: lun_read_data
+  ontapUnit: b_per_sec
+  grafanaJson: binBps
+  grafanaDisplay: bytes/sec(IEC)
+  comment: ""
+
+- metric: lun_write_data
+  ontapUnit: b_per_sec
+  grafanaJson: binBps
+  grafanaDisplay: bytes/sec(IEC)
+  comment: ""
+
+- metric: hostadapter_bytes_read
+  ontapUnit: per_sec
+  grafanaJson: binBps
+  grafanaDisplay: bytes/sec(IEC)
+  comment: ""
+
+- metric: hostadapter_bytes_write
+  ontapUnit: per_sec
+  grafanaJson: binBps
+  grafanaDisplay: bytes/sec(IEC)
+  comment: ""
+
+- metric: fcp_lif_read_data
+  ontapUnit: b_per_sec
+  grafanaJson: binBps
+  grafanaDisplay: bytes/sec(IEC)
+  comment: ""
+
+- metric: nvme_lif_read_data
+  ontapUnit: b_per_sec
+  grafanaJson: binBps
+  grafanaDisplay: bytes/sec(IEC)
+  comment: ""
+
+- metric: node_avg_processor_busy
+  ontapUnit: percent
+  grafanaJson: percent
+  grafanaDisplay: Percent (0-100)
+  comment: ""
diff --git a/grafana/dashboards/cmode/aggregate.json b/grafana/dashboards/cmode/aggregate.json
index ce533127..f11adc5d 100644
--- a/grafana/dashboards/cmode/aggregate.json
+++ b/grafana/dashboards/cmode/aggregate.json
@@ -280,7 +280,7 @@
               }
             ]
           },
-          "unit": "short"
+          "unit": "locale"
         },
         "overrides": []
       },
@@ -590,6 +590,10 @@
               {
                 "id": "displayName",
                 "value": "volumes"
+              },
+              {
+                "id": "unit",
+                "value": "locale"
               }
             ]
           },
@@ -602,6 +606,10 @@
               {
                 "id": "displayName",
                 "value": "disks"
+              },
+              {
+                "id": "unit",
+                "value": "short"
               }
             ]
           },
@@ -617,7 +625,7 @@
               },
               {
                 "id": "unit",
-                "value": "decbytes"
+                "value": "bytes"
               }
             ]
           },
@@ -633,7 +641,7 @@
               },
               {
                 "id": "unit",
-                "value": "decbytes"
+                "value": "bytes"
               }
             ]
           },
@@ -2369,7 +2377,8 @@
                 "value": null
               }
             ]
-          }
+          },
+          "unit": "short"
         },
         "overrides": []
       },
diff --git a/grafana/dashboards/cmode/cdot.json b/grafana/dashboards/cmode/cdot.json
index cd9d2c58..3e2045af 100644
--- a/grafana/dashboards/cmode/cdot.json
+++ b/grafana/dashboards/cmode/cdot.json
@@ -1264,7 +1264,7 @@
                   }
                 ]
               },
-              "unit": "ms"
+              "unit": "µs"
             },
             "overrides": []
           },
diff --git a/grafana/dashboards/cmode/cluster.json b/grafana/dashboards/cmode/cluster.json
index a17f7793..c992d6f1 100644
--- a/grafana/dashboards/cmode/cluster.json
+++ b/grafana/dashboards/cmode/cluster.json
@@ -1567,6 +1567,10 @@
               {
                 "id": "displayName",
                 "value": "suppressed alerts"
+              },
+              {
+                "id": "unit",
+                "value": "locale"
               }
             ]
           },
@@ -1579,6 +1583,10 @@
               {
                 "id": "displayName",
                 "value": "outstanding alerts"
+              },
+              {
+                "id": "unit",
+                "value": "locale"
               }
             ]
           },
@@ -2266,6 +2274,10 @@
                   {
                     "id": "custom.align",
                     "value": "right"
+                  },
+                  {
+                    "id": "unit",
+                    "value": "celsius"
                   }
                 ]
               },
@@ -2310,6 +2322,10 @@
                   {
                     "id": "custom.align",
                     "value": "right"
+                  },
+                  {
+                    "id": "unit",
+                    "value": "celsius"
                   }
                 ]
               },
@@ -2354,6 +2370,10 @@
                   {
                     "id": "custom.align",
                     "value": "right"
+                  },
+                  {
+                    "id": "unit",
+                    "value": "celsius"
                   }
                 ]
               },
@@ -2398,6 +2418,10 @@
                   {
                     "id": "custom.align",
                     "value": "right"
+                  },
+                  {
+                    "id": "unit",
+                    "value": "rotrpm"
                   }
                 ]
               },
@@ -2442,6 +2466,10 @@
                   {
                     "id": "custom.align",
                     "value": "right"
+                  },
+                  {
+                    "id": "unit",
+                    "value": "rotrpm"
                   }
                 ]
               },
@@ -2486,6 +2514,10 @@
                   {
                     "id": "custom.align",
                     "value": "right"
+                  },
+                  {
+                    "id": "unit",
+                    "value": "rotrpm"
                   }
                 ]
               },
@@ -2546,6 +2578,10 @@
                   {
                     "id": "custom.align",
                     "value": "right"
+                  },
+                  {
+                    "id": "unit",
+                    "value": "celsius"
                   }
                 ]
               },
@@ -2590,6 +2626,10 @@
                   {
                     "id": "custom.align",
                     "value": "right"
+                  },
+                  {
+                    "id": "unit",
+                    "value": "celsius"
                   }
                 ]
               }
diff --git a/grafana/dashboards/cmode/compliance.json b/grafana/dashboards/cmode/compliance.json
index ce9058db..f4dcf38b 100644
--- a/grafana/dashboards/cmode/compliance.json
+++ b/grafana/dashboards/cmode/compliance.json
@@ -961,6 +961,10 @@
               {
                 "id": "custom.filterable",
                 "value": true
+              },
+              {
+                "id": "unit",
+                "value": "short"
               }
             ]
           },
@@ -1002,6 +1006,10 @@
               {
                 "id": "custom.filterable",
                 "value": true
+              },
+              {
+                "id": "unit",
+                "value": "short"
               }
             ]
           },
@@ -1043,6 +1051,10 @@
               {
                 "id": "custom.filterable",
                 "value": true
+              },
+              {
+                "id": "unit",
+                "value": "short"
               }
             ]
           },
@@ -1084,6 +1096,10 @@
               {
                 "id": "custom.filterable",
                 "value": true
+              },
+              {
+                "id": "unit",
+                "value": "short"
               }
             ]
           },
@@ -1125,6 +1141,10 @@
               {
                 "id": "custom.width",
                 "value": 185
+              },
+              {
+                "id": "unit",
+                "value": "short"
               }
             ]
           },
@@ -1176,6 +1196,10 @@
               {
                 "id": "custom.width",
                 "value": 135
+              },
+              {
+                "id": "unit",
+                "value": "short"
               }
             ]
           },
@@ -2115,6 +2139,10 @@
               {
                 "id": "custom.filterable",
                 "value": true
+              },
+              {
+                "id": "unit",
+                "value": "locale"
               }
             ]
           },
@@ -2235,6 +2263,10 @@
               {
                 "id": "custom.filterable",
                 "value": true
+              },
+              {
+                "id": "unit",
+                "value": "locale"
               }
             ]
           },
diff --git a/grafana/dashboards/cmode/data_protection_snapshot.json b/grafana/dashboards/cmode/data_protection_snapshot.json
index d36380d4..aeefd7c6 100644
--- a/grafana/dashboards/cmode/data_protection_snapshot.json
+++ b/grafana/dashboards/cmode/data_protection_snapshot.json
@@ -786,7 +786,7 @@
               },
               {
                 "id": "unit",
-                "value": "decbytes"
+                "value": "bytes"
               },
               {
                 "id": "custom.width",
@@ -806,7 +806,7 @@
               },
               {
                 "id": "unit",
-                "value": "decbytes"
+                "value": "bytes"
               },
               {
                 "id": "custom.width",
diff --git a/grafana/dashboards/cmode/disk.json b/grafana/dashboards/cmode/disk.json
index e1e0f610..6ba2f222 100644
--- a/grafana/dashboards/cmode/disk.json
+++ b/grafana/dashboards/cmode/disk.json
@@ -268,7 +268,7 @@
               }
             ]
           },
-          "unit": "none"
+          "unit": "locale"
         },
         "overrides": []
       },
@@ -340,7 +340,7 @@
               }
             ]
           },
-          "unit": "none"
+          "unit": "locale"
         },
         "overrides": []
       },
@@ -412,7 +412,7 @@
               }
             ]
           },
-          "unit": "none"
+          "unit": "locale"
         },
         "overrides": []
       },
@@ -825,6 +825,10 @@
               {
                 "id": "decimals",
                 "value": 3
+              },
+              {
+                "id": "unit",
+                "value": "percent"
               }
             ]
           },
@@ -1183,7 +1187,7 @@
               }
             ]
           },
-          "unit": "none"
+          "unit": "short"
         },
         "overrides": []
       },
@@ -1954,7 +1958,7 @@
                   },
                   {
                     "id": "unit",
-                    "value": "none"
+                    "value": "locale"
                   }
                 ]
               },
diff --git a/grafana/dashboards/cmode/lun.json b/grafana/dashboards/cmode/lun.json
index f277d5f7..24e45e3b 100644
--- a/grafana/dashboards/cmode/lun.json
+++ b/grafana/dashboards/cmode/lun.json
@@ -246,7 +246,7 @@
               }
             ]
           },
-          "unit": "Bps"
+          "unit": "binBps"
         },
         "overrides": []
       },
@@ -302,7 +302,7 @@
               }
             ]
           },
-          "unit": "Bps"
+          "unit": "binBps"
         },
         "overrides": []
       },
@@ -601,7 +601,7 @@
               }
             ]
           },
-          "unit": "Bps"
+          "unit": "binBps"
         },
         "overrides": []
       },
@@ -897,7 +897,7 @@
               }
             ]
           },
-          "unit": "Bps"
+          "unit": "binBps"
         },
         "overrides": []
       },
@@ -1466,7 +1466,7 @@
                   }
                 ]
               },
-              "unit": "Bps"
+              "unit": "binBps"
             },
             "overrides": []
           },
@@ -1740,7 +1740,7 @@
                   }
                 ]
               },
-              "unit": "Bps"
+              "unit": "binBps"
             },
             "overrides": []
           },
@@ -3930,7 +3930,7 @@
                   }
                 ]
               },
-              "unit": "Bps"
+              "unit": "binBps"
             },
             "overrides": []
           },
@@ -4118,7 +4118,7 @@
                   }
                 ]
               },
-              "unit": "Bps"
+              "unit": "binBps"
             },
             "overrides": [
               {
diff --git a/grafana/dashboards/cmode/mcc_cluster.json b/grafana/dashboards/cmode/mcc_cluster.json
index 10759f99..4cb176a6 100644
--- a/grafana/dashboards/cmode/mcc_cluster.json
+++ b/grafana/dashboards/cmode/mcc_cluster.json
@@ -454,7 +454,7 @@
               }
             ]
           },
-          "unit": "none"
+          "unit": "percent"
         },
         "overrides": []
       },
@@ -532,7 +532,7 @@
               }
             ]
           },
-          "unit": "none"
+          "unit": "percent"
         },
         "overrides": []
       },
@@ -1797,7 +1797,7 @@
                   }
                 ]
               },
-              "unit": "Bps"
+              "unit": "binBps"
             },
             "overrides": []
           },
@@ -1890,7 +1890,7 @@
                   }
                 ]
               },
-              "unit": "Bps"
+              "unit": "binBps"
             },
             "overrides": []
           },
diff --git a/grafana/dashboards/cmode/metadata.json b/grafana/dashboards/cmode/metadata.json
index a076eb8f..9b7afda6 100644
--- a/grafana/dashboards/cmode/metadata.json
+++ b/grafana/dashboards/cmode/metadata.json
@@ -205,7 +205,7 @@
               }
             ]
           },
-          "unit": "none"
+          "unit": "locale"
         },
         "overrides": []
       },
@@ -3500,7 +3500,7 @@
               }
             ]
           },
-          "unit": "none"
+          "unit": "locale"
         },
         "overrides": []
       },
@@ -4003,7 +4003,7 @@
               }
             ]
           },
-          "unit": "none"
+          "unit": "locale"
         },
         "overrides": []
       },
diff --git a/grafana/dashboards/cmode/network_detail.json b/grafana/dashboards/cmode/network.json
similarity index 99%
rename from grafana/dashboards/cmode/network_detail.json
rename to grafana/dashboards/cmode/network.json
index cbc5dc03..cf3f3b54 100644
--- a/grafana/dashboards/cmode/network_detail.json
+++ b/grafana/dashboards/cmode/network.json
@@ -1264,7 +1264,7 @@
                   }
                 ]
               },
-              "unit": "none"
+              "unit": "locale"
             },
             "overrides": []
           },
@@ -1361,7 +1361,7 @@
                   }
                 ]
               },
-              "unit": "none"
+              "unit": "locale"
             },
             "overrides": []
           },
diff --git a/grafana/dashboards/cmode/nfs4storePool_detail.json b/grafana/dashboards/cmode/nfs4storePool.json
similarity index 100%
rename from grafana/dashboards/cmode/nfs4storePool_detail.json
rename to grafana/dashboards/cmode/nfs4storePool.json
diff --git a/grafana/dashboards/cmode/nfs_clients.json b/grafana/dashboards/cmode/nfs_clients.json
index 01933963..f6b08529 100644
--- a/grafana/dashboards/cmode/nfs_clients.json
+++ b/grafana/dashboards/cmode/nfs_clients.json
@@ -99,7 +99,7 @@
       },
       "id": 29,
       "options": {
-        "content": "You must enable the Rest collector in your harvest.yml config and uncomment the nfs_clients.yaml section in your $HARVEST/conf/rest/default.yaml file. Please see https://github.com/NetApp/harvest/wiki/FAQ/_edit#nfs-clients-dashboard for more details",
+        "content": "You must enable the Rest collector in your harvest.yml config and uncomment the nfs_clients.yaml section in your $HARVEST/conf/rest/default.yaml file. Please see https://github.com/NetApp/harvest/wiki/FAQ#nfs-clients-dashboard for more details",
         "mode": "markdown"
       },
       "pluginVersion": "8.1.8",
@@ -124,7 +124,7 @@
               }
             ]
           },
-          "unit": "none"
+          "unit": "locale"
         },
         "overrides": []
       },
@@ -182,7 +182,8 @@
             }
           },
           "decimals": 0,
-          "mappings": []
+          "mappings": [],
+          "unit": "locale"
         },
         "overrides": [
           {
diff --git a/grafana/dashboards/cmode/node_details.json b/grafana/dashboards/cmode/node.json
similarity index 99%
rename from grafana/dashboards/cmode/node_details.json
rename to grafana/dashboards/cmode/node.json
index cf84b0cf..c32f520c 100644
--- a/grafana/dashboards/cmode/node_details.json
+++ b/grafana/dashboards/cmode/node.json
@@ -265,7 +265,7 @@
               }
             ]
           },
-          "unit": "ms"
+          "unit": "µs"
         },
         "overrides": []
       },
@@ -903,7 +903,7 @@
               }
             ]
           },
-          "unit": "none"
+          "unit": "string"
         },
         "overrides": []
       },
@@ -985,7 +985,7 @@
               }
             ]
           },
-          "unit": "none"
+          "unit": "string"
         },
         "overrides": []
       },
@@ -3635,7 +3635,7 @@
                   }
                 ]
               },
-              "unit": "Bps"
+              "unit": "binBps"
             },
             "overrides": []
           },
@@ -4043,7 +4043,7 @@
                   }
                 ]
               },
-              "unit": "Bps"
+              "unit": "binBps"
             },
             "overrides": []
           },
diff --git a/grafana/dashboards/cmode/power.json b/grafana/dashboards/cmode/power.json
index 4b0a711b..2c810109 100644
--- a/grafana/dashboards/cmode/power.json
+++ b/grafana/dashboards/cmode/power.json
@@ -511,7 +511,7 @@
               }
             ]
           },
-          "unit": "kwatt"
+          "unit": "watt"
         },
         "overrides": [
           {
@@ -1048,6 +1048,10 @@
               {
                 "id": "custom.align",
                 "value": "right"
+              },
+              {
+                "id": "unit",
+                "value": "celsius"
               }
             ]
           },
@@ -1092,6 +1096,10 @@
               {
                 "id": "custom.align",
                 "value": "right"
+              },
+              {
+                "id": "unit",
+                "value": "celsius"
               }
             ]
           },
@@ -1136,6 +1144,10 @@
               {
                 "id": "custom.align",
                 "value": "right"
+              },
+              {
+                "id": "unit",
+                "value": "celsius"
               }
             ]
           },
@@ -1180,6 +1192,10 @@
               {
                 "id": "custom.align",
                 "value": "right"
+              },
+              {
+                "id": "unit",
+                "value": "rotrpm"
               }
             ]
           },
@@ -1224,6 +1240,10 @@
               {
                 "id": "custom.align",
                 "value": "right"
+              },
+              {
+                "id": "unit",
+                "value": "rotrpm"
               }
             ]
           },
@@ -1268,6 +1288,10 @@
               {
                 "id": "custom.align",
                 "value": "right"
+              },
+              {
+                "id": "unit",
+                "value": "rotrpm"
               }
             ]
           },
@@ -1328,6 +1352,10 @@
               {
                 "id": "custom.align",
                 "value": "right"
+              },
+              {
+                "id": "unit",
+                "value": "celsius"
               }
             ]
           },
@@ -1372,6 +1400,10 @@
               {
                 "id": "custom.align",
                 "value": "right"
+              },
+              {
+                "id": "unit",
+                "value": "celsius"
               }
             ]
           }
@@ -1616,6 +1648,10 @@
               {
                 "id": "custom.displayMode",
                 "value": "color-text"
+              },
+              {
+                "id": "unit",
+                "value": "locale"
               }
             ]
           },
@@ -1727,6 +1763,10 @@
               {
                 "id": "custom.align",
                 "value": "right"
+              },
+              {
+                "id": "unit",
+                "value": "celsius"
               }
             ]
           },
@@ -1771,6 +1811,10 @@
               {
                 "id": "custom.align",
                 "value": "right"
+              },
+              {
+                "id": "unit",
+                "value": "celsius"
               }
             ]
           },
@@ -1815,6 +1859,10 @@
               {
                 "id": "custom.align",
                 "value": "right"
+              },
+              {
+                "id": "unit",
+                "value": "celsius"
               }
             ]
           },
@@ -1859,6 +1907,10 @@
               {
                 "id": "custom.align",
                 "value": "right"
+              },
+              {
+                "id": "unit",
+                "value": "rotrpm"
               }
             ]
           },
@@ -1903,6 +1955,10 @@
               {
                 "id": "custom.align",
                 "value": "right"
+              },
+              {
+                "id": "unit",
+                "value": "rotrpm"
               }
             ]
           },
@@ -1947,6 +2003,10 @@
               {
                 "id": "custom.align",
                 "value": "right"
+              },
+              {
+                "id": "unit",
+                "value": "rotrpm"
               }
             ]
           },
@@ -2007,6 +2067,10 @@
               {
                 "id": "custom.align",
                 "value": "right"
+              },
+              {
+                "id": "unit",
+                "value": "celsius"
               }
             ]
           },
@@ -2051,6 +2115,10 @@
               {
                 "id": "custom.align",
                 "value": "right"
+              },
+              {
+                "id": "unit",
+                "value": "celsius"
               }
             ]
           }
diff --git a/grafana/dashboards/cmode/qtree.json b/grafana/dashboards/cmode/qtree.json
index d655fcb0..7f71a14e 100644
--- a/grafana/dashboards/cmode/qtree.json
+++ b/grafana/dashboards/cmode/qtree.json
@@ -590,7 +590,7 @@
                   }
                 ]
               },
-              "unit": "kbytes"
+              "unit": "locale"
             },
             "overrides": []
           },
diff --git a/grafana/dashboards/cmode/quotaReport.json b/grafana/dashboards/cmode/quotaReport.json
index 26baaa47..2ecc2355 100644
--- a/grafana/dashboards/cmode/quotaReport.json
+++ b/grafana/dashboards/cmode/quotaReport.json
@@ -104,7 +104,7 @@
             "properties": [
               {
                 "id": "unit",
-                "value": "deckbytes"
+                "value": "kbytes"
               }
             ]
           },
@@ -347,6 +347,10 @@
                     "type": "value"
                   }
                 ]
+              },
+              {
+                "id": "unit",
+                "value": "locale"
               }
             ]
           },
@@ -369,6 +373,10 @@
                     "type": "value"
                   }
                 ]
+              },
+              {
+                "id": "unit",
+                "value": "locale"
               }
             ]
           },
@@ -394,6 +402,18 @@
                 ]
               }
             ]
+          },
+          {
+            "matcher": {
+              "id": "byName",
+              "options": "Files Used"
+            },
+            "properties": [
+              {
+                "id": "unit",
+                "value": "locale"
+              }
+            ]
           }
         ]
       },
diff --git a/grafana/dashboards/cmode/security.json b/grafana/dashboards/cmode/security.json
index e62a4c22..b39e6aed 100644
--- a/grafana/dashboards/cmode/security.json
+++ b/grafana/dashboards/cmode/security.json
@@ -116,7 +116,7 @@
               }
             ]
           },
-          "unit": "none"
+          "unit": "short"
         },
         "overrides": []
       },
diff --git a/grafana/dashboards/cmode/shelf.json b/grafana/dashboards/cmode/shelf.json
index b0a94a6d..54bd4618 100644
--- a/grafana/dashboards/cmode/shelf.json
+++ b/grafana/dashboards/cmode/shelf.json
@@ -587,7 +587,7 @@
               }
             ]
           },
-          "unit": "short"
+          "unit": "locale"
         },
         "overrides": []
       },
@@ -675,6 +675,10 @@
               {
                 "id": "custom.displayMode",
                 "value": "color-text"
+              },
+              {
+                "id": "unit",
+                "value": "locale"
               }
             ]
           },
@@ -786,6 +790,10 @@
               {
                 "id": "custom.align",
                 "value": "right"
+              },
+              {
+                "id": "unit",
+                "value": "celsius"
               }
             ]
           },
@@ -830,6 +838,10 @@
               {
                 "id": "custom.align",
                 "value": "right"
+              },
+              {
+                "id": "unit",
+                "value": "celsius"
               }
             ]
           },
@@ -874,6 +886,10 @@
               {
                 "id": "custom.align",
                 "value": "right"
+              },
+              {
+                "id": "unit",
+                "value": "celsius"
               }
             ]
           },
@@ -918,6 +934,10 @@
               {
                 "id": "custom.align",
                 "value": "right"
+              },
+              {
+                "id": "unit",
+                "value": "rotrpm"
               }
             ]
           },
@@ -962,6 +982,10 @@
               {
                 "id": "custom.align",
                 "value": "right"
+              },
+              {
+                "id": "unit",
+                "value": "rotrpm"
               }
             ]
           },
@@ -1006,6 +1030,10 @@
               {
                 "id": "custom.align",
                 "value": "right"
+              },
+              {
+                "id": "unit",
+                "value": "rotrpm"
               }
             ]
           },
@@ -1066,6 +1094,10 @@
               {
                 "id": "custom.align",
                 "value": "right"
+              },
+              {
+                "id": "unit",
+                "value": "celsius"
               }
             ]
           },
@@ -1110,6 +1142,10 @@
               {
                 "id": "custom.align",
                 "value": "right"
+              },
+              {
+                "id": "unit",
+                "value": "celsius"
               }
             ]
           }
@@ -1631,7 +1667,7 @@
               }
             ]
           },
-          "unit": "RPM"
+          "unit": "rotrpm"
         },
         "overrides": []
       },
@@ -1925,7 +1961,8 @@
                 "value": 6000
               }
             ]
-          }
+          },
+          "unit": "locale"
         },
         "overrides": []
       },
diff --git a/grafana/dashboards/cmode/snapmirror.json b/grafana/dashboards/cmode/snapmirror.json
index 99dfbb50..13c98c90 100644
--- a/grafana/dashboards/cmode/snapmirror.json
+++ b/grafana/dashboards/cmode/snapmirror.json
@@ -3163,6 +3163,10 @@
               {
                 "id": "custom.width",
                 "value": 180
+              },
+              {
+                "id": "unit",
+                "value": "s"
               }
             ]
           }
diff --git a/grafana/dashboards/cmode/svm_details.json b/grafana/dashboards/cmode/svm.json
similarity index 98%
rename from grafana/dashboards/cmode/svm_details.json
rename to grafana/dashboards/cmode/svm.json
index 8a8e97d3..a9437e39 100644
--- a/grafana/dashboards/cmode/svm_details.json
+++ b/grafana/dashboards/cmode/svm.json
@@ -212,7 +212,7 @@
           "refId": "A"
         }
       ],
-      "title": "SVM Throughput (Data)",
+      "title": "SVM Throughput",
       "type": "stat"
     },
     {
@@ -270,7 +270,7 @@
           "refId": "A"
         }
       ],
-      "title": "SVM Throughput (IOPs)",
+      "title": "SVM IOPs",
       "type": "stat"
     },
     {
@@ -460,7 +460,7 @@
           "refId": "A"
         }
       ],
-      "title": "SVM Read Throughput (Data)",
+      "title": "SVM Read Throughput",
       "type": "stat"
     },
     {
@@ -518,7 +518,7 @@
           "refId": "A"
         }
       ],
-      "title": "SVM Write Throughput (Data)",
+      "title": "SVM Write Throughput",
       "type": "stat"
     },
     {
@@ -576,7 +576,7 @@
           "refId": "A"
         }
       ],
-      "title": "SVM Read Throughput (IOPs)",
+      "title": "SVM Read IOPs",
       "type": "stat"
     },
     {
@@ -634,7 +634,7 @@
           "refId": "A"
         }
       ],
-      "title": "SVM Write Throughput (IOPs)",
+      "title": "SVM Write IOPs",
       "type": "stat"
     },
     {
@@ -830,7 +830,7 @@
       ],
       "timeFrom": null,
       "timeShift": null,
-      "title": "SVM Throughput (Data)",
+      "title": "SVM Throughput",
       "type": "timeseries"
     },
     {
@@ -932,7 +932,7 @@
       ],
       "timeFrom": null,
       "timeShift": null,
-      "title": "SVM Throughput (IOPs)",
+      "title": "SVM IOPs",
       "type": "timeseries"
     },
     {
@@ -1122,7 +1122,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Read Throughput (Data)",
+          "title": "Volume Read Throughput",
           "type": "timeseries"
         },
         {
@@ -1211,7 +1211,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Read Throughput (IOPs)",
+          "title": "Volume Read IOPs",
           "type": "timeseries"
         },
         {
@@ -1389,7 +1389,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Write Throughput (Data)",
+          "title": "Volume Write Throughput",
           "type": "timeseries"
         },
         {
@@ -1478,7 +1478,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Write Throughput (IOPs)",
+          "title": "Volume Write IOPs",
           "type": "timeseries"
         }
       ],
@@ -1586,7 +1586,7 @@
       ],
       "timeFrom": null,
       "timeShift": null,
-      "title": "NAS LIF Send Throughput (Data)",
+      "title": "NAS LIF Send Throughput",
       "type": "timeseries"
     },
     {
@@ -1676,7 +1676,7 @@
       ],
       "timeFrom": null,
       "timeShift": null,
-      "title": "NAS LIF Receive Throughput (Data)",
+      "title": "NAS LIF Receive Throughput",
       "type": "timeseries"
     },
     {
@@ -1729,7 +1729,7 @@
               }
             ]
           },
-          "unit": "Bps"
+          "unit": "binBps"
         },
         "overrides": []
       },
@@ -1766,7 +1766,7 @@
       ],
       "timeFrom": null,
       "timeShift": null,
-      "title": "NVMe/FC LIF Send Throughput (Data)",
+      "title": "NVMe/FC LIF Send Throughput",
       "type": "timeseries"
     },
     {
@@ -1819,7 +1819,7 @@
               }
             ]
           },
-          "unit": "Bps"
+          "unit": "binBps"
         },
         "overrides": []
       },
@@ -1856,7 +1856,7 @@
       ],
       "timeFrom": null,
       "timeShift": null,
-      "title": "NVMe/FC LIF Receive Throughput (Data)",
+      "title": "NVMe/FC LIF Receive Throughput",
       "type": "timeseries"
     },
     {
@@ -1946,7 +1946,7 @@
       ],
       "timeFrom": null,
       "timeShift": null,
-      "title": "iSCSI LIF Send Throughput (Data)",
+      "title": "iSCSI LIF Send Throughput",
       "type": "timeseries"
     },
     {
@@ -2036,7 +2036,7 @@
       ],
       "timeFrom": null,
       "timeShift": null,
-      "title": "iSCSI LIF Receive Throughput (Data)",
+      "title": "iSCSI LIF Receive Throughput",
       "type": "timeseries"
     },
     {
@@ -2171,7 +2171,7 @@
               "refId": "A"
             }
           ],
-          "title": "SVM CIFS Throughput (IOPs)",
+          "title": "SVM CIFS IOPs",
           "type": "stat"
         },
         {
@@ -2226,7 +2226,7 @@
                   }
                 ]
               },
-              "unit": "none"
+              "unit": "locale"
             },
             "overrides": []
           },
@@ -2461,7 +2461,7 @@
               "refId": "A"
             }
           ],
-          "title": "SVM CIFS Read Throughput (IOPs)",
+          "title": "SVM CIFS Read IOPs",
           "type": "stat"
         },
         {
@@ -2519,7 +2519,7 @@
               "refId": "A"
             }
           ],
-          "title": "SVM CIFS Write Throughput (IOPs)",
+          "title": "SVM CIFS Write IOPs",
           "type": "stat"
         },
         {
@@ -2725,7 +2725,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "SVM CIFS Throughput (IOPs)",
+          "title": "SVM CIFS IOPs",
           "type": "timeseries"
         },
         {
@@ -2959,7 +2959,8 @@
                     "value": 80
                   }
                 ]
-              }
+              },
+              "unit": "ops"
             },
             "overrides": []
           },
@@ -3051,7 +3052,8 @@
                     "value": 80
                   }
                 ]
-              }
+              },
+              "unit": "locale"
             },
             "overrides": []
           },
@@ -3184,7 +3186,7 @@
                   }
                 ]
               },
-              "unit": "Bps"
+              "unit": "binBps"
             },
             "overrides": []
           },
@@ -3220,7 +3222,7 @@
               "refId": "A"
             }
           ],
-          "title": "SVM FCP Throughput (Data)",
+          "title": "SVM FCP Throughput",
           "type": "stat"
         },
         {
@@ -3278,7 +3280,7 @@
               "refId": "A"
             }
           ],
-          "title": "SVM FCP Throughput (IOPs)",
+          "title": "SVM FCP IOPs",
           "type": "stat"
         },
         {
@@ -3432,7 +3434,7 @@
                   }
                 ]
               },
-              "unit": "Bps"
+              "unit": "binBps"
             },
             "overrides": []
           },
@@ -3468,7 +3470,7 @@
               "refId": "A"
             }
           ],
-          "title": "SVM FCP Read Throughput (Data)",
+          "title": "SVM FCP Read Throughput",
           "type": "stat"
         },
         {
@@ -3490,7 +3492,7 @@
                   }
                 ]
               },
-              "unit": "Bps"
+              "unit": "binBps"
             },
             "overrides": []
           },
@@ -3526,7 +3528,7 @@
               "refId": "A"
             }
           ],
-          "title": "SVM FCP Write Throughput (Data)",
+          "title": "SVM FCP Write Throughput",
           "type": "stat"
         },
         {
@@ -3584,7 +3586,7 @@
               "refId": "A"
             }
           ],
-          "title": "SVM FCP Read Throughput (IOPs)",
+          "title": "SVM FCP Read IOPs",
           "type": "stat"
         },
         {
@@ -3642,7 +3644,7 @@
               "refId": "A"
             }
           ],
-          "title": "SVM FCP Write Throughput (IOPs)",
+          "title": "SVM FCP Write IOPs",
           "type": "stat"
         },
         {
@@ -3810,7 +3812,7 @@
                   }
                 ]
               },
-              "unit": "Bps"
+              "unit": "binBps"
             },
             "overrides": []
           },
@@ -3855,7 +3857,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "SVM FCP Throughput (Data)",
+          "title": "SVM FCP Throughput",
           "type": "timeseries"
         },
         {
@@ -3962,7 +3964,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "SVM FCP Throughput (IOPs)",
+          "title": "SVM FCP IOPs",
           "type": "timeseries"
         },
         {
@@ -4015,7 +4017,7 @@
                   }
                 ]
               },
-              "unit": "Bps"
+              "unit": "binBps"
             },
             "overrides": []
           },
@@ -4052,7 +4054,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "FCP LIF Send Throughput (Data)",
+          "title": "FCP LIF Send Throughput",
           "type": "timeseries"
         },
         {
@@ -4105,7 +4107,7 @@
                   }
                 ]
               },
-              "unit": "Bps"
+              "unit": "binBps"
             },
             "overrides": []
           },
@@ -4142,7 +4144,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "FCP LIF Receive Throughput (Data)",
+          "title": "FCP LIF Receive Throughput",
           "type": "timeseries"
         }
       ],
@@ -4281,7 +4283,7 @@
               "refId": "A"
             }
           ],
-          "title": "SVM iSCSI Throughput (Data)",
+          "title": "SVM iSCSI Throughput",
           "type": "stat"
         },
         {
@@ -4339,7 +4341,7 @@
               "refId": "A"
             }
           ],
-          "title": "SVM iSCSI Throughput (IOPs)",
+          "title": "SVM iSCSI IOPs",
           "type": "stat"
         },
         {
@@ -4435,7 +4437,7 @@
                   }
                 ]
               },
-              "unit": "ms"
+              "unit": "µs"
             },
             "overrides": []
           },
@@ -4529,7 +4531,7 @@
               "refId": "A"
             }
           ],
-          "title": "SVM iSCSI Read Throughput (Data)",
+          "title": "SVM iSCSI Read Throughput",
           "type": "stat"
         },
         {
@@ -4587,7 +4589,7 @@
               "refId": "A"
             }
           ],
-          "title": "SVM iSCSI Write Throughput (Data)",
+          "title": "SVM iSCSI Write Throughput",
           "type": "stat"
         },
         {
@@ -4645,7 +4647,7 @@
               "refId": "A"
             }
           ],
-          "title": "SVM iSCSI Read Throughput (IOPs)",
+          "title": "SVM iSCSI Read IOPs",
           "type": "stat"
         },
         {
@@ -4703,7 +4705,7 @@
               "refId": "A"
             }
           ],
-          "title": "SVM iSCSI Write Throughput (IOPs)",
+          "title": "SVM iSCSI Write IOPs",
           "type": "stat"
         },
         {
@@ -4793,7 +4795,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "iSCSI LIF Send Throughput (Data)",
+          "title": "iSCSI LIF Send Throughput",
           "type": "timeseries"
         },
         {
@@ -4883,7 +4885,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "iSCSI LIF Receive Throughput (Data)",
+          "title": "iSCSI LIF Receive Throughput",
           "type": "timeseries"
         },
         {
@@ -5089,7 +5091,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "SVM iSCSI Throughput (Data)",
+          "title": "SVM iSCSI Throughput",
           "type": "timeseries"
         }
       ],
@@ -5207,7 +5209,7 @@
                   }
                 ]
               },
-              "unit": "Bps"
+              "unit": "ops"
             },
             "overrides": []
           },
@@ -5247,7 +5249,7 @@
               "refId": "A"
             }
           ],
-          "title": "NFSv3 Throughput (Data)",
+          "title": "NFSv3 Throughput",
           "transformations": [
             {
               "id": "reduce",
@@ -5346,7 +5348,7 @@
               "refId": "Total Ops"
             }
           ],
-          "title": "NFSv3 Throughput (IOPs)",
+          "title": "NFSv3 IOPs",
           "transformations": [
             {
               "id": "reduce",
@@ -5535,7 +5537,7 @@
                   }
                 ]
               },
-              "unit": "Bps"
+              "unit": "ops"
             },
             "overrides": []
           },
@@ -5575,7 +5577,7 @@
               "refId": "A"
             }
           ],
-          "title": "NFSv3  Read Throughput (Data)",
+          "title": "NFSv3 Read Throughput",
           "transformations": [
             {
               "id": "reduce",
@@ -5634,7 +5636,7 @@
                   }
                 ]
               },
-              "unit": "Bps"
+              "unit": "ops"
             },
             "overrides": []
           },
@@ -5674,7 +5676,7 @@
               "refId": "A"
             }
           ],
-          "title": "NFSv3  Write Throughput (Data)",
+          "title": "NFSv3 Write Throughput",
           "transformations": [
             {
               "id": "reduce",
@@ -5773,7 +5775,7 @@
               "refId": "Total Ops"
             }
           ],
-          "title": "NFSv3 Read Throughput (IOPs)",
+          "title": "NFSv3 Read IOPs",
           "transformations": [
             {
               "id": "reduce",
@@ -5872,7 +5874,7 @@
               "refId": "Total Ops"
             }
           ],
-          "title": "NFSv3 Write Throughput (IOPs)",
+          "title": "NFSv3 Write IOPs",
           "transformations": [
             {
               "id": "reduce",
@@ -6029,7 +6031,7 @@
                   }
                 ]
               },
-              "unit": "Bps"
+              "unit": "ops"
             },
             "overrides": []
           },
@@ -6476,7 +6478,7 @@
                   }
                 ]
               },
-              "unit": "KBs"
+              "unit": "ops"
             },
             "overrides": []
           },
@@ -6516,7 +6518,7 @@
               "refId": "A"
             }
           ],
-          "title": "NFSv4 Throughput (Data)",
+          "title": "NFSv4 Throughput",
           "transformations": [
             {
               "id": "reduce",
@@ -6615,7 +6617,7 @@
               "refId": "Total Ops"
             }
           ],
-          "title": "NFSv4 Throughput (IOPs)",
+          "title": "NFSv4 IOPs",
           "transformations": [
             {
               "id": "reduce",
@@ -6804,7 +6806,7 @@
                   }
                 ]
               },
-              "unit": "Bps"
+              "unit": "ops"
             },
             "overrides": []
           },
@@ -6844,7 +6846,7 @@
               "refId": "A"
             }
           ],
-          "title": "NFSv4 Read Throughput (Data)",
+          "title": "NFSv4 Read Throughput",
           "transformations": [
             {
               "id": "reduce",
@@ -6903,7 +6905,7 @@
                   }
                 ]
               },
-              "unit": "Bps"
+              "unit": "ops"
             },
             "overrides": []
           },
@@ -6943,7 +6945,7 @@
               "refId": "A"
             }
           ],
-          "title": "NFSv4 Write Throughput (Data)",
+          "title": "NFSv4 Write Throughput",
           "transformations": [
             {
               "id": "reduce",
@@ -7042,7 +7044,7 @@
               "refId": "Total Ops"
             }
           ],
-          "title": "NFSv4 Read Throughput (IOPs)",
+          "title": "NFSv4 Read IOPs",
           "transformations": [
             {
               "id": "reduce",
@@ -7141,7 +7143,7 @@
               "refId": "Total Ops"
             }
           ],
-          "title": "NFSv4 Write Throughput (IOPs)",
+          "title": "NFSv4 Write IOPs",
           "transformations": [
             {
               "id": "reduce",
@@ -7310,7 +7312,7 @@
                   }
                 ]
               },
-              "unit": "Bps"
+              "unit": "ops"
             },
             "overrides": []
           },
@@ -7352,7 +7354,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "NFSv4 Throughput (Data)",
+          "title": "NFSv4 Throughput",
           "type": "timeseries"
         },
         {
@@ -7764,7 +7766,7 @@
                   }
                 ]
               },
-              "unit": "Bps"
+              "unit": "ops"
             },
             "overrides": []
           },
@@ -7804,7 +7806,7 @@
               "refId": "A"
             }
           ],
-          "title": "NFSv4 .1 Throughput (Data)",
+          "title": "NFSv4.1 Throughput",
           "transformations": [
             {
               "id": "reduce",
@@ -7903,7 +7905,7 @@
               "refId": "Total Ops"
             }
           ],
-          "title": "NFSv4.1 Throughput (IOPs)",
+          "title": "NFSv4.1 IOPs",
           "transformations": [
             {
               "id": "reduce",
@@ -8092,7 +8094,7 @@
                   }
                 ]
               },
-              "unit": "Bps"
+              "unit": "ops"
             },
             "overrides": []
           },
@@ -8132,7 +8134,7 @@
               "refId": "A"
             }
           ],
-          "title": "NFSv4 .1 Read Throughput (Data)",
+          "title": " NFSv4.1 Read Throughput",
           "transformations": [
             {
               "id": "reduce",
@@ -8191,7 +8193,7 @@
                   }
                 ]
               },
-              "unit": "Bps"
+              "unit": "ops"
             },
             "overrides": []
           },
@@ -8231,7 +8233,7 @@
               "refId": "A"
             }
           ],
-          "title": "NFSv4 .1 Write Throughput (Data)",
+          "title": " NFSv4.1 Write Throughput",
           "transformations": [
             {
               "id": "reduce",
@@ -8330,7 +8332,7 @@
               "refId": "Total Ops"
             }
           ],
-          "title": "NFSv4.1 Read Throughput (IOPs)",
+          "title": "NFSv4.1 Read IOPs",
           "transformations": [
             {
               "id": "reduce",
@@ -8429,7 +8431,7 @@
               "refId": "Total Ops"
             }
           ],
-          "title": "NFSv4.1 Write Throughput (IOPs)",
+          "title": "NFSv4.1 Write IOPs",
           "transformations": [
             {
               "id": "reduce",
@@ -8598,7 +8600,7 @@
                   }
                 ]
               },
-              "unit": "Bps"
+              "unit": "ops"
             },
             "overrides": []
           },
@@ -8640,7 +8642,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "NFSv4.1 Throughput (Data)",
+          "title": "NFSv4.1 Throughput)",
           "type": "timeseries"
         },
         {
@@ -9045,7 +9047,7 @@
                   }
                 ]
               },
-              "unit": "Bps"
+              "unit": "binBps"
             },
             "overrides": []
           },
@@ -9081,7 +9083,7 @@
               "refId": "A"
             }
           ],
-          "title": "SVM NVMe/FC Throughput (Data)",
+          "title": "SVM NVMe/FC Throughput",
           "type": "stat"
         },
         {
@@ -9139,7 +9141,7 @@
               "refId": "A"
             }
           ],
-          "title": "SVM NVMe/FC Throughput (IOPs)",
+          "title": "SVM NVMe/FC IOPs",
           "type": "stat"
         },
         {
@@ -9293,7 +9295,7 @@
                   }
                 ]
               },
-              "unit": "Bps"
+              "unit": "binBps"
             },
             "overrides": []
           },
@@ -9329,7 +9331,7 @@
               "refId": "A"
             }
           ],
-          "title": "SVM FCP Read Throughput (Data)",
+          "title": "SVM FCP Read Throughput",
           "type": "stat"
         },
         {
@@ -9351,7 +9353,7 @@
                   }
                 ]
               },
-              "unit": "Bps"
+              "unit": "binBps"
             },
             "overrides": []
           },
@@ -9387,7 +9389,7 @@
               "refId": "A"
             }
           ],
-          "title": "SVM FCP Write Throughput (Data)",
+          "title": "SVM FCP Write Throughput",
           "type": "stat"
         },
         {
@@ -9445,7 +9447,7 @@
               "refId": "A"
             }
           ],
-          "title": "SVM FCP Read Throughput (IOPs)",
+          "title": "SVM FCP Read IOPs",
           "type": "stat"
         },
         {
@@ -9503,7 +9505,7 @@
               "refId": "A"
             }
           ],
-          "title": "SVM FCP Write Throughput (IOPs)",
+          "title": "SVM FCP Write IOPs",
           "type": "stat"
         },
         {
@@ -9672,7 +9674,7 @@
                   }
                 ]
               },
-              "unit": "Bps"
+              "unit": "binBps"
             },
             "overrides": []
           },
@@ -9717,7 +9719,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "SVM NVMe/FC Throughput (Data)",
+          "title": "SVM NVMe/FC Throughput",
           "type": "timeseries"
         },
         {
@@ -9824,7 +9826,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "SVM NVMe/FC Throughput (IOPs)",
+          "title": "SVM NVMe/FC IOPs",
           "type": "timeseries"
         },
         {
@@ -9877,7 +9879,7 @@
                   }
                 ]
               },
-              "unit": "Bps"
+              "unit": "binBps"
             },
             "overrides": []
           },
@@ -9914,7 +9916,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "SVM NVMe/FC LIF Send Throughput (Data)",
+          "title": "SVM NVMe/FC LIF Send Throughput",
           "type": "timeseries"
         },
         {
@@ -9967,7 +9969,7 @@
                   }
                 ]
               },
-              "unit": "Bps"
+              "unit": "binBps"
             },
             "overrides": []
           },
@@ -10004,7 +10006,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "SVM NVMe/FC LIF Receive Throughput (Data)",
+          "title": "SVM NVMe/FC LIF Receive Throughput",
           "type": "timeseries"
         }
       ],
@@ -10389,7 +10391,7 @@
               "refId": "A"
             }
           ],
-          "title": "QoS Throughput (Data)",
+          "title": "QoS Throughput",
           "type": "stat"
         },
         {
@@ -10446,7 +10448,7 @@
               "refId": "A"
             }
           ],
-          "title": "QoS Throughput (IOPs)",
+          "title": "QoS IOPs",
           "type": "stat"
         },
         {
@@ -10630,7 +10632,7 @@
               "refId": "A"
             }
           ],
-          "title": "QoS Read Throughput (Data)",
+          "title": "QoS Read Throughput",
           "type": "stat"
         },
         {
@@ -10686,7 +10688,7 @@
               "refId": "A"
             }
           ],
-          "title": "QoS Write Throughput (Data)",
+          "title": "QoS Write Throughput",
           "type": "stat"
         },
         {
@@ -10743,7 +10745,7 @@
               "refId": "A"
             }
           ],
-          "title": "QoS Read Throughput (IOPs)",
+          "title": "QoS Read IOPs",
           "type": "stat"
         },
         {
@@ -10800,7 +10802,7 @@
               "refId": "A"
             }
           ],
-          "title": "QoS Write Throughput (IOPs)",
+          "title": "QoS Write IOPs",
           "type": "stat"
         },
         {
@@ -10986,7 +10988,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "QoS Throughput (Data)",
+          "title": "QoS Throughput",
           "type": "timeseries"
         },
         {
@@ -11080,7 +11082,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "QoS Throughput (IOPs)",
+          "title": "QoS IOPs",
           "type": "timeseries"
         },
         {
diff --git a/grafana/dashboards/cmode/volume_details.json b/grafana/dashboards/cmode/volume.json
similarity index 99%
rename from grafana/dashboards/cmode/volume_details.json
rename to grafana/dashboards/cmode/volume.json
index 2b4bc778..2d15208a 100644
--- a/grafana/dashboards/cmode/volume_details.json
+++ b/grafana/dashboards/cmode/volume.json
@@ -126,7 +126,7 @@
               }
             ]
           },
-          "unit": "ms"
+          "unit": "µs"
         },
         "overrides": []
       },
@@ -673,17 +673,6 @@
                   }
                 ]
               },
-              {
-                "matcher": {
-                  "id": "byName",
-                  "options": "Size"
-                },
-                "properties": [
-                  {
-                    "id": "unit"
-                  }
-                ]
-              },
               {
                 "matcher": {
                   "id": "byName",
@@ -991,7 +980,7 @@
                 "properties": [
                   {
                     "id": "unit",
-                    "value": "ms"
+                    "value": "µs"
                   }
                 ]
               }
@@ -1331,7 +1320,7 @@
                 "properties": [
                   {
                     "id": "unit",
-                    "value": "ms"
+                    "value": "µs"
                   }
                 ]
               }
@@ -4561,7 +4550,7 @@
                   }
                 ]
               },
-              "unit": "none"
+              "unit": "locale"
             },
             "overrides": []
           },
@@ -4744,7 +4733,7 @@
                   }
                 ]
               },
-              "unit": "none"
+              "unit": "locale"
             },
             "overrides": []
           },
@@ -4819,7 +4808,8 @@
                     "value": 30
                   }
                 ]
-              }
+              },
+              "unit": "locale"
             },
             "overrides": []
           },
diff --git a/integration/go.mod b/integration/go.mod
index 4ffc2e0d..782bf46c 100644
--- a/integration/go.mod
+++ b/integration/go.mod
@@ -8,9 +8,9 @@ require (
 	github.com/docker/docker v20.10.16+incompatible
 	github.com/julienroland/usg v0.0.0-20160918114137-cb52eabb3d84
 	github.com/netapp/harvest/v2 v2.0.0-20220525163428-8d88c5b0f601
-	github.com/rs/zerolog v1.27.0
-	github.com/stretchr/testify v1.7.5
-	github.com/tidwall/gjson v1.14.1
+	github.com/rs/zerolog v1.28.0
+	github.com/stretchr/testify v1.8.0
+	github.com/tidwall/gjson v1.14.3
 )
 
 require (
@@ -34,7 +34,7 @@ require (
 	github.com/pkg/errors v0.9.1 // indirect
 	github.com/pmezard/go-difflib v1.0.0 // indirect
 	github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c // indirect
-	github.com/shirou/gopsutil/v3 v3.22.6 // indirect
+	github.com/shirou/gopsutil/v3 v3.22.9 // indirect
 	github.com/sirupsen/logrus v1.8.1 // indirect
 	github.com/spf13/cobra v1.5.0 // indirect
 	github.com/spf13/pflag v1.0.5 // indirect
diff --git a/integration/go.sum b/integration/go.sum
index 48e8a3f7..bfe054d7 100644
--- a/integration/go.sum
+++ b/integration/go.sum
@@ -24,8 +24,9 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69
 github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
 github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
+github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=
 github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
 github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk=
@@ -59,12 +60,12 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
 github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
 github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c h1:NRoLoZvkBTKvR5gQLgA3e0hqjkY9u1wm+iOL45VN/qI=
 github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
-github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
-github.com/rs/zerolog v1.27.0 h1:1T7qCieN22GVc8S4Q2yuexzBb1EqjbgjSH9RohbMjKs=
-github.com/rs/zerolog v1.27.0/go.mod h1:7frBqO0oezxmnO7GF86FY++uy8I0Tk/If5ni1G9Qc0U=
+github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
+github.com/rs/zerolog v1.28.0 h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY=
+github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0=
 github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
-github.com/shirou/gopsutil/v3 v3.22.6 h1:FnHOFOh+cYAM0C30P+zysPISzlknLC5Z1G4EAElznfQ=
-github.com/shirou/gopsutil/v3 v3.22.6/go.mod h1:EdIubSnZhbAvBS1yJ7Xi+AShB/hxwLHOMz4MCYz7yMs=
+github.com/shirou/gopsutil/v3 v3.22.9 h1:yibtJhIVEMcdw+tCTbOPiF1VcsuDeTE4utJ8Dm4c5eA=
+github.com/shirou/gopsutil/v3 v3.22.9/go.mod h1:bBYl1kjgEJpWpxeHmLI+dVHWtyAwfcmSBLDsp2TNT8A=
 github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
 github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
 github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
@@ -77,10 +78,10 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
 github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.7.5 h1:s5PTfem8p8EbKQOctVV53k6jCJt3UX4IEJzwh+C324Q=
-github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
-github.com/tidwall/gjson v1.14.1 h1:iymTbGkQBhveq21bEvAQ81I0LEBork8BFe1CUZXdyuo=
-github.com/tidwall/gjson v1.14.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
+github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/tidwall/gjson v1.14.3 h1:9jvXn7olKEHU1S9vwoMGliaT8jq1vJ7IH/n9zD9Dnlw=
+github.com/tidwall/gjson v1.14.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
 github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
 github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
 github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=


Test patch:
diff --git a/cmd/tools/grafana/dashboard_test.go b/cmd/tools/grafana/dashboard_test.go
index dba0afbf..5c331624 100644
--- a/cmd/tools/grafana/dashboard_test.go
+++ b/cmd/tools/grafana/dashboard_test.go
@@ -1,29 +1,21 @@
 package grafana
 
 import (
+	"fmt"
 	"github.com/tidwall/gjson"
 	"log"
 	"os"
 	"path/filepath"
+	"regexp"
+	"sort"
+	"strings"
 	"testing"
 )
 
 func TestDatasource(t *testing.T) {
-	dir := "../../../grafana/dashboards"
-	err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
-		if err != nil {
-			log.Fatal("failed to read directory:", err)
-		}
-		ext := filepath.Ext(path)
-		if ext != ".json" {
-			return nil
-		}
+	visitDashboards("../../../grafana/dashboards", func(path string) {
 		checkDashboardForDatasource(t, path)
-		return nil
 	})
-	if err != nil {
-		log.Fatal("failed to read dashboards:", err)
-	}
 }
 
 func checkDashboardForDatasource(t *testing.T, path string) {
@@ -43,3 +35,288 @@ func checkDashboardForDatasource(t *testing.T, path string) {
 		return true
 	})
 }
+
+func visitDashboards(dir string, eachDash func(path string)) {
+	err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
+		if err != nil {
+			log.Fatal("failed to read directory:", err)
+		}
+		ext := filepath.Ext(path)
+		if ext != ".json" {
+			return nil
+		}
+		eachDash(path)
+		return nil
+	})
+	if err != nil {
+		log.Fatal("failed to read dashboards:", err)
+	}
+}
+
+func TestUnitsAndExprMatch(t *testing.T) {
+	mt := newMetricsTable()
+	dir := "../../../grafana/dashboards/cmode"
+	visitDashboards(dir, func(path string) {
+		checkUnits(path, mt)
+	})
+
+	// Exceptions are meant to reduce false negatives
+	allowedSuffix := map[string][]string{
+		"_count":    {"none", "short", "locale"},
+		"_lag_time": {"", "s", "short"},
+	}
+
+	metricNames := make([]string, 0, len(mt.metricsByUnit))
+	for m := range mt.metricsByUnit {
+		metricNames = append(metricNames, m)
+	}
+	sort.Strings(metricNames)
+
+	for _, metric := range metricNames {
+		u := mt.metricsByUnit[metric]
+
+		failText := strings.Builder{}
+		numUnits := len(u.units)
+		for unit, location := range u.units {
+			if unit == "" || unit == "none" {
+				// Fail this metric if it contains an empty or none unit
+				t.Errorf(`%s should not have unit=none %s path=%s title="%s"`,
+					metric, location[0].dashboard, location[0].path, location[0].title)
+			}
+			if numUnits == 1 {
+				continue
+			}
+		locCheck:
+			for _, row := range location {
+				for suffix, allowedUnits := range allowedSuffix {
+					if strings.HasSuffix(metric, suffix) {
+						for _, allowedUnit := range allowedUnits {
+							if unit == allowedUnit {
+								continue locCheck
+							}
+						}
+					}
+				}
+				failText.WriteString(fmt.Sprintf("unit=%s %s path=%s title=\"%s\"\n",
+					unit, row.dashboard, row.path, row.title))
+			}
+		}
+		if failText.Len() > 0 {
+			t.Errorf("%s has conflicting units\n%s", metric, failText.String())
+		}
+	}
+}
+
+var metricName = regexp.MustCompile(`(\w+){`)
+
+type metricsTable struct {
+	metricsByUnit map[string]*units
+}
+
+type override struct {
+	id      string
+	options string
+	unit    string
+	path    string
+}
+type expression struct {
+	metric string
+	refID  string
+}
+type units struct {
+	units map[string][]*metricLoc
+}
+
+func (u *units) addUnit(unit string, path string, dashboard string, title string) {
+	locs, ok := u.units[unit]
+	if !ok {
+		locs = make([]*metricLoc, 0)
+	}
+	locs = append(locs, &metricLoc{
+		path:      path,
+		dashboard: dashboard,
+		title:     title,
+	})
+	u.units[unit] = locs
+}
+
+func (t *metricsTable) addMetric(metric string, unit string, path string, dashboard string, title string) {
+	u, ok := t.metricsByUnit[metric]
+	if !ok {
+		u = &units{
+			units: make(map[string][]*metricLoc),
+		}
+		t.metricsByUnit[metric] = u
+	}
+	u.addUnit(unit, path, dashboard, title)
+}
+
+type metricLoc struct {
+	path      string
+	dashboard string
+	title     string
+}
+
+func newMetricsTable() *metricsTable {
+	return &metricsTable{
+		metricsByUnit: make(map[string]*units),
+	}
+}
+
+func checkUnits(dashboardPath string, mt *metricsTable) {
+	data, err := os.ReadFile(dashboardPath)
+	if err != nil {
+		log.Fatalf("failed to read dashboards dashboardPath=%s err=%v", dashboardPath, err)
+	}
+
+	gjson.GetBytes(data, "panels").ForEach(func(key, value gjson.Result) bool {
+		doPanel("", key, value, mt, dashboardPath)
+		value.Get("panels").ForEach(func(key2, value2 gjson.Result) bool {
+			pathPrefix := fmt.Sprintf("panels[%d].", key.Int())
+			doPanel(pathPrefix, key2, value2, mt, dashboardPath)
+			return true
+		})
+		return true
+	})
+}
+
+// detects two metrics divided by each other with labels
+// e.g. 100*sum(aggr_space_used{datacenter=~"$Datacenter",cluster=~"$Cluster",node=~"$Node",aggr=~"$Aggregate"})/sum(aggr_space_total{datacenter=~"$Datacenter",cluster=~"$Cluster",node=~"$Node",aggr=~"$Aggregate"})
+var metricDivideMetric1 = regexp.MustCompile(`(\w+){.*?/.*?(\w+){`)
+
+// detects metric without labels divided by metric with labels
+// e.g. lun_write_data/lun_write_ops{datacenter=~"$Datacenter",cluster=~"$Cluster",svm=~"$SVM",volume=~"$Volume",lun=~"$LUN"}/1024
+var metricDivideMetric2 = regexp.MustCompile(`(\w+)/.*?(\w+){`)
+
+// detects arrays
+var metricWithArray = regexp.MustCompile(`metric=~*"(.*?)"`)
+
+func doPanel(pathPrefix string, key gjson.Result, value gjson.Result, mt *metricsTable, dashboardPath string) bool {
+	kind := value.Get("type").String()
+	if kind == "row" {
+		return true
+	}
+	path := fmt.Sprintf("%spanels[%d]", pathPrefix, key.Int())
+	defaultUnit := value.Get("fieldConfig.defaults.unit").String()
+	overridesSlice := value.Get("fieldConfig.overrides").Array()
+	targetsSlice := value.Get("targets").Array()
+	transformationsSlice := value.Get("transformations").Array()
+	title := value.Get("title").String()
+	splits := strings.Split(dashboardPath, string(filepath.Separator))
+	shortPath := strings.Join(splits[len(splits)-2:], string(filepath.Separator))
+
+	overrides := make([]override, 0, len(overridesSlice))
+	expressions := make([]expression, 0)
+	valueToName := make(map[string]string) // only used with panels[*].transformations[*].options.renameByName
+
+	for oi, overrideN := range overridesSlice {
+		matcherID := overrideN.Get("matcher.id")
+		matcherOptions := overrideN.Get("matcher.options")
+		propertiesN := overrideN.Get("properties").Array()
+		for pi, propN := range propertiesN {
+			propID := propN.Get("id").String()
+			propVal := propN.Get("value").String()
+			if propID == "unit" {
+				o := override{
+					id:      matcherID.String(),
+					options: matcherOptions.String(),
+					unit:    propVal,
+					path: fmt.Sprintf("%s.panels[%d].fieldConfig.overrides.%d.properties.%d",
+						path, key.Int(), oi, pi),
+				}
+				overrides = append(overrides, o)
+			}
+		}
+	}
+
+	for _, targetN := range targetsSlice {
+		expr := targetN.Get("expr").String()
+		matches := metricName.FindStringSubmatch(expr)
+		if len(matches) != 2 {
+			continue
+		}
+		// If the expression includes count( ignore since it is unit-less
+		if strings.Contains(expr, "count(") {
+			continue
+		}
+		// Filter percentages since they are unit-less
+		if strings.Contains(expr, "/") {
+			match := metricDivideMetric1.FindStringSubmatch(expr)
+			if len(match) > 0 {
+				continue
+			}
+			match = metricDivideMetric2.FindStringSubmatch(expr)
+			if len(match) > 0 {
+				continue
+			}
+		}
+
+		metric := matches[1]
+		// If the expression contain metric="\w+" that means this is an array
+		// combine the array metric, with the metric, and include
+		match := metricWithArray.FindStringSubmatch(expr)
+		if len(match) > 0 {
+			metric = metric + "-" + match[1]
+		}
+
+		exprRefID := targetN.Get("refId").String()
+		expressions = append(expressions, expression{
+			metric: metric,
+			refID:  exprRefID,
+		})
+	}
+	for _, transformN := range transformationsSlice {
+		transformID := transformN.Get("id").String()
+		if transformID == "organize" {
+			rbn := transformN.Get("options.renameByName").Map()
+			for k, v := range rbn {
+				valueToName[k] = v.String()
+			}
+		}
+	}
+	numExpressions := len(expressions)
+	for _, e := range expressions {
+		// Ignore labels and _status
+		if strings.HasSuffix(e.metric, "_labels") || strings.HasSuffix(e.metric, "_status") {
+			continue
+		}
+		unit := unitForExpr(e, overrides, defaultUnit, valueToName, numExpressions)
+		mt.addMetric(e.metric, unit, path, shortPath, title)
+	}
+	return true
+}
+
+func unitForExpr(e expression, overrides []override, defaultUnit string,
+	valueToName map[string]string, numExpressions int) string {
+
+	if len(overrides) == 0 {
+		return defaultUnit
+	}
+	// search the slice of overrides for a match, and use the overridden unit if found.
+	// When the valueToName map is not empty, that means some objects were renamed in Grafana.
+	// Consult the map to track the renames.
+	// Special case: If there is a single expression, Grafana will name it "Value" instead of "Value #refId"
+	byNameQuery := "Value"
+	if numExpressions > 1 {
+		byNameQuery = fmt.Sprintf("Value #%s", e.refID)
+	}
+	byNameQuery2 := ""
+	for _, o := range overrides {
+		if len(valueToName) > 0 {
+			n, ok := valueToName[byNameQuery]
+			if ok {
+				byNameQuery2 = n
+			}
+		}
+		if o.id == "byName" {
+			if o.options == byNameQuery || o.options == byNameQuery2 {
+				return o.unit
+			}
+		} else if o.id == "byFrameRefID" {
+			if o.options == e.refID || o.options == byNameQuery2 {
+				return o.unit
+			}
+		}
+	}
+	return defaultUnit
+}
diff --git a/integration/test/dashboard_json_test.go b/integration/test/dashboard_json_test.go
index 4bc5886d..90eea6e7 100644
--- a/integration/test/dashboard_json_test.go
+++ b/integration/test/dashboard_json_test.go
@@ -165,7 +165,7 @@ func (suite *DashboardJsonTestSuite) TestJsonExpression() {
 
 func ShouldSkipDashboard(path string) bool {
 	// Ignore headroom dashboard from CI as it uses dynamic variables in query
-	skip := []string{"nfs4storePool_detail", "headroom", "tenant"}
+	skip := []string{"nfs4storePool", "headroom", "tenant"}
 	for _, s := range skip {
 		if strings.Contains(path, s) {
 			return true