예제 #1
0
        /// <summary>Gets the ready drives.</summary>
        /// <returns>A list of ready drives.</returns>
        private static List <DriveDetails> GetReadyDrives(HealthcheckResult checkResult)
        {
            var readyDrivesDetails = new List <DriveDetails>();

            IEnumerable <DriveInfo> readyDrives;

            try
            {
                readyDrives = DriveInfo.GetDrives().Where(d => d.IsReady);

                foreach (var drive in readyDrives)
                {
                    var driveDetails = new DriveDetails();

                    driveDetails.DriveName             = drive.Name;
                    driveDetails.AvailableFreeSpace    = drive.AvailableFreeSpace / BytesInGB;
                    driveDetails.PercentageOfFreeSpace = (drive.AvailableFreeSpace / (double)drive.TotalSize) * 100;

                    readyDrivesDetails.Add(driveDetails);
                }
            }
            catch (Exception exception)
            {
                checkResult.ErrorList.Entries.Add(ErrorEntry.CreateErrorEntry(exception.Message, exception));
                return(null);
            }

            return(readyDrivesDetails);
        }
        public static HealthcheckResult RunHealthcheck(string connectionStringKey)
        {
            var checkResult = new HealthcheckResult
            {
                LastCheckTime  = DateTime.UtcNow,
                Status         = Customization.HealthcheckStatus.Healthy,
                HealthyMessage = "Database Connection is OK",
                ErrorList      = new ErrorList
                {
                    Entries = new List <ErrorEntry>()
                }
            };

            if (string.IsNullOrEmpty(connectionStringKey))
            {
                checkResult.Status = HealthcheckStatus.Warning;
                checkResult.ErrorList.Entries.Add(new ErrorEntry
                {
                    Created   = DateTime.UtcNow,
                    Reason    = "Missing connectionstring key",
                    Exception = null
                });

                return(checkResult);
            }

            if (ConfigurationManager.ConnectionStrings[connectionStringKey] == null)
            {
                checkResult.Status = HealthcheckStatus.Warning;
                checkResult.ErrorList.Entries.Add(new ErrorEntry
                {
                    Created   = DateTime.UtcNow,
                    Reason    = "Cannot find the connectionstring in the config",
                    Exception = null
                });

                return(checkResult);
            }

            try
            {
                var connection = new SqlConnection(ConfigurationManager.ConnectionStrings[connectionStringKey].ConnectionString);
                connection.Open();
                connection.Close();
            }
            catch (Exception exception)
            {
                checkResult.Status = HealthcheckStatus.Error;
                checkResult.ErrorList.Entries.Add(new ErrorEntry
                {
                    Created   = DateTime.UtcNow,
                    Reason    = exception.Message,
                    Exception = exception
                });
            }

            return(checkResult);
        }
        public static HealthcheckResult RunHealthcheck(string serviceName, string healtyMessage)
        {
            var checkResult = new HealthcheckResult
            {
                LastCheckTime = DateTime.UtcNow,
                Status        = Customization.HealthcheckStatus.Healthy,
                ErrorList     = new ErrorList
                {
                    Entries = new List <ErrorEntry>()
                }
            };

            checkResult.LastCheckTime  = DateTime.UtcNow;
            checkResult.Status         = HealthcheckStatus.Healthy;
            checkResult.HealthyMessage = string.Format(healtyMessage, serviceName);

            if (string.IsNullOrEmpty(serviceName))
            {
                checkResult.Status = HealthcheckStatus.Warning;
                checkResult.ErrorList.Entries.Add(new ErrorEntry
                {
                    Created   = DateTime.UtcNow,
                    Reason    = "Missing service name value",
                    Exception = null
                });

                return(checkResult);
            }

            try
            {
                ServiceController service = new ServiceController(serviceName);
                if (service.Status != ServiceControllerStatus.Running)
                {
                    checkResult.Status = HealthcheckStatus.Error;
                    checkResult.ErrorList.Entries.Add(new ErrorEntry
                    {
                        Created   = DateTime.UtcNow,
                        Reason    = string.Format("{0} service is now: {1}", serviceName, service.Status),
                        Exception = null
                    });

                    return(checkResult);
                }
            }
            catch (Exception exception)
            {
                checkResult.Status = HealthcheckStatus.Error;
                checkResult.ErrorList.Entries.Add(new ErrorEntry
                {
                    Created   = DateTime.UtcNow,
                    Reason    = exception.Message,
                    Exception = exception
                });
            }

            return(checkResult);
        }
