Repository: NetApp/harvest
Pull request #1731 (2023-02-14 15:40:21)

fix: add error log when collector fails due to connection issues


Patch:
diff --git a/cmd/collectors/storagegrid/storagegrid.go b/cmd/collectors/storagegrid/storagegrid.go
index 28ce874c..993d96b0 100644
--- a/cmd/collectors/storagegrid/storagegrid.go
+++ b/cmd/collectors/storagegrid/storagegrid.go
@@ -535,29 +535,31 @@ func (s *StorageGrid) CollectAutoSupport(p *collector.Payload) {
 	p.Target.Model = "storagegrid"
 	p.Target.ClusterUUID = s.client.Cluster.UUID
 
-	md := s.GetMetadata()
-	info := collector.InstanceInfo{
-		Count:      md.LazyValueInt64("instances", "data"),
-		DataPoints: md.LazyValueInt64("metrics", "data"),
-		PollTime:   md.LazyValueInt64("poll_time", "data"),
-		APITime:    md.LazyValueInt64("api_time", "data"),
-		ParseTime:  md.LazyValueInt64("parse_time", "data"),
-		PluginTime: md.LazyValueInt64("plugin_time", "data"),
-	}
-
-	if s.Object == "Tenant" {
+	if p.Nodes == nil {
 		nodeIds, err := s.getNodeUuids()
 		if err != nil {
-			// log the error, but don't exit method so the other info below is collected
-			s.Logger.Error().
-				Err(err).
-				Msg("Unable to get nodes.")
+			// log the error, but don't exit method so subsequent info is collected
+			s.Logger.Error().Err(err).Msg("Unable to get nodes.")
 			nodeIds = make([]collector.ID, 0)
 		}
-		info.Ids = nodeIds
+		p.Nodes = &collector.InstanceInfo{
+			Ids:   nodeIds,
+			Count: int64(len(nodeIds)),
+		}
 	}
 
-	p.Nodes = &info
+	if s.Object == "Tenant" {
+		md := s.GetMetadata()
+		info := collector.InstanceInfo{
+			Count:      md.LazyValueInt64("instances", "data"),
+			DataPoints: md.LazyValueInt64("metrics", "data"),
+			PollTime:   md.LazyValueInt64("poll_time", "data"),
+			APITime:    md.LazyValueInt64("api_time", "data"),
+			ParseTime:  md.LazyValueInt64("parse_time", "data"),
+			PluginTime: md.LazyValueInt64("plugin_time", "data"),
+		}
+		p.Tenants = &info
+	}
 }
 
 func (s *StorageGrid) getNodeUuids() ([]collector.ID, error) {
diff --git a/cmd/poller/collector/asup.go b/cmd/poller/collector/asup.go
index 6da036fc..5cec923c 100644
--- a/cmd/poller/collector/asup.go
+++ b/cmd/poller/collector/asup.go
@@ -23,8 +23,9 @@ type Payload struct {
 	Target     *TargetInfo
 	Harvest    *harvestInfo
 	Platform   *platformInfo
-	Nodes      *InstanceInfo
-	Volumes    *InstanceInfo
+	Nodes      *InstanceInfo `json:"Nodes,omitempty"`
+	Volumes    *InstanceInfo `json:"Volumes,omitempty"`
+	Tenants    *InstanceInfo `json:"Tenants,omitempty"`
 	Collectors *[]AsupCollector
 	path       string
 }
diff --git a/cmd/poller/poller.go b/cmd/poller/poller.go
index 20e42d02..c94a0569 100644
--- a/cmd/poller/poller.go
+++ b/cmd/poller/poller.go
@@ -673,7 +673,7 @@ func (p *Poller) loadCollectorObject(ocs []objectCollector) error {
 		col, err := p.newCollector(oc.class, oc.object, oc.template)
 		if err != nil {
 			if errors.Is(err, errs.ErrConnection) {
-				logger.Warn().
+				logger.Warn().Err(err).
 					Str("collector", oc.class).
 					Str("object", oc.object).
 					Msg("abort collector")
diff --git a/cmd/tools/generate/counter.go b/cmd/tools/generate/counter.go
index 26b04fc5..36c187af 100644
--- a/cmd/tools/generate/counter.go
+++ b/cmd/tools/generate/counter.go
@@ -26,6 +26,8 @@ var (
 		"aggr":               "xc_aggregate",
 		"net_port":           "xc_broadcast_domain",
 		"environment_sensor": "sensors",
+		"ontaps3":            "xc_s3_bucket",
+		"security_ssh":       "cluster_ssh_server",
 	}
 	swaggerBytes []byte
 )
diff --git a/cmd/tools/generate/counter.yaml b/cmd/tools/generate/counter.yaml
index a3e54956..31647c2f 100644
--- a/cmd/tools/generate/counter.yaml
+++ b/cmd/tools/generate/counter.yaml
@@ -15,6 +15,19 @@ counters:
         ONTAPCounter: Harvest generated
         Template: conf/rest/9.12.0/aggr.yaml
 
+  - Name: aggr_power
+    Description: Power consumed by aggregate in Watts.
+    APIs:
+      - API: REST
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/restperf/9.12.0/disk.yaml
+
+      - API: ZAPI
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/zapiperf/cdot/9.8.0/disk.yaml
+
   - Name: aggr_raid_disk_count
     Description: Number of disks in the aggregate.
     APIs:
@@ -42,6 +55,12 @@ counters:
         ONTAPCounter: Harvest generated
         Template: conf/rest/9.12.0/aggr.yaml
 
+  - Name: aggr_snapshot_inode_used_percent
+    Description: The percentage of disk space currently in use based on user-visible file (inode) count on the referenced file system.
+
+  - Name: aggr_space_reserved
+    Description:  The total disk space in bytes that is reserved on the referenced file system. The reserved space is already counted in the used space, so this element can be used to see what portion of the used space represents space reserved for future use.
+
   - Name: aggr_total_physical_used
     Description: Total Physical Used
     APIs:
@@ -50,6 +69,9 @@ counters:
         ONTAPCounter: Harvest generated
         Template: conf/rest/9.12.0/aggr.yaml
 
+  - Name: aggr_volume_count_flexvol
+    Description: Number of flexvol volumes in the aggregate.
+
   - Name: cluster_subsystem_suppressed_alerts
     Description: Number of suppressed alerts
 
@@ -88,6 +110,126 @@ counters:
         ONTAPCounter: Harvest generated
         Template: conf/rest/9.12.0/disk.yaml
 
+  - Name: disk_usable_size
+    Description: Usable size of each disk, in bytes.
+
+  - Name: environment_sensor_average_ambient_temperature
+    Description: Average temperature of all ambient sensors for node in Celsius.
+    APIs:
+      - API: REST
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/rest/9.12.0/sensor.yaml
+
+      - API: ZAPI
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/zapi/cdot/9.8.0/sensor.yaml
+
+  - Name: environment_sensor_average_fan_speed
+    Description: Average fan speed for node in rpm.
+    APIs:
+      - API: REST
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/rest/9.12.0/sensor.yaml
+
+      - API: ZAPI
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/zapi/cdot/9.8.0/sensor.yaml
+
+  - Name: environment_sensor_average_temperature
+    Description: Average temperature of all non-ambient sensors for node in Celsius.
+    APIs:
+      - API: REST
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/rest/9.12.0/sensor.yaml
+
+      - API: ZAPI
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/zapi/cdot/9.8.0/sensor.yaml
+
+  - Name: environment_sensor_max_fan_speed
+    Description: Maximum fan speed for node in rpm.
+    APIs:
+      - API: REST
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/rest/9.12.0/sensor.yaml
+
+      - API: ZAPI
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/zapi/cdot/9.8.0/sensor.yaml
+
+  - Name: environment_sensor_max_temperature
+    Description: Maximum temperature of all non-ambient sensors for node in Celsius.
+    APIs:
+      - API: REST
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/rest/9.12.0/sensor.yaml
+
+      - API: ZAPI
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/zapi/cdot/9.8.0/sensor.yaml
+
+  - Name: environment_sensor_min_ambient_temperature
+    Description: Minimum temperature of all ambient sensors for node in Celsius.
+    APIs:
+      - API: REST
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/rest/9.12.0/sensor.yaml
+
+      - API: ZAPI
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/zapi/cdot/9.8.0/sensor.yaml
+
+  - Name: environment_sensor_min_fan_speed
+    Description: Minimum fan speed for node in rpm.
+    APIs:
+      - API: REST
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/rest/9.12.0/sensor.yaml
+
+      - API: ZAPI
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/zapi/cdot/9.8.0/sensor.yaml
+
+  - Name: environment_sensor_min_temperature
+    Description: Minimum temperature of all non-ambient sensors for node in Celsius.
+    APIs:
+      - API: REST
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/rest/9.12.0/sensor.yaml
+
+      - API: ZAPI
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/zapi/cdot/9.8.0/sensor.yaml
+
+  - Name: environment_sensor_power
+    Description: Power consumed by a node in Watts.
+    APIs:
+      - API: REST
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/rest/9.12.0/sensor.yaml
+
+      - API: ZAPI
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/zapi/cdot/9.8.0/sensor.yaml
+
   - Name: node_cpu_busytime
     Description: The time (in hundredths of a second) that the CPU has been doing useful work since the last boot
     APIs:
@@ -200,4 +342,287 @@ counters:
       - API: REST
         Endpoint: api/private/cli/volume
         ONTAPCounter: sis_space_saved_percent
-        Template: conf/rest/9.12.0/volume.yaml
\ No newline at end of file
+        Template: conf/rest/9.12.0/volume.yaml
+
+  - Name: quota_disk_limit
+    Description: Maximum amount of disk space, in kilobytes, allowed for the quota target (hard disk space limit). The value is -1 if the limit is unlimited.
+    APIs:
+      - API: REST
+        Endpoint: api/storage/quota/reports
+        ONTAPCounter: space.hard_limit
+        Template: conf/rest/9.12.0/qtree.yaml
+
+      - API: ZAPI
+        Endpoint: quota-report-iter
+        ONTAPCounter: disk-limit
+        Template: conf/zapi/cdot/9.8.0/qtree.yaml
+
+  - Name: quota_disk_used
+    Description: Current amount of disk space, in kilobytes, used by the quota target.
+    APIs:
+      - API: REST
+        Endpoint: api/storage/quota/reports
+        ONTAPCounter: space.used.total
+        Template: conf/rest/9.12.0/qtree.yaml
+
+      - API: ZAPI
+        Endpoint: quota-report-iter
+        ONTAPCounter: disk-used
+        Template: conf/zapi/cdot/9.8.0/qtree.yaml
+
+  - Name: quota_disk_used_pct_disk_limit
+    Description: Current disk space used expressed as a percentage of hard disk limit.
+    APIs:
+      - API: REST
+        Endpoint: api/storage/quota/reports
+        ONTAPCounter: space.used.hard_limit_percent
+        Template: conf/rest/9.12.0/qtree.yaml
+
+      - API: ZAPI
+        Endpoint: quota-report-iter
+        ONTAPCounter: disk-used-pct-disk-limit
+        Template: conf/zapi/cdot/9.8.0/qtree.yaml
+
+  - Name: quota_disk_used_pct_soft_disk_limit
+    Description: Current disk space used expressed as a percentage of soft disk limit.
+    APIs:
+      - API: REST
+        Endpoint: api/storage/quota/reports
+        ONTAPCounter: space.used.soft_limit_percent
+        Template: conf/rest/9.12.0/qtree.yaml
+
+      - API: ZAPI
+        Endpoint: quota-report-iter
+        ONTAPCounter: disk-used-pct-soft-disk-limit
+        Template: conf/zapi/cdot/9.8.0/qtree.yaml
+
+  - Name: quota_disk_used_pct_threshold
+    Description: Current disk space used expressed as a percentage of threshold.
+    APIs:
+      - API: ZAPI
+        Endpoint: quota-report-iter
+        ONTAPCounter: disk-used-pct-threshold
+        Template: conf/zapi/cdot/9.8.0/qtree.yaml
+
+  - Name: quota_file_limit
+    Description: aximum number of files allowed for the quota target (hard files limit). The value is -1 if the limit is unlimited.
+    APIs:
+      - API: REST
+        Endpoint: api/storage/quota/reports
+        ONTAPCounter: files.hard_limit
+        Template: conf/rest/9.12.0/qtree.yaml
+
+      - API: ZAPI
+        Endpoint: quota-report-iter
+        ONTAPCounter: file-limit
+        Template: conf/zapi/cdot/9.8.0/qtree.yaml
+
+  - Name: quota_files_used
+    Description: Current number of files used by the quota target.
+    APIs:
+      - API: REST
+        Endpoint: api/storage/quota/reports
+        ONTAPCounter: files.used.total
+        Template: conf/rest/9.12.0/qtree.yaml
+
+      - API: ZAPI
+        Endpoint: quota-report-iter
+        ONTAPCounter: files-used
+        Template: conf/zapi/cdot/9.8.0/qtree.yaml
+
+  - Name: quota_files_used_pct_file_limit
+    Description: Current number of files used expressed as a percentage of hard file limit.
+    APIs:
+      - API: REST
+        Endpoint: api/storage/quota/reports
+        ONTAPCounter: files.used.hard_limit_percent
+        Template: conf/rest/9.12.0/qtree.yaml
+
+      - API: ZAPI
+        Endpoint: quota-report-iter
+        ONTAPCounter: files-used-pct-file-limit
+        Template: conf/zapi/cdot/9.8.0/qtree.yaml
+
+  - Name: quota_files_used_pct_soft_file_limit
+    Description: Current number of files used expressed as a percentage of soft file limit.
+    APIs:
+      - API: REST
+        Endpoint: api/storage/quota/reports
+        ONTAPCounter: files.used.soft_limit_percent
+        Template: conf/rest/9.12.0/qtree.yaml
+
+      - API: ZAPI
+        Endpoint: quota-report-iter
+        ONTAPCounter: files-used-pct-soft-file-limit
+        Template: conf/zapi/cdot/9.8.0/qtree.yaml
+
+  - Name: quota_soft_disk_limit
+    Description: soft disk space limit, in kilobytes, for the quota target. The value is -1 if the limit is unlimited.
+    APIs:
+      - API: REST
+        Endpoint: api/storage/quota/reports
+        ONTAPCounter: space.soft_limit
+        Template: conf/rest/9.12.0/qtree.yaml
+
+      - API: ZAPI
+        Endpoint: quota-report-iter
+        ONTAPCounter: soft-disk-limit
+        Template: conf/zapi/cdot/9.8.0/qtree.yaml
+
+  - Name: quota_soft_file_limit
+    Description: Soft file limit, in number of files, for the quota target. The value is -1 if the limit is unlimited.
+    APIs:
+      - API: REST
+        Endpoint: api/storage/quota/reports
+        ONTAPCounter: files.soft_limit
+        Template: conf/rest/9.12.0/qtree.yaml
+
+      - API: ZAPI
+        Endpoint: quota-report-iter
+        ONTAPCounter: soft-file-limit
+        Template: conf/zapi/cdot/9.8.0/qtree.yaml
+
+  - Name: quota_threshold
+    Description: Disk space threshold, in kilobytes, for the quota target. The value is -1 if the limit is unlimited.
+    APIs:
+      - API: ZAPI
+        Endpoint: quota-report-iter
+        ONTAPCounter: threshold
+        Template: conf/zapi/cdot/9.8.0/qtree.yaml
+
+  - Name: security_audit_destination_port
+    Description: The destination port used to forward the message.
+
+  - Name: shelf_disk_count
+    Description: Disk count in a shelf.
+
+  - Name: shelf_average_ambient_temperature
+    Description: Average temperature of all ambient sensors for shelf in Celsius.
+    APIs:
+      - API: REST
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/restperf/9.12.0/disk.yaml
+
+      - API: ZAPI
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/zapiperf/cdot/9.8.0/disk.yaml
+
+  - Name: shelf_average_fan_speed
+    Description: Average fan speed for shelf in rpm.
+    APIs:
+      - API: REST
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/restperf/9.12.0/disk.yaml
+
+      - API: ZAPI
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/zapiperf/cdot/9.8.0/disk.yaml
+
+  - Name: shelf_average_temperature
+    Description: Average temperature of all non-ambient sensors for shelf in Celsius.
+    APIs:
+      - API: REST
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/restperf/9.12.0/disk.yaml
+
+      - API: ZAPI
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/zapiperf/cdot/9.8.0/disk.yaml
+
+  - Name: shelf_max_fan_speed
+    Description: Maximum fan speed for shelf in rpm.
+    APIs:
+      - API: REST
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/restperf/9.12.0/disk.yaml
+
+      - API: ZAPI
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/zapiperf/cdot/9.8.0/disk.yaml
+
+  - Name: shelf_max_temperature
+    Description: Maximum temperature of all non-ambient sensors for shelf in Celsius.
+    APIs:
+      - API: REST
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/restperf/9.12.0/disk.yaml
+
+      - API: ZAPI
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/zapiperf/cdot/9.8.0/disk.yaml
+
+  - Name: shelf_min_ambient_temperature
+    Description: Minimum temperature of all ambient sensors for shelf in Celsius.
+    APIs:
+      - API: REST
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/restperf/9.12.0/disk.yaml
+
+      - API: ZAPI
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/zapiperf/cdot/9.8.0/disk.yaml
+
+  - Name: shelf_min_fan_speed
+    Description: Minimum fan speed for shelf in rpm.
+    APIs:
+      - API: REST
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/restperf/9.12.0/disk.yaml
+
+      - API: ZAPI
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/zapiperf/cdot/9.8.0/disk.yaml
+
+  - Name: shelf_min_temperature
+    Description: Minimum temperature of all non-ambient sensors for shelf in Celsius.
+    APIs:
+      - API: REST
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/restperf/9.12.0/disk.yaml
+
+      - API: ZAPI
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/zapiperf/cdot/9.8.0/disk.yaml
+
+  - Name: shelf_power
+    Description: Power consumed by shelf in Watts.
+    APIs:
+      - API: REST
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/restperf/9.12.0/disk.yaml
+
+      - API: ZAPI
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/zapiperf/cdot/9.8.0/disk.yaml
+
+  - Name: volume_inode_used_percent
+    Description: volume_inode_files_used / volume_inode_total
+    APIs:
+      - API: REST
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/rest/9.12.0/volume.yaml
+
+      - API: ZAPI
+        Endpoint: NA
+        ONTAPCounter: Harvest generated
+        Template: conf/zapi/cdot/9.8.0/volume.yaml
+
diff --git a/docs/assets/extra.css b/docs/assets/extra.css
index 2774ab68..087e4938 100644
--- a/docs/assets/extra.css
+++ b/docs/assets/extra.css
@@ -1,3 +1,3 @@
 .key {
-    color: deepskyblue;
+    color: #1496BB;
 }
\ No newline at end of file
diff --git a/docs/ontap-metrics.md b/docs/ontap-metrics.md
index 5fbfce2e..01361221 100644
--- a/docs/ontap-metrics.md
+++ b/docs/ontap-metrics.md
@@ -4,7 +4,7 @@ Details about which Harvest metrics each dashboard uses can be generated on dema
 [#1577](https://github.com/NetApp/harvest/issues/1577#issue-1471478260) for details.
 
 ```
-Creation Date : 2023-Feb-10
+Creation Date : 2023-Feb-15
 ONTAP Version: 9.12.1
 ```
 ## Understanding the structure
@@ -210,6 +210,16 @@ Total Data Reduction Physical Used without snapshots and flexclones
 | REST | `NA` | `Harvest generated` | conf/rest/9.12.0/aggr.yaml |
 
 
+### aggr_power
+
+Power consumed by aggregate in Watts.
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| REST | `NA` | `Harvest generated`<br><span class="key">Unit:</span> <br><span class="key">Type:</span> <br><span class="key">Base:</span>  | conf/restperf/9.12.0/disk.yaml | 
+| ZAPI | `NA` | `Harvest generated`<br><span class="key">Unit:</span> <br><span class="key">Type:</span> <br><span class="key">Base:</span>  | conf/zapiperf/cdot/9.8.0/disk.yaml | 
+
+
 ### aggr_primary_disk_count
 
 Number of disks used in the aggregate. This includes parity disks, but excludes disks in the hybrid cache.
@@ -271,7 +281,7 @@ Total files created in Snapshot copies
 
 ### aggr_snapshot_inode_used_percent
 
-
+The percentage of disk space currently in use based on user-visible file (inode) count on the referenced file system.
 
 | API    | Endpoint | Metric | Template |
 |--------|----------|--------|---------|
@@ -450,7 +460,7 @@ Physical used percentage.
 
 ### aggr_space_reserved
 
-
+The total disk space in bytes that is reserved on the referenced file system. The reserved space is already counted in the used space, so this element can be used to see what portion of the used space represents space reserved for future use.
 
 | API    | Endpoint | Metric | Template |
 |--------|----------|--------|---------|
@@ -539,7 +549,7 @@ Total Physical Used
 
 ### aggr_volume_count_flexvol
 
-
+Number of flexvol volumes in the aggregate.
 
 | API    | Endpoint | Metric | Template |
 |--------|----------|--------|---------|
@@ -788,7 +798,7 @@ Number of seconds the drive has been powered on
 
 ### disk_usable_size
 
-
+Usable size of each disk, in bytes.
 
 | API    | Endpoint | Metric | Template |
 |--------|----------|--------|---------|
@@ -875,6 +885,96 @@ Number of disk write operations initiated each second for storing data or metada
 | ZAPI | `perf-object-get-instances disk:constituent` | `user_writes`<br><span class="key">Unit:</span> per_sec<br><span class="key">Type:</span> rate<br><span class="key">Base:</span>  | conf/zapiperf/cdot/9.8.0/disk.yaml | 
 
 
+### environment_sensor_average_ambient_temperature
+
+Average temperature of all ambient sensors for node in Celsius.
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| REST | `NA` | `Harvest generated` | conf/rest/9.12.0/sensor.yaml |
+| ZAPI | `NA` | `Harvest generated` | conf/zapi/cdot/9.8.0/sensor.yaml |
+
+
+### environment_sensor_average_fan_speed
+
+Average fan speed for node in rpm.
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| REST | `NA` | `Harvest generated` | conf/rest/9.12.0/sensor.yaml |
+| ZAPI | `NA` | `Harvest generated` | conf/zapi/cdot/9.8.0/sensor.yaml |
+
+
+### environment_sensor_average_temperature
+
+Average temperature of all non-ambient sensors for node in Celsius.
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| REST | `NA` | `Harvest generated` | conf/rest/9.12.0/sensor.yaml |
+| ZAPI | `NA` | `Harvest generated` | conf/zapi/cdot/9.8.0/sensor.yaml |
+
+
+### environment_sensor_max_fan_speed
+
+Maximum fan speed for node in rpm.
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| REST | `NA` | `Harvest generated` | conf/rest/9.12.0/sensor.yaml |
+| ZAPI | `NA` | `Harvest generated` | conf/zapi/cdot/9.8.0/sensor.yaml |
+
+
+### environment_sensor_max_temperature
+
+Maximum temperature of all non-ambient sensors for node in Celsius.
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| REST | `NA` | `Harvest generated` | conf/rest/9.12.0/sensor.yaml |
+| ZAPI | `NA` | `Harvest generated` | conf/zapi/cdot/9.8.0/sensor.yaml |
+
+
+### environment_sensor_min_ambient_temperature
+
+Minimum temperature of all ambient sensors for node in Celsius.
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| REST | `NA` | `Harvest generated` | conf/rest/9.12.0/sensor.yaml |
+| ZAPI | `NA` | `Harvest generated` | conf/zapi/cdot/9.8.0/sensor.yaml |
+
+
+### environment_sensor_min_fan_speed
+
+Minimum fan speed for node in rpm.
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| REST | `NA` | `Harvest generated` | conf/rest/9.12.0/sensor.yaml |
+| ZAPI | `NA` | `Harvest generated` | conf/zapi/cdot/9.8.0/sensor.yaml |
+
+
+### environment_sensor_min_temperature
+
+Minimum temperature of all non-ambient sensors for node in Celsius.
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| REST | `NA` | `Harvest generated` | conf/rest/9.12.0/sensor.yaml |
+| ZAPI | `NA` | `Harvest generated` | conf/zapi/cdot/9.8.0/sensor.yaml |
+
+
+### environment_sensor_power
+
+Power consumed by a node in Watts.
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| REST | `NA` | `Harvest generated` | conf/rest/9.12.0/sensor.yaml |
+| ZAPI | `NA` | `Harvest generated` | conf/zapi/cdot/9.8.0/sensor.yaml |
+
+
 ### environment_sensor_threshold_value
 
 Provides the sensor reading.
@@ -6286,7 +6386,7 @@ Number of LIST Uploads operations
 
 ### ontaps3_logical_used_size
 
-
+Specifies the bucket logical used size up to this point.
 
 | API    | Endpoint | Metric | Template |
 |--------|----------|--------|---------|
@@ -6538,7 +6638,7 @@ Total number of object store server signature V4 requests
 
 ### ontaps3_size
 
-
+Specifies the bucket size in bytes; ranges from 80MB to 64TB.
 
 | API    | Endpoint | Metric | Template |
 |--------|----------|--------|---------|
@@ -7038,9 +7138,127 @@ Summation of NFS ops, CIFS ops, CSS ops and internal ops
 | ZAPI | `perf-object-get-instances qtree` | `total_ops`<br><span class="key">Unit:</span> per_sec<br><span class="key">Type:</span> rate<br><span class="key">Base:</span>  | conf/zapiperf/cdot/9.8.0/qtree.yaml | 
 
 
-### security_audit_destination_port
+### quota_disk_limit
+
+Maximum amount of disk space, in kilobytes, allowed for the quota target (hard disk space limit). The value is -1 if the limit is unlimited.
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| REST | `api/storage/quota/reports` | `space.hard_limit` | conf/rest/9.12.0/qtree.yaml |
+| ZAPI | `quota-report-iter` | `disk-limit` | conf/zapi/cdot/9.8.0/qtree.yaml |
+
+
+### quota_disk_used
+
+Current amount of disk space, in kilobytes, used by the quota target.
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| REST | `api/storage/quota/reports` | `space.used.total` | conf/rest/9.12.0/qtree.yaml |
+| ZAPI | `quota-report-iter` | `disk-used` | conf/zapi/cdot/9.8.0/qtree.yaml |
+
 
+### quota_disk_used_pct_disk_limit
 
+Current disk space used expressed as a percentage of hard disk limit.
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| REST | `api/storage/quota/reports` | `space.used.hard_limit_percent` | conf/rest/9.12.0/qtree.yaml |
+| ZAPI | `quota-report-iter` | `disk-used-pct-disk-limit` | conf/zapi/cdot/9.8.0/qtree.yaml |
+
+
+### quota_disk_used_pct_soft_disk_limit
+
+Current disk space used expressed as a percentage of soft disk limit.
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| REST | `api/storage/quota/reports` | `space.used.soft_limit_percent` | conf/rest/9.12.0/qtree.yaml |
+| ZAPI | `quota-report-iter` | `disk-used-pct-soft-disk-limit` | conf/zapi/cdot/9.8.0/qtree.yaml |
+
+
+### quota_disk_used_pct_threshold
+
+Current disk space used expressed as a percentage of threshold.
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| ZAPI | `quota-report-iter` | `disk-used-pct-threshold` | conf/zapi/cdot/9.8.0/qtree.yaml |
+
+
+### quota_file_limit
+
+aximum number of files allowed for the quota target (hard files limit). The value is -1 if the limit is unlimited.
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| REST | `api/storage/quota/reports` | `files.hard_limit` | conf/rest/9.12.0/qtree.yaml |
+| ZAPI | `quota-report-iter` | `file-limit` | conf/zapi/cdot/9.8.0/qtree.yaml |
+
+
+### quota_files_used
+
+Current number of files used by the quota target.
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| REST | `api/storage/quota/reports` | `files.used.total` | conf/rest/9.12.0/qtree.yaml |
+| ZAPI | `quota-report-iter` | `files-used` | conf/zapi/cdot/9.8.0/qtree.yaml |
+
+
+### quota_files_used_pct_file_limit
+
+Current number of files used expressed as a percentage of hard file limit.
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| REST | `api/storage/quota/reports` | `files.used.hard_limit_percent` | conf/rest/9.12.0/qtree.yaml |
+| ZAPI | `quota-report-iter` | `files-used-pct-file-limit` | conf/zapi/cdot/9.8.0/qtree.yaml |
+
+
+### quota_files_used_pct_soft_file_limit
+
+Current number of files used expressed as a percentage of soft file limit.
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| REST | `api/storage/quota/reports` | `files.used.soft_limit_percent` | conf/rest/9.12.0/qtree.yaml |
+| ZAPI | `quota-report-iter` | `files-used-pct-soft-file-limit` | conf/zapi/cdot/9.8.0/qtree.yaml |
+
+
+### quota_soft_disk_limit
+
+soft disk space limit, in kilobytes, for the quota target. The value is -1 if the limit is unlimited.
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| REST | `api/storage/quota/reports` | `space.soft_limit` | conf/rest/9.12.0/qtree.yaml |
+| ZAPI | `quota-report-iter` | `soft-disk-limit` | conf/zapi/cdot/9.8.0/qtree.yaml |
+
+
+### quota_soft_file_limit
+
+Soft file limit, in number of files, for the quota target. The value is -1 if the limit is unlimited.
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| REST | `api/storage/quota/reports` | `files.soft_limit` | conf/rest/9.12.0/qtree.yaml |
+| ZAPI | `quota-report-iter` | `soft-file-limit` | conf/zapi/cdot/9.8.0/qtree.yaml |
+
+
+### quota_threshold
+
+Disk space threshold, in kilobytes, for the quota target. The value is -1 if the limit is unlimited.
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| ZAPI | `quota-report-iter` | `threshold` | conf/zapi/cdot/9.8.0/qtree.yaml |
+
+
+### security_audit_destination_port
+
+The destination port used to forward the message.
 
 | API    | Endpoint | Metric | Template |
 |--------|----------|--------|---------|
@@ -7059,16 +7277,46 @@ Certificate expiration time. Can be provided on POST if creating self-signed cer
 
 ### security_ssh_max_instances
 
-
+Maximum possible simultaneous connections.
 
 | API    | Endpoint | Metric | Template |
 |--------|----------|--------|---------|
 | REST | `api/security/ssh` | `max_instances` | conf/rest/9.12.0/security_ssh.yaml |
 
 
-### shelf_disk_count
+### shelf_average_ambient_temperature
+
+Average temperature of all ambient sensors for shelf in Celsius.
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| REST | `NA` | `Harvest generated`<br><span class="key">Unit:</span> <br><span class="key">Type:</span> <br><span class="key">Base:</span>  | conf/restperf/9.12.0/disk.yaml | 
+| ZAPI | `NA` | `Harvest generated`<br><span class="key">Unit:</span> <br><span class="key">Type:</span> <br><span class="key">Base:</span>  | conf/zapiperf/cdot/9.8.0/disk.yaml | 
+
+
+### shelf_average_fan_speed
+
+Average fan speed for shelf in rpm.
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| REST | `NA` | `Harvest generated`<br><span class="key">Unit:</span> <br><span class="key">Type:</span> <br><span class="key">Base:</span>  | conf/restperf/9.12.0/disk.yaml | 
+| ZAPI | `NA` | `Harvest generated`<br><span class="key">Unit:</span> <br><span class="key">Type:</span> <br><span class="key">Base:</span>  | conf/zapiperf/cdot/9.8.0/disk.yaml | 
 
 
+### shelf_average_temperature
+
+Average temperature of all non-ambient sensors for shelf in Celsius.
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| REST | `NA` | `Harvest generated`<br><span class="key">Unit:</span> <br><span class="key">Type:</span> <br><span class="key">Base:</span>  | conf/restperf/9.12.0/disk.yaml | 
+| ZAPI | `NA` | `Harvest generated`<br><span class="key">Unit:</span> <br><span class="key">Type:</span> <br><span class="key">Base:</span>  | conf/zapiperf/cdot/9.8.0/disk.yaml | 
+
+
+### shelf_disk_count
+
+Disk count in a shelf.
 
 | API    | Endpoint | Metric | Template |
 |--------|----------|--------|---------|
@@ -7076,6 +7324,66 @@ Certificate expiration time. Can be provided on POST if creating self-signed cer
 | ZAPI | `storage-shelf-info-get-iter` | `storage-shelf-info.disk-count` | conf/zapi/cdot/9.8.0/shelf.yaml |
 
 
+### shelf_max_fan_speed
+
+Maximum fan speed for shelf in rpm.
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| REST | `NA` | `Harvest generated`<br><span class="key">Unit:</span> <br><span class="key">Type:</span> <br><span class="key">Base:</span>  | conf/restperf/9.12.0/disk.yaml | 
+| ZAPI | `NA` | `Harvest generated`<br><span class="key">Unit:</span> <br><span class="key">Type:</span> <br><span class="key">Base:</span>  | conf/zapiperf/cdot/9.8.0/disk.yaml | 
+
+
+### shelf_max_temperature
+
+Maximum temperature of all non-ambient sensors for shelf in Celsius.
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| REST | `NA` | `Harvest generated`<br><span class="key">Unit:</span> <br><span class="key">Type:</span> <br><span class="key">Base:</span>  | conf/restperf/9.12.0/disk.yaml | 
+| ZAPI | `NA` | `Harvest generated`<br><span class="key">Unit:</span> <br><span class="key">Type:</span> <br><span class="key">Base:</span>  | conf/zapiperf/cdot/9.8.0/disk.yaml | 
+
+
+### shelf_min_ambient_temperature
+
+Minimum temperature of all ambient sensors for shelf in Celsius.
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| REST | `NA` | `Harvest generated`<br><span class="key">Unit:</span> <br><span class="key">Type:</span> <br><span class="key">Base:</span>  | conf/restperf/9.12.0/disk.yaml | 
+| ZAPI | `NA` | `Harvest generated`<br><span class="key">Unit:</span> <br><span class="key">Type:</span> <br><span class="key">Base:</span>  | conf/zapiperf/cdot/9.8.0/disk.yaml | 
+
+
+### shelf_min_fan_speed
+
+Minimum fan speed for shelf in rpm.
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| REST | `NA` | `Harvest generated`<br><span class="key">Unit:</span> <br><span class="key">Type:</span> <br><span class="key">Base:</span>  | conf/restperf/9.12.0/disk.yaml | 
+| ZAPI | `NA` | `Harvest generated`<br><span class="key">Unit:</span> <br><span class="key">Type:</span> <br><span class="key">Base:</span>  | conf/zapiperf/cdot/9.8.0/disk.yaml | 
+
+
+### shelf_min_temperature
+
+Minimum temperature of all non-ambient sensors for shelf in Celsius.
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| REST | `NA` | `Harvest generated`<br><span class="key">Unit:</span> <br><span class="key">Type:</span> <br><span class="key">Base:</span>  | conf/restperf/9.12.0/disk.yaml | 
+| ZAPI | `NA` | `Harvest generated`<br><span class="key">Unit:</span> <br><span class="key">Type:</span> <br><span class="key">Base:</span>  | conf/zapiperf/cdot/9.8.0/disk.yaml | 
+
+
+### shelf_power
+
+Power consumed by shelf in Watts.
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| REST | `NA` | `Harvest generated`<br><span class="key">Unit:</span> <br><span class="key">Type:</span> <br><span class="key">Base:</span>  | conf/restperf/9.12.0/disk.yaml | 
+| ZAPI | `NA` | `Harvest generated`<br><span class="key">Unit:</span> <br><span class="key">Type:</span> <br><span class="key">Base:</span>  | conf/zapiperf/cdot/9.8.0/disk.yaml | 
+
+
 ### snapmirror_break_failed_count
 
 The number of failed SnapMirror break operations for the relationship
@@ -9038,6 +9346,16 @@ Number of user-visible files (inodes) used. This field is valid only when the vo
 | REST | `api/private/cli/volume` | `files_used` | conf/rest/9.12.0/volume.yaml |
 
 
+### volume_inode_used_percent
+
+volume_inode_files_used / volume_inode_total
+
+| API    | Endpoint | Metric | Template |
+|--------|----------|--------|---------|
+| REST | `NA` | `Harvest generated` | conf/rest/9.12.0/volume.yaml |
+| ZAPI | `NA` | `Harvest generated` | conf/zapi/cdot/9.8.0/volume.yaml |
+
+
 ### volume_other_latency
 
 Average latency in microseconds for the WAFL filesystem to process other operations to the volume; not including request processing or network communication time
diff --git a/grafana/dashboards/cmode/aggregate.json b/grafana/dashboards/cmode/aggregate.json
index 81eb19a5..5e8b417e 100644
--- a/grafana/dashboards/cmode/aggregate.json
+++ b/grafana/dashboards/cmode/aggregate.json
@@ -3889,7 +3889,7 @@
               "refId": "D"
             }
           ],
-          "title": "Volume Space Used by Aggregate",
+          "title": "Top $TopResources Volumes by Space Used by Aggregate",
           "transformations": [],
           "type": "timeseries"
         },
@@ -3982,7 +3982,7 @@
               "refId": "A"
             }
           ],
