Repository: NetApp/harvest
Pull request #1788 (2023-03-01 12:38:32)

fix: backward compatibility for qtree metrics in rest
Tested with REST collector, 
metrics behaviour in Harvest 22.05 

**qtree_labels:**
<img width="1766" alt="image" src="https://user-images.githubusercontent.com/83282894/222110191-f9b3ebaa-ada7-4af4-9c65-167ebaf5f6e4.png">

**qtree_disk_limit:**
<img width="1775" alt="image" src="https://user-images.githubusercontent.com/83282894/222110481-376ae82b-7b6b-44f5-8a45-190dc70a0043.png">

**quota_disk_limit:**
<img width="1778" alt="image" src="https://user-images.githubusercontent.com/83282894/222110574-478c96b8-c619-43ea-95c4-fa0070f7fe12.png">


metrics behaviour in latest Harvest
Case1: **Same behaviour as Harvest 22.05**
with hidden key-val pair

**qtree_labels:**
<img width="1763" alt="image" src="https://user-images.githubusercontent.com/83282894/222138666-f4e83ff6-558f-4d9f-b2a9-ddae4998aa8a.png">

**qtree_disk_limit:**
<img width="1762" alt="image" src="https://user-images.githubusercontent.com/83282894/222138576-2243c286-d343-41a1-8c4c-d2d26aae6007.png">

**quota_disk_limit:**
<img width="1769" alt="image" src="https://user-images.githubusercontent.com/83282894/222138612-b44a1a21-f110-48cb-af1c-6a5c851539e9.png">



Case2: **Current Harvest behaviour**
without hidden key-val pair:

**qtree_labels:**
<img width="1778" alt="image" src="https://user-images.githubusercontent.com/83282894/222127756-89de5c9c-43e8-4c30-91a5-da4c9432a02d.png">


**qtree_disk_limit:**
<img width="1774" alt="image" src="https://user-images.githubusercontent.com/83282894/222127846-df7ebff9-869f-4c5e-ad81-2396d723b230.png">


**quota_disk_limit:**
<img width="1772" alt="image" src="https://user-images.githubusercontent.com/83282894/222127910-f04045d4-262d-4686-8dec-dcbf7f5d7dc1.png">



