diff --git a/cmd/collectors/ems/ems.go b/cmd/collectors/ems/ems.go
index 5af33acdb..36fb328c9 100644
--- a/cmd/collectors/ems/ems.go
+++ b/cmd/collectors/ems/ems.go
@@ -344,7 +344,7 @@ func (e *Ems) PollInstance() (map[string]*matrix.Matrix, error) {
// update metadata for collector logs
_ = e.Metadata.LazySetValueInt64("api_time", "instance", apiD.Microseconds())
_ = e.Metadata.LazySetValueInt64("parse_time", "instance", time.Since(parseT).Microseconds())
- _ = e.Metadata.LazySetValueUint64("instances", "instance", uint64(bookendCacheSize))
+ _ = e.Metadata.LazySetValueUint64("instances", "instance", uint64(bookendCacheSize)) //nolint:gosec
return nil, nil
}
diff --git a/cmd/collectors/keyperf/keyperf.go b/cmd/collectors/keyperf/keyperf.go
index f9a5d48d6..2be240a35 100644
--- a/cmd/collectors/keyperf/keyperf.go
+++ b/cmd/collectors/keyperf/keyperf.go
@@ -441,7 +441,7 @@ func (kp *KeyPerf) pollData(
calcD := time.Since(calcStart)
_ = kp.Metadata.LazySetValueUint64("instances", "data", uint64(len(curMat.GetInstances())))
_ = kp.Metadata.LazySetValueInt64("calc_time", "data", calcD.Microseconds())
- _ = kp.Metadata.LazySetValueUint64("skips", "data", uint64(totalSkips))
+ _ = kp.Metadata.LazySetValueUint64("skips", "data", uint64(totalSkips)) //nolint:gosec
// store cache for next poll
kp.Matrix[kp.Object] = cachedData
diff --git a/cmd/collectors/rest/plugins/health/health.go b/cmd/collectors/rest/plugins/health/health.go
index 776ad237a..80d91d6b8 100644
--- a/cmd/collectors/rest/plugins/health/health.go
+++ b/cmd/collectors/rest/plugins/health/health.go
@@ -179,6 +179,7 @@ func (h *Health) Run(dataMap map[string]*matrix.Matrix) ([]*matrix.Matrix, *util
Int("numResolutionInstanceCount", resolutionInstancesCount).
Msg("Collected")
+ //nolint:gosec
h.client.Metadata.PluginInstances = uint64(diskAlertCount + shelfAlertCount + supportAlertCount + nodeAlertCount + HAAlertCount + networkEthernetPortAlertCount + networkFcpPortAlertCount +
networkInterfaceAlertCount + volumeRansomwareAlertCount + volumeMoveAlertCount + licenseAlertCount + resolutionInstancesCount)
diff --git a/cmd/collectors/restperf/restperf.go b/cmd/collectors/restperf/restperf.go
index d64fcc942..e820ec7f6 100644
--- a/cmd/collectors/restperf/restperf.go
+++ b/cmd/collectors/restperf/restperf.go
@@ -1272,7 +1272,7 @@ func (r *RestPerf) pollData(startTime time.Time, perfRecords []rest.PerfRecord)
calcD := time.Since(calcStart)
_ = r.Metadata.LazySetValueUint64("instances", "data", uint64(len(curMat.GetInstances())))
_ = r.Metadata.LazySetValueInt64("calc_time", "data", calcD.Microseconds())
- _ = r.Metadata.LazySetValueUint64("skips", "data", uint64(totalSkips))
+ _ = r.Metadata.LazySetValueUint64("skips", "data", uint64(totalSkips)) //nolint:gosec
// store cache for next poll
r.Matrix[r.Object] = cachedData
diff --git a/cmd/collectors/zapi/plugins/qtree/qtree.go b/cmd/collectors/zapi/plugins/qtree/qtree.go
index d7d5495fd..59d4b202d 100644
--- a/cmd/collectors/zapi/plugins/qtree/qtree.go
+++ b/cmd/collectors/zapi/plugins/qtree/qtree.go
@@ -215,7 +215,7 @@ func (q *Qtree) Run(dataMap map[string]*matrix.Matrix) ([]*matrix.Matrix, *util.
}
}
- q.client.Metadata.PluginInstances = uint64(quotaIndex)
+ q.client.Metadata.PluginInstances = uint64(quotaIndex) //nolint:gosec
q.Logger.Info().
Int("numQuotas", quotaIndex).
diff --git a/cmd/collectors/zapiperf/zapiperf.go b/cmd/collectors/zapiperf/zapiperf.go
index 459ce0896..85d16b240 100644
--- a/cmd/collectors/zapiperf/zapiperf.go
+++ b/cmd/collectors/zapiperf/zapiperf.go
@@ -887,7 +887,7 @@ func (z *ZapiPerf) PollData() (map[string]*matrix.Matrix, error) {
calcD := time.Since(calcStart)
_ = z.Metadata.LazySetValueInt64("calc_time", "data", calcD.Microseconds())
- _ = z.Metadata.LazySetValueUint64("skips", "data", uint64(totalSkips))
+ _ = z.Metadata.LazySetValueUint64("skips", "data", uint64(totalSkips)) //nolint:gosec
// store cache for next poll
z.Matrix[z.Object] = cachedData
diff --git a/cmd/tools/grafana/grafana_test.go b/cmd/tools/grafana/grafana_test.go
index 548fdcea2..eb6617afc 100644
--- a/cmd/tools/grafana/grafana_test.go
+++ b/cmd/tools/grafana/grafana_test.go
@@ -99,7 +99,7 @@ func TestAddPrefixToMetricNames(t *testing.T) {
}
newExpressions = readExprs(updatedData)
- for i := range len(newExpressions) {
+ for i := range newExpressions {
if newExpressions[i] != prefix+oldExpressions[i] {
t.Errorf("path: %s \nExpected: [%s]\n Got: [%s]", path, prefix+oldExpressions[i], newExpressions[i])
}
diff --git a/conf/restperf/9.14.1/ontap_s3_svm.yaml b/conf/restperf/9.14.1/ontap_s3_svm.yaml
index 5e194c6fd..c59b5f504 100644
--- a/conf/restperf/9.14.1/ontap_s3_svm.yaml
+++ b/conf/restperf/9.14.1/ontap_s3_svm.yaml
@@ -135,7 +135,13 @@ counters:
- upload_part_rate
- upload_part_total
-export_options:
- instance_keys:
- - node
- - svm
+plugins:
+ - Aggregator:
+ # plugin will create summary/average for each ontaps3_svm object
+ # any names after the object names will be treated as
+ # label names that will be added to instances
+ - svm<>ontaps3_svm
+
+# only export svm aggregations from plugin
+# set this true or comment, to get data for each ontaps3_svm
+export_data: false
diff --git a/conf/zapiperf/cdot/9.8.0/ontap_s3_svm.yaml b/conf/zapiperf/cdot/9.8.0/ontap_s3_svm.yaml
index d703d492e..1ea5e2292 100644
--- a/conf/zapiperf/cdot/9.8.0/ontap_s3_svm.yaml
+++ b/conf/zapiperf/cdot/9.8.0/ontap_s3_svm.yaml
@@ -134,7 +134,13 @@ counters:
- upload_part_total
- vserver_name => svm
-export_options:
- instance_keys:
- - node
- - svm
+plugins:
+ - Aggregator:
+ # plugin will create summary/average for each ontaps3_svm object
+ # any names after the object names will be treated as
+ # label names that will be added to instances
+ - svm<>ontaps3_svm
+
+# only export svm aggregations from plugin
+# set this true or comment, to get data for each ontaps3_svm
+export_data: false
diff --git a/grafana/dashboards/cmode/s3ObjectStorage.json b/grafana/dashboards/cmode/s3ObjectStorage.json
index 0795cdaa0..3e1f61e35 100644
--- a/grafana/dashboards/cmode/s3ObjectStorage.json
+++ b/grafana/dashboards/cmode/s3ObjectStorage.json
@@ -101,14 +101,14 @@
{
"datasource": "${DS_PROMETHEUS}",
"gridPos": {
- "h": 2,
+ "h": 4,
"w": 24,
"x": 0,
"y": 1
},
"id": 107,
"options": {
- "content": "This dashboard requires ONTAP 9.7+. One action is required to use this dashboard:
1. On Harvest, enable the Rest collector for OntapS3 template in your `harvest.yml` config for configuration metrics",
+ "content": "This dashboard requires ONTAP 9.7+. Three actions are required to use this dashboard:
1. If you are using the Rest collector, then you must enable the OntapS3 counters in `$HARVEST/conf/rest/default.yaml`.
2. If you are using the ZapiPerf collector, then you must enable the OntapS3SVM counters in `$HARVEST/conf/zapiperf/default.yaml`.
3. If you are using the RestPerf collector, then you must enable the OntapS3SVM counters in `$HARVEST/conf/restperf/default.yaml`.
Please see https://github.com/NetApp/harvest/discussions/3137 for more details.",
"mode": "markdown"
},
"pluginVersion": "8.1.8",
@@ -120,7 +120,7 @@
"h": 1,
"w": 24,
"x": 0,
- "y": 3
+ "y": 5
},
"id": 16,
"title": "Bucket",
@@ -352,7 +352,7 @@
"h": 8,
"w": 24,
"x": 0,
- "y": 4
+ "y": 6
},
"id": 5,
"options": {
@@ -564,7 +564,7 @@
"h": 11,
"w": 12,
"x": 0,
- "y": 12
+ "y": 14
},
"id": 127,
"options": {
@@ -682,7 +682,7 @@
"h": 11,
"w": 12,
"x": 12,
- "y": 12
+ "y": 14
},
"id": 128,
"options": {
@@ -838,7 +838,7 @@
"h": 8,
"w": 24,
"x": 0,
- "y": 23
+ "y": 25
},
"id": 6,
"options": {
@@ -910,6 +910,746 @@
}
],
"type": "table"
+ },
+ {
+ "collapsed": true,
+ "datasource": "${DS_PROMETHEUS}",
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 33
+ },
+ "id": 17,
+ "panels": [
+ {
+ "datasource": "${DS_PROMETHEUS}",
+ "description": "This panel displays Requests and Connections counts at each SVM.",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "custom": {
+ "align": "auto",
+ "cellOptions": {
+ "type": "auto"
+ },
+ "filterable": true,
+ "inspect": false
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "short",
+ "unitScale": true
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "datacenter"
+ },
+ "properties": [
+ {
+ "id": "displayName",
+ "value": "Datacenter"
+ },
+ {
+ "id": "links",
+ "value": [
+ {
+ "targetBlank": true,
+ "title": "",
+ "url": "/d/cdot-datacenter/ontap-datacenter?orgId=1&${__url_time_range}&var-Datacenter=${__value.raw}"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "cluster"
+ },
+ "properties": [
+ {
+ "id": "displayName",
+ "value": "Cluster"
+ },
+ {
+ "id": "links",
+ "value": [
+ {
+ "targetBlank": true,
+ "title": "",
+ "url": "/d/cdot-cluster/ontap-cluster?orgId=1&${Datacenter:queryparam}&${__url_time_range}&var-Cluster=${__value.raw}"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "svm"
+ },
+ "properties": [
+ {
+ "id": "displayName",
+ "value": "SVM"
+ },
+ {
+ "id": "links",
+ "value": [
+ {
+ "targetBlank": true,
+ "title": "",
+ "url": "/d/cdot-svm/ontap-svm?orgId=1&${Datacenter:queryparam}&${Cluster:queryparam}&${__url_time_range}&var-SVM=${__value.raw}"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ "gridPos": {
+ "h": 10,
+ "w": 24,
+ "x": 0,
+ "y": 5
+ },
+ "id": 137,
+ "options": {
+ "cellHeight": "sm",
+ "footer": {
+ "countRows": false,
+ "fields": "",
+ "reducer": [
+ "sum"
+ ],
+ "show": false
+ },
+ "showHeader": true,
+ "sortBy": [
+ {
+ "desc": false,
+ "displayName": "SVM"
+ }
+ ]
+ },
+ "pluginVersion": "10.3.1",
+ "targets": [
+ {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "sum by (datacenter, cluster, svm)(ontaps3_svm_requests{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"})",
+ "format": "table",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ },
+ {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "sum by (datacenter, cluster, svm)(ontaps3_svm_connections{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"})",
+ "format": "table",
+ "hide": false,
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "B"
+ },
+ {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "sum by (datacenter, cluster, svm)(ontaps3_svm_max_requests_outstanding{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"})",
+ "format": "table",
+ "hide": false,
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "C"
+ },
+ {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "sum by (datacenter, cluster, svm)(ontaps3_svm_max_connected_connections{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"})",
+ "format": "table",
+ "hide": false,
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "D"
+ },
+ {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "sum by (datacenter, cluster, svm)(ontaps3_svm_max_cmds_per_connection{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"})",
+ "format": "table",
+ "hide": false,
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "E"
+ }
+ ],
+ "title": "Requests & Connections stats",
+ "transformations": [
+ {
+ "id": "filterFieldsByName",
+ "options": {
+ "include": {
+ "names": [
+ "Value #A",
+ "Value #B",
+ "Value #C",
+ "Value #D",
+ "Value #E",
+ "svm",
+ "cluster",
+ "datacenter"
+ ]
+ }
+ }
+ },
+ {
+ "id": "merge",
+ "options": {}
+ },
+ {
+ "id": "organize",
+ "options": {
+ "excludeByName": {},
+ "includeByName": {},
+ "indexByName": {
+ "Value #A": 3,
+ "Value #B": 4,
+ "Value #C": 5,
+ "Value #D": 6,
+ "Value #E": 7,
+ "cluster": 1,
+ "datacenter": 0,
+ "svm": 2
+ },
+ "renameByName": {
+ "Value": "Used space",
+ "Value #A": "Requests",
+ "Value #B": "Connections",
+ "Value #C": "Max Outstanding Requests",
+ "Value #D": "Max Connections",
+ "Value #E": "Max Commands Per Connections"
+ }
+ }
+ }
+ ],
+ "type": "table"
+ },
+ {
+ "datasource": "${DS_PROMETHEUS}",
+ "description": "Number of GET/PUT/HEAD/DELETE SVM operations.",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "Operations",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 10,
+ "gradientMode": "opacity",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": true,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "short",
+ "unitScale": true
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 11,
+ "w": 12,
+ "x": 0,
+ "y": 15
+ },
+ "id": 132,
+ "options": {
+ "legend": {
+ "calcs": [
+ "mean",
+ "lastNotNull",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "sortBy": "Last *",
+ "sortDesc": true
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "pluginVersion": "8.1.8",
+ "targets": [
+ {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "avg by(datacenter,cluster,svm)(ontaps3_svm_get_object_total{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) and topk($TopResources, avg by(datacenter,cluster,svm) (avg_over_time(ontaps3_svm_get_object_total{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}[3h])))",
+ "hide": false,
+ "interval": "",
+ "legendFormat": "{{svm}} - GET",
+ "range": true,
+ "refId": "A"
+ },
+ {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "avg by(datacenter,cluster,svm)(ontaps3_svm_put_object_total{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) and topk($TopResources, avg by(datacenter,cluster,svm) (avg_over_time(ontaps3_svm_put_object_total{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}[3h])))",
+ "hide": false,
+ "interval": "",
+ "legendFormat": "{{svm}} - PUT",
+ "range": true,
+ "refId": "B"
+ },
+ {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "avg by(datacenter,cluster,svm)(ontaps3_svm_head_object_total{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) and topk($TopResources, avg by(datacenter,cluster,svm) (avg_over_time(ontaps3_svm_head_object_total{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}[3h])))",
+ "hide": false,
+ "interval": "",
+ "legendFormat": "{{svm}} - HEAD",
+ "range": true,
+ "refId": "C"
+ },
+ {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "avg by(datacenter,cluster,svm)(ontaps3_svm_delete_object_total{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) and topk($TopResources, avg by(datacenter,cluster,svm) (avg_over_time(ontaps3_svm_delete_object_total{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}[3h])))",
+ "hide": false,
+ "interval": "",
+ "legendFormat": "{{svm}} - DELETE",
+ "range": true,
+ "refId": "D"
+ }
+ ],
+ "title": "Top $TopResources SVMs by Operations",
+ "transformations": [],
+ "type": "timeseries"
+ },
+ {
+ "datasource": "${DS_PROMETHEUS}",
+ "description": "Number of GET/PUT/HEAD/DELETE SVM operations per second.",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "Operations/sec",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 10,
+ "gradientMode": "opacity",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": true,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "decimals": 0,
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "iops",
+ "unitScale": true
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 11,
+ "w": 12,
+ "x": 12,
+ "y": 15
+ },
+ "id": 129,
+ "options": {
+ "legend": {
+ "calcs": [
+ "mean",
+ "lastNotNull",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "sortBy": "Last *",
+ "sortDesc": true
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "pluginVersion": "8.1.8",
+ "targets": [
+ {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "avg by(datacenter,cluster,svm)(ontaps3_svm_get_object_rate{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) and topk($TopResources, avg by(datacenter,cluster,svm) (avg_over_time(ontaps3_svm_get_object_rate{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}[3h])))",
+ "hide": false,
+ "interval": "",
+ "legendFormat": "{{svm}} - GET",
+ "range": true,
+ "refId": "A"
+ },
+ {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "avg by(datacenter,cluster,svm)(ontaps3_svm_put_object_rate{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) and topk($TopResources, avg by(datacenter,cluster,svm) (avg_over_time(ontaps3_svm_put_object_rate{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}[3h])))",
+ "hide": false,
+ "interval": "",
+ "legendFormat": "{{svm}} - PUT",
+ "range": true,
+ "refId": "B"
+ },
+ {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "avg by(datacenter,cluster,svm)(ontaps3_svm_head_object_rate{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) and topk($TopResources, avg by(datacenter,cluster,svm) (avg_over_time(ontaps3_svm_head_object_rate{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}[3h])))",
+ "hide": false,
+ "interval": "",
+ "legendFormat": "{{svm}} - HEAD",
+ "range": true,
+ "refId": "C"
+ },
+ {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "avg by(datacenter,cluster,svm)(ontaps3_svm_delete_object_rate{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) and topk($TopResources, avg by(datacenter,cluster,svm) (avg_over_time(ontaps3_svm_delete_object_rate{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}[3h])))",
+ "hide": false,
+ "interval": "",
+ "legendFormat": "{{svm}} - DELETE",
+ "range": true,
+ "refId": "D"
+ }
+ ],
+ "title": "Top $TopResources SVMs by Rate",
+ "transformations": [],
+ "type": "timeseries"
+ },
+ {
+ "datasource": "${DS_PROMETHEUS}",
+ "description": "Average latency for GET/PUT/HEAD/DELETE SVM operations.",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "Latency",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 10,
+ "gradientMode": "opacity",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": true,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "µs",
+ "unitScale": true
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 11,
+ "w": 12,
+ "x": 0,
+ "y": 26
+ },
+ "id": 130,
+ "options": {
+ "legend": {
+ "calcs": [
+ "mean",
+ "lastNotNull",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "sortBy": "Last *",
+ "sortDesc": true
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "pluginVersion": "8.1.8",
+ "targets": [
+ {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "avg by(datacenter,cluster,svm)(ontaps3_svm_get_object_latency{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) and topk($TopResources, avg by(datacenter,cluster,svm) (avg_over_time(ontaps3_svm_get_object_latency{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}[3h])))",
+ "hide": false,
+ "interval": "",
+ "legendFormat": "{{svm}} - GET",
+ "range": true,
+ "refId": "A"
+ },
+ {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "avg by(datacenter,cluster,svm)(ontaps3_svm_put_object_latency{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) and topk($TopResources, avg by(datacenter,cluster,svm) (avg_over_time(ontaps3_svm_put_object_latency{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}[3h])))",
+ "hide": false,
+ "interval": "",
+ "legendFormat": "{{svm}} - PUT",
+ "range": true,
+ "refId": "B"
+ },
+ {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "avg by(datacenter,cluster,svm)(ontaps3_svm_head_object_latency{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) and topk($TopResources, avg by(datacenter,cluster,svm) (avg_over_time(ontaps3_svm_head_object_latency{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}[3h])))",
+ "hide": false,
+ "interval": "",
+ "legendFormat": "{{svm}} - HEAD",
+ "range": true,
+ "refId": "C"
+ },
+ {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "avg by(datacenter,cluster,svm)(ontaps3_svm_delete_object_latency{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) and topk($TopResources, avg by(datacenter,cluster,svm) (avg_over_time(ontaps3_svm_delete_object_latency{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}[3h])))",
+ "hide": false,
+ "interval": "",
+ "legendFormat": "{{svm}} - DELETE",
+ "range": true,
+ "refId": "D"
+ }
+ ],
+ "title": "Top $TopResources SVMs by Latency",
+ "transformations": [],
+ "type": "timeseries"
+ },
+ {
+ "datasource": "${DS_PROMETHEUS}",
+ "description": "Rate of GET/PUT SVM data transfers per second.",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "Data Transfer",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 10,
+ "gradientMode": "opacity",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": true,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "decimals": 2,
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "Bps",
+ "unitScale": true
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 11,
+ "w": 12,
+ "x": 12,
+ "y": 26
+ },
+ "id": 131,
+ "options": {
+ "legend": {
+ "calcs": [
+ "mean",
+ "lastNotNull",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "sortBy": "Last *",
+ "sortDesc": true
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "pluginVersion": "8.1.8",
+ "targets": [
+ {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "avg by(datacenter,cluster,svm)(ontaps3_svm_get_data{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) and topk($TopResources, avg by(datacenter,cluster,svm) (avg_over_time(ontaps3_svm_get_data{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}[3h])))",
+ "hide": false,
+ "interval": "",
+ "legendFormat": "{{svm}} - GET",
+ "range": true,
+ "refId": "A"
+ },
+ {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "avg by(datacenter,cluster,svm)(ontaps3_svm_put_data{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}) and topk($TopResources, avg by(datacenter,cluster,svm) (avg_over_time(ontaps3_svm_put_data{datacenter=~\"$Datacenter\",cluster=~\"$Cluster\",svm=~\"$SVM\"}[3h])))",
+ "hide": false,
+ "interval": "",
+ "legendFormat": "{{svm}} - PUT",
+ "range": true,
+ "refId": "B"
+ }
+ ],
+ "title": "Top $TopResources SVMs by Data Transfer",
+ "transformations": [],
+ "type": "timeseries"
+ }
+ ],
+ "title": "S3 Object Storage SVM",
+ "type": "row"
}
],
"refresh": "",
@@ -1157,5 +1897,5 @@
"timezone": "",
"title": "ONTAP: S3 Object Storage",
"uid": "cdot-s3-object-storage",
- "version": 2
+ "version": 3
}
diff --git a/integration/test/dashboard_json_test.go b/integration/test/dashboard_json_test.go
index 2b41ade0f..6698fbbbc 100644
--- a/integration/test/dashboard_json_test.go
+++ b/integration/test/dashboard_json_test.go
@@ -105,6 +105,7 @@ var excludeCounters = []string{
"ndmp_session_",
"metrocluster_check_",
"volume_top_clients_",
+ "ontaps3_svm_",
}
var flakyCounters = []string{
diff --git a/pkg/matrix/matrix.go b/pkg/matrix/matrix.go
index 39aabcec4..3e0e30a55 100644
--- a/pkg/matrix/matrix.go
+++ b/pkg/matrix/matrix.go
@@ -473,7 +473,7 @@ func (m *Matrix) DivideWithThreshold(metricKey string, baseKey string, threshold
case metric.record[i] && sRecord[i]:
minimumBase := tValues[i] * x
metricName := metric.GetName()
- if metricName == "optimal_point_latency" || metricName == "scan_latency" {
+ if metricName == "optimal_point_latency" || metricName == "scan_latency" || m.Object == "ontaps3_svm" {
// An exception is made for these counters because the base counter always has a few IOPS
minimumBase = 0
}