-          "title": "Volume Space Used Percent",
+          "title": "Top $TopResources Volumes by Space Used %",
           "transformations": [],
           "type": "timeseries"
         },
@@ -4075,7 +4075,7 @@
               "refId": "A"
             }
           ],
-          "title": "Volume Snapshot Space Used",
+          "title": "Top $TopResources Volumes by Snapshot Space Used",
           "transformations": [],
           "type": "timeseries"
         },
@@ -4168,7 +4168,7 @@
               "refId": "C"
             }
           ],
-          "title": "Volume Snapshot Space Used Percent",
+          "title": "Top $TopResources Volumes by Snapshot Space Used %",
           "transformations": [],
           "type": "timeseries"
         }
diff --git a/grafana/dashboards/cmode/cdot.json b/grafana/dashboards/cmode/cdot.json
index 39326846..858c0232 100644
--- a/grafana/dashboards/cmode/cdot.json
+++ b/grafana/dashboards/cmode/cdot.json
@@ -187,7 +187,7 @@
               "refId": "A"
             }
           ],
-          "title": "CIFS Top IOPs by Cluster",
+          "title": "Top $TopResources CIFS IOPs by Cluster",
           "transformations": [],
           "type": "timeseries"
         },
@@ -277,7 +277,7 @@
               "refId": "A"
             }
           ],
