Heartbeat before each performance message
Updated readme
This commit is contained in:
		
							
								
								
									
										3
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							| @ -10,6 +10,7 @@ | ||||
|     "**/node_modules": true | ||||
|   }, | ||||
|   "cSpell.words": [ | ||||
|     "Gatus" | ||||
|     "Gatus", | ||||
|     "Infineon" | ||||
|   ] | ||||
| } | ||||
| @ -16,7 +16,7 @@ | ||||
|     <PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.1" /> | ||||
|     <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="8.0.1" /> | ||||
|     <PackageReference Include="Microsoft.Extensions.Logging.EventLog" Version="8.0.1" /> | ||||
|     <PackageReference Include="runtime.win-x64.Microsoft.DotNet.ILCompiler" Version="8.0.14" /> | ||||
|     <PackageReference Include="runtime.win-x64.Microsoft.DotNet.ILCompiler" Version="8.0.15" /> | ||||
|     <PackageReference Include="System.Text.Json" Version="9.0.2" /> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
| @ -12,7 +12,39 @@ internal static partial class HelperGatusToMona { | ||||
|     private static string GetFile(AppSettings appSettings) => | ||||
|         Path.Combine(appSettings.GatusToMonaConfiguration.Directory, appSettings.GatusConfiguration.FileName); | ||||
|  | ||||
|     internal static bool UpdateCount(AppSettings appSettings, ILogger<Worker> logger, CancellationToken cancellationToken) { | ||||
|     internal static void Heartbeat(AppSettings appSettings, IHttpClientFactory httpClientFactory, ILogger<Worker> logger, State state, CancellationToken cancellationToken) { | ||||
|         _MonIn ??= MonIn.GetInstance(httpClientFactory); | ||||
|         CreateEmptyFile(appSettings); | ||||
|         Task<HttpResponseMessage> httpResponseMessage = _MonIn.SendStatus(appSettings.MonAConfiguration.Site, | ||||
|                                                                           appSettings.MonAConfiguration.Resource, | ||||
|                                                                           appSettings.MonAConfiguration.StateName, | ||||
|                                                                           state); | ||||
|         httpResponseMessage.Wait(cancellationToken); | ||||
|         logger.LogInformation("Line {line}: {OriginalString} => {Resource} : {StateName} ; {state}", | ||||
|                               99, | ||||
|                               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<string> body = httpResponseMessage.Result.Content.ReadAsStringAsync(cancellationToken); | ||||
|         body.Wait(cancellationToken); | ||||
|         logger.LogInformation("Line {line}: {Result}", | ||||
|                               10, | ||||
|                               body.Result); | ||||
|     } | ||||
|  | ||||
|     private static void CreateEmptyFile(AppSettings appSettings) { | ||||
|         if (!Directory.Exists(appSettings.GatusToMonaConfiguration.Directory)) | ||||
|             _ = Directory.CreateDirectory(appSettings.GatusToMonaConfiguration.Directory); | ||||
|         string file = GetFile(appSettings); | ||||
|         File.WriteAllText(file, string.Empty); | ||||
|     } | ||||
|  | ||||
|     internal static bool UpdateCount(AppSettings appSettings, IHttpClientFactory httpClientFactory, ILogger<Worker> logger, CancellationToken cancellationToken) { | ||||
|         _MonIn ??= MonIn.GetInstance(httpClientFactory); | ||||
|         Heartbeat(appSettings, httpClientFactory, logger, State.Up, cancellationToken); | ||||
|         ReadOnlyCollection<string> successMatches = GetSuccessMatches(appSettings, logger, cancellationToken); | ||||
|         SendPerformanceMessage(appSettings, logger, successMatches, cancellationToken); | ||||
|         return true; | ||||
| @ -35,10 +67,15 @@ internal static partial class HelperGatusToMona { | ||||
|                 continue; | ||||
|             if (value[^1] is not '0' and not '1') | ||||
|                 continue; | ||||
|             logger.LogDebug(value); | ||||
|             logger.LogInformation("Line {line}: {value}", | ||||
|                                   39, | ||||
|                                   value); | ||||
|             if (line.EndsWith('1')) | ||||
|                 results.Add(string.Concat('{', value)); | ||||
|         } | ||||
|         logger.LogInformation("Line {line}: {results}", | ||||
|                               45, | ||||
|                               string.Join(Environment.NewLine, results)); | ||||
|         return results.AsReadOnly(); | ||||
|     } | ||||
|  | ||||
| @ -67,33 +104,19 @@ internal static partial class HelperGatusToMona { | ||||
|                                                                                       value, | ||||
|                                                                                       description: string.Empty); | ||||
|         httpResponseMessage.Wait(cancellationToken); | ||||
|         logger.LogInformation("Line {line}: {OriginalString} => {Resource} : {performanceName} ; {value}", | ||||
|                               76, | ||||
|                               httpResponseMessage.Result.RequestMessage.RequestUri.OriginalString, | ||||
|                               appSettings.MonAConfiguration.Resource, | ||||
|                               performanceName, | ||||
|                               value); | ||||
|         if (httpResponseMessage.Result.StatusCode != System.Net.HttpStatusCode.OK) | ||||
|             throw new Exception(httpResponseMessage.Result.StatusCode.ToString()); | ||||
|         Task<string> body = httpResponseMessage.Result.Content.ReadAsStringAsync(cancellationToken); | ||||
|         body.Wait(cancellationToken); | ||||
|         logger.LogDebug(body.Result); | ||||
|     } | ||||
|  | ||||
|     internal static void Heartbeat(AppSettings appSettings, IHttpClientFactory httpClientFactory, ILogger<Worker> logger, State state, CancellationToken cancellationToken) { | ||||
|         _MonIn ??= MonIn.GetInstance(httpClientFactory); | ||||
|         CreateEmptyFile(appSettings); | ||||
|         Task<HttpResponseMessage> httpResponseMessage = _MonIn.SendStatus(appSettings.MonAConfiguration.Site, | ||||
|                                                                           appSettings.MonAConfiguration.Resource, | ||||
|                                                                           appSettings.MonAConfiguration.StateName, | ||||
|                                                                           state); | ||||
|         httpResponseMessage.Wait(cancellationToken); | ||||
|         if (httpResponseMessage.Result.StatusCode != System.Net.HttpStatusCode.OK) | ||||
|             throw new Exception(httpResponseMessage.Result.StatusCode.ToString()); | ||||
|         Task<string> body = httpResponseMessage.Result.Content.ReadAsStringAsync(cancellationToken); | ||||
|         body.Wait(cancellationToken); | ||||
|         logger.LogDebug(body.Result); | ||||
|     } | ||||
|  | ||||
|     private static void CreateEmptyFile(AppSettings appSettings) { | ||||
|         if (!Directory.Exists(appSettings.GatusToMonaConfiguration.Directory)) | ||||
|             _ = Directory.CreateDirectory(appSettings.GatusToMonaConfiguration.Directory); | ||||
|         string file = GetFile(appSettings); | ||||
|         File.WriteAllText(file, string.Empty); | ||||
|         logger.LogInformation("Line {line}: {Result}", | ||||
|                               86, | ||||
|                               body.Result); | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										166
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										166
									
								
								README.md
									
									
									
									
									
								
							| @ -1,20 +1,154 @@ | ||||
| # Introduction  | ||||
| TODO: Give a short introduction of your project. Let this section explain the objectives or the motivation behind this project.  | ||||
| --- | ||||
| created: 2024-11-07T00:14:29.000Z | ||||
| type: note | ||||
| --- | ||||
|  | ||||
| # Getting Started | ||||
| TODO: Guide users through getting your code up and running on their own system. In this section you can talk about: | ||||
| 1.	Installation process | ||||
| 2.	Software dependencies | ||||
| 3.	Latest releases | ||||
| 4.	API references | ||||
| # Gatus | ||||
|  | ||||
| # Build and Test | ||||
| TODO: Describe and show how to build your code and run the tests.  | ||||
| Gatus is an advanced automated status page that lets you monitor your applications and configure alerts to notify you if there's an issue | ||||
|  | ||||
| # Contribute | ||||
| TODO: Explain how other users and developers can contribute to make your code better.  | ||||
| ## Links | ||||
|  | ||||
| If you want to learn more about creating good readme files then refer the following [guidelines](https://docs.microsoft.com/en-us/azure/devops/repos/git/create-a-readme?view=azure-devops). You can also seek inspiration from the below readme files: | ||||
| - [ASP.NET Core](https://github.com/aspnet/Home) | ||||
| - [Visual Studio Code](https://github.com/Microsoft/vscode) | ||||
| - [Chakra Core](https://github.com/Microsoft/ChakraCore) | ||||
| - [gatus.io](https://gatus.io/) | ||||
| - [github](https://github.com/TwiN/gatus) | ||||
| - [techno-tim](https://technotim.live/posts/gatus-uptime-monitoring/#gatus-config) | ||||
|  | ||||
| ## Install | ||||
|  | ||||
| - [ ] CasaOS | ||||
| - [x] Docker | ||||
| - [ ] Home Assistant | ||||
| - [ ] lxc | ||||
| - [ ] Snap | ||||
| - [ ] TTeck | ||||
| - [ ] Umbrel | ||||
| - [ ] Yu No Host | ||||
|  | ||||
| ## Gatus | ||||
|  | ||||
| - Clone repo from github or local ADO | ||||
| - Build using go lang | ||||
| - Copy exe only to server | ||||
| - Create *.yaml file for configuration | ||||
|  | ||||
| ## NSSM - the Non-Sucking Service Manager | ||||
|  | ||||
| - Copy zip to server and extract to directory | ||||
| - Run a cmd window with administrator access | ||||
|  | ||||
| ### ecFIsysadmin-10.95.140.37-messa010ec(OI-Metrology-Viewer) | ||||
|  | ||||
| ```bash 1744999536292 = 638805963362920000 = 2025-1.Spring = Fri Apr 18 2025 11:05:35 GMT-0700 (Mountain Standard Time) | ||||
| mklink /J "D:\web-sites\Gatus\current" "D:\web-sites\Gatus\v5.17.0" | ||||
| ``` | ||||
|  | ||||
| ```bash 1744999568664 = 638805963686640000 = 2025-1.Spring = Fri Apr 18 2025 11:06:08 GMT-0700 (Mountain Standard Time) | ||||
| # cd "C:\Users\ecfisysadmin\AppData\Local\IFXApps\nssm-2.24\win64" | ||||
| C: | ||||
| cd "C:\Windows\System32\config\systemprofile\AppData\Local\IFXApps\nssm-2.24\win64" | ||||
| nssm install gatus | ||||
| nssm edit gatus | ||||
| ``` | ||||
|  | ||||
| ```yaml NSSM-Application 1743806212388 = 638794030123880000 = 2025-1.Spring = Fri Apr 04 2025 15:36:51 GMT-0700 (Mountain Standard Time) | ||||
| Path: D:\web-sites\Gatus\current\gatus.exe | ||||
| Startup Directory: D:\web-sites\Gatus\current | ||||
| ``` | ||||
|  | ||||
| ```yml NSSM-Details 1743806328796 = 638794031287960000 = 2025-1.Spring = Fri Apr 04 2025 15:38:48 GMT-0700 (Mountain Standard Time) | ||||
| Startup type: Automatic (Delay Start) | ||||
| ``` | ||||
|  | ||||
| ```yml NSSM-I/O 1743806328796 = 638794031287960000 = 2025-1.Spring = Fri Apr 04 2025 15:38:48 GMT-0700 (Mountain Standard Time) | ||||
| Input (stdin): | ||||
| Output (stdout): D:\web-sites\Gatus\current\logs\service.out.log | ||||
| Error (stderr): D:\web-sites\Gatus\current\logs\service.error.log | ||||
| ``` | ||||
|  | ||||
| ```yml NSSM-Environment 1743806359765 = 638794031597650000 = 2025-1.Spring = Fri Apr 04 2025 15:39:19 GMT-0700 (Mountain Standard Time) | ||||
| GATUS_CONFIG_PATH=./oi-metrology-viewer.yaml | ||||
| ``` | ||||
|  | ||||
| ```bash Administrator 1743806328796 = 638794031287960000 = 2025-1.Spring = Fri Apr 04 2025 15:38:48 GMT-0700 (Mountain Standard Time) | ||||
| sc start gatus | ||||
| sc query gatus | ||||
| sc stop gatus | ||||
| sc start gatus | ||||
| # systemctl start gatus | ||||
| ``` | ||||
|  | ||||
| ```bash 1745023773786 = 638806205737860000 = 2025-1.Spring = Fri Apr 18 2025 17:49:33 GMT-0700 (Mountain Standard Time) | ||||
| mklink /J "D:\web-sites\Gatus\.Gatus-to-MonA" "C:\Windows\System32\config\systemProfile\AppData\Local\IFXApps\Gatus-to-MonA" | ||||
| mkdir "D:/Tmp/Gatus-to-MonA" | ||||
| ``` | ||||
|  | ||||
| ## Nginx | ||||
|  | ||||
| - Add new server to proxy pass to 8081 | ||||
| - Test nginx | ||||
| - Restart nginx | ||||
|  | ||||
| ## MonA | ||||
|  | ||||
| - Create generic resource type | ||||
| - On overview page click edit then click update without making any changes | ||||
| - Wait a hour | ||||
| - On data page click Edit Resource Name then click update without making any changes | ||||
| - Wait a day | ||||
| - On overview page click use for main status (Heartbeat) | ||||
| - Refresh config page and search for threshold | ||||
| - Define threshold | ||||
|  | ||||
| ## Sdk="Microsoft.NET.Sdk.Worker" | ||||
|  | ||||
| - Build with AOT task | ||||
| - Copy publish directory to server | ||||
| - Copy / edit secrets file | ||||
| - Verify windows event viewer entry for company name | ||||
|  | ||||
| ```bash 1743817269373 = 638794140693730000 = 2025-1.Spring = Fri Apr 04 2025 18:41:08 GMT-0700 (Mountain Standard Time) | ||||
| sc.exe create "Gatus-to-MonA" binpath="C:\Windows\System32\config\systemprofile\AppData\Local\IFXApps\Gatus-to-MonA\Gatus-to-MonA.exe" | ||||
| ``` | ||||
|  | ||||
| ## MonA Instances | ||||
|  | ||||
| - [MES_APC_GATUS](https://mona.auc.infineon.com/auc/systems/563556/dependencies?config=true) | ||||
|     - messa013ec.infineon.com | ||||
| - [MES_EAF_GATUS](https://mona.auc.infineon.com/auc/systems/563493/dependencies?config=true) | ||||
|     - messa08ec.infineon.com | ||||
| - [MES_EAF_STAGE_GATUS](https://mona.auc.infineon.com/auc/systems/563516/dependencies?config=true) | ||||
|     - mestsa07ec.infineon.com | ||||
| - [MES_FAB_APPROVAL_SYSTEM_GATUS](https://mona.auc.infineon.com/auc/systems/563517/dependencies?config=true) | ||||
|     - messa016ec.infineon.com | ||||
|         - https://messa016ec.infineon.com | ||||
| - [MES_FAB_TIME_GATUS](https://mona.auc.infineon.com/auc/systems/563518/dependencies?config=true) | ||||
|     - messa004.infineon.com | ||||
| - [MES_INFINITY_QS_SI_GATUS](https://mona.auc.infineon.com/auc/systems/563519/dependencies?config=true) | ||||
|     - messa04ec.infineon.com | ||||
| - [MES_OPEN_INSIGHT_GATUS](https://mona.auc.infineon.com/auc/systems/563520/dependencies?config=true) | ||||
|     - GATUS_CONFIG_PATH=./oi.yaml | ||||
|     - messa01ec.infineon.com | ||||
|         - http://messa014.infineon.com/api/heartbeat | ||||
|         - http://messa014.infineon.com/API/RemoteHealthCheck/Mona/MonaEngines/DB-EN1 | ||||
|         - http://messa014.infineon.com/api/RemoteHealthCheck/Mona/MonaEngines/DB-EN10 | ||||
|         - http://messa014.infineon.com/api/RemoteHealthCheck/Mona/MonaEngines/DB-EN11 | ||||
|         - http://messa014.infineon.com/api/RemoteHealthCheck/Mona/MonaEngines/DB-EN12 | ||||
|         - http://messa014.infineon.com/api/RemoteHealthCheck/Mona/MonaEngines/DB-EN2 | ||||
|         - http://messa014.infineon.com/api/RemoteHealthCheck/Mona/MonaEngines/DB-EN3 | ||||
|         - http://messa014.infineon.com/api/RemoteHealthCheck/Mona/MonaEngines/DB-EN4 | ||||
|         - http://messa014.infineon.com/api/RemoteHealthCheck/Mona/MonaEngines/DB-EN5 | ||||
|         - http://messa014.infineon.com/api/RemoteHealthCheck/Mona/MonaEngines/DB-EN6 | ||||
|         - http://messa014.infineon.com/api/RemoteHealthCheck/Mona/MonaEngines/DB-EN7 | ||||
|         - http://messa014.infineon.com/api/RemoteHealthCheck/Mona/MonaEngines/DB-EN9 | ||||
| - [MES_OPEN_INSIGHT_DEV_GATUS](https://mona.auc.infineon.com/auc/systems/563521/dependencies?config=true) | ||||
|     - mestsa01ec.infineon.com | ||||
| - [MES_OI_METROLOGY_VIEWER_GATUS](https://mona.auc.infineon.com/auc/systems/557090/dependencies?config=true) | ||||
|     - messa010ec.infineon.com | ||||
| - [MES_OI_WEB_SERVICES_GATUS](https://mona.auc.infineon.com/auc/systems/563522/dependencies?config=true) | ||||
|     - messa020ec.infineon.com | ||||
|     - ~~messa014.infineon.com~~ | ||||
|         - https://messa014.infineon.com/scan | ||||
|         - https://messa014.infineon.com:50184 | ||||
|         - https://messa014.infineon.com:5022 | ||||
| - [LEO_EAF_GATUS](https://mona.auc.infineon.com/auc/systems/563522/dependencies?config=true) | ||||
|     - leosaec17.infineon.com | ||||
|  | ||||
							
								
								
									
										15
									
								
								Worker.cs
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								Worker.cs
									
									
									
									
									
								
							| @ -8,7 +8,6 @@ namespace Gatus.To.MonA; | ||||
|  | ||||
| public partial class Worker : BackgroundService { | ||||
|  | ||||
|     private bool? _First; | ||||
|     private readonly bool _IsWindowsService; | ||||
|     private readonly ILogger<Worker> _Logger; | ||||
|     private readonly AppSettings _AppSettings; | ||||
| @ -20,7 +19,6 @@ public partial class Worker : BackgroundService { | ||||
|         _HttpClientFactory = httpClientFactory; | ||||
|         logger.LogInformation(string.Join(Environment.NewLine, collection)); | ||||
|         try { logger.LogInformation("<{folder}>", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)); } catch (Exception) { } | ||||
|         _First = null; | ||||
|         _IsWindowsService = collection.Contains(nameof(WindowsServiceLifetime)); | ||||
|     } | ||||
|  | ||||
| @ -42,23 +40,20 @@ public partial class Worker : BackgroundService { | ||||
|             } | ||||
|         } | ||||
|         while (_IsWindowsService && !cancellationToken.IsCancellationRequested) { | ||||
|             BodyInner(cancellationToken); | ||||
|             await Task.Delay(_AppSettings.GatusToMonaConfiguration.MillisecondsDelay, cancellationToken); | ||||
|             try { | ||||
|                 BodyInner(cancellationToken); | ||||
|                 await Task.Delay(_AppSettings.GatusToMonaConfiguration.MillisecondsDelay, cancellationToken); | ||||
|             } catch (Exception ex) { _Logger.LogError(ex, "Unexpected Error!"); } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void BodyInner(CancellationToken cancellationToken) { | ||||
|         _Logger.LogInformation("A) Next execute will be at {date}", DateTime.Now.AddMilliseconds(_AppSettings.GatusToMonaConfiguration.MillisecondsDelay).ToString("yyyy-MM-dd hh:mm:ss.fff tt")); | ||||
|         if (_First is null || _First.Value) { | ||||
|             _First = false; | ||||
|             if (_AppSettings.GatusToMonaConfiguration.Helper == nameof(Helpers.HelperGatusToMona)) | ||||
|                 Helpers.HelperGatusToMona.Heartbeat(_AppSettings, _HttpClientFactory, _Logger, Infineon.Monitoring.MonA.State.Up, cancellationToken); | ||||
|         } | ||||
|         if (!Directory.Exists(_AppSettings.GatusToMonaConfiguration.Directory)) | ||||
|             _ = Directory.CreateDirectory(_AppSettings.GatusToMonaConfiguration.Directory); | ||||
|         else { | ||||
|             _ = _AppSettings.GatusToMonaConfiguration.Helper switch { | ||||
|                 nameof(Helpers.HelperGatusToMona) => Helpers.HelperGatusToMona.UpdateCount(_AppSettings, _Logger, cancellationToken), | ||||
|                 nameof(Helpers.HelperGatusToMona) => Helpers.HelperGatusToMona.UpdateCount(_AppSettings, _HttpClientFactory, _Logger, cancellationToken), | ||||
|                 _ => throw new NotSupportedException() | ||||
|             }; | ||||
|         } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user