diff --git a/.vscode/tasks.json b/.vscode/tasks.json index c774a2f..2ecc78f 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -50,9 +50,7 @@ "build", "-r", "win-x64", - "${workspaceFolder}/Gatus-to-MonA.csproj", - "/property:GenerateFullPaths=true", - "/consoleloggerparameters:NoSummary" + "${workspaceFolder}/Gatus-to-MonA.csproj" ], "problemMatcher": "$msCompile" }, @@ -64,9 +62,7 @@ "build", "-r", "linux-x64", - "${workspaceFolder}/Gatus-to-MonA.csproj", - "/property:GenerateFullPaths=true", - "/consoleloggerparameters:NoSummary" + "${workspaceFolder}/Gatus-to-MonA.csproj" ], "problemMatcher": "$msCompile" }, @@ -91,9 +87,7 @@ "-c", "Release", "-p:PublishAot=true", - "${workspaceFolder}/Gatus-to-MonA.csproj", - "/property:GenerateFullPaths=true", - "/consoleloggerparameters:NoSummary" + "${workspaceFolder}/Gatus-to-MonA.csproj" ], "problemMatcher": "$msCompile" }, @@ -108,9 +102,7 @@ "-c", "Release", "-p:PublishAot=true", - "${workspaceFolder}/Gatus-to-MonA.csproj", - "/property:GenerateFullPaths=true", - "/consoleloggerparameters:NoSummary" + "${workspaceFolder}/Gatus-to-MonA.csproj" ], "problemMatcher": "$msCompile" }, diff --git a/Gatus-to-MonA.csproj b/Gatus-to-MonA.csproj index f95bae2..99c9ea3 100644 --- a/Gatus-to-MonA.csproj +++ b/Gatus-to-MonA.csproj @@ -16,7 +16,7 @@ - + \ No newline at end of file diff --git a/Helpers/HelperGatusToMona.cs b/Helpers/HelperGatusToMona.cs index 39ba398..bca1f6c 100644 --- a/Helpers/HelperGatusToMona.cs +++ b/Helpers/HelperGatusToMona.cs @@ -15,26 +15,28 @@ internal static partial class HelperGatusToMona { Path.Combine(appSettings.GatusToMonaConfiguration.Directory, appSettings.GatusConfiguration.FileName); internal static void Heartbeat(AppSettings appSettings, IHttpClientFactory httpClientFactory, ILogger logger, State state, CancellationToken cancellationToken) { - _MonIn ??= MonIn.GetInstance(httpClientFactory); CreateEmptyFile(appSettings); - Task httpResponseMessage = _MonIn.SendStatus(appSettings.MonAConfiguration.Site, - appSettings.MonAConfiguration.Resource, - appSettings.MonAConfiguration.StateName, - state); - httpResponseMessage.Wait(cancellationToken); - logger.LogInformation("Line {line}: {OriginalString} => {Resource} : {StateName} ; {state}", - 26, - httpResponseMessage.Result.RequestMessage.RequestUri.OriginalString, - appSettings.MonAConfiguration.Resource, - appSettings.MonAConfiguration.StateName, - state); - if (httpResponseMessage.Result.StatusCode != System.Net.HttpStatusCode.OK) - throw new Exception(httpResponseMessage.Result.StatusCode.ToString()); - Task body = httpResponseMessage.Result.Content.ReadAsStringAsync(cancellationToken); - body.Wait(cancellationToken); - logger.LogInformation("Line {line}: {Result}", - 36, - body.Result); + if (appSettings.MonAConfiguration.Use) { + _MonIn ??= MonIn.GetInstance(httpClientFactory); + Task httpResponseMessage = _MonIn.SendStatus(appSettings.MonAConfiguration.Site, + appSettings.MonAConfiguration.Resource, + appSettings.MonAConfiguration.StateName, + state); + httpResponseMessage.Wait(cancellationToken); + logger.LogInformation("Line {line}: {OriginalString} => {Resource} : {StateName} ; {state}", + 27, + httpResponseMessage.Result.RequestMessage.RequestUri.OriginalString, + appSettings.MonAConfiguration.Resource, + appSettings.MonAConfiguration.StateName, + state); + if (httpResponseMessage.Result.StatusCode != System.Net.HttpStatusCode.OK) + throw new Exception(httpResponseMessage.Result.StatusCode.ToString()); + Task body = httpResponseMessage.Result.Content.ReadAsStringAsync(cancellationToken); + body.Wait(cancellationToken); + logger.LogInformation("Line {line}: {Result}", + 37, + body.Result); + } } private static void CreateEmptyFile(AppSettings appSettings) { @@ -45,22 +47,59 @@ internal static partial class HelperGatusToMona { } internal static bool UpdateCount(AppSettings appSettings, IHttpClientFactory httpClientFactory, ILogger logger, CancellationToken cancellationToken) { - _MonIn ??= MonIn.GetInstance(httpClientFactory); _HttpClient ??= httpClientFactory.CreateClient(); - Heartbeat(appSettings, httpClientFactory, logger, State.Up, cancellationToken); - ReadOnlyCollection successMatches = GetSuccessMatches(appSettings, logger, cancellationToken); - double value = GetValue(appSettings, successMatches); - SendPerformanceMessage(appSettings, logger, value, cancellationToken); + if (appSettings.MonAConfiguration.Use) { + _MonIn ??= MonIn.GetInstance(httpClientFactory); + Heartbeat(appSettings, httpClientFactory, logger, State.Up, cancellationToken); + } + ReadOnlyCollection lines = DownloadThenReadAllLinesMaybeSync(appSettings, logger, cancellationToken); + ReadOnlyCollection successMatches = GetSuccessMatches(appSettings, logger, lines); + double value = (double)GetValue(appSettings, successMatches); + if (appSettings.MonAConfiguration.Use) { + SendPerformanceMessage(appSettings, logger, value, cancellationToken); + } SendPerformanceMessage(appSettings, logger, _HttpClient, value, cancellationToken); return true; } - private static ReadOnlyCollection GetSuccessMatches(AppSettings appSettings, ILogger logger, CancellationToken cancellationToken) { + private static ReadOnlyCollection DownloadThenReadAllLinesMaybeSync(AppSettings appSettings, ILogger logger, CancellationToken cancellationToken) { + string[] results; + string file = GetFile(appSettings); + DownloadLines(appSettings, file, cancellationToken); + results = File.ReadAllLines(file); + if (!string.IsNullOrEmpty(appSettings.GatusToMonaConfiguration.SyncDirectory)) { + string text = string.Join(Environment.NewLine, results); + string path = Path.Combine(appSettings.GatusToMonaConfiguration.SyncDirectory, appSettings.GatusConfiguration.FileName); + try { + if (!Directory.Exists(appSettings.GatusToMonaConfiguration.SyncDirectory)) + _ = Directory.CreateDirectory(appSettings.GatusToMonaConfiguration.SyncDirectory); + File.WriteAllText(path, text); + Directory.SetLastWriteTime(appSettings.GatusToMonaConfiguration.SyncDirectory, DateTime.Now); + } catch (Exception ex) { + logger.LogInformation("Exception {ex}: {ex}", + 80, + $"{ex.Message}{Environment.NewLine}{ex.StackTrace}"); + } + } + return results.AsReadOnly(); + } + + private static void DownloadLines(AppSettings appSettings, string file, CancellationToken cancellationToken) { + FileStream fileStream = new(file, FileMode.Truncate); + HttpClient httpClient = new(); + Task streamTask = httpClient.GetStreamAsync($"{appSettings.GatusConfiguration.BaseUniformResourceLocator}/metrics", cancellationToken); + streamTask.Wait(cancellationToken); + Task task = streamTask.Result.CopyToAsync(fileStream, cancellationToken); + task.Wait(cancellationToken); + fileStream.Dispose(); + streamTask.Dispose(); + httpClient.Dispose(); + } + + private static ReadOnlyCollection GetSuccessMatches(AppSettings appSettings, ILogger logger, ReadOnlyCollection lines) { List results = []; string value; string[] segments; - string file = GetFile(appSettings); - ReadOnlyCollection lines = GetLines(appSettings, file, cancellationToken); foreach (string line in lines) { if (!line.StartsWith(appSettings.GatusConfiguration.Metric)) continue; @@ -73,35 +112,20 @@ internal static partial class HelperGatusToMona { if (value[^1] is not '0' and not '1') continue; logger.LogInformation("Line {line}: {value}", - 76, + 115, value); if (line.EndsWith('1')) results.Add(string.Concat('{', value)); } logger.LogInformation("Line {line}: {results}", - 82, + 121, string.Join(Environment.NewLine, results)); return results.AsReadOnly(); } - private static ReadOnlyCollection GetLines(AppSettings appSettings, string file, CancellationToken cancellationToken) { - string[] results; - FileStream fileStream = new(file, FileMode.Truncate); - HttpClient httpClient = new(); - Task streamTask = httpClient.GetStreamAsync($"{appSettings.GatusConfiguration.BaseUniformResourceLocator}/metrics", cancellationToken); - streamTask.Wait(cancellationToken); - Task task = streamTask.Result.CopyToAsync(fileStream, cancellationToken); - task.Wait(cancellationToken); - fileStream.Dispose(); - streamTask.Dispose(); - httpClient.Dispose(); - results = File.ReadAllLines(file); - return results.AsReadOnly(); - } - - private static double GetValue(AppSettings appSettings, ReadOnlyCollection successMatches) { - double result; - double v = successMatches.Count / appSettings.MonAConfiguration.Expected; + private static decimal GetValue(AppSettings appSettings, ReadOnlyCollection successMatches) { + decimal result; + decimal v = successMatches.Count / appSettings.MonAConfiguration.Expected; result = Math.Round(v, 3) * 100; return result; } @@ -115,7 +139,7 @@ internal static partial class HelperGatusToMona { description: string.Empty); httpResponseMessage.Wait(cancellationToken); logger.LogInformation("Line {line}: {OriginalString} => {Resource} : {performanceName} ; {value}", - 118, + 142, httpResponseMessage.Result.RequestMessage.RequestUri.OriginalString, appSettings.MonAConfiguration.Resource, performanceName, @@ -125,7 +149,7 @@ internal static partial class HelperGatusToMona { Task body = httpResponseMessage.Result.Content.ReadAsStringAsync(cancellationToken); body.Wait(cancellationToken); logger.LogInformation("Line {line}: {Result}", - 128, + 152, body.Result); } @@ -137,7 +161,7 @@ internal static partial class HelperGatusToMona { httpResponseMessage = httpClient.PostAsync($"{appSettings.GatusConfiguration.BaseUniformResourceLocator}/api/v1/endpoints/{appSettings.GatusConfiguration.Key}/external?success={success}&error={error}", null, cancellationToken); httpResponseMessage.Wait(cancellationToken); logger.LogInformation("Line {line}: {OriginalString} => {Resource} : {Key} ; {value}", - 140, + 164, httpResponseMessage.Result.RequestMessage.RequestUri.OriginalString, appSettings.MonAConfiguration.Resource, appSettings.GatusConfiguration.Key, @@ -151,10 +175,10 @@ internal static partial class HelperGatusToMona { httpResponseMessage = httpClient.PostAsync($"{appSettings.GatusToGatusConfiguration.BaseUniformResourceLocator}/api/v1/endpoints/{appSettings.GatusToGatusConfiguration.Key}/external?success={success}&error={error}", null, cancellationToken); httpResponseMessage.Wait(cancellationToken); logger.LogInformation("Line {line}: {OriginalString} => {Resource} : {Key} ; {value}", - 154, + 178, httpResponseMessage.Result.RequestMessage.RequestUri.OriginalString, appSettings.MonAConfiguration.Resource, - appSettings.GatusConfiguration.Key, + appSettings.GatusToGatusConfiguration.Key, value); if (httpResponseMessage.Result.StatusCode != System.Net.HttpStatusCode.OK) throw new Exception(httpResponseMessage.Result.StatusCode.ToString()); diff --git a/Models/GatusToMonaConfiguration.cs b/Models/GatusToMonaConfiguration.cs index 52b392d..a684071 100644 --- a/Models/GatusToMonaConfiguration.cs +++ b/Models/GatusToMonaConfiguration.cs @@ -6,7 +6,8 @@ namespace Gatus.To.MonA.Models; public record GatusToMonaConfiguration(string Company, string Directory, string Helper, - int MillisecondsDelay) { + int MillisecondsDelay, + string? SyncDirectory) { public override string ToString() { string result = JsonSerializer.Serialize(this, GatusToMonaConfigurationSourceGenerationContext.Default.GatusToMonaConfiguration); diff --git a/Models/MonAConfiguration.cs b/Models/MonAConfiguration.cs index f633400..4835d8d 100644 --- a/Models/MonAConfiguration.cs +++ b/Models/MonAConfiguration.cs @@ -3,12 +3,13 @@ using System.Text.Json.Serialization; namespace Gatus.To.MonA.Models; -public record MonAConfiguration(int Expected, +public record MonAConfiguration(decimal Expected, int Minutes, string Resource, string Site, string StateName, - string Suffix) { + string Suffix, + bool Use) { public override string ToString() { string result = JsonSerializer.Serialize(this, MonAConfigurationSourceGenerationContext.Default.MonAConfiguration); diff --git a/Worker.cs b/Worker.cs index 67ffd3d..be130e0 100644 --- a/Worker.cs +++ b/Worker.cs @@ -23,7 +23,7 @@ public partial class Worker : BackgroundService { } public override Task StopAsync(CancellationToken cancellationToken) { - if (_AppSettings.GatusToMonaConfiguration.Helper == nameof(Helpers.HelperGatusToMona)) + if (_AppSettings.GatusToMonaConfiguration.Helper is nameof(Helpers.HelperGatusToMona)) Helpers.HelperGatusToMona.Heartbeat(_AppSettings, _HttpClientFactory, _Logger, Infineon.Monitoring.MonA.State.Down, cancellationToken); return base.StopAsync(cancellationToken); } @@ -31,6 +31,7 @@ public partial class Worker : BackgroundService { private async Task Body(CancellationToken cancellationToken) { if (!_IsWindowsService) { _Logger.LogInformation("Set break point and skip to run {_AppSettings.GatusToMonaConfiguration.Helper}!", _AppSettings.GatusToMonaConfiguration.Helper); + BodyInner(cancellationToken); throw new EvaluateException($"Set break point and skip to run {_AppSettings.GatusToMonaConfiguration.Helper}!"); } if (!_IsWindowsService) {