Skip to content

Commit df1540e

Browse files
committed
Add HeatlthCheck
1 parent 5c57b7b commit df1540e

File tree

16 files changed

+146
-41
lines changed

16 files changed

+146
-41
lines changed

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: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,14 @@ 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 Exception($"Missing required connection string '{name}'");
19+
}
20+
21+
public static string GetRequiredSetting(this IConfiguration configuration, string name)
22+
{
23+
return configuration[name] ?? throw new Exception($"Missing required configuration '{name}'");
24+
}
1525
}
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")] HttpRequestData req)
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: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,20 @@
88
<RootNamespace>TelemetryStash.Functions</RootNamespace>
99
</PropertyGroup>
1010
<ItemGroup>
11+
<PackageReference Include="AspNetCore.HealthChecks.Azure.IoTHub" />
12+
<PackageReference Include="AspNetCore.HealthChecks.SqlServer" />
1113
<PackageReference Include="Azure.Extensions.AspNetCore.Configuration.Secrets" />
1214
<PackageReference Include="Azure.Identity" />
1315
<PackageReference Include="Microsoft.Azure.Functions.Worker" />
1416
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.EventGrid" />
17+
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http" />
1518
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Timer" />
1619
<PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" />
1720
<PackageReference Include="Microsoft.ApplicationInsights.WorkerService" />
1821
<PackageReference Include="Microsoft.Azure.Functions.Worker.ApplicationInsights" />
1922
<PackageReference Include="Microsoft.Extensions.Caching.Hybrid" />
2023
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" />
24+
<PackageReference Include="Microsoft.Extensions.Diagnostics.HealthChecks" />
2125
<PackageReference Include="Microsoft.Extensions.Http" />
2226
</ItemGroup>
2327
<ItemGroup>
Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,7 @@
11
{
2-
"Logging": {
3-
"LogLevel": {
4-
"Microsoft.EntityFrameworkCore.Database.Command": "Warning"
5-
}
6-
},
72
"ConnectionStrings": {
83
"TelemetryStashDatabase": "Server=tcp:sql-ts-develop.database.windows.net,1433;Initial Catalog=sqldb-ts-develop;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;Authentication=Active Directory Default;"
94
},
10-
"KeyVault": "https://kv1-telemetrystash-dev.vault.azure.net",
11-
"TelemetryHistoryManager": {
12-
"RunSchedule": "0 0 3 * * *"
13-
}
5+
"KeyVault": "https://kv-ts-develop.vault.azure.net/",
6+
"IoTHubHostName": "iot-ts-develop.azure-devices.net"
147
}
Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,7 @@
11
{
2-
"Logging": {
3-
"LogLevel": {
4-
"Microsoft.EntityFrameworkCore.Database.Command": "Warning"
5-
}
6-
},
72
"ConnectionStrings": {
83
"TelemetryStashDatabase": "Server=tcp:sql-ts-prod.database.windows.net,1433;Initial Catalog=sqldb-ts-prod;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;Authentication=Active Directory Default;"
94
},
10-
"KeyVault": "https://kv-telemetrystash-prod.vault.azure.net",
11-
"TelemetryHistoryManager": {
12-
"RunSchedule": "0 0 3 * * *"
13-
}
5+
"KeyVault": "https://kv-ts-prod.vault.azure.net",
6+
"IoTHubHostName": "iot-ts-prod.azure-devices.net"
147
}

0 commit comments

Comments
 (0)