Metrics Reference
All series use the powerscale_ prefix — matching
dell/csm-metrics-powerscale — and are
gauges. Metric names are unit-explicit: _bytes, _bytes_per_second,
_operations_per_second, _microseconds, _percent, _seconds.
Per-second gauges — do not rate()
_operations_per_second and _bytes_per_second metrics are already per-second
gauges sampled from OneFS. Aggregate them with sum/avg in PromQL — never
rate() or irate(). The inventory counts (NFS exports, SMB shares, snapshots, drives,
power supplies) are also gauges (current counts), not cumulative counters; they carry
no _total suffix, which Prometheus reserves for counters.
Labels
Every metric carries the canonical leading labels cluster and cluster_id, with
scope-specific labels appended:
| Scope | Labels |
|---|---|
| Cluster | cluster, cluster_id |
| Node | cluster, cluster_id, node (logical node number / LNN) |
| Quota | cluster, cluster_id, quota_id, quota_path, quota_type |
| Protocol | cluster, cluster_id, node, protocol (e.g. nfs3, smb2), op |
| Health / meta | cluster only |
Cluster metrics
| Metric | Unit | Description |
|---|---|---|
powerscale_cluster_cpu_sys_percent |
percent | System CPU usage. |
powerscale_cluster_cpu_user_percent |
percent | User CPU usage. |
powerscale_cluster_cpu_idle_percent |
percent | Idle CPU. |
powerscale_cluster_total_capacity_bytes |
bytes | Total /ifs filesystem capacity. |
powerscale_cluster_used_capacity_bytes |
bytes | Used capacity. |
powerscale_cluster_available_capacity_bytes |
bytes | Available (user-writable) capacity. |
powerscale_cluster_free_capacity_bytes |
bytes | Raw free capacity. |
powerscale_cluster_disk_operations_per_second |
ops/s | Cluster-wide disk transfer rate. |
powerscale_cluster_net_in_bytes_per_second |
bytes/s | External inbound network throughput. |
powerscale_cluster_net_out_bytes_per_second |
bytes/s | External outbound network throughput. |
Node metrics
Per-node series; the node label is the logical node number (LNN).
| Metric | Unit | Description |
|---|---|---|
powerscale_node_cpu_idle_percent |
percent | Per-node idle CPU. |
powerscale_node_cpu_sys_percent |
percent | Per-node system CPU. |
powerscale_node_cpu_user_percent |
percent | Per-node user CPU. |
powerscale_node_memory_used_bytes |
bytes | Per-node memory used. |
powerscale_node_disk_operations_per_second |
ops/s | Per-node disk transfer rate. |
powerscale_node_used_capacity_bytes |
bytes | Per-node used /ifs capacity. |
Cache
Per-node read-cache metrics for the L1/L2/L3 data-read path. Keys are node-scoped under the
OneFS node.ifs.cache.* namespace, confirmed against a live cluster via
isi statistics list keys (equivalently GET /platform/1/statistics/keys). Note that
statistics/current is all-or-nothing: a single invalid key fails the entire batch and
drops all current-statistics metrics — so any new key here must be validated against a live
cluster first. Compute hit ratio in PromQL as hit / (hit + miss).
Unit semantics are confirmed against a live cluster via --trace: OneFS reports these as
per-second rates in bytes/second (fractional byte counts averaged over its sample
window), so aggregate with sum/avg — never rate().
| Metric | Unit |
|---|---|
powerscale_node_cache_l1_read_hit_bytes_per_second / ..._miss_... |
bytes/s |
powerscale_node_cache_l2_read_hit_bytes_per_second / ..._miss_... |
bytes/s |
powerscale_node_cache_l3_read_hit_bytes_per_second / ..._miss_... |
bytes/s |
Node health
| Metric | Unit | Description |
|---|---|---|
powerscale_node_readonly |
bool | 1 if the node is mounted read-only. |
powerscale_node_smartfail |
bool | 1 if the node is smartfailing / smartfailed. |
powerscale_node_drives |
count | Drive count per node, labelled by state (e.g. HEALTHY, SMARTFAIL, DEAD). |
Hardware (provisional)
Per-node power-supply health and temperature/fan sensors, from the node status /
sensors payload. Best-effort; schema is provisional — emits nothing if your OneFS
release shapes these differently. Temperature/fan series carry a sensor label.
| Metric | Unit | Description |
|---|---|---|
powerscale_node_power_supplies |
count | Power supplies present on the node. |
powerscale_node_power_supply_failures |
count | Failed power supplies on the node. |
powerscale_node_temperature_celsius |
°C | Temperature sensor reading. |
powerscale_node_fan_speed_rpm |
rpm | Fan speed reading. |
powerscale_node_hardware_info |
— | Always 1; the node's hardware identity is in the product, series and hwgen labels. |
Virtual clusters have no hardware metrics
The four sensor metrics above are absent on a virtual cluster — a hypervisor exposes no
physical fans, temperature probes or power supplies, so OneFS returns powersupplies.count:
0 and empty sensor groups. This is the expected result, not a broken exporter.
powerscale_node_hardware_info is how you tell. A node counts as virtual on either
marker — series="virtual_series" or a hwgen naming the hypervisor (VMware) — since
OneFS does not guarantee both; the simulator reports both, and additionally a product
starting with SIMULATOR-. The exporter also logs the reason once per cluster at startup:
cluster "pscale-cluster1": 4/4 nodes report virtual hardware (series=virtual_series,
hwgen=VMware, product=SIMULATOR-1U-Dual-6144MB-1x1GE-100GB) and expose no physical
sensors, so powerscale_node_temperature_celsius, powerscale_node_fan_speed_rpm,
powerscale_node_power_supplies and powerscale_node_power_supply_failures are
absent for those nodes
To count virtual nodes in PromQL:
count(
powerscale_node_hardware_info{series="virtual_series"}
or powerscale_node_hardware_info{hwgen=~"(?i).*vmware.*"}
) by (cluster)
If only some nodes go quiet on a physical cluster, the same log line names them and does not call them virtual — that case is worth investigating as a real sensor fault.
Quota metrics
| Metric | Unit | Description |
|---|---|---|
powerscale_quota_usage_bytes |
bytes | Logical usage for the quota. |
powerscale_quota_application_usage_bytes |
bytes | Application logical usage (usage.applogical), the size as users see it. Always emitted; 0 when the API version lacks the field. |
powerscale_quota_physical_usage_bytes |
bytes | Physical usage (post data-reduction). Emitted when > 0. |
powerscale_quota_reduction_ratio |
ratio | Logical ÷ physical space (compression + dedupe). OneFS 9.15+ only (quota API v25); emitted when non-null. Not yet validated on a live cluster. |
powerscale_quota_hard_threshold_bytes |
bytes | Hard limit. Emitted only when set (> 0). |
powerscale_quota_soft_threshold_bytes |
bytes | Soft limit. Emitted only when set (> 0). |
powerscale_quota_advisory_threshold_bytes |
bytes | Advisory limit. Emitted only when set (> 0). |
Protocol metrics
Per-node, per-protocol, per-operation, from the OneFS protocol summary.
| Metric | Unit | Description |
|---|---|---|
powerscale_protocol_operations_per_second |
ops/s | Operation rate for protocol/op. |
powerscale_protocol_latency_microseconds |
µs | Average latency for protocol/op. |
powerscale_protocol_latency_stage_microseconds |
µs | Average latency per processing stage (auth, export, fha_blocking, fiber_block_quota, kernel = QoS blocking, spark_dispatch, total_elapsed). OneFS 9.15+ only (protocol API v26); stages the cluster omits are not emitted. Not yet validated on a live cluster. |
Inventory counts
| Metric | Unit | Description |
|---|---|---|
powerscale_nfs_exports |
count | Number of NFS exports. |
powerscale_smb_shares |
count | Number of SMB shares. |
powerscale_snapshots |
count | Number of snapshots. |
Data protection
All best-effort: a cluster without SyncIQ (or where the account lacks privilege) simply emits no series.
| Metric | Unit | Description | Labels |
|---|---|---|---|
powerscale_snapshot_used_bytes |
bytes | Aggregate space held by snapshots. | cluster, cluster_id |
powerscale_synciq_policy_enabled |
bool | 1 if the SyncIQ replication policy is enabled. |
+ policy |
powerscale_synciq_last_run_failed |
bool | 1 if the policy's last run failed / needs attention. |
+ policy |
powerscale_active_events |
count | Unresolved OneFS event-group occurrences. | + severity |
Storage efficiency
Cluster-wide deduplication, from dedupe/dedupe-summary. Best-effort; bytes are derived as
block counts × block size (validated against the OneFS 9.14.0 schema).
| Metric | Unit | Description |
|---|---|---|
powerscale_dedupe_logical_saved_bytes |
bytes | Logical space saved by deduplication. |
powerscale_dedupe_deduplicated_bytes |
bytes | Logical data that has been deduplicated. |
Licenses
Per-feature OneFS license state, fetched best-effort from license/licenses (requires
ISI_PRIV_LICENSE; absent if the account lacks it). The OneFS expiration date is parsed
to an absolute Unix timestamp; perpetual/unlicensed features carry no expiration and report
0.
| Metric | Labels | Description |
|---|---|---|
powerscale_license_expiration_timestamp_seconds |
name |
Unix timestamp when the feature's license expires; 0 for perpetual/unlicensed features. |
powerscale_license_active |
name, status |
1 when the feature is licensed and usable (OneFS status Licensed / Activated / Evaluation), else 0. The raw OneFS status is carried as a label. |
Alert on a feature expiring within 30 days (perpetual features report 0 and are excluded
by the > 0 guard):
powerscale_license_expiration_timestamp_seconds > 0
and (powerscale_license_expiration_timestamp_seconds - time()) < 30 * 86400
Storage pools
Per-pool and per-tier capacity from SmartPools, fetched best-effort from
storagepool/storagepools (requires ISI_PRIV_SMARTPOOLS; absent if the account lacks it).
Labels: pool (pool/tier name) and type (nodepool or tier).
The list contains both node pools and tiers, and a tier's capacity is the sum of its
child node pools — so summing a metric across all rows double-counts. Filter
type="nodepool" for a non-overlapping cluster-wide total. Every metric is emitted for every
pool; an all-HDD pool simply reports ssd=0.
| Metric | Description |
|---|---|
powerscale_storagepool_total_capacity_bytes |
Total capacity of the pool/tier. |
powerscale_storagepool_used_capacity_bytes |
Used capacity. |
powerscale_storagepool_available_capacity_bytes |
Available (user-writable) capacity. |
powerscale_storagepool_ssd_total_capacity_bytes |
SSD-media total capacity. |
powerscale_storagepool_ssd_used_capacity_bytes |
SSD-media used capacity. |
powerscale_storagepool_ssd_available_capacity_bytes |
SSD-media available capacity. |
powerscale_storagepool_hdd_total_capacity_bytes |
HDD-media total capacity. |
powerscale_storagepool_hdd_used_capacity_bytes |
HDD-media used capacity. |
powerscale_storagepool_hdd_available_capacity_bytes |
HDD-media available capacity. |
Alert on a node pool over 85% full:
Per-drive
From statistics/summary/drive. Best-effort. Labels: cluster,
cluster_id, node, bay, type (e.g. SSD, HDD).
| Metric | Unit | Description |
|---|---|---|
powerscale_drive_operations_per_second |
ops/s | Per-drive operation rate. |
powerscale_drive_busy_percent |
percent | Per-drive busy time. |
Per-client
From statistics/summary/client, aggregated by node / protocol / class to bound
cardinality (individual remote clients are intentionally not exported). Best-effort.
| Metric | Unit | Description |
|---|---|---|
powerscale_client_operations_per_second |
ops/s | Operation rate per node/protocol/class. |
powerscale_client_in_bytes_per_second |
bytes/s | Inbound throughput. |
powerscale_client_out_bytes_per_second |
bytes/s | Outbound throughput. |
Workloads
Per-workload performance, from statistics/summary/workload. Best-effort and covered by
ISI_PRIV_STATISTICS (already required for the other statistics).
Requires a configured performance dataset
Workload rows are produced by OneFS performance datasets (isi performance datasets).
Without a configured dataset this endpoint returns few or only aggregate rows, so these
metrics may be empty until you define one. The dataset's pinned dimensions also determine
which labels are populated — an unpinned dimension is the empty string.
Labels: cluster, cluster_id, node (0 = cluster-scoped), zone, protocol, username,
system_name, job_type. The high-cardinality dimensions OneFS also reports (path, client IP
addresses, SIDs) are intentionally not exported; control cardinality through your dataset
definition. A dataset pinned only on an excluded dimension (e.g. path alone) will have all its
rows collapse to a single label tuple, so some rows are silently dropped — pin datasets on at
least one exported dimension.
| Metric | Unit | Description |
|---|---|---|
powerscale_workload_operations_per_second |
ops/s | Operation rate for the workload. |
powerscale_workload_in_bytes_per_second |
bytes/s | Inbound throughput. |
powerscale_workload_out_bytes_per_second |
bytes/s | Outbound throughput. |
powerscale_workload_cpu_microseconds_per_second |
µs/s | CPU time consumed per second across all cores (a per-second gauge — sum/avg, never rate()). |
Top 5 workloads by operation rate, per cluster:
Per-workload disk/cache detail (reads, writes, l2, l3) and latency are planned
follow-ups — latency is held back until a live workload body confirms its unit.
Health & metadata
These carry only the cluster label.
| Metric | Unit | Description |
|---|---|---|
powerscale_up |
bool | 1 if the cluster was scraped successfully, 0 otherwise. |
powerscale_last_scrape_timestamp_seconds |
unix seconds | Time of the last successful collection. |
powerscale_cluster_api_version |
version | Detected OneFS platform API version. |
Exporter metadata
Exporter-level, not tied to any cluster (no cluster label).
| Metric | Unit | Description |
|---|---|---|
pscale_exporter_build_info |
constant 1 |
Exporter build information; the running version and Go version are carried in the version and goversion labels. |
Example queries
# Cluster capacity used %, per cluster
100 * powerscale_cluster_used_capacity_bytes
/ powerscale_cluster_total_capacity_bytes
# Total protocol ops per cluster (per-second gauge — sum, never rate)
sum by (cluster) (powerscale_protocol_operations_per_second)
# Top 5 quotas by usage
topk(5, powerscale_quota_usage_bytes)
# Clusters currently down
powerscale_up == 0
These same series back the bundled alert rules and the Grafana dashboard.
Extending coverage
To add a curated OneFS statistic, add a row to
internal/powerscale/statisticsKeys.json with key, metric, and scope
(cluster | node) — no code change is needed. Node-scope keys map a devid to a
node LNN automatically. Keep names unit-explicit and prefixed with powerscale_.
Add the optional divisor when OneFS reports the key in a different unit than the metric
name claims. Check this against a live cluster: the cpu.*.avg keys, for instance, are
reported in tenths of a percent (idle + user + sys sums to 1000, not 100), so their
rows carry "divisor": 10. Omitting it passes the raw value through.