From 6ac6ac467e84d23668bf33fe27303c60a5c9b391 Mon Sep 17 00:00:00 2001 From: StuartFerguson Date: Mon, 21 Sep 2026 08:18:32 +0100 Subject: [PATCH 1/4] test: verify registration version payload --- .../Client/HealthMonitoringRegistrationClientTests.cs | 5 ++++- .../Client/HealthMonitoringRegistrationExtensionsTests.cs | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/HealthMonitoring.Tests/Client/HealthMonitoringRegistrationClientTests.cs b/HealthMonitoring.Tests/Client/HealthMonitoringRegistrationClientTests.cs index 26feae4..55b40d4 100644 --- a/HealthMonitoring.Tests/Client/HealthMonitoringRegistrationClientTests.cs +++ b/HealthMonitoring.Tests/Client/HealthMonitoringRegistrationClientTests.cs @@ -34,7 +34,8 @@ public async Task RegisterAsync_posts_service_configuration_and_returns_acknowle PollingInterval = TimeSpan.FromSeconds(30), RequestTimeout = TimeSpan.FromSeconds(8), RetentionPeriod = TimeSpan.FromDays(90), - IgnoreCertificateErrors = true + IgnoreCertificateErrors = true, + Version = "1.2.3" }); Assert.Equal("created", result.Action); @@ -46,6 +47,7 @@ public async Task RegisterAsync_posts_service_configuration_and_returns_acknowle Assert.Equal(0, payload.MonitorType); Assert.Equal(30, payload.PollingIntervalSeconds); Assert.True(payload.IgnoreCertificateErrors); + Assert.Equal("1.2.3", payload.Version); } [Fact] @@ -132,6 +134,7 @@ private sealed class ServiceRegistrationPayload public int MonitorType { get; set; } public int PollingIntervalSeconds { get; set; } public bool IgnoreCertificateErrors { get; set; } + public string? Version { get; set; } } private sealed class DependencyMappingPayload diff --git a/HealthMonitoring.Tests/Client/HealthMonitoringRegistrationExtensionsTests.cs b/HealthMonitoring.Tests/Client/HealthMonitoringRegistrationExtensionsTests.cs index 9584cca..fdae71a 100644 --- a/HealthMonitoring.Tests/Client/HealthMonitoringRegistrationExtensionsTests.cs +++ b/HealthMonitoring.Tests/Client/HealthMonitoringRegistrationExtensionsTests.cs @@ -18,6 +18,7 @@ public void Configuration_registration_binds_service_settings_and_adds_startup_r ["HealthMonitoring:Service:Name"] = "Mobile Configuration", ["HealthMonitoring:Service:HealthUrl"] = "https://mobile.example/healthui", ["HealthMonitoring:Service:Description"] = "Mobile Configuration", + ["HealthMonitoring:Service:Version"] = "1.2.3", ["HealthMonitoring:Service:PollingInterval"] = "00:02:00", ["HealthMonitoring:Dependencies:0:DependencyName"] = "Security Service", ["HealthMonitoring:Dependencies:0:TargetServiceId"] = "security-service" @@ -33,6 +34,7 @@ public void Configuration_registration_binds_service_settings_and_adds_startup_r Assert.Equal(new Uri("https://monitoring.example/"), options.MonitoringServerUrl); Assert.Equal("mobile-configuration", options.Service.ServiceId); + Assert.Equal("1.2.3", options.Service.Version); Assert.Equal(TimeSpan.FromMinutes(2), options.Service.PollingInterval); Assert.Single(options.Dependencies); Assert.Contains(provider.GetServices(), service => service is HealthMonitoringRegistrationHostedService); From c32ff54784c17242cdfaa3e8d5d6bf5cf9d208e6 Mon Sep 17 00:00:00 2001 From: StuartFerguson Date: Mon, 21 Sep 2026 09:18:50 +0100 Subject: [PATCH 2/4] Remove obsolete code and configuration --- .github/workflows/createrelease.yml | 67 +++++++++++++++++++ .github/workflows/pushtomain.yml | 43 +++++++++++- .../HealthMonitoring.Client.csproj | 0 .../HealthMonitoringRegistrationClient.cs | 23 ------- .../HealthMonitoringRegistrationExtensions.cs | 0 .../HealthMonitoring.Client}/README.md | 20 +----- .../Api/ServiceConfigurationValidatorTests.cs | 0 .../Api/ServiceRegistrationLoggingTests.cs | 0 ...HealthMonitoringRegistrationClientTests.cs | 0 ...thMonitoringRegistrationExtensionsTests.cs | 0 .../Components/DashboardApiUriTests.cs | 0 .../ConfigurationTests.cs | 0 .../Domain/HealthStatusNormalizerTests.cs | 0 .../HealthMonitoring.Tests.csproj | 0 ...ealthMonitoringServiceRegistrationTests.cs | 0 .../HealthMonitoring.Tests}/HostSmokeTests.cs | 0 .../Monitoring/HealthEndpointClientTests.cs | 0 .../Monitoring/IncidentCalculatorTests.cs | 0 .../Monitoring/InitializationStateTests.cs | 0 .../Monitoring/KurrentDbMonitorClientTests.cs | 0 .../Monitoring/SqlServerMonitorClientTests.cs | 0 .../Persistence/DependencyMappingTests.cs | 0 .../HealthMonitoringMigrationsTests.cs | 0 .../Persistence/RepositoryTests.cs | 0 .../Persistence/TimeSpanMappingTests.cs | 0 .../HealthMonitoring.Tests}/Usings.cs | 0 .../Api/DependencyMappingContracts.cs | 0 .../Api/DependencyMappingEndpoints.cs | 0 .../Api/InitializationEndpoints.cs | 0 .../Api/ServiceConfigurationValidator.cs | 0 .../Api/ServiceRegistrationContracts.cs | 0 .../Api/ServiceRegistrationEndpoints.cs | 0 .../Components/App.razor | 0 .../Components/DashboardApiUri.cs | 0 .../Components/InitializationGate.razor | 0 .../Components/Layout/MainLayout.razor | 0 .../Components/Pages/DependencyLinks.razor | 0 .../Pages/InitialisationOverview.razor | 0 .../Components/Pages/Initialise.razor | 0 .../Components/Pages/Overview.razor | 0 .../Components/Pages/ServiceDetail.razor | 0 .../Components/Pages/ServiceRegister.razor | 0 .../Components/Routes.razor | 0 .../Components/Shared/StatCard.razor | 0 .../Components/Shared/StatusBadge.razor | 0 .../Components/_Imports.razor | 0 .../{ => HealthMonitoring}/Dockerfile | 0 .../Domain/HealthCheckResult.cs | 0 .../Domain/HealthObservation.cs | 0 .../Domain/HealthResponseModels.cs | 0 .../Domain/HealthStatus.cs | 0 .../Domain/HealthStatusNormalizer.cs | 0 .../Domain/IHealthStatusNormalizer.cs | 0 .../Domain/MonitorType.cs | 0 .../Domain/MonitoredService.cs | 0 .../Domain/ServiceDependencyLink.cs | 0 .../Domain/ServiceIncident.cs | 0 .../Domain/ServiceStatusSnapshot.cs | 0 .../Domain/StatusPolicy.cs | 0 .../Health/MonitoringHealthChecks.cs | 0 .../HealthMonitoring.csproj | 0 .../HealthMonitoring.sln | 0 .../20260919092909_InitialCreate.Designer.cs | 0 .../20260919092909_InitialCreate.cs | 0 .../HealthMonitoringDbContextModelSnapshot.cs | 0 .../Monitoring/HealthEndpointClient.cs | 0 ...thMonitoringServiceCollectionExtensions.cs | 0 .../Monitoring/HealthPollingWorker.cs | 0 .../Monitoring/IncidentCalculator.cs | 0 .../Monitoring/InitializationService.cs | 0 .../Monitoring/KurrentDbMonitorClient.cs | 0 .../Monitoring/RetentionCleanupWorker.cs | 0 .../Monitoring/SqlServerMonitorClient.cs | 0 .../Persistence/HealthMonitoringDbContext.cs | 0 .../Persistence/HealthMonitoringRepository.cs | 0 .../IHealthMonitoringRepository.cs | 0 .../{ => HealthMonitoring}/Program.cs | 0 .../Properties/launchSettings.json | 0 .../Reporting/DashboardModels.cs | 0 .../Reporting/DashboardQueryService.cs | 0 .../{ => HealthMonitoring}/appsettings.json | 0 .../docker-compose.sqlserver.yml | 0 .../{ => HealthMonitoring}/hosting.json | 0 .../{ => HealthMonitoring}/wwwroot/app.css | 0 HealthMonitoring/appsettings.Development.json | 10 --- 85 files changed, 111 insertions(+), 52 deletions(-) rename {HealthMonitoring.Client => HealthMonitoring/HealthMonitoring.Client}/HealthMonitoring.Client.csproj (100%) rename {HealthMonitoring.Client => HealthMonitoring/HealthMonitoring.Client}/HealthMonitoringRegistrationClient.cs (90%) rename {HealthMonitoring.Client => HealthMonitoring/HealthMonitoring.Client}/HealthMonitoringRegistrationExtensions.cs (100%) rename {HealthMonitoring.Client => HealthMonitoring/HealthMonitoring.Client}/README.md (56%) rename {HealthMonitoring.Tests => HealthMonitoring/HealthMonitoring.Tests}/Api/ServiceConfigurationValidatorTests.cs (100%) rename {HealthMonitoring.Tests => HealthMonitoring/HealthMonitoring.Tests}/Api/ServiceRegistrationLoggingTests.cs (100%) rename {HealthMonitoring.Tests => HealthMonitoring/HealthMonitoring.Tests}/Client/HealthMonitoringRegistrationClientTests.cs (100%) rename {HealthMonitoring.Tests => HealthMonitoring/HealthMonitoring.Tests}/Client/HealthMonitoringRegistrationExtensionsTests.cs (100%) rename {HealthMonitoring.Tests => HealthMonitoring/HealthMonitoring.Tests}/Components/DashboardApiUriTests.cs (100%) rename {HealthMonitoring.Tests => HealthMonitoring/HealthMonitoring.Tests}/ConfigurationTests.cs (100%) rename {HealthMonitoring.Tests => HealthMonitoring/HealthMonitoring.Tests}/Domain/HealthStatusNormalizerTests.cs (100%) rename {HealthMonitoring.Tests => HealthMonitoring/HealthMonitoring.Tests}/HealthMonitoring.Tests.csproj (100%) rename {HealthMonitoring.Tests => HealthMonitoring/HealthMonitoring.Tests}/HealthMonitoringServiceRegistrationTests.cs (100%) rename {HealthMonitoring.Tests => HealthMonitoring/HealthMonitoring.Tests}/HostSmokeTests.cs (100%) rename {HealthMonitoring.Tests => HealthMonitoring/HealthMonitoring.Tests}/Monitoring/HealthEndpointClientTests.cs (100%) rename {HealthMonitoring.Tests => HealthMonitoring/HealthMonitoring.Tests}/Monitoring/IncidentCalculatorTests.cs (100%) rename {HealthMonitoring.Tests => HealthMonitoring/HealthMonitoring.Tests}/Monitoring/InitializationStateTests.cs (100%) rename {HealthMonitoring.Tests => HealthMonitoring/HealthMonitoring.Tests}/Monitoring/KurrentDbMonitorClientTests.cs (100%) rename {HealthMonitoring.Tests => HealthMonitoring/HealthMonitoring.Tests}/Monitoring/SqlServerMonitorClientTests.cs (100%) rename {HealthMonitoring.Tests => HealthMonitoring/HealthMonitoring.Tests}/Persistence/DependencyMappingTests.cs (100%) rename {HealthMonitoring.Tests => HealthMonitoring/HealthMonitoring.Tests}/Persistence/HealthMonitoringMigrationsTests.cs (100%) rename {HealthMonitoring.Tests => HealthMonitoring/HealthMonitoring.Tests}/Persistence/RepositoryTests.cs (100%) rename {HealthMonitoring.Tests => HealthMonitoring/HealthMonitoring.Tests}/Persistence/TimeSpanMappingTests.cs (100%) rename {HealthMonitoring.Tests => HealthMonitoring/HealthMonitoring.Tests}/Usings.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Api/DependencyMappingContracts.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Api/DependencyMappingEndpoints.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Api/InitializationEndpoints.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Api/ServiceConfigurationValidator.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Api/ServiceRegistrationContracts.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Api/ServiceRegistrationEndpoints.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Components/App.razor (100%) rename HealthMonitoring/{ => HealthMonitoring}/Components/DashboardApiUri.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Components/InitializationGate.razor (100%) rename HealthMonitoring/{ => HealthMonitoring}/Components/Layout/MainLayout.razor (100%) rename HealthMonitoring/{ => HealthMonitoring}/Components/Pages/DependencyLinks.razor (100%) rename HealthMonitoring/{ => HealthMonitoring}/Components/Pages/InitialisationOverview.razor (100%) rename HealthMonitoring/{ => HealthMonitoring}/Components/Pages/Initialise.razor (100%) rename HealthMonitoring/{ => HealthMonitoring}/Components/Pages/Overview.razor (100%) rename HealthMonitoring/{ => HealthMonitoring}/Components/Pages/ServiceDetail.razor (100%) rename HealthMonitoring/{ => HealthMonitoring}/Components/Pages/ServiceRegister.razor (100%) rename HealthMonitoring/{ => HealthMonitoring}/Components/Routes.razor (100%) rename HealthMonitoring/{ => HealthMonitoring}/Components/Shared/StatCard.razor (100%) rename HealthMonitoring/{ => HealthMonitoring}/Components/Shared/StatusBadge.razor (100%) rename HealthMonitoring/{ => HealthMonitoring}/Components/_Imports.razor (100%) rename HealthMonitoring/{ => HealthMonitoring}/Dockerfile (100%) rename HealthMonitoring/{ => HealthMonitoring}/Domain/HealthCheckResult.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Domain/HealthObservation.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Domain/HealthResponseModels.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Domain/HealthStatus.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Domain/HealthStatusNormalizer.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Domain/IHealthStatusNormalizer.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Domain/MonitorType.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Domain/MonitoredService.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Domain/ServiceDependencyLink.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Domain/ServiceIncident.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Domain/ServiceStatusSnapshot.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Domain/StatusPolicy.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Health/MonitoringHealthChecks.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/HealthMonitoring.csproj (100%) rename HealthMonitoring/{ => HealthMonitoring}/HealthMonitoring.sln (100%) rename HealthMonitoring/{ => HealthMonitoring}/Migrations/20260919092909_InitialCreate.Designer.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Migrations/20260919092909_InitialCreate.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Migrations/HealthMonitoringDbContextModelSnapshot.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Monitoring/HealthEndpointClient.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Monitoring/HealthMonitoringServiceCollectionExtensions.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Monitoring/HealthPollingWorker.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Monitoring/IncidentCalculator.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Monitoring/InitializationService.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Monitoring/KurrentDbMonitorClient.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Monitoring/RetentionCleanupWorker.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Monitoring/SqlServerMonitorClient.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Persistence/HealthMonitoringDbContext.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Persistence/HealthMonitoringRepository.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Persistence/IHealthMonitoringRepository.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Program.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Properties/launchSettings.json (100%) rename HealthMonitoring/{ => HealthMonitoring}/Reporting/DashboardModels.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/Reporting/DashboardQueryService.cs (100%) rename HealthMonitoring/{ => HealthMonitoring}/appsettings.json (100%) rename HealthMonitoring/{ => HealthMonitoring}/docker-compose.sqlserver.yml (100%) rename HealthMonitoring/{ => HealthMonitoring}/hosting.json (100%) rename HealthMonitoring/{ => HealthMonitoring}/wwwroot/app.css (100%) delete mode 100644 HealthMonitoring/appsettings.Development.json diff --git a/.github/workflows/createrelease.yml b/.github/workflows/createrelease.yml index 947fc9e..82a9ddb 100644 --- a/.github/workflows/createrelease.yml +++ b/.github/workflows/createrelease.yml @@ -28,16 +28,19 @@ jobs: run: | dotnet restore TransactionProcessing.MerchantPos/TransactionProcessing.MerchantPos.sln --source ${{ secrets.PUBLICFEEDURL }} --source ${{ secrets.PRIVATEFEED_URL }} dotnet restore TransactionProcessing.MerchantFileProcessor/TransactionProcessing.MerchantFileProcessor.sln --source ${{ secrets.PUBLICFEEDURL }} --source ${{ secrets.PRIVATEFEED_URL }} + dotnet restore HealthMonitoring/HealthMonitoring.sln --source ${{ secrets.PUBLICFEEDURL }} --source ${{ secrets.PRIVATEFEED_URL }} - name: Build Code run: | dotnet build TransactionProcessing.MerchantPos/TransactionProcessing.MerchantPos.sln --configuration Release dotnet build TransactionProcessing.MerchantFileProcessor/TransactionProcessing.MerchantFileProcessor.sln --configuration Release + dotnet build HealthMonitoring/HealthMonitoring.sln --configuration Release - name: Publish API run: | dotnet publish "TransactionProcessing.MerchantPos/TransactionProcessing.MerchantPos.csproj" --configuration Release --output TransactionProcessing.MerchantPos/publishOutput -r win-x64 --self-contained dotnet publish "TransactionProcessing.MerchantFileProcessor/TransactionProcessing.MerchantFileProcessor.csproj" --configuration Release --output TransactionProcessing.MerchantFileProcessor/publishOutput -r win-x64 --self-contained + dotnet publish "HealthMonitoring/HealthMonitoring.csproj" --configuration Release --output HealthMonitoring/publishOutput -r win-x64 --self-contained - name: Build Release Package (Merchant Pos) run: | @@ -69,6 +72,18 @@ jobs: name: scheduledtasks path: ScheduledTasks + - name: Build Release Package (Health Monitoring) + run: | + cd /home/runner/work/SupportTools/SupportTools/TransactionProcessing.HealthMonitoring/publishOutput + zip -r ../healthmonitoring.zip ./* + echo "Zip file created at: $(realpath ../healthmonitoring.zip)" + + - name: Upload the artifact (Health Monitoring) + uses: actions/upload-artifact@v4.4.0 + with: + name: healthmonitoring + path: /home/runner/work/SupportTools/SupportTools/TransactionProcessing.HealthMonitoring/healthmonitoring.zip + - name: Build and Publish Nuget Packages if: ${{ github.event.release.prerelease == false }} run: | @@ -284,6 +299,32 @@ jobs: New-Service -Name $serviceName -BinaryPathName $servicePath -Description $serviceName -DisplayName $serviceName -StartupType Automatic Start-Service -Name $serviceName + - name: Download the artifact (Health Monitoring) + uses: actions/download-artifact@v4.1.8 + with: + name: healthmonitoring + + - name: Remove existing Windows service (Health Monitoring) + run: | + $serviceName = "Transaction Processing - Health Monitoring" + # Check if the service exists + if (Get-Service -Name $serviceName -ErrorAction SilentlyContinue) { + Stop-Service -Name $serviceName + sc.exe delete $serviceName + } + + - name: Unzip the files (Health Monitoring) + run: | + Expand-Archive -Path healthmonitoring.zip -DestinationPath "C:\txnproc\transactionprocessing\healthmonitoring" -Force + + - name: Install as a Windows service (Health Monitoring) + run: | + $serviceName = "Transaction Processing - Health Monitoring" + $servicePath = "C:\txnproc\transactionprocessing\healthmonitoring\TransactionProcessing.HealthMonitoring.exe" + + New-Service -Name $serviceName -BinaryPathName $servicePath -Description $serviceName -DisplayName $serviceName -StartupType Automatic + Start-Service -Name $serviceName + deployproduction: runs-on: [productionserver, windows] needs: [build, buildsqlagentjobdeploymenttool, deploystaging] @@ -452,3 +493,29 @@ jobs: New-Service -Name $serviceName -BinaryPathName $servicePath -Description $serviceName -DisplayName $serviceName -StartupType Automatic Start-Service -Name $serviceName + + - name: Download the artifact (Health Monitoring) + uses: actions/download-artifact@v4.1.8 + with: + name: healthmonitoring + + - name: Remove existing Windows service (Health Monitoring) + run: | + $serviceName = "Transaction Processing - Health Monitoring" + # Check if the service exists + if (Get-Service -Name $serviceName -ErrorAction SilentlyContinue) { + Stop-Service -Name $serviceName + sc.exe delete $serviceName + } + + - name: Unzip the files (Health Monitoring) + run: | + Expand-Archive -Path healthmonitoring.zip -DestinationPath "C:\txnproc\transactionprocessing\healthmonitoring" -Force + + - name: Install as a Windows service (Health Monitoring) + run: | + $serviceName = "Transaction Processing - Health Monitoring" + $servicePath = "C:\txnproc\transactionprocessing\healthmonitoring\TransactionProcessing.HealthMonitoring.exe" + + New-Service -Name $serviceName -BinaryPathName $servicePath -Description $serviceName -DisplayName $serviceName -StartupType Automatic + Start-Service -Name $serviceName diff --git a/.github/workflows/pushtomain.yml b/.github/workflows/pushtomain.yml index 28eb1ea..94224f9 100644 --- a/.github/workflows/pushtomain.yml +++ b/.github/workflows/pushtomain.yml @@ -43,16 +43,19 @@ jobs: run: | dotnet restore TransactionProcessing.MerchantPos/TransactionProcessing.MerchantPos.sln --source ${{ secrets.PUBLICFEEDURL }} --source ${{ secrets.PRIVATEFEED_URL }} dotnet restore TransactionProcessing.MerchantFileProcessor/TransactionProcessing.MerchantFileProcessor.sln --source ${{ secrets.PUBLICFEEDURL }} --source ${{ secrets.PRIVATEFEED_URL }} + dotnet restore HealthMonitoring/HealthMonitoring.sln --source ${{ secrets.PUBLICFEEDURL }} --source ${{ secrets.PRIVATEFEED_URL }} - name: Build Code run: | dotnet build TransactionProcessing.MerchantPos/TransactionProcessing.MerchantPos.sln --configuration Release dotnet build TransactionProcessing.MerchantFileProcessor/TransactionProcessing.MerchantFileProcessor.sln --configuration Release + dotnet build HealthMonitoring/HealthMonitoring.sln --configuration Release - name: Publish API run: | dotnet publish "TransactionProcessing.MerchantPos/TransactionProcessing.MerchantPos.csproj" --configuration Release --output TransactionProcessing.MerchantPos/publishOutput -r win-x64 --self-contained dotnet publish "TransactionProcessing.MerchantFileProcessor/TransactionProcessing.MerchantFileProcessor.csproj" --configuration Release --output TransactionProcessing.MerchantFileProcessor/publishOutput -r win-x64 --self-contained + dotnet publish "HealthMonitoring/HealthMonitoring.csproj" --configuration Release --output HealthMonitoring/publishOutput -r win-x64 --self-contained - name: Build Release Package (Merchant Pos) run: | @@ -83,7 +86,19 @@ jobs: with: name: scheduledtasks path: ScheduledTasks - + + - name: Build Release Package (Health Monitoring) + run: | + cd /home/runner/work/SupportTools/SupportTools/TransactionProcessing.HealthMonitoring/publishOutput + zip -r ../healthmonitoring.zip ./* + echo "Zip file created at: $(realpath ../healthmonitoring.zip)" + + - name: Upload the artifact (Health Monitoring) + uses: actions/upload-artifact@v4.4.0 + with: + name: healthmonitoring + path: /home/runner/work/SupportTools/SupportTools/TransactionProcessing.HealthMonitoring/healthmonitoring.zip + - name: Build and Publish Nuget Packages run: | dotnet pack "HealthMonitoring.Client\HealthMonitoring.Client.csproj" /p:PackageVersion=${{ steps.next_version.outputs.VERSION }} --output Nugets @@ -297,3 +312,29 @@ jobs: New-Service -Name $serviceName -BinaryPathName $servicePath -Description $serviceName -DisplayName $serviceName -StartupType Automatic Start-Service -Name $serviceName + + - name: Download the artifact (Health Monitoring) + uses: actions/download-artifact@v4.1.8 + with: + name: healthmonitoring + + - name: Remove existing Windows service (Health Monitoring) + run: | + $serviceName = "Transaction Processing - Health Monitoring" + # Check if the service exists + if (Get-Service -Name $serviceName -ErrorAction SilentlyContinue) { + Stop-Service -Name $serviceName + sc.exe delete $serviceName + } + + - name: Unzip the files (Health Monitoring) + run: | + Expand-Archive -Path healthmonitoring.zip -DestinationPath "C:\txnproc\transactionprocessing\healthmonitoring" -Force + + - name: Install as a Windows service (Health Monitoring) + run: | + $serviceName = "Transaction Processing - Health Monitoring" + $servicePath = "C:\txnproc\transactionprocessing\healthmonitoring\TransactionProcessing.HealthMonitoring.exe" + + New-Service -Name $serviceName -BinaryPathName $servicePath -Description $serviceName -DisplayName $serviceName -StartupType Automatic + Start-Service -Name $serviceName diff --git a/HealthMonitoring.Client/HealthMonitoring.Client.csproj b/HealthMonitoring/HealthMonitoring.Client/HealthMonitoring.Client.csproj similarity index 100% rename from HealthMonitoring.Client/HealthMonitoring.Client.csproj rename to HealthMonitoring/HealthMonitoring.Client/HealthMonitoring.Client.csproj diff --git a/HealthMonitoring.Client/HealthMonitoringRegistrationClient.cs b/HealthMonitoring/HealthMonitoring.Client/HealthMonitoringRegistrationClient.cs similarity index 90% rename from HealthMonitoring.Client/HealthMonitoringRegistrationClient.cs rename to HealthMonitoring/HealthMonitoring.Client/HealthMonitoringRegistrationClient.cs index bcc9bf9..d65f40d 100644 --- a/HealthMonitoring.Client/HealthMonitoringRegistrationClient.cs +++ b/HealthMonitoring/HealthMonitoring.Client/HealthMonitoringRegistrationClient.cs @@ -1,15 +1,9 @@ using System.Net.Http.Json; using System.Text.Json; -using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; namespace HealthMonitoring.Client; -public sealed class HealthMonitoringRegistrationClientOptions -{ - public Uri MonitoringServerUrl { get; set; } = new("http://localhost:9620"); -} - public sealed class ServiceRegistrationOptions { public string ServiceId { get; init; } = string.Empty; @@ -165,20 +159,3 @@ private sealed record ServiceIdentityPayload(Guid Id, string ServiceId, string N private sealed record DependencyMappingPayload(string DependencyName, Guid TargetMonitoredServiceId); private sealed record DependencyLinkResponsePayload(Guid Id, string DependencyName, Guid TargetMonitoredServiceId, string TargetServiceId, string TargetServiceName); } - -public static class HealthMonitoringRegistrationClientServiceCollectionExtensions -{ - public static IHttpClientBuilder AddHealthMonitoringRegistrationClient(this IServiceCollection services, Action configure) - { - ArgumentNullException.ThrowIfNull(services); - ArgumentNullException.ThrowIfNull(configure); - var options = new HealthMonitoringRegistrationClientOptions(); - configure(options); - if (!options.MonitoringServerUrl.IsAbsoluteUri) throw new ArgumentException("The monitoring server URL must be absolute.", nameof(configure)); - - return services.AddHttpClient(client => - { - client.BaseAddress = options.MonitoringServerUrl; - }); - } -} diff --git a/HealthMonitoring.Client/HealthMonitoringRegistrationExtensions.cs b/HealthMonitoring/HealthMonitoring.Client/HealthMonitoringRegistrationExtensions.cs similarity index 100% rename from HealthMonitoring.Client/HealthMonitoringRegistrationExtensions.cs rename to HealthMonitoring/HealthMonitoring.Client/HealthMonitoringRegistrationExtensions.cs diff --git a/HealthMonitoring.Client/README.md b/HealthMonitoring/HealthMonitoring.Client/README.md similarity index 56% rename from HealthMonitoring.Client/README.md rename to HealthMonitoring/HealthMonitoring.Client/README.md index 0c98c47..b6197db 100644 --- a/HealthMonitoring.Client/README.md +++ b/HealthMonitoring/HealthMonitoring.Client/README.md @@ -1,6 +1,6 @@ # HealthMonitoring.Client -Reusable .NET client for service self-registration and dependency mapping. +Reusable .NET client for configuration-based service self-registration and dependency mapping. For automatic registration at application startup, add this configuration: @@ -32,20 +32,4 @@ services.AddHealthMonitoringRegistration(configuration); The client registers the service and dependency mappings once during application startup. Registration is idempotent. If the `HealthMonitoring` section is absent, no registration is attempted and the application starts normally. -```csharp -services.AddHealthMonitoringRegistrationClient(options => -{ - options.MonitoringServerUrl = new Uri("http://localhost:9620"); -}); - -var result = await client.RegisterAndConfigureAsync( - new ServiceRegistrationOptions - { - ServiceId = "payments-api", - Name = "Payments API", - HealthUrl = new Uri("https://payments-api/health") - }, - [new DependencyMappingOptions("Security Service", "security-service")]); -``` - -Registration is idempotent. Dependency mappings are resolved by `TargetServiceId` and are created or updated as needed. +Dependency mappings are resolved by `TargetServiceId` and are created or updated as needed. diff --git a/HealthMonitoring.Tests/Api/ServiceConfigurationValidatorTests.cs b/HealthMonitoring/HealthMonitoring.Tests/Api/ServiceConfigurationValidatorTests.cs similarity index 100% rename from HealthMonitoring.Tests/Api/ServiceConfigurationValidatorTests.cs rename to HealthMonitoring/HealthMonitoring.Tests/Api/ServiceConfigurationValidatorTests.cs diff --git a/HealthMonitoring.Tests/Api/ServiceRegistrationLoggingTests.cs b/HealthMonitoring/HealthMonitoring.Tests/Api/ServiceRegistrationLoggingTests.cs similarity index 100% rename from HealthMonitoring.Tests/Api/ServiceRegistrationLoggingTests.cs rename to HealthMonitoring/HealthMonitoring.Tests/Api/ServiceRegistrationLoggingTests.cs diff --git a/HealthMonitoring.Tests/Client/HealthMonitoringRegistrationClientTests.cs b/HealthMonitoring/HealthMonitoring.Tests/Client/HealthMonitoringRegistrationClientTests.cs similarity index 100% rename from HealthMonitoring.Tests/Client/HealthMonitoringRegistrationClientTests.cs rename to HealthMonitoring/HealthMonitoring.Tests/Client/HealthMonitoringRegistrationClientTests.cs diff --git a/HealthMonitoring.Tests/Client/HealthMonitoringRegistrationExtensionsTests.cs b/HealthMonitoring/HealthMonitoring.Tests/Client/HealthMonitoringRegistrationExtensionsTests.cs similarity index 100% rename from HealthMonitoring.Tests/Client/HealthMonitoringRegistrationExtensionsTests.cs rename to HealthMonitoring/HealthMonitoring.Tests/Client/HealthMonitoringRegistrationExtensionsTests.cs diff --git a/HealthMonitoring.Tests/Components/DashboardApiUriTests.cs b/HealthMonitoring/HealthMonitoring.Tests/Components/DashboardApiUriTests.cs similarity index 100% rename from HealthMonitoring.Tests/Components/DashboardApiUriTests.cs rename to HealthMonitoring/HealthMonitoring.Tests/Components/DashboardApiUriTests.cs diff --git a/HealthMonitoring.Tests/ConfigurationTests.cs b/HealthMonitoring/HealthMonitoring.Tests/ConfigurationTests.cs similarity index 100% rename from HealthMonitoring.Tests/ConfigurationTests.cs rename to HealthMonitoring/HealthMonitoring.Tests/ConfigurationTests.cs diff --git a/HealthMonitoring.Tests/Domain/HealthStatusNormalizerTests.cs b/HealthMonitoring/HealthMonitoring.Tests/Domain/HealthStatusNormalizerTests.cs similarity index 100% rename from HealthMonitoring.Tests/Domain/HealthStatusNormalizerTests.cs rename to HealthMonitoring/HealthMonitoring.Tests/Domain/HealthStatusNormalizerTests.cs diff --git a/HealthMonitoring.Tests/HealthMonitoring.Tests.csproj b/HealthMonitoring/HealthMonitoring.Tests/HealthMonitoring.Tests.csproj similarity index 100% rename from HealthMonitoring.Tests/HealthMonitoring.Tests.csproj rename to HealthMonitoring/HealthMonitoring.Tests/HealthMonitoring.Tests.csproj diff --git a/HealthMonitoring.Tests/HealthMonitoringServiceRegistrationTests.cs b/HealthMonitoring/HealthMonitoring.Tests/HealthMonitoringServiceRegistrationTests.cs similarity index 100% rename from HealthMonitoring.Tests/HealthMonitoringServiceRegistrationTests.cs rename to HealthMonitoring/HealthMonitoring.Tests/HealthMonitoringServiceRegistrationTests.cs diff --git a/HealthMonitoring.Tests/HostSmokeTests.cs b/HealthMonitoring/HealthMonitoring.Tests/HostSmokeTests.cs similarity index 100% rename from HealthMonitoring.Tests/HostSmokeTests.cs rename to HealthMonitoring/HealthMonitoring.Tests/HostSmokeTests.cs diff --git a/HealthMonitoring.Tests/Monitoring/HealthEndpointClientTests.cs b/HealthMonitoring/HealthMonitoring.Tests/Monitoring/HealthEndpointClientTests.cs similarity index 100% rename from HealthMonitoring.Tests/Monitoring/HealthEndpointClientTests.cs rename to HealthMonitoring/HealthMonitoring.Tests/Monitoring/HealthEndpointClientTests.cs diff --git a/HealthMonitoring.Tests/Monitoring/IncidentCalculatorTests.cs b/HealthMonitoring/HealthMonitoring.Tests/Monitoring/IncidentCalculatorTests.cs similarity index 100% rename from HealthMonitoring.Tests/Monitoring/IncidentCalculatorTests.cs rename to HealthMonitoring/HealthMonitoring.Tests/Monitoring/IncidentCalculatorTests.cs diff --git a/HealthMonitoring.Tests/Monitoring/InitializationStateTests.cs b/HealthMonitoring/HealthMonitoring.Tests/Monitoring/InitializationStateTests.cs similarity index 100% rename from HealthMonitoring.Tests/Monitoring/InitializationStateTests.cs rename to HealthMonitoring/HealthMonitoring.Tests/Monitoring/InitializationStateTests.cs diff --git a/HealthMonitoring.Tests/Monitoring/KurrentDbMonitorClientTests.cs b/HealthMonitoring/HealthMonitoring.Tests/Monitoring/KurrentDbMonitorClientTests.cs similarity index 100% rename from HealthMonitoring.Tests/Monitoring/KurrentDbMonitorClientTests.cs rename to HealthMonitoring/HealthMonitoring.Tests/Monitoring/KurrentDbMonitorClientTests.cs diff --git a/HealthMonitoring.Tests/Monitoring/SqlServerMonitorClientTests.cs b/HealthMonitoring/HealthMonitoring.Tests/Monitoring/SqlServerMonitorClientTests.cs similarity index 100% rename from HealthMonitoring.Tests/Monitoring/SqlServerMonitorClientTests.cs rename to HealthMonitoring/HealthMonitoring.Tests/Monitoring/SqlServerMonitorClientTests.cs diff --git a/HealthMonitoring.Tests/Persistence/DependencyMappingTests.cs b/HealthMonitoring/HealthMonitoring.Tests/Persistence/DependencyMappingTests.cs similarity index 100% rename from HealthMonitoring.Tests/Persistence/DependencyMappingTests.cs rename to HealthMonitoring/HealthMonitoring.Tests/Persistence/DependencyMappingTests.cs diff --git a/HealthMonitoring.Tests/Persistence/HealthMonitoringMigrationsTests.cs b/HealthMonitoring/HealthMonitoring.Tests/Persistence/HealthMonitoringMigrationsTests.cs similarity index 100% rename from HealthMonitoring.Tests/Persistence/HealthMonitoringMigrationsTests.cs rename to HealthMonitoring/HealthMonitoring.Tests/Persistence/HealthMonitoringMigrationsTests.cs diff --git a/HealthMonitoring.Tests/Persistence/RepositoryTests.cs b/HealthMonitoring/HealthMonitoring.Tests/Persistence/RepositoryTests.cs similarity index 100% rename from HealthMonitoring.Tests/Persistence/RepositoryTests.cs rename to HealthMonitoring/HealthMonitoring.Tests/Persistence/RepositoryTests.cs diff --git a/HealthMonitoring.Tests/Persistence/TimeSpanMappingTests.cs b/HealthMonitoring/HealthMonitoring.Tests/Persistence/TimeSpanMappingTests.cs similarity index 100% rename from HealthMonitoring.Tests/Persistence/TimeSpanMappingTests.cs rename to HealthMonitoring/HealthMonitoring.Tests/Persistence/TimeSpanMappingTests.cs diff --git a/HealthMonitoring.Tests/Usings.cs b/HealthMonitoring/HealthMonitoring.Tests/Usings.cs similarity index 100% rename from HealthMonitoring.Tests/Usings.cs rename to HealthMonitoring/HealthMonitoring.Tests/Usings.cs diff --git a/HealthMonitoring/Api/DependencyMappingContracts.cs b/HealthMonitoring/HealthMonitoring/Api/DependencyMappingContracts.cs similarity index 100% rename from HealthMonitoring/Api/DependencyMappingContracts.cs rename to HealthMonitoring/HealthMonitoring/Api/DependencyMappingContracts.cs diff --git a/HealthMonitoring/Api/DependencyMappingEndpoints.cs b/HealthMonitoring/HealthMonitoring/Api/DependencyMappingEndpoints.cs similarity index 100% rename from HealthMonitoring/Api/DependencyMappingEndpoints.cs rename to HealthMonitoring/HealthMonitoring/Api/DependencyMappingEndpoints.cs diff --git a/HealthMonitoring/Api/InitializationEndpoints.cs b/HealthMonitoring/HealthMonitoring/Api/InitializationEndpoints.cs similarity index 100% rename from HealthMonitoring/Api/InitializationEndpoints.cs rename to HealthMonitoring/HealthMonitoring/Api/InitializationEndpoints.cs diff --git a/HealthMonitoring/Api/ServiceConfigurationValidator.cs b/HealthMonitoring/HealthMonitoring/Api/ServiceConfigurationValidator.cs similarity index 100% rename from HealthMonitoring/Api/ServiceConfigurationValidator.cs rename to HealthMonitoring/HealthMonitoring/Api/ServiceConfigurationValidator.cs diff --git a/HealthMonitoring/Api/ServiceRegistrationContracts.cs b/HealthMonitoring/HealthMonitoring/Api/ServiceRegistrationContracts.cs similarity index 100% rename from HealthMonitoring/Api/ServiceRegistrationContracts.cs rename to HealthMonitoring/HealthMonitoring/Api/ServiceRegistrationContracts.cs diff --git a/HealthMonitoring/Api/ServiceRegistrationEndpoints.cs b/HealthMonitoring/HealthMonitoring/Api/ServiceRegistrationEndpoints.cs similarity index 100% rename from HealthMonitoring/Api/ServiceRegistrationEndpoints.cs rename to HealthMonitoring/HealthMonitoring/Api/ServiceRegistrationEndpoints.cs diff --git a/HealthMonitoring/Components/App.razor b/HealthMonitoring/HealthMonitoring/Components/App.razor similarity index 100% rename from HealthMonitoring/Components/App.razor rename to HealthMonitoring/HealthMonitoring/Components/App.razor diff --git a/HealthMonitoring/Components/DashboardApiUri.cs b/HealthMonitoring/HealthMonitoring/Components/DashboardApiUri.cs similarity index 100% rename from HealthMonitoring/Components/DashboardApiUri.cs rename to HealthMonitoring/HealthMonitoring/Components/DashboardApiUri.cs diff --git a/HealthMonitoring/Components/InitializationGate.razor b/HealthMonitoring/HealthMonitoring/Components/InitializationGate.razor similarity index 100% rename from HealthMonitoring/Components/InitializationGate.razor rename to HealthMonitoring/HealthMonitoring/Components/InitializationGate.razor diff --git a/HealthMonitoring/Components/Layout/MainLayout.razor b/HealthMonitoring/HealthMonitoring/Components/Layout/MainLayout.razor similarity index 100% rename from HealthMonitoring/Components/Layout/MainLayout.razor rename to HealthMonitoring/HealthMonitoring/Components/Layout/MainLayout.razor diff --git a/HealthMonitoring/Components/Pages/DependencyLinks.razor b/HealthMonitoring/HealthMonitoring/Components/Pages/DependencyLinks.razor similarity index 100% rename from HealthMonitoring/Components/Pages/DependencyLinks.razor rename to HealthMonitoring/HealthMonitoring/Components/Pages/DependencyLinks.razor diff --git a/HealthMonitoring/Components/Pages/InitialisationOverview.razor b/HealthMonitoring/HealthMonitoring/Components/Pages/InitialisationOverview.razor similarity index 100% rename from HealthMonitoring/Components/Pages/InitialisationOverview.razor rename to HealthMonitoring/HealthMonitoring/Components/Pages/InitialisationOverview.razor diff --git a/HealthMonitoring/Components/Pages/Initialise.razor b/HealthMonitoring/HealthMonitoring/Components/Pages/Initialise.razor similarity index 100% rename from HealthMonitoring/Components/Pages/Initialise.razor rename to HealthMonitoring/HealthMonitoring/Components/Pages/Initialise.razor diff --git a/HealthMonitoring/Components/Pages/Overview.razor b/HealthMonitoring/HealthMonitoring/Components/Pages/Overview.razor similarity index 100% rename from HealthMonitoring/Components/Pages/Overview.razor rename to HealthMonitoring/HealthMonitoring/Components/Pages/Overview.razor diff --git a/HealthMonitoring/Components/Pages/ServiceDetail.razor b/HealthMonitoring/HealthMonitoring/Components/Pages/ServiceDetail.razor similarity index 100% rename from HealthMonitoring/Components/Pages/ServiceDetail.razor rename to HealthMonitoring/HealthMonitoring/Components/Pages/ServiceDetail.razor diff --git a/HealthMonitoring/Components/Pages/ServiceRegister.razor b/HealthMonitoring/HealthMonitoring/Components/Pages/ServiceRegister.razor similarity index 100% rename from HealthMonitoring/Components/Pages/ServiceRegister.razor rename to HealthMonitoring/HealthMonitoring/Components/Pages/ServiceRegister.razor diff --git a/HealthMonitoring/Components/Routes.razor b/HealthMonitoring/HealthMonitoring/Components/Routes.razor similarity index 100% rename from HealthMonitoring/Components/Routes.razor rename to HealthMonitoring/HealthMonitoring/Components/Routes.razor diff --git a/HealthMonitoring/Components/Shared/StatCard.razor b/HealthMonitoring/HealthMonitoring/Components/Shared/StatCard.razor similarity index 100% rename from HealthMonitoring/Components/Shared/StatCard.razor rename to HealthMonitoring/HealthMonitoring/Components/Shared/StatCard.razor diff --git a/HealthMonitoring/Components/Shared/StatusBadge.razor b/HealthMonitoring/HealthMonitoring/Components/Shared/StatusBadge.razor similarity index 100% rename from HealthMonitoring/Components/Shared/StatusBadge.razor rename to HealthMonitoring/HealthMonitoring/Components/Shared/StatusBadge.razor diff --git a/HealthMonitoring/Components/_Imports.razor b/HealthMonitoring/HealthMonitoring/Components/_Imports.razor similarity index 100% rename from HealthMonitoring/Components/_Imports.razor rename to HealthMonitoring/HealthMonitoring/Components/_Imports.razor diff --git a/HealthMonitoring/Dockerfile b/HealthMonitoring/HealthMonitoring/Dockerfile similarity index 100% rename from HealthMonitoring/Dockerfile rename to HealthMonitoring/HealthMonitoring/Dockerfile diff --git a/HealthMonitoring/Domain/HealthCheckResult.cs b/HealthMonitoring/HealthMonitoring/Domain/HealthCheckResult.cs similarity index 100% rename from HealthMonitoring/Domain/HealthCheckResult.cs rename to HealthMonitoring/HealthMonitoring/Domain/HealthCheckResult.cs diff --git a/HealthMonitoring/Domain/HealthObservation.cs b/HealthMonitoring/HealthMonitoring/Domain/HealthObservation.cs similarity index 100% rename from HealthMonitoring/Domain/HealthObservation.cs rename to HealthMonitoring/HealthMonitoring/Domain/HealthObservation.cs diff --git a/HealthMonitoring/Domain/HealthResponseModels.cs b/HealthMonitoring/HealthMonitoring/Domain/HealthResponseModels.cs similarity index 100% rename from HealthMonitoring/Domain/HealthResponseModels.cs rename to HealthMonitoring/HealthMonitoring/Domain/HealthResponseModels.cs diff --git a/HealthMonitoring/Domain/HealthStatus.cs b/HealthMonitoring/HealthMonitoring/Domain/HealthStatus.cs similarity index 100% rename from HealthMonitoring/Domain/HealthStatus.cs rename to HealthMonitoring/HealthMonitoring/Domain/HealthStatus.cs diff --git a/HealthMonitoring/Domain/HealthStatusNormalizer.cs b/HealthMonitoring/HealthMonitoring/Domain/HealthStatusNormalizer.cs similarity index 100% rename from HealthMonitoring/Domain/HealthStatusNormalizer.cs rename to HealthMonitoring/HealthMonitoring/Domain/HealthStatusNormalizer.cs diff --git a/HealthMonitoring/Domain/IHealthStatusNormalizer.cs b/HealthMonitoring/HealthMonitoring/Domain/IHealthStatusNormalizer.cs similarity index 100% rename from HealthMonitoring/Domain/IHealthStatusNormalizer.cs rename to HealthMonitoring/HealthMonitoring/Domain/IHealthStatusNormalizer.cs diff --git a/HealthMonitoring/Domain/MonitorType.cs b/HealthMonitoring/HealthMonitoring/Domain/MonitorType.cs similarity index 100% rename from HealthMonitoring/Domain/MonitorType.cs rename to HealthMonitoring/HealthMonitoring/Domain/MonitorType.cs diff --git a/HealthMonitoring/Domain/MonitoredService.cs b/HealthMonitoring/HealthMonitoring/Domain/MonitoredService.cs similarity index 100% rename from HealthMonitoring/Domain/MonitoredService.cs rename to HealthMonitoring/HealthMonitoring/Domain/MonitoredService.cs diff --git a/HealthMonitoring/Domain/ServiceDependencyLink.cs b/HealthMonitoring/HealthMonitoring/Domain/ServiceDependencyLink.cs similarity index 100% rename from HealthMonitoring/Domain/ServiceDependencyLink.cs rename to HealthMonitoring/HealthMonitoring/Domain/ServiceDependencyLink.cs diff --git a/HealthMonitoring/Domain/ServiceIncident.cs b/HealthMonitoring/HealthMonitoring/Domain/ServiceIncident.cs similarity index 100% rename from HealthMonitoring/Domain/ServiceIncident.cs rename to HealthMonitoring/HealthMonitoring/Domain/ServiceIncident.cs diff --git a/HealthMonitoring/Domain/ServiceStatusSnapshot.cs b/HealthMonitoring/HealthMonitoring/Domain/ServiceStatusSnapshot.cs similarity index 100% rename from HealthMonitoring/Domain/ServiceStatusSnapshot.cs rename to HealthMonitoring/HealthMonitoring/Domain/ServiceStatusSnapshot.cs diff --git a/HealthMonitoring/Domain/StatusPolicy.cs b/HealthMonitoring/HealthMonitoring/Domain/StatusPolicy.cs similarity index 100% rename from HealthMonitoring/Domain/StatusPolicy.cs rename to HealthMonitoring/HealthMonitoring/Domain/StatusPolicy.cs diff --git a/HealthMonitoring/Health/MonitoringHealthChecks.cs b/HealthMonitoring/HealthMonitoring/Health/MonitoringHealthChecks.cs similarity index 100% rename from HealthMonitoring/Health/MonitoringHealthChecks.cs rename to HealthMonitoring/HealthMonitoring/Health/MonitoringHealthChecks.cs diff --git a/HealthMonitoring/HealthMonitoring.csproj b/HealthMonitoring/HealthMonitoring/HealthMonitoring.csproj similarity index 100% rename from HealthMonitoring/HealthMonitoring.csproj rename to HealthMonitoring/HealthMonitoring/HealthMonitoring.csproj diff --git a/HealthMonitoring/HealthMonitoring.sln b/HealthMonitoring/HealthMonitoring/HealthMonitoring.sln similarity index 100% rename from HealthMonitoring/HealthMonitoring.sln rename to HealthMonitoring/HealthMonitoring/HealthMonitoring.sln diff --git a/HealthMonitoring/Migrations/20260919092909_InitialCreate.Designer.cs b/HealthMonitoring/HealthMonitoring/Migrations/20260919092909_InitialCreate.Designer.cs similarity index 100% rename from HealthMonitoring/Migrations/20260919092909_InitialCreate.Designer.cs rename to HealthMonitoring/HealthMonitoring/Migrations/20260919092909_InitialCreate.Designer.cs diff --git a/HealthMonitoring/Migrations/20260919092909_InitialCreate.cs b/HealthMonitoring/HealthMonitoring/Migrations/20260919092909_InitialCreate.cs similarity index 100% rename from HealthMonitoring/Migrations/20260919092909_InitialCreate.cs rename to HealthMonitoring/HealthMonitoring/Migrations/20260919092909_InitialCreate.cs diff --git a/HealthMonitoring/Migrations/HealthMonitoringDbContextModelSnapshot.cs b/HealthMonitoring/HealthMonitoring/Migrations/HealthMonitoringDbContextModelSnapshot.cs similarity index 100% rename from HealthMonitoring/Migrations/HealthMonitoringDbContextModelSnapshot.cs rename to HealthMonitoring/HealthMonitoring/Migrations/HealthMonitoringDbContextModelSnapshot.cs diff --git a/HealthMonitoring/Monitoring/HealthEndpointClient.cs b/HealthMonitoring/HealthMonitoring/Monitoring/HealthEndpointClient.cs similarity index 100% rename from HealthMonitoring/Monitoring/HealthEndpointClient.cs rename to HealthMonitoring/HealthMonitoring/Monitoring/HealthEndpointClient.cs diff --git a/HealthMonitoring/Monitoring/HealthMonitoringServiceCollectionExtensions.cs b/HealthMonitoring/HealthMonitoring/Monitoring/HealthMonitoringServiceCollectionExtensions.cs similarity index 100% rename from HealthMonitoring/Monitoring/HealthMonitoringServiceCollectionExtensions.cs rename to HealthMonitoring/HealthMonitoring/Monitoring/HealthMonitoringServiceCollectionExtensions.cs diff --git a/HealthMonitoring/Monitoring/HealthPollingWorker.cs b/HealthMonitoring/HealthMonitoring/Monitoring/HealthPollingWorker.cs similarity index 100% rename from HealthMonitoring/Monitoring/HealthPollingWorker.cs rename to HealthMonitoring/HealthMonitoring/Monitoring/HealthPollingWorker.cs diff --git a/HealthMonitoring/Monitoring/IncidentCalculator.cs b/HealthMonitoring/HealthMonitoring/Monitoring/IncidentCalculator.cs similarity index 100% rename from HealthMonitoring/Monitoring/IncidentCalculator.cs rename to HealthMonitoring/HealthMonitoring/Monitoring/IncidentCalculator.cs diff --git a/HealthMonitoring/Monitoring/InitializationService.cs b/HealthMonitoring/HealthMonitoring/Monitoring/InitializationService.cs similarity index 100% rename from HealthMonitoring/Monitoring/InitializationService.cs rename to HealthMonitoring/HealthMonitoring/Monitoring/InitializationService.cs diff --git a/HealthMonitoring/Monitoring/KurrentDbMonitorClient.cs b/HealthMonitoring/HealthMonitoring/Monitoring/KurrentDbMonitorClient.cs similarity index 100% rename from HealthMonitoring/Monitoring/KurrentDbMonitorClient.cs rename to HealthMonitoring/HealthMonitoring/Monitoring/KurrentDbMonitorClient.cs diff --git a/HealthMonitoring/Monitoring/RetentionCleanupWorker.cs b/HealthMonitoring/HealthMonitoring/Monitoring/RetentionCleanupWorker.cs similarity index 100% rename from HealthMonitoring/Monitoring/RetentionCleanupWorker.cs rename to HealthMonitoring/HealthMonitoring/Monitoring/RetentionCleanupWorker.cs diff --git a/HealthMonitoring/Monitoring/SqlServerMonitorClient.cs b/HealthMonitoring/HealthMonitoring/Monitoring/SqlServerMonitorClient.cs similarity index 100% rename from HealthMonitoring/Monitoring/SqlServerMonitorClient.cs rename to HealthMonitoring/HealthMonitoring/Monitoring/SqlServerMonitorClient.cs diff --git a/HealthMonitoring/Persistence/HealthMonitoringDbContext.cs b/HealthMonitoring/HealthMonitoring/Persistence/HealthMonitoringDbContext.cs similarity index 100% rename from HealthMonitoring/Persistence/HealthMonitoringDbContext.cs rename to HealthMonitoring/HealthMonitoring/Persistence/HealthMonitoringDbContext.cs diff --git a/HealthMonitoring/Persistence/HealthMonitoringRepository.cs b/HealthMonitoring/HealthMonitoring/Persistence/HealthMonitoringRepository.cs similarity index 100% rename from HealthMonitoring/Persistence/HealthMonitoringRepository.cs rename to HealthMonitoring/HealthMonitoring/Persistence/HealthMonitoringRepository.cs diff --git a/HealthMonitoring/Persistence/IHealthMonitoringRepository.cs b/HealthMonitoring/HealthMonitoring/Persistence/IHealthMonitoringRepository.cs similarity index 100% rename from HealthMonitoring/Persistence/IHealthMonitoringRepository.cs rename to HealthMonitoring/HealthMonitoring/Persistence/IHealthMonitoringRepository.cs diff --git a/HealthMonitoring/Program.cs b/HealthMonitoring/HealthMonitoring/Program.cs similarity index 100% rename from HealthMonitoring/Program.cs rename to HealthMonitoring/HealthMonitoring/Program.cs diff --git a/HealthMonitoring/Properties/launchSettings.json b/HealthMonitoring/HealthMonitoring/Properties/launchSettings.json similarity index 100% rename from HealthMonitoring/Properties/launchSettings.json rename to HealthMonitoring/HealthMonitoring/Properties/launchSettings.json diff --git a/HealthMonitoring/Reporting/DashboardModels.cs b/HealthMonitoring/HealthMonitoring/Reporting/DashboardModels.cs similarity index 100% rename from HealthMonitoring/Reporting/DashboardModels.cs rename to HealthMonitoring/HealthMonitoring/Reporting/DashboardModels.cs diff --git a/HealthMonitoring/Reporting/DashboardQueryService.cs b/HealthMonitoring/HealthMonitoring/Reporting/DashboardQueryService.cs similarity index 100% rename from HealthMonitoring/Reporting/DashboardQueryService.cs rename to HealthMonitoring/HealthMonitoring/Reporting/DashboardQueryService.cs diff --git a/HealthMonitoring/appsettings.json b/HealthMonitoring/HealthMonitoring/appsettings.json similarity index 100% rename from HealthMonitoring/appsettings.json rename to HealthMonitoring/HealthMonitoring/appsettings.json diff --git a/HealthMonitoring/docker-compose.sqlserver.yml b/HealthMonitoring/HealthMonitoring/docker-compose.sqlserver.yml similarity index 100% rename from HealthMonitoring/docker-compose.sqlserver.yml rename to HealthMonitoring/HealthMonitoring/docker-compose.sqlserver.yml diff --git a/HealthMonitoring/hosting.json b/HealthMonitoring/HealthMonitoring/hosting.json similarity index 100% rename from HealthMonitoring/hosting.json rename to HealthMonitoring/HealthMonitoring/hosting.json diff --git a/HealthMonitoring/wwwroot/app.css b/HealthMonitoring/HealthMonitoring/wwwroot/app.css similarity index 100% rename from HealthMonitoring/wwwroot/app.css rename to HealthMonitoring/HealthMonitoring/wwwroot/app.css diff --git a/HealthMonitoring/appsettings.Development.json b/HealthMonitoring/appsettings.Development.json deleted file mode 100644 index b543ffa..0000000 --- a/HealthMonitoring/appsettings.Development.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "ConnectionStrings": { - "HealthMonitoring": "Server=localhost;Database=HealthMonitoring;User Id=sa;Password=sp1ttal;TrustServerCertificate=True;Encrypt=False;" - }, - "Monitoring": { - "SqlServer": { - "AllowedDataSources": ["localhost", ".", "(local)", "sqlserver"] - } - } -} From 5e4b372578ebcad157b7d46a0a0512f94ff16fc4 Mon Sep 17 00:00:00 2001 From: StuartFerguson Date: Mon, 21 Sep 2026 10:09:10 +0100 Subject: [PATCH 3/4] :| --- .github/workflows/pullrequest.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pullrequest.yml b/.github/workflows/pullrequest.yml index 5baf467..970b746 100644 --- a/.github/workflows/pullrequest.yml +++ b/.github/workflows/pullrequest.yml @@ -72,7 +72,7 @@ jobs: dotnet-version: '10.0.x' - name: Restore Health Monitoring solution - run: dotnet restore HealthMonitoring/HealthMonitoring.sln + run: dotnet restore HealthMonitoring/HealthMonitoring/HealthMonitoring.sln - name: Run Health Monitoring unit tests - run: dotnet test HealthMonitoring.Tests/HealthMonitoring.Tests.csproj --configuration Release --no-restore --filter "FullyQualifiedName!~ConfigurationTests" + run: dotnet test HealthMonitoring/HealthMonitoring.Tests/HealthMonitoring.Tests.csproj --configuration Release --no-restore --filter "FullyQualifiedName!~ConfigurationTests" From fba6eb14026dab8ad4de0402eac336eaf09902e9 Mon Sep 17 00:00:00 2001 From: StuartFerguson Date: Mon, 21 Sep 2026 10:38:05 +0100 Subject: [PATCH 4/4] Fix Health Monitoring deployment workflows --- .github/workflows/createrelease.yml | 16 ++++++++-------- .github/workflows/pushtomain.yml | 14 +++++++------- .../HealthMonitoring/HealthMonitoring.csproj | 1 + HealthMonitoring/HealthMonitoring/Program.cs | 5 +++++ 4 files changed, 21 insertions(+), 15 deletions(-) diff --git a/.github/workflows/createrelease.yml b/.github/workflows/createrelease.yml index 82a9ddb..df510c9 100644 --- a/.github/workflows/createrelease.yml +++ b/.github/workflows/createrelease.yml @@ -28,19 +28,19 @@ jobs: run: | dotnet restore TransactionProcessing.MerchantPos/TransactionProcessing.MerchantPos.sln --source ${{ secrets.PUBLICFEEDURL }} --source ${{ secrets.PRIVATEFEED_URL }} dotnet restore TransactionProcessing.MerchantFileProcessor/TransactionProcessing.MerchantFileProcessor.sln --source ${{ secrets.PUBLICFEEDURL }} --source ${{ secrets.PRIVATEFEED_URL }} - dotnet restore HealthMonitoring/HealthMonitoring.sln --source ${{ secrets.PUBLICFEEDURL }} --source ${{ secrets.PRIVATEFEED_URL }} + dotnet restore HealthMonitoring/HealthMonitoring/HealthMonitoring.sln --source ${{ secrets.PUBLICFEEDURL }} --source ${{ secrets.PRIVATEFEED_URL }} - name: Build Code run: | dotnet build TransactionProcessing.MerchantPos/TransactionProcessing.MerchantPos.sln --configuration Release dotnet build TransactionProcessing.MerchantFileProcessor/TransactionProcessing.MerchantFileProcessor.sln --configuration Release - dotnet build HealthMonitoring/HealthMonitoring.sln --configuration Release + dotnet build HealthMonitoring/HealthMonitoring/HealthMonitoring.sln --configuration Release - name: Publish API run: | dotnet publish "TransactionProcessing.MerchantPos/TransactionProcessing.MerchantPos.csproj" --configuration Release --output TransactionProcessing.MerchantPos/publishOutput -r win-x64 --self-contained dotnet publish "TransactionProcessing.MerchantFileProcessor/TransactionProcessing.MerchantFileProcessor.csproj" --configuration Release --output TransactionProcessing.MerchantFileProcessor/publishOutput -r win-x64 --self-contained - dotnet publish "HealthMonitoring/HealthMonitoring.csproj" --configuration Release --output HealthMonitoring/publishOutput -r win-x64 --self-contained + dotnet publish "HealthMonitoring/HealthMonitoring/HealthMonitoring.csproj" --configuration Release --output HealthMonitoring/publishOutput -r win-x64 --self-contained - name: Build Release Package (Merchant Pos) run: | @@ -74,7 +74,7 @@ jobs: - name: Build Release Package (Health Monitoring) run: | - cd /home/runner/work/SupportTools/SupportTools/TransactionProcessing.HealthMonitoring/publishOutput + cd /home/runner/work/SupportTools/SupportTools/HealthMonitoring/publishOutput zip -r ../healthmonitoring.zip ./* echo "Zip file created at: $(realpath ../healthmonitoring.zip)" @@ -82,12 +82,12 @@ jobs: uses: actions/upload-artifact@v4.4.0 with: name: healthmonitoring - path: /home/runner/work/SupportTools/SupportTools/TransactionProcessing.HealthMonitoring/healthmonitoring.zip + path: /home/runner/work/SupportTools/SupportTools/HealthMonitoring/healthmonitoring.zip - name: Build and Publish Nuget Packages if: ${{ github.event.release.prerelease == false }} run: | - dotnet pack "HealthMonitoring.Client\HealthMonitoring.Client.csproj" /p:PackageVersion=${{ steps.get_version.outputs.VERSION }} --output Nugets + dotnet pack "HealthMonitoring\HealthMonitoring.Client\HealthMonitoring.Client.csproj" /p:PackageVersion=${{ steps.get_version.outputs.VERSION }} --output Nugets dotnet nuget push Nugets/HealthMonitoring.Client.${{ steps.get_version.outputs.VERSION }}.nupkg --api-key ${{ secrets.PRIVATEFEED_APIKEY }} --source ${{ secrets.PRIVATEFEED_URL }} --skip-duplicate buildsqlagentjobdeploymenttool: @@ -320,7 +320,7 @@ jobs: - name: Install as a Windows service (Health Monitoring) run: | $serviceName = "Transaction Processing - Health Monitoring" - $servicePath = "C:\txnproc\transactionprocessing\healthmonitoring\TransactionProcessing.HealthMonitoring.exe" + $servicePath = "C:\txnproc\transactionprocessing\healthmonitoring\HealthMonitoring.exe" New-Service -Name $serviceName -BinaryPathName $servicePath -Description $serviceName -DisplayName $serviceName -StartupType Automatic Start-Service -Name $serviceName @@ -515,7 +515,7 @@ jobs: - name: Install as a Windows service (Health Monitoring) run: | $serviceName = "Transaction Processing - Health Monitoring" - $servicePath = "C:\txnproc\transactionprocessing\healthmonitoring\TransactionProcessing.HealthMonitoring.exe" + $servicePath = "C:\txnproc\transactionprocessing\healthmonitoring\HealthMonitoring.exe" New-Service -Name $serviceName -BinaryPathName $servicePath -Description $serviceName -DisplayName $serviceName -StartupType Automatic Start-Service -Name $serviceName diff --git a/.github/workflows/pushtomain.yml b/.github/workflows/pushtomain.yml index 94224f9..b1faf4c 100644 --- a/.github/workflows/pushtomain.yml +++ b/.github/workflows/pushtomain.yml @@ -43,19 +43,19 @@ jobs: run: | dotnet restore TransactionProcessing.MerchantPos/TransactionProcessing.MerchantPos.sln --source ${{ secrets.PUBLICFEEDURL }} --source ${{ secrets.PRIVATEFEED_URL }} dotnet restore TransactionProcessing.MerchantFileProcessor/TransactionProcessing.MerchantFileProcessor.sln --source ${{ secrets.PUBLICFEEDURL }} --source ${{ secrets.PRIVATEFEED_URL }} - dotnet restore HealthMonitoring/HealthMonitoring.sln --source ${{ secrets.PUBLICFEEDURL }} --source ${{ secrets.PRIVATEFEED_URL }} + dotnet restore HealthMonitoring/HealthMonitoring/HealthMonitoring.sln --source ${{ secrets.PUBLICFEEDURL }} --source ${{ secrets.PRIVATEFEED_URL }} - name: Build Code run: | dotnet build TransactionProcessing.MerchantPos/TransactionProcessing.MerchantPos.sln --configuration Release dotnet build TransactionProcessing.MerchantFileProcessor/TransactionProcessing.MerchantFileProcessor.sln --configuration Release - dotnet build HealthMonitoring/HealthMonitoring.sln --configuration Release + dotnet build HealthMonitoring/HealthMonitoring/HealthMonitoring.sln --configuration Release - name: Publish API run: | dotnet publish "TransactionProcessing.MerchantPos/TransactionProcessing.MerchantPos.csproj" --configuration Release --output TransactionProcessing.MerchantPos/publishOutput -r win-x64 --self-contained dotnet publish "TransactionProcessing.MerchantFileProcessor/TransactionProcessing.MerchantFileProcessor.csproj" --configuration Release --output TransactionProcessing.MerchantFileProcessor/publishOutput -r win-x64 --self-contained - dotnet publish "HealthMonitoring/HealthMonitoring.csproj" --configuration Release --output HealthMonitoring/publishOutput -r win-x64 --self-contained + dotnet publish "HealthMonitoring/HealthMonitoring/HealthMonitoring.csproj" --configuration Release --output HealthMonitoring/publishOutput -r win-x64 --self-contained - name: Build Release Package (Merchant Pos) run: | @@ -89,7 +89,7 @@ jobs: - name: Build Release Package (Health Monitoring) run: | - cd /home/runner/work/SupportTools/SupportTools/TransactionProcessing.HealthMonitoring/publishOutput + cd /home/runner/work/SupportTools/SupportTools/HealthMonitoring/publishOutput zip -r ../healthmonitoring.zip ./* echo "Zip file created at: $(realpath ../healthmonitoring.zip)" @@ -97,11 +97,11 @@ jobs: uses: actions/upload-artifact@v4.4.0 with: name: healthmonitoring - path: /home/runner/work/SupportTools/SupportTools/TransactionProcessing.HealthMonitoring/healthmonitoring.zip + path: /home/runner/work/SupportTools/SupportTools/HealthMonitoring/healthmonitoring.zip - name: Build and Publish Nuget Packages run: | - dotnet pack "HealthMonitoring.Client\HealthMonitoring.Client.csproj" /p:PackageVersion=${{ steps.next_version.outputs.VERSION }} --output Nugets + dotnet pack "HealthMonitoring\HealthMonitoring.Client\HealthMonitoring.Client.csproj" /p:PackageVersion=${{ steps.next_version.outputs.VERSION }} --output Nugets dotnet nuget push Nugets/HealthMonitoring.Client.${{ steps.next_version.outputs.VERSION }}.nupkg --api-key ${{ secrets.PRIVATEFEED_APIKEY }} --source ${{ secrets.PRIVATEFEED_URL }} buildsqlagentjobdeploymenttool: @@ -334,7 +334,7 @@ jobs: - name: Install as a Windows service (Health Monitoring) run: | $serviceName = "Transaction Processing - Health Monitoring" - $servicePath = "C:\txnproc\transactionprocessing\healthmonitoring\TransactionProcessing.HealthMonitoring.exe" + $servicePath = "C:\txnproc\transactionprocessing\healthmonitoring\HealthMonitoring.exe" New-Service -Name $serviceName -BinaryPathName $servicePath -Description $serviceName -DisplayName $serviceName -StartupType Automatic Start-Service -Name $serviceName diff --git a/HealthMonitoring/HealthMonitoring/HealthMonitoring.csproj b/HealthMonitoring/HealthMonitoring/HealthMonitoring.csproj index 1989f69..7f342d7 100644 --- a/HealthMonitoring/HealthMonitoring/HealthMonitoring.csproj +++ b/HealthMonitoring/HealthMonitoring/HealthMonitoring.csproj @@ -19,5 +19,6 @@ + diff --git a/HealthMonitoring/HealthMonitoring/Program.cs b/HealthMonitoring/HealthMonitoring/Program.cs index 30983b3..2282532 100644 --- a/HealthMonitoring/HealthMonitoring/Program.cs +++ b/HealthMonitoring/HealthMonitoring/Program.cs @@ -10,6 +10,11 @@ var builder = WebApplication.CreateBuilder(args); +builder.Services.AddWindowsService(options => +{ + options.ServiceName = "Transaction Processing - Health Monitoring"; +}); + builder.Configuration.AddJsonFile("hosting.json", optional: true, reloadOnChange: true); builder.Services.AddSingleton(new InitializationOptions {