-          "title": "NFS Top IOPs by Cluster",
+          "title": "Top $TopResources NFS IOPs by Cluster",
           "transformations": [],
           "type": "timeseries"
         },
@@ -367,7 +367,7 @@
               "refId": "A"
             }
           ],
-          "title": "Total Top IOPs by Cluster",
+          "title": "Top $TopResources Total IOPs by Cluster",
           "transformations": [],
           "type": "timeseries"
         },
@@ -460,7 +460,7 @@
               "refId": "A"
             }
           ],
-          "title": "Average CPU Utilization by Cluster",
+          "title": "Top $TopResources Clusters by Average CPU Utilization",
           "type": "timeseries"
         },
         {
@@ -550,7 +550,7 @@
               "refId": "A"
             }
           ],
-          "title": "Average Latency by Cluster",
+          "title": "Top $TopResources Clusters by Average Latency",
           "type": "timeseries"
         }
       ],
@@ -665,7 +665,7 @@
               "refId": "A"
             }
           ],
-          "title": "Top SVM capacity Used Percent",
+          "title": "Top $TopResources SVMs by Capacity Used %",
           "transformations": [
             {
               "id": "organize",
@@ -793,7 +793,7 @@
               "refId": "A"
             }
           ],
-          "title": "Top Volume Capacity Used Percent",
+          "title": "Top $TopResources Volumes by Capacity Used %",
           "transformations": [
             {
               "id": "organize",
@@ -921,7 +921,7 @@
               "refId": "A"
             }
           ],
