github erikdarlingdata/PerformanceMonitor v3.5.0
3.5.0

5 hours ago

Alerting gets sharper, the MCP reads stop overstating what they saw, and the secret-file ACLs can finally be applied by something other than the installer.

Store schema v79. Existing stores migrate on first start; the three rungs are additive column adds, no rewrite.

Added

  • Alert on database file SIZE growth, graded per server (#2349) — between tempdb Space, whose denominator grows with autogrowth so its percentage falls as tempdb balloons, and Volume Free Space, which fires on the consequence and cannot attribute it to a file, sits a file that has grown large but has not yet filled its disk. Two gates: a RISE gate (this file grew N MB in the window), primary because a level alone re-pages forever about a size that has been true since Tuesday; and a LEVEL gate (this file is N% of its volume), which self-scales across a heterogeneous fleet. Zero disables either independently. Ships OFF. Both SKUs.
  • Database and LastEventUtc on the incident projection (#2361) — consumers had to string-search Details[] for the database, which was exact only for deadlocks and returned the wrong value on a multi-incident alert spanning databases.
  • Occurrence totals on every fingerprinted alert (#2362) — Long-Running Query, Volume Free Space, Version Store, Long-Running Job and Failed Agent Job now carry the monotonic total that blocking and deadlocks already had.
  • --harden-files (#2352) — re-applies the secret-file ACLs from an elevated prompt. The service computes the correct DACL and detects when the real one is wrong, but cannot apply it: re-ACLing a file it does not own needs WRITE_DAC. Verifies each target afterwards and exits non-zero if anything is still exposed.
  • Declared peer stores (#2339) — a Darling MCP server can name its siblings instead of answering "unknown server" for a host a peer covers. Disclosure only: no credentials, no addresses, no cross-store connections.

Changed

  • Compose statement_timeout is a store setting (#2357), defaulting to 15s, clamped to [5,600] on both read and use.
  • MCP tool results serialize compact (#2350) — the only consumer is a language model, and indentation buys it nothing. Config files people hand-edit keep indenting.
  • Test suites run under Microsoft.Testing.Platform (#2347) — the .NET 10 SDK dropped VSTest-mode support for MTP-based frameworks.

Fixed

  • get_query_trend silently truncated any window past 4 days (#2353) — it read only the raw tier while echoing hours_back back unchanged, and its empty path asserted "no history found in the last 168 hours" over a span it never read. It now routes to the hourly rollup by the age of the window's oldest point and reports source, effective_hours_back, bucket and truncated. Columns the rollup does not carry come back NULL, never zero — on an aggregate row a zero reads as "none observed".
  • get_query_store_top reported a window it could not serve (#2364) — same class, no rollup to route to, so the fix is honesty: the response carries the window actually served, and the empty path no longer blames Query Store configuration for a span it never read.
  • Server Inventory's Last Updated was a config-snapshot time wearing a freshness label (#2359) — server_properties collects once on server load, so the column showed the last service start and every actively-monitored server looked days stale.
  • Extended-length paths slipped past the install-location guards (#2348) — \\?\UNC\server\share is the long spelling of a real share; skipping a check is not the same as passing it.
  • The service now says WHY it cannot start when installed somewhere its own account cannot read (#2185).
  • The per-database watermark read was an unbounded MAX over every chunk in retention (#2344) — measured on a live 106 GB store: 25,766 buffer reads cold against 29 ms bounded, and the cost scaled with store size rather than with anything the monitored server was doing.

Full detail in CHANGELOG.md.

Don't miss a new PerformanceMonitor release

NewReleases is sending notifications on new releases.