Skip to content

Commit 7831b7f

Browse files
authored
Add HeatlthCheck (#26)
* Add HeatlthCheck
1 parent 5c57b7b commit 7831b7f

File tree

20 files changed

+159
-48
lines changed

20 files changed

+159
-48
lines changed

.github/workflows/backend-build.yml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,17 @@ jobs:
3535
run: dotnet restore "${{ inputs.projectDirectory }}"
3636

3737
- name: Build
38-
run: dotnet build "${{ inputs.projectDirectory }}" --configuration "${{ env.CONFIGURATION }}" --no-restore
38+
run: dotnet build "${{ inputs.projectDirectory }}" --configuration "${{ env.CONFIGURATION }}" --no-restore -r linux-x64
3939

4040
- name: All backend tests
4141
run: dotnet test "${{ env.BACKEND_BASE_DIRECTORY }}"
4242

4343
- name: Publish
44-
run: dotnet publish "${{ inputs.projectDirectory }}" --configuration "${{ env.CONFIGURATION }}" --no-build --output "${{ inputs.artifactsDirectory }}"
44+
run: dotnet publish "${{ inputs.projectDirectory }}" --configuration "${{ env.CONFIGURATION }}" --no-build --output "${{ inputs.artifactsDirectory }}" -r linux-x64
4545

4646
- name: Upload Artifacts
4747
uses: actions/upload-artifact@v4
4848
with:
49+
include-hidden-files: true #TODO: Remove this line when the bug is fixed https://github.com/actions/upload-artifact/issues/602
4950
name: ${{ inputs.artifactsName }}
5051
path: ${{ inputs.artifactsDirectory }}

src/backend/Database/Ts.TelemetryDatabase.Sql/Ts.TelemetryDatabase.Sql.sqlproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
<TargetDatabaseSet>True</TargetDatabaseSet>
99
<ProjectVersion>4.1</ProjectVersion>
1010
<LangVersion>latest</LangVersion>
11+
<TargetFramework>net472</TargetFramework>
1112
<ProjectGuid>{d6b56a08-b5c2-4c8b-9e49-51994f67ff4b}</ProjectGuid>
1213
<RunSqlCodeAnalysis>True</RunSqlCodeAnalysis>
1314
</PropertyGroup>

src/backend/Directory.Packages.props

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
44
</PropertyGroup>
55
<ItemGroup>
6+
<PackageVersion Include="AspNetCore.HealthChecks.Azure.IoTHub" Version="8.0.1" />
7+
<PackageVersion Include="AspNetCore.HealthChecks.SqlServer" Version="8.0.2" />
68
<PackageVersion Include="Azure.Extensions.AspNetCore.Configuration.Secrets" Version="1.3.2" />
79
<PackageVersion Include="Azure.Identity" Version="1.12.0" />
810
<PackageVersion Include="Azure.Security.KeyVault.Secrets" Version="4.6.0" />
@@ -11,6 +13,7 @@
1113
<PackageVersion Include="Dapper.Contrib" Version="2.0.78" />
1214
<PackageVersion Include="Microsoft.Azure.Functions.Worker" Version="1.23.0" />
1315
<PackageVersion Include="Microsoft.Azure.Functions.Worker.Extensions.EventGrid" Version="3.4.2" />
16+
<PackageVersion Include="Microsoft.Azure.Functions.Worker.Extensions.Http" Version="3.2.0" />
1417
<PackageVersion Include="Microsoft.Azure.Functions.Worker.Extensions.Timer" Version="4.3.1" />
1518
<PackageVersion Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.17.4" />
1619
<PackageVersion Include="Microsoft.ApplicationInsights.WorkerService" Version="2.22.0" />
@@ -24,6 +27,7 @@
2427
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="9.0.0-preview.6.24327.7" />
2528
<PackageVersion Include="Microsoft.Extensions.Configuration.UserSecrets" Version="9.0.0-preview.6.24327.7" />
2629
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.0-preview.6.24327.7" />
30+
<PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks" Version="8.0.8" />
2731
<PackageVersion Include="Microsoft.Extensions.Http" Version="9.0.0-preview.6.24327.7" />
2832
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.11.0" />
2933
<PackageVersion Include="Microsoft.SqlServer.DacFx" Version="162.3.566" />
@@ -35,4 +39,4 @@
3539
<PackageVersion Include="xunit" Version="2.9.0" />
3640
<PackageVersion Include="xunit.runner.visualstudio" Version="2.8.2" />
3741
</ItemGroup>
38-
</Project>
42+
</Project>

src/backend/Functions/Ts.Functions/Extensions/AppSettings.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,16 @@ public static IConfigurationBuilder AddAppSettings(this IConfigurationBuilder bu
1212

1313
return builder;
1414
}
15+
16+
public static string GetRequiredConnectionString(this IConfiguration configuration, string name)
17+
{
18+
return configuration.GetConnectionString(name) ?? throw new ConfigurationErrorException($"Missing required connection string '{name}'");
19+
}
20+
21+
public static string GetRequiredSetting(this IConfiguration configuration, string name)
22+
{
23+
return configuration[name] ?? throw new ConfigurationErrorException($"Missing required configuration '{name}'");
24+
}
1525
}
26+
27+
public class ConfigurationErrorException(string message) : Exception(message) { }
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using Azure.Identity;
2+
using Microsoft.Azure.Devices;
3+
using Microsoft.Extensions.Configuration;
4+
using Microsoft.Extensions.Diagnostics.HealthChecks;
5+
using TelemetryStash.Functions.Extensions;
6+
7+
namespace TelemetryStash.Functions.Health.HealtChecks;
8+
public class IotHubHealthCheck(IConfiguration configuration) : IHealthCheck
9+
{
10+
public async Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = new CancellationToken())
11+
{
12+
var ioTHubHostName = configuration.GetRequiredSetting("IoTHubHostName");
13+
14+
var manager = RegistryManager.Create(ioTHubHostName, new DefaultAzureCredential());
15+
var query = manager.CreateQuery("SELECT COUNT()");
16+
17+
var response = await query.GetNextAsJsonAsync();
18+
if (!response.Any())
19+
{
20+
return HealthCheckResult.Unhealthy();
21+
}
22+
23+
return HealthCheckResult.Healthy();
24+
}
25+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using Microsoft.Azure.Functions.Worker;
2+
using Microsoft.Azure.Functions.Worker.Http;
3+
using Microsoft.Extensions.Diagnostics.HealthChecks;
4+
using System.Net;
5+
6+
namespace TelemetryStash.Functions.Health;
7+
8+
public class HealthCheck(HealthCheckService healthCheckService)
9+
{
10+
[Function("HealthCheck")]
11+
public async Task<HttpResponseData> RunAsync([HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequestData req, FunctionContext executionContext)
12+
{
13+
var status = await healthCheckService.CheckHealthAsync();
14+
15+
var response = req.CreateResponse();
16+
response.StatusCode = status.Status == HealthStatus.Healthy ? HttpStatusCode.OK : HttpStatusCode.FailedDependency;
17+
await response.WriteAsJsonAsync(new Response(Enum.GetName(status.Status), status.TotalDuration.TotalMilliseconds));
18+
return response;
19+
}
20+
21+
private record Response(string? Status, double Duration);
22+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using Microsoft.Extensions.Configuration;
2+
using Microsoft.Extensions.DependencyInjection;
3+
using TelemetryStash.Functions.Extensions;
4+
using TelemetryStash.Functions.Health.HealtChecks;
5+
6+
namespace TelemetryStash.Functions.Health;
7+
internal static class StartupExtensions
8+
{
9+
public static void AddHealthCheck(this IServiceCollection services, IConfiguration configuration)
10+
{
11+
services.AddHealthChecks()
12+
.AddSqlServer(configuration.GetRequiredConnectionString("TelemetryStashDatabase"), name: "SqlServerHealthCheck")
13+
.AddCheck<IotHubHealthCheck>("IoTHubHealthCheck");
14+
}
15+
}

src/backend/Functions/Ts.Functions/Program.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using Microsoft.Extensions.Hosting;
33
using TelemetryStash.Database;
44
using TelemetryStash.Functions.Extensions;
5+
using TelemetryStash.Functions.Health;
56

67
var host = new HostBuilder()
78
.ConfigureFunctionsWorkerDefaults()
@@ -18,6 +19,7 @@
1819

1920
services.AddFunctionServices();
2021
services.AddTelemetryDatabase(context.Configuration);
22+
services.AddHealthCheck(context.Configuration);
2123
})
2224
.Build();
2325