-          "title": "Top Aggregate Capacity Used Percent",
+          "title": "Top $TopResources Aggregates by Capacity Used %",
           "transformations": [
             {
               "id": "organize",
@@ -1043,7 +1043,7 @@
               "refId": "A"
             }
           ],
-          "title": "Top SVM capacity Used Percent",
+          "title": "Top $TopResources SVMs by Capacity Used %",
           "type": "timeseries"
         },
         {
@@ -1130,7 +1130,7 @@
               "refId": "A"
             }
           ],
-          "title": "Top Volume Capacity Used Percent",
+          "title": "Top $TopResources Volumes by Capacity Used %",
           "type": "timeseries"
         },
         {
@@ -1217,7 +1217,7 @@
               "refId": "A"
             }
           ],
-          "title": "Top Aggregate Capacity Used Percent",
+          "title": "Top $TopResources Aggregates by Capacity Used %",
           "type": "timeseries"
         }
       ],
@@ -1598,7 +1598,7 @@
               "refId": "A"
             }
           ],
-          "title": "Top Average Latency by Volumes ",
+          "title": "Top $TopResources Volumes by Average Latency",
           "transformations": [],
           "type": "timeseries"
         },
@@ -1688,7 +1688,7 @@
               "refId": "A"
             }
           ],
-          "title": "Top Average Throughput by Volumes",
+          "title": "Top $TopResources Volumes by Average Throughput",
           "transformations": [],
           "type": "timeseries"
         },
@@ -1778,7 +1778,7 @@
               "refId": "A"
             }
           ],
-          "title": "Top IOPs by Volumes ",
+          "title": "Top $TopResources Volumes by IOPs",
           "transformations": [],
           "type": "timeseries"
         }
diff --git a/grafana/dashboards/cmode/cluster.json b/grafana/dashboards/cmode/cluster.json
index e0ac10a1..921282c3 100644
--- a/grafana/dashboards/cmode/cluster.json
+++ b/grafana/dashboards/cmode/cluster.json
@@ -174,7 +174,7 @@
           "refId": "A"
         }
       ],
-      "title": "Read Latency",
+      "title": "Top $TopResources Nodes by Read Latency",
       "transformations": [
         {
           "id": "organize",
@@ -272,7 +272,7 @@
           "refId": "A"
         }
       ],
-      "title": "Write Latency",
+      "title": "Top $TopResources Nodes by Write Latency",
       "transformations": [
         {
           "id": "organize",
@@ -370,7 +370,7 @@
           "refId": "A"
         }
       ],
-      "title": "Throughput",
+      "title": "Top $TopResources Nodes by Throughput",
       "transformations": [
         {
           "id": "organize",
@@ -468,7 +468,7 @@
           "refId": "A"
         }
       ],
-      "title": "IOPs",
+      "title": "Top $TopResources Nodes by IOPs",
       "transformations": [
         {
           "id": "organize",
@@ -566,7 +566,7 @@
           "refId": "A"
         }
       ],
-      "title": "CPU Utilization",
+      "title": "Top $TopResources Nodes by CPU Utilization",
       "transformations": [
         {
           "id": "organize",
@@ -664,7 +664,7 @@
           "refId": "A"
         }
       ],
-      "title": "Disk Utilization",
+      "title": "Top $TopResources Nodes by Disk Utilization",
       "transformations": [
         {
           "id": "organize",
@@ -779,7 +779,7 @@
           "refId": "A"
         }
       ],
-      "title": "Latency",
+      "title": "Top $TopResources Nodes by Latency",
       "type": "timeseries"
     },
     {
@@ -870,7 +870,7 @@
           "refId": "A"
         }
       ],
-      "title": "Throughput",
+      "title": "Top $TopResources Nodes by Throughput",
       "type": "timeseries"
     },
     {
@@ -961,7 +961,7 @@
           "refId": "A"
         }
       ],
-      "title": "IOPs",
+      "title": "Top $TopResources Nodes by IOPs",
       "type": "timeseries"
     },
     {
@@ -2791,7 +2791,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Top Nodes by Power Consumed",
+          "title": "Top $TopResources Nodes by Power Consumed",
           "type": "timeseries"
         },
         {
@@ -2881,7 +2881,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Top Nodes by Average Temperature",
+          "title": "Top $TopResources Nodes by Average Temperature",
           "type": "timeseries"
         }
       ],
diff --git a/grafana/dashboards/cmode/disk.json b/grafana/dashboards/cmode/disk.json
index 36bba112..c764e1b1 100644
--- a/grafana/dashboards/cmode/disk.json
+++ b/grafana/dashboards/cmode/disk.json
@@ -937,7 +937,7 @@
       ],
       "timeFrom": null,
       "timeShift": null,
-      "title": "Disk Utilization per Aggregate",
+      "title": "Top $TopResources Aggregates by Disk Utilization",
       "transformations": [
         {
           "id": "filterFieldsByName",
@@ -1045,7 +1045,7 @@
       ],
       "timeFrom": null,
       "timeShift": null,
-      "title": "Max Disk Utilization Per Aggregate",
+      "title": "Top $TopResources Aggregates by Max Disk Utilization",
       "type": "timeseries"
     },
     {
@@ -1134,7 +1134,7 @@
       ],
       "timeFrom": null,
       "timeShift": null,
