Repository navigation
Syspeek 0.10.0
Billed spend — what you were actually charged
The Cloud page could already estimate what this instance costs from a rate and its uptime. It now also reads what the provider actually billed the account, and keeps the two numbers labelled differently on purpose:
- AWS via Cost Explorer —
ce get-cost-and-usagewithUnblendedCost(not blended: blended averages the organization's rates, so a single-account user cannot reconcile it against the invoice), thence get-cost-forecastfor the rest of the month. - Azure via
consumption usage list(--top 1000, filtered onproperties/usageStart). - GCP (billing lives in a BigQuery export, there is no CLI cost API) and OCI (usage API not wired) are gated before anything spawns — the page says so instead of showing a zero.
- Both are queried through the CLI you already logged in with. Syspeek never reads or stores your credentials.
The window is UTC — CE's TimePeriod and Azure's usageStart are UTC dates, so a machine in IST and one in UTC ask for the same month.
| what you see | meaning |
|---|---|
| MTD | billed so far this month |
| month end | MTD + the provider's own forecast |
| daily chart | per-day billed amount, syspeek.cloud.spend_daily |
| by service | each service's share of the spend |
Cost Explorer and Azure consumption calls are billable to your account, so this runs every 6 h, has its own switch ([cloud] spend, default on) and its own budget (spend_timeout_ms, 30 s), and is named in the CLOUD FOOTPRINT card next to the link-local read and the inventory listing.
Prometheus gains syspeek_cloud_spend_month_usd, syspeek_cloud_spend_forecast_usd and syspeek_cloud_spend_service_usd{provider,service}, emitted only when the query actually answered.
AppImage auto-update works again
Every release since 0.5.0 shipped an AppImage advertising an UPDATE_INFORMATION channel that 404'd — appimagetool writes the .zsync into the current directory, so it landed gitignored in the repo root and never reached the release. build_appimage.sh now moves it next to the image and hard-fails the build if none was produced. An image that advertises an update channel that does not exist is worse than a failed build.
Syspeek-0.10.0-x86_64.AppImage.zsync is attached to this release and served from releases/latest/download/.
What this release's CI actually proves
- Runs on every push, all five jobs (ubuntu-24.04, macos-14, windows-latest,
.debclean-room on ubuntu:22.04 and ubuntu:24.04): 14/14 ctest,--probewith aworstMsblocking-call gate,--recordCSV/JSON, and the--dumpself-tests including all fifteen cloud ones (rate lookup, cost maths, app share, top consumers, staleness, four-provider fleet parsing, fleet age/self/cost, AWS + Azure spend parsing, forecast fold, UTC window, provider gate). - Cloud CLI end-to-end (synthetic accounts): generated
aws/az/gcloud/ociexecutables onPATHdrive the realprobeCloudFleet,CloudFleetRunnerand--cloud-prices— exact argv per provider, listing→rows with resolved ages, a logged-out CLI surfacing the credential gate that namesaws configure, non-JSON refused rather than half-parsed, a hanging CLI killed at its budget, a missing CLI surfacing the install gate, and the polled runner delivering with no update blocking. - The identity path runs against a real cloud metadata service on every push: the GitHub runners are Azure VMs, so the ubuntu and windows jobs read a genuine IMDS answer (instance id,
Standard_D4ads_v5, region, 4 vCPU, uptime).
What is proven by fixtures and maths, not by a live account
- The AWS CE and Azure consumption parsers are proven against the documented response shapes (botocore 1.43.120
ce/2017-10-25model, azure-cli 2.91.0consumption usage list), including the{"value":[…]}wrapper, string-or-numericpretaxCost, the 1000-row page cap and theEstimatedflag. - Forecast fold, service aggregation and money formatting are unit-tested; the
--dumpself-tests fold a fixture of 12.5 + 1.5 + 10.0 into $24.00 billed / $74.00 month end with a $50 forecast. - Never run on real hardware / a real account: a live Cost Explorer answer, a live Azure invoice comparison, and
--cloud-pricesagainst a credentialed CLI. There is no cloud account behind this project — that is why the CLI stub tests exist, and why the page states its gates instead of guessing.
Everything else from 0.9.0 is unchanged
GPU page, sensors + battery, process/unit/container actions, the history ring with rewind, alert silences with chart bands, the token-guarded /metrics bind, cloud identity/inventory, and the Qt 6.2/6.4 floor with the clean-room container install gate.