diff --git a/cmd/collectors/eseries/template.go b/cmd/collectors/eseries/template.go index 902bf732c..46a55945a 100644 --- a/cmd/collectors/eseries/template.go +++ b/cmd/collectors/eseries/template.go @@ -36,32 +36,23 @@ func (e *ESeries) LoadTemplate() (string, error) { // ObjectConfig holds configuration for different object types type ObjectConfig struct { - ArrayPath string - Filter string - CalculateUtilization bool - UsesSharedCache bool -} - -// newObjectConfig creates an ObjectConfig with UsesSharedCache defaulted to true -func newObjectConfig(arrayPath, filter string, calculateUtilization bool) ObjectConfig { - return ObjectConfig{ - ArrayPath: arrayPath, - Filter: filter, - CalculateUtilization: calculateUtilization, - UsesSharedCache: true, - } + ArrayPath string + Filter string + CalculateUtilization bool + CalculateQueueDepthAverage bool + UsesSharedCache bool } func GetESeriesPerfObjectConfig(objType string) ObjectConfig { configs := map[string]ObjectConfig{ - "controller": newObjectConfig("controllerStats", "type=controller", false), - "pool": newObjectConfig("poolStats", "type=storagePool", false), - "volume": newObjectConfig("volumeStats", "type=volume", false), - "drive": newObjectConfig("diskStats", "type=drive", true), - "interface": newObjectConfig("interfaceStats", "type=ioInterface", false), - "application": newObjectConfig("applicationStats", "type=application", false), - "workload": newObjectConfig("workloadStats", "type=workload", false), - "array": newObjectConfig("systemStats", "type=storageSystem", false), + "controller": {ArrayPath: "controllerStats", Filter: "type=controller", UsesSharedCache: true}, + "pool": {ArrayPath: "poolStats", Filter: "type=storagePool", UsesSharedCache: true}, + "volume": {ArrayPath: "volumeStats", Filter: "type=volume", UsesSharedCache: true, CalculateQueueDepthAverage: true}, + "drive": {ArrayPath: "diskStats", Filter: "type=drive", UsesSharedCache: true, CalculateUtilization: true}, + "interface": {ArrayPath: "interfaceStats", Filter: "type=ioInterface", UsesSharedCache: true}, + "application": {ArrayPath: "applicationStats", Filter: "type=application", UsesSharedCache: true}, + "workload": {ArrayPath: "workloadStats", Filter: "type=workload", UsesSharedCache: true}, + "array": {ArrayPath: "systemStats", Filter: "type=storageSystem", UsesSharedCache: true}, } if config, ok := configs[objType]; ok { return config diff --git a/cmd/collectors/eseriesperf/eseriesperf.go b/cmd/collectors/eseriesperf/eseriesperf.go index 8d401f778..4646c97a6 100644 --- a/cmd/collectors/eseriesperf/eseriesperf.go +++ b/cmd/collectors/eseriesperf/eseriesperf.go @@ -38,10 +38,11 @@ type counter struct { } type perfProp struct { - isCacheEmpty bool - counterInfo map[string]*counter - timestampMetricName string - calculateUtilization bool + isCacheEmpty bool + counterInfo map[string]*counter + timestampMetricName string + calculateUtilization bool + calculateQueueDepthAverage bool } func init() { @@ -156,6 +157,7 @@ func (ep *EseriesPerf) ParseTemplate() error { } ep.perfProp.calculateUtilization = config.CalculateUtilization + ep.perfProp.calculateQueueDepthAverage = config.CalculateQueueDepthAverage return nil } @@ -633,6 +635,12 @@ func (ep *EseriesPerf) cookCounters(curMat *matrix.Matrix, prevMat *matrix.Matri idleTime.SetExportable(false) } + // Don't export queueDepthTotal it's only used to compute queue_depth_average + queueDepthTotal := curMat.GetMetric("queueDepthTotal") + if queueDepthTotal != nil { + queueDepthTotal.SetExportable(false) + } + err = ep.validateMatrix(prevMat, curMat) if err != nil { return nil, err @@ -677,6 +685,15 @@ func (ep *EseriesPerf) cookCounters(curMat *matrix.Matrix, prevMat *matrix.Matri } } + // Calculate queue depth average if template flag is set (after all deltas are done) + if ep.perfProp.calculateQueueDepthAverage { + if skips, err := ep.calculateQueueDepthAverage(curMat); err != nil { + ep.Logger.Error("Calculate queue depth average", slogx.Err(err)) + } else { + totalSkips += skips + } + } + // Second pass: Apply transformations (average, percent) for i := range orderedMetrics { key := orderedKeys[i] @@ -802,6 +819,7 @@ func (ep *EseriesPerf) calculateUtilization(curMat *matrix.Matrix) (int, error) idleTime, idleOk := idleTimeMetric.GetValueFloat64(instance) if !readOk || !writeOk || !idleOk { + skips++ continue } @@ -822,6 +840,46 @@ func (ep *EseriesPerf) calculateUtilization(curMat *matrix.Matrix) (int, error) return skips, nil } +// calculateQueueDepthAverage calculates the average queue depth per I/O operation. +func (ep *EseriesPerf) calculateQueueDepthAverage(curMat *matrix.Matrix) (int, error) { + queueDepthTotalMetric := curMat.GetMetric("queueDepthTotal") + readOpsMetric := curMat.GetMetric("readOps") + writeOpsMetric := curMat.GetMetric("writeOps") + otherOpsMetric := curMat.GetMetric("otherOps") + + if queueDepthTotalMetric == nil || readOpsMetric == nil || writeOpsMetric == nil || otherOpsMetric == nil { + return 0, errs.New(errs.ErrMissingParam, "missing metrics (queueDepthTotal, readOps, writeOps, otherOps) for queue depth average") + } + + queueDepthAvgMetric, err := curMat.NewMetricFloat64("queue_depth_average") + if err != nil { + return 0, err + } + queueDepthAvgMetric.SetProperty("average") + + skips := 0 + for _, instance := range curMat.GetInstances() { + qDepthTotal, qOk := queueDepthTotalMetric.GetValueFloat64(instance) + readOps, rOk := readOpsMetric.GetValueFloat64(instance) + writeOps, wOk := writeOpsMetric.GetValueFloat64(instance) + otherOps, oOk := otherOpsMetric.GetValueFloat64(instance) + + if !qOk || !rOk || !wOk || !oOk { + skips++ + continue + } + + totalOps := readOps + writeOps + otherOps + if totalOps > 0 { + queueDepthAvgMetric.SetValueFloat64(instance, qDepthTotal/totalOps) + } else { + skips++ + } + } + + return skips, nil +} + // validateMatrix ensures that the previous matrix (prevMat) contains all the metrics present in the current matrix (curMat). // This is crucial for performing accurate comparisons and calculations between the two matrices, especially in scenarios where // the current matrix may have additional metrics that are not present in the previous matrix, such as after an ONTAP upgrade. diff --git a/cmd/collectors/eseriesperf/eseriesperf_test.go b/cmd/collectors/eseriesperf/eseriesperf_test.go index 7188d9c11..8a6ccf223 100644 --- a/cmd/collectors/eseriesperf/eseriesperf_test.go +++ b/cmd/collectors/eseriesperf/eseriesperf_test.go @@ -862,3 +862,114 @@ func TestEseriesPerf_SsdCache_NegativeDelta_SkipOnCounterReset(t *testing.T) { } } } +func TestEseriesPerf_QueueDepthAverage_Flag(t *testing.T) { + ep := newEseriesPerf("Volume", "volume.yaml") + + assert.True(t, ep.perfProp.calculateQueueDepthAverage) + assert.False(t, ep.perfProp.calculateUtilization) +} + +func TestEseriesPerf_QueueDepthAverage_Calculation(t *testing.T) { + ep := newEseriesPerf("Volume", "volume.yaml") + mat := ep.Matrix[ep.Object] + + instance, err := mat.NewInstance("vol1") + if err != nil { + t.Fatalf("failed to create instance: %v", err) + } + + queueDepthTotal, err := mat.NewMetricFloat64("queueDepthTotal") + if err != nil { + t.Fatalf("failed to create queueDepthTotal: %v", err) + } + readOps, err := mat.NewMetricFloat64("readOps") + if err != nil { + t.Fatalf("failed to create readOps: %v", err) + } + writeOps, err := mat.NewMetricFloat64("writeOps") + if err != nil { + t.Fatalf("failed to create writeOps: %v", err) + } + otherOps, err := mat.NewMetricFloat64("otherOps") + if err != nil { + t.Fatalf("failed to create otherOps: %v", err) + } + + queueDepthTotal.SetValueFloat64(instance, 1500) + readOps.SetValueFloat64(instance, 300) + writeOps.SetValueFloat64(instance, 200) + otherOps.SetValueFloat64(instance, 0) + + skips, err := ep.calculateQueueDepthAverage(mat) + assert.Nil(t, err) + assert.Equal(t, skips, 0) + + avgMetric := mat.GetMetric("queue_depth_average") + assert.NotNil(t, avgMetric) + + val, ok := avgMetric.GetValueFloat64(instance) + assert.True(t, ok) + assert.Equal(t, val, 3.0) +} + +func TestEseriesPerf_QueueDepthAverage_ZeroTotalOps(t *testing.T) { + ep := newEseriesPerf("Volume", "volume.yaml") + mat := ep.Matrix[ep.Object] + + instance, err := mat.NewInstance("vol1") + if err != nil { + t.Fatalf("failed to create instance: %v", err) + } + + queueDepthTotal, _ := mat.NewMetricFloat64("queueDepthTotal") + readOps, _ := mat.NewMetricFloat64("readOps") + writeOps, _ := mat.NewMetricFloat64("writeOps") + otherOps, _ := mat.NewMetricFloat64("otherOps") + + queueDepthTotal.SetValueFloat64(instance, 100) + readOps.SetValueFloat64(instance, 0) + writeOps.SetValueFloat64(instance, 0) + otherOps.SetValueFloat64(instance, 0) + + skips, err := ep.calculateQueueDepthAverage(mat) + assert.Nil(t, err) + assert.Equal(t, skips, 1) + + avgMetric := mat.GetMetric("queue_depth_average") + assert.NotNil(t, avgMetric) + + _, ok := avgMetric.GetValueFloat64(instance) + assert.False(t, ok) +} + +func TestEseriesPerf_QueueDepthTotal_NotExported(t *testing.T) { + ep := newEseriesPerf("Volume", "volume.yaml") + mat := ep.Matrix[ep.Object] + mat.SetGlobalLabel("array_id", "600a098000f63714000000005e5cf5d2") + mat.SetGlobalLabel("array", "eseries-test-system") + + // First poll - establishes baseline; cookCounters returns nil when cache is empty + pollData1 := jsonToPerfData("testdata/perf1.json") + ep.pollData(mat, pollData1, set.New()) + _, _ = ep.cookCounters(mat, mat) + + // Second poll + pollData2 := jsonToPerfData("testdata/perf2.json") + prevMat := mat.Clone(matrix.With{Data: true, Metrics: true, Instances: true, ExportInstances: true}) + curMat := prevMat.Clone(matrix.With{Data: false, Metrics: true, Instances: true, ExportInstances: true}) + curMat.Reset() + ep.pollData(curMat, pollData2, set.New()) + + got, err := ep.cookCounters(curMat, prevMat) + assert.Nil(t, err) + assert.NotNil(t, got) + + resultMat := got["Volume"] + assert.NotNil(t, resultMat) + + qdt := resultMat.GetMetric("queueDepthTotal") + if qdt == nil { + t.Fatal("queueDepthTotal metric should exist in result matrix") + } + assert.False(t, qdt.IsExportable()) +} diff --git a/cmd/tools/generate/eseries_counter.yaml b/cmd/tools/generate/eseries_counter.yaml index 15b5dfd2b..f12914238 100644 --- a/cmd/tools/generate/eseries_counter.yaml +++ b/cmd/tools/generate/eseries_counter.yaml @@ -344,6 +344,30 @@ counters: ESeriesCounter: Harvest Generated Template: conf/eseriesperf/11.80.0/volume.yaml (CacheHitRatio plugin) + - Name: eseries_volume_other_ops + Description: Volume other I/O operations per second + APIs: + - API: REST + Endpoint: storage-systems/{array_id}/live-statistics + ESeriesCounter: otherOps + Template: conf/eseriesperf/11.80.0/volume.yaml + + - Name: eseries_volume_queue_depth_average + Description: Average queue depth per I/O operation + APIs: + - API: REST + Endpoint: storage-systems/{array_id}/live-statistics + ESeriesCounter: Harvest Generated + Template: conf/eseriesperf/11.80.0/volume.yaml + + - Name: eseries_volume_queue_depth_max + Description: Maximum queue depth seen over the observation window + APIs: + - API: REST + Endpoint: storage-systems/{array_id}/live-statistics + ESeriesCounter: queueDepthMax + Template: conf/eseriesperf/11.80.0/volume.yaml + # ============================================================================= # Cache Backup Device Metrics (Hardware Plugin) # ============================================================================= diff --git a/conf/eseriesperf/11.80.0/volume.yaml b/conf/eseriesperf/11.80.0/volume.yaml index 37c5a45d2..987b67db8 100644 --- a/conf/eseriesperf/11.80.0/volume.yaml +++ b/conf/eseriesperf/11.80.0/volume.yaml @@ -7,6 +7,9 @@ counters: - ^^volumeName => volume - lastResetTimeInMS => last_reset_time - observedTimeInMS => observed_time + - otherOps => other_ops + - queueDepthMax => queue_depth_max + - queueDepthTotal # queueDepthTotal is only used to compute queue_depth_average. It is not exported - readBytes => read_data - readHitOps => read_hit_ops - readOps => read_ops diff --git a/conf/eseriesperf/static_counter_definitions.yaml b/conf/eseriesperf/static_counter_definitions.yaml index f31477039..a4f1f9a3d 100644 --- a/conf/eseriesperf/static_counter_definitions.yaml +++ b/conf/eseriesperf/static_counter_definitions.yaml @@ -26,6 +26,12 @@ objects: - name: idleTime type: average base_counter: readOps + - name: otherOps + type: rate + - name: queueDepthTotal + type: delta + - name: queueDepthMax + type: raw eseries_controller: counter_definitions: diff --git a/docs/cisco-switch-metrics.md b/docs/cisco-switch-metrics.md index 9bf653701..218f152c6 100644 --- a/docs/cisco-switch-metrics.md +++ b/docs/cisco-switch-metrics.md @@ -5,7 +5,7 @@ These can be generated on demand by running `bin/harvest grafana metrics`. See [#1577](https://github.com/NetApp/harvest/issues/1577#issue-1471478260) for details. ``` -Creation Date : 2026-Apr-03 +Creation Date : 2026-Apr-08 NX-OS Version: 9.3.12 ``` diff --git a/docs/eseries-metrics.md b/docs/eseries-metrics.md index 054057855..2622b8f1a 100644 --- a/docs/eseries-metrics.md +++ b/docs/eseries-metrics.md @@ -5,7 +5,7 @@ These can be generated on demand by running `bin/harvest grafana metrics`. See [#1577](https://github.com/NetApp/harvest/issues/1577#issue-1471478260) for details. ``` -Creation Date : 2026-Apr-03 +Creation Date : 2026-Apr-08 E-Series Version: 11.80.0 ``` @@ -1473,6 +1473,63 @@ The `eseries_volume_labels` metric is visualized in the following Grafana dashbo +### eseries_volume_other_ops + +Volume other I/O operations per second + + +| API | Endpoint | Metric | Template | +|--------|----------|--------|---------| +| REST | `storage-systems/{array_id}/live-statistics` | `otherOps` | conf/eseriesperf/11.80.0/volume.yaml | + +The `eseries_volume_other_ops` metric is visualized in the following Grafana dashboards: + +/// html | div.grafana-table +| Dashboard | Row | Type | Panel | +|--------|----------|--------|--------| +| E-Series: Volume | Highlights | timeseries | [Top $TopResources Volumes by Other IOPs](/d/eseries-volume/e-series3a-volume?orgId=1&viewPanel=46) | +/// + + + +### eseries_volume_queue_depth_average + +Average queue depth per I/O operation + + +| API | Endpoint | Metric | Template | +|--------|----------|--------|---------| +| REST | `storage-systems/{array_id}/live-statistics` | `Harvest Generated` | conf/eseriesperf/11.80.0/volume.yaml | + +The `eseries_volume_queue_depth_average` metric is visualized in the following Grafana dashboards: + +/// html | div.grafana-table +| Dashboard | Row | Type | Panel | +|--------|----------|--------|--------| +| E-Series: Volume | Queue Depth | timeseries | [Top $TopResources Volumes by Queue Depth Average](/d/eseries-volume/e-series3a-volume?orgId=1&viewPanel=44) | +/// + + + +### eseries_volume_queue_depth_max + +Maximum queue depth seen over the observation window + + +| API | Endpoint | Metric | Template | +|--------|----------|--------|---------| +| REST | `storage-systems/{array_id}/live-statistics` | `queueDepthMax` | conf/eseriesperf/11.80.0/volume.yaml | + +The `eseries_volume_queue_depth_max` metric is visualized in the following Grafana dashboards: + +/// html | div.grafana-table +| Dashboard | Row | Type | Panel | +|--------|----------|--------|--------| +| E-Series: Volume | Queue Depth | timeseries | [Top $TopResources Volumes by Queue Depth Max](/d/eseries-volume/e-series3a-volume?orgId=1&viewPanel=45) | +/// + + + ### eseries_volume_read_cache_hit_ratio Volume read cache hit ratio calculated from read hit operations and total read operations diff --git a/docs/ontap-metrics.md b/docs/ontap-metrics.md index de49c1610..a5c290adb 100644 --- a/docs/ontap-metrics.md +++ b/docs/ontap-metrics.md @@ -7,7 +7,7 @@ These can be generated on demand by running `bin/harvest grafana metrics`. See - More information about ONTAP REST performance counters can be found [here](https://docs.netapp.com/us-en/ontap-pcmap-9121/index.html). ``` -Creation Date : 2026-Apr-03 +Creation Date : 2026-Apr-08 ONTAP Version: 9.16.1 ``` diff --git a/docs/storagegrid-metrics.md b/docs/storagegrid-metrics.md index 062771eff..3a39c760a 100644 --- a/docs/storagegrid-metrics.md +++ b/docs/storagegrid-metrics.md @@ -5,7 +5,7 @@ These can be generated on demand by running `bin/harvest grafana metrics`. See [#1577](https://github.com/NetApp/harvest/issues/1577#issue-1471478260) for details. ``` -Creation Date : 2026-Apr-03 +Creation Date : 2026-Apr-08 StorageGrid Version: 11.6.0 ``` diff --git a/grafana/dashboards/eseries/volume.json b/grafana/dashboards/eseries/volume.json index e308abb46..a3f261a73 100644 --- a/grafana/dashboards/eseries/volume.json +++ b/grafana/dashboards/eseries/volume.json @@ -1,8 +1,9 @@ { + "__elements": {}, "__inputs": [ { "description": "", - "label": "Prometheus", + "label": "prometheus", "name": "DS_PROMETHEUS", "pluginId": "prometheus", "pluginName": "Prometheus", @@ -14,7 +15,7 @@ "id": "grafana", "name": "Grafana", "type": "grafana", - "version": "8.1.8" + "version": "12.3.2" }, { "id": "prometheus", @@ -39,7 +40,9 @@ "list": [ { "builtIn": 1, - "datasource": "-- Grafana --", + "datasource": { + "uid": "-- Grafana --" + }, "enable": true, "hide": true, "iconColor": "rgba(0, 211, 255, 1)", @@ -54,12 +57,10 @@ } ] }, - "description": "", "editable": true, - "gnetId": null, + "fiscalYearStartMonth": 0, "graphTooltip": 1, "id": null, - "iteration": 1770277648441, "links": [ { "asDropdown": true, @@ -80,7 +81,6 @@ "panels": [ { "collapsed": false, - "datasource": "${DS_PROMETHEUS}", "gridPos": { "h": 1, "w": 24, @@ -93,7 +93,10 @@ "type": "row" }, { - "datasource": "${DS_PROMETHEUS}", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "description": "Volume read latency.", "fieldConfig": { "defaults": { @@ -101,9 +104,13 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 10, "gradientMode": "none", @@ -112,6 +119,7 @@ "tooltip": false, "viz": false }, + "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, @@ -119,6 +127,7 @@ "type": "linear" }, "showPoints": "auto", + "showValues": false, "spanNulls": true, "stacking": { "group": "A", @@ -134,7 +143,7 @@ "steps": [ { "color": "green", - "value": null + "value": 0 }, { "color": "red", @@ -161,15 +170,22 @@ "max" ], "displayMode": "table", - "placement": "bottom" + "placement": "bottom", + "showLegend": true }, "tooltip": { - "mode": "single" + "hideZeros": false, + "mode": "single", + "sort": "none" } }, - "pluginVersion": "8.1.8", + "pluginVersion": "12.3.2", "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "exemplar": false, "expr": "eseries_volume_read_latency{array=~\"$Array\",datacenter=~\"$Datacenter\",volume=~\"$Volume\"}\nand on (datacenter, volume, array)\n topk(\n $TopResources,\n max by (datacenter, volume, array) (\n avg_over_time(\n eseries_volume_read_latency{array=~\"$Array\",datacenter=~\"$Datacenter\",volume=~\"$Volume\"}[3h] @ end()\n )\n )\n )", "interval": "", @@ -177,14 +193,14 @@ "refId": "A" } ], - "timeFrom": null, - "timeShift": null, "title": "Top $TopResources Volumes by Read Latency", - "transformations": [], "type": "timeseries" }, { - "datasource": "${DS_PROMETHEUS}", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "description": "Volume write latency.", "fieldConfig": { "defaults": { @@ -192,9 +208,13 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 10, "gradientMode": "none", @@ -203,6 +223,7 @@ "tooltip": false, "viz": false }, + "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, @@ -210,6 +231,7 @@ "type": "linear" }, "showPoints": "auto", + "showValues": false, "spanNulls": true, "stacking": { "group": "A", @@ -225,7 +247,7 @@ "steps": [ { "color": "green", - "value": null + "value": 0 }, { "color": "red", @@ -252,15 +274,22 @@ "max" ], "displayMode": "table", - "placement": "bottom" + "placement": "bottom", + "showLegend": true }, "tooltip": { - "mode": "single" + "hideZeros": false, + "mode": "single", + "sort": "none" } }, - "pluginVersion": "8.1.8", + "pluginVersion": "12.3.2", "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "exemplar": false, "expr": "eseries_volume_write_latency{array=~\"$Array\",datacenter=~\"$Datacenter\",volume=~\"$Volume\"}\nand on (datacenter, volume, array)\n topk(\n $TopResources,\n max by (datacenter, volume, array) (\n avg_over_time(\n eseries_volume_write_latency{array=~\"$Array\",datacenter=~\"$Datacenter\",volume=~\"$Volume\"}[3h] @ end()\n )\n )\n )", "interval": "", @@ -268,14 +297,14 @@ "refId": "A" } ], - "timeFrom": null, - "timeShift": null, "title": "Top $TopResources Volumes by Write Latency", - "transformations": [], "type": "timeseries" }, { - "datasource": "${DS_PROMETHEUS}", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "description": "Number of reads per second from the volume.", "fieldConfig": { "defaults": { @@ -283,9 +312,13 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 10, "gradientMode": "none", @@ -294,6 +327,7 @@ "tooltip": false, "viz": false }, + "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, @@ -301,6 +335,7 @@ "type": "linear" }, "showPoints": "auto", + "showValues": false, "spanNulls": true, "stacking": { "group": "A", @@ -317,7 +352,7 @@ "steps": [ { "color": "green", - "value": null + "value": 0 }, { "color": "red", @@ -344,15 +379,22 @@ "max" ], "displayMode": "table", - "placement": "bottom" + "placement": "bottom", + "showLegend": true }, "tooltip": { - "mode": "single" + "hideZeros": false, + "mode": "single", + "sort": "none" } }, - "pluginVersion": "8.1.8", + "pluginVersion": "12.3.2", "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "exemplar": false, "expr": "eseries_volume_read_ops{array=~\"$Array\",datacenter=~\"$Datacenter\",volume=~\"$Volume\"}\nand on (datacenter, volume, array)\n topk(\n $TopResources,\n max by (datacenter, volume, array) (\n avg_over_time(\n eseries_volume_read_ops{array=~\"$Array\",datacenter=~\"$Datacenter\",volume=~\"$Volume\"}[3h] @ end()\n )\n )\n )", "interval": "", @@ -360,14 +402,14 @@ "refId": "A" } ], - "timeFrom": null, - "timeShift": null, "title": "Top $TopResources Volumes by Read IOPs", - "transformations": [], "type": "timeseries" }, { - "datasource": "${DS_PROMETHEUS}", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "description": "Number of writes per second to the volume.", "fieldConfig": { "defaults": { @@ -375,9 +417,13 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 10, "gradientMode": "none", @@ -386,6 +432,7 @@ "tooltip": false, "viz": false }, + "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, @@ -393,6 +440,7 @@ "type": "linear" }, "showPoints": "auto", + "showValues": false, "spanNulls": true, "stacking": { "group": "A", @@ -409,7 +457,7 @@ "steps": [ { "color": "green", - "value": null + "value": 0 }, { "color": "red", @@ -436,15 +484,22 @@ "max" ], "displayMode": "table", - "placement": "bottom" + "placement": "bottom", + "showLegend": true }, "tooltip": { - "mode": "single" + "hideZeros": false, + "mode": "single", + "sort": "none" } }, - "pluginVersion": "8.1.8", + "pluginVersion": "12.3.2", "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "exemplar": false, "expr": "eseries_volume_write_ops{array=~\"$Array\",datacenter=~\"$Datacenter\",volume=~\"$Volume\"}\nand on (datacenter, volume, array)\n topk(\n $TopResources,\n max by (datacenter, volume, array) (\n avg_over_time(\n eseries_volume_write_ops{array=~\"$Array\",datacenter=~\"$Datacenter\",volume=~\"$Volume\"}[3h] @ end()\n )\n )\n )", "interval": "", @@ -452,14 +507,14 @@ "refId": "A" } ], - "timeFrom": null, - "timeShift": null, "title": "Top $TopResources Volumes by Write IOPs", - "transformations": [], "type": "timeseries" }, { - "datasource": "${DS_PROMETHEUS}", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "description": "Bytes read per second from the volume.", "fieldConfig": { "defaults": { @@ -467,9 +522,13 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 10, "gradientMode": "none", @@ -478,6 +537,7 @@ "tooltip": false, "viz": false }, + "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, @@ -485,6 +545,7 @@ "type": "linear" }, "showPoints": "auto", + "showValues": false, "spanNulls": true, "stacking": { "group": "A", @@ -500,7 +561,7 @@ "steps": [ { "color": "green", - "value": null + "value": 0 }, { "color": "red", @@ -527,15 +588,22 @@ "max" ], "displayMode": "table", - "placement": "bottom" + "placement": "bottom", + "showLegend": true }, "tooltip": { - "mode": "single" + "hideZeros": false, + "mode": "single", + "sort": "none" } }, - "pluginVersion": "8.1.8", + "pluginVersion": "12.3.2", "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "exemplar": false, "expr": "eseries_volume_read_data{array=~\"$Array\",datacenter=~\"$Datacenter\",volume=~\"$Volume\"}\nand on (datacenter, volume, array)\n topk(\n $TopResources,\n max by (datacenter, volume, array) (\n avg_over_time(\n eseries_volume_read_data{array=~\"$Array\",datacenter=~\"$Datacenter\",volume=~\"$Volume\"}[3h] @ end()\n )\n )\n )", "interval": "", @@ -544,14 +612,14 @@ "refId": "A" } ], - "timeFrom": null, - "timeShift": null, "title": "Top $TopResources Volumes by Read Throughput", - "transformations": [], "type": "timeseries" }, { - "datasource": "${DS_PROMETHEUS}", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "description": "Bytes written per second to the volume.", "fieldConfig": { "defaults": { @@ -559,9 +627,13 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 10, "gradientMode": "none", @@ -570,6 +642,7 @@ "tooltip": false, "viz": false }, + "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, @@ -577,6 +650,7 @@ "type": "linear" }, "showPoints": "auto", + "showValues": false, "spanNulls": true, "stacking": { "group": "A", @@ -592,7 +666,7 @@ "steps": [ { "color": "green", - "value": null + "value": 0 }, { "color": "red", @@ -619,15 +693,22 @@ "max" ], "displayMode": "table", - "placement": "bottom" + "placement": "bottom", + "showLegend": true }, "tooltip": { - "mode": "single" + "hideZeros": false, + "mode": "single", + "sort": "none" } }, - "pluginVersion": "8.1.8", + "pluginVersion": "12.3.2", "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "exemplar": false, "expr": "eseries_volume_write_data{array=~\"$Array\",datacenter=~\"$Datacenter\",volume=~\"$Volume\"}\nand on (datacenter, volume, array)\n topk(\n $TopResources,\n max by (datacenter, volume, array) (\n avg_over_time(\n eseries_volume_write_data{array=~\"$Array\",datacenter=~\"$Datacenter\",volume=~\"$Volume\"}[3h] @ end()\n )\n )\n )", "interval": "", @@ -635,31 +716,137 @@ "refId": "A" } ], - "timeFrom": null, - "timeShift": null, "title": "Top $TopResources Volumes by Write Throughput", - "transformations": [], + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "Number of other I/O operations per second to the volume.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "showValues": false, + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "iops" + }, + "overrides": [] + }, + "gridPos": { + "h": 12, + "w": 12, + "x": 0, + "y": 37 + }, + "id": 46, + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "12.3.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": false, + "expr": "eseries_volume_other_ops{array=~\"$Array\",datacenter=~\"$Datacenter\",volume=~\"$Volume\"}\nand on (datacenter, volume, array)\n topk(\n $TopResources,\n max by (datacenter, volume, array) (\n avg_over_time(\n eseries_volume_other_ops{array=~\"$Array\",datacenter=~\"$Datacenter\",volume=~\"$Volume\"}[3h] @ end()\n )\n )\n )", + "interval": "", + "legendFormat": "{{array}} - {{volume}}", + "refId": "A" + } + ], + "title": "Top $TopResources Volumes by Other IOPs", "type": "timeseries" }, { "collapsed": true, - "datasource": "${DS_PROMETHEUS}", "gridPos": { "h": 1, "w": 24, "x": 0, - "y": 37 + "y": 49 }, "id": 37, "panels": [ { - "datasource": "${DS_PROMETHEUS}", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "description": "Volume details.", "fieldConfig": { "defaults": { "custom": { "align": "left", - "displayMode": "auto", + "cellOptions": { + "type": "auto" + }, "filterable": true }, "mappings": [], @@ -667,8 +854,7 @@ "mode": "absolute", "steps": [ { - "color": "rgb(31, 176, 196)", - "value": null + "color": "rgb(31, 176, 196)" } ] }, @@ -760,6 +946,10 @@ "pluginVersion": "8.1.8", "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "exemplar": false, "expr": "label_join(\n eseries_volume_labels{array=~\"$Array\",datacenter=~\"$Datacenter\",volume=~\"$Volume\"},\n \"unique_id\",\n \"-\",\n \"datacenter\",\n \"array\",\n \"volume\"\n)", "format": "table", @@ -770,6 +960,10 @@ "refId": "B" }, { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "exemplar": false, "expr": "label_join(\n eseries_volume_allocated_capacity{array=~\"$Array\",datacenter=~\"$Datacenter\",volume=~\"$Volume\"},\n \"unique_id\",\n \"-\",\n \"datacenter\",\n \"array\",\n \"volume\"\n)", "format": "table", @@ -781,6 +975,10 @@ "refId": "A" }, { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "exemplar": false, "expr": "label_join(\n eseries_volume_reported_capacity{array=~\"$Array\",datacenter=~\"$Datacenter\",volume=~\"$Volume\"},\n \"unique_id\",\n \"-\",\n \"datacenter\",\n \"array\",\n \"volume\"\n)", "format": "table", @@ -792,6 +990,10 @@ "refId": "C" }, { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "exemplar": false, "expr": "label_join(\n eseries_volume_block_size{array=~\"$Array\",datacenter=~\"$Datacenter\",volume=~\"$Volume\"},\n \"unique_id\",\n \"-\",\n \"datacenter\",\n \"array\",\n \"volume\"\n)", "format": "table", @@ -803,8 +1005,6 @@ "refId": "D" } ], - "timeFrom": null, - "timeShift": null, "title": "Volumes", "transformations": [ { @@ -913,17 +1113,19 @@ }, { "collapsed": true, - "datasource": "${DS_PROMETHEUS}", "gridPos": { "h": 1, "w": 24, "x": 0, - "y": 38 + "y": 50 }, "id": 39, "panels": [ { - "datasource": "${DS_PROMETHEUS}", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "description": "Percentage of read requests served from cache.", "fieldConfig": { "defaults": { @@ -966,8 +1168,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -994,7 +1195,8 @@ "max" ], "displayMode": "table", - "placement": "bottom" + "placement": "bottom", + "showLegend": true }, "tooltip": { "mode": "single" @@ -1003,6 +1205,10 @@ "pluginVersion": "8.1.8", "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "exemplar": false, "expr": "eseries_volume_read_cache_hit_ratio{array=~\"$Array\",datacenter=~\"$Datacenter\",volume=~\"$Volume\"}\nand on (datacenter, volume, array)\n topk(\n $TopResources,\n max by (datacenter, volume, array) (\n avg_over_time(\n eseries_volume_read_cache_hit_ratio{array=~\"$Array\",datacenter=~\"$Datacenter\",volume=~\"$Volume\"}[3h] @ end()\n )\n )\n )", "interval": "", @@ -1010,14 +1216,14 @@ "refId": "A" } ], - "timeFrom": null, - "timeShift": null, "title": "Top $TopResources Volumes by Read Cache Hit Ratio", - "transformations": [], "type": "timeseries" }, { - "datasource": "${DS_PROMETHEUS}", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "description": "Percentage of write requests served from cache.", "fieldConfig": { "defaults": { @@ -1060,8 +1266,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -1088,7 +1293,8 @@ "max" ], "displayMode": "table", - "placement": "bottom" + "placement": "bottom", + "showLegend": true }, "tooltip": { "mode": "single" @@ -1097,6 +1303,10 @@ "pluginVersion": "8.1.8", "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "exemplar": false, "expr": "eseries_volume_write_cache_hit_ratio{array=~\"$Array\",datacenter=~\"$Datacenter\",volume=~\"$Volume\"}\nand on (datacenter, volume, array)\n topk(\n $TopResources,\n max by (datacenter, volume, array) (\n avg_over_time(\n eseries_volume_write_cache_hit_ratio{array=~\"$Array\",datacenter=~\"$Datacenter\",volume=~\"$Volume\"}[3h] @ end()\n )\n )\n )", "interval": "", @@ -1104,14 +1314,14 @@ "refId": "A" } ], - "timeFrom": null, - "timeShift": null, "title": "Top $TopResources Volumes by Write Cache Hit Ratio", - "transformations": [], "type": "timeseries" }, { - "datasource": "${DS_PROMETHEUS}", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "description": "Percentage of total requests served from cache.", "fieldConfig": { "defaults": { @@ -1154,8 +1364,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -1182,7 +1391,8 @@ "max" ], "displayMode": "table", - "placement": "bottom" + "placement": "bottom", + "showLegend": true }, "tooltip": { "mode": "single" @@ -1191,6 +1401,10 @@ "pluginVersion": "8.1.8", "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "exemplar": false, "expr": "eseries_volume_total_cache_hit_ratio{array=~\"$Array\",datacenter=~\"$Datacenter\",volume=~\"$Volume\"}\nand on (datacenter, volume, array)\n topk(\n $TopResources,\n max by (datacenter, volume, array) (\n avg_over_time(\n eseries_volume_total_cache_hit_ratio{array=~\"$Array\",datacenter=~\"$Datacenter\",volume=~\"$Volume\"}[3h] @ end()\n )\n )\n )", "interval": "", @@ -1198,20 +1412,223 @@ "refId": "A" } ], - "timeFrom": null, - "timeShift": null, "title": "Top $TopResources Volumes by Total Cache Hit Ratio", - "transformations": [], "type": "timeseries" } ], "title": "Cache", "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 51 + }, + "id": 43, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "Average queue depth per I/O operation.", + "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": "auto", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 12, + "w": 12, + "x": 0, + "y": 39 + }, + "id": 44, + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single" + } + }, + "pluginVersion": "8.1.8", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": false, + "expr": "eseries_volume_queue_depth_average{array=~\"$Array\",datacenter=~\"$Datacenter\",volume=~\"$Volume\"}\nand on (datacenter, volume, array)\n topk(\n $TopResources,\n max by (datacenter, volume, array) (\n avg_over_time(\n eseries_volume_queue_depth_average{array=~\"$Array\",datacenter=~\"$Datacenter\",volume=~\"$Volume\"}[3h] @ end()\n )\n )\n )", + "interval": "", + "legendFormat": "{{array}} - {{volume}}", + "refId": "A" + } + ], + "title": "Top $TopResources Volumes by Queue Depth Average", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "Maximum queue depth seen over the observation window.", + "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": "auto", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 12, + "w": 12, + "x": 12, + "y": 39 + }, + "id": 45, + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single" + } + }, + "pluginVersion": "8.1.8", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": false, + "expr": "eseries_volume_queue_depth_max{array=~\"$Array\",datacenter=~\"$Datacenter\",volume=~\"$Volume\"}\nand on (datacenter, volume, array)\n topk(\n $TopResources,\n max by (datacenter, volume, array) (\n avg_over_time(\n eseries_volume_queue_depth_max{array=~\"$Array\",datacenter=~\"$Datacenter\",volume=~\"$Volume\"}[3h] @ end()\n )\n )\n )", + "interval": "", + "legendFormat": "{{array}} - {{volume}}", + "refId": "A" + } + ], + "title": "Top $TopResources Volumes by Queue Depth Max", + "type": "timeseries" + } + ], + "title": "Queue Depth", + "type": "row" } ], + "preload": false, "refresh": "", - "schemaVersion": 30, - "style": "dark", + "schemaVersion": 42, "tags": [ "harvest", "eseries" @@ -1219,35 +1636,26 @@ "templating": { "list": [ { - "current": { - "selected": false, - "text": "Prometheus", - "value": "Prometheus" - }, - "description": null, - "error": null, + "current": {}, "hide": 2, "includeAll": false, "label": "Data Source", - "multi": false, "name": "DS_PROMETHEUS", "options": [], "query": "prometheus", - "refresh": 2, + "refresh": 1, "regex": "", - "skipUrlSync": false, "type": "datasource" }, { "allValue": ".*", "current": {}, - "datasource": "${DS_PROMETHEUS}", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "definition": "label_values(eseries_array_labels, datacenter)", - "description": null, - "error": null, - "hide": 0, "includeAll": true, - "label": null, "multi": true, "name": "Datacenter", "options": [], @@ -1257,23 +1665,18 @@ }, "refresh": 2, "regex": "", - "skipUrlSync": false, "sort": 7, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false + "type": "query" }, { "allValue": ".*", "current": {}, - "datasource": "${DS_PROMETHEUS}", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "definition": "label_values(eseries_array_labels{datacenter=~\"$Datacenter\"}, array)", - "description": null, - "error": null, - "hide": 0, "includeAll": true, - "label": null, "multi": true, "name": "Array", "options": [], @@ -1283,23 +1686,18 @@ }, "refresh": 2, "regex": "", - "skipUrlSync": false, "sort": 7, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false + "type": "query" }, { "allValue": ".*", "current": {}, - "datasource": "${DS_PROMETHEUS}", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "definition": "label_values(eseries_volume_labels{datacenter=~\"$Datacenter\",array=~\"$Array\"}, volume)", - "description": null, - "error": null, - "hide": 0, "includeAll": true, - "label": null, "multi": true, "name": "Volume", "options": [], @@ -1309,26 +1707,15 @@ }, "refresh": 2, "regex": "", - "skipUrlSync": false, "sort": 7, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false + "type": "query" }, { - "allValue": null, "current": { - "selected": true, "text": "5", "value": "5" }, - "description": null, - "error": null, - "hide": 0, "includeAll": false, - "label": null, - "multi": false, "name": "TopResources", "options": [ { @@ -1403,8 +1790,6 @@ } ], "query": "1,2,3,4,5,6,8,10,15,25,50,100,250,500", - "queryValue": "", - "skipUrlSync": false, "type": "custom" } ] @@ -1429,5 +1814,6 @@ "timezone": "", "title": "E-Series: Volume", "uid": "eseries-volume", - "version": 1 + "version": 1, + "weekStart": "" } diff --git a/mcp/metadata/eseries_metrics.json b/mcp/metadata/eseries_metrics.json index 6c88cd682..e2e04f574 100644 --- a/mcp/metadata/eseries_metrics.json +++ b/mcp/metadata/eseries_metrics.json @@ -75,6 +75,9 @@ "eseries_volume_allocated_capacity": "Allocated capacity of the volume in bytes", "eseries_volume_block_size": "Block size of the volume in bytes", "eseries_volume_labels": "This metric provides information about volumes.", + "eseries_volume_other_ops": "Volume other I/O operations per second", + "eseries_volume_queue_depth_average": "Average queue depth per I/O operation", + "eseries_volume_queue_depth_max": "Maximum queue depth seen over the observation window", "eseries_volume_read_cache_hit_ratio": "Volume read cache hit ratio calculated from read hit operations and total read operations", "eseries_volume_read_data": "Volume read data throughput in bytes per second", "eseries_volume_read_hit_ops": "Number of read operations that hit cache",