src/backend/Functions/Ts.Functions/TelemetryHistoryManager/TelemetryHistoryManager.cs

Lines changed: 0 additions & 18 deletions
This file was deleted.

src/backend/Functions/Ts.Functions/Ts.Functions.csproj

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,28 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
33
<TargetFramework>net8.0</TargetFramework>
4+
<RuntimeIdentifiers>linux-x64</RuntimeIdentifiers>
45
<AzureFunctionsVersion>v4</AzureFunctionsVersion>
56
<OutputType>Exe</OutputType>
67
<ImplicitUsings>enable</ImplicitUsings>
78
<Nullable>enable</Nullable>
89
<RootNamespace>TelemetryStash.Functions</RootNamespace>
910
</PropertyGroup>
1011
<ItemGroup>
12+
<PackageReference Include="AspNetCore.HealthChecks.Azure.IoTHub" />
13+
<PackageReference Include="AspNetCore.HealthChecks.SqlServer" />
1114
<PackageReference Include="Azure.Extensions.AspNetCore.Configuration.Secrets" />
1215
<PackageReference Include="Azure.Identity" />
1316
<PackageReference Include="Microsoft.Azure.Functions.Worker" />
1417
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.EventGrid" />
18+
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http" />
1519
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Timer" />
1620
<PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" />
1721
<PackageReference Include="Microsoft.ApplicationInsights.WorkerService" />
1822
<PackageReference Include="Microsoft.Azure.Functions.Worker.ApplicationInsights" />
1923
<PackageReference Include="Microsoft.Extensions.Caching.Hybrid" />
2024
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" />
25+
<PackageReference Include="Microsoft.Extensions.Diagnostics.HealthChecks" />
2126
<PackageReference Include="Microsoft.Extensions.Http" />
2227
</ItemGroup>
2328
<ItemGroup>
@@ -44,4 +49,7 @@
4449
<ItemGroup>
4550
<Using Include="System.Threading.ExecutionContext" Alias="ExecutionContext" />
4651
</ItemGroup>
52+
<ItemGroup>
53+
<Folder Include="Properties\" />
54+
</ItemGroup>
4755
</Project>

0 commit comments

Comments
 (0)