项目作者: H4ck3rBatera
项目描述 :
Azure Functions Health Check
高级语言: C#
项目地址: git://github.com/H4ck3rBatera/AzureFunctions.HealthCheck.git
AzureFunctions.HealthCheck
- Azure Functions
- .NET Core 3.1
- Microsoft.Extensions.Diagnostics.HealthChecks
- AspNetCore.HealthChecks.SqlServer
- Docker
csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<AzureFunctionsVersion>v3</AzureFunctionsVersion>
<DockerFastModeProjectMountDirectory>/home/site/wwwroot</DockerFastModeProjectMountDirectory>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AspNetCore.HealthChecks.SqlServer" Version="3.2.0" ></PackageReference>
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.0.11" ></PackageReference>
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.10.13" ></PackageReference>
</ItemGroup>
<ItemGroup>
<None Update="host.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="local.settings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<CopyToPublishDirectory>Never</CopyToPublishDirectory>
</None>
</ItemGroup>
</Project>
Controller
public class HealthCheckFunction
{
private readonly HealthCheckService _healthCheck;
public HealthCheckFunction(HealthCheckService healthCheck)
{
_healthCheck = healthCheck;
}
[FunctionName("Heartbeat")]
public async Task<IActionResult> Heartbeat(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "heartbeat")] HttpRequest req,
ILogger log, CancellationToken cancellationToken)
{
log.Log(LogLevel.Information, "Received heartbeat request");
var healthReport = await _healthCheck.CheckHealthAsync(cancellationToken);
string json = JsonConvert.SerializeObject(healthReport, new JsonSerializerSettings
{
ContractResolver = new DefaultContractResolver
{
NamingStrategy = new CamelCaseNamingStrategy()
},
Formatting = Formatting.Indented,
Converters = new Collection<JsonConverter>
{
new StringEnumConverter()
}
});
return new OkObjectResult(json);
}
}
local.settings.json
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"ConnectionStringSqlServer": "Server=localhost,1433;Database=master;User ID=sa;Password=P@ssword",
"FUNCTIONS_WORKER_RUNTIME": "dotnet"
}
}
Startup
[assembly: WebJobsStartup(typeof(Startup))]
namespace AzureFunctions.HealthCheck.Presentation
{
public class Startup : IWebJobsStartup
{
public void Configure(IWebJobsBuilder builder)
{
ConfigureServices(builder.Services);
}
public void ConfigureServices(IServiceCollection services)
{
services.AddLogging();
services.AddHealthChecks()
.AddSqlServer(
name: "ConnectionStringSqlServer",
connectionString: Environment.GetEnvironmentVariable("ConnectionStringSqlServer"),
tags: new string[] { "sqlserver" });
}
}
}
docker-compose
version: '3.4'
services:
sql_server:
image: mcr.microsoft.com/mssql/server:latest
ports:
- "1433:1433"
environment:
SA_PASSWORD: 'P@ssword'
ACCEPT_EULA: 'Y'
/api/heartbeat
{
"entries": {
"ConnectionStringSqlServer": {
"data": {},
"description": null,
"duration": "00:00:00.5315855",
"exception": null,
"status": "Healthy",
"tags": [
"sqlserver"
]
}
},
"status": "Healthy",
"totalDuration": "00:00:00.5466440"
}