From c664f40926c965aacef461e66a1715acc5b00f3d Mon Sep 17 00:00:00 2001 From: Edward Wilson Date: Wed, 22 Nov 2017 16:27:16 +0000 Subject: [PATCH 1/3] Added MongoDb heathcheck --- HealthChecks.sln | 12 +++- .../HealthCheckBuilderSqlServerExtensions.cs | 49 ++++++++++++++++ .../Internal/Guard.cs | 57 +++++++++++++++++++ ...oft.Extensions.HealthChecks.MongoDb.csproj | 15 +++++ 4 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 src/Microsoft.Extensions.HealthChecks.MongoDb/HealthCheckBuilderSqlServerExtensions.cs create mode 100644 src/Microsoft.Extensions.HealthChecks.MongoDb/Internal/Guard.cs create mode 100644 src/Microsoft.Extensions.HealthChecks.MongoDb/Microsoft.Extensions.HealthChecks.MongoDb.csproj diff --git a/HealthChecks.sln b/HealthChecks.sln index facc21a..ba3e8b8 100644 --- a/HealthChecks.sln +++ b/HealthChecks.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.26228.9 +VisualStudioVersion = 15.0.27004.2002 MinimumVisualStudioVersion = 15.0.26228.4 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{E05DCF88-F916-4B61-A5DC-A8344C9E2429}" EndProject @@ -25,6 +25,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNet.HealthChec EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleHealthChecker.AspNet", "samples\SampleHealthChecker.AspNet\SampleHealthChecker.AspNet.csproj", "{33FB5967-62C7-4230-B515-780EF63F748E}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Extensions.HealthChecks.MongoDb", "src\Microsoft.Extensions.HealthChecks.MongoDb\Microsoft.Extensions.HealthChecks.MongoDb.csproj", "{17689B4B-7361-417F-B87D-0C8162E0F0C8}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -63,6 +65,10 @@ Global {33FB5967-62C7-4230-B515-780EF63F748E}.Debug|Any CPU.Build.0 = Debug|Any CPU {33FB5967-62C7-4230-B515-780EF63F748E}.Release|Any CPU.ActiveCfg = Release|Any CPU {33FB5967-62C7-4230-B515-780EF63F748E}.Release|Any CPU.Build.0 = Release|Any CPU + {17689B4B-7361-417F-B87D-0C8162E0F0C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {17689B4B-7361-417F-B87D-0C8162E0F0C8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {17689B4B-7361-417F-B87D-0C8162E0F0C8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {17689B4B-7361-417F-B87D-0C8162E0F0C8}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -76,5 +82,9 @@ Global {13BE838A-200B-4A68-8F58-3EA3BE3A1A8A} = {F9BA869A-7D5F-420F-9505-2D881F7934A7} {2AE82E1C-6CE1-4755-A332-FA359B7CCE72} = {F9BA869A-7D5F-420F-9505-2D881F7934A7} {33FB5967-62C7-4230-B515-780EF63F748E} = {E05DCF88-F916-4B61-A5DC-A8344C9E2429} + {17689B4B-7361-417F-B87D-0C8162E0F0C8} = {F9BA869A-7D5F-420F-9505-2D881F7934A7} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {386F8E33-9F3E-4BC3-B895-A0B43372552F} EndGlobalSection EndGlobal diff --git a/src/Microsoft.Extensions.HealthChecks.MongoDb/HealthCheckBuilderSqlServerExtensions.cs b/src/Microsoft.Extensions.HealthChecks.MongoDb/HealthCheckBuilderSqlServerExtensions.cs new file mode 100644 index 0000000..263f077 --- /dev/null +++ b/src/Microsoft.Extensions.HealthChecks.MongoDb/HealthCheckBuilderSqlServerExtensions.cs @@ -0,0 +1,49 @@ +using System; +using MongoDB.Bson; +using MongoDB.Driver; + +namespace Microsoft.Extensions.HealthChecks +{ + using System.Linq; + using MongoDB.Driver.Core.Servers; + + public static class HealthCheckBuilderMongoDbExtensions + { + public static HealthCheckBuilder AddMongoDbCheck(this HealthCheckBuilder builder, string name, string connectionString, string databaseName) + { + Guard.ArgumentNotNull(nameof(builder), builder); + + return AddMongoDbCheck(builder, name, connectionString, databaseName, builder.DefaultCacheDuration); + } + + public static HealthCheckBuilder AddMongoDbCheck(this HealthCheckBuilder builder, string name, string connectionString, string databaseName, TimeSpan cacheDuration) + { + builder.AddCheck($"MongoDbCheck({name})", async () => + { + try + { + var client = new MongoClient(connectionString); + IMongoDatabase database = client.GetDatabase(databaseName); + + ServerState serverState = client.Cluster.Description.Servers.FirstOrDefault()?.State + ?? ServerState.Disconnected; + + if (serverState == ServerState.Disconnected) + { + return HealthCheckResult.Unhealthy($"MongoDbCheck({name}): Unhealthy"); + } + + BsonDocument result = await database.RunCommandAsync((Command) "{ping:1}").ConfigureAwait(false); + + return HealthCheckResult.Healthy($"MongoDbCheck({name}): Healthy"); + } + catch (Exception ex) + { + return HealthCheckResult.Unhealthy($"MongoDbCheck({name}): Exception during check: {ex.GetType().FullName}"); + } + }, cacheDuration); + + return builder; + } + } +} diff --git a/src/Microsoft.Extensions.HealthChecks.MongoDb/Internal/Guard.cs b/src/Microsoft.Extensions.HealthChecks.MongoDb/Internal/Guard.cs new file mode 100644 index 0000000..9f394be --- /dev/null +++ b/src/Microsoft.Extensions.HealthChecks.MongoDb/Internal/Guard.cs @@ -0,0 +1,57 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; + +static class Guard +{ + public static void ArgumentNotNull(string argumentName, object value) + { + if (value == null) + { + throw new ArgumentNullException(argumentName); + } + } + + public static void ArgumentNotNullOrEmpty(string argumentName, string value) + { + if (value == null) + { + throw new ArgumentNullException(argumentName); + } + if (string.IsNullOrEmpty(value)) + { + throw new ArgumentException("Value cannot be an empty string.", argumentName); + } + } + + // Use IReadOnlyCollection instead of IEnumerable to discourage double enumeration + public static void ArgumentNotNullOrEmpty(string argumentName, IReadOnlyCollection items) + { + if (items == null) + { + throw new ArgumentNullException(argumentName); + } + if (items.Count == 0) + { + throw new ArgumentException("Collection must contain at least one item.", argumentName); + } + } + + public static void ArgumentValid(bool valid, string argumentName, string exceptionMessage) + { + if (!valid) + { + throw new ArgumentException(exceptionMessage, argumentName); + } + } + + public static void OperationValid(bool valid, string exceptionMessage) + { + if (!valid) + { + throw new InvalidOperationException(exceptionMessage); + } + } +} diff --git a/src/Microsoft.Extensions.HealthChecks.MongoDb/Microsoft.Extensions.HealthChecks.MongoDb.csproj b/src/Microsoft.Extensions.HealthChecks.MongoDb/Microsoft.Extensions.HealthChecks.MongoDb.csproj new file mode 100644 index 0000000..86ae462 --- /dev/null +++ b/src/Microsoft.Extensions.HealthChecks.MongoDb/Microsoft.Extensions.HealthChecks.MongoDb.csproj @@ -0,0 +1,15 @@ + + + + netcoreapp2.0 + + + + + + + + + + + From 947dbfd7b19e7327fb7725037c5aaf324f4467d0 Mon Sep 17 00:00:00 2001 From: Edward Wilson Date: Thu, 23 Nov 2017 09:39:53 +0000 Subject: [PATCH 2/3] Fixed copy past file name mistake and set the project framework to correct version --- ...rverExtensions.cs => HealthCheckBuilderMongoDbExtensions.cs} | 0 .../Microsoft.Extensions.HealthChecks.MongoDb.csproj | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename src/Microsoft.Extensions.HealthChecks.MongoDb/{HealthCheckBuilderSqlServerExtensions.cs => HealthCheckBuilderMongoDbExtensions.cs} (100%) diff --git a/src/Microsoft.Extensions.HealthChecks.MongoDb/HealthCheckBuilderSqlServerExtensions.cs b/src/Microsoft.Extensions.HealthChecks.MongoDb/HealthCheckBuilderMongoDbExtensions.cs similarity index 100% rename from src/Microsoft.Extensions.HealthChecks.MongoDb/HealthCheckBuilderSqlServerExtensions.cs rename to src/Microsoft.Extensions.HealthChecks.MongoDb/HealthCheckBuilderMongoDbExtensions.cs diff --git a/src/Microsoft.Extensions.HealthChecks.MongoDb/Microsoft.Extensions.HealthChecks.MongoDb.csproj b/src/Microsoft.Extensions.HealthChecks.MongoDb/Microsoft.Extensions.HealthChecks.MongoDb.csproj index 86ae462..01f9b88 100644 --- a/src/Microsoft.Extensions.HealthChecks.MongoDb/Microsoft.Extensions.HealthChecks.MongoDb.csproj +++ b/src/Microsoft.Extensions.HealthChecks.MongoDb/Microsoft.Extensions.HealthChecks.MongoDb.csproj @@ -1,7 +1,7 @@ - netcoreapp2.0 + netstandard1.5 From a410a01de294675aa44dfe14ece3f4261e2e41cb Mon Sep 17 00:00:00 2001 From: Edward Wilson Date: Thu, 23 Nov 2017 09:48:41 +0000 Subject: [PATCH 3/3] Moved the guard to be a reference not a copy of the file --- .../Internal/Guard.cs | 57 ------------------- ...oft.Extensions.HealthChecks.MongoDb.csproj | 6 +- 2 files changed, 5 insertions(+), 58 deletions(-) delete mode 100644 src/Microsoft.Extensions.HealthChecks.MongoDb/Internal/Guard.cs diff --git a/src/Microsoft.Extensions.HealthChecks.MongoDb/Internal/Guard.cs b/src/Microsoft.Extensions.HealthChecks.MongoDb/Internal/Guard.cs deleted file mode 100644 index 9f394be..0000000 --- a/src/Microsoft.Extensions.HealthChecks.MongoDb/Internal/Guard.cs +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; - -static class Guard -{ - public static void ArgumentNotNull(string argumentName, object value) - { - if (value == null) - { - throw new ArgumentNullException(argumentName); - } - } - - public static void ArgumentNotNullOrEmpty(string argumentName, string value) - { - if (value == null) - { - throw new ArgumentNullException(argumentName); - } - if (string.IsNullOrEmpty(value)) - { - throw new ArgumentException("Value cannot be an empty string.", argumentName); - } - } - - // Use IReadOnlyCollection instead of IEnumerable to discourage double enumeration - public static void ArgumentNotNullOrEmpty(string argumentName, IReadOnlyCollection items) - { - if (items == null) - { - throw new ArgumentNullException(argumentName); - } - if (items.Count == 0) - { - throw new ArgumentException("Collection must contain at least one item.", argumentName); - } - } - - public static void ArgumentValid(bool valid, string argumentName, string exceptionMessage) - { - if (!valid) - { - throw new ArgumentException(exceptionMessage, argumentName); - } - } - - public static void OperationValid(bool valid, string exceptionMessage) - { - if (!valid) - { - throw new InvalidOperationException(exceptionMessage); - } - } -} diff --git a/src/Microsoft.Extensions.HealthChecks.MongoDb/Microsoft.Extensions.HealthChecks.MongoDb.csproj b/src/Microsoft.Extensions.HealthChecks.MongoDb/Microsoft.Extensions.HealthChecks.MongoDb.csproj index 01f9b88..7464f28 100644 --- a/src/Microsoft.Extensions.HealthChecks.MongoDb/Microsoft.Extensions.HealthChecks.MongoDb.csproj +++ b/src/Microsoft.Extensions.HealthChecks.MongoDb/Microsoft.Extensions.HealthChecks.MongoDb.csproj @@ -7,9 +7,13 @@ - + + + + +