예제 #4
0
        public static HealthcheckResult RunHealthcheck(string fileNameFormat, string directoryPath, DateTime itemCreationDate, int numberDaysToCheck, bool isRemote = false)
        {
            var checkResult = new HealthcheckResult
            {
                LastCheckTime  = DateTime.UtcNow,
                Status         = Customization.HealthcheckStatus.Healthy,
                HealthyMessage = "There is no new error since the last check",
                ErrorList      = new ErrorList
                {
                    Entries = new List <ErrorEntry>()
                }
            };

            if (string.IsNullOrEmpty(fileNameFormat))
            {
                checkResult.Status = Customization.HealthcheckStatus.Warning;
                checkResult.ErrorList.Entries.Add(new ErrorEntry
                {
                    Created   = DateTime.UtcNow,
                    Reason    = "Log File Check is not configured correctly",
                    Exception = null
                });

                return(checkResult);
            }

            try
            {
                var directory = GetLogFileDirectory(directoryPath);
                var files     = directory.GetFiles(fileNameFormat);

                if (files == null || files.Count() == 0)
                {
                    checkResult.Status = HealthcheckStatus.Warning;
                    checkResult.ErrorList.Entries.Add(new ErrorEntry
                    {
                        Created   = DateTime.UtcNow,
                        Reason    = string.Format("No files can be found with the following pattern: {0}", fileNameFormat),
                        Exception = null
                    });

                    return(checkResult);
                }

                LogReaderSettings logReaderSettings = new LogReaderSettings(itemCreationDate, DateTime.MaxValue);

                if (numberDaysToCheck > 0)
                {
                    if (isRemote)
                    {
                        logReaderSettings.StartDateTime = itemCreationDate.ToLocalTime();
                    }
                    else
                    {
                        logReaderSettings.StartDateTime = DateTime.Now.AddDays(-numberDaysToCheck).Date;
                    }
                    logReaderSettings.FinishDateTime = DateTime.Now;
                }

                LogDataSource logDataSource = new LogDataSource(files, logReaderSettings);
                logDataSource.ParseFiles();

                var result = logDataSource.LogData;

                if (result.Errors != null && result.Errors.Count > 0)
                {
                    checkResult.Status = HealthcheckStatus.Error;
                    foreach (var error in result.Errors)
                    {
                        checkResult.ErrorList.Entries.Add(new ErrorEntry
                        {
                            Created   = error.Time,
                            Reason    = error.Message?.Message,
                            Exception = null
                        });
                    }
                }
                else if (result.Warns != null && result.Warns.Count > 0)
                {
                    checkResult.Status = HealthcheckStatus.Warning;
                    foreach (var warn in result.Warns)
                    {
                        checkResult.ErrorList.Entries.Add(new ErrorEntry
                        {
                            Created   = warn.Time,
                            Reason    = warn.Message?.Message,
                            Exception = null
                        });
                    }
                }
            }
            catch (Exception exception)
            {
                checkResult.Status = HealthcheckStatus.Error;
                checkResult.ErrorList.Entries.Add(new ErrorEntry
                {
                    Created   = DateTime.UtcNow,
                    Reason    = exception.Message,
                    Exception = exception
                });
            }

            return(checkResult);
        }
