NetApp ONTAP → MIRASTACK Data Studio Query Reference
This document catalogs metric and log signals emitted by Telegen’s native NetApp ONTAP collector and provides ready-to-paste PromQL and LogSQL queries formatted for the MIRASTACK UI Data Studio dashboard builder.
Use it to build dashboards in Data Studio: pick an integration (data source), choose a chart type, and paste the query.
Metrics source:
internal/storage/netapp/— Harvest-compatible{object}_{counter}gauges/counters exported over OTLP (shared pipeline exporter, scopetelegen.storage).Logs source:
internal/storage/netapp/ems/— ONTAP EMS events fromapi/support/ems/events, exported over the OTLP log bridge (scopetelegen.storage.netapp.ems).Templates:
configs/netapp/{rest,restperf,keyperf,ems}/(adapted from NetApp Harvest; seeconfigs/netapp/SOURCE.md).
Related feature overview: Storage Adapters (NetApp ONTAP section).
1. Overview and caveats
1.1 Which collector this covers
Collector |
Path |
Metric naming |
Logs |
Covered here |
|---|---|---|---|---|
ONTAP Harvest-parity (storage adapter) |
|
|
EMS yes |
Yes |
E-Series SANtricity |
|
template |
No |
Appendix C (brief) |
Legacy hardcoded NetApp gauges |
removed ( |
— |
— |
No |
If queries return nothing, confirm storage.netapp_ontap is configured and that
metric names use Harvest-style prefixes (volume_, node_, aggr_, …), not
the old netapp_ontap_* names.
1.2 Gauge vs counter — when to use rate()
Telegen maps template counters as follows (matrix.ToStorageMetrics):
Template / cook result |
Exported type |
PromQL guidance |
|---|---|---|
Rest inventory (capacity, state, sizes) |
gauge |
Do not use |
RestPerf / KeyPerf after rate cooking |
usually gauge (already per-second) |
Do not use |
Explicit |
counter |
Use |
RestPerf and KeyPerf cook raw ONTAP counters into per-second rates (or
copy averages/percents) across consecutive polls (matrix.CookRates). Values
you see in VictoriaMetrics for IOPS, throughput, and latency are therefore
already rate-like gauges for dashboard purposes.
Consequences for PromQL:
Prefer
avg_over_time,max_over_time,sum by (...),topkfor smoothing.Only apply
rate()if you have confirmed a true monotonic counter series.
1.3 Label glossary
Common labels stamped on every ONTAP metric (ONTAPCollector.commonLabels):
Label |
Meaning |
|---|---|
|
Collector instance name from config ( |
|
Always |
|
Always |
|
Cluster name from capability probe (when available) |
|
Cluster UUID from capability probe (when available) |
Instance labels come from template ^ / ^^ counters and vary by object. Common
ones:
Label |
Typical objects |
Meaning |
|---|---|---|
|
node, aggr, volume, disk, … |
Node name |
|
volume, lun, lif, nfs/cifs, … |
SVM / vserver |
|
volume, snapmirror, lun, … |
Volume name |
|
aggr, volume, … |
Aggregate name |
|
volume |
e.g. |
|
many |
Instance UUID / key |
|
volume, aggr, node, … |
Operational state string (as label where templated) |
Operator labels: from config are merged onto every metric. Resource attribute
service.name=telegen-storage; scope telegen.storage. Depending on VictoriaMetrics
OTLP ingestion these may appear as extra labels (e.g. otel_scope_name).
1.4 Engines and coverage
Engine |
Role |
Schedule (typical) |
|---|---|---|
Rest |
Inventory / capacity / config (public REST + |
~3m |
RestPerf |
Perf via |
~1m |
KeyPerf |
Perf via resource |
~1m |
EMS |
Events → OTLP logs + optional |
~3m |
Capability probe auto-disables RestPerf when counter tables are unavailable (ASA r2, GCNV, older clusters) and enables KeyPerf instead.
coverage: full (default) includes Harvest opt-in objects (CIFS sessions,
locks, NFS clients, …). Use harvest_default to reduce cardinality.
1.5 How Data Studio sends these queries
Same contract as the VMware reference:
Metrics — integration victoriametrics, queryType: promql:
Single-value (
chartType: metric) → instant/api/v1/queryTime-series → range
/api/v1/query_rangewith toolbarstart/end/step
Logs — integration victorialogs, queryType: logsql:
Raw
logs/table→/select/logsql/queryChart widgets →
/select/logsql/stats_query_rangewith canonical order:<filter> | stats by (_time:<bucket>[, <group fields>]) <aggFn>(...) as value
1.6 Log field-name caveat
EMS attributes become VictoriaLogs fields; body maps to _msg. Exact field
names depend on OTLP → VictoriaLogs mapping. Queries below use attribute keys
verbatim (message, severity, node, array_name, …). Validate with
field_names on a live instance before locking dashboards.
2. Metrics catalog
All PromQL assumes one or more clusters. Scope with
array_name="<collector-name>" or cluster="<cluster-name>", e.g.
volume_read_ops{array_name="ontap-prod"}.
Telegen enumerates the full Harvest ONTAP catalog (1,558 metric families)
from Rest / RestPerf / KeyPerf templates plus Aggregator, Max, MetricAgent,
LabelAgent, VolumeTop, Sensor/Shelf/Health, and related plugin expansions
(make netapp-parity). Sections below highlight families used most often in
dashboards; they are not exhaustive.
2.1 Cluster / health
Sources: Rest cluster.yaml, status.yaml, health.yaml, subsystem.yaml;
KeyPerf cluster.yaml.
Metric (examples) |
Type |
Meaning |
Common labels |
|---|---|---|---|
|
gauge |
Cluster free space |
|
|
gauge |
Cluster IOPS |
|
|
gauge |
Cluster throughput (bytes/s after cook) |
|
|
gauge |
Cluster latency |
|
|
gauge |
Cluster health indicator |
|
|
gauge |
Outstanding subsystem alerts |
|
|
gauge |
EMS events seen in last poll (by severity label) |
|
Queries:
# Cluster count (metric widget)
count(count by (array_name, cluster) (cluster_total_ops))
# Cluster total IOPS (timeseries)
sum(cluster_total_ops) by (array_name, cluster)
# Cluster throughput bytes/s (timeseries)
sum(cluster_total_data) by (array_name, cluster)
# EMS events in last poll by severity (table)
ems_events
2.2 Node / SystemNode
Sources: Rest node.yaml; RestPerf system_node.yaml (object: node).
Metric (examples) |
Type |
Unit |
Meaning |
|---|---|---|---|
|
gauge |
percent |
Average processor busy |
|
gauge |
— |
CPU busy |
|
gauge |
— |
Memory counter from system:node |
|
gauge |
ops/s |
Node IOPS |
|
gauge |
bytes/s |
Node throughput |
|
gauge |
— |
Node latency |
|
gauge |
— |
Network data |
|
gauge |
— |
Disk data |
|
gauge |
ops/s |
Protocol ops |
|
gauge |
count |
Hardware failure counts (inventory) |
Labels: node, array_name, cluster, …
Queries:
# Nodes reporting CPU busy (metric)
count(node_avg_processor_busy)
# Per-node CPU busy (timeseries)
node_avg_processor_busy
# Top 5 busy nodes (timeseries)
topk(5, node_avg_processor_busy)
# Per-node total IOPS (timeseries)
node_total_ops
# Per-node network throughput (timeseries)
sum(node_net_data_recv + node_net_data_sent) by (node, array_name)
2.3 Aggregate capacity & performance
Sources: Rest aggr.yaml; KeyPerf aggr.yaml; Aggregator rollups may add
node-level summaries.
Metric (examples) |
Type |
Unit |
Meaning |
|---|---|---|---|
|
gauge |
bytes |
Aggregate size |
|
gauge |
bytes |
Free space |
|
gauge |
bytes |
Used space |
|
gauge |
bytes |
Physical used |
|
gauge |
percent |
Physical used % |
|
gauge |
percent |
Storage efficiency savings % |
|
gauge |
ops/s |
Aggr IOPS |
|
gauge |
bytes/s |
Aggr throughput |
|
gauge |
— |
Aggr latency |
Labels: aggr, node, uuid, state, array_name, …
Queries:
# Aggregate count
count(aggr_space_total)
# Used percent per aggregate (timeseries)
100 * aggr_space_used / aggr_space_total
# Aggregates above 90% used (metric / instant)
count((100 * aggr_space_used / aggr_space_total) >= 90)
# Free space per aggregate (timeseries)
aggr_space_available
# Total free capacity across estate (metric)
sum(aggr_space_available)
Suggested
unit:bytesfor space;percentfor used%.
2.4 Volume capacity & performance
Sources: Rest volume.yaml (private CLI capacity); KeyPerf volume.yaml
(statistics IOPS/latency/throughput — RestPerf Volume delegates here).
Capacity (Rest):
Metric (examples) |
Type |
Unit |
Meaning |
|---|---|---|---|
|
gauge |
bytes |
Volume size |
|
gauge |
bytes |
Available |
|
gauge |
bytes |
Used |
|
gauge |
percent |
Used % |
|
gauge |
bytes |
Physical used |
|
gauge |
count |
Inodes |
|
gauge |
bytes / % |
Efficiency |
|
gauge |
— |
Snapshot reserve |
Performance (KeyPerf):
Metric (examples) |
Type |
Unit |
Meaning |
|---|---|---|---|
|
gauge |
ops/s |
IOPS |
|
gauge |
bytes/s |
Throughput |
|
gauge |
— |
Latency |
|
gauge |
— |
Per-NFS-op stats |
Labels: volume, svm, style, node, aggr, array_name, …
Queries:
# Online volume count (approx — instance presence)
count(volume_size_used)
# Volume used % (timeseries)
volume_size_used_percent
# Volumes above 90% used (instant)
count(volume_size_used_percent >= 90)
# Per-volume IOPS (timeseries)
volume_total_ops
# Per-volume throughput (timeseries)
volume_total_data
# Per-volume average latency (timeseries)
volume_avg_latency
# Top 10 volumes by IOPS
topk(10, volume_total_ops)
# Top 10 volumes by used %
topk(10, volume_size_used_percent)
# IOPS by SVM
sum(volume_total_ops) by (svm, array_name)
2.5 LUN / Namespace (SAN / NVMe)
Sources: Rest + RestPerf / KeyPerf lun.yaml, namespace.yaml.
Metric (examples) |
Type |
Meaning |
|---|---|---|
|
gauge |
LUN capacity |
|
gauge |
LUN IOPS |
|
gauge |
LUN throughput |
|
gauge |
LUN latency |
|
gauge |
NVMe namespace capacity |
|
gauge |
Namespace IOPS |
|
gauge |
Namespace latency |
Queries:
# LUN count
count(lun_size)
# LUN IOPS
lun_total_ops
# Namespace latency
namespace_avg_total_latency
2.6 Disk / Shelf / NIC / LIF
Area |
Example metrics |
Notes |
|---|---|---|
Disk |
|
RestPerf |
Shelf |
Rest |
Hardware / shelf state |
NIC |
|
RestPerf |
LIF |
|
RestPerf / KeyPerf |
Queries:
# Busiest disks
topk(10, disk_busy)
# NIC errors
sum(nic_rx_errors + nic_tx_errors) by (array_name)
# LIF throughput
sum(lif_recv_data + lif_sent_data) by (array_name)
2.7 Protocol performance (NFS / CIFS / SMB / FCP / iSCSI)
RestPerf objects: nfsv3, nfsv4, nfsv4_1, nfsv4_2, node variants,
cifs_vserver, cifs_node, smb2, fcp, fcp_lif, iscsi_lif, …
Metric prefixes commonly include svm_, nfsv3_, nfsv4_, smb2_, fcp_,
iscsi_, node_nfs_*, node_cifs_* depending on template object: and
display rename. Discover exact names with:
# VictoriaMetrics metric names matching a prefix (Data Studio / Explore)
{__name__=~"nfsv3_.*"}
{__name__=~"smb2_.*"}
{__name__=~"fcp_.*"}
Queries:
# Example: NFS v3 ops if present in your estate
sum({__name__=~"nfsv3_.*_ops"}) by (array_name)
# Node-level NFS / CIFS ops from system:node
node_nfs_ops
node_cifs_ops
2.8 QoS workloads
Sources: RestPerf workload.yaml, workload_volume.yaml; Rest QoS policy
templates.
Metric (examples) |
Type |
Meaning |
|---|---|---|
|
gauge |
Workload IOPS |
|
gauge |
Workload latency |
|
gauge |
Workload throughput |
|
gauge |
Concurrency |
Queries:
# QoS workload IOPS
qos_ops
# Top 10 QoS workloads by latency
topk(10, qos_latency)
2.9 SnapMirror
Source: Rest snapmirror.yaml (private CLI).
Metric (examples) |
Type |
Meaning |
|---|---|---|
|
gauge |
Replication lag |
|
gauge |
Last transfer duration |
|
gauge |
Last transfer size |
|
gauge |
Cumulative transfer bytes |
|
gauge |
Update outcomes |
|
gauge |
Break / resync counters |
Queries:
# SnapMirror lag (timeseries)
snapmirror_lag_time
# Relationships with lag > 1h (instant) — adjust threshold to your SLA
count(snapmirror_lag_time > 3600)
# Failed updates
sum(snapmirror_update_failed_count) by (array_name)
2.10 WAFL / headroom / flash
RestPerf: wafl, wafl_hya_per_aggr, wafl_hya_sizer,
wafl_comp_aggr_vol_bin, resource_headroom_*, external_cache, …
Examples: wafl_memory_used, wafl_memory_free, wafl_cp_count,
wafl_total_cp_util, headroom_*. Use {__name__=~"wafl_.*"} /
{__name__=~"headroom_.*"} to explore.
3. Logs catalog (EMS)
Source: internal/storage/netapp/ems/, template configs/netapp/ems/9.6.0/ems.yaml
(~86 unique ONTAP message names, including bookend pairs).
Each matching EMS event becomes one OTLP log record. Optional metric
ems_events counts events per poll by severity.
3.1 Log fields
Field |
Always present? |
Meaning |
|---|---|---|
|
yes |
|
|
yes |
ONTAP EMS message name (e.g. |
|
usually |
EMS severity |
|
usually |
Node that logged the event |
|
usually |
EMS event index (watermark) |
|
yes |
From collector common labels |
|
when probed |
Cluster identity |
|
bookend resolve |
|
Additional parameter attributes (e.g. volume, lun_path, svm) are copied
from EMS parameters when present.
3.2 Representative message names
Catalog includes (non-exhaustive): LUN.destroy, LUN.offline,
NVMeNS.*, Nblade.cifs*, Nblade.vscan*, callhome.*,
disk.outOfService, diskShelf.psu.*, fabricpool.full,
fabricpool.nearly.full, hm.alert.raised, monitor.fan.*,
object.store.unavailable, qos.monitor.memory.maxed, sk.panic,
wafl.*, SnapMirror / MetroCluster / mediator messages, ransomware
(arw.volume.state, …).
Bookend example: LUN.offline resolves on LUN.online or after
resolve_after (default 672h).
3.3 LogSQL — raw stream
# All EMS for an array
array_name:"ontap-prod"
# Specific message
message:"LUN.offline"
# Hardware / shelf power
message:~"diskShelf|monitor.fan|callhome.battery"
# Vscan / antivirus
message:~"vscan"
# FabricPool capacity
message:~"fabricpool"
# Errors / critical (adjust to your severity strings)
severity:~"(?i)error|alert|emergency|critical"
3.4 LogSQL — charts
# EMS volume over time
array_name:* | stats by (_time:1m) count() as value
# By message name
array_name:* | stats by (_time:5m, message) count() as value
# By severity
array_name:* | stats by (_time:5m, severity) count() as value
# Top messages
array_name:* | stats by (_time:5m, message) count() as value | sort by (value) desc | limit 15
# Bookend resolutions
resolved:* | stats by (_time:1h, resolved) count() as value
4. Example dashboards
Each panel is a Data Studio widget. Use integration kind victoriametrics for
promql and victorialogs for logsql.
4.1 ONTAP Fleet Overview
Panel |
signalType |
queryType |
chartType |
unit |
query |
|---|---|---|---|---|---|
Arrays |
metrics |
promql |
metric |
— |
|
Nodes |
metrics |
promql |
metric |
— |
|
Aggregates |
metrics |
promql |
metric |
— |
|
Volumes |
metrics |
promql |
metric |
— |
|
Total aggr free |
metrics |
promql |
metric |
bytes |
|
Aggrs > 90% used |
metrics |
promql |
metric |
— |
|
Volumes > 90% used |
metrics |
promql |
metric |
— |
|
Cluster IOPS |
metrics |
promql |
timeseries |
— |
|
Cluster throughput |
metrics |
promql |
timeseries |
bytes |
|
4.2 Node Performance
Panel |
signalType |
queryType |
chartType |
unit |
query |
|---|---|---|---|---|---|
CPU busy |
metrics |
promql |
timeseries |
percent |
|
Top 5 CPU |
metrics |
promql |
timeseries |
percent |
|
Node IOPS |
metrics |
promql |
timeseries |
— |
|
Node latency |
metrics |
promql |
timeseries |
— |
|
Node throughput |
metrics |
promql |
timeseries |
bytes |
|
Network Rx+Tx |
metrics |
promql |
timeseries |
— |
|
Disk data |
metrics |
promql |
timeseries |
— |
|
Failed fans |
metrics |
promql |
metric |
— |
|
4.3 Aggregate & Volume Capacity
Panel |
signalType |
queryType |
chartType |
unit |
query |
|---|---|---|---|---|---|
Aggr capacity |
metrics |
promql |
timeseries |
bytes |
|
Aggr free |
metrics |
promql |
timeseries |
bytes |
|
Aggr used % |
metrics |
promql |
timeseries |
percent |
|
Volume used % |
metrics |
promql |
timeseries |
percent |
|
Top volumes by used % |
metrics |
promql |
timeseries |
percent |
|
Physical used |
metrics |
promql |
timeseries |
bytes |
|
Efficiency saved % |
metrics |
promql |
timeseries |
percent |
|
4.4 Volume / LUN Performance
Panel |
signalType |
queryType |
chartType |
unit |
query |
|---|---|---|---|---|---|
Volume IOPS |
metrics |
promql |
timeseries |
— |
|
Volume throughput |
metrics |
promql |
timeseries |
bytes |
|
Volume latency |
metrics |
promql |
timeseries |
— |
|
Top volumes by IOPS |
metrics |
promql |
timeseries |
— |
|
IOPS by SVM |
metrics |
promql |
timeseries |
— |
|
LUN IOPS |
metrics |
promql |
timeseries |
— |
|
LUN latency |
metrics |
promql |
timeseries |
— |
|
Namespace IOPS |
metrics |
promql |
timeseries |
— |
|
4.5 Data Protection (SnapMirror)
Panel |
signalType |
queryType |
chartType |
unit |
query |
|---|---|---|---|---|---|
Lag time |
metrics |
promql |
timeseries |
s |
|
Lag > 1h |
metrics |
promql |
metric |
— |
|
Last transfer size |
metrics |
promql |
timeseries |
bytes |
|
Failed updates |
metrics |
promql |
timeseries |
— |
|
4.6 EMS / Events
Panel |
signalType |
queryType |
chartType |
unit |
query |
|---|---|---|---|---|---|
Live EMS stream |
logs |
logsql |
logs |
— |
|
EMS volume |
logs |
logsql |
timeseries |
— |
|
By severity |
logs |
logsql |
timeseries |
— |
|
Top messages |
logs |
logsql |
table |
— |
|
Hardware events |
logs |
logsql |
logs |
— |
|
Vscan events |
logs |
logsql |
logs |
— |
|
Poll counters |
metrics |
promql |
timeseries |
— |
|
Appendix A — Enumerating metric names
Template-derived family count (repo root):
go run ./cmd/netapp-parity -templates configs/netapp -v
# or with Harvest catalog parity:
HARVEST_ONTAP_METRICS_JSON=/path/to/harvest/mcp/metadata/ontap_metrics.json make netapp-parity
Explore live names in VictoriaMetrics:
{__name__=~"volume_.*", array_name="ontap-prod"}
{__name__=~"node_.*"}
{__name__=~"aggr_.*"}
{__name__=~"snapmirror_.*"}
{__name__=~"qos_.*"}
{__name__=~"wafl_.*"}
Naming rule: {template.object}_{sanitized_display} where display comes from
Harvest => renames (or the counter path with ./- → _).
Appendix B — Config sketch
storage:
enabled: true
collect_interval: 60s
netapp_ontap:
- name: ontap-prod
address: https://cluster.example.com
username: monitor
password: ${NETAPP_PASSWORD}
verify_ssl: true
coverage: full # or harvest_default
collectors: [rest, restperf, keyperf, ems]
templates_dir: "" # default configs/netapp
ems:
enabled: true
resolve_after: 672h
labels:
datacenter: dc1
Schema truth: top-level storage.netapp_ontap (not collector.storage.netapp.targets).
Appendix C — E-Series (brief)
storage.netapp_eseries uses templates under configs/netapp/eseries and
eseriesperf. Metrics use the template object prefix with labels
vendor=netapp, product=eseries, array_name=<name>. This document focuses
on ONTAP; treat E-Series as a sibling collector and discover names with
{__name__=~".+", product="eseries"}.
Appendix D — Catalog parity
Telegen targets 100% Harvest ONTAP catalog parity (1,558 families in
harvest/mcp/metadata/ontap_metrics.json). Catalog expansion includes:
Rest / RestPerf / KeyPerf templates (including
coverage: fullopt-ins and ASA r2)Aggregator / Max object renames (
aggr_disk_*,node_disk_max_*,plex_disk_*, …)MetricAgent / LabelAgent (
*_new_status, compute metrics)VolumeTopClients / Files / Users (
volume_top_*)Sensor / Shelf / Health / FabricPool / QoS / Volume plugin families
Harvest-compatible
metadata_*/poller_*collector self-metrics
Verify:
HARVEST_ONTAP_METRICS_JSON=/path/to/harvest/mcp/metadata/ontap_metrics.json make netapp-parity
configs/netapp/parity-allowlist.txt must stay empty of metric names. Prefer
live {__name__=~...} discovery when wiring a new dashboard panel.