Описание проблемы
Есть ошибки, появление которых можно вычислить заблаговременно. Например, ваше приложение в некоторых случях отправляет пользователю email-письмо. Если в приложении не заданы настройки SMTP шлюза, то очевидно, что письма не отправятся. Поэтому хорошей практикой будет, если приложение периодически будет проверять, всё ли у него есть для корректной работы.
Решение
Необходимо сделать специальную страницу самопроверки, которая будет проверять:
- что все обязательные настройки заданы;
- все сторонние сервисы доступны.
Результатом страницы будет обычный текст с результатом проверок.
Агент системы мониторинга Zidium будет загружать страницу самопроверки раз в 10 минут и проверять,
что все проверки успешно пройдены. Если будет обнаружена ошибка,
компонент WebSite в системе мониторинга станет красным (статус Alarm), и будет отправлено уведомление.
Реализация
Будем считать, что компонент WebSite уже создан в дереве компонентов Вашего аккаунта. Создание компонента WebSite выполнится автоматически, если Вы настроили Zidium.config и выполнили запуск приложения.
Реализуем логику самопроверки в контролере SelfTestController:
/// <summary>
/// Контроллер содержит страницу selftest - страница самопроверки
/// </summary>
public class SelfTestController : Controller
{
/// <summary>
/// Проверяет, что web.config содержит все обязательные настройки
/// </summary>
private void ConfigTest()
{
ConfigHelper.ValidateAppSettings("SmtpHost");
ConfigHelper.ValidateAppSettings("SmtpPort");
}
/// <summary>
/// Проверяет, что есть соединение с БД
/// </summary>
private void SqlTest()
{
// реализуйте проверку самостоятельно
}
/// <summary>
/// Проверяет, что есть соединение с системой мониторинга Zidium
/// </summary>
private void ZidiumTest()
{
var client = Client.Instance;
client.ApiService.GetEcho(Guid.NewGuid().ToString()).Check();
}
/// <summary>
/// Проверяет, что есть соединение с WCF-сервисом
/// </summary>
private void WcfServiceTest()
{
// реализуйте проверку самостоятельно
}
/// <summary>
/// Страница самопроверки проверяет:
/// - web.config содержит все обязательные настройки
/// - есть соединение с базой данных
/// - есть соединение с Zidium
/// - есть соединение с WCF сервисом
/// </summary>
public ActionResult Index()
{
// Здесь можно реализовать какие угодно проверки, чем проверок больше, тем лучше.
var tests = new Dictionary<string, Action>();
tests.Add("ConfigTest", ConfigTest);
tests.Add("SqlTest", SqlTest);
tests.Add("ZidiumTest", ZidiumTest);
tests.Add("WcfServiceTest", WcfServiceTest);
bool success = true;
var log = new StringBuilder();
foreach(var testPair in tests)
{
var testAction = testPair.Value;
var testName = testPair.Key;
log.AppendLine("----------------------------------");
try
{
testAction();
log.AppendLine(testName + ": success");
}
catch (Exception exception)
{
success = false;
log.AppendLine(testName + ": error : " + exception.Message);
}
}
var response = success ? "###### SUCCESS ######" : "###### ERROR ######";
response = response + Environment.NewLine + log.ToString();
return Content(response, "text/plain");
}
}
Если в приложении всё настроено верно и все внешние сервисы доступны, то страница самопроверки вернет следующий результат:
###### SUCCESS ###### ---------------------------------- ConfigTest: success ---------------------------------- SqlTest: success ---------------------------------- ZidiumTest: success ---------------------------------- WcfServiceTest: success
Обратите внимание, что страница самопроверки вернет строку ###### SUCCESS ###### только, если все проверки успешно пройдены.
Теперь создадим системную проверку HTTP для компонента WebSite в системе мониторинга, которая будет выполнятся раз в 10 минут и проверять, что страница самопроверки содержит строку ###### SUCCESS ######.
Выполните действия:
Мы только что создали для компонента WebSite системную проверку HTTP, которая будет выполнять проверку страницы самопроверки. Агент системы мониторинга Zidium поставил данную задачу в очередь на выполнение, и в ближайщее время она будет обработана.
В дереве компонентов у компонента WebSite теперь есть проверка "Страница самопроверки":
Итого:
Теперь каждые 10 минут агент системы мониторинга Zidium будет выполнять проверку страницы самопроверки. В дальнейшем логику страницы самопроверки можно будет совершенствовать, добавлять новые правила проверки, но системную проверку менять не потребуется. Если самопроверка приложения найдет сбой, то компонент WebSite получит статус Alarm, а вам будет отправлено уведомение.