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 }