Merged
Conversation
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
README: add shields.io badge flair
Remove the _isEditMode guard so Test Connection calls DetectDatabaseStatusAsync() in both Add and Edit modes. Users can now upgrade the PerformanceMonitor database from Edit Server without re-adding the server. Closes #771 (partial — Edit Server flow only) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ade-detection Enable upgrade detection in Edit Server dialog
MSBuild mangles embedded resource names for upgrade folders (e.g., "2.2.0-to-2.3.0" becomes "_2._2._0_to_2._3._0"), which caused EmbeddedResourceScriptProvider to fail parsing all upgrade folders. Dashboard upgrades silently returned zero results, so upgrade scripts never ran and schema changes were missing. Fix: use regex to match mangled names and unmangle back to original folder names. Also surface installed Monitor version throughout the Dashboard UX — NOC health cards, sidebar server list, right-click context menus, Manage Servers, and a new "Check for Updates" button in the Edit Server dialog. Pin dialog buttons outside the scroll area so they remain visible during long install/upgrade operations. Fixes #772 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…-discovery Fix embedded resource upgrade discovery and add server version UX
…e_id column Port the COL_LENGTH check from Dashboard (#766) to Lite — detect whether sys.dm_db_persisted_sku_features has the database_id column before querying it, falling back to N'(unknown)' on older builds that lack the column. Closes community PR #777 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…s-column Fix Lite FinOps Enterprise features query for missing database_id column
The Overview tab's memory chart only queried v_memory_stats which has no grant data, so TotalGrantedMb was always 0. The Memory tab worked because it also calls GetMemoryGrantTrendAsync() from v_memory_grant_stats. Now the Overview tab fetches grant data in parallel and aligns it to the memory trend timestamps. Fixes #776 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…grant Fix Overview tab showing Memory Grant as 0 for all timestamps
Lite: Replace "already running" error dialog with FindWindow/ SetForegroundWindow to activate the existing instance. Only call SW_RESTORE if the window is minimized (IsIconic) to preserve maximized state. Dashboard: Fix WndProc handler to only reset WindowState when minimized, preserving maximized state on second-launch activation. Both: Keep minimize-to-tray as a user setting — when enabled, the window hides from the taskbar on minimize (restored via tray icon). Fixes #769 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Bring existing window to foreground on second launch instead of error
…to TDE only sys.dm_db_persisted_sku_features is database-scoped on all versions (database_id column was never added). Previous code queried only the connected database (master for Lite, PerformanceMonitor for Dashboard), missing features in user databases. Fixed by querying across all online user databases with dynamic SQL. Also filtered to TransparentDataEncryption only — Compression, Partitioning, and ColumnStoreIndex are available in Standard Edition since SQL Server 2016 SP1, so they are not downgrade blockers. Addresses #780 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…e-tde-only Fix FinOps Enterprise feature detection: query all databases, filter to TDE only
The alert query reads from v_query_snapshots using MAX(collection_time) to find the latest snapshot. When the collector captures 0 active queries, no new rows are inserted, so MAX(collection_time) still returns the old snapshot — causing alerts to re-fire indefinitely on queries that finished hours ago. Add a 10-minute recency check so stale snapshots are ignored. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…alerts Fix Lite long-running query alerts firing on stale DuckDB snapshots
Interactive mode defaulted to Mandatory encryption with no cert trust, causing connection failures on servers with self-signed certificates. The retired GUI installer defaulted to Optional/trust-cert which worked. Now interactive mode prompts for both settings with sensible defaults (trust cert = Y, encryption = Optional) matching the old GUI behavior. Fixes #784 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…-connection Add trust-cert and encryption prompts to CLI installer interactive mode
Flags like --encrypt optional (space-separated) were not fully stripped from positional arguments, causing the installer to misinterpret them as a username and fall into the SQL Auth path unexpectedly. Replace individual flag filters with a single loop that strips all -- prefixed flags and consumes trailing values for --entra and --encrypt. Also support --encrypt <level> (space) in addition to --encrypt=<level>. Fixes #786 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…rsing Fix CLI installer argument parsing treating flags as positional args
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add plans/ directory to .gitignore
… viewer Closes #788. Parses Object elements with IndexKind="NonClustered" from Update/SimpleUpdate/CreateIndex operators and displays a "+N NC" badge on the plan node, with index names in the tooltip and properties panel. Matches PerformanceStudio implementation. Both Dashboard and Lite in sync. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Show nonclustered index count on modification operators (#788)
Replaces the 2x2 chart grid with 5 vertically stacked lanes sharing a synchronized time axis and crosshair: CPU, Wait Stats, Blocking & Deadlocking, Memory, and I/O Latency. Hovering any lane shows values from all lanes at that time point. New files: - CorrelatedTimelineLanesControl (XAML + code-behind) - CorrelatedCrosshairManager (cross-chart sync with multi-series support) - GetTotalWaitTrendAsync (aggregated wait stats query) Also fixes GetDeadlockTrendAsync granularity from hourly to per-minute buckets to match blocking trend. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Ports the Lite correlated lanes feature to the Dashboard app: - Replaces Server Trends 2x2 grid with 5 synchronized lanes - Adds GetTotalWaitStatsTrendAsync (aggregate wait ms/sec trend) - Adds GetDeadlockTrendAsync (per-minute deadlock counts) - All queries read from existing collected data, no new collectors Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Resolve conflicts: keep correlated lanes, discard old overview methods Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ine-lanes Correlated timeline lanes for Overview/Server Trends (#688)
DuckDB was running out of memory compacting monthly parquet files (e.g., 4 query_snapshots files needing ~480MB to merge). Three changes: - Raise DuckDB memory cap from 2GB to 4GB - Create a fresh DuckDB connection per (month, table) group so memory is fully released between groups - For groups with >2 files, merge incrementally in pairs (smallest-first) instead of all at once, reducing peak memory significantly Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ps-compat Fix archive compaction OOM on large parquet groups
Changes across Dashboard, Lite, and InstallerGui: - ForegroundDimColor now matches ForegroundColor in all 6 themes - InstallerGui ForegroundMutedBrush changed to foreground color - ScottPlot chart text colors (#9DA5B4, #4A5568, #364D61) replaced with foreground equivalents (#E4E6EB, #1A1D23, #1A2A3A) - SlicerLabelBrush changed from 60% opacity to full opacity - Email template text changed from #808080 to #E4E6EB - Removed Opacity="0.45" from empty-state icons in ServerTab Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Phase 1-3 of the baselines plan for Lite: Engine: - BaselineProvider: 30-day rolling baselines bucketed by hour-of-day x day-of-week with bucket collapse (full → hour-only → flat) and hysteresis (10/15 thresholds) - Restart poisoning exclusion for cumulative metrics (batch requests, wait stats, query duration) using QUALIFY + LAG heuristic in DuckDB - 4 existing anomaly detectors upgraded from flat 24h lookback to time-bucketed - 4 new detectors: batch requests/sec, session counts, query duration, memory - Per-metric configurable deviation thresholds (default 2σ) - Proportional stddev floor (max(stddev, mean*0.01)) for division-by-zero - Fix BigInteger cast error on DuckDB SUM() for session/query duration detectors MCP: - analyze_server: baseline context in anomaly findings output - compare_analysis: updated description noting time-bucketed baselines - Anomaly fact metadata includes baseline_hour, baseline_dow, baseline_tier UI (Overview tab): - Baseline bands (mean ± 2σ) on CPU, Wait Stats, I/O Latency, Blocking lanes - Red anomaly dots for values outside band (with absolute minimum thresholds) - Tooltip ▲/▼ indicators (colored red/green) for anomalous values - "Compare to" dropdown: overlay yesterday/last week as dashed ghost lines - Right-side value labels removed, charts expanded to full width - Memory lane renamed to "Buffer Pool MB" - Blocking/Deadlocks shown on separate lines in tooltip Tests: - 15 BaselineProvider tests (buckets, collapse, hysteresis, restart poisoning, division-by-zero, cache, server isolation, memory) - 10 AnomalyDetector tests (all new detectors, per-metric thresholds, metadata) - 257/257 total tests passing Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add SqlServerBaselineProvider: time-bucketed baselines from SQL Server collect.* tables with @@DATEFIRST normalization, CTE restart exclusion, bucket collapse hierarchy (full → hour-only → flat), 1-hour TTL cache - Upgrade SqlServerAnomalyDetector: inject baseline provider, upgrade 4 existing detectors to time-bucketed baselines, add 3 new detectors (batch requests, sessions, query duration) - Update FactScorer: score ANOMALY_BATCH_REQUESTS, ANOMALY_SESSION_SPIKE, ANOMALY_QUERY_DURATION (deviation-based) - Port correlated timeline lanes UI: baseline bands, anomaly dots, Compare dropdown with ghost line overlay, remove right-side value labels, rename Memory MB → Buffer Pool MB, fix auto-refresh flicker - Port crosshair manager: ▲/▼ baseline indicators, comparison label, event-based spike detection for blocking/deadlocks - Fix pre-existing CPU tooltip bug: data returned DESC, binary search assumed ASC — added OrderBy - Fix event-based baseline: use wait_stats spine for zero-inclusive baselines, handle zero-mean EffectiveStdDev for event metrics - Cross-server validated on sql2016–sql2025, all queries < 250ms Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ne-port Port baseline engine and anomaly detection to Dashboard
- Rule 1 (Filter): Suppress trivial filters (< 128 reads/10ms actual, < 1.0 cost estimated) - Rule 3 (Serial Plan): Skip trivial statements with cost < 0.01 - Rule 15 (Join OR): Exclude Merge Interval inside anti/semi joins - Rule 20 (Local Variables): Skip trivial statements with cost < 0.01 - Rule 26 (Row Goal): Require >= 2x reduction - ShowPlanParser: Gate XML MemoryGrantWarning at 1 GB - Scalar UDF: Expanded remediation options (variable assignment, 2019+ inlining) All changes applied identically to Dashboard and Lite. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…-178 Port warning rule improvements from PerformanceStudio
- Suppress for TRIVIAL optimization level (can't go parallel anyway) - Suppress for 0ms actual elapsed time - Demote to Info unless user explicitly forced serial (MAXDOP 1 / hint) Ported from PerformanceStudio #178 round 2 feedback. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ents Refine Rule 3: TRIVIAL, 0ms elapsed, severity demotion
Extend the global Compare dropdown to support query stats, procedure stats, and query store tabs with delta columns showing regressions and improvements. Compare dropdown is disabled on unsupported tabs with visual feedback. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
On-load collectors (server_config, database_config, etc.) run once per tab open rather than on the scheduled loop, so staleness thresholds don't apply. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This reason means something in the query blocks parallelism (scalar UDFs, table variable inserts, etc.) — that's worth a Warning, not Info. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…erity Fix Rule 3: CouldNotGenerateValidParallelPlan stays Warning
Replace the local Compare dropdown in ResourceMetricsContent with a global one in the ServerTab toolbar. Add comparison grids for Query Stats, Procedure Stats, and Query Store tabs with color-coded delta columns. Compare dropdown is disabled on unsupported tabs with visual feedback. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Warning: UDFs, cursors, table variables, remote queries, trace flags, hints, DML OUTPUT, writeback variables Info: cost below threshold, edition limits, memory-optimized, upgrade Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Expand Rule 3 to cover all NonParallelPlanReason values
…rison Add before/after comparison mode for query grids (#687)
SignPath FOSS certificate approved — switch from test-signing to release-signing policy and add required sponsor section to README. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…headers (#805) Five inline export paths used col.Header?.ToString() which returns "System.Windows.Controls.StackPanel" for complex headers. Replace with DataGridClipboardBehavior.GetHeaderText() which extracts the TextBlock text. Affected: ServerTab, FinOpsTab (clipboard + CSV), AlertsHistoryTab (clipboard + CSV). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…-signing Switch to SignPath release-signing
…l-805 Fix CSV and clipboard exports writing StackPanel type name as column headers (#805)
The external SVG URL on about.signpath.io now 404s. Host the logo locally in docs/ so it won't break again. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Fix broken SignPath sponsor logo
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Release v2.6.0: version bumps, changelog, bug fixes
Replace incorrect Framer CDN image with the actual SignPath logo from their official GitHub repo (SignPath/fdn-website). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Fix SignPath logo (correct image)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Test plan
See CHANGELOG.md for full details.
🤖 Generated with Claude Code