Patch:
diff --git a/cmd/collectors/rest/plugins/qtree/qtree.go b/cmd/collectors/rest/plugins/qtree/qtree.go
index 35b6ab62..2609fc9c 100644
--- a/cmd/collectors/rest/plugins/qtree/qtree.go
+++ b/cmd/collectors/rest/plugins/qtree/qtree.go
@@ -12,6 +12,7 @@ import (
 	"github.com/netapp/harvest/v2/pkg/dict"
 	"github.com/netapp/harvest/v2/pkg/errs"
 	"github.com/netapp/harvest/v2/pkg/matrix"
+	"github.com/netapp/harvest/v2/pkg/tree/node"
 	"github.com/netapp/harvest/v2/pkg/util"
 	"github.com/tidwall/gjson"
 	"strconv"
@@ -21,12 +22,13 @@ import (
 
 type Qtree struct {
 	*plugin.AbstractPlugin
-	data           *matrix.Matrix
-	instanceKeys   map[string]string
-	instanceLabels map[string]*dict.Dict
-	client         *rest.Client
-	query          string
-	quotaType      []string
+	data             *matrix.Matrix
+	instanceKeys     map[string]string
+	instanceLabels   map[string]*dict.Dict
+	client           *rest.Client
+	query            string
+	quotaType        []string
+	historicalLabels bool // supports labels, metrics for 22.05
 }
 
 func New(p *plugin.AbstractPlugin) plugin.Plugin {
@@ -77,6 +79,35 @@ func (my *Qtree) Init() error {
 	my.data = matrix.New(my.Parent+".Qtree", "quota", "quota")
 	my.instanceKeys = make(map[string]string)
 	my.instanceLabels = make(map[string]*dict.Dict)
+	my.historicalLabels = false
+
+	if my.Params.HasChildS("historicalLabels") {
+		exportOptions := node.NewS("export_options")
+		instanceKeys := exportOptions.NewChildS("instance_keys", "")
+
+		// apply all instance keys, instance labels from parent (qtree.yaml) to all quota metrics
+		if exportOption := my.ParentParams.GetChildS("export_options"); exportOption != nil {
+			//parent instancekeys would be added in plugin metrics
+			if parentKeys := exportOption.GetChildS("instance_keys"); parentKeys != nil {
+				for _, parentKey := range parentKeys.GetAllChildContentS() {
+					instanceKeys.NewChildS("", parentKey)
+				}
+			}
+			// parent instacelabels would be added in plugin metrics
+			if parentLabels := exportOption.GetChildS("instance_labels"); parentLabels != nil {
+				for _, parentLabel := range parentLabels.GetAllChildContentS() {
+					instanceKeys.NewChildS("", parentLabel)
+				}
+			}
+		}
+
+		instanceKeys.NewChildS("", "type")
+		instanceKeys.NewChildS("", "index")
+		instanceKeys.NewChildS("", "unit")
+
+		my.data.SetExportOptions(exportOptions)
+		my.historicalLabels = true
+	}
 
 	quotaType := my.Params.GetChildS("quotaType")
 	if quotaType != nil {
@@ -119,6 +150,15 @@ func (my *Qtree) Run(data *matrix.Matrix) ([]*matrix.Matrix, error) {
 
 	filter := []string{"return_unmatched_nested_array_objects=true", "show_default_records=false", "type=" + strings.Join(my.quotaType[:], "|")}
 
+	// In 22.05, all qtrees were exported
+	if my.historicalLabels {
+		for _, qtreeInstance := range data.GetInstances() {
+			qtreeInstance.SetExportable(true)
+		}
+		// In 22.05, we would need default records as well.
+		filter = []string{"return_unmatched_nested_array_objects=true", "show_default_records=true", "type=" + strings.Join(my.quotaType[:], "|")}
+	}
+
 	href := rest.BuildHref("", "*", filter, "", "", "", "", my.query)
 
 	if result, err = collectors.InvokeRestCall(my.client, href, my.Logger); err != nil {
@@ -128,12 +168,132 @@ func (my *Qtree) Run(data *matrix.Matrix) ([]*matrix.Matrix, error) {
 	quotaCount := 0
 	cluster, _ := data.GetGlobalLabels().GetHas("cluster")
 
+	if my.historicalLabels {
+		// In 22.05, populate metrics with qtree prefix and old labels
+		err = my.handlingHistoricalMetrics(result, data, cluster, &quotaCount, &numMetrics)
+	} else {
+		// Populate metrics with quota prefix and current labels
+		err = my.handlingQuotaMetrics(result, cluster, &quotaCount, &numMetrics)
+	}
+
+	if err != nil {
+		return nil, err
+	}
+
+	my.Logger.Info().
+		Int("numQuotas", quotaCount).
+		Int("metrics", numMetrics).
+		Msg("Collected")
+
+	// metrics with qtree prefix and quota prefix are available to support backward compatibility
+	qtreePluginData := my.data.Clone(true, true, true)
+	qtreePluginData.UUID = my.Parent + ".Qtree"
+	qtreePluginData.Object = "qtree"
+	qtreePluginData.Identifier = "qtree"
+	return []*matrix.Matrix{qtreePluginData, my.data}, nil
+}
+
+func (my Qtree) handlingHistoricalMetrics(result []gjson.Result, data *matrix.Matrix, cluster string, quotaIndex *int, numMetrics *int) error {
+	for _, quota := range result {
+		var tree string
+		var quotaInstance *matrix.Instance
+		var err error
+
+		if !quota.IsObject() {
+			my.Logger.Error().Str("type", quota.Type.String()).Msg("Quota is not an object, skipping")
+			return errs.New(errs.ErrNoInstance, "quota is not an object")
+		}
+
+		if quota.Get("qtree.name").Exists() {
+			tree = quota.Get("qtree.name").String()
+		}
+		volume := quota.Get("volume.name").String()
+		vserver := quota.Get("svm.name").String()
+		qIndex := quota.Get("index").String()
+		quotaType := quota.Get("type").String()
+
+		// If quota-type is not a tree, then skip
+		if quotaType != "tree" {
+			my.Logger.Trace().Str("quotaType", quotaType).Msg("Quota is not tree type, skipping")
+			continue
+		}
+
+		// Ex. InstanceKey: vserver1vol1qtree15989279
+		quotaInstanceKey := vserver + volume + tree + qIndex
+
+		if quotaInstance = my.data.GetInstance(quotaInstanceKey); quotaInstance == nil {
+			if quotaInstance, err = my.data.NewInstance(quotaInstanceKey); err != nil {
+				my.Logger.Error().Stack().Err(err).Str("quotaInstanceKey", quotaInstanceKey).Msg("Failed to create quota instance")
+				return err
+			}
+			my.Logger.Debug().Msgf("add (%s) quota instance: %s.%s.%s.%s", quotaInstanceKey, vserver, volume, tree, qIndex)
+		}
+
+		qtreeInstance := data.GetInstance(vserver + volume + tree)
+		if qtreeInstance == nil {
+			my.Logger.Warn().
+				Str("tree", tree).
+				Str("volume", volume).
+				Str("vserver", vserver).
+				Msg("No instance matching tree.volume.vserver")
+			continue
+		}
+
+		if !qtreeInstance.IsExportable() {
+			continue
+		}
+
+		for _, label := range my.data.GetExportOptions().GetChildS("instance_keys").GetAllChildContentS() {
+			if value := qtreeInstance.GetLabel(label); value != "" {
+				quotaInstance.SetLabel(label, value)
+			}
+		}
+
+		//set labels
+		quotaInstance.SetLabel("type", quotaType)
+		quotaInstance.SetLabel("qtree", tree)
+		quotaInstance.SetLabel("volume", volume)
+		quotaInstance.SetLabel("svm", vserver)
+		quotaInstance.SetLabel("index", cluster+"_"+strconv.Itoa(*quotaIndex))
+
+		// If the Qtree is the volume itself, than qtree label is empty, so copy the volume name to qtree.
+		if tree == "" {
+			quotaInstance.SetLabel("qtree", volume)
+		}
+
+		*quotaIndex++
+		for attribute, m := range my.data.GetMetrics() {
+			value := 0.0
+
+			if attrValue := quota.Get(attribute); attrValue.Exists() {
+				// space limits are in bytes, converted to kilobytes
+				if attribute == "space.hard_limit" || attribute == "space.soft_limit" {
+					value = attrValue.Float() / 1024
+					quotaInstance.SetLabel("unit", "Kbyte")
+				} else {
+					value = attrValue.Float()
+				}
+			}
+
+			// populate numeric data
+			if err = m.SetValueFloat64(quotaInstance, value); err != nil {
+				my.Logger.Error().Stack().Err(err).Str("attribute", attribute).Float64("value", value).Msg("Failed to parse value")
+			} else {
+				*numMetrics++
+				my.Logger.Debug().Str("attribute", attribute).Float64("value", value).Msg("added value")
+			}
+		}
+	}
+	return nil
+}
+
+func (my Qtree) handlingQuotaMetrics(result []gjson.Result, cluster string, quotaCount *int, numMetrics *int) error {
 	for quotaIndex, quota := range result {
 		var tree string
 
 		if !quota.IsObject() {
 			my.Logger.Error().Str("type", quota.Type.String()).Msg("Quota is not an object, skipping")
-			return nil, errs.New(errs.ErrNoInstance, "quota is not an object")
+			return errs.New(errs.ErrNoInstance, "quota is not an object")
 		}
 
 		if quota.Get("qtree.name").Exists() {
@@ -145,7 +305,7 @@ func (my *Qtree) Run(data *matrix.Matrix) ([]*matrix.Matrix, error) {
 		uName := quota.Get("users.0.name").String()
 		uid := quota.Get("users.0.id").String()
 		group := quota.Get("group.name").String()
-		quotaCount++
+		*quotaCount++
 
 		for attribute, m := range my.data.GetMetrics() {
 			// set -1 for unlimited
@@ -156,7 +316,7 @@ func (my *Qtree) Run(data *matrix.Matrix) ([]*matrix.Matrix, error) {
 			quotaInstance, err := my.data.NewInstance(quotaInstanceKey)
 			if err != nil {
 				my.Logger.Debug().Msgf("add (%s) instance: %v", attribute, err)
-				return nil, err
+				return err
 			}
 			//set labels
 			quotaInstance.SetLabel("type", quotaType)
@@ -192,22 +352,10 @@ func (my *Qtree) Run(data *matrix.Matrix) ([]*matrix.Matrix, error) {
 			if err = m.SetValueFloat64(quotaInstance, value); err != nil {
 				my.Logger.Error().Stack().Err(err).Str("attribute", attribute).Float64("value", value).Msg("Failed to parse value")
 			} else {
-				numMetrics++
+				*numMetrics++
 				my.Logger.Trace().Str("attribute", attribute).Float64("value", value).Msg("added value")
 			}
 		}
-
 	}
-
-	my.Logger.Info().
-		Int("numQuotas", quotaCount).
-		Int("metrics", numMetrics).
-		Msg("Collected")
-
-	// This would generate quota metrics prefix with `qtree_`. These are deprecated now and will be removed later.
-	qtreePluginData := my.data.Clone(true, true, true)
-	qtreePluginData.UUID = my.Parent + ".Qtree"
-	qtreePluginData.Object = "qtree"
-	qtreePluginData.Identifier = "qtree"
-	return []*matrix.Matrix{qtreePluginData, my.data}, nil
+	return nil
 }
diff --git a/conf/zapiperf/cdot/9.8.0/smb2.yaml b/conf/zapiperf/cdot/9.8.0/smb2.yaml
new file mode 100644
index 00000000..c859f506
--- /dev/null
+++ b/conf/zapiperf/cdot/9.8.0/smb2.yaml
@@ -0,0 +1,52 @@
+name:                     SMB2
+query:                    smb2
+object:                   smb2
+
+counters:
+  - instance_uuid
+  - node_name          => node
+  - vserver_name       => svm
+  - read_ops
+  - write_ops
+  - read_latency
+  - write_latency
+  - negotiate_ops
+  - session_setup_ops
+  - tree_connect_ops
+  - create_ops
+  - close_ops
+  - lock_ops
+  - query_directory_ops
+  - query_info_ops
+  - set_info_ops
+  - oplock_break_ops
+  - negotiate_latency
+  - session_setup_latency
+  - tree_connect_latency
+  - create_latency
+  - close_latency
+  - lock_latency
+  - query_directory_latency
+  - query_info_latency
+  - set_info_latency
+  - oplock_break_latency
+  - session_setup_latency_histogram
+  - create_latency_histogram
+  - close_latency_histogram
+  - lock_latency_histogram
+  - query_directory_latency_histogram
+  - query_info_latency_histogram
+  - set_info_latency_histogram
+  - oplock_break_latency_histogram
+
+plugins:
+  LabelAgent:
+    split:
+      # instance_uuid  AFF-02:kernel:A_SVM_FOR_CONTAINERS
+      - instance_uuid `:` ,type,
+
+export_options:
+  instance_keys:
+    - node
+    - svm
+    - type
diff --git a/conf/zapiperf/default.yaml b/conf/zapiperf/default.yaml
index 8bfced2d..0a9d8692 100644
--- a/conf/zapiperf/default.yaml
+++ b/conf/zapiperf/default.yaml
@@ -48,6 +48,7 @@ objects:
   NFSv41:                 nfsv4_1.yaml
   NFSv42:                 nfsv4_2.yaml
   NFSv4:                  nfsv4.yaml
+#  SMB2:                   smb2.yaml
   Volume:                 volume.yaml
   VolumeSvm:              volume_svm.yaml
   WAFLCompBin:            wafl_comp_aggr_vol_bin.yaml
diff --git a/grafana/dashboards/cmode/smb2.json b/grafana/dashboards/cmode/smb2.json
new file mode 100644
index 00000000..84162574
--- /dev/null
+++ b/grafana/dashboards/cmode/smb2.json
@@ -0,0 +1,1305 @@
+{
+  "__inputs": [
+    {
+      "name": "DS_PROMETHEUS",
+      "label": "Prometheus",
+      "description": "",
+      "type": "datasource",
+      "pluginId": "prometheus",
+      "pluginName": "Prometheus"
+    }
+  ],
+  "__requires": [
+    {
+      "type": "grafana",
+      "id": "grafana",
+      "name": "Grafana",
+      "version": "8.1.8"
+    },
+    {
+      "type": "panel",
+      "id": "heatmap",
+      "name": "Heatmap",
+      "version": ""
+    },
+    {
+      "type": "datasource",
+      "id": "prometheus",
+      "name": "Prometheus",
+      "version": "1.0.0"
+    },
+    {
+      "type": "panel",
+      "id": "timeseries",
+      "name": "Time series",
+      "version": ""
+    }
+  ],
+  "annotations": {
+    "list": [
+      {
+        "builtIn": 1,
+        "datasource": "-- Grafana --",
+        "enable": true,
+        "hide": true,
+        "iconColor": "rgba(0, 211, 255, 1)",
+        "name": "Annotations & Alerts",
+        "target": {
+          "limit": 100,
+          "matchAny": false,
+          "tags": [],
+          "type": "dashboard"
+        },
+        "type": "dashboard"
+      }
+    ]
+  },
+  "description": "",
+  "editable": true,
+  "gnetId": null,
+  "graphTooltip": 1,
+  "id": null,
+  "iteration": 1677735866675,
+  "links": [
+    {
+      "asDropdown": true,
+      "icon": "external link",
+      "includeVars": true,
+      "keepTime": true,
+      "tags": [
+        "cdot"
+      ],
+      "targetBlank": false,
+      "title": "Related Dashboards",
+      "tooltip": "",
+      "type": "dashboards",
+      "url": ""
+    }
+  ],
+  "panels": [
+    {
+      "collapsed": false,
+      "datasource": "${DS_PROMETHEUS}",
+      "gridPos": {
+        "h": 1,
+        "w": 24,
+        "x": 0,
+        "y": 0
+      },
+      "id": 68,
+      "panels": [],
+      "title": "Highlights",
+      "type": "row"
+    },
+    {
+      "datasource": "${DS_PROMETHEUS}",
+      "description": "This panel includes sum of read and write SMB OP’s /sec",
+      "fieldConfig": {
+        "defaults": {
+          "color": {
+            "mode": "palette-classic"
+          },
+          "custom": {
+            "axisLabel": "",
+            "axisPlacement": "auto",
+            "barAlignment": 0,
+            "drawStyle": "line",
+            "fillOpacity": 10,
+            "gradientMode": "none",
+            "hideFrom": {
+              "legend": false,
+              "tooltip": false,
+              "viz": false
+            },
+            "lineInterpolation": "linear",
+            "lineWidth": 1,
+            "pointSize": 5,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "showPoints": "never",
+            "spanNulls": true,
+            "stacking": {
+              "group": "A",
+              "mode": "none"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
+          },
+          "mappings": [],
+          "thresholds": {
+            "mode": "absolute",
+            "steps": [
+              {
+                "color": "green",
+                "value": null
+              }
+            ]
+          },
+          "unit": "iops"
+        },
+        "overrides": []
+      },
+      "gridPos": {
+        "h": 9,
+        "w": 12,
+        "x": 0,
+        "y": 1
+      },
+      "id": 75,
+      "options": {
+        "legend": {
+          "calcs": [
+            "mean",
+            "lastNotNull",
+            "max"
+          ],
+          "displayMode": "table",
+          "placement": "bottom"
+        },
+        "tooltip": {
+          "mode": "single"
+        }
+      },
+      "pluginVersion": "8.1.8",
+      "targets": [
+        {
+          "exemplar": false,
+          "expr": "sum(smb2_read_ops{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) by (cluster)",
+          "interval": "",
+          "legendFormat": "read_ops - {{cluster}}",
+          "refId": "A"
+        },
+        {
+          "exemplar": false,
+          "expr": "sum(smb2_write_ops{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) by (cluster)",
+          "hide": false,
+          "interval": "",
+          "legendFormat": "write_ops - {{cluster}}",
+          "refId": "B"
+        }
+      ],
+      "timeFrom": null,
+      "timeShift": null,
+      "title": "Read / Write IOPS",
+      "type": "timeseries"
+    },
+    {
+      "datasource": "${DS_PROMETHEUS}",
+      "description": "This panel includes average SMB read and write latency",
+      "fieldConfig": {
+        "defaults": {
+          "color": {
+            "mode": "palette-classic"
+          },
+          "custom": {
+            "axisLabel": "",
+            "axisPlacement": "auto",
+            "barAlignment": 0,
+            "drawStyle": "line",
+            "fillOpacity": 10,
+            "gradientMode": "none",
+            "hideFrom": {
+              "legend": false,
+              "tooltip": false,
+              "viz": false
+            },
+            "lineInterpolation": "linear",
+            "lineWidth": 1,
+            "pointSize": 5,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "showPoints": "never",
+            "spanNulls": true,
+            "stacking": {
+              "group": "A",
+              "mode": "none"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
+          },
+          "mappings": [],
+          "thresholds": {
+            "mode": "absolute",
+            "steps": [
+              {
+                "color": "green",
+                "value": null
+              }
+            ]
+          },
+          "unit": "µs"
+        },
+        "overrides": []
+      },
+      "gridPos": {
+        "h": 9,
+        "w": 12,
+        "x": 12,
+        "y": 1
+      },
+      "id": 76,
+      "options": {
+        "legend": {
+          "calcs": [
+            "mean",
+            "lastNotNull",
+            "max"
+          ],
+          "displayMode": "table",
+          "placement": "bottom"
+        },
+        "tooltip": {
+          "mode": "single"
+        }
+      },
+      "pluginVersion": "8.1.8",
+      "targets": [
+        {
+          "exemplar": false,
+          "expr": "avg(smb2_read_latency{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) by (cluster)",
+          "interval": "",
+          "legendFormat": "Read - {{cluster}}",
+          "refId": "A"
+        },
+        {
+          "exemplar": false,
+          "expr": "avg(smb2_write_latency{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) by (cluster)",
+          "hide": false,
+          "interval": "",
+          "legendFormat": "Write - {{cluster}}",
+          "refId": "B"
+        }
+      ],
+      "timeFrom": null,
+      "timeShift": null,
+      "title": "Read / Write Latency",
+      "type": "timeseries"
+    },
+    {
+      "datasource": "${DS_PROMETHEUS}",
+      "description": "This panel includes SMB OP’s /sec average broken down by other SMB operations.",
+      "fieldConfig": {
+        "defaults": {
+          "color": {
+            "mode": "palette-classic"
+          },
+          "custom": {
+            "axisLabel": "",
+            "axisPlacement": "auto",
+            "barAlignment": 0,
+            "drawStyle": "line",
+            "fillOpacity": 10,
+            "gradientMode": "none",
+            "hideFrom": {
+              "legend": false,
+              "tooltip": false,
+              "viz": false
+            },
+            "lineInterpolation": "linear",
+            "lineWidth": 1,
+            "pointSize": 5,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "showPoints": "never",
+            "spanNulls": true,
+            "stacking": {
+              "group": "A",
+              "mode": "none"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
+          },
+          "mappings": [],
+          "thresholds": {
+            "mode": "absolute",
+            "steps": [
+              {
+                "color": "green",
+                "value": null
+              }
+            ]
+          },
+          "unit": "iops"
+        },
+        "overrides": []
+      },
+      "gridPos": {
+        "h": 9,
+        "w": 12,
+        "x": 0,
+        "y": 10
+      },
+      "id": 77,
+      "options": {
+        "legend": {
+          "calcs": [
+            "mean",
+            "lastNotNull",
+            "max"
+          ],
+          "displayMode": "table",
+          "placement": "bottom"
+        },
+        "tooltip": {
+          "mode": "single"
+        }
+      },
+      "pluginVersion": "8.1.8",
+      "targets": [
+        {
+          "exemplar": false,
+          "expr": "sum(smb2_negotiate_ops{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) by (cluster)",
+          "interval": "",
+          "legendFormat": "negotiate_ops - {{cluster}}",
+          "refId": "A"
+        },
+        {
+          "exemplar": false,
+          "expr": "sum(smb2_session_setup_ops{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) by (cluster)",
+          "hide": false,
+          "interval": "",
+          "legendFormat": "session_setup_ops - {{cluster}}",
+          "refId": "B"
+        },
+        {
+          "exemplar": false,
+          "expr": "sum(smb2_tree_connect_ops{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) by (cluster)",
+          "hide": false,
+          "interval": "",
+          "legendFormat": "tree_connect_ops - {{cluster}}",
+          "refId": "C"
+        },
+        {
+          "exemplar": false,
+          "expr": "sum(smb2_create_ops{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) by (cluster)",
+          "hide": false,
+          "interval": "",
+          "legendFormat": "create_ops - {{cluster}}",
+          "refId": "D"
+        },
+        {
+          "exemplar": false,
+          "expr": "sum(smb2_close_ops{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"})",
+          "hide": false,
+          "interval": "",
+          "legendFormat": "close_ops - {{cluster}}",
+          "refId": "E"
+        },
+        {
+          "exemplar": false,
+          "expr": "sum(smb2_lock_ops{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) by (cluster)",
+          "hide": false,
+          "interval": "",
+          "legendFormat": "lock_ops - {{cluster}}",
+          "refId": "F"
+        },
+        {
+          "exemplar": false,
+          "expr": "sum(smb2_query_directory_ops{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) by (cluster)",
+          "hide": false,
+          "interval": "",
+          "legendFormat": "query_directory_ops - {{cluster}}",
+          "refId": "G"
+        },
+        {
+          "exemplar": false,
+          "expr": "sum(smb2_query_info_ops{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) by (cluster)",
+          "hide": false,
+          "interval": "",
+          "legendFormat": "query_info_ops - {{cluster}}",
+          "refId": "H"
+        },
+        {
+          "exemplar": false,
+          "expr": "sum(smb2_set_info_ops{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) by (cluster)",
+          "hide": false,
+          "interval": "",
+          "legendFormat": "set_info_ops - {{cluster}}",
+          "refId": "I"
+        },
+        {
+          "exemplar": false,
+          "expr": "sum(smb2_tree_connect_ops{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) by (cluster)",
+          "hide": false,
+          "interval": "",
+          "legendFormat": "tree_connect_ops - {{cluster}}",
+          "refId": "J"
+        },
+        {
+          "exemplar": false,
+          "expr": "sum(smb2_oplock_break_ops{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) by (cluster)",
+          "hide": false,
+          "interval": "",
+          "legendFormat": "oplock_break_ops - {{cluster}}",
+          "refId": "K"
+        }
+      ],
+      "timeFrom": null,
+      "timeShift": null,
+      "title": "Other IOPS",
+      "type": "timeseries"
+    },
+    {
+      "datasource": "${DS_PROMETHEUS}",
+      "description": "This panel includes SMB latency broken down by other SMB operations.",
+      "fieldConfig": {
+        "defaults": {
+          "color": {
+            "mode": "palette-classic"
+          },
+          "custom": {
+            "axisLabel": "",
+            "axisPlacement": "auto",
+            "barAlignment": 0,
+            "drawStyle": "line",
+            "fillOpacity": 10,
+            "gradientMode": "none",
+            "hideFrom": {
+              "legend": false,
+              "tooltip": false,
+              "viz": false
+            },
+            "lineInterpolation": "linear",
+            "lineWidth": 1,
+            "pointSize": 5,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "showPoints": "never",
+            "spanNulls": true,
+            "stacking": {
+              "group": "A",
+              "mode": "none"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
+          },
+          "mappings": [],
+          "thresholds": {
+            "mode": "absolute",
+            "steps": [
+              {
+                "color": "green",
+                "value": null
+              }
+            ]
+          },
+          "unit": "µs"
+        },
+        "overrides": []
+      },
+      "gridPos": {
+        "h": 9,
+        "w": 12,
+        "x": 12,
+        "y": 10
+      },
+      "id": 78,
+      "options": {
+        "legend": {
+          "calcs": [
+            "mean",
+            "lastNotNull",
+            "max"
+          ],
+          "displayMode": "table",
+          "placement": "bottom"
+        },
+        "tooltip": {
+          "mode": "single"
+        }
+      },
+      "pluginVersion": "8.1.8",
+      "targets": [
+        {
+          "exemplar": false,
+          "expr": "avg(smb2_negotiate_latency{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) by (cluster)",
+          "interval": "",
+          "legendFormat": "negotiate_latency - {{cluster}}",
+          "refId": "A"
+        },
+        {
+          "exemplar": false,
+          "expr": "avg(smb2_session_setup_latency{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) by (cluster)",
+          "hide": false,
+          "interval": "",
+          "legendFormat": "session_setup_latency - {{cluster}}",
+          "refId": "B"
+        },
+        {
+          "exemplar": false,
+          "expr": "avg(smb2_tree_connect_latency{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) by (cluster)",
+          "hide": false,
+          "interval": "",
+          "legendFormat": "tree_connect_latency - {{cluster}}",
+          "refId": "C"
+        },
+        {
+          "exemplar": false,
+          "expr": "avg(smb2_create_latency{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) by (cluster)",
+          "hide": false,
+          "interval": "",
+          "legendFormat": "create_latency - {{cluster}}",
+          "refId": "D"
+        },
+        {
+          "exemplar": false,
+          "expr": "avg(smb2_close_latency{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) by (cluster)",
+          "hide": false,
+          "interval": "",
+          "legendFormat": "close_latency - {{cluster}}",
+          "refId": "E"
+        },
+        {
+          "exemplar": false,
+          "expr": "avg(smb2_lock_latency{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) by (cluster)",
+          "hide": false,
+          "interval": "",
+          "legendFormat": "lock_latency - {{cluster}}",
+          "refId": "F"
+        },
+        {
+          "exemplar": false,
+          "expr": "avg(smb2_query_directory_latency{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) by (cluster)",
+          "hide": false,
+          "interval": "",
+          "legendFormat": "query_directory_latency - {{cluster}}",
+          "refId": "G"
+        },
+        {
+          "exemplar": false,
+          "expr": "avg(smb2_query_info_latency{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) by (cluster)",
+          "hide": false,
+          "interval": "",
+          "legendFormat": "query_info_latency - {{cluster}}",
+          "refId": "H"
+        },
+        {
+          "exemplar": false,
+          "expr": "avg(smb2_set_info_latency{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) by (cluster)",
+          "hide": false,
+          "interval": "",
+          "legendFormat": "set_info_latency - {{cluster}}",
+          "refId": "I"
+        },
+        {
+          "exemplar": false,
+          "expr": "avg(smb2_oplock_break_latency{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) by (cluster)",
+          "hide": false,
+          "interval": "",
+          "legendFormat": "oplock_break_latency - {{cluster}}",
+          "refId": "J"
+        }
+      ],
+      "timeFrom": null,
+      "timeShift": null,
+      "title": "Other Latency",
+      "type": "timeseries"
+    },
+    {
+      "collapsed": true,
+      "datasource": null,
+      "gridPos": {
+        "h": 1,
+        "w": 24,
+        "x": 0,
+        "y": 19
+      },
+      "id": 90,
+      "panels": [
+        {
+          "cards": {
+            "cardPadding": null,
+            "cardRound": null
+          },
+          "color": {
+            "cardColor": "#b4ff00",
+            "colorScale": "sqrt",
+            "colorScheme": "interpolateOranges",
+            "exponent": 0.5,
+            "mode": "opacity"
+          },
+          "dataFormat": "tsbuckets",
+          "datasource": "${DS_PROMETHEUS}",
+          "description": "This panel tracks histograms for Session Setups and gives good indication of Client Authentication Latency Breakdown",
+          "gridPos": {
+            "h": 8,
+            "w": 12,
+            "x": 0,
+            "y": 20
+          },
+          "heatmap": {},
+          "hideZeroBuckets": true,
+          "highlightCards": true,
+          "id": 80,
+          "interval": "6m",
+          "legend": {
+            "show": false
+          },
+          "maxDataPoints": 25,
+          "reverseYBuckets": false,
+          "targets": [
+            {
+              "exemplar": true,
+              "expr": "sum(increase(smb2_session_setup_latency_histogram_bucket{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}[$__interval])) by (le)",
+              "format": "heatmap",
+              "instant": false,
+              "interval": "",
+              "intervalFactor": 1,
+              "legendFormat": "{{ le }}",
+              "refId": "A"
+            }
+          ],
+          "timeFrom": null,
+          "title": "Session Setup Latency Heatmap",
+          "tooltip": {
+            "show": true,
+            "showHistogram": false
+          },
+          "type": "heatmap",
+          "xAxis": {
+            "show": true
+          },
+          "xBucketNumber": null,
+          "xBucketSize": null,
+          "yAxis": {
+            "decimals": null,
+            "format": "µs",
+            "logBase": 1,
+            "max": null,
+            "min": null,
+            "show": true,
+            "splitFactor": null,
+            "width": null
+          },
+          "yBucketBound": "auto",
+          "yBucketNumber": null,
+          "yBucketSize": null
+        },
+        {
+          "cards": {
+            "cardPadding": null,
+            "cardRound": null
+          },
+          "color": {
+            "cardColor": "#b4ff00",
+            "colorScale": "sqrt",
+            "colorScheme": "interpolateOranges",
+            "exponent": 0.5,
+            "mode": "opacity"
+          },
+          "dataFormat": "tsbuckets",
+          "datasource": "${DS_PROMETHEUS}",
+          "description": "This panel tracks histograms for file opens and creates",
+          "gridPos": {
+            "h": 8,
+            "w": 12,
+            "x": 12,
+            "y": 20
+          },
+          "heatmap": {},
+          "hideZeroBuckets": true,
+          "highlightCards": true,
+          "id": 81,
+          "interval": "6m",
+          "legend": {
+            "show": false
+          },
+          "maxDataPoints": 25,
+          "reverseYBuckets": false,
+          "targets": [
+            {
+              "exemplar": true,
+              "expr": "sum(increase(smb2_create_latency_histogram_bucket{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}[$__interval])) by (le)",
+              "format": "heatmap",
+              "instant": false,
+              "interval": "",
+              "intervalFactor": 1,
+              "legendFormat": "{{ le }}",
+              "refId": "A"
+            }
+          ],
+          "timeFrom": null,
+          "title": "Create Latency Heatmap",
+          "tooltip": {
+            "show": true,
+            "showHistogram": false
+          },
+          "type": "heatmap",
+          "xAxis": {
+            "show": true
+          },
+          "xBucketNumber": null,
+          "xBucketSize": null,
+          "yAxis": {
+            "decimals": null,
+            "format": "µs",
+            "logBase": 1,
+            "max": null,
+            "min": null,
+            "show": true,
+            "splitFactor": null,
+            "width": null
+          },
+          "yBucketBound": "auto",
+          "yBucketNumber": null,
+          "yBucketSize": null
+        },
+        {
+          "cards": {
+            "cardPadding": null,
+            "cardRound": null
+          },
+          "color": {
+            "cardColor": "#b4ff00",
+            "colorScale": "sqrt",
+            "colorScheme": "interpolateOranges",
+            "exponent": 0.5,
+            "mode": "opacity"
+          },
+          "dataFormat": "tsbuckets",
+          "datasource": "${DS_PROMETHEUS}",
+          "description": "This panel tracks histograms for file closes",
+          "gridPos": {
+            "h": 8,
+            "w": 12,
+            "x": 0,
+            "y": 28
+          },
+          "heatmap": {},
+          "hideZeroBuckets": true,
+          "highlightCards": true,
+          "id": 87,
+          "interval": "6m",
+          "legend": {
+            "show": false
+          },
+          "maxDataPoints": 25,
+          "reverseYBuckets": false,
+          "targets": [
+            {
+              "exemplar": true,
+              "expr": "sum(increase(smb2_close_latency_histogram_bucket{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}[$__interval])) by (le)",
+              "format": "heatmap",
+              "instant": false,
+              "interval": "",
+              "intervalFactor": 1,
+              "legendFormat": "{{ le }}",
+              "refId": "A"
+            }
+          ],
+          "timeFrom": null,
+          "title": "Close Latency Heatmap",
+          "tooltip": {
+            "show": true,
+            "showHistogram": false
+          },
+          "type": "heatmap",
+          "xAxis": {
+            "show": true
+          },
+          "xBucketNumber": null,
+          "xBucketSize": null,
+          "yAxis": {
+            "decimals": null,
+            "format": "µs",
+            "logBase": 1,
+            "max": null,
+            "min": null,
+            "show": true,
+            "splitFactor": null,
+            "width": null
+          },
+          "yBucketBound": "auto",
+          "yBucketNumber": null,
+          "yBucketSize": null
+        },
+        {
+          "cards": {
+            "cardPadding": null,
+            "cardRound": null
+          },
+          "color": {
+            "cardColor": "#b4ff00",
+            "colorScale": "sqrt",
+            "colorScheme": "interpolateOranges",
+            "exponent": 0.5,
+            "mode": "opacity"
+          },
+          "dataFormat": "tsbuckets",
+          "datasource": "${DS_PROMETHEUS}",
+          "description": "This panel tracks histograms for file locks",
+          "gridPos": {
+            "h": 8,
+            "w": 12,
+            "x": 12,
+            "y": 28
+          },
+          "heatmap": {},
+          "hideZeroBuckets": true,
+          "highlightCards": true,
+          "id": 88,
+          "interval": "6m",
+          "legend": {
+            "show": false
+          },
+          "maxDataPoints": 25,
+          "reverseYBuckets": false,
+          "targets": [
+            {
+              "exemplar": true,
+              "expr": "sum(increase(smb2_lock_latency_histogram_bucket{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}[$__interval])) by (le)",
+              "format": "heatmap",
+              "instant": false,
+              "interval": "",
+              "intervalFactor": 1,
+              "legendFormat": "{{ le }}",
+              "refId": "A"
+            }
+          ],
+          "timeFrom": null,
+          "title": "Lock Latency Heatmap",
+          "tooltip": {
+            "show": true,
+            "showHistogram": false
+          },
+          "type": "heatmap",
+          "xAxis": {
+            "show": true
+          },
+          "xBucketNumber": null,
+          "xBucketSize": null,
+          "yAxis": {
+            "decimals": null,
+            "format": "µs",
+            "logBase": 1,
+            "max": null,
+            "min": null,
+            "show": true,
+            "splitFactor": null,
+            "width": null
+          },
+          "yBucketBound": "auto",
+          "yBucketNumber": null,
+          "yBucketSize": null
+        },
+        {
+          "cards": {
+            "cardPadding": null,
+            "cardRound": null
+          },
+          "color": {
+            "cardColor": "#b4ff00",
+            "colorScale": "sqrt",
+            "colorScheme": "interpolateOranges",
+            "exponent": 0.5,
+            "mode": "opacity"
+          },
+          "dataFormat": "tsbuckets",
+          "datasource": "${DS_PROMETHEUS}",
+          "description": "This panel tracks histograms for readdir",
+          "gridPos": {
+            "h": 8,
+            "w": 12,
+            "x": 0,
+            "y": 36
+          },
+          "heatmap": {},
+          "hideZeroBuckets": true,
+          "highlightCards": true,
+          "id": 85,
+          "interval": "6m",
+          "legend": {
+            "show": false
+          },
+          "maxDataPoints": 25,
+          "reverseYBuckets": false,
+          "targets": [
+            {
+              "exemplar": true,
+              "expr": "sum(increase(smb2_query_directory_latency_histogram_bucket{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}[$__interval])) by (le)",
+              "format": "heatmap",
+              "instant": false,
+              "interval": "",
+              "intervalFactor": 1,
+              "legendFormat": "{{ le }}",
+              "refId": "A"
+            }
+          ],
+          "timeFrom": null,
+          "title": "Query Directory Latency Heatmap",
+          "tooltip": {
+            "show": true,
+            "showHistogram": false
+          },
+          "type": "heatmap",
+          "xAxis": {
+            "show": true
+          },
+          "xBucketNumber": null,
+          "xBucketSize": null,
+          "yAxis": {
+            "decimals": null,
+            "format": "µs",
+            "logBase": 1,
+            "max": null,
+            "min": null,
+            "show": true,
+            "splitFactor": null,
+            "width": null
+          },
+          "yBucketBound": "auto",
+          "yBucketNumber": null,
+          "yBucketSize": null
+        },
+        {
+          "cards": {
+            "cardPadding": null,
+            "cardRound": null
+          },
+          "color": {
+            "cardColor": "#b4ff00",
+            "colorScale": "sqrt",
+            "colorScheme": "interpolateOranges",
+            "exponent": 0.5,
+            "mode": "opacity"
+          },
+          "dataFormat": "tsbuckets",
+          "datasource": "${DS_PROMETHEUS}",
+          "description": "This panel tracks histograms for getattr",
+          "gridPos": {
+            "h": 8,
+            "w": 12,
+            "x": 12,
+            "y": 36
+          },
+          "heatmap": {},
+          "hideZeroBuckets": true,
+          "highlightCards": true,
+          "id": 86,
+          "interval": "6m",
+          "legend": {
+            "show": false
+          },
+          "maxDataPoints": 25,
+          "reverseYBuckets": false,
+          "targets": [
+            {
+              "exemplar": true,
+              "expr": "sum(increase(smb2_query_info_latency_histogram_bucket{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}[$__interval])) by (le)",
+              "format": "heatmap",
+              "instant": false,
+              "interval": "",
+              "intervalFactor": 1,
+              "legendFormat": "{{ le }}",
+              "refId": "A"
+            }
+          ],
+          "timeFrom": null,
+          "title": "Query Info Latency Heatmap",
+          "tooltip": {
+            "show": true,
+            "showHistogram": false
+          },
+          "type": "heatmap",
+          "xAxis": {
+            "show": true
+          },
+          "xBucketNumber": null,
+          "xBucketSize": null,
+          "yAxis": {
+            "decimals": null,
+            "format": "µs",
+            "logBase": 1,
+            "max": null,
+            "min": null,
+            "show": true,
+            "splitFactor": null,
+            "width": null
+          },
+          "yBucketBound": "auto",
+          "yBucketNumber": null,
+          "yBucketSize": null
+        },
+        {
+          "cards": {
+            "cardPadding": null,
+            "cardRound": null
+          },
+          "color": {
+            "cardColor": "#b4ff00",
+            "colorScale": "sqrt",
+            "colorScheme": "interpolateOranges",
+            "exponent": 0.5,
+            "mode": "opacity"
+          },
+          "dataFormat": "tsbuckets",
+          "datasource": "${DS_PROMETHEUS}",
+          "description": "This panel tracks histograms for setattr",
+          "gridPos": {
+            "h": 8,
+            "w": 12,
+            "x": 0,
+            "y": 44
+          },
+          "heatmap": {},
+          "hideZeroBuckets": true,
+          "highlightCards": true,
+          "id": 83,
+          "interval": "6m",
+          "legend": {
+            "show": false
+          },
+          "maxDataPoints": 25,
+          "reverseYBuckets": false,
+          "targets": [
+            {
+              "exemplar": true,
+              "expr": "sum(increase(smb2_set_info_latency_histogram_bucket{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}[$__interval])) by (le)",
+              "format": "heatmap",
+              "instant": false,
+              "interval": "",
+              "intervalFactor": 1,
+              "legendFormat": "{{ le }}",
+              "refId": "A"
+            }
+          ],
+          "timeFrom": null,
+          "title": "Set Info Latency Heatmap",
+          "tooltip": {
+            "show": true,
+            "showHistogram": false
+          },
+          "type": "heatmap",
+          "xAxis": {
+            "show": true
+          },
+          "xBucketNumber": null,
+          "xBucketSize": null,
+          "yAxis": {
+            "decimals": null,
+            "format": "µs",
+            "logBase": 1,
+            "max": null,
+            "min": null,
+            "show": true,
+            "splitFactor": null,
+            "width": null
+          },
+          "yBucketBound": "auto",
+          "yBucketNumber": null,
+          "yBucketSize": null
+        },
+        {
+          "cards": {
+            "cardPadding": null,
+            "cardRound": null
+          },
+          "color": {
+            "cardColor": "#b4ff00",
+            "colorScale": "sqrt",
+            "colorScheme": "interpolateOranges",
+            "exponent": 0.5,
+            "mode": "opacity"
+          },
+          "dataFormat": "tsbuckets",
+          "datasource": "${DS_PROMETHEUS}",
+          "description": "This panel tracks histograms for oplock breaks",
+          "gridPos": {
+            "h": 8,
+            "w": 12,
+            "x": 12,
+            "y": 44
+          },
+          "heatmap": {},
+          "hideZeroBuckets": true,
+          "highlightCards": true,
+          "id": 84,
+          "interval": "6m",
+          "legend": {
+            "show": false
+          },
+          "maxDataPoints": 25,
+          "reverseYBuckets": false,
+          "targets": [
+            {
+              "exemplar": true,
+              "expr": "sum(increase(smb2_session_setup_latency_histogram_bucket{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}[$__interval])) by (le)",
+              "format": "heatmap",
+              "instant": false,
+              "interval": "",
+              "intervalFactor": 1,
+              "legendFormat": "{{ le }}",
+              "refId": "A"
+            }
+          ],
+          "timeFrom": null,
+          "title": "Session Setup Latency Heatmap",
+          "tooltip": {
+            "show": true,
+            "showHistogram": false
+          },
+          "type": "heatmap",
+          "xAxis": {
+            "show": true
+          },
+          "xBucketNumber": null,
+          "xBucketSize": null,
+          "yAxis": {
+            "decimals": null,
+            "format": "µs",
+            "logBase": 1,
+            "max": null,
+            "min": null,
+            "show": true,
+            "splitFactor": null,
+            "width": null
+          },
+          "yBucketBound": "auto",
+          "yBucketNumber": null,
+          "yBucketSize": null
+        }
+      ],
+      "title": "Latency Heatmap",
+      "type": "row"
+    }
+  ],
+  "refresh": "",
+  "schemaVersion": 30,
+  "style": "dark",
+  "tags": [
+    "harvest",
+    "ontap",
+    "cdot"
+  ],
+  "templating": {
+    "list": [
+      {
+        "current": {
+          "selected": false,
+          "text": "Prometheus",
+          "value": "Prometheus"
+        },
+        "description": null,
+        "error": null,
+        "hide": 2,
+        "includeAll": false,
+        "label": "Data Source",
+        "multi": false,
+        "name": "DS_PROMETHEUS",
+        "options": [],
+        "query": "prometheus",
+        "refresh": 1,
+        "regex": "",
+        "skipUrlSync": false,
+        "type": "datasource"
+      },
+      {
+        "allValue": null,
+        "current": {},
+        "datasource": "${DS_PROMETHEUS}",
+        "definition": "label_values(volume_labels{system_type!=\"7mode\"}, datacenter)",
+        "description": null,
+        "error": null,
+        "hide": 0,
+        "includeAll": false,
+        "label": null,
+        "multi": true,
+        "name": "Datacenter",
+        "options": [],
+        "query": {
+          "query": "label_values(volume_labels{system_type!=\"7mode\"}, datacenter)",
+          "refId": "StandardVariableQuery"
+        },
+        "refresh": 1,
+        "regex": "",
+        "skipUrlSync": false,
+        "sort": 1,
+        "tagValuesQuery": "",
+        "tagsQuery": "",
+        "type": "query",
+        "useTags": false
+      },
+      {
+        "allValue": null,
+        "current": {},
+        "datasource": "${DS_PROMETHEUS}",
+        "definition": "label_values(volume_labels{system_type!=\"7mode\",datacenter=~\"$Datacenter\"}, cluster)",
+        "description": null,
+        "error": null,
+        "hide": 0,
+        "includeAll": true,
+        "label": null,
+        "multi": true,
+        "name": "Cluster",
+        "options": [],
+        "query": {
+          "query": "label_values(volume_labels{system_type!=\"7mode\",datacenter=~\"$Datacenter\"}, cluster)",
+          "refId": "StandardVariableQuery"
+        },
+        "refresh": 1,
+        "regex": "",
+        "skipUrlSync": false,
+        "sort": 1,
+        "tagValuesQuery": "",
+        "tagsQuery": "",
+        "type": "query",
+        "useTags": false
+      },
+      {
+        "allValue": null,
+        "current": {},
+        "datasource": "${DS_PROMETHEUS}",
+        "definition": "label_values(volume_labels{cluster=~\"$Cluster\"}, svm)",
+        "description": null,
+        "error": null,
+        "hide": 0,
+        "includeAll": true,
+        "label": null,
+        "multi": true,
+        "name": "SVM",
+        "options": [],
+        "query": {
+          "query": "label_values(volume_labels{cluster=~\"$Cluster\"}, svm)",
+          "refId": "StandardVariableQuery"
+        },
+        "refresh": 1,
+        "regex": "",
+        "skipUrlSync": false,
+        "sort": 1,
+        "tagValuesQuery": "",
+        "tagsQuery": "",
+        "type": "query",
+        "useTags": false
+      }
+    ]
+  },
+  "time": {
+    "from": "now-3h",
+    "to": "now"
+  },
+  "timepicker": {
+    "refresh_intervals": [
+      "10s",
+      "30s",
+      "1m",
+      "5m",
+      "15m",
+      "30m",
+      "1h",
+      "2h",
+      "1d"
+    ]
+  },
+  "timezone": "",
+  "title": "ONTAP: SMB2",
+  "uid": "",
+  "version": 1
+}
\ No newline at end of file


Test patch:
diff --git a/integration/test/data/counter_data.go b/integration/test/data/counter_data.go
index 66c9b699..f85b4273 100644
--- a/integration/test/data/counter_data.go
+++ b/integration/test/data/counter_data.go
@@ -41,6 +41,7 @@ func GetCounterMap() map[string][]string {
 		"svm_nfs_latency_hist_bucket",
 		"svm_nfs_read_latency_hist_bucket",
 		"svm_nfs_write_latency_hist_bucket",
+		"smb2_",
 	}
 	//if docker.IsDockerBasedPoller() || setup.IsMac {
 	counterMap["NO_DATA_CONTAINS"] = append(counterMap["NO_DATA_CONTAINS"], "poller", "metadata_exporter_count")