예제 #5
0
        // TODO: REFACTOR in later release
        public static HealthcheckResult RunHealthcheck(string Url, NameValueCollection RequestHeaders, string Method, string PostBody, int ExpectedResponseCode, string ExpectedResponseBody, bool usingBasicAuthentication, bool usingJwtAuthentication, bool usingCertificateAuthentication, string Username, string Password, string JwtToken, string GenerateTokenUrl, string generateTokenEndpointMetho, string storeName, string location, string findByTypeName, string value)
        {
            var checkResult = new HealthcheckResult
            {
                LastCheckTime  = DateTime.UtcNow,
                Status         = Customization.HealthcheckStatus.Healthy,
                HealthyMessage = "API endpoint looks OK",
                ErrorList      = new ErrorList
                {
                    Entries = new List <ErrorEntry>()
                }
            };

            if (string.IsNullOrEmpty(Url))
            {
                checkResult.Status = HealthcheckStatus.Warning;
                checkResult.ErrorList.Entries.Add(new ErrorEntry
                {
                    Created   = DateTime.UtcNow,
                    Reason    = "Missing API URL",
                    Exception = null
                });

                return(checkResult);
            }

            HttpClient httpClient = new HttpClient();

            try
            {
                HttpResponseMessage response = new HttpResponseMessage();

                httpClient = AddAuthentication(httpClient, usingBasicAuthentication, usingJwtAuthentication, usingCertificateAuthentication, Username, Password, JwtToken, GenerateTokenUrl, generateTokenEndpointMetho, storeName, location, findByTypeName, value);

                if (RequestHeaders != null && RequestHeaders.Count > 0)
                {
                    httpClient.DefaultRequestHeaders.Accept.Clear();
                    foreach (string headerKey in RequestHeaders.Keys)
                    {
                        httpClient.DefaultRequestHeaders.Add(headerKey, RequestHeaders[headerKey].ToString());
                    }
                }

                if (Method == "POST")
                {
                    HttpContent content = new StringContent(PostBody);

                    response = httpClient.PostAsync(Url, content).Result;
                }
                else
                {
                    response = httpClient.GetAsync(Url).Result;
                }

                if ((int)response.StatusCode != ExpectedResponseCode)
                {
                    checkResult.Status = HealthcheckStatus.Error;
                    checkResult.ErrorList.Entries.Add(new ErrorEntry
                    {
                        Created = DateTime.UtcNow,
                        Reason  = $"API returned with status code: {(int)response.StatusCode} - {response.ReasonPhrase}"
                    });
                }
                else if (!string.IsNullOrEmpty(ExpectedResponseBody))
                {
                    var responseBody = CleanText(response.Content.ReadAsStringAsync().Result);

                    if (!responseBody.Equals(CleanText(ExpectedResponseBody), StringComparison.OrdinalIgnoreCase))
                    {
                        checkResult.Status = HealthcheckStatus.Error;
                        checkResult.ErrorList.Entries.Add(new ErrorEntry
                        {
                            Created = DateTime.UtcNow,
                            Reason  = $"API returned with an unexpected response body"
                        });;
                    }
                }
            }
            catch (Exception exception)
            {
                checkResult.Status = HealthcheckStatus.Error;
                checkResult.ErrorList.Entries.Add(new ErrorEntry
                {
                    Created   = DateTime.UtcNow,
                    Reason    = exception.Message,
                    Exception = exception
                });
            }
            finally
            {
                httpClient.Dispose();
            }

            return(checkResult);
        }
예제 #6
0
        public static HealthcheckResult RunHealthcheck(int warnBefore, int errorBefore)
        {
            var checkResult = new HealthcheckResult
            {
                LastCheckTime = DateTime.UtcNow,
                Status        = Customization.HealthcheckStatus.Healthy,
                ErrorList     = new ErrorList
                {
                    Entries = new List <ErrorEntry>()
                }
            };

            checkResult.LastCheckTime = DateTime.UtcNow;
            checkResult.Status        = HealthcheckStatus.Healthy;

            try
            {
                var         licenseFile = Settings.LicenseFile;
                XmlDocument doc         = new XmlDocument();
                doc.Load(licenseFile);
                var expirationNodeList = doc.GetElementsByTagName("expiration");
                var expirationDate     = DateTime.ParseExact(expirationNodeList[0].InnerText, "yyyyMMddTHHmmss", System.Globalization.CultureInfo.CurrentCulture);

                if (expirationDate.AddDays(-warnBefore).Date <= DateTime.Now.Date && expirationDate.AddDays(-errorBefore).Date > DateTime.UtcNow.Date)
                {
                    checkResult.Status = HealthcheckStatus.Warning;
                    checkResult.ErrorList.Entries.Add(new ErrorEntry
                    {
                        Created   = DateTime.UtcNow,
                        Reason    = string.Format("License will expire in {0} days.", (expirationDate - DateTime.UtcNow).Days),
                        Exception = null
                    });

                    return(checkResult);
                }

                if (expirationDate.AddDays(-errorBefore).Date <= DateTime.UtcNow.Date)
                {
                    checkResult.Status = HealthcheckStatus.Error;
                    checkResult.ErrorList.Entries.Add(new ErrorEntry
                    {
                        Created   = DateTime.UtcNow,
                        Reason    = string.Format("License will expire in {0} days.", (expirationDate - DateTime.UtcNow).Days),
                        Exception = null
                    });

                    return(checkResult);
                }
            }
            catch (Exception exception)
            {
                checkResult.Status = HealthcheckStatus.Error;
                checkResult.ErrorList.Entries.Add(new ErrorEntry
                {
                    Created   = DateTime.UtcNow,
                    Reason    = exception.Message,
                    Exception = exception
                });
            }

            return(checkResult);
        }