-      "title": "Disk Transfers",
+      "title": "Top $TopResources Aggregates by Disk Transfers",
       "type": "timeseries"
     },
     {
@@ -1225,7 +1225,7 @@
           "refId": "A"
         }
       ],
-      "title": "User Read IOP Size",
+      "title": "Top $TopResources Aggregates by User Read IOP Size",
       "type": "timeseries"
     },
     {
@@ -1320,7 +1320,7 @@
           "refId": "A"
         }
       ],
-      "title": "User Write IOP Size",
+      "title": "Top $TopResources Aggregates by User Write IOP Size",
       "type": "timeseries"
     },
     {
diff --git a/grafana/dashboards/cmode/fsa.json b/grafana/dashboards/cmode/fsa.json
index cc3b0ebc..2c397350 100644
--- a/grafana/dashboards/cmode/fsa.json
+++ b/grafana/dashboards/cmode/fsa.json
@@ -528,7 +528,7 @@
           "refId": "A"
         }
       ],
-      "title": "Directory Growth",
+      "title": "Top $TopResources Volumes by Directory Growth",
       "type": "timeseries"
     },
     {
@@ -694,7 +694,7 @@
           "refId": "C"
         }
       ],
-      "title": "Explorer",
+      "title": "Top $TopResources Volumes by Directory Growth",
       "transformations": [
         {
           "id": "seriesToColumns",
diff --git a/grafana/dashboards/cmode/lun.json b/grafana/dashboards/cmode/lun.json
index fec80589..63c7ac85 100644
--- a/grafana/dashboards/cmode/lun.json
+++ b/grafana/dashboards/cmode/lun.json
@@ -164,7 +164,7 @@
       ],
       "timeFrom": null,
       "timeShift": null,
-      "title": "LUN Average Read Latency",
+      "title": "Top $TopResources Luns by Average Read Latency",
       "type": "stat"
     },
     {
@@ -228,7 +228,7 @@
       ],
       "timeFrom": null,
       "timeShift": null,
-      "title": "LUN Average Write Latency",
+      "title": "Top $TopResources Luns by Average Write Latency",
       "type": "stat"
     },
     {
@@ -284,7 +284,7 @@
       ],
       "timeFrom": null,
       "timeShift": null,
-      "title": "Total Read Throughput",
+      "title": "Top $TopResources Luns by Read Throughput",
       "type": "stat"
     },
     {
@@ -340,7 +340,7 @@
       ],
       "timeFrom": null,
       "timeShift": null,
-      "title": "Total Write Throughput",
+      "title": "Top $TopResources Luns by Write Throughput",
       "type": "stat"
     },
     {
@@ -396,7 +396,7 @@
       ],
       "timeFrom": null,
       "timeShift": null,
-      "title": "Total Read IOPs",
+      "title": "Top $TopResources Luns by Read IOPs",
       "type": "stat"
     },
     {
@@ -452,7 +452,7 @@
       ],
       "timeFrom": null,
       "timeShift": null,
-      "title": "Total Write IOPs",
+      "title": "Top $TopResources Luns by Write IOPs",
       "type": "stat"
     },
     {
@@ -536,7 +536,7 @@
               "refId": "A"
             }
           ],
-          "title": "Read Latency",
+          "title": "Top $TopResources Luns by Read Latency",
           "transformations": [
             {
               "id": "filterFieldsByName",
@@ -639,7 +639,7 @@
               "refId": "A"
             }
           ],
-          "title": "Read Throughput",
+          "title": "Top $TopResources Luns by Read Throughput",
           "transformations": [
             {
               "id": "filterFieldsByName",
@@ -742,7 +742,7 @@
               "refId": "A"
             }
           ],
-          "title": "Read IOPS",
+          "title": "Top $TopResources Luns by Read IOPS",
           "transformations": [
             {
               "id": "filterFieldsByName",
@@ -853,7 +853,7 @@
               "refId": "A"
             }
           ],
-          "title": "Write Latency",
+          "title": "Top $TopResources Luns by Write Latency",
           "transformations": [
             {
               "id": "filterFieldsByName",
@@ -956,7 +956,7 @@
               "refId": "A"
             }
           ],
-          "title": "Write Throughput",
+          "title": "Top $TopResources Luns by Write Throughput",
           "transformations": [
             {
               "id": "filterFieldsByName",
@@ -1059,7 +1059,7 @@
               "refId": "A"
             }
           ],
-          "title": "Write IOPS",
+          "title": "Top $TopResources Luns by Write IOPS",
           "transformations": [
             {
               "id": "filterFieldsByName",
@@ -1460,7 +1460,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Top Average Read Latency",
+          "title": "Top $TopResources Luns by Average Read Latency",
           "transformations": [],
           "type": "timeseries"
         },
@@ -1552,7 +1552,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Top Read Throughput",
+          "title": "Top $TopResources Luns by Read Throughput",
           "transformations": [],
           "type": "timeseries"
         },
@@ -1643,7 +1643,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Top Read IOPs",
+          "title": "Top $TopResources Luns by Read IOPs",
           "transformations": [],
           "type": "timeseries"
         },
@@ -1734,7 +1734,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Top Average Write Latency",
+          "title": "Top $TopResources Luns by Average Write Latency",
           "transformations": [],
           "type": "timeseries"
         },
@@ -1826,7 +1826,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Top Write Throughput",
+          "title": "Top $TopResources Luns by Write Throughput",
           "transformations": [],
           "type": "timeseries"
         },
@@ -1917,7 +1917,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Top Write IOPs",
+          "title": "Top $TopResources Luns by Write IOPs",
           "transformations": [],
           "type": "timeseries"
         }
@@ -2022,7 +2022,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Top LUN Write Misalignment Buckets",
+          "title": "Top $TopResources Luns by Write Misalignment Buckets",
           "transformations": [
             {
               "id": "organize",
@@ -2124,7 +2124,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Top LUN Read Misalignment Buckets",
+          "title": "Top $TopResources Luns by Read Misalignment Buckets",
           "transformations": [
             {
               "id": "organize",
@@ -2226,7 +2226,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Top LUN Indirect Access IOPS",
+          "title": "Top $TopResources Luns by Indirect Access IOPS",
           "transformations": [
             {
               "id": "organize",
@@ -2361,7 +2361,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Latency from Network",
+          "title": "Top $TopResources Volumes by Latency from Network",
           "type": "timeseries"
         },
         {
@@ -2452,7 +2452,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Latency from Throttle",
+          "title": "Top $TopResources Volumes by Latency from Throttle",
           "type": "timeseries"
         },
         {
@@ -2543,7 +2543,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Latency from Qos Min",
+          "title": "Top $TopResources Volumes by Latency from Qos Min",
           "type": "timeseries"
         },
         {
@@ -2633,7 +2633,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Latency from Cluster",
+          "title": "Top $TopResources Volumes by Latency from Cluster",
           "type": "timeseries"
         },
         {
@@ -2723,7 +2723,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Latency from Backend",
+          "title": "Top $TopResources Volumes by Latency from Backend",
           "type": "timeseries"
         },
         {
@@ -2814,7 +2814,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Latency from CP (Consistency Point)",
+          "title": "Top $TopResources Volumes by Latency from CP (Consistency Point)",
           "type": "timeseries"
         },
         {
@@ -2905,7 +2905,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Latency from Suspend",
+          "title": "Top $TopResources Volumes by Latency from Suspend",
           "type": "timeseries"
         },
         {
@@ -2996,7 +2996,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Latency from Cloud",
+          "title": "Top $TopResources Volumes by Latency from Cloud",
           "type": "timeseries"
         },
         {
@@ -3086,7 +3086,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Latency from Frontend",
+          "title": "Top $TopResources Volumes by Latency from Frontend",
           "type": "timeseries"
         },
         {
@@ -3176,7 +3176,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Latency from NVLog Mirroring",
+          "title": "Top $TopResources Volumes by Latency from NVLog Mirroring",
           "type": "timeseries"
         },
         {
@@ -3266,7 +3266,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Latency from Disk",
+          "title": "Top $TopResources Volumes by Latency from Disk",
           "type": "timeseries"
         }
       ],
@@ -3370,7 +3370,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Used Percent",
+          "title": "Top $TopResources Volumes by Used %",
           "type": "timeseries"
         },
         {
@@ -3460,7 +3460,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Snapshot Used Percent",
+          "title": "Top $TopResources Volumes by Snapshot Used %",
           "type": "timeseries"
         },
         {
@@ -3549,7 +3549,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Deduplication Percent Saved",
+          "title": "Top $TopResources Volumes by Deduplication Percent Saved",
           "type": "timeseries"
         },
         {
@@ -3639,7 +3639,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Compression Percent Saved",
+          "title": "Top $TopResources Volumes by Compression Percent Saved",
           "type": "timeseries"
         },
         {
@@ -3729,7 +3729,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "LUN Percent Most Filled",
+          "title": "Top $TopResources LUNs by Percent Most Filled",
           "transformations": [],
           "type": "timeseries"
         },
@@ -3820,7 +3820,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "LUN Percent Least Filled",
+          "title": "Top $TopResources LUNs by Percent Least Filled",
           "transformations": [],
           "type": "timeseries"
         }
diff --git a/grafana/dashboards/cmode/mcc_cluster.json b/grafana/dashboards/cmode/mcc_cluster.json
index 4cb176a6..f43075fe 100644
--- a/grafana/dashboards/cmode/mcc_cluster.json
+++ b/grafana/dashboards/cmode/mcc_cluster.json
@@ -1247,7 +1247,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Disk Utilization per Plex",
+          "title": "Top $TopResources Plexes by Disk Utilization",
           "type": "timeseries"
         },
         {
@@ -1337,7 +1337,7 @@
               "refId": "A"
             }
           ],
-          "title": "Disk Utilization per Plex Table",
+          "title": "Top $TopResources Plexes by Disk Utilization",
           "transformations": [
             {
               "id": "organize",
@@ -1451,7 +1451,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "User Reads per Disk per Plex",
+          "title": "Top $TopResources Plexes by User Reads",
           "type": "timeseries"
         },
         {
@@ -1546,7 +1546,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "User Writes per Disk per Plex",
+          "title": "Top $TopResources Plexes by User Writes",
           "type": "timeseries"
         },
         {
@@ -1639,7 +1639,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "User Read Latency per 4KB IO per Plex",
+          "title": "Top $TopResources Plexes by User Read Latency per 4KB IO",
           "type": "timeseries"
         },
         {
@@ -1728,7 +1728,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "User Write Latency per 4KB IO per Plex",
+          "title": "Top $TopResources Plexes by User Write Latency per 4KB IO",
           "type": "timeseries"
         }
       ],
@@ -1837,7 +1837,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Adapter Read Data",
+          "title": "Top $TopResources Adapters by Read Data",
           "type": "timeseries"
         },
         {
@@ -1930,7 +1930,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Adapter Write Data",
+          "title": "Top $TopResources Adapters by Write Data",
           "type": "timeseries"
         }
       ],
