diff --git a/UKHO.ExchangeSetService.API/UKHO.ExchangeSetService.API/Program.cs b/UKHO.ExchangeSetService.API/UKHO.ExchangeSetService.API/Program.cs index 7ea6ae39b..792b5a598 100644 --- a/UKHO.ExchangeSetService.API/UKHO.ExchangeSetService.API/Program.cs +++ b/UKHO.ExchangeSetService.API/UKHO.ExchangeSetService.API/Program.cs @@ -177,7 +177,6 @@ public static void Main(string[] args) builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); - builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddSingleton(s => new WebJobsAccessKeyProvider(builder.Configuration)); diff --git a/UKHO.ExchangeSetService.API/UKHO.ExchangeSetService.Common.UnitTests/HealthCheck/AzureWebJobsHealthCheckClientTest.cs b/UKHO.ExchangeSetService.API/UKHO.ExchangeSetService.Common.UnitTests/HealthCheck/AzureWebJobsHealthCheckClientTest.cs deleted file mode 100644 index d722db7d1..000000000 --- a/UKHO.ExchangeSetService.API/UKHO.ExchangeSetService.Common.UnitTests/HealthCheck/AzureWebJobsHealthCheckClientTest.cs +++ /dev/null @@ -1,218 +0,0 @@ -using FakeItEasy; -using Microsoft.Extensions.Diagnostics.HealthChecks; -using NUnit.Framework; -using System; -using System.Linq; -using System.Threading.Tasks; -using UKHO.ExchangeSetService.Common.HealthCheck; - -namespace UKHO.ExchangeSetService.Common.UnitTests.HealthCheck -{ - public class AzureWebJobsHealthCheckClientTest - { - private IAzureWebJobsHealthCheckHttpClient fakeAzureWebJobsHealthCheckHttpClient; - private AzureWebJobsHealthCheckClient azureWebJobsHealthCheckClient; - - private static readonly WebJobDetails[] OneJobOneInstance = - { - new() { ExchangeSetType = "small", Instance = 1 } - }; - - private static readonly WebJobDetails[] ThreeJobsTwoInstances = - { - new() { ExchangeSetType = "small", Instance = 1 }, - new() { ExchangeSetType = "small", Instance = 2 }, - new() { ExchangeSetType = "medium", Instance = 1 }, - new() { ExchangeSetType = "medium", Instance = 2 }, - new() { ExchangeSetType = "large", Instance = 1 }, - new() { ExchangeSetType = "large", Instance = 2 } - }; - - private static readonly WebJobDetails[] ThreeJobsOneInstance = - { - new() { ExchangeSetType = "small", Instance = 1 }, - new() { ExchangeSetType = "medium", Instance = 1 }, - new() { ExchangeSetType = "large", Instance = 1 } - }; - - private static readonly WebJobDetails[] MultipleJobsMultipleInstances = - { - new() { ExchangeSetType = "small", Instance = 1 }, - new() { ExchangeSetType = "small", Instance = 2 }, - new() { ExchangeSetType = "medium", Instance = 1 }, - new() { ExchangeSetType = "large", Instance = 1 }, - new() { ExchangeSetType = "xlarge", Instance = 1 } - }; - - private static object[] _webJobsTestData = - { - new object[] { OneJobOneInstance }, - new object[] { ThreeJobsTwoInstances }, - new object[] { ThreeJobsOneInstance }, - new object[] { MultipleJobsMultipleInstances } - }; - - [SetUp] - public void Setup() - { - this.fakeAzureWebJobsHealthCheckHttpClient = A.Fake(); - - azureWebJobsHealthCheckClient = - new AzureWebJobsHealthCheckClient(fakeAzureWebJobsHealthCheckHttpClient); - } - - [TestCaseSource(nameof(_webJobsTestData))] - public async Task WhenAllInstancesAreHealthy_ThenReturnHealthy(WebJobDetails[] webJobs) - { - A.CallTo(() => fakeAzureWebJobsHealthCheckHttpClient.CheckHealth(A.Ignored)) - .Returns(new HealthCheckResult(HealthStatus.Healthy, "Azure webjob is healthy")); - - var result = await azureWebJobsHealthCheckClient.CheckAllWebJobsHealth(webJobs.ToList()); - - Assert.AreEqual(HealthCheckResult.Healthy().Status, result.Status); - } - - [TestCaseSource(nameof(_webJobsTestData))] - public async Task WhenAllInstancesAreUnHealthy_ThenReturnUnHealthy(WebJobDetails[] webJobs) - { - A.CallTo(() => fakeAzureWebJobsHealthCheckHttpClient.CheckHealth(A.Ignored)) - .Returns(new HealthCheckResult(HealthStatus.Unhealthy, "Azure webjob is unhealthy")); - - var result = await azureWebJobsHealthCheckClient.CheckAllWebJobsHealth(webJobs.ToList()); - - Assert.AreEqual(HealthCheckResult.Unhealthy().Status, result.Status); - } - - [Test] - public async Task WhenHealthCheckThrowsException_ThenReturnUnHealthy() - { - - A.CallTo(() => fakeAzureWebJobsHealthCheckHttpClient.CheckHealth(A.Ignored)) - .ThrowsAsync(new Exception("")); - - var result = await azureWebJobsHealthCheckClient.CheckAllWebJobsHealth(OneJobOneInstance.ToList()); - - Assert.AreEqual(HealthCheckResult.Unhealthy().Status, result.Status); - } - - [Test] - public async Task WhenAllInstancesOfOneTypeAreUnHealthy_ThenReturnUnhealthy() - { - var description1 = "Azure small webjob, instance 1 is unhealthy"; - var description2 = "Azure small webjob, instance 2 is unhealthy"; - var message1 = "error 1"; - var message2 = "error 2"; - - var expected = new HealthCheckResult(HealthStatus.Unhealthy, - string.Join(", ", description1, description2), - new Exception(string.Join(", ", message1, message2))); - - A.CallTo(() => fakeAzureWebJobsHealthCheckHttpClient.CheckHealth( - A.That.Matches( - j => j.ExchangeSetType == "small" && j.Instance == 1))) - .Returns(Task.FromResult(new HealthCheckResult(HealthStatus.Unhealthy, description1, new Exception(message1)))); - - A.CallTo(() => fakeAzureWebJobsHealthCheckHttpClient.CheckHealth( - A.That.Matches( - j => j.ExchangeSetType == "small" && j.Instance == 2))) - .Returns(Task.FromResult(new HealthCheckResult(HealthStatus.Unhealthy, description2, new Exception(message2)))); - - A.CallTo(() => fakeAzureWebJobsHealthCheckHttpClient.CheckHealth(A.That.Matches(j => j.ExchangeSetType != "small"))) - .Returns(Task.FromResult(new HealthCheckResult(HealthStatus.Healthy, - "Azure webjob is healthy"))); - - var result = await azureWebJobsHealthCheckClient.CheckAllWebJobsHealth(ThreeJobsTwoInstances.ToList()); - - Assert.AreEqual(expected.Status, result.Status); - Assert.AreEqual(expected.Description, result.Description); - Assert.AreEqual(expected.Exception?.Message, result.Exception?.Message); - } - - [Test] - public async Task WhenOneInstanceIsUnhealthyAndOtherIsHealthy_ThenReturnDegraded() - { - var description1 = "Azure small webjob, instance 1 is unhealthy"; - var message1 = "error 1"; - - var expected = new HealthCheckResult(HealthStatus.Degraded, - description1, new Exception(message1)); - - // Type: small, Instance: 1, Unhealthy - A.CallTo(() => fakeAzureWebJobsHealthCheckHttpClient.CheckHealth( - A.That.Matches( - j => j.ExchangeSetType == "small" && j.Instance == 1))) - .Returns(Task.FromResult(new HealthCheckResult(HealthStatus.Unhealthy, description1, new Exception(message1)))); - - // Type: small, Instance: 2, Healthy - A.CallTo(() => fakeAzureWebJobsHealthCheckHttpClient.CheckHealth( - A.That.Matches( - j => j.ExchangeSetType == "small" && j.Instance == 2))) - .Returns(Task.FromResult(new HealthCheckResult(HealthStatus.Healthy, - "Azure webjob is healthy"))); - - // Rest are healthy - A.CallTo(() => fakeAzureWebJobsHealthCheckHttpClient.CheckHealth( - A.That.Matches(j => j.ExchangeSetType != "small"))) - .Returns(Task.FromResult(new HealthCheckResult(HealthStatus.Healthy, - "Azure webjob is healthy"))); - - var result = await azureWebJobsHealthCheckClient.CheckAllWebJobsHealth(ThreeJobsTwoInstances.ToList()); - - Assert.AreEqual(expected.Status, result.Status); - Assert.AreEqual(expected.Description, result.Description); - Assert.AreEqual(expected.Exception?.Message, result.Exception?.Message); - } - - [Test] - public async Task WhenOneSmallInstanceIsUnhealthySecondIsHealthyAndAllMediumAreUnhealthy_ThenReturnUnhealthy() - { - var descriptionS1 = "Azure small webjob, instance 1 is unhealthy"; - var messageS1 = "error 1"; - - var descriptionM1 = "Azure medium webjob, instance 1 is unhealthy"; - var messageM1 = "error 1"; - - var descriptionM2 = "Azure medium webjob, instance 2 is unhealthy"; - var messageM2 = "error 2"; - - var expected = new HealthCheckResult(HealthStatus.Unhealthy, - string.Join(", ", descriptionM1, descriptionM2, descriptionS1), - new Exception(string.Join(", ", messageM1, messageM2, messageS1))); - - // Type: small, Instance: 1, Unhealthy - A.CallTo(() => fakeAzureWebJobsHealthCheckHttpClient.CheckHealth( - A.That.Matches( - j => j.ExchangeSetType == "small" && j.Instance == 1))) - .Returns(Task.FromResult(new HealthCheckResult(HealthStatus.Unhealthy, descriptionS1, new Exception(messageS1)))); - - // Type: small, Instance: 2, Healthy - A.CallTo(() => fakeAzureWebJobsHealthCheckHttpClient.CheckHealth( - A.That.Matches( - j => j.ExchangeSetType == "small" && j.Instance == 2))) - .Returns(Task.FromResult(new HealthCheckResult(HealthStatus.Healthy, - "Azure webjob is healthy"))); - - // Type: medium, Instance: 1, Unhealthy - A.CallTo(() => fakeAzureWebJobsHealthCheckHttpClient.CheckHealth( - A.That.Matches(j => j.ExchangeSetType == "medium" && j.Instance == 1))) - .Returns(Task.FromResult(new HealthCheckResult(HealthStatus.Unhealthy, descriptionM1, new Exception(messageM1)))); - - // Type: medium, Instance: 2, Unhealthy - A.CallTo(() => fakeAzureWebJobsHealthCheckHttpClient.CheckHealth( - A.That.Matches(j => j.ExchangeSetType == "medium" && j.Instance == 2))) - .Returns(Task.FromResult(new HealthCheckResult(HealthStatus.Unhealthy, descriptionM2, new Exception(messageM2)))); - - // All Large are healthy - A.CallTo(() => fakeAzureWebJobsHealthCheckHttpClient.CheckHealth( - A.That.Matches(j => j.ExchangeSetType == "large"))) - .Returns(Task.FromResult(new HealthCheckResult(HealthStatus.Healthy, - "Azure webjob is healthy"))); - - var result = await azureWebJobsHealthCheckClient.CheckAllWebJobsHealth(ThreeJobsTwoInstances.ToList()); - - Assert.AreEqual(expected.Status, result.Status); - Assert.AreEqual(expected.Description, result.Description); - Assert.AreEqual(expected.Exception?.Message, result.Exception?.Message); - } - } -} diff --git a/UKHO.ExchangeSetService.API/UKHO.ExchangeSetService.Common.UnitTests/HealthCheck/AzureWebJobsHealthCheckTest.cs b/UKHO.ExchangeSetService.API/UKHO.ExchangeSetService.Common.UnitTests/HealthCheck/AzureWebJobsHealthCheckTest.cs index 2b9cabe83..d68221579 100644 --- a/UKHO.ExchangeSetService.API/UKHO.ExchangeSetService.Common.UnitTests/HealthCheck/AzureWebJobsHealthCheckTest.cs +++ b/UKHO.ExchangeSetService.API/UKHO.ExchangeSetService.Common.UnitTests/HealthCheck/AzureWebJobsHealthCheckTest.cs @@ -44,16 +44,6 @@ public async Task WhenAzureWebJobStatusIsNotRunning_ThenAzureWebJobsIsUnhealthy( Assert.AreEqual(HealthStatus.Unhealthy, response.Status); } - [Test] - public async Task WhenAzureWebJobStatusIsDegraded_ThenReturnDegraded() - { - A.CallTo(() => fakeAzureWebJobsHealthCheckService.CheckHealthAsync(A.Ignored)).Returns(new HealthCheckResult(HealthStatus.Degraded, "Azure webjob is unhealthy", new Exception("Azure webjob is unhealthy"))); - - var response = await azureWebJobsHealthCheck.CheckHealthAsync(new HealthCheckContext()); - - Assert.AreEqual(HealthStatus.Degraded, response.Status); - } - [Test] public async Task WhenCheckHealthAsyncThrowException_ThenReturnUnhealthy() { diff --git a/UKHO.ExchangeSetService.API/UKHO.ExchangeSetService.Common/HealthCheck/AzureWebJobsHealthCheck.cs b/UKHO.ExchangeSetService.API/UKHO.ExchangeSetService.Common/HealthCheck/AzureWebJobsHealthCheck.cs index eaab7c0ed..0348f0a54 100644 --- a/UKHO.ExchangeSetService.API/UKHO.ExchangeSetService.Common/HealthCheck/AzureWebJobsHealthCheck.cs +++ b/UKHO.ExchangeSetService.API/UKHO.ExchangeSetService.Common/HealthCheck/AzureWebJobsHealthCheck.cs @@ -28,10 +28,6 @@ public async Task CheckHealthAsync(HealthCheckContext context { logger.LogDebug(EventIds.AzureWebJobIsHealthy.ToEventId(), "Azure webjob is healthy"); } - else if (healthCheckResult.Status == HealthStatus.Degraded) - { - logger.LogWarning(EventIds.AzureWebJobIsDegraded.ToEventId(), "Azure webjob is degraded"); - } else { logger.LogError(EventIds.AzureWebJobIsUnhealthy.ToEventId(), healthCheckResult.Exception, "Azure webjob is unhealthy with error {Message}", healthCheckResult.Exception.Message); diff --git a/UKHO.ExchangeSetService.API/UKHO.ExchangeSetService.Common/HealthCheck/AzureWebJobsHealthCheckClient.cs b/UKHO.ExchangeSetService.API/UKHO.ExchangeSetService.Common/HealthCheck/AzureWebJobsHealthCheckClient.cs index d747dd695..c2edce7d2 100644 --- a/UKHO.ExchangeSetService.API/UKHO.ExchangeSetService.Common/HealthCheck/AzureWebJobsHealthCheckClient.cs +++ b/UKHO.ExchangeSetService.API/UKHO.ExchangeSetService.Common/HealthCheck/AzureWebJobsHealthCheckClient.cs @@ -1,64 +1,61 @@ -using Microsoft.Extensions.Diagnostics.HealthChecks; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Diagnostics.HealthChecks; +using Newtonsoft.Json; using System; -using System.Collections.Concurrent; using System.Collections.Generic; -using System.Linq; +using System.Diagnostics.CodeAnalysis; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Threading; using System.Threading.Tasks; namespace UKHO.ExchangeSetService.Common.HealthCheck { + [ExcludeFromCodeCoverage] public class AzureWebJobsHealthCheckClient : IAzureWebJobsHealthCheckClient { - private readonly IAzureWebJobsHealthCheckHttpClient azureWebJobsHealthCheckHttpClient; - - public AzureWebJobsHealthCheckClient(IAzureWebJobsHealthCheckHttpClient azureWebJobsHealthCheckHttpClient) + static HttpClient httpClient = new HttpClient(); + private readonly IWebHostEnvironment webHostEnvironment; + + public AzureWebJobsHealthCheckClient(IWebHostEnvironment webHostEnvironment) { - this.azureWebJobsHealthCheckHttpClient = azureWebJobsHealthCheckHttpClient; + this.webHostEnvironment = webHostEnvironment; } - public async Task CheckAllWebJobsHealth(List webJobs) { try { - var jobsHealthCheckResults = new ConcurrentBag<(WebJobDetails webJobDetails, HealthCheckResult healthCheckResult)>(); - - await Parallel.ForEachAsync(webJobs, async (job, token) => + string webJobDetail, webJobStatus = string.Empty; + foreach (var webJob in webJobs) { - jobsHealthCheckResults.Add(new (job, await azureWebJobsHealthCheckHttpClient.CheckHealth(job))); - }); - - return GetHealthStatus(jobsHealthCheckResults); + using var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, webJob.WebJobUri); + httpClient.DefaultRequestHeaders.Accept.Clear(); + httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", webJob.UserPassword); + var response = await httpClient.SendAsync(httpRequestMessage, HttpCompletionOption.ResponseHeadersRead, CancellationToken.None); + + if (response.StatusCode == HttpStatusCode.OK) + { + var webJobDetails = JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync()); + webJobStatus = webJobDetails["status"]; + if (webJobStatus != "Running") + { + webJobDetail = $"Webjob ess-{webHostEnvironment.EnvironmentName}-{webJob.ExchangeSetType}-{webJob.Instance} status is {webJobStatus}"; + return HealthCheckResult.Unhealthy("Azure webjob is unhealthy", new Exception(webJobDetail)); + } + } + else + { + return HealthCheckResult.Unhealthy("Azure webjob is unhealthy", new Exception($"Webjob ess-{webHostEnvironment.EnvironmentName}-{webJob.ExchangeSetType}-{webJob.Instance} status code is {response.StatusCode}")); + } + } + return HealthCheckResult.Healthy("Azure webjob is healthy"); } catch (Exception ex) { return HealthCheckResult.Unhealthy("Azure webjob is unhealthy", new Exception(ex.Message)); } } - - private HealthCheckResult GetHealthStatus(ConcurrentBag<(WebJobDetails webJobDetails, HealthCheckResult healthCheckResult)> healthCheckResults) - { - if (healthCheckResults.All(h => h.healthCheckResult.Status == HealthStatus.Healthy)) - return healthCheckResults.First().healthCheckResult; - - var unhealthyResults = healthCheckResults - .Where(h => h.healthCheckResult.Status != HealthStatus.Healthy) - .OrderBy(a => a.webJobDetails.ExchangeSetType) - .ThenBy(a => a.webJobDetails.Instance) - .ToList(); - - var description = string.Join(", ", unhealthyResults - .Select(h => h.healthCheckResult.Description)); - - var message = string.Join(", ", unhealthyResults - .Select(h => h.healthCheckResult.Exception?.Message)); - - var allUnhealthyInstancesOfSameType = healthCheckResults - .GroupBy(w => w.Item1.ExchangeSetType) - .Where(a => a.All(x => x.Item2.Status == HealthStatus.Unhealthy)); - - return allUnhealthyInstancesOfSameType.Any() - ? HealthCheckResult.Unhealthy(description, new Exception(message)) - : HealthCheckResult.Degraded(description, new Exception(message)); - } } } \ No newline at end of file diff --git a/UKHO.ExchangeSetService.API/UKHO.ExchangeSetService.Common/HealthCheck/AzureWebJobsHealthCheckHttpClient.cs b/UKHO.ExchangeSetService.API/UKHO.ExchangeSetService.Common/HealthCheck/AzureWebJobsHealthCheckHttpClient.cs deleted file mode 100644 index 662ecaaca..000000000 --- a/UKHO.ExchangeSetService.API/UKHO.ExchangeSetService.Common/HealthCheck/AzureWebJobsHealthCheckHttpClient.cs +++ /dev/null @@ -1,58 +0,0 @@ -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Diagnostics.HealthChecks; -using Newtonsoft.Json; -using System; -using System.Diagnostics.CodeAnalysis; -using System.Net; -using System.Net.Http; -using System.Net.Http.Headers; -using System.Threading; -using System.Threading.Tasks; - -namespace UKHO.ExchangeSetService.Common.HealthCheck -{ - [ExcludeFromCodeCoverage] - public class AzureWebJobsHealthCheckHttpClient : IAzureWebJobsHealthCheckHttpClient - { - static HttpClient httpClient = new HttpClient(); - private readonly IWebHostEnvironment webHostEnvironment; - - public AzureWebJobsHealthCheckHttpClient(IWebHostEnvironment webHostEnvironment) - { - this.webHostEnvironment = webHostEnvironment; - } - - public async Task CheckHealth(WebJobDetails webJobDetails) - { - try - { - using var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, webJobDetails.WebJobUri); - httpClient.DefaultRequestHeaders.Accept.Clear(); - httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); - httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", webJobDetails.UserPassword); - var response = await httpClient.SendAsync(httpRequestMessage, HttpCompletionOption.ResponseHeadersRead, CancellationToken.None); - - if (response.StatusCode == HttpStatusCode.OK) - { - var webJobHealthResponse = JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync()); - var webJobStatus = webJobHealthResponse?["status"]; - if (webJobStatus != "Running") - { - var webJobDetail = $"Webjob ess-{webHostEnvironment.EnvironmentName}-{webJobDetails.ExchangeSetType}-{webJobDetails.Instance} status is {webJobStatus}"; - return HealthCheckResult.Unhealthy("Azure webjob is unhealthy", new Exception(webJobDetail)); - } - } - else - { - return HealthCheckResult.Unhealthy("Azure webjob is unhealthy", new Exception($"Webjob ess-{webHostEnvironment.EnvironmentName}-{webJobDetails.ExchangeSetType}-{webJobDetails.Instance} status code is {response.StatusCode}")); - } - - return HealthCheckResult.Healthy(); - } - catch (Exception ex) - { - return HealthCheckResult.Unhealthy("Azure webjob is unhealthy", new Exception(ex.Message)); - } - } - } -} diff --git a/UKHO.ExchangeSetService.API/UKHO.ExchangeSetService.Common/HealthCheck/IAzureWebJobsHealthCheckHttpClient.cs b/UKHO.ExchangeSetService.API/UKHO.ExchangeSetService.Common/HealthCheck/IAzureWebJobsHealthCheckHttpClient.cs deleted file mode 100644 index 213250c66..000000000 --- a/UKHO.ExchangeSetService.API/UKHO.ExchangeSetService.Common/HealthCheck/IAzureWebJobsHealthCheckHttpClient.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Microsoft.Extensions.Diagnostics.HealthChecks; -using System.Threading.Tasks; - -namespace UKHO.ExchangeSetService.Common.HealthCheck -{ - public interface IAzureWebJobsHealthCheckHttpClient - { - public Task CheckHealth(WebJobDetails webJobDetails); - } -} diff --git a/UKHO.ExchangeSetService.API/UKHO.ExchangeSetService.Common/Logging/EventIds.cs b/UKHO.ExchangeSetService.API/UKHO.ExchangeSetService.Common/Logging/EventIds.cs index 420ee5b6c..964e3d817 100644 --- a/UKHO.ExchangeSetService.API/UKHO.ExchangeSetService.Common/Logging/EventIds.cs +++ b/UKHO.ExchangeSetService.API/UKHO.ExchangeSetService.Common/Logging/EventIds.cs @@ -4,7 +4,7 @@ namespace UKHO.ExchangeSetService.Common.Logging { public enum EventIds { - /*Event id range for ESS - 805000 to 805172 */ + /*Event id range for ESS - 805000 to 805122 */ /// /// 805000 - Request for sales catalogue service products sincedatetime endpoint is started. /// @@ -692,11 +692,7 @@ public enum EventIds /// /// 805171 - ENC update csv file not created /// - ENCupdateCSVFileIsNotCreated = 805171, - /// - /// 805172 - Azure web job for exchange set service is degraded. - /// - AzureWebJobIsDegraded = 805172 + ENCupdateCSVFileIsNotCreated = 805171 } public static class EventIdExtensions