예제 #7
0
        public static HealthcheckResult RunHealthcheck(string typeValue, NameValueCollection inputParameters)
        {
            var checkResult = new HealthcheckResult
            {
                LastCheckTime = System.DateTime.UtcNow,
                Status        = Customization.HealthcheckStatus.Healthy,
                ErrorList     = new ErrorList
                {
                    Entries = new List <ErrorEntry>()
                }
            };

            string assemblyName = string.Empty;
            string typeName     = string.Empty;

            try
            {
                assemblyName = typeValue.Split(',')[1].Trim();
                typeName     = typeValue.Split(',')[0].Trim();
            }
            catch (Exception)
            {
                checkResult.Status = HealthcheckStatus.Warning;
                checkResult.ErrorList.Entries.Add(new ErrorEntry
                {
                    Created = DateTime.UtcNow,
                    Reason  = string.Format("{0} could not be parsed, use the following format: <NameSpace>.<Class>,<AssemblyName>", typeValue)
                });

                return(checkResult);
            }

            Assembly assembly = null;

            try
            {
                assembly = Assembly.Load(assemblyName);
            }
            catch (Exception ex)
            {
                checkResult.Status = HealthcheckStatus.Warning;
                checkResult.ErrorList.Entries.Add(new ErrorEntry
                {
                    Created   = DateTime.UtcNow,
                    Reason    = string.Format("{0} assembly could not be loaded, please check the configuration!", assemblyName),
                    Exception = ex
                });

                return(checkResult);
            }

            Type type = assembly.GetType(typeName);

            if (type == null)
            {
                checkResult.Status = HealthcheckStatus.Warning;
                checkResult.ErrorList.Entries.Add(new ErrorEntry
                {
                    Created = DateTime.UtcNow,
                    Reason  = string.Format("{0} type could not be loaded, please check the configuration!", typeName)
                });

                return(checkResult);
            }

            var methodName = "DoHealthcheck";

            MethodInfo methodInfo = type.GetMethod(methodName);

            if (methodInfo == null)
            {
                checkResult.Status = HealthcheckStatus.Warning;
                checkResult.ErrorList.Entries.Add(new ErrorEntry
                {
                    Created = DateTime.UtcNow,
                    Reason  = string.Format("{0} method could not be loaded, please make sure you implemented the 'DoHealthcheck' method!", methodName)
                });

                return(checkResult);
            }

            try
            {
                CustomHealthcheckResult result     = null;
                ParameterInfo[]         parameters = methodInfo.GetParameters();
                object classInstance = Activator.CreateInstance(type, null);

                object[] parametersArray = new object[] { inputParameters };

                result = methodInfo.Invoke(classInstance, parametersArray) as CustomHealthcheckResult;

                if (result != null)
                {
                    checkResult.Status         = result.Status;
                    checkResult.HealthyMessage = result.HealthyMessage;
                    if (checkResult.Status != HealthcheckStatus.Healthy)
                    {
                        checkResult.ErrorList.Entries.Add(new ErrorEntry
                        {
                            Created   = DateTime.UtcNow,
                            Reason    = result.ErrorMessage,
                            Exception = result.Exception
                        });
                    }
                }
            }
            catch (Exception ex)
            {
                checkResult.Status = HealthcheckStatus.Error;
                checkResult.ErrorList.Entries.Add(new ErrorEntry
                {
                    Created   = DateTime.UtcNow,
                    Reason    = ex.Message,
                    Exception = ex
                });
            }

            return(checkResult);
        }