diff --git a/grafana/dashboards/cmode/network.json b/grafana/dashboards/cmode/network.json
index bc17253c..6e45a16a 100644
--- a/grafana/dashboards/cmode/network.json
+++ b/grafana/dashboards/cmode/network.json
@@ -1025,7 +1025,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Send Throughput",
+          "title": "Top $TopResources NICs by Send Throughput",
           "type": "timeseries"
         },
         {
@@ -1117,7 +1117,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Receive Throughput",
+          "title": "Top $TopResources NICs by Receive Throughput",
           "type": "timeseries"
         },
         {
@@ -1209,7 +1209,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Port Utilization %",
+          "title": "Top $TopResources NICs by Port Utilization %",
           "type": "timeseries"
         },
         {
@@ -1306,7 +1306,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Send Errors",
+          "title": "Top $TopResources NICs by Send Errors",
           "type": "timeseries"
         },
         {
@@ -1415,7 +1415,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Receive Errors",
+          "title": "Top $TopResources NICs by Receive Errors",
           "type": "timeseries"
         }
       ],
@@ -1757,7 +1757,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Send Throughput",
+          "title": "Top $TopResources FCPs by Send Throughput",
           "type": "timeseries"
         },
         {
@@ -1849,7 +1849,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Receive Throughput",
+          "title": "Top $TopResources FCPs by Receive Throughput",
           "type": "timeseries"
         },
         {
@@ -1942,7 +1942,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Send Latency",
+          "title": "Top $TopResources FCPs by Send Latency",
           "type": "timeseries"
         },
         {
@@ -2035,7 +2035,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Receive Latency",
+          "title": "Top $TopResources FCPs by Receive Latency",
           "type": "timeseries"
         },
         {
@@ -2155,7 +2155,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Transmission interrupts",
+          "title": "Top $TopResources FCPs by Transmission interrupts",
           "type": "timeseries"
         },
         {
@@ -2281,7 +2281,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Transmission errors",
+          "title": "Top $TopResources FCPs by Transmission errors",
           "type": "timeseries"
         },
         {
@@ -2373,7 +2373,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Link Down",
+          "title": "Top $TopResources FCPs by Link Down",
           "type": "timeseries"
         },
         {
@@ -2465,7 +2465,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Link Failure",
+          "title": "Top $TopResources FCPs by Link Failure",
           "type": "timeseries"
         }
       ],
@@ -2797,7 +2797,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Send Throughput",
+          "title": "Top $TopResources FCP_NVMFs by Send Throughput",
           "type": "timeseries"
         },
         {
@@ -2889,7 +2889,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Receive Throughput",
+          "title": "Top $TopResources FCP_NVMFs by Receive Throughput",
           "type": "timeseries"
         },
         {
@@ -2982,7 +2982,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Send Latency",
+          "title": "Top $TopResources FCP_NVMFs by Send Latency",
           "type": "timeseries"
         },
         {
@@ -3075,7 +3075,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Receive Latency",
+          "title": "Top $TopResources FCP_NVMFs by Receive Latency",
           "type": "timeseries"
         }
       ],
diff --git a/grafana/dashboards/cmode/node.json b/grafana/dashboards/cmode/node.json
index 5141b4dc..d14d83c9 100644
--- a/grafana/dashboards/cmode/node.json
+++ b/grafana/dashboards/cmode/node.json
@@ -1328,7 +1328,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Ethernet Port Utilization Percent",
+          "title": "Top $TopResources Ethernet Ports by Utilization %",
           "type": "timeseries"
         },
         {
@@ -1418,7 +1418,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "FC Port Utilization Percent",
+          "title": "Top $TopResources FC Ports by Utilization %",
           "type": "timeseries"
         },
         {
@@ -1508,7 +1508,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Ethernet Port Throughput",
+          "title": "Top $TopResources Ethernet Ports by Throughput",
           "type": "timeseries"
         },
         {
@@ -1598,7 +1598,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "FC Port Throughput",
+          "title": "Top $TopResources FC Ports by Throughput",
           "type": "timeseries"
         }
       ],
diff --git a/grafana/dashboards/cmode/power.json b/grafana/dashboards/cmode/power.json
index fe669b08..9554a83a 100644
--- a/grafana/dashboards/cmode/power.json
+++ b/grafana/dashboards/cmode/power.json
@@ -781,7 +781,7 @@
       ],
       "timeFrom": null,
       "timeShift": null,
-      "title": "Top Nodes by Power Consumed",
+      "title": "Top $TopResources Nodes by Power Consumed",
       "type": "timeseries"
     },
     {
@@ -871,7 +871,7 @@
       ],
       "timeFrom": null,
       "timeShift": null,
-      "title": "Top Nodes by Average Temperature",
+      "title": "Top $TopResources Nodes by Average Temperature",
       "type": "timeseries"
     },
     {
@@ -962,7 +962,7 @@
       ],
       "timeFrom": null,
       "timeShift": null,
-      "title": "Top Shelves by Power Consumed",
+      "title": "Top $TopResources Shelves by Power Consumed",
       "type": "timeseries"
     },
     {
@@ -1053,7 +1053,7 @@
       ],
       "timeFrom": null,
       "timeShift": null,
-      "title": "Top Shelves by Average Temperature",
+      "title": "Top $TopResources Shelves by Average Temperature",
       "type": "timeseries"
     },
     {
@@ -1144,7 +1144,7 @@
       ],
       "timeFrom": null,
       "timeShift": null,
-      "title": "Top Aggregates by Power Consumed",
+      "title": "Top $TopResources Aggregates by Power Consumed",
       "type": "timeseries"
     },
     {
@@ -1235,7 +1235,7 @@
       ],
       "timeFrom": null,
       "timeShift": null,
-      "title": "Total Power by Aggregate Disk Type",
+      "title": "Total $TopResources Aggregates by Power Disk Type",
       "type": "timeseries"
     },
     {
@@ -1334,7 +1334,7 @@
       ],
       "timeFrom": null,
       "timeShift": null,
-      "title": "IOPs for Top Aggregates by Power Consumed",
+      "title": "Top $TopResources Aggregates by IOPS per Power Consumed",
       "type": "timeseries"
     },
     {
diff --git a/grafana/dashboards/cmode/qtree.json b/grafana/dashboards/cmode/qtree.json
index 16b28e02..e073faa8 100644
--- a/grafana/dashboards/cmode/qtree.json
+++ b/grafana/dashboards/cmode/qtree.json
@@ -171,7 +171,7 @@
           "refId": "A"
         }
       ],
-      "title": "Top Average NFS IOPs",
+      "title": "Top $TopResources NFSs by IOPs",
       "type": "timeseries"
     },
     {
@@ -261,7 +261,7 @@
           "refId": "A"
         }
       ],
-      "title": "Top Average CIFS IOPs",
+      "title": "Top $TopResources CIFS by IOPs",
       "type": "timeseries"
     },
     {
@@ -351,7 +351,7 @@
           "refId": "A"
         }
       ],
-      "title": "Top Total Qtree IOPs",
+      "title": "Top $TopResources Qtrees by IOPs",
       "type": "timeseries"
     },
     {
@@ -441,7 +441,7 @@
           "refId": "A"
         }
       ],
-      "title": "Top Internal IOPs",
+      "title": "Top $TopResources Qtrees by Internal IOPs",
       "type": "timeseries"
     },
     {
@@ -539,7 +539,7 @@
               "refId": "A"
             }
           ],
-          "title": "Disk Used",
+          "title": "Top $TopResources Qtrees by Disk Used",
           "type": "timeseries"
         },
         {
@@ -626,7 +626,7 @@
               "refId": "A"
             }
           ],
-          "title": "Files Used",
+          "title": "Top $TopResources Qtrees by Files Used",
           "type": "timeseries"
         }
       ],
diff --git a/grafana/dashboards/cmode/shelf.json b/grafana/dashboards/cmode/shelf.json
index 94985249..0768cc93 100644
--- a/grafana/dashboards/cmode/shelf.json
+++ b/grafana/dashboards/cmode/shelf.json
@@ -679,7 +679,7 @@
           "refId": "B"
         }
       ],
-      "title": "Total Shelves by Power Consumed",
+      "title": "Top $TopResources Shelves by Power Consumed",
       "type": "timeseries"
     },
     {
@@ -768,7 +768,7 @@
           "refId": "A"
         }
       ],
-      "title": "Top Shelves by Average Temperature",
+      "title": "Top $TopResources Shelves by Average Temperature",
       "type": "timeseries"
     },
     {
diff --git a/grafana/dashboards/cmode/svm.json b/grafana/dashboards/cmode/svm.json
index 24fb000b..8e7cbda1 100644
--- a/grafana/dashboards/cmode/svm.json
+++ b/grafana/dashboards/cmode/svm.json
@@ -1051,7 +1051,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Read Latency",
+          "title": "Top $TopResources Volumes by Read Latency",
           "type": "timeseries"
         },
         {
@@ -1140,7 +1140,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Read Throughput",
+          "title": "Top $TopResources Volumes by Read Throughput",
           "type": "timeseries"
         },
         {
@@ -1229,7 +1229,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Read IOPs",
+          "title": "Top $TopResources Volumes by Read IOPs",
           "type": "timeseries"
         },
         {
@@ -1318,7 +1318,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Write Latency",
+          "title": "Top $TopResources Volumes by Write Latency",
           "type": "timeseries"
         },
         {
@@ -1407,7 +1407,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Write Throughput",
+          "title": "Top $TopResources Volumes by Write Throughput",
           "type": "timeseries"
         },
         {
@@ -1496,7 +1496,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Write IOPs",
+          "title": "Top $TopResources Volumes by Write IOPs",
           "type": "timeseries"
         }
       ],
@@ -1600,7 +1600,7 @@
               "refId": "A"
             }
           ],
-          "title": "NAS LIF Send Throughput",
+          "title": "Top $TopResources NAS LIFs by Send Throughput",
           "type": "timeseries"
         },
         {
@@ -1689,7 +1689,7 @@
               "refId": "A"
             }
           ],
-          "title": "NAS LIF Receive Throughput",
+          "title": "Top $TopResources NAS LIFs by Receive Throughput",
           "type": "timeseries"
         },
         {
@@ -1778,7 +1778,7 @@
               "refId": "A"
             }
           ],
-          "title": "NVMe/FC LIF Send Throughput",
+          "title": "Top $TopResources NVMe/FC LIFs by Send Throughput",
           "type": "timeseries"
         },
         {
@@ -1867,7 +1867,7 @@
               "refId": "A"
             }
           ],
-          "title": "NVMe/FC LIF Receive Throughput",
+          "title": "Top $TopResources NVMe/FC LIFs by Receive Throughput",
           "type": "timeseries"
         },
         {
@@ -1956,7 +1956,7 @@
               "refId": "A"
             }
           ],
-          "title": "iSCSI LIF Send Throughput",
+          "title": "Top $TopResources iSCSI LIFs by Send Throughput",
           "type": "timeseries"
         },
         {
@@ -2045,7 +2045,7 @@
               "refId": "A"
             }
           ],
-          "title": "iSCSI LIF Receive Throughput",
+          "title": "Top $TopResources iSCSI LIFs by Receive Throughput",
           "type": "timeseries"
         }
       ],
@@ -4078,7 +4078,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "FCP LIF Send Throughput",
+          "title": "Top $TopResources FCP LIFs by Send Throughput",
           "type": "timeseries"
         },
         {
@@ -4168,7 +4168,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "FCP LIF Receive Throughput",
+          "title": "Top $TopResources FCP LIFs by Receive Throughput",
           "type": "timeseries"
         }
       ],
