From 54476ccb908a67f3bebcca3ae92dc465001a82cb Mon Sep 17 00:00:00 2001 From: Blake Niemyjski Date: Fri, 31 Jul 2026 12:23:13 -0500 Subject: [PATCH 1/7] chore: update dependencies and build tooling --- .devcontainer/devcontainer.json | 2 +- .github/dependabot.yml | 14 ++++++++++++++ .github/workflows/build-linux.yml | 6 +++--- .github/workflows/build-osx.yml | 6 +++--- .github/workflows/build-windows.yml | 8 ++++---- build/common.props | 2 +- global.json | 2 +- ...Exceptionless.SampleBlazorWebAssemblyApp.csproj | 4 ++-- .../Exceptionless.SampleLambda.csproj | 2 +- .../Exceptionless.SampleLambdaAspNetCore.csproj | 4 ++-- src/Exceptionless/Exceptionless.csproj | 4 ++-- .../Exceptionless.Extensions.Hosting.csproj | 6 +++--- .../Exceptionless.Extensions.Logging.csproj | 6 +++--- .../Exceptionless.Log4net.csproj | 2 +- .../Exceptionless.MessagePack.csproj | 2 +- .../Exceptionless.NLog/Exceptionless.NLog.csproj | 2 +- .../Exceptionless.MessagePack.Tests.csproj | 2 +- .../Exceptionless.Tests/Exceptionless.Tests.csproj | 4 ++-- 18 files changed, 46 insertions(+), 32 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index ef4cdaf3..ef747d9e 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,7 +1,7 @@ { "name": "Exceptionless.Net", - "image": "mcr.microsoft.com/vscode/devcontainers/dotnetcore:latest", + "image": "mcr.microsoft.com/devcontainers/dotnet:2.1.4-10.0-noble", "extensions": [ "ms-dotnettools.csharp", "streetsidesoftware.code-spell-checker", diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 3de28d27..1cf65596 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -10,3 +10,17 @@ updates: semver-major-days: 7 semver-minor-days: 7 semver-patch-days: 7 + +- package-ecosystem: github-actions + directory: "/" + schedule: + interval: weekly + cooldown: + default-days: 7 + +- package-ecosystem: devcontainers + directory: "/" + schedule: + interval: weekly + cooldown: + default-days: 7 diff --git a/.github/workflows/build-linux.yml b/.github/workflows/build-linux.yml index dd6677c7..2ec24907 100644 --- a/.github/workflows/build-linux.yml +++ b/.github/workflows/build-linux.yml @@ -8,11 +8,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v6 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 - name: Setup .NET SDK - uses: actions/setup-dotnet@v5 + uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0 with: global-json-file: global.json - name: Build Reason @@ -20,7 +20,7 @@ jobs: - name: Build Version shell: bash run: | - dotnet tool install --global minver-cli --version 6.0.0 + dotnet tool install --global minver-cli --version 7.0.0 version=$(minver --tag-prefix v) echo "MINVERVERSIONOVERRIDE=$version" >> $GITHUB_ENV - name: Build diff --git a/.github/workflows/build-osx.yml b/.github/workflows/build-osx.yml index 83852de2..df1a9db0 100644 --- a/.github/workflows/build-osx.yml +++ b/.github/workflows/build-osx.yml @@ -8,11 +8,11 @@ jobs: runs-on: macOS-latest steps: - name: Checkout - uses: actions/checkout@v6 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 - name: Setup .NET SDK - uses: actions/setup-dotnet@v5 + uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0 with: global-json-file: global.json - name: Build Reason @@ -20,7 +20,7 @@ jobs: - name: Build Version shell: bash run: | - dotnet tool install --global minver-cli --version 6.0.0 + dotnet tool install --global minver-cli --version 7.0.0 version=$(minver --tag-prefix v) echo "MINVERVERSIONOVERRIDE=$version" >> $GITHUB_ENV - name: Build diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index 3efed70e..a2e60cde 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -8,11 +8,11 @@ jobs: runs-on: windows-latest steps: - name: Checkout - uses: actions/checkout@v6 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 - name: Setup .NET SDK - uses: actions/setup-dotnet@v5 + uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0 with: global-json-file: global.json - name: Build Reason @@ -20,7 +20,7 @@ jobs: - name: Build Version shell: bash run: | - dotnet tool install --global minver-cli --version 6.0.0 + dotnet tool install --global minver-cli --version 7.0.0 version=$(minver --tag-prefix v) echo "MINVERVERSIONOVERRIDE=$version" >> $GITHUB_ENV - name: Build @@ -32,7 +32,7 @@ jobs: run: dotnet pack --configuration Release --no-build Exceptionless.Net.Windows.slnx - name: Install GitHub Package Tool if: github.event_name != 'pull_request' - run: dotnet tool install gpr -g + run: dotnet tool install --global gpr --version 0.1.294 - name: Publish CI Packages shell: bash if: github.event_name != 'pull_request' diff --git a/build/common.props b/build/common.props index 904a13ee..bde33398 100644 --- a/build/common.props +++ b/build/common.props @@ -41,7 +41,7 @@ - + diff --git a/global.json b/global.json index 1e7fdfa9..cb6c0cd2 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "10.0.100", + "version": "10.0.302", "rollForward": "latestMinor" } } diff --git a/samples/Exceptionless.SampleBlazorWebAssemblyApp/Exceptionless.SampleBlazorWebAssemblyApp.csproj b/samples/Exceptionless.SampleBlazorWebAssemblyApp/Exceptionless.SampleBlazorWebAssemblyApp.csproj index 62ed9c0c..62466f11 100644 --- a/samples/Exceptionless.SampleBlazorWebAssemblyApp/Exceptionless.SampleBlazorWebAssemblyApp.csproj +++ b/samples/Exceptionless.SampleBlazorWebAssemblyApp/Exceptionless.SampleBlazorWebAssemblyApp.csproj @@ -7,8 +7,8 @@ - - + + diff --git a/samples/Exceptionless.SampleLambda/Exceptionless.SampleLambda.csproj b/samples/Exceptionless.SampleLambda/Exceptionless.SampleLambda.csproj index 3cab80e0..020fadf7 100644 --- a/samples/Exceptionless.SampleLambda/Exceptionless.SampleLambda.csproj +++ b/samples/Exceptionless.SampleLambda/Exceptionless.SampleLambda.csproj @@ -8,7 +8,7 @@ true - + diff --git a/samples/Exceptionless.SampleLambdaAspNetCore/Exceptionless.SampleLambdaAspNetCore.csproj b/samples/Exceptionless.SampleLambdaAspNetCore/Exceptionless.SampleLambdaAspNetCore.csproj index fb9f477f..539ea968 100644 --- a/samples/Exceptionless.SampleLambdaAspNetCore/Exceptionless.SampleLambdaAspNetCore.csproj +++ b/samples/Exceptionless.SampleLambdaAspNetCore/Exceptionless.SampleLambdaAspNetCore.csproj @@ -5,8 +5,8 @@ Lambda - - + + diff --git a/src/Exceptionless/Exceptionless.csproj b/src/Exceptionless/Exceptionless.csproj index 21fc7e0d..53986d0f 100644 --- a/src/Exceptionless/Exceptionless.csproj +++ b/src/Exceptionless/Exceptionless.csproj @@ -34,12 +34,12 @@ - + - + diff --git a/src/Platforms/Exceptionless.Extensions.Hosting/Exceptionless.Extensions.Hosting.csproj b/src/Platforms/Exceptionless.Extensions.Hosting/Exceptionless.Extensions.Hosting.csproj index 471209f8..8a3c6dde 100644 --- a/src/Platforms/Exceptionless.Extensions.Hosting/Exceptionless.Extensions.Hosting.csproj +++ b/src/Platforms/Exceptionless.Extensions.Hosting/Exceptionless.Extensions.Hosting.csproj @@ -15,15 +15,15 @@ - + - + - + diff --git a/src/Platforms/Exceptionless.Extensions.Logging/Exceptionless.Extensions.Logging.csproj b/src/Platforms/Exceptionless.Extensions.Logging/Exceptionless.Extensions.Logging.csproj index 71c28a68..cdbd19a1 100644 --- a/src/Platforms/Exceptionless.Extensions.Logging/Exceptionless.Extensions.Logging.csproj +++ b/src/Platforms/Exceptionless.Extensions.Logging/Exceptionless.Extensions.Logging.csproj @@ -15,15 +15,15 @@ - + - + - + diff --git a/src/Platforms/Exceptionless.Log4net/Exceptionless.Log4net.csproj b/src/Platforms/Exceptionless.Log4net/Exceptionless.Log4net.csproj index b9c23c6c..1355d5c3 100644 --- a/src/Platforms/Exceptionless.Log4net/Exceptionless.Log4net.csproj +++ b/src/Platforms/Exceptionless.Log4net/Exceptionless.Log4net.csproj @@ -25,7 +25,7 @@ - + diff --git a/src/Platforms/Exceptionless.MessagePack/Exceptionless.MessagePack.csproj b/src/Platforms/Exceptionless.MessagePack/Exceptionless.MessagePack.csproj index b0c47148..b06c9fbb 100644 --- a/src/Platforms/Exceptionless.MessagePack/Exceptionless.MessagePack.csproj +++ b/src/Platforms/Exceptionless.MessagePack/Exceptionless.MessagePack.csproj @@ -25,6 +25,6 @@ - + diff --git a/src/Platforms/Exceptionless.NLog/Exceptionless.NLog.csproj b/src/Platforms/Exceptionless.NLog/Exceptionless.NLog.csproj index 0cef187c..fd7d08ab 100644 --- a/src/Platforms/Exceptionless.NLog/Exceptionless.NLog.csproj +++ b/src/Platforms/Exceptionless.NLog/Exceptionless.NLog.csproj @@ -25,7 +25,7 @@ - + diff --git a/test/Exceptionless.MessagePack.Tests/Exceptionless.MessagePack.Tests.csproj b/test/Exceptionless.MessagePack.Tests/Exceptionless.MessagePack.Tests.csproj index f30633be..fe6f1d5e 100644 --- a/test/Exceptionless.MessagePack.Tests/Exceptionless.MessagePack.Tests.csproj +++ b/test/Exceptionless.MessagePack.Tests/Exceptionless.MessagePack.Tests.csproj @@ -17,7 +17,7 @@ - + all diff --git a/test/Exceptionless.Tests/Exceptionless.Tests.csproj b/test/Exceptionless.Tests/Exceptionless.Tests.csproj index e1c0134d..7b31ac45 100644 --- a/test/Exceptionless.Tests/Exceptionless.Tests.csproj +++ b/test/Exceptionless.Tests/Exceptionless.Tests.csproj @@ -39,7 +39,7 @@ - + @@ -61,4 +61,4 @@ PreserveNewest - \ No newline at end of file + From 5bc32186dadb826e0d2a3a1c35d4f3d57d014383 Mon Sep 17 00:00:00 2001 From: Blake Niemyjski Date: Wed, 12 Aug 2026 21:12:09 -0500 Subject: [PATCH 2/7] chore: harden dependency update workflow --- .devcontainer/devcontainer.json | 5 +++++ .github/dependabot.yml | 7 +++++++ .github/workflows/build-linux.yml | 3 +++ .github/workflows/build-osx.yml | 3 +++ .github/workflows/build-windows.yml | 9 +++++---- build/common.props | 2 +- global.json | 2 +- .../Exceptionless.SampleBlazorWebAssemblyApp.csproj | 4 ++-- .../Exceptionless.SampleLambdaAspNetCore.csproj | 2 +- src/Exceptionless/Exceptionless.csproj | 4 ++-- .../Exceptionless.Extensions.Hosting.csproj | 4 ++-- .../Exceptionless.Extensions.Logging.csproj | 4 ++-- 12 files changed, 34 insertions(+), 15 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index ef747d9e..9187c825 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,6 +2,11 @@ "name": "Exceptionless.Net", "image": "mcr.microsoft.com/devcontainers/dotnet:2.1.4-10.0-noble", + "features": { + "ghcr.io/devcontainers/features/dotnet:2.5.0": { + "version": "10.0.400" + } + }, "extensions": [ "ms-dotnettools.csharp", "streetsidesoftware.code-spell-checker", diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 1cf65596..493751cb 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -24,3 +24,10 @@ updates: interval: weekly cooldown: default-days: 7 + +- package-ecosystem: dotnet-sdk + directory: "/" + schedule: + interval: daily + cooldown: + default-days: 1 diff --git a/.github/workflows/build-linux.yml b/.github/workflows/build-linux.yml index 2ec24907..1e3e8c94 100644 --- a/.github/workflows/build-linux.yml +++ b/.github/workflows/build-linux.yml @@ -3,6 +3,8 @@ on: [push, pull_request] env: DOTNET_CLI_TELEMETRY_OPTOUT: 1 DOTNET_NOLOGO: 1 +permissions: + contents: read jobs: build: runs-on: ubuntu-latest @@ -11,6 +13,7 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 + persist-credentials: false - name: Setup .NET SDK uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0 with: diff --git a/.github/workflows/build-osx.yml b/.github/workflows/build-osx.yml index df1a9db0..a2fc356c 100644 --- a/.github/workflows/build-osx.yml +++ b/.github/workflows/build-osx.yml @@ -3,6 +3,8 @@ on: [push, pull_request] env: DOTNET_CLI_TELEMETRY_OPTOUT: 1 DOTNET_NOLOGO: 1 +permissions: + contents: read jobs: build: runs-on: macOS-latest @@ -11,6 +13,7 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 + persist-credentials: false - name: Setup .NET SDK uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0 with: diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index a2e60cde..9250c66f 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -3,6 +3,9 @@ on: [push, pull_request] env: DOTNET_CLI_TELEMETRY_OPTOUT: 1 DOTNET_NOLOGO: 1 +permissions: + contents: read + packages: write jobs: build: runs-on: windows-latest @@ -11,6 +14,7 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 + persist-credentials: false - name: Setup .NET SDK uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0 with: @@ -30,9 +34,6 @@ jobs: - name: Package if: github.event_name != 'pull_request' run: dotnet pack --configuration Release --no-build Exceptionless.Net.Windows.slnx - - name: Install GitHub Package Tool - if: github.event_name != 'pull_request' - run: dotnet tool install --global gpr --version 0.1.294 - name: Publish CI Packages shell: bash if: github.event_name != 'pull_request' @@ -41,7 +42,7 @@ jobs: echo "${0##*/}": Pushing $package... # GitHub - gpr push $package -k ${{ secrets.GITHUB_TOKEN }} || true + dotnet nuget push "$package" --source https://nuget.pkg.github.com/Exceptionless/index.json --api-key ${{ secrets.GITHUB_TOKEN }} --skip-duplicate # Feedz (remove once GitHub supports anonymous access) dotnet nuget push $package --source https://f.feedz.io/exceptionless/exceptionless/nuget --api-key ${{ secrets.FEEDZ_KEY }} --skip-duplicate diff --git a/build/common.props b/build/common.props index bde33398..73381537 100644 --- a/build/common.props +++ b/build/common.props @@ -41,7 +41,7 @@ - + diff --git a/global.json b/global.json index cb6c0cd2..61bcbdd7 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "10.0.302", + "version": "10.0.400", "rollForward": "latestMinor" } } diff --git a/samples/Exceptionless.SampleBlazorWebAssemblyApp/Exceptionless.SampleBlazorWebAssemblyApp.csproj b/samples/Exceptionless.SampleBlazorWebAssemblyApp/Exceptionless.SampleBlazorWebAssemblyApp.csproj index 62466f11..7a75ff24 100644 --- a/samples/Exceptionless.SampleBlazorWebAssemblyApp/Exceptionless.SampleBlazorWebAssemblyApp.csproj +++ b/samples/Exceptionless.SampleBlazorWebAssemblyApp/Exceptionless.SampleBlazorWebAssemblyApp.csproj @@ -7,8 +7,8 @@ - - + + diff --git a/samples/Exceptionless.SampleLambdaAspNetCore/Exceptionless.SampleLambdaAspNetCore.csproj b/samples/Exceptionless.SampleLambdaAspNetCore/Exceptionless.SampleLambdaAspNetCore.csproj index 539ea968..b077e98f 100644 --- a/samples/Exceptionless.SampleLambdaAspNetCore/Exceptionless.SampleLambdaAspNetCore.csproj +++ b/samples/Exceptionless.SampleLambdaAspNetCore/Exceptionless.SampleLambdaAspNetCore.csproj @@ -5,7 +5,7 @@ Lambda - + diff --git a/src/Exceptionless/Exceptionless.csproj b/src/Exceptionless/Exceptionless.csproj index 53986d0f..3fe942bf 100644 --- a/src/Exceptionless/Exceptionless.csproj +++ b/src/Exceptionless/Exceptionless.csproj @@ -34,12 +34,12 @@ - + - + diff --git a/src/Platforms/Exceptionless.Extensions.Hosting/Exceptionless.Extensions.Hosting.csproj b/src/Platforms/Exceptionless.Extensions.Hosting/Exceptionless.Extensions.Hosting.csproj index 8a3c6dde..7993c4b1 100644 --- a/src/Platforms/Exceptionless.Extensions.Hosting/Exceptionless.Extensions.Hosting.csproj +++ b/src/Platforms/Exceptionless.Extensions.Hosting/Exceptionless.Extensions.Hosting.csproj @@ -19,11 +19,11 @@ - + - + diff --git a/src/Platforms/Exceptionless.Extensions.Logging/Exceptionless.Extensions.Logging.csproj b/src/Platforms/Exceptionless.Extensions.Logging/Exceptionless.Extensions.Logging.csproj index cdbd19a1..61794fa0 100644 --- a/src/Platforms/Exceptionless.Extensions.Logging/Exceptionless.Extensions.Logging.csproj +++ b/src/Platforms/Exceptionless.Extensions.Logging/Exceptionless.Extensions.Logging.csproj @@ -19,11 +19,11 @@ - + - + From 4d2a4383cd618ab9968ed7f58da10b2e626bc0b8 Mon Sep 17 00:00:00 2001 From: Blake Niemyjski Date: Wed, 12 Aug 2026 21:15:46 -0500 Subject: [PATCH 3/7] fix: preserve dependency workflow behavior --- .devcontainer/devcontainer.json | 2 +- .github/workflows/build-windows.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 9187c825..3fdf0c5d 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -4,7 +4,7 @@ "image": "mcr.microsoft.com/devcontainers/dotnet:2.1.4-10.0-noble", "features": { "ghcr.io/devcontainers/features/dotnet:2.5.0": { - "version": "10.0.400" + "version": "10.0" } }, "extensions": [ diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index 9250c66f..25afb69f 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -42,7 +42,7 @@ jobs: echo "${0##*/}": Pushing $package... # GitHub - dotnet nuget push "$package" --source https://nuget.pkg.github.com/Exceptionless/index.json --api-key ${{ secrets.GITHUB_TOKEN }} --skip-duplicate + dotnet nuget push "$package" --source https://nuget.pkg.github.com/Exceptionless/index.json --api-key ${{ secrets.GITHUB_TOKEN }} --skip-duplicate || true # Feedz (remove once GitHub supports anonymous access) dotnet nuget push $package --source https://f.feedz.io/exceptionless/exceptionless/nuget --api-key ${{ secrets.FEEDZ_KEY }} --skip-duplicate From c46685f399445a6abeb01fac6343d9d1db59dab6 Mon Sep 17 00:00:00 2001 From: Blake Niemyjski Date: Wed, 12 Aug 2026 21:22:02 -0500 Subject: [PATCH 4/7] chore: lock devcontainer feature digest --- .devcontainer/devcontainer-lock.json | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .devcontainer/devcontainer-lock.json diff --git a/.devcontainer/devcontainer-lock.json b/.devcontainer/devcontainer-lock.json new file mode 100644 index 00000000..405c47fe --- /dev/null +++ b/.devcontainer/devcontainer-lock.json @@ -0,0 +1,9 @@ +{ + "features": { + "ghcr.io/devcontainers/features/dotnet:2.5.0": { + "version": "2.5.0", + "resolved": "ghcr.io/devcontainers/features/dotnet@sha256:0fc16547ed4db6d7ff2a9f5981d2b93eb314e568affb9958029ad794f1f9a093", + "integrity": "sha256:0fc16547ed4db6d7ff2a9f5981d2b93eb314e568affb9958029ad794f1f9a093" + } + } +} From b394d4afc60f397224731fdebd123a052b4f5519 Mon Sep 17 00:00:00 2001 From: Blake Niemyjski Date: Wed, 2 Sep 2026 22:12:25 -0500 Subject: [PATCH 5/7] chore: refresh September dependencies and test tooling --- .devcontainer/devcontainer.json | 2 +- .github/workflows/build-linux.yml | 4 ++-- .github/workflows/build-osx.yml | 4 ++-- .github/workflows/build-windows.yml | 4 ++-- .../Exceptionless.SampleLambda.csproj | 2 +- .../Exceptionless.SampleLambdaAspNetCore.csproj | 4 ++-- .../Exceptionless.Log4net/Exceptionless.Log4net.csproj | 2 +- src/Platforms/Exceptionless.NLog/Exceptionless.NLog.csproj | 2 +- .../Exceptionless.MessagePack.Tests.csproj | 6 +++--- .../Exceptionless.TestHarness.csproj | 2 +- test/Exceptionless.Tests/Exceptionless.Tests.csproj | 6 +++--- test/Exceptionless.Tests/Properties/AssemblyInfo.cs | 5 +++-- 12 files changed, 22 insertions(+), 21 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 3fdf0c5d..38d50b28 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,7 +1,7 @@ { "name": "Exceptionless.Net", - "image": "mcr.microsoft.com/devcontainers/dotnet:2.1.4-10.0-noble", + "image": "mcr.microsoft.com/devcontainers/dotnet:2.2.2-10.0-noble", "features": { "ghcr.io/devcontainers/features/dotnet:2.5.0": { "version": "10.0" diff --git a/.github/workflows/build-linux.yml b/.github/workflows/build-linux.yml index 1e3e8c94..69d9c91c 100644 --- a/.github/workflows/build-linux.yml +++ b/.github/workflows/build-linux.yml @@ -10,12 +10,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + uses: actions/checkout@v7 with: fetch-depth: 0 persist-credentials: false - name: Setup .NET SDK - uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0 + uses: actions/setup-dotnet@v6 with: global-json-file: global.json - name: Build Reason diff --git a/.github/workflows/build-osx.yml b/.github/workflows/build-osx.yml index a2fc356c..79562b59 100644 --- a/.github/workflows/build-osx.yml +++ b/.github/workflows/build-osx.yml @@ -10,12 +10,12 @@ jobs: runs-on: macOS-latest steps: - name: Checkout - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + uses: actions/checkout@v7 with: fetch-depth: 0 persist-credentials: false - name: Setup .NET SDK - uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0 + uses: actions/setup-dotnet@v6 with: global-json-file: global.json - name: Build Reason diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index 25afb69f..eda8348e 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -11,12 +11,12 @@ jobs: runs-on: windows-latest steps: - name: Checkout - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + uses: actions/checkout@v7 with: fetch-depth: 0 persist-credentials: false - name: Setup .NET SDK - uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0 + uses: actions/setup-dotnet@v6 with: global-json-file: global.json - name: Build Reason diff --git a/samples/Exceptionless.SampleLambda/Exceptionless.SampleLambda.csproj b/samples/Exceptionless.SampleLambda/Exceptionless.SampleLambda.csproj index 020fadf7..b4fe70dc 100644 --- a/samples/Exceptionless.SampleLambda/Exceptionless.SampleLambda.csproj +++ b/samples/Exceptionless.SampleLambda/Exceptionless.SampleLambda.csproj @@ -9,7 +9,7 @@ - + diff --git a/samples/Exceptionless.SampleLambdaAspNetCore/Exceptionless.SampleLambdaAspNetCore.csproj b/samples/Exceptionless.SampleLambdaAspNetCore/Exceptionless.SampleLambdaAspNetCore.csproj index b077e98f..e1705570 100644 --- a/samples/Exceptionless.SampleLambdaAspNetCore/Exceptionless.SampleLambdaAspNetCore.csproj +++ b/samples/Exceptionless.SampleLambdaAspNetCore/Exceptionless.SampleLambdaAspNetCore.csproj @@ -5,8 +5,8 @@ Lambda - - + + diff --git a/src/Platforms/Exceptionless.Log4net/Exceptionless.Log4net.csproj b/src/Platforms/Exceptionless.Log4net/Exceptionless.Log4net.csproj index 1355d5c3..5d768a2f 100644 --- a/src/Platforms/Exceptionless.Log4net/Exceptionless.Log4net.csproj +++ b/src/Platforms/Exceptionless.Log4net/Exceptionless.Log4net.csproj @@ -25,7 +25,7 @@ - + diff --git a/src/Platforms/Exceptionless.NLog/Exceptionless.NLog.csproj b/src/Platforms/Exceptionless.NLog/Exceptionless.NLog.csproj index fd7d08ab..47620cd4 100644 --- a/src/Platforms/Exceptionless.NLog/Exceptionless.NLog.csproj +++ b/src/Platforms/Exceptionless.NLog/Exceptionless.NLog.csproj @@ -25,7 +25,7 @@ - + diff --git a/test/Exceptionless.MessagePack.Tests/Exceptionless.MessagePack.Tests.csproj b/test/Exceptionless.MessagePack.Tests/Exceptionless.MessagePack.Tests.csproj index fe6f1d5e..596d794d 100644 --- a/test/Exceptionless.MessagePack.Tests/Exceptionless.MessagePack.Tests.csproj +++ b/test/Exceptionless.MessagePack.Tests/Exceptionless.MessagePack.Tests.csproj @@ -17,9 +17,9 @@ - - - + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/test/Exceptionless.TestHarness/Exceptionless.TestHarness.csproj b/test/Exceptionless.TestHarness/Exceptionless.TestHarness.csproj index e54a4a95..2db77af8 100644 --- a/test/Exceptionless.TestHarness/Exceptionless.TestHarness.csproj +++ b/test/Exceptionless.TestHarness/Exceptionless.TestHarness.csproj @@ -16,7 +16,7 @@ - + diff --git a/test/Exceptionless.Tests/Exceptionless.Tests.csproj b/test/Exceptionless.Tests/Exceptionless.Tests.csproj index 7b31ac45..9f9428df 100644 --- a/test/Exceptionless.Tests/Exceptionless.Tests.csproj +++ b/test/Exceptionless.Tests/Exceptionless.Tests.csproj @@ -39,11 +39,11 @@ - + - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/test/Exceptionless.Tests/Properties/AssemblyInfo.cs b/test/Exceptionless.Tests/Properties/AssemblyInfo.cs index 3c360368..8b3d919d 100644 --- a/test/Exceptionless.Tests/Properties/AssemblyInfo.cs +++ b/test/Exceptionless.Tests/Properties/AssemblyInfo.cs @@ -1,3 +1,4 @@ -using Xunit; +using Xunit.Sdk; +using Xunit.v3; -[assembly: CollectionBehavior(DisableTestParallelization = true, MaxParallelThreads = 1)] \ No newline at end of file +[assembly: Parallelization(Mode = ParallelMode.None)] From 48430147db029d6e3e5628bef274ff1fc268ffe9 Mon Sep 17 00:00:00 2001 From: Blake Niemyjski Date: Wed, 2 Sep 2026 22:18:51 -0500 Subject: [PATCH 6/7] fix: initialize event settings cache atomically --- .../Models/Collections/SettingsDictionary.cs | 39 +-------------- .../Configuration/ConfigurationTests.cs | 48 +++++++++++++------ 2 files changed, 36 insertions(+), 51 deletions(-) diff --git a/src/Exceptionless/Models/Collections/SettingsDictionary.cs b/src/Exceptionless/Models/Collections/SettingsDictionary.cs index c67ac38e..7bc18c1f 100644 --- a/src/Exceptionless/Models/Collections/SettingsDictionary.cs +++ b/src/Exceptionless/Models/Collections/SettingsDictionary.cs @@ -158,25 +158,6 @@ protected override void OnChanged(ChangedEventArgs> LogLevel value; _minLogLevels.TryRemove(logger, out value); } -} - - foreach (var eventType in _eventTypes) { - if (eventType.Key == null || !_typeSourceEnabled.TryGetValue(eventType.Key, out var sourceDictionary)) - continue; - - if (!args.Item.Key.StartsWith(eventType.Value)) - continue; - - var sourceKeysToRemove = new List(); - foreach (string key in sourceDictionary.Keys) { - if (key.IsPatternMatch(args.Item.Key.Substring(eventType.Value.Length))) - sourceKeysToRemove.Add(key); - } - - foreach (var logger in sourceKeysToRemove) { - bool value; - sourceDictionary.TryRemove(logger, out value); - } } base.OnChanged(args); @@ -202,17 +183,10 @@ public LogLevel GetMinLogLevel(string source) { return minLogLevel; } - private readonly ConcurrentDictionary> _typeSourceEnabled = new ConcurrentDictionary>(StringComparer.OrdinalIgnoreCase); - public bool GetTypeAndSourceEnabled(string type, string source) { if (type == null) return true; - if (source != null && _typeSourceEnabled.TryGetValue(type, out var sourceDictionary)) { - if (sourceDictionary.TryGetValue(source, out bool sourceEnabled)) - return sourceEnabled; - } - return GetTypeAndSourceSetting(type, source, "true").ToBoolean(true); } @@ -222,16 +196,7 @@ private string GetTypeAndSourceSetting(string type, string source, string defaul if (type == null) return defaultValue; - string sourcePrefix; - if (!_typeSourceEnabled.TryGetValue(type, out var sourceDictionary)) { - sourceDictionary = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); - _typeSourceEnabled.TryAdd(type, sourceDictionary); - sourcePrefix = "@@" + type + ":"; - - _eventTypes.TryAdd(type, sourcePrefix); - } else { - sourcePrefix = _eventTypes[type]; - } + string sourcePrefix = _eventTypes.GetOrAdd(type, eventType => "@@" + eventType + ":"); // check for exact source match if (TryGetValue(sourcePrefix + source, out string settingValue)) @@ -271,4 +236,4 @@ public static class KnownKeys { public const string LogLevelPrefix = "@@log:"; } } -} \ No newline at end of file +} diff --git a/test/Exceptionless.Tests/Configuration/ConfigurationTests.cs b/test/Exceptionless.Tests/Configuration/ConfigurationTests.cs index d369f64f..fa7ad195 100644 --- a/test/Exceptionless.Tests/Configuration/ConfigurationTests.cs +++ b/test/Exceptionless.Tests/Configuration/ConfigurationTests.cs @@ -166,21 +166,41 @@ public void CanGetSettingsMultithreaded() { [Fact] public void CanGetLogSettingsMultithreaded() { - var settings = new SettingsDictionary { - { "@@log:*", "Info" }, - { "@@log:Source1", "Trace" }, - { "@@log:Source2", "Debug" }, - { "@@log:Source3", "Info" }, - { "@@log:Source4", "Info" } - }; - - var result = Parallel.For(0, 100, index => { - var level = settings.GetMinLogLevel("Source1"); - _writer.WriteLine("Source1 log level: {0}", level); - }); + for (int attempt = 0; attempt < 1000; attempt++) { + var settings = new SettingsDictionary { + { "@@log:*", "Info" }, + { "@@log:Source1", "Trace" }, + { "@@log:Source2", "Debug" } + }; + + Parallel.For(0, 100, index => { + Assert.Equal(LogLevel.Trace, settings.GetMinLogLevel("Source1")); + Assert.Equal(LogLevel.Debug, settings.GetMinLogLevel("Source2")); + Assert.Equal(LogLevel.Info, settings.GetMinLogLevel("Other")); + }); + } + } - while (!result.IsCompleted) - Thread.Yield(); + [Theory] + [InlineData("usage")] + [InlineData("error")] + public void CanGetEventSettingsMultithreaded(string type) { + for (int attempt = 0; attempt < 1000; attempt++) { + var settings = new SettingsDictionary { + { "@@" + type + ":*", "true" }, + { "@@" + type + ":Source1", "false" } + }; + + Parallel.For(0, 100, index => { + Assert.False(settings.GetTypeAndSourceEnabled(type, "Source1")); + Assert.True(settings.GetTypeAndSourceEnabled(type, "Other")); + }); + + settings["@@" + type + ":Source1"] = "true"; + Assert.True(settings.GetTypeAndSourceEnabled(type, "Source1")); + settings["@@" + type + ":*"] = "false"; + Assert.False(settings.GetTypeAndSourceEnabled(type, "Other")); + } } [Fact] From f9ddd3de39a7a8515d66f2df7fa7c39cb323fde6 Mon Sep 17 00:00:00 2001 From: Blake Niemyjski Date: Wed, 2 Sep 2026 22:20:44 -0500 Subject: [PATCH 7/7] fix: preserve package paths in Windows publish loops --- .github/workflows/build-windows.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index eda8348e..0c083e72 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -38,20 +38,20 @@ jobs: shell: bash if: github.event_name != 'pull_request' run: | - for package in $(find -name "*.nupkg" | grep "minver" -v); do + while IFS= read -r -d '' package; do echo "${0##*/}": Pushing $package... # GitHub dotnet nuget push "$package" --source https://nuget.pkg.github.com/Exceptionless/index.json --api-key ${{ secrets.GITHUB_TOKEN }} --skip-duplicate || true # Feedz (remove once GitHub supports anonymous access) - dotnet nuget push $package --source https://f.feedz.io/exceptionless/exceptionless/nuget --api-key ${{ secrets.FEEDZ_KEY }} --skip-duplicate - done + dotnet nuget push "$package" --source https://f.feedz.io/exceptionless/exceptionless/nuget --api-key ${{ secrets.FEEDZ_KEY }} --skip-duplicate + done < <(find . -name '*.nupkg' ! -path '*minver*' -print0) - name: Publish Release Packages shell: bash if: startsWith(github.ref, 'refs/tags/v') run: | - for package in $(find -name "*.nupkg" | grep "minver" -v); do + while IFS= read -r -d '' package; do echo "${0##*/}": Pushing $package... - dotnet nuget push $package --source https://api.nuget.org/v3/index.json --api-key ${{ secrets.NUGET_KEY }} --skip-duplicate - done + dotnet nuget push "$package" --source https://api.nuget.org/v3/index.json --api-key ${{ secrets.NUGET_KEY }} --skip-duplicate + done < <(find . -name '*.nupkg' ! -path '*minver*' -print0)