Reports¶
S2DCartographer generates publication-quality reports and structured data exports from collected cluster data. All human-readable formats show TiB and TB side-by-side throughout. Structured formats (JSON, CSV) carry both unit representations on every size field so downstream tools never need to convert.
Formats¶
| Format | Extension | Use case |
|---|---|---|
| HTML | .html |
Interactive browser dashboard; self-contained, no dependencies |
| Word | .docx |
Customer deliverables, architecture review documents |
.pdf |
Archivable, printable, universally readable | |
| Excel | .xlsx |
Data analysis, capacity tracking over time |
| JSON | .json |
Structured snapshot of the full S2DClusterData object for downstream tools, diffs, external dashboards. Schema documented in Cluster Snapshot Schema |
| CSV | .csv (4 files) |
Flat per-collector tables: physical disks, volumes, health checks, waterfall. For spreadsheet / Power BI consumers |
| All | — | Generates HTML + Word + PDF + Excel + JSON in one call (CSV is opt-in and must be requested explicitly) |
HTML Dashboard¶
Self-contained single-file HTML with embedded CSS and Chart.js 4.4.0. No internet connection required — all assets are inlined.
Sections:
- Executive Summary — cluster name, node count, overall health badge (green/yellow/red), collection timestamp
- Capacity Waterfall — interactive horizontal bar chart (Chart.js) showing all 7 stages with values
- TiB/TB Toggle — switch in the toolbar flips all capacity values between TiB and TB simultaneously
- Physical Disk Inventory — table with node, model, media type, role, capacity, wear %, health
- Storage Pool — total/allocated/remaining capacity, overcommit ratio
- Volume Map — per-volume resiliency, footprint, efficiency %, infra flag
- Health Checks — traffic-light cards per check with Details and Remediation text
- TiB/TB Reference — conversion table for common NVMe/SSD drive sizes
Generate:
$data = Invoke-S2DCartographer -ClusterName "c01-prd-bal" -Credential $cred -PassThru
New-S2DReport -InputObject $data -Format Html -OutputDirectory "C:\Reports\"
Word Document¶
Pure PowerShell .docx — no Microsoft Office or COM automation required. Uses System.IO.Compression.ZipArchive to generate Open XML directly.
Sections:
- Title page with cluster name, author, company, and collection date
- Executive Summary — health status, key capacity metrics
- Capacity Waterfall — 7-stage table
- Physical Disk Inventory — full table with all disk fields
- Volume Map — per-volume resiliency and capacity
- Health Assessment — all 11 checks with severity-coded status and remediation guidance
- Appendix A: TiB vs TB Explanation
- Appendix B: S2D Reserve Space Best Practices
Generate:
New-S2DReport -InputObject $data -Format Word `
-Author "Kristopher Turner" -Company "TierPoint" `
-OutputDirectory "C:\Deliverables\"
No Office required
The Word document is built from scratch using Open XML — compatible with Word 2016+, LibreOffice, and Google Docs. Microsoft Office does not need to be installed on the machine running S2DCartographer.
Garbled XML on open
If the generated .docx opens with a repair prompt or shows garbled XML, this is usually caused by special characters (em-dashes, Unicode symbols) in cluster or volume names. Please open an issue with the cluster name and affected volume names.
PDF¶
Generates HTML first, then uses headless Edge or Chrome to print it to PDF.
Browser search order:
msedge.exein standard Edge install pathschrome.exein standard Chrome install pathsmsedge/chrome/chromium-browseron$env:PATH
Generate:
Browser requirement
PDF generation requires Microsoft Edge or Google Chrome. Edge ships pre-installed on Windows 11, Windows Server 2022+, and Azure Local nodes. If no browser is found, the command warns and returns $null.
Manual PDF from HTML
If no browser is available, generate the HTML report first, then open it in a browser to print manually (Edge/Chrome → Print → Save as PDF).
New-S2DReport -InputObject $data -Format Html -OutputDirectory "C:\Reports\"
# Open the .html file in Edge/Chrome → Print → Save as PDF
Excel Workbook¶
Multi-tab .xlsx using the ImportExcel module.
Tabs:
| Tab | Content |
|---|---|
| Summary | Cluster name, node count, health status, collection date, key capacity metrics |
| Capacity Waterfall | All 7 stages with TiB and TB columns |
| Physical Disks | Full disk inventory — node, model, media type, role, capacity, wear %, firmware |
| Storage Pool | Pool name, health, total/allocated/remaining, overcommit ratio, resiliency settings |
| Volumes | All volumes — resiliency, copies, provisioning type, size, footprint, efficiency |
| Health Checks | All 11 checks — name, severity, status, details, remediation |
| Metadata | Module version, collection timestamp, cluster FQDN, node list |
Generate:
ImportExcel installed automatically
ImportExcel is declared as a required module in the S2DCartographer manifest. When you install S2DCartographer from PSGallery, ImportExcel is installed automatically — no manual step required.
JSON Snapshot¶
Structured data export of the full S2DClusterData object. Intended for downstream tools (historical diff, what-if scenarios, external dashboards, custom scripts). Included by default when -Format All is used.
File name: S2DCartographer_<ClusterName>_<yyyyMMdd-HHmm>.json
Shape:
{
"SchemaVersion": "1.0",
"Generated": { "Timestamp": "...", "ModuleVersion": "...", ... },
"Cluster": { "Name": "...", "Fqdn": "...", "NodeCount": 4, "Nodes": [...], ... },
"OverallHealth": "Warning",
"PhysicalDisks": [ { ... } ],
"StoragePool": { ... },
"Volumes": [ { ... } ],
"CacheTier": { ... },
"CapacityWaterfall": { ... },
"HealthChecks": [ { ... } ]
}
Full schema: Cluster Snapshot Schema.
Canonical sample: samples/cluster-snapshot.json.
Consuming from PowerShell:
$snap = Get-Content .\S2DCartographer_*.json -Raw | ConvertFrom-Json
$snap.PhysicalDisks | Where-Object IsPoolMember | Measure-Object -Property SizeBytes -Sum
$snap.HealthChecks | Where-Object Status -ne 'Pass'
Consuming from jq:
jq '.CapacityWaterfall.UsableCapacity.TiB' snapshot.json
jq '.HealthChecks[] | select(.Status != "Pass")' snapshot.json
JSON always contains every disk
The JSON export includes every disk visible to every node — boot drives and SAN-presented LUNs too — each tagged with an IsPoolMember boolean. This is by design: downstream tools get full fidelity. The Physical Disk Inventory in HTML / Word / PDF / Excel reports filters to pool members only by default.
CSV Tables¶
Flat per-collector tables for spreadsheet / Power BI consumers. Opt-in via -Format Csv (not included in -Format All).
Files produced:
| File suffix | Content |
|---|---|
-physical-disks.csv |
One row per disk including IsPoolMember column |
-volumes.csv |
One row per volume |
-health-checks.csv |
One row per health check |
-waterfall.csv |
One row per waterfall stage |
Generate:
New-S2DReport -InputObject $data -Format Csv -OutputDirectory "C:\Reports\"
# Or combine with All
New-S2DReport -InputObject $data -Format All, Csv -OutputDirectory "C:\Reports\"
What-If Modeling Reports¶
Invoke-S2DCapacityWhatIf generates standalone what-if reports that are independent of the cluster audit reports above. They model capacity changes without a live cluster.
Formats:
| Format | Content |
|---|---|
| HTML | Side-by-side Chart.js waterfall charts (baseline left, projected right), KPI summary row (usable capacity, delta, reserve status, efficiency), scenario badge, stage-by-stage delta table with color-coded delta column |
| JSON | Structured output (SchemaVersion 1.0, Type S2DWhatIfResult) with both waterfalls flattened to stage arrays and all TiB/TB delta values |
Generate:
# From a JSON snapshot — no live cluster required
Invoke-S2DCapacityWhatIf `
-BaselineSnapshot C:\snapshots\clus01-20260413.json `
-AddNodes 2 `
-OutputDirectory C:\Reports\WhatIf `
-Format Html, Json
# From a live run, piped directly
Invoke-S2DCartographer -ClusterName clus01 -Credential $cred -PassThru |
Invoke-S2DCapacityWhatIf -ChangeResiliency 2 -OutputDirectory C:\Reports\WhatIf
See What-If Modeling for all scenario parameters and worked examples.
Using New-S2DReport directly¶
New-S2DReport requires an S2DClusterData object. Obtain one with -PassThru on Invoke-S2DCartographer, or by building the pipeline manually.
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
-InputObject |
S2DClusterData |
Yes | Cluster data object (also accepts pipeline) |
-Format |
string[] |
Yes | Html, Word, Pdf, Excel, Json, Csv, or All |
-OutputDirectory |
string |
No | Destination folder (default: C:\S2DCartographer) |
-Author |
string |
No | Author name embedded in report headers |
-Company |
string |
No | Company/org name embedded in report headers |
-IncludeNonPoolDisks |
switch |
No | Include boot drives and SAN-presented LUNs in the Physical Disk Inventory table. Default is to show pool members only. Does not affect JSON or CSV outputs, which always include every disk |
Output folder structure: Each Invoke-S2DCartographer run creates a per-run subfolder:
<OutputDirectory>\<ClusterName>\<yyyyMMdd-HHmm>\
S2DCartographer_<ClusterName>_<yyyyMMdd-HHmm>.html
S2DCartographer_<ClusterName>_<yyyyMMdd-HHmm>.docx
S2DCartographer_<ClusterName>_<yyyyMMdd-HHmm>.xlsx
S2DCartographer_<ClusterName>_<yyyyMMdd-HHmm>.pdf
S2DCartographer_<ClusterName>_<yyyyMMdd-HHmm>.json
S2DCartographer_<ClusterName>_<yyyyMMdd-HHmm>.log
S2DCartographer_<ClusterName>_<yyyyMMdd-HHmm>.log
diagrams\
Multiple clusters and repeated runs never overwrite each other.
Via Invoke-S2DCartographer¶
The orchestrator handles connect → collect → report → disconnect in one call:
# All formats — HTML, Word, PDF, Excel (default — no -Format needed)
Invoke-S2DCartographer -ClusterName "c01-prd-bal" -Credential (Get-Credential)
# All formats + all diagrams
Invoke-S2DCartographer -ClusterName "c01-prd-bal" -Credential $cred `
-IncludeDiagrams `
-Author "Your Name" -Company "Your Company" `
-OutputDirectory "C:\Reports\"
# Word + PDF only — customer deliverable
Invoke-S2DCartographer -ClusterName "customer-cluster-01" -Credential $cred `
-Format Word, Pdf `
-Author "Kristopher Turner" -Company "Hybrid Cloud Solutions" `
-OutputDirectory "C:\Deliverables\"
# Key Vault credentials (unattended) — all formats
Invoke-S2DCartographer -ClusterName "c01-prd-bal" `
-KeyVaultName "kv-platform-prod" -SecretName "cluster-admin-password" `
-OutputDirectory "C:\AutoReports\"