Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
1.0.0 - 2026-07-10
First stable release. The exporter is in production use monitoring multiple PowerStore arrays; this release makes the bundled dashboards correct for that multi-array case and adds a CI guard so they stay that way.
Changed
- Every dashboard panel now attributes its value to a named array. Panels that
aggregated a cluster- or appliance-wide value (capacity used, data-reduction and
efficiency ratios, IOPS/bandwidth/latency glances, port and drive counts) grouped
without
by (array), so with more than one array selected they showed a single blended, unattributable number. They now groupby (array)and render one labelled tile or series per array. Ratio rollups usesum by (array)(…)/sum by (array)(…), correcting a meaninglessavg()-of-ratios across arrays. - Series colour now identifies the entity, line style the direction. Colour derives
from the series name (
palette-classic-by-name) so every array, appliance or volume is distinguishable within a panel; read is solid and write dashed. This supersedes the fixedread=blue / write=orangeconvention, which drew every entity on a single-direction panel in one colour. See ADR 0016 (supersedes ADR-0014's colour clause).
Fixed
- Healthy arrays no longer render no tile at all on the count panels (Unhealthy Drives,
Ports Down, Sessions in Bad State). These count info series that are always
1, so a healthy array matched nothing and its tile vanished — indistinguishable from a dead exporter. The counts are now zero-filled viapowerstore_up, and boolean checks use theboolmodifier, so a healthy array reports0. - The "Top 10 Volumes — Read/Write Bandwidth" panels no longer draw all ten volumes in a
single colour (a catch-all
/.*/colour override).
Added
- A CI linter (
internal/dashboards, part ofmake ci) that fails the build on dashboard panels which aggregate withoutby (array), pin a fixed read/write colour, or use a catch-all fixed colour — so these regressions cannot ship again. The vendorednode-exporter-full.json(Grafana community 1860) is excluded.
0.12.0 - 2026-07-09
Added
- GoReleaser-driven release pipeline (
.goreleaser.yaml): cross-platform archives,checksums.txt, multi-arch GHCR image, and a Homebrew cask published tofjacquet/homebrew-tap(brew install fjacquet/tap/pstore_exporter). - Keyless cosign signature of the release checksums (Sigstore bundle,
checksums.txt.sigstore.json) via GitHub OIDC — no long-lived keys. make release-snapshotfor a local dry-run of the full release pipeline.
Changed
- Replication metrics now carry the replicated resource's name, not just its uuid:
powerstore_replication_session_stategainslocal_resource_name, andpowerstore_replication_transfer_rate_bytes_per_second/powerstore_replication_data_remaining_bytesgainresource_name. Names resolve for volume, volume_group, file_system, and nas_server sessions, falling back to the id when the resource is absent from the inventory. The Replication / DR dashboard now shows the resource name and the reportingarray(which disambiguates the two rows of a Metro pair) in place of the session uuid. - SBOM generation moved into GoReleaser (syft) as the single source of truth,
replacing
cyclonedx-gomod. Releases now ship a CycloneDX SBOM per archive (*.cdx.json); CI regenerates them in snapshot mode.make toolsno longer installscyclonedx-gomod. - Release artifacts are now
.tar.gzarchives (was raw binaries). - Dev
Dockerfilebuild stage pinned togolang:1.26.5(matchesgo.mod).
Security
- Bumped the Go toolchain floor to 1.26.5 (
go.mod), patching two standard-library vulnerabilities reported bygovulncheck: GO-2026-5856 (reachable viacrypto/tlsfrom the exporter's HTTP transport) and GO-2026-4970 (root escape via symlink inos, reachable throughgopowerstore.NewClientWithArgs). Both are fixed only ingo1.26.5. - All third-party and first-party GitHub Actions are now pinned to full commit
SHAs (with
# vXcomments) acrossci.yml,release.yml, anddocs.yml, hardening the CI/CD supply chain against mutable-tag attacks. See ADR 0008.
0.1.0 - 2026-06-04
Added
- Snapshot-model collector: a single background loop polls all arrays per interval
and publishes an immutable snapshot to a store; both the Prometheus
/metricsendpoint and the optional OTLP push read from that store, decoupling API load from scrape frequency. - Multi-array support: one exporter process monitors many arrays simultaneously;
every metric carries an
arraylabel; arrays are polled in parallel with graceful per-array degradation (one array's failure does not affect others, surfaced aspowerstore_up{array} 0). - Dell
gopowerstorev1.22.0 client for login-session token/cookie auth, topology enumeration, and per-entity performance metrics. - Auto-detected metrics collection paths: bulk compressed-CSV API on PowerStoreOS
≥ 4.1 (detected via
GetSoftwareMajorMinorVersion), with automatic per-entitymetrics/generatefallback for older firmware or on bulk-fetch failure; both paths emit identical metric names and label keys. - Metric coverage: appliance performance (IOPS, bandwidth, latency) and space; volume performance; file-system capacity; port link status.
- Hot config reload via SIGHUP and file-system watch (fsnotify).
- Grafana dashboards for block and file workloads with provisioning configuration.
- Docker Compose stack with Prometheus, Grafana, and optional OTEL Collector.
- Kubernetes manifests including Deployment, ServiceMonitor, and alert rules.
- systemd unit file for bare-metal deployment.
- MkDocs-Material documentation site.
- GitHub Actions workflows for CI, release, and docs publication.