From cb0871ae9b602dc4d0fed5f375a54e37f63f78ea Mon Sep 17 00:00:00 2001 From: Mateusz Date: Tue, 25 Jul 2023 07:54:57 +0200 Subject: [PATCH] Add HealthChecks.Dapr (#1947) --- .github/labeler.yml | 3 + .github/workflows/healthchecks_dapr_cd.yml | 29 ++++++++ .../healthchecks_dapr_cd_preview.yml | 30 ++++++++ .github/workflows/healthchecks_dapr_ci.yml | 65 +++++++++++++++++ AspNetCore.Diagnostics.HealthChecks.sln | 14 ++++ README.md | 2 + build/versions.props | 1 + src/HealthChecks.Dapr/DaprHealthCheck.cs | 22 ++++++ .../DaprHealthCheckBuilderExtensions.cs | 69 +++++++++++++++++++ .../HealthChecks.Dapr.csproj | 15 ++++ .../DaprRegistrationTests.cs | 63 +++++++++++++++++ .../HealthChecks.Dapr.Tests.csproj | 11 +++ .../HealthChecks.Dapr.approved.txt | 16 +++++ 13 files changed, 340 insertions(+) create mode 100644 .github/workflows/healthchecks_dapr_cd.yml create mode 100644 .github/workflows/healthchecks_dapr_cd_preview.yml create mode 100644 .github/workflows/healthchecks_dapr_ci.yml create mode 100644 src/HealthChecks.Dapr/DaprHealthCheck.cs create mode 100644 src/HealthChecks.Dapr/DependencyInjection/DaprHealthCheckBuilderExtensions.cs create mode 100644 src/HealthChecks.Dapr/HealthChecks.Dapr.csproj create mode 100644 test/HealthChecks.Dapr.Tests/DependencyInjection/DaprRegistrationTests.cs create mode 100644 test/HealthChecks.Dapr.Tests/HealthChecks.Dapr.Tests.csproj create mode 100644 test/HealthChecks.Dapr.Tests/HealthChecks.Dapr.approved.txt diff --git a/.github/labeler.yml b/.github/labeler.yml index c50b9b65d5..87db1be728 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -35,6 +35,9 @@ consul: cosmosdb: - src/HealthChecks.CosmosDb/**/* +dapr: + - src/HealthChecks.Dapr/**/* + documentdb: - src/HealthChecks.DocumentDb/**/* diff --git a/.github/workflows/healthchecks_dapr_cd.yml b/.github/workflows/healthchecks_dapr_cd.yml new file mode 100644 index 0000000000..60805ab7a1 --- /dev/null +++ b/.github/workflows/healthchecks_dapr_cd.yml @@ -0,0 +1,29 @@ +name: HealthChecks Dapr CD + +on: + push: + tags: + - release-dapr-* + - release-all-* + +jobs: + build: + env: + BUILD_CONFIG: Release + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: | + 6.0.x + 7.0.x + - name: Restore + run: dotnet restore ./src/HealthChecks.Dapr/HealthChecks.Dapr.csproj + - name: Build + run: dotnet build --no-restore ./src/HealthChecks.Dapr/HealthChecks.Dapr.csproj -c $BUILD_CONFIG + - name: Pack + run: dotnet pack --no-build ./src/HealthChecks.Dapr/HealthChecks.Dapr.csproj -c $BUILD_CONFIG -o ./artifacts + - name: Publish + run: dotnet nuget push ./artifacts/AspNetCore.HealthChecks.Dapr.*.nupkg -k ${{secrets.NUGET_API_KEY}} -s https://api.nuget.org/v3/index.json --skip-duplicate diff --git a/.github/workflows/healthchecks_dapr_cd_preview.yml b/.github/workflows/healthchecks_dapr_cd_preview.yml new file mode 100644 index 0000000000..bb7d9d0ceb --- /dev/null +++ b/.github/workflows/healthchecks_dapr_cd_preview.yml @@ -0,0 +1,30 @@ +name: HealthChecks Dapr Preview CD + +on: + push: + tags: + - preview-dapr-* + - preview-all-* + +jobs: + build: + env: + BUILD_CONFIG: Release + VERSION_SUFFIX: rc2.${{ github.run_number }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: | + 6.0.x + 7.0.x + - name: Restore + run: dotnet restore ./src/HealthChecks.Dapr/HealthChecks.Dapr.csproj + - name: Build + run: dotnet build --no-restore ./src/HealthChecks.Dapr/HealthChecks.Dapr.csproj -c $BUILD_CONFIG + - name: Pack + run: dotnet pack --no-build ./src/HealthChecks.Dapr/HealthChecks.Dapr.csproj --version-suffix $VERSION_SUFFIX -c $BUILD_CONFIG -o ./artifacts + - name: Publish + run: dotnet nuget push ./artifacts/AspNetCore.HealthChecks.Dapr.*.nupkg -k ${{secrets.NUGET_API_KEY}} -s https://api.nuget.org/v3/index.json --skip-duplicate diff --git a/.github/workflows/healthchecks_dapr_ci.yml b/.github/workflows/healthchecks_dapr_ci.yml new file mode 100644 index 0000000000..7e9fca39fc --- /dev/null +++ b/.github/workflows/healthchecks_dapr_ci.yml @@ -0,0 +1,65 @@ +name: HealthChecks Dapr CI + +on: + workflow_dispatch: + push: + branches: [ master ] + paths: + - src/HealthChecks.Dapr/** + - test/HealthChecks.Dapr.Tests/** + - test/_SHARED/** + - .github/workflows/healthchecks_dapr_ci.yml + - Directory.Build.props + - Directory.Build.targets + tags-ignore: + - release-* + - preview-* + + pull_request: + branches: [ master ] + paths: + - src/HealthChecks.Dapr/** + - test/HealthChecks.Dapr.Tests/** + - test/_SHARED/** + - .github/workflows/healthchecks_dapr_ci.yml + - Directory.Build.props + - Directory.Build.targets + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: | + 6.0.x + 7.0.x + - name: Restore + run: | + dotnet restore ./src/HealthChecks.Dapr/HealthChecks.Dapr.csproj && + dotnet restore ./test/HealthChecks.Dapr.Tests/HealthChecks.Dapr.Tests.csproj + - name: Check formatting + run: | + dotnet format --no-restore --verify-no-changes --severity warn ./src/HealthChecks.Dapr/HealthChecks.Dapr.csproj || (echo "Run 'dotnet format' to fix issues" && exit 1) && + dotnet format --no-restore --verify-no-changes --severity warn ./test/HealthChecks.Dapr.Tests/HealthChecks.Dapr.Tests.csproj || (echo "Run 'dotnet format' to fix issues" && exit 1) + - name: Build + run: | + dotnet build --no-restore ./src/HealthChecks.Dapr/HealthChecks.Dapr.csproj && + dotnet build --no-restore ./test/HealthChecks.Dapr.Tests/HealthChecks.Dapr.Tests.csproj + - name: Test + run: > + dotnet test + ./test/HealthChecks.Dapr.Tests/HealthChecks.Dapr.Tests.csproj + --no-restore + --no-build + --collect "XPlat Code Coverage" + --results-directory .coverage + -- + DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=opencover + - name: Upload Coverage + uses: codecov/codecov-action@v3 + with: + flags: Dapr + directory: .coverage diff --git a/AspNetCore.Diagnostics.HealthChecks.sln b/AspNetCore.Diagnostics.HealthChecks.sln index ef68a873a6..749a194b07 100644 --- a/AspNetCore.Diagnostics.HealthChecks.sln +++ b/AspNetCore.Diagnostics.HealthChecks.sln @@ -281,6 +281,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HealthChecks.AzureSearch.Te EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HealthChecks.UI.Data.Tests", "test\HealthChecks.UI.Data.Tests\HealthChecks.UI.Data.Tests.csproj", "{93DEEAD7-9A89-48C6-AD42-103AEADBCACE}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HealthChecks.Dapr", "src\HealthChecks.Dapr\HealthChecks.Dapr.csproj", "{716C2E59-6BB4-49A1-B685-9958B7EF0F3B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HealthChecks.Dapr.Tests", "test\HealthChecks.Dapr.Tests\HealthChecks.Dapr.Tests.csproj", "{1C2085FA-2D33-459B-945E-337323485E16}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -783,6 +787,14 @@ Global {93DEEAD7-9A89-48C6-AD42-103AEADBCACE}.Debug|Any CPU.Build.0 = Debug|Any CPU {93DEEAD7-9A89-48C6-AD42-103AEADBCACE}.Release|Any CPU.ActiveCfg = Release|Any CPU {93DEEAD7-9A89-48C6-AD42-103AEADBCACE}.Release|Any CPU.Build.0 = Release|Any CPU + {716C2E59-6BB4-49A1-B685-9958B7EF0F3B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {716C2E59-6BB4-49A1-B685-9958B7EF0F3B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {716C2E59-6BB4-49A1-B685-9958B7EF0F3B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {716C2E59-6BB4-49A1-B685-9958B7EF0F3B}.Release|Any CPU.Build.0 = Release|Any CPU + {1C2085FA-2D33-459B-945E-337323485E16}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1C2085FA-2D33-459B-945E-337323485E16}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1C2085FA-2D33-459B-945E-337323485E16}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1C2085FA-2D33-459B-945E-337323485E16}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -912,6 +924,8 @@ Global {0BE32765-7244-4717-9D48-B4C716DD1769} = {2A3FD988-2BB8-43CF-B3A2-B70E648259D4} {076B7DAE-E92A-4B81-BC1D-D63AF0E9C5B4} = {FF4414C2-8863-4ADA-8A1D-4B9F25C361FE} {93DEEAD7-9A89-48C6-AD42-103AEADBCACE} = {FF4414C2-8863-4ADA-8A1D-4B9F25C361FE} + {716C2E59-6BB4-49A1-B685-9958B7EF0F3B} = {2A3FD988-2BB8-43CF-B3A2-B70E648259D4} + {1C2085FA-2D33-459B-945E-337323485E16} = {FF4414C2-8863-4ADA-8A1D-4B9F25C361FE} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {2B8C62A1-11B6-469F-874C-A02443256568} diff --git a/README.md b/README.md index f75e84d7c6..eaed8b0117 100644 --- a/README.md +++ b/README.md @@ -82,6 +82,7 @@ HealthChecks packages include health checks for: | Azure Storage | [![Nuget](https://img.shields.io/nuget/dt/AspNetCore.HealthChecks.AzureStorage)](https://www.nuget.org/packages/AspNetCore.HealthChecks.AzureStorage) | [![Nuget](https://img.shields.io/nuget/v/AspNetCore.HealthChecks.AzureStorage)](https://www.nuget.org/packages/AspNetCore.HealthChecks.AzureStorage) | [![view](https://img.shields.io/github/issues/Xabaril/AspNetCore.Diagnostics.HealthChecks/azure)](https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks/labels/azure) | Blob, File, Queue | | Consul | [![Nuget](https://img.shields.io/nuget/dt/AspNetCore.HealthChecks.Consul)](https://www.nuget.org/packages/AspNetCore.HealthChecks.Consul) | [![Nuget](https://img.shields.io/nuget/v/AspNetCore.HealthChecks.Consul)](https://www.nuget.org/packages/AspNetCore.HealthChecks.Consul) | [![view](https://img.shields.io/github/issues/Xabaril/AspNetCore.Diagnostics.HealthChecks/consul)](https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks/labels/consul) | CosmosDb | [![Nuget](https://img.shields.io/nuget/dt/AspNetCore.HealthChecks.CosmosDb)](https://www.nuget.org/packages/AspNetCore.HealthChecks.CosmosDb) | [![Nuget](https://img.shields.io/nuget/v/AspNetCore.HealthChecks.CosmosDb)](https://www.nuget.org/packages/AspNetCore.HealthChecks.CosmosDb) | [![view](https://img.shields.io/github/issues/Xabaril/AspNetCore.Diagnostics.HealthChecks/cosmosdb)](https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks/labels/cosmosdb) | CosmosDb and Azure Table +| Dapr | [![Nuget](https://img.shields.io/nuget/dt/AspNetCore.HealthChecks.Dapr)](https://www.nuget.org/packages/AspNetCore.HealthChecks.Dapr) | [![Nuget](https://img.shields.io/nuget/v/AspNetCore.HealthChecks.Dapr)](https://www.nuget.org/packages/AspNetCore.HealthChecks.Dapr) | [![view](https://img.shields.io/github/issues/Xabaril/AspNetCore.Diagnostics.HealthChecks/dapr)](https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks/labels/dapr) | Azure DocumentDb | [![Nuget](https://img.shields.io/nuget/dt/AspNetCore.HealthChecks.DocumentDb)](https://www.nuget.org/packages/AspNetCore.HealthChecks.DocumentDb) | [![Nuget](https://img.shields.io/nuget/v/AspNetCore.HealthChecks.DocumentDb)](https://www.nuget.org/packages/AspNetCore.HealthChecks.DocumentDb) | [![view](https://img.shields.io/github/issues/Xabaril/AspNetCore.Diagnostics.HealthChecks/documentdb)](https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks/labels/documentdb) | Amazon DynamoDb | [![Nuget](https://img.shields.io/nuget/dt/AspNetCore.HealthChecks.DynamoDb)](https://www.nuget.org/packages/AspNetCore.HealthChecks.DynamoDb) | [![Nuget](https://img.shields.io/nuget/v/AspNetCore.HealthChecks.DynamoDb)](https://www.nuget.org/packages/AspNetCore.HealthChecks.DynamoDb) | [![view](https://img.shields.io/github/issues/Xabaril/AspNetCore.Diagnostics.HealthChecks/dynamodb)](https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks/labels/dynamodb) | Elasticsearch | [![Nuget](https://img.shields.io/nuget/dt/AspNetCore.HealthChecks.Elasticsearch)](https://www.nuget.org/packages/AspNetCore.HealthChecks.Elasticsearch) | [![Nuget](https://img.shields.io/nuget/v/AspNetCore.HealthChecks.Elasticsearch)](https://www.nuget.org/packages/AspNetCore.HealthChecks.Elasticsearch) | [![view](https://img.shields.io/github/issues/Xabaril/AspNetCore.Diagnostics.HealthChecks/elasticsearch)](https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks/labels/elasticsearch) @@ -131,6 +132,7 @@ Install-Package AspNetCore.HealthChecks.AzureServiceBus Install-Package AspNetCore.HealthChecks.AzureStorage Install-Package AspNetCore.HealthChecks.Consul Install-Package AspNetCore.HealthChecks.CosmosDb +Install-Package AspNetCore.HealthChecks.Dapr Install-Package AspNetCore.HealthChecks.DocumentDb Install-Package AspNetCore.HealthChecks.DynamoDB Install-Package AspNetCore.HealthChecks.Elasticsearch diff --git a/build/versions.props b/build/versions.props index 6206e7ad98..b45695a206 100644 --- a/build/versions.props +++ b/build/versions.props @@ -16,6 +16,7 @@ 7.0.0 7.0.0 7.0.0 + 7.0.0 7.0.0 7.0.0 7.0.0 diff --git a/src/HealthChecks.Dapr/DaprHealthCheck.cs b/src/HealthChecks.Dapr/DaprHealthCheck.cs new file mode 100644 index 0000000000..54886dc703 --- /dev/null +++ b/src/HealthChecks.Dapr/DaprHealthCheck.cs @@ -0,0 +1,22 @@ +using Dapr.Client; +using Microsoft.Extensions.Diagnostics.HealthChecks; + +namespace HealthChecks.Dapr; + +public class DaprHealthCheck : IHealthCheck +{ + private readonly DaprClient _daprClient; + + public DaprHealthCheck(DaprClient daprClient) + { + _daprClient = daprClient ?? throw new ArgumentNullException(nameof(daprClient)); + } + + /// + public async Task CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default) + { + return await _daprClient.CheckHealthAsync(cancellationToken).ConfigureAwait(false) + ? HealthCheckResult.Healthy() + : new HealthCheckResult(context.Registration.FailureStatus); + } +} diff --git a/src/HealthChecks.Dapr/DependencyInjection/DaprHealthCheckBuilderExtensions.cs b/src/HealthChecks.Dapr/DependencyInjection/DaprHealthCheckBuilderExtensions.cs new file mode 100644 index 0000000000..9797db7cc5 --- /dev/null +++ b/src/HealthChecks.Dapr/DependencyInjection/DaprHealthCheckBuilderExtensions.cs @@ -0,0 +1,69 @@ +using Dapr.Client; +using HealthChecks.Dapr; +using Microsoft.Extensions.Diagnostics.HealthChecks; + +namespace Microsoft.Extensions.DependencyInjection; + +/// +/// Extension methods to configure . +/// +public static class DaprHealthCheckBuilderExtensions +{ + private const string DAPR_NAME = "dapr"; + + /// + /// Add a health check for Dapr using provided . + /// + /// The . + /// The to be used. + /// The health check name. Optional. If null the type name 'dapr' will be used for the name. + /// + /// The that should be reported when the health check fails. Optional. If null then + /// the default status of will be reported. + /// + /// A list of tags that can be used to filter sets of health checks. Optional. + /// An representing the timeout of the check. Optional. + /// The . + public static IHealthChecksBuilder AddDapr( + this IHealthChecksBuilder builder, + DaprClient daprClient, + string? name = default, + HealthStatus? failureStatus = default, + IEnumerable? tags = default, + TimeSpan? timeout = default) + { + return builder.Add(new HealthCheckRegistration( + name ?? DAPR_NAME, + new DaprHealthCheck(daprClient), + failureStatus, + tags, + timeout)); + } + + /// + /// Add a health check for Dapr using from service provider. + /// + /// The . + /// The health check name. Optional. If null the type name 'dapr' will be used for the name. + /// + /// The that should be reported when the health check fails. Optional. If null then + /// the default status of will be reported. + /// + /// A list of tags that can be used to filter sets of health checks. Optional. + /// An representing the timeout of the check. Optional. + /// The . + public static IHealthChecksBuilder AddDapr( + this IHealthChecksBuilder builder, + string? name = default, + HealthStatus? failureStatus = default, + IEnumerable? tags = default, + TimeSpan? timeout = default) + { + return builder.Add(new HealthCheckRegistration( + name ?? DAPR_NAME, + sp => new DaprHealthCheck(sp.GetRequiredService()), + failureStatus, + tags, + timeout)); + } +} diff --git a/src/HealthChecks.Dapr/HealthChecks.Dapr.csproj b/src/HealthChecks.Dapr/HealthChecks.Dapr.csproj new file mode 100644 index 0000000000..e02c517cd4 --- /dev/null +++ b/src/HealthChecks.Dapr/HealthChecks.Dapr.csproj @@ -0,0 +1,15 @@ + + + + net6.0;net7.0 + $(PackageTags);Dapr + HealthChecks.Dapr is the health check package for Dapr. + $(HealthCheckDapr) + + + + + + + + diff --git a/test/HealthChecks.Dapr.Tests/DependencyInjection/DaprRegistrationTests.cs b/test/HealthChecks.Dapr.Tests/DependencyInjection/DaprRegistrationTests.cs new file mode 100644 index 0000000000..8bcacda714 --- /dev/null +++ b/test/HealthChecks.Dapr.Tests/DependencyInjection/DaprRegistrationTests.cs @@ -0,0 +1,63 @@ +using Dapr.Client; + +namespace HealthChecks.Dapr.Tests.DependencyInjection; + +public class dapr_registration_should +{ + private const string _defaultCheckName = "dapr"; + + [Fact] + public void add_health_check_when_properly_configured_using_di() + { + var services = new ServiceCollection(); + services.AddSingleton(new DaprClientBuilder().Build()); + services.AddHealthChecks() + .AddDapr(); + + using var serviceProvider = services.BuildServiceProvider(); + var options = serviceProvider.GetRequiredService>(); + + var registration = options.Value.Registrations.First(); + var check = registration.Factory(serviceProvider); + + registration.Name.ShouldBe(_defaultCheckName); + check.ShouldBeOfType(); + } + + [Fact] + public void add_health_check_when_properly_configured_using_arguments() + { + var services = new ServiceCollection(); + services.AddHealthChecks() + .AddDapr(daprClient: new DaprClientBuilder().Build()); + + using var serviceProvider = services.BuildServiceProvider(); + var options = serviceProvider.GetRequiredService>(); + + var registration = options.Value.Registrations.First(); + var check = registration.Factory(serviceProvider); + + registration.Name.ShouldBe(_defaultCheckName); + check.ShouldBeOfType(); + } + + [Fact] + public void add_named_health_check_when_properly_configured() + { + var services = new ServiceCollection(); + var customCheckName = "my-" + _defaultCheckName; + + services.AddSingleton(new DaprClientBuilder().Build()); + services.AddHealthChecks() + .AddDapr(name: customCheckName); + + using var serviceProvider = services.BuildServiceProvider(); + var options = serviceProvider.GetRequiredService>(); + + var registration = options.Value.Registrations.First(); + var check = registration.Factory(serviceProvider); + + registration.Name.ShouldBe(customCheckName); + check.ShouldBeOfType(); + } +} diff --git a/test/HealthChecks.Dapr.Tests/HealthChecks.Dapr.Tests.csproj b/test/HealthChecks.Dapr.Tests/HealthChecks.Dapr.Tests.csproj new file mode 100644 index 0000000000..ae70769a6a --- /dev/null +++ b/test/HealthChecks.Dapr.Tests/HealthChecks.Dapr.Tests.csproj @@ -0,0 +1,11 @@ + + + + net6.0;net7.0 + + + + + + + diff --git a/test/HealthChecks.Dapr.Tests/HealthChecks.Dapr.approved.txt b/test/HealthChecks.Dapr.Tests/HealthChecks.Dapr.approved.txt new file mode 100644 index 0000000000..269153e2e7 --- /dev/null +++ b/test/HealthChecks.Dapr.Tests/HealthChecks.Dapr.approved.txt @@ -0,0 +1,16 @@ +namespace HealthChecks.Dapr +{ + public class DaprHealthCheck : Microsoft.Extensions.Diagnostics.HealthChecks.IHealthCheck + { + public DaprHealthCheck(Dapr.Client.DaprClient daprClient) { } + public System.Threading.Tasks.Task CheckHealthAsync(Microsoft.Extensions.Diagnostics.HealthChecks.HealthCheckContext context, System.Threading.CancellationToken cancellationToken = default) { } + } +} +namespace Microsoft.Extensions.DependencyInjection +{ + public static class DaprHealthCheckBuilderExtensions + { + public static Microsoft.Extensions.DependencyInjection.IHealthChecksBuilder AddDapr(this Microsoft.Extensions.DependencyInjection.IHealthChecksBuilder builder, string? name = null, Microsoft.Extensions.Diagnostics.HealthChecks.HealthStatus? failureStatus = default, System.Collections.Generic.IEnumerable? tags = null, System.TimeSpan? timeout = default) { } + public static Microsoft.Extensions.DependencyInjection.IHealthChecksBuilder AddDapr(this Microsoft.Extensions.DependencyInjection.IHealthChecksBuilder builder, Dapr.Client.DaprClient daprClient, string? name = null, Microsoft.Extensions.Diagnostics.HealthChecks.HealthStatus? failureStatus = default, System.Collections.Generic.IEnumerable? tags = null, System.TimeSpan? timeout = default) { } + } +} \ No newline at end of file