예제 #8
0
        public static HealthcheckResult RunHealthcheck(string _driveName, double _errorPercentageThreshold, double _warningPercentageThreshold)
        {
            var checkResult = new HealthcheckResult
            {
                LastCheckTime  = DateTime.UtcNow,
                Status         = Customization.HealthcheckStatus.Healthy,
                HealthyMessage = "Log files contain no errors",
                ErrorList      = new ErrorList
                {
                    Entries = new List <ErrorEntry>()
                }
            };

            if (string.IsNullOrEmpty(_driveName))
            {
                checkResult.Status = HealthcheckStatus.Warning;
                checkResult.ErrorList.Entries.Add(ErrorEntry.CreateErrorEntry("DriveName is not configured!"));

                return(checkResult);
            }

            var drives = GetReadyDrives(checkResult);

            if (drives == null)
            {
                checkResult.Status = HealthcheckStatus.Error;
                checkResult.ErrorList.Entries.Add(ErrorEntry.CreateErrorEntry("Error retriving drives info."));

                return(checkResult);
            }
            else if (drives.Count() == 0)
            {
                checkResult.Status = HealthcheckStatus.Error;
                checkResult.ErrorList.Entries.Add(ErrorEntry.CreateErrorEntry("Drives aren't ready."));

                return(checkResult);
            }

            drives = drives.Where(t => t.DriveName.Equals(_driveName, StringComparison.OrdinalIgnoreCase)).ToList();

            if (!drives.Any())
            {
                checkResult.Status = HealthcheckStatus.Warning;
                checkResult.ErrorList.Entries.Add(ErrorEntry.CreateErrorEntry($"Cannot find drive with name: {_driveName}"));

                return(checkResult);
            }

            var errorDrivesCapacity = drives.Where(d => d.PercentageOfFreeSpace < _errorPercentageThreshold);

            if (errorDrivesCapacity.Count() > 0)
            {
                checkResult.Status = HealthcheckStatus.Error;
                checkResult.ErrorList.Entries.Add(ErrorEntry.CreateErrorEntry(CreateStatusMessage(errorDrivesCapacity, $"Drive: {_driveName} is on very low capacity.")));

                return(checkResult);
            }

            var warningDrivesCapacity = drives.Where(d => d.PercentageOfFreeSpace < _warningPercentageThreshold);

            if (warningDrivesCapacity.Count() > 0)
            {
                checkResult.Status = HealthcheckStatus.Warning;
                checkResult.ErrorList.Entries.Add(ErrorEntry.CreateErrorEntry(CreateStatusMessage(warningDrivesCapacity, $"Drive: {_driveName} is on low capacity.")));

                return(checkResult);
            }

            checkResult.Status         = HealthcheckStatus.Healthy;
            checkResult.HealthyMessage = CreateStatusMessage(drives, $"Drive, {_driveName} are in good capacity.");

            return(checkResult);
        }
        public static HealthcheckResult RunHealthcheck(string storeName, string location, string value, string findByTypeName, int warnBefore)
        {
            var checkResult = new HealthcheckResult
            {
                LastCheckTime  = DateTime.UtcNow,
                Status         = Customization.HealthcheckStatus.Healthy,
                HealthyMessage = "Log files contain no errors",
                ErrorList      = new ErrorList
                {
                    Entries = new List <ErrorEntry>()
                }
            };

            if (string.IsNullOrEmpty(storeName) || string.IsNullOrEmpty(location) || string.IsNullOrEmpty(value) || string.IsNullOrEmpty(findByTypeName))
            {
                checkResult.Status = HealthcheckStatus.Warning;
                checkResult.ErrorList.Entries.Add(new ErrorEntry
                {
                    Created   = DateTime.UtcNow,
                    Reason    = "Certificate Check is not configured correctly",
                    Exception = null
                });

                return(checkResult);
            }

            try
            {
                var certificateList = new List <X509Certificate2>();
                var st         = (StoreName)Enum.Parse(typeof(StoreName), storeName);
                var store      = new X509Store(st, (StoreLocation)Enum.Parse(typeof(StoreLocation), location));
                var findByType = (X509FindType)Enum.Parse(typeof(X509FindType), findByTypeName);

                try
                {
                    store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);

                    var cert = store.Certificates.Find(findByType, value, false);
                    if (cert == null || cert.Count == 0)
                    {
                        checkResult.Status = HealthcheckStatus.Error;
                        checkResult.ErrorList.Entries.Add(new ErrorEntry
                        {
                            Created = DateTime.UtcNow,
                            Reason  = string.Format("{0} certificate is missing from {1} {2} {3} store", value, storeName, location, findByTypeName)
                        });
                    }
                    else if (cert.Count > 1)
                    {
                        checkResult.Status = HealthcheckStatus.Error;
                        checkResult.ErrorList.Entries.Add(new ErrorEntry
                        {
                            Created = DateTime.UtcNow,
                            Reason  = string.Format("{0} multiple certificate found from {1} {2} {3} store", value, storeName, location, findByTypeName)
                        });
                    }
                    else
                    {
                        var certificate           = cert[0];
                        var showExpirationWarning = certificate.NotAfter.AddDays(-warnBefore).Date <= DateTime.Now.Date;
                        checkResult.HealthyMessage = "Expiration: " + certificate.NotAfter.ToString("dd/MM/yyyy");

                        if (showExpirationWarning)
                        {
                            checkResult.Status = HealthcheckStatus.Warning;

                            if (certificate.NotAfter.Date < DateTime.Now.Date)
                            {
                                checkResult.Status = HealthcheckStatus.Error;
                                checkResult.ErrorList.Entries.Add(new ErrorEntry
                                {
                                    Created = DateTime.UtcNow,
                                    Reason  = string.Format("{0} certificate expired", value, (certificate.NotAfter - DateTime.Now).Days)
                                });
                            }
                            else
                            {
                                checkResult.ErrorList.Entries.Add(new ErrorEntry
                                {
                                    Created = DateTime.UtcNow,
                                    Reason  = string.Format("{0} certificate will expire in {1} days", value, (certificate.NotAfter - DateTime.Now).Days)
                                });
                            }
                        }
                    }
                }
                finally
                {
                    store?.Close();
                }
            }
            catch (Exception exception)
            {
                checkResult.Status = HealthcheckStatus.Error;
                checkResult.ErrorList.Entries.Add(new ErrorEntry
                {
                    Created   = DateTime.UtcNow,
                    Reason    = exception.Message,
                    Exception = exception
                });
            }

            return(checkResult);
        }
        public static HealthcheckResult RunHealthcheck(string xConnectApiCertificateConnectionStringKey, string xConnectApiConnectionStringKey, int wWarnBefore)
        {
            var checkResult = new HealthcheckResult
            {
                LastCheckTime = DateTime.UtcNow,
                Status        = Customization.HealthcheckStatus.Healthy,
                ErrorList     = new ErrorList
                {
                    Entries = new List <ErrorEntry>()
                }
            };

            checkResult.LastCheckTime = DateTime.UtcNow;
            checkResult.Status        = HealthcheckStatus.Healthy;

            if (!Settings.GetBoolSetting("Xdb.Enabled", false))
            {
                checkResult.Status = HealthcheckStatus.Warning;
                checkResult.ErrorList.Entries.Add(new ErrorEntry
                {
                    Created   = DateTime.UtcNow,
                    Reason    = "Xdb is disabled",
                    Exception = null
                });

                return(checkResult);
            }

            if (string.IsNullOrEmpty(xConnectApiCertificateConnectionStringKey) || string.IsNullOrEmpty(xConnectApiConnectionStringKey))
            {
                checkResult.Status = HealthcheckStatus.Warning;
                checkResult.ErrorList.Entries.Add(new ErrorEntry
                {
                    Created   = DateTime.UtcNow,
                    Reason    = "XConnect API Check is not configured correctly",
                    Exception = null
                });

                return(checkResult);
            }

            if (ConfigurationManager.ConnectionStrings[xConnectApiConnectionStringKey] == null)
            {
                checkResult.Status = HealthcheckStatus.Warning;
                checkResult.ErrorList.Entries.Add(new ErrorEntry
                {
                    Created   = DateTime.UtcNow,
                    Reason    = "Cannot find the XConnect API connectionstring in the config",
                    Exception = null
                });

                return(checkResult);
            }

            if (ConfigurationManager.ConnectionStrings[xConnectApiCertificateConnectionStringKey] == null)
            {
                checkResult.Status = HealthcheckStatus.Warning;
                checkResult.ErrorList.Entries.Add(new ErrorEntry
                {
                    Created   = DateTime.UtcNow,
                    Reason    = "Cannot find the XConnect API Certificate connectionstring in the config",
                    Exception = null
                });

                return(checkResult);
            }

            try
            {
                var certificateConnectionstring = ConfigurationManager.ConnectionStrings[xConnectApiCertificateConnectionStringKey].ConnectionString.Split(';');
                NameValueCollection certDetails = new NameValueCollection();
                foreach (var values in certificateConnectionstring)
                {
                    var parsed = values.Split('=');
                    certDetails.Add(parsed[0], parsed[1]);
                }

                var certificateList = new List <X509Certificate2>();
                var st    = (StoreName)Enum.Parse(typeof(StoreName), certDetails["StoreName"]);
                var store = new X509Store(st, (StoreLocation)Enum.Parse(typeof(StoreLocation), certDetails["StoreLocation"]));
                try
                {
                    store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);

                    var cert = store.Certificates.Find((X509FindType)Enum.Parse(typeof(X509FindType), certDetails["FindType"]), certDetails["FindValue"], false);
                    if (cert == null || cert.Count == 0)
                    {
                        checkResult.Status = HealthcheckStatus.Error;
                        checkResult.ErrorList.Entries.Add(new ErrorEntry
                        {
                            Created = DateTime.UtcNow,
                            Reason  = string.Format("{0} certificate is missing from {1} {2} store", certDetails["FindValue"], certDetails["StoreName"], certDetails["StoreLocation"])
                        });
                    }
                    else if (cert.Count > 1)
                    {
                        checkResult.Status = HealthcheckStatus.Error;
                        checkResult.ErrorList.Entries.Add(new ErrorEntry
                        {
                            Created = DateTime.UtcNow,
                            Reason  = string.Format("{0} multiple certificate found from {1} {2} store", certDetails["FindValue"], certDetails["StoreName"], certDetails["StoreLocation"])
                        });
                    }
                    else
                    {
                        var certificate           = cert[0];
                        var showExpirationWarning = certificate.NotAfter.AddDays(-wWarnBefore).Date <= DateTime.Now.Date;
                        checkResult.HealthyMessage = "Expiration: " + certificate.NotAfter.ToString("dd/MM/yyyy");

                        if (showExpirationWarning)
                        {
                            checkResult.Status = HealthcheckStatus.Warning;

                            if (certificate.NotAfter.Date < DateTime.Now.Date)
                            {
                                checkResult.Status = HealthcheckStatus.Error;
                                checkResult.ErrorList.Entries.Add(new ErrorEntry
                                {
                                    Created = DateTime.UtcNow,
                                    Reason  = string.Format("{0} certificate expired", certDetails["FindValue"], (certificate.NotAfter - DateTime.Now).Days)
                                });
                            }
                            else
                            {
                                checkResult.ErrorList.Entries.Add(new ErrorEntry
                                {
                                    Created = DateTime.UtcNow,
                                    Reason  = string.Format("{0} certificate will expire in {1} days", certDetails["FindValue"], (certificate.NotAfter - DateTime.Now).Days)
                                });
                            }
                        }
                    }

                    HttpClient httpClient = new HttpClient();

                    try
                    {
                        HttpResponseMessage response = new HttpResponseMessage();

                        var certificate = cert[0];

                        WebRequestHandler handler = new WebRequestHandler();
                        handler.ClientCertificates.Add(certificate);

                        httpClient = new HttpClient(handler);

                        var url = ConfigurationManager.ConnectionStrings[xConnectApiConnectionStringKey].ConnectionString.TrimEnd('/');
                        url      = string.Format("{0}/healthz/live", url);
                        response = httpClient.GetAsync(url).Result;

                        if (response.StatusCode != HttpStatusCode.OK)
                        {
                            checkResult.Status = HealthcheckStatus.Error;
                            checkResult.ErrorList.Entries.Add(new ErrorEntry
                            {
                                Created = DateTime.UtcNow,
                                Reason  = $"XConnect API returned with status code: {(int)response.StatusCode} - {response.ReasonPhrase}"
                            });
                        }
                    }
                    catch (Exception exception)
                    {
                        checkResult.Status = HealthcheckStatus.Error;
                        checkResult.ErrorList.Entries.Add(new ErrorEntry
                        {
                            Created   = DateTime.UtcNow,
                            Reason    = exception.Message,
                            Exception = exception
                        });
                    }
                    finally
                    {
                        httpClient.Dispose();
                    }
                }
                finally
                {
                    store?.Close();
                }
            }
            catch (Exception exception)
            {
                checkResult.Status = HealthcheckStatus.Error;
                checkResult.ErrorList.Entries.Add(new ErrorEntry
                {
                    Created   = DateTime.UtcNow,
                    Reason    = exception.Message,
                    Exception = exception
                });
            }

            return(checkResult);
        }