dashboard: use counters for disk queue length and VHD latency (#2582)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Jan-Otto Kröpke <mail@jkroepke.de>
This commit is contained in:
Jan-Otto Kröpke
2026-10-09 13:57:40 +02:00
committed by GitHub
co-authored by Claude Opus 5.5
parent fa3abe8c3c
commit 59d981b6c8
3 changed files with 10 additions and 10 deletions
+3 -3
View File
@@ -293,11 +293,11 @@ b.tab(
]),
b.panel.new(43, 'Disk queue length', 'timeseries')
+ b.panel.withDescription('Average number of read and write requests queued for the volume. Reads are drawn below the axis. A queue that stays high while latency rises indicates a disk bottleneck. The avg_*_requests_queued metrics grow like counters, so the panel takes their rate.')
+ b.panel.withDescription('Average number of read and write requests queued for the volume. Reads are drawn below the axis. A queue that stays high while latency rises indicates a disk bottleneck.')
+ b.panel.withQueries([
b.query.new('rate(windows_logical_disk_avg_write_requests_queued{job=~"$job", instance="$instance", volume=~"$volume"}[$__rate_interval])', 'A')
b.query.new('rate(windows_logical_disk_write_seconds_total{job=~"$job", instance="$instance", volume=~"$volume"}[$__rate_interval])', 'A')
+ b.query.withLegendFormat('{{volume}} write'),
b.query.new('rate(windows_logical_disk_avg_read_requests_queued{job=~"$job", instance="$instance", volume=~"$volume"}[$__rate_interval])', 'B')
b.query.new('rate(windows_logical_disk_read_seconds_total{job=~"$job", instance="$instance", volume=~"$volume"}[$__rate_interval])', 'B')
+ b.query.withLegendFormat('{{volume}} read'),
])
+ b.panel.withDefaults({
+2 -2
View File
@@ -278,9 +278,9 @@ b.tab(
]),
b.panel.new(78, 'Virtual disk latency and errors', 'timeseries')
+ b.panel.withDescription('Average I/O latency of each virtual disk. windows_hyperv_virtual_storage_device_latency_seconds holds the raw, growing counter in 100 ns ticks, so the panel divides its rate by the rate of I/O operations. Errors use the right axis.')
+ b.panel.withDescription('Average I/O latency of each virtual disk. Errors use the right axis.')
+ b.panel.withQueries([
b.query.new('rate(windows_hyperv_virtual_storage_device_latency_seconds{job=~"$job", instance="$instance"}[$__rate_interval]) / (rate(windows_hyperv_virtual_storage_device_operations_read_total{job=~"$job", instance="$instance"}[$__rate_interval]) + rate(windows_hyperv_virtual_storage_device_operations_written_total{job=~"$job", instance="$instance"}[$__rate_interval])) / 1e7', 'A')
b.query.new('rate(windows_hyperv_virtual_storage_device_io_latency_seconds_total{job=~"$job", instance="$instance"}[$__rate_interval]) / rate(windows_hyperv_virtual_storage_device_throughput_total{job=~"$job", instance="$instance"}[$__rate_interval])', 'A')
+ b.query.withLegendFormat('{{device}} latency'),
b.query.new('rate(windows_hyperv_virtual_storage_device_error_count_total{job=~"$job", instance="$instance"}[$__rate_interval]) > 0', 'B')
+ b.query.withLegendFormat('{{device}} errors'),
+5 -5
View File
@@ -9237,7 +9237,7 @@
"kind": "DataQuery",
"spec": {
"editorMode": "code",
"expr": "rate(windows_logical_disk_avg_write_requests_queued{job=~\"$job\", instance=\"$instance\", volume=~\"$volume\"}[$__rate_interval])",
"expr": "rate(windows_logical_disk_write_seconds_total{job=~\"$job\", instance=\"$instance\", volume=~\"$volume\"}[$__rate_interval])",
"instant": false,
"legendFormat": "{{volume}} write",
"range": true
@@ -9259,7 +9259,7 @@
"kind": "DataQuery",
"spec": {
"editorMode": "code",
"expr": "rate(windows_logical_disk_avg_read_requests_queued{job=~\"$job\", instance=\"$instance\", volume=~\"$volume\"}[$__rate_interval])",
"expr": "rate(windows_logical_disk_read_seconds_total{job=~\"$job\", instance=\"$instance\", volume=~\"$volume\"}[$__rate_interval])",
"instant": false,
"legendFormat": "{{volume}} read",
"range": true
@@ -9274,7 +9274,7 @@
"transformations": []
}
},
"description": "Average number of read and write requests queued for the volume. Reads are drawn below the axis. A queue that stays high while latency rises indicates a disk bottleneck. The avg_*_requests_queued metrics grow like counters, so the panel takes their rate.",
"description": "Average number of read and write requests queued for the volume. Reads are drawn below the axis. A queue that stays high while latency rises indicates a disk bottleneck.",
"id": 43,
"links": [],
"title": "Disk queue length",
@@ -13291,7 +13291,7 @@
"kind": "DataQuery",
"spec": {
"editorMode": "code",
"expr": "rate(windows_hyperv_virtual_storage_device_latency_seconds{job=~\"$job\", instance=\"$instance\"}[$__rate_interval]) / (rate(windows_hyperv_virtual_storage_device_operations_read_total{job=~\"$job\", instance=\"$instance\"}[$__rate_interval]) + rate(windows_hyperv_virtual_storage_device_operations_written_total{job=~\"$job\", instance=\"$instance\"}[$__rate_interval])) / 1e7",
"expr": "rate(windows_hyperv_virtual_storage_device_io_latency_seconds_total{job=~\"$job\", instance=\"$instance\"}[$__rate_interval]) / rate(windows_hyperv_virtual_storage_device_throughput_total{job=~\"$job\", instance=\"$instance\"}[$__rate_interval])",
"instant": false,
"legendFormat": "{{device}} latency",
"range": true
@@ -13328,7 +13328,7 @@
"transformations": []
}
},
"description": "Average I/O latency of each virtual disk. windows_hyperv_virtual_storage_device_latency_seconds holds the raw, growing counter in 100 ns ticks, so the panel divides its rate by the rate of I/O operations. Errors use the right axis.",
"description": "Average I/O latency of each virtual disk. Errors use the right axis.",
"id": 78,
"links": [],
"title": "Virtual disk latency and errors",