@@ -4819,7 +4819,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "iSCSI LIF Send Throughput",
+          "title": "Top $TopResources iSCSI LIFs by Send Throughput",
           "type": "timeseries"
         },
         {
@@ -4909,7 +4909,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "iSCSI LIF Receive Throughput",
+          "title": "Top $TopResources iSCSI LIFs by Receive Throughput",
           "type": "timeseries"
         },
         {
@@ -6218,7 +6218,7 @@
               "refId": "Write Latency"
             }
           ],
-          "title": "NFSv3 Read and Write Latency",
+          "title": "Top $TopResources NFSv3 SVMs by Read and Write Latency",
           "type": "timeseries"
         },
         {
@@ -6318,7 +6318,7 @@
               "refId": "Total"
             }
           ],
-          "title": "NFSv3 Throughput",
+          "title": "Top $TopResources NFSv3 SVMs by Throughput",
           "type": "timeseries"
         },
         {
@@ -6417,7 +6417,7 @@
               "refId": "Total Ops"
             }
           ],
-          "title": "NFSv3 IOPs",
+          "title": "Top $TopResources NFSv3 SVMs by IOPs",
           "type": "timeseries"
         },
         {
@@ -7508,7 +7508,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "NFSv4 Read and Write Latency",
+          "title": "Top $TopResources NFSv4 SVMs by Read and Write Latency",
           "type": "timeseries"
         },
         {
@@ -7607,7 +7607,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "NFSv4 Throughput",
+          "title": "Top $TopResources NFSv4 SVMs by Throughput",
           "type": "timeseries"
         },
         {
@@ -7706,7 +7706,7 @@
               "refId": "Total Ops"
             }
           ],
-          "title": "NFSv4 IOPs",
+          "title": "Top $TopResources NFSv4 SVMs by IOPs",
           "type": "timeseries"
         },
         {
@@ -7796,7 +7796,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "NFSv4 Latency by Op Type",
+          "title": "Top $TopResources NFSv4 SVMs by Latency by Op Type",
           "transformations": [
             {
               "id": "renameByRegex",
@@ -7896,7 +7896,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "NFSv4 IOPs per Type",
+          "title": "Top $TopResources NFSv4 SVMs by IOPs per Type",
           "transformations": [
             {
               "id": "renameByRegex",
@@ -8808,7 +8808,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "NFSv4.1 Read and Write Latency",
+          "title": "Top $TopResources NFSv4.1 SVMs by Read and Write Latency",
           "type": "timeseries"
         },
         {
@@ -8907,7 +8907,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "NFSv4.1 Throughput",
+          "title": "Top $TopResources NFSv4.1 SVMs by Throughput",
           "type": "timeseries"
         },
         {
@@ -9013,7 +9013,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "NFSv4.1 IOPs",
+          "title": "Top $TopResources NFSv4.1 SVMs by IOPs",
           "type": "timeseries"
         },
         {
@@ -9104,7 +9104,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "NFSv4.1 Latency by Op Type",
+          "title": "Top $TopResources NFSv4.1 SVMs by Latency by Op Type",
           "transformations": [
             {
               "id": "renameByRegex",
@@ -9204,7 +9204,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "NFSv4.1 IOPs per Type",
+          "title": "Top $TopResources NFSv4.1 SVMs by IOPs per Type",
           "transformations": [
             {
               "id": "renameByRegex",
@@ -10185,7 +10185,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "SVM NVMe/FC LIF Send Throughput",
+          "title": "Top $TopResources SVM NVMe/FC LIFs by Send Throughput",
           "type": "timeseries"
         },
         {
@@ -10275,7 +10275,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "SVM NVMe/FC LIF Receive Throughput",
+          "title": "Top $TopResources SVM NVMe/FC LIFs by Receive Throughput",
           "type": "timeseries"
         }
       ],
@@ -11172,7 +11172,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "QoS Latency",
+          "title": "Top $TopResources SVMs by QoS Latency",
           "type": "timeseries"
         },
         {
@@ -11269,7 +11269,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "QoS Throughput",
+          "title": "Top $TopResources SVMs by QoS Throughput",
           "type": "timeseries"
         },
         {
@@ -11367,7 +11367,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "QoS IOPs",
+          "title": "Top $TopResources SVMs by QoS IOPs",
           "type": "timeseries"
         },
         {
@@ -11570,7 +11570,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Workload Latency from Network",
+          "title": "Top $TopResources Workloads by Latency from Network",
           "type": "timeseries"
         },
         {
@@ -11660,7 +11660,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Workload Latency from Throttle",
+          "title": "Top $TopResources Workloads by Latency from Throttle",
           "type": "timeseries"
         },
         {
@@ -11750,7 +11750,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Workload Latency from Frontend",
+          "title": "Top $TopResources Workloads by Latency from Frontend",
           "type": "timeseries"
         },
         {
@@ -11840,7 +11840,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Workload Latency from Backend",
+          "title": "Top $TopResources Workloads by Latency from Backend",
           "type": "timeseries"
         },
         {
@@ -11930,7 +11930,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Workload Latency from Cluster",
+          "title": "Top $TopResources Workloads by Latency from Cluster",
           "type": "timeseries"
         },
         {
@@ -12020,7 +12020,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Workload Latency from Disk",
+          "title": "Top $TopResources Workloads by Latency from Disk",
           "type": "timeseries"
         },
         {
@@ -12110,7 +12110,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Workload Latency from NVLog Mirroring",
+          "title": "Top $TopResources Workloads by Latency from NVLog Mirroring",
           "type": "timeseries"
         },
         {
@@ -12200,7 +12200,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Workload Latency from Suspend",
+          "title": "Top $TopResources Workloads by Latency from Suspend",
           "type": "timeseries"
         },
         {
@@ -12290,7 +12290,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Workload Latency from Cloud",
+          "title": "Top $TopResources Workloads by Latency from Cloud",
           "type": "timeseries"
         }
       ],
@@ -12393,7 +12393,7 @@
               "refId": "A"
             }
           ],
-          "title": "SVM Volume Percent Used",
+          "title": "Top $TopResources Volumes by % Used",
           "type": "timeseries"
         },
         {
@@ -12481,7 +12481,7 @@
               "refId": "A"
             }
           ],
-          "title": "SVM Volume Snapshot Reserve Percent Used",
+          "title": "Top $TopResources Volumes by Snapshot Reserve % Used",
           "type": "timeseries"
         },
         {
@@ -12569,7 +12569,7 @@
               "refId": "A"
             }
           ],
-          "title": "SVM Volume Deduplication Saved Percent",
+          "title": "Top $TopResources Volumes by Deduplication Saved %",
           "type": "timeseries"
         },
         {
@@ -12657,7 +12657,7 @@
               "refId": "A"
             }
           ],
-          "title": "SVM Volume Deduplication Savings",
+          "title": "Top $TopResources Volumes by Deduplication Savings",
           "type": "timeseries"
         },
         {
@@ -12746,7 +12746,7 @@
               "refId": "A"
             }
           ],
-          "title": "SVM Volume Compression Saved Percent",
+          "title": "Top $TopResources Volumes by Saved %",
           "type": "timeseries"
         },
         {
@@ -12835,7 +12835,7 @@
               "refId": "A"
             }
           ],
-          "title": "SVM Volume Compression Savings",
+          "title": "Top $TopResources Volumes by Compression Savings",
           "type": "timeseries"
         },
         {
@@ -12924,7 +12924,7 @@
               "refId": "A"
             }
           ],
-          "title": "SVM Volume Total Efficiency Savings",
+          "title": "Top $TopResources Volumes by Total Efficiency Savings",
           "type": "timeseries"
         }
       ],
diff --git a/grafana/dashboards/cmode/volume.json b/grafana/dashboards/cmode/volume.json
index bf3e74dc..d39bd4dd 100644
--- a/grafana/dashboards/cmode/volume.json
+++ b/grafana/dashboards/cmode/volume.json
@@ -222,7 +222,7 @@
       ],
       "timeFrom": null,
       "timeShift": null,
-      "title": "Volume Total Throughput",
+      "title": "Top $TopResources Volumes Total Throughput",
       "type": "stat"
     },
     {
@@ -277,7 +277,7 @@
       ],
       "timeFrom": null,
       "timeShift": null,
-      "title": "Volume Total IOPs",
+      "title": "Top $TopResources Volumes by Total IOPs",
       "type": "stat"
     },
     {
@@ -367,7 +367,7 @@
       ],
       "timeFrom": null,
       "timeShift": null,
-      "title": "Volume Top Average Latency",
+      "title": "Top $TopResources Volumes by Average Latency",
       "transformations": [],
       "type": "timeseries"
     },
@@ -458,7 +458,7 @@
       ],
       "timeFrom": null,
       "timeShift": null,
-      "title": "Volume Top Average Throughput",
+      "title": "Top $TopResources Volumes by Average Throughput",
       "transformations": [],
       "type": "timeseries"
     },
@@ -549,7 +549,7 @@
       ],
       "timeFrom": null,
       "timeShift": null,
-      "title": "Volume Top IOPs",
+      "title": "Top $TopResources Volumes by IOPs",
       "transformations": [],
       "type": "timeseries"
     },
@@ -1010,7 +1010,7 @@
               "refId": "A"
             }
           ],
-          "title": "Top Volume Read Latency",
+          "title": "Top $TopResources Volumes by Read Latency",
           "transformations": [
             {
               "id": "calculateField",
@@ -1121,7 +1121,7 @@
               "refId": "A"
             }
           ],
-          "title": "Top Volume Read Throughput",
+          "title": "Top $TopResources Volumes by Read Throughput",
           "transformations": [
             {
               "id": "calculateField",
@@ -1232,7 +1232,7 @@
               "refId": "A"
             }
           ],
-          "title": "Top Volume Read IOPS",
+          "title": "Top $TopResources Volumes by Read IOPS",
           "transformations": [
             {
               "id": "calculateField",
@@ -1350,7 +1350,7 @@
               "refId": "A"
             }
           ],
-          "title": "Top Volume Write Latency",
+          "title": "Top $TopResources Volumes by Write Latency",
           "transformations": [
             {
               "id": "calculateField",
@@ -1461,7 +1461,7 @@
               "refId": "A"
             }
           ],
-          "title": "Top Volume Write Throughput",
+          "title": "Top $TopResources Volumes by Write Throughput",
           "transformations": [
             {
               "id": "calculateField",
@@ -1572,7 +1572,7 @@
               "refId": "A"
             }
           ],
-          "title": "Top Volume Write IOPS",
+          "title": "Top $TopResources Volumes by Write IOPS",
           "transformations": [
             {
               "id": "calculateField",
@@ -1723,7 +1723,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Read Latency",
+          "title": "Top $TopResources Volumes by Read Latency",
           "transformations": [],
           "type": "timeseries"
         },
@@ -1814,7 +1814,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Read Throughput",
+          "title": "Top $TopResources Volumes by Read Throughput",
           "transformations": [],
           "type": "timeseries"
         },
@@ -1904,7 +1904,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Read IOPs",
+          "title": "Top $TopResources Volumes by Read IOPs",
           "transformations": [],
           "type": "timeseries"
         },
@@ -1994,7 +1994,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Write Latency",
+          "title": "Top $TopResources Volumes by Write Latency",
           "transformations": [],
           "type": "timeseries"
         },
@@ -2084,7 +2084,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Write Throughput",
+          "title": "Top $TopResources Volumes by Write Throughput",
           "transformations": [],
           "type": "timeseries"
         },
@@ -2174,7 +2174,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Write IOPs",
+          "title": "Top $TopResources Volumes by Write IOPs",
           "transformations": [],
           "type": "timeseries"
         }
@@ -2280,7 +2280,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "QoS Volume Read Latency",
+          "title": "Top $TopResources Volumes by QoS Volume Read Latency",
           "type": "timeseries"
         },
         {
@@ -2370,7 +2370,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "QoS Volume Read Throughput",
+          "title": "Top $TopResources Volumes by QoS Volume Read Throughput",
           "type": "timeseries"
         },
         {
@@ -2460,7 +2460,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "QoS Volume Read IOPS",
+          "title": "Top $TopResources Volumes by QoS Volume Read IOPS",
           "type": "timeseries"
         },
         {
@@ -2550,7 +2550,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "QoS Volume Write Latency",
+          "title": "Top $TopResources Volumes by QoS Volume Write Latency",
           "type": "timeseries"
         },
         {
@@ -2640,7 +2640,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "QoS Volume Write Throughput",
+          "title": "Top $TopResources Volumes by QoS Volume Write Throughput",
           "type": "timeseries"
         },
         {
@@ -2730,7 +2730,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "QoS Volume Write IOPS",
+          "title": "Top $TopResources Volumes by QoS Volume Write IOPS",
           "type": "timeseries"
         },
         {
@@ -2819,7 +2819,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "QoS Volume Sequential Reads",
+          "title": "Top $TopResources Volumes by QoS Volume Sequential Reads",
           "type": "timeseries"
         },
         {
@@ -2908,7 +2908,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "QoS Volume Sequential Writes",
+          "title": "Top $TopResources Volumes by QoS Volume Sequential Writes",
           "type": "timeseries"
         }
       ],
@@ -3030,7 +3030,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Latency from Network",
+          "title": "Top $TopResources Volumes by Latency from Network",
           "type": "timeseries"
         },
         {
@@ -3121,7 +3121,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Latency from Throttle",
+          "title": "Top $TopResources Volumes by Latency from Throttle",
           "type": "timeseries"
         },
         {
@@ -3212,7 +3212,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Latency from Qos Min",
+          "title": "Top $TopResources Volumes by Latency from Qos Min",
           "type": "timeseries"
         },
         {
@@ -3302,7 +3302,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Latency from Cluster",
+          "title": "Top $TopResources Volumes by Latency from Cluster",
           "type": "timeseries"
         },
         {
@@ -3392,7 +3392,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Latency from Backend",
+          "title": "Top $TopResources Volumes by Latency from Backend",
           "type": "timeseries"
         },
         {
@@ -3483,7 +3483,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Latency from CP (Consistency Point)",
+          "title": "Top $TopResources Volumes by Latency from CP (Consistency Point)",
           "type": "timeseries"
         },
         {
@@ -3574,7 +3574,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Latency from Suspend",
+          "title": "Top $TopResources Volumes by Latency from Suspend",
           "type": "timeseries"
         },
         {
@@ -3665,7 +3665,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Latency from Cloud",
+          "title": "Top $TopResources Volumes by Latency from Cloud",
           "type": "timeseries"
         },
         {
@@ -3755,7 +3755,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Latency from Frontend",
+          "title": "Top $TopResources Volumes by Latency from Frontend",
           "type": "timeseries"
         },
         {
@@ -3845,7 +3845,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Latency from NVLog Mirroring",
+          "title": "Top $TopResources Volumes by Latency from NVLog Mirroring",
           "type": "timeseries"
         },
         {
@@ -3935,7 +3935,7 @@
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Volume Latency from Disk",
+          "title": "Top $TopResources Volumes by Latency from Disk",
           "type": "timeseries"
         }
       ],
@@ -4499,7 +4499,7 @@
               "refId": "A"
             }
           ],
-          "title": "Object Storage GET Latency",
+          "title": "Top $TopResources Volumes by Object Storage GET Latency",
           "transformations": [],
           "type": "timeseries"
         },
@@ -4591,7 +4591,7 @@
               "refId": "A"
             }
           ],
-          "title": "Object Storage GET Request Count",
+          "title": "Top $TopResources Volumes by Object Storage GET Request Count",
           "transformations": [],
           "type": "timeseries"
         },
@@ -4682,7 +4682,7 @@
               "refId": "A"
             }
           ],
-          "title": "Object Storage PUT Latency",
+          "title": "Top $TopResources Volumes by Object Storage PUT Latency",
           "transformations": [],
           "type": "timeseries"
         },
@@ -4774,7 +4774,7 @@
               "refId": "A"
             }
           ],
-          "title": "Object Storage PUT Request Count",
+          "title": "Top $TopResources Volumes by Object Storage PUT Request Count",
           "transformations": [],
           "type": "timeseries"
         },
@@ -4841,7 +4841,7 @@
               "refId": "A"
             }
           ],
-          "title": "Top Volumes with Object Storage Requests",
+          "title": "Top $TopResources Volumes by Object Storage Requests",
           "transformations": [
             {
               "id": "organize",
@@ -4969,7 +4969,7 @@
               "refId": "A"
             }
           ],
-          "title": "Inode Files Used",
+          "title": "Top $TopResources Volumes by Inode Files Used",
           "type": "timeseries"
         },
         {
@@ -5055,7 +5055,7 @@
               "refId": "A"
             }
           ],
-          "title": "Inode Files Total",
+          "title": "Top $TopResources Volumes by Inode Files Total",
           "type": "timeseries"
         },
         {
@@ -5142,7 +5142,7 @@
               "refId": "A"
             }
           ],
-          "title": "Inode Files Used Percentage",
+          "title": "Top $TopResources Volumes by Inode Files Used Percentage",
           "type": "timeseries"
         }
       ],


Test patch:
diff --git a/cmd/tools/grafana/dashboard_test.go b/cmd/tools/grafana/dashboard_test.go
index 5262d88c..6654bd3f 100644
--- a/cmd/tools/grafana/dashboard_test.go
+++ b/cmd/tools/grafana/dashboard_test.go
@@ -119,6 +119,7 @@ type override struct {
 type expression struct {
 	metric string
 	refID  string
+	kind   string
 }
 type units struct {
 	units map[string][]*metricLoc
@@ -378,7 +379,7 @@ func checkUnusedVariables(t *testing.T, path string, data []byte) {
 varLoop:
 	for _, variable := range vars {
 		for _, expr := range expressions {
-			if strings.Contains(expr, variable) {
+			if strings.Contains(expr.metric, variable) {
 				continue varLoop
 			}
 		}
@@ -392,25 +393,25 @@ varLoop:
 	}
 }
 
-func allExpressions(data []byte) []string {
-	expressions := make([]string, 0)
+func allExpressions(data []byte) []expression {
+	exprs := make([]expression, 0)
 	gjson.GetBytes(data, "panels").ForEach(func(key, value gjson.Result) bool {
-		doExpr("", key, value, func(path string, expr string) {
-			expressions = append(expressions, expr)
+		doExpr("", key, value, func(expr expression) {
+			exprs = append(exprs, expr)
 		})
 		value.Get("panels").ForEach(func(key2, value2 gjson.Result) bool {
 			pathPrefix := fmt.Sprintf("panels[%d].", key.Int())
-			doExpr(pathPrefix, key2, value2, func(path string, expr string) {
-				expressions = append(expressions, expr)
+			doExpr(pathPrefix, key2, value2, func(expr expression) {
+				exprs = append(exprs, expr)
 			})
 			return true
 		})
 		return true
 	})
-	return expressions
+	return exprs
 }
 
-func doExpr(pathPrefix string, key gjson.Result, value gjson.Result, exprFunc func(path string, expr string)) {
+func doExpr(pathPrefix string, key gjson.Result, value gjson.Result, exprFunc func(exp expression)) {
 	kind := value.Get("type").String()
 	if kind == "row" {
 		return
@@ -420,7 +421,11 @@ func doExpr(pathPrefix string, key gjson.Result, value gjson.Result, exprFunc fu
 	for i, targetN := range targetsSlice {
 		expr := targetN.Get("expr").String()
 		pathWithTarget := path + ".targets[" + strconv.Itoa(i) + "]"
-		exprFunc(pathWithTarget, expr)
+		exprFunc(expression{
+			refID:  pathWithTarget,
+			metric: expr,
+			kind:   kind,
+		})
 	}
 }
 
@@ -717,8 +722,46 @@ func TestRatesAreNot1m(t *testing.T) {
 func checkRate1m(t *testing.T, path string, data []byte) {
 	expressions := allExpressions(data)
 	for _, expr := range expressions {
-		if strings.Contains(expr, "[1m]") {
+		if strings.Contains(expr.metric, "[1m]") {
 			t.Errorf("dashboard=%s, expr should not use rate of [1m] expr=%s", path, expr)
 		}
 	}
 }
+
+func TestTitlesOfTopN(t *testing.T) {
+	visitDashboards(
+		[]string{"../../../grafana/dashboards/cmode", "../../../grafana/dashboards/storagegrid"},
+		func(path string, data []byte) {
+			checkTitlesOfTopN(t, shortPath(path), data)
+		},
+	)
+}
+
+func checkTitlesOfTopN(t *testing.T, path string, data []byte) {
+	expressions := allExpressions(data)
+	for _, expr := range expressions {
+		if !strings.Contains(expr.metric, "topk") || expr.kind == "stat" {
+			continue
+		}
+		titleRef := asTitle(expr.refID)
+		title := gjson.GetBytes(data, titleRef)
+
+		// Check that the title contains are variable
+		if !strings.Contains(title.String(), "$") {
+			t.Errorf("dashboard=%s, title=%s at=%s does not include TopResource var", path, title, titleRef)
+		}
+	}
+}
+
+func asTitle(id string) string {
+	// Replace the last segment with title and gjson-ify the path
+	// This `panels[26].panels[0].targets[0]` becomes `panels.26.panels.0.title`
+	splits := strings.Split(id, ".")
+	if len(splits) < 2 {
+		return id
+	}
+	splits[len(splits)-1] = "title"
+	path := strings.Join(splits, ".")
+	replacer := strings.NewReplacer("[", ".", "]", "")
+	return replacer.Replace(path)
+}
diff --git a/cmd/tools/grafana/grafana_test.go b/cmd/tools/grafana/grafana_test.go
index 4585b073..833d35c9 100644
--- a/cmd/tools/grafana/grafana_test.go
+++ b/cmd/tools/grafana/grafana_test.go
@@ -120,13 +120,13 @@ func getExp(expr string, expressions *[]string) {
 func readExprs(data []byte) []string {
 	expressions := make([]string, 0)
 	gjson.GetBytes(data, "panels").ForEach(func(key, value gjson.Result) bool {
-		doExpr("", key, value, func(path string, expr string) {
-			getExp(expr, &expressions)
+		doExpr("", key, value, func(anExpr expression) {
+			getExp(anExpr.metric, &expressions)
 		})
 		value.Get("panels").ForEach(func(key2, value2 gjson.Result) bool {
 			pathPrefix := fmt.Sprintf("panels[%d].", key.Int())
-			doExpr(pathPrefix, key2, value2, func(path string, expr string) {
-				getExp(expr, &expressions)
+			doExpr(pathPrefix, key2, value2, func(anExpr expression) {
+				getExp(anExpr.metric, &expressions)
 			})
 			return true
 		})