Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
baf2db6
CI: bump GitHub Actions to Node 24-compatible majors
erikdarlingdata May 5, 2026
c959293
Merge pull request #932 from erikdarlingdata/feature/bump-actions-node24
erikdarlingdata May 5, 2026
6d389de
Honor collector_database_exclusions in trace collectors (#887 follow-up)
erikdarlingdata May 5, 2026
1206880
Merge pull request #934 from erikdarlingdata/feature/887-trace-collec…
erikdarlingdata May 5, 2026
5d83e46
Lite: fix compaction OOM by setting DuckDB temp_directory (#933)
erikdarlingdata May 5, 2026
e0cd22b
Merge pull request #935 from erikdarlingdata/feature/933-compaction-t…
erikdarlingdata May 5, 2026
0693983
Re-run installation_history widen for pre-v2.7.0 no-op upgrades (#828…
erikdarlingdata May 6, 2026
659eedd
Fix #916 — chart tooltips break after tab switch (real root cause) (#…
erikdarlingdata May 6, 2026
4ec88f4
Fix #938 — preserve mute rules across size-triggered DB reset
erikdarlingdata May 7, 2026
754e1ca
Merge pull request #941 from erikdarlingdata/feature/938-mute-rules-s…
erikdarlingdata May 7, 2026
3bb16e4
Fix #933 — bound compaction memory so wide-row tables don't OOM
erikdarlingdata May 7, 2026
46dd1e5
Merge pull request #942 from erikdarlingdata/feature/933-compaction-m…
erikdarlingdata May 7, 2026
6669ddd
Fix #944 — one-click snooze from alert tray popup
erikdarlingdata May 8, 2026
2360cdf
Merge pull request #946 from erikdarlingdata/feature/944-snooze-from-…
erikdarlingdata May 8, 2026
ea3b089
Fix #944 — snooze hint in email and Teams/Slack payloads
erikdarlingdata May 8, 2026
abd66a7
Merge pull request #947 from erikdarlingdata/feature/944-snooze-hint-…
erikdarlingdata May 8, 2026
bed7f22
Fix #945 — clean up build warnings across Lite, Dashboard, Installer
erikdarlingdata May 8, 2026
02e135b
Merge pull request #948 from erikdarlingdata/feature/945-build-warnin…
erikdarlingdata May 8, 2026
a6a09f2
Delete retired InstallerGui project directory
erikdarlingdata May 8, 2026
a88d73f
Merge pull request #949 from erikdarlingdata/feature/retire-installergui
erikdarlingdata May 8, 2026
6f38bbf
Add nullability guards to remaining comparison overlay tasks
erikdarlingdata May 9, 2026
2a4a260
Merge pull request #950 from erikdarlingdata/fix/correlated-lanes-nul…
erikdarlingdata May 9, 2026
641f3fc
Fix #933 — raise compaction memory_limit to 4 GB
erikdarlingdata May 12, 2026
1096b00
Fix #951 — delete old Monitor_LongQueries_*.trc files in data_retention
erikdarlingdata May 12, 2026
06db2d7
Merge pull request #952 from erikdarlingdata/feature/933-bump-compact…
erikdarlingdata May 12, 2026
b446741
Merge pull request #953 from erikdarlingdata/feature/951-trace-file-c…
erikdarlingdata May 12, 2026
766a0cc
Fix #933 — detect compaction exclude-columns per merge step
erikdarlingdata May 14, 2026
fd6dd91
Fix #933 — cap main connection memory_limit, raise transiently for COPY
erikdarlingdata May 15, 2026
b534d89
Merge pull request #955 from erikdarlingdata/feature/933-compaction-b…
erikdarlingdata May 15, 2026
955b425
Log process memory at the end of each collection cycle
erikdarlingdata May 15, 2026
b4aa8de
Merge pull request #956 from erikdarlingdata/feature/log-process-memo…
erikdarlingdata May 15, 2026
67d1346
Compact parquet in size-budgeted batches (#933 followup)
erikdarlingdata May 18, 2026
418c6ee
Upgrade to .NET 10 (#958)
erikdarlingdata May 18, 2026
3aa9f4c
Merge pull request #960 from erikdarlingdata/feature/958-net10-upgrade
erikdarlingdata May 18, 2026
6013533
Merge branch 'dev' into feature/933-compaction-size-budget-batching
erikdarlingdata May 18, 2026
f41c188
Merge pull request #959 from erikdarlingdata/feature/933-compaction-s…
erikdarlingdata May 18, 2026
95ce14c
Ship via Setup.exe only and share servers.json across users
erikdarlingdata May 18, 2026
13f7aef
Restore portable Dashboard/Lite ZIP build steps
erikdarlingdata May 18, 2026
06796f2
Clarify Lite config file locations in README
erikdarlingdata May 18, 2026
b3a0ab0
Merge pull request #961 from erikdarlingdata/feature/installer-and-sh…
erikdarlingdata May 18, 2026
8f7224b
Pin .NET SDK to 10.0.204 via global.json
erikdarlingdata May 19, 2026
782e2bf
Merge pull request #962 from erikdarlingdata/feature/pin-net-sdk-via-…
erikdarlingdata May 19, 2026
14b802c
Release v2.11.0
erikdarlingdata May 20, 2026
fc63a81
Merge pull request #964 from erikdarlingdata/release/v2.11.0
erikdarlingdata May 20, 2026
a2792bd
Merge pull request #965 from erikdarlingdata/dev
erikdarlingdata May 20, 2026
fab13a1
Correct v2.11.0 changelog: portable ZIPs were not dropped
erikdarlingdata May 20, 2026
af7b7c2
Merge pull request #966 from erikdarlingdata/fix/changelog-portable-z…
erikdarlingdata May 20, 2026
77272b8
Merge pull request #967 from erikdarlingdata/dev
erikdarlingdata May 20, 2026
1f28ff8
Skip version-bump check for documentation-only PRs
erikdarlingdata May 20, 2026
70f7724
Merge pull request #968 from erikdarlingdata/fix/skip-version-check-f…
erikdarlingdata May 20, 2026
6877335
Merge pull request #969 from erikdarlingdata/dev
erikdarlingdata May 20, 2026
a362a15
Skip build/test/publish for documentation-only PRs
erikdarlingdata May 20, 2026
4b36847
Merge pull request #970 from erikdarlingdata/fix/skip-build-for-doc-o…
erikdarlingdata May 20, 2026
4230f5b
Merge pull request #971 from erikdarlingdata/dev
erikdarlingdata May 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
root = true

[*.cs]

# CA1873: Avoid potentially expensive logging
#
# This rule fires on any non-literal argument to a logging method (including
# trivial field accesses like `_logger.LogInformation("X: {Path}", _path)`),
# on the theory that the argument might be expensive to evaluate when the
# level is disabled. In this codebase the cost is consistently negligible —
# the proper fix is migrating to LoggerMessage source generators, which is
# a larger separate effort. Until then, this rule is pure noise.
dotnet_diagnostic.CA1873.severity = none
48 changes: 33 additions & 15 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ jobs:
runs-on: windows-latest

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5

- name: Detect changed paths
id: filter
Expand All @@ -44,15 +44,24 @@ jobs:
- 'Installer.Tests/**'
- 'install/**'
- 'upgrades/**'

- name: Setup .NET 8.0
uses: actions/setup-dotnet@v4
# True when any non-documentation file changed. Documentation-only
# changes (e.g. a CHANGELOG or README edit) skip the build/test/
# publish steps below — there is nothing to compile. The job still
# runs so the required 'build' check reports a result.
code:
- '**'
- '!**/*.md'

- name: Setup .NET 10.0
if: steps.filter.outputs.code != 'false'
uses: actions/setup-dotnet@v5
with:
dotnet-version: 8.0.x
dotnet-version: 10.0.x
cache: true
cache-dependency-path: '**/packages.lock.json'

- name: Restore dependencies
if: steps.filter.outputs.code != 'false'
run: |
dotnet restore Dashboard/Dashboard.csproj --locked-mode
dotnet restore Lite/PerformanceMonitorLite.csproj --locked-mode
Expand All @@ -61,12 +70,15 @@ jobs:
dotnet restore Installer.Tests/Installer.Tests.csproj --locked-mode

- name: Build Lite.Tests
if: steps.filter.outputs.code != 'false'
run: dotnet build Lite.Tests/Lite.Tests.csproj -c Release --no-restore

- name: Build Installer.Tests
if: steps.filter.outputs.code != 'false'
run: dotnet build Installer.Tests/Installer.Tests.csproj -c Release --no-restore

- name: Run Lite fast tests
if: steps.filter.outputs.code != 'false'
run: dotnet test Lite.Tests/Lite.Tests.csproj -c Release --no-build --verbosity normal --filter "FullyQualifiedName!~AnomalyDetectorTests&FullyQualifiedName!~FactCollectorTests&FullyQualifiedName!~FactCollectorMiseryTests&FullyQualifiedName!~BaselineProviderTests&FullyQualifiedName!~InferenceEngineTests&FullyQualifiedName!~ScenarioTests&FullyQualifiedName!~AnalysisServiceTests"

- name: Run Lite analysis-heavy tests
Expand All @@ -78,27 +90,31 @@ jobs:
run: dotnet test Installer.Tests/Installer.Tests.csproj -c Release --no-build --verbosity normal --filter "FullyQualifiedName!~VersionDetectionTests&FullyQualifiedName!~IdempotencyTests&FullyQualifiedName!~AdversarialTests"

- name: Get version
if: steps.filter.outputs.code != 'false'
id: version
shell: pwsh
run: |
$version = ([xml](Get-Content Dashboard/Dashboard.csproj)).Project.PropertyGroup.Version | Where-Object { $_ }
echo "VERSION=$version" >> $env:GITHUB_OUTPUT

- name: Publish Dashboard
if: steps.filter.outputs.code != 'false'
run: dotnet publish Dashboard/Dashboard.csproj -c Release -o publish/Dashboard

- name: Publish Dashboard (self-contained for Velopack)
if: github.event_name == 'release'
run: dotnet publish Dashboard/Dashboard.csproj -c Release -r win-x64 --self-contained -o publish/Dashboard-velopack

- name: Publish Lite
if: steps.filter.outputs.code != 'false'
run: dotnet publish Lite/PerformanceMonitorLite.csproj -c Release -o publish/Lite

- name: Publish Lite (self-contained for Velopack)
if: github.event_name == 'release'
run: dotnet publish Lite/PerformanceMonitorLite.csproj -c Release -r win-x64 --self-contained -o publish/Lite-velopack

- name: Publish CLI Installer
if: steps.filter.outputs.code != 'false'
run: dotnet publish Installer/PerformanceMonitorInstaller.csproj -c Release

- name: Package release artifacts
Expand All @@ -108,19 +124,21 @@ jobs:
$version = "${{ steps.version.outputs.VERSION }}"
New-Item -ItemType Directory -Force -Path releases

# Dashboard ZIP
# Dashboard ZIP — portable artifact for advanced/air-gapped users.
# The README points end users at Setup.exe (Velopack) because it sets up Start Menu
# shortcuts and Apps & Features registration; this ZIP is the explicit fallback.
Compress-Archive -Path 'publish/Dashboard/*' -DestinationPath "releases/PerformanceMonitorDashboard-$version.zip" -Force

# Lite ZIP
# Lite ZIP — same rationale.
Compress-Archive -Path 'publish/Lite/*' -DestinationPath "releases/PerformanceMonitorLite-$version.zip" -Force

# Installer ZIP (CLI + SQL scripts)
# Installer ZIP (CLI + SQL scripts) — still shipped for server-side install
$instDir = 'publish/Installer'
New-Item -ItemType Directory -Force -Path $instDir
New-Item -ItemType Directory -Force -Path "$instDir/install"
New-Item -ItemType Directory -Force -Path "$instDir/upgrades"

Copy-Item 'Installer/bin/Release/net8.0/win-x64/publish/PerformanceMonitorInstaller.exe' $instDir
Copy-Item 'Installer/bin/Release/net10.0/win-x64/publish/PerformanceMonitorInstaller.exe' $instDir
Copy-Item 'install/*.sql' "$instDir/install/"
if (Test-Path 'upgrades') { Copy-Item 'upgrades/*' "$instDir/upgrades/" -Recurse -ErrorAction SilentlyContinue }
if (Test-Path 'README.md') { Copy-Item 'README.md' $instDir }
Expand All @@ -132,30 +150,30 @@ jobs:
- name: Upload Dashboard for signing
if: github.event_name == 'release'
id: upload-dashboard
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v6
with:
name: Dashboard-unsigned
path: publish/Dashboard/

- name: Upload Lite for signing
if: github.event_name == 'release'
id: upload-lite
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v6
with:
name: Lite-unsigned
path: publish/Lite/

- name: Upload Installer for signing
if: github.event_name == 'release'
id: upload-installer
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v6
with:
name: Installer-unsigned
path: publish/Installer/

- name: Sign Dashboard
if: github.event_name == 'release'
uses: signpath/github-action-submit-signing-request@v1
uses: signpath/github-action-submit-signing-request@v2
with:
api-token: '${{ secrets.SIGNPATH_API_TOKEN }}'
organization-id: '7969f8b6-d946-4a74-9bac-a55856d8b8e0'
Expand All @@ -168,7 +186,7 @@ jobs:

- name: Sign Lite
if: github.event_name == 'release'
uses: signpath/github-action-submit-signing-request@v1
uses: signpath/github-action-submit-signing-request@v2
with:
api-token: '${{ secrets.SIGNPATH_API_TOKEN }}'
organization-id: '7969f8b6-d946-4a74-9bac-a55856d8b8e0'
Expand All @@ -181,7 +199,7 @@ jobs:

- name: Sign Installer
if: github.event_name == 'release'
uses: signpath/github-action-submit-signing-request@v1
uses: signpath/github-action-submit-signing-request@v2
with:
api-token: '${{ secrets.SIGNPATH_API_TOKEN }}'
organization-id: '7969f8b6-d946-4a74-9bac-a55856d8b8e0'
Expand Down
118 changes: 70 additions & 48 deletions .github/workflows/check-version-bump.yml
Original file line number Diff line number Diff line change
@@ -1,48 +1,70 @@
name: Check version bump
on:
pull_request:
branches: [main]

jobs:
check-version:
if: github.head_ref == 'dev'
runs-on: ubuntu-latest

steps:
- name: Checkout PR branch
uses: actions/checkout@v4

- name: Get PR version
id: pr
shell: pwsh
run: |
$version = ([xml](Get-Content Dashboard/Dashboard.csproj)).Project.PropertyGroup.Version | Where-Object { $_ }
echo "VERSION=$version" >> $env:GITHUB_OUTPUT
Write-Host "PR version: $version"

- name: Checkout main
uses: actions/checkout@v4
with:
ref: main
path: main-branch

- name: Get main version
id: main
shell: pwsh
run: |
$version = ([xml](Get-Content main-branch/Dashboard/Dashboard.csproj)).Project.PropertyGroup.Version | Where-Object { $_ }
echo "VERSION=$version" >> $env:GITHUB_OUTPUT
Write-Host "Main version: $version"

- name: Compare versions
env:
PR_VERSION: ${{ steps.pr.outputs.VERSION }}
MAIN_VERSION: ${{ steps.main.outputs.VERSION }}
run: |
echo "Main version: $MAIN_VERSION"
echo "PR version: $PR_VERSION"
if [ "$PR_VERSION" == "$MAIN_VERSION" ]; then
echo "::error::Version in Dashboard.csproj ($PR_VERSION) has not changed from main. Bump the version before merging to main."
exit 1
fi
echo "✅ Version bumped: $MAIN_VERSION → $PR_VERSION"
name: Check version bump
on:
pull_request:
branches: [main]

jobs:
check-version:
if: github.head_ref == 'dev'
runs-on: ubuntu-latest

steps:
- name: Checkout PR branch
uses: actions/checkout@v5

# Documentation-only PRs (e.g. a CHANGELOG correction) do not bump the
# version. The workflow still runs so the required check reports a result
# — using paths-ignore would skip the run entirely and leave the check
# stuck pending. Instead, the version comparison below is gated on whether
# any non-*.md file changed.
- name: Detect non-documentation changes
id: changes
uses: dorny/paths-filter@v3
with:
filters: |
code:
- '**'
- '!**/*.md'

- name: Get PR version
if: steps.changes.outputs.code == 'true'
id: pr
shell: pwsh
run: |
$version = ([xml](Get-Content Dashboard/Dashboard.csproj)).Project.PropertyGroup.Version | Where-Object { $_ }
echo "VERSION=$version" >> $env:GITHUB_OUTPUT
Write-Host "PR version: $version"

- name: Checkout main
if: steps.changes.outputs.code == 'true'
uses: actions/checkout@v5
with:
ref: main
path: main-branch

- name: Get main version
if: steps.changes.outputs.code == 'true'
id: main
shell: pwsh
run: |
$version = ([xml](Get-Content main-branch/Dashboard/Dashboard.csproj)).Project.PropertyGroup.Version | Where-Object { $_ }
echo "VERSION=$version" >> $env:GITHUB_OUTPUT
Write-Host "Main version: $version"

- name: Compare versions
if: steps.changes.outputs.code == 'true'
env:
PR_VERSION: ${{ steps.pr.outputs.VERSION }}
MAIN_VERSION: ${{ steps.main.outputs.VERSION }}
run: |
echo "Main version: $MAIN_VERSION"
echo "PR version: $PR_VERSION"
if [ "$PR_VERSION" == "$MAIN_VERSION" ]; then
echo "::error::Version in Dashboard.csproj ($PR_VERSION) has not changed from main. Bump the version before merging to main."
exit 1
fi
echo "✅ Version bumped: $MAIN_VERSION → $PR_VERSION"

- name: Skip notice
if: steps.changes.outputs.code != 'true'
run: echo "Only documentation (*.md) files changed — version bump check skipped."
12 changes: 6 additions & 6 deletions .github/workflows/nightly.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
outputs:
has_changes: ${{ steps.check.outputs.has_changes }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
ref: dev
fetch-depth: 0
Expand All @@ -38,14 +38,14 @@ jobs:
runs-on: windows-latest

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
ref: dev

- name: Setup .NET 8.0
uses: actions/setup-dotnet@v4
- name: Setup .NET 10.0
uses: actions/setup-dotnet@v5
with:
dotnet-version: 8.0.x
dotnet-version: 10.0.x
cache: true
cache-dependency-path: '**/packages.lock.json'

Expand Down Expand Up @@ -92,7 +92,7 @@ jobs:
New-Item -ItemType Directory -Force -Path "$instDir/install"
New-Item -ItemType Directory -Force -Path "$instDir/upgrades"

Copy-Item 'Installer/bin/Release/net8.0/win-x64/publish/PerformanceMonitorInstaller.exe' $instDir
Copy-Item 'Installer/bin/Release/net10.0/win-x64/publish/PerformanceMonitorInstaller.exe' $instDir
Copy-Item 'install/*.sql' "$instDir/install/"
if (Test-Path 'install/templates') { Copy-Item 'install/templates' "$instDir/install/templates" -Recurse -ErrorAction SilentlyContinue }
if (Test-Path 'upgrades') { Copy-Item 'upgrades/*' "$instDir/upgrades/" -Recurse -ErrorAction SilentlyContinue }
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/sql-validation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ jobs:
--health-retries 15

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5

- name: Install sqlcmd
run: |
Expand Down
Loading
Loading