From cc9c5013a9e2934f415f2e0a5a53789fe4549174 Mon Sep 17 00:00:00 2001 From: Mike Phares Date: Fri, 4 Apr 2025 18:59:31 -0700 Subject: [PATCH] KumaToGatus --- .vscode/launch.json | 77 ++-------- .vscode/settings.json | 1 + ADO2025/PI5/Helper-2025-04-04.cs | 237 +++++++++++++++++++++++++++++++ Day/HelperDay.cs | 2 + 4 files changed, 250 insertions(+), 67 deletions(-) create mode 100644 ADO2025/PI5/Helper-2025-04-04.cs diff --git a/.vscode/launch.json b/.vscode/launch.json index 22c7f97..cb35d7f 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -13,73 +13,16 @@ "args": [ "s", "X", - "\\\\mesfs.infineon.com\\EC_EDA\\Production\\Traces", - "Day-Helper-2025-02-18", - "Source", - "*.pdsf", - "A_MES_ENTITY=", - "B_SEQUENCE=", - "\\\\mesfs.infineon.com\\EC_Characterization_Si\\Archive", - "s", - "X", - "\\\\mesfs.infineon.com\\EC_Characterization_Si\\Archive\\HGCV1\\2025_Week_14\\2025-03-31\\35-664269-4830_2025-03-31_05;27_PM_473734776", - "Day-Helper-2025-02-19", - "csv-HGCV1_250331172757000.pdsf", - "*.pdsf", - "Time,Test,Count,MesEntity,HeaderUniqueId,UniqueId,Id,Recipe,Date,AreaDeltaFromLastRun,GLimit,HGCV1", - "Nine10mmEdgeMean,Nine4mmEdgeMean,NineCriticalPointsAverage,NineCriticalPointsPhaseAngleAverage,NineCriticalPointsStdDev,NineEdgeMeanDelta,NineMean,NineResRangePercent,AreaDeltaFromLastRun,Variation,Percentage HgCV 4PP Delta,HGCV1", - "RhoAvg01,RhoAvg02,RhoAvg03,RhoAvg04,RhoAvg05,RhoAvg06,RhoAvg07,RhoAvg08,RhoAvg09,HGCV1", - "FlatZMean|MeanFlatZ,GradeMean|MeanGrade,NAvgMean|MeanNAvg,NslMean|MeanNsl,PhaseMean|MeanPhase,RhoAvgMean|MeanRhoAvg,RhoslMean|MeanRhosl,RsMean|MeanRs,VdMean|MeanVd,FlatZRadialGradient|RadialGradientFlatZ,GradeRadialGradient|RadialGradientGrade,NAvgRadialGradient|RadialGradientNAvg,NslRadialGradient|RadialGradientNsl,PhaseRadialGradient|RadialGradientPhase,RhoAvgRadialGradient|RadialGradientRhoAvg,RhoslRadialGradient|RadialGradientRhosl,RsRadialGradient|RadialGradientRs,VdRadialGradient|RadialGradientVd,FlatZStdDev|StandardDeviationPercentageFlatZ,GradeStdDev|StandardDeviationPercentageGrade,NAvgStdDev|StandardDeviationPercentageNAvg,NslStdDev|StandardDeviationPercentageNsl,PhaseStdDev|StandardDeviationPercentagePhase,RhoAvgStdDev|StandardDeviationPercentageRhoAvg,RhoslStdDev|StandardDeviationPercentageRhosl,RsStdDev|StandardDeviationPercentageRs,VdStdDev|StandardDeviationPercentageVd,|HGCV1", - "Time,A_LOGISTICS,B_LOGISTICS,Test,Count,Index,MesEntity,Date,Employee,Lot,PSN,Reactor,Recipe,Area,Folder,HeaderUniqueId,Id,Layer,Model,Pattern,Phase,Plan,RampRate,RDS,SetupFile,StartVoltage,StopVoltage,UniqueId,Wafer,WaferSize,Zone,Ccomp,CondType,FlatZ,FlatZMean,FlatZRadialGradient,FlatZStdDev,GLimit,Grade,GradeMean,GradeRadialGradient,GradeStdDev,NAvg,NAvgMean,NAvgRadialGradient,NAvgStdDev,Nsl,NslMean,NslRadialGradient,NslStdDev,PhaseMean,PhaseRadialGradient,PhaseStdDev,RhoAvg,RhoAvgMean,RhoAvgRadialGradient,RhoAvgStdDev,RhoMethod,Rhosl,RhoslMean,RhoslRadialGradient,RhoslStdDev,RsMean,RsRadialGradient,RsStdDev,Vd,VdMean,VdRadialGradient,VdStdDev,Variation,AreaDeltaFromLastRun,Nine10mmEdgeMean,Nine4mmEdgeMean,NineCriticalPointsAverage,NineCriticalPointsPhaseAngleAverage,NineCriticalPointsStdDev,NineEdgeMeanDelta,NineMean,NineResRangePercent,RhoAvg01,RhoAvg02,RhoAvg03,RhoAvg04,RhoAvg05,RhoAvg06,RhoAvg07,RhoAvg08,RhoAvg09", - "Time,A_LOGISTICS,B_LOGISTICS,Count,Sequence,MesEntity,Index,Operator,StartVoltage,Wafer,StopVoltage,Lot,RampRate,Plan,GLimit,Date,Time,SetupFile,WaferSize,Folder,Ccomp,Pattern,Area,CondType,RhoMethod,Model,MeanNAvg,MeanNsl,MeanVd,MeanFlatZ,MeanRhoAvg,MeanRhosl,MeanPhase,MeanGrade,MeanRs,StandardDeviationPercentageNAvg,StandardDeviationPercentageNsl,StandardDeviationPercentageVd,StandardDeviationPercentageFlatZ,StandardDeviationPercentageRhoAvg,StandardDeviationPercentageRhosl,StandardDeviationPercentagePhase,StandardDeviationPercentageGrade,StandardDeviationPercentageRs,RadialGradientNAvg,RadialGradientNsl,RadialGradientVd,RadialGradientFlatZ,RadialGradientRhoAvg,RadialGradientRhosl,RadialGradientPhase,RadialGradientGrade,RadialGradientRs,Site,X,Y,NAvg,RhoAvg,Nsl,Rhosl,Vd,Phase,FlatZ,Grade,XLeft,XRight,BottomY,TopY,RDS,PSN,Reactor,Layer,Zone,Employee,InferredLot,Nine10mmEdgeMean,Nine4mmEdgeMean,NineCriticalPointsAverage,NineCriticalPointsPhaseAngleAverage,NineCriticalPointsStdDev,NineEdgeMeanDelta,NineMean,NineResRangePercent,AreaDeltaFromLastRun,Variation,Percentage HgCV 4PP Delta,RhoAvg01,RhoAvg02,RhoAvg03,RhoAvg04,RhoAvg05,RhoAvg06,RhoAvg07,RhoAvg08,RhoAvg09", - "0,1,2,-1,3,6,5,15,73,11,69,70,-1,22,19,-1,-1,71,25,21,61,13,12,68,17,8,10,-1,9,18,72,20,23,62,29,47,38,14,63,33,51,42,56,26,44,35,58,27,45,36,32,50,41,57,30,48,39,24,59,31,49,40,34,52,43,60,28,46,37,84,83,75,76,77,78,79,80,81,82,86,87,88,89,90,91,92,93,94", - "s", - "X", - "Day-Helper-2025-02-19", - "csv-*.pdsf", - "*.pdsf", - "", - "\\\\mesfs.infineon.com\\EC_Characterization_Si\\Archive\\HGCV1\\2025_Week_14\\2025-03-31", - "", - "Time,Test,Count,MesEntity,HeaderUniqueId,UniqueId,Id,Recipe,Date,AreaDeltaFromLastRun,GLimit,HGCV1", - "Nine10mmEdgeMean,Nine4mmEdgeMean,NineCriticalPointsAverage,NineCriticalPointsPhaseAngleAverage,NineCriticalPointsStdDev,NineEdgeMeanDelta,NineMean,NineResRangePercent,AreaDeltaFromLastRun,Variation,Percentage HgCV 4PP Delta,HGCV1", - "RhoAvg01,RhoAvg02,RhoAvg03,RhoAvg04,RhoAvg05,RhoAvg06,RhoAvg07,RhoAvg08,RhoAvg09,HGCV1", - "FlatZMean|MeanFlatZ,GradeMean|MeanGrade,NAvgMean|MeanNAvg,NslMean|MeanNsl,PhaseMean|MeanPhase,RhoAvgMean|MeanRhoAvg,RhoslMean|MeanRhosl,RsMean|MeanRs,VdMean|MeanVd,FlatZRadialGradient|RadialGradientFlatZ,GradeRadialGradient|RadialGradientGrade,NAvgRadialGradient|RadialGradientNAvg,NslRadialGradient|RadialGradientNsl,PhaseRadialGradient|RadialGradientPhase,RhoAvgRadialGradient|RadialGradientRhoAvg,RhoslRadialGradient|RadialGradientRhosl,RsRadialGradient|RadialGradientRs,VdRadialGradient|RadialGradientVd,FlatZStdDev|StandardDeviationPercentageFlatZ,GradeStdDev|StandardDeviationPercentageGrade,NAvgStdDev|StandardDeviationPercentageNAvg,NslStdDev|StandardDeviationPercentageNsl,PhaseStdDev|StandardDeviationPercentagePhase,RhoAvgStdDev|StandardDeviationPercentageRhoAvg,RhoslStdDev|StandardDeviationPercentageRhosl,RsStdDev|StandardDeviationPercentageRs,VdStdDev|StandardDeviationPercentageVd,|HGCV1", - "", - "\\\\mesfs.infineon.com\\EC_Characterization_Si\\Archive\\TENCOR1\\2025_Week_14\\2025-03-31", - "", - "Time,Test,Count,MesEntity,HeaderUniqueId,UniqueId,Date,TENCOR1", - ",TENCOR1", - "TENCOR1", - "Lot|Id,Slot|WaferId,AreaTotal|WaferAreaTotal,HazeAverage|WaferHazeAverage,HazeRegion|WaferHazeRegion,ScratchTotal|WaferScratchTotal,|TENCOR1", - "", - "\\\\mesfs.infineon.com\\EC_Characterization_Si\\Archive\\CDE5\\2025_Week_14\\2025-03-31", - "", - "Time,Test,Count,MesEntity,HeaderUniqueId,UniqueId,Date,Id,Lot,CDE5", - ",CDE5", - "StandardDeviationPercentage,SheetRhoVariation,CDE5", - "Run|Title,Employee|Operator,EquipId|Equipment,Recipe|RecipeName,FileName|TheFileName,DataReject|DataRejectSigma,Merit|MeritGOF,T|Th,StdDev|StandardDeviationPercentage,|CDE5", - "", - "\\\\mesfs.infineon.com\\EC_Characterization_Si\\Archive\\SP101\\2025_Week_14\\2025-03-31", - "", - "Time,Test,Count,MesEntity,HeaderUniqueId,UniqueId,Date,SP101", - ",SP101", - ",SP101", - "Recipe|Session,|SP101", - "", - "\\\\mesfs.infineon.com\\EC_Characterization_Si\\Archive\\BIORAD2\\2025_Week_14\\2025-03-31", - "", - "Time,Test,Count,MesEntity,HeaderUniqueId,UniqueId,Date,BIORAD2", - "Thickness 14 3mm Edge Mean,Thickness 14 3mm Edge % from R/2,Thickness 14 5mm Edge Mean,Thickness 14 5mm Edge % from R/2,Thickness 14 Center Mean,Thickness 14 Average,Thickness 14 Std Dev,Thickness 14 R/2 Mean,BIORAD2", - "Thickness01,Thickness02,Thickness03,Thickness04,Thickness05,Thickness06,Thickness07,Thickness08,Thickness09,Thickness10,Thickness11,Thickness12,Thickness13,Thickness14,BIORAD2", - "Employee|Operator,Lot|Wafer,MeanThickness|WaferMeanThickness,RVThickness|RadialVariationThickness,ThicknessFourteen3mmEdgeMean|Thickness 14 3mm Edge Mean,ThicknessFourteen3mmEdgePercent|Thickness 14 3mm Edge % from R/2,ThicknessFourteen5mmEdgeMean|Thickness 14 5mm Edge Mean,ThicknessFourteen5mmEdgePercent|Thickness 14 5mm Edge % from R/2,ThicknessFourteenCenterMean|Thickness 14 Center Mean,ThicknessFourteenCriticalPointsAverage|Thickness 14 Average,ThicknessFourteenCriticalPointsStdDev|Thickness 14 Std Dev,ThicknessFourteenMeanFrom|Thickness 14 R/2 Mean,|BIORAD2", - "", - "\\\\mesfs.infineon.com\\EC_Characterization_Si\\Archive\\BIORAD4\\2025_Week_14\\2025-03-31", - "", - "Time,Test,Count,MesEntity,HeaderUniqueId,UniqueId,Date,Wafer,Position,BIORAD4", - ",BIORAD4", - ",BIORAD4", - "MID|Cassette,Lot|Batch,Title|Batch,Wafer|Text,Thickness|Site,MeanThickness|GradeMean,|BIORAD4", + "C:/Users/PHARES/AppData/Local/IFXApps/gatus", + "Day-Helper-2025-04-04", + "*.json", + ".metrics", + "https://messa010ec.infineon.com/metrics", + "gatus_results_endpoint_success", + "666", + "777", + "888", + "999", "" ], "cwd": "${workspaceFolder}", diff --git a/.vscode/settings.json b/.vscode/settings.json index 3133b4b..182f6a1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -19,6 +19,7 @@ "Exif", "FAMC", "FAMS", + "Gatus", "GIVN", "HUSB", "Immich", diff --git a/ADO2025/PI5/Helper-2025-04-04.cs b/ADO2025/PI5/Helper-2025-04-04.cs new file mode 100644 index 0000000..c8439b7 --- /dev/null +++ b/ADO2025/PI5/Helper-2025-04-04.cs @@ -0,0 +1,237 @@ +using System.Text.Json; +using System.Text.Json.Serialization; + +using Microsoft.Extensions.Logging; + +namespace File_Folder_Helper.ADO2025.PI5; + +internal static partial class Helper20250404 { + + internal record KafkaProducerSaslOptions( + [property: JsonPropertyName("mechanism")] string Mechanism + ); + + internal record MonitorList( + [property: JsonPropertyName("id")] int Id, + [property: JsonPropertyName("name")] string Name, + [property: JsonPropertyName("description")] string Description, + [property: JsonPropertyName("pathName")] string PathName, + [property: JsonPropertyName("parent")] int? Parent, + [property: JsonPropertyName("childrenIDs")] IReadOnlyList ChildrenIDs, + [property: JsonPropertyName("url")] string Url, + [property: JsonPropertyName("method")] string Method, + [property: JsonPropertyName("hostname")] object Hostname, + [property: JsonPropertyName("port")] object Port, + [property: JsonPropertyName("maxretries")] int MaxRetries, + [property: JsonPropertyName("weight")] int Weight, + [property: JsonPropertyName("active")] bool Active, + [property: JsonPropertyName("forceInactive")] bool ForceInactive, + [property: JsonPropertyName("type")] string Type, + [property: JsonPropertyName("timeout")] int Timeout, + [property: JsonPropertyName("interval")] int Interval, + [property: JsonPropertyName("retryInterval")] int RetryInterval, + [property: JsonPropertyName("resendInterval")] int ResendInterval, + [property: JsonPropertyName("keyword")] object Keyword, + [property: JsonPropertyName("invertKeyword")] bool InvertKeyword, + [property: JsonPropertyName("expiryNotification")] bool ExpiryNotification, + [property: JsonPropertyName("ignoreTls")] bool IgnoreTls, + [property: JsonPropertyName("upsideDown")] bool UpsideDown, + [property: JsonPropertyName("packetSize")] int PacketSize, + [property: JsonPropertyName("maxredirects")] int MaxRedirects, + [property: JsonPropertyName("accepted_statuscodes")] IReadOnlyList AcceptedStatusCodes, + [property: JsonPropertyName("dns_resolve_type")] string DnsResolveType, + [property: JsonPropertyName("dns_resolve_server")] string DnsResolveServer, + [property: JsonPropertyName("dns_last_result")] object DnsLastResult, + [property: JsonPropertyName("docker_container")] string DockerContainer, + [property: JsonPropertyName("docker_host")] object DockerHost, + [property: JsonPropertyName("proxyId")] object ProxyId, + [property: JsonPropertyName("notificationIDList")] NotificationIDList NotificationIDList, + [property: JsonPropertyName("tags")] IReadOnlyList Tags, + [property: JsonPropertyName("maintenance")] bool Maintenance, + [property: JsonPropertyName("mqttTopic")] string MqttTopic, + [property: JsonPropertyName("mqttSuccessMessage")] string MqttSuccessMessage, + [property: JsonPropertyName("databaseQuery")] object DatabaseQuery, + [property: JsonPropertyName("authMethod")] string AuthMethod, + [property: JsonPropertyName("grpcUrl")] object GrpcUrl, + [property: JsonPropertyName("grpcProtobuf")] object GrpcProtobuf, + [property: JsonPropertyName("grpcMethod")] object GrpcMethod, + [property: JsonPropertyName("grpcServiceName")] object GrpcServiceName, + [property: JsonPropertyName("grpcEnableTls")] bool GrpcEnableTls, + [property: JsonPropertyName("radiusCalledStationId")] object RadiusCalledStationId, + [property: JsonPropertyName("radiusCallingStationId")] object RadiusCallingStationId, + [property: JsonPropertyName("game")] object Game, + [property: JsonPropertyName("gamedigGivenPortOnly")] bool GameDigGivenPortOnly, + [property: JsonPropertyName("httpBodyEncoding")] string HttpBodyEncoding, + [property: JsonPropertyName("jsonPath")] object JsonPath, + [property: JsonPropertyName("expectedValue")] object ExpectedValue, + [property: JsonPropertyName("kafkaProducerTopic")] object KafkaProducerTopic, + [property: JsonPropertyName("kafkaProducerBrokers")] IReadOnlyList KafkaProducerBrokers, + [property: JsonPropertyName("kafkaProducerSsl")] bool KafkaProducerSsl, + [property: JsonPropertyName("kafkaProducerAllowAutoTopicCreation")] bool KafkaProducerAllowAutoTopicCreation, + [property: JsonPropertyName("kafkaProducerMessage")] object KafkaProducerMessage, + [property: JsonPropertyName("screenshot")] object Screenshot, + [property: JsonPropertyName("headers")] object Headers, + [property: JsonPropertyName("body")] object Body, + [property: JsonPropertyName("grpcBody")] object GrpcBody, + [property: JsonPropertyName("grpcMetadata")] object GrpcMetadata, + [property: JsonPropertyName("basic_auth_user")] string BasicAuthUser, + [property: JsonPropertyName("basic_auth_pass")] string BasicAuthPass, + [property: JsonPropertyName("oauth_client_id")] object OauthClientId, + [property: JsonPropertyName("oauth_client_secret")] object OauthClientSecret, + [property: JsonPropertyName("oauth_token_url")] object OauthTokenUrl, + [property: JsonPropertyName("oauth_scopes")] object OauthScopes, + [property: JsonPropertyName("oauth_auth_method")] string OauthAuthMethod, + [property: JsonPropertyName("pushToken")] string PushToken, + [property: JsonPropertyName("databaseConnectionString")] string DatabaseConnectionString, + [property: JsonPropertyName("radiusUsername")] object RadiusUsername, + [property: JsonPropertyName("radiusPassword")] object RadiusPassword, + [property: JsonPropertyName("radiusSecret")] object RadiusSecret, + [property: JsonPropertyName("mqttUsername")] string MqttUsername, + [property: JsonPropertyName("mqttPassword")] string MqttPassword, + [property: JsonPropertyName("authWorkstation")] object AuthWorkstation, + [property: JsonPropertyName("authDomain")] object AuthDomain, + [property: JsonPropertyName("tlsCa")] object TlsCa, + [property: JsonPropertyName("tlsCert")] object TlsCert, + [property: JsonPropertyName("tlsKey")] object TlsKey, + [property: JsonPropertyName("kafkaProducerSaslOptions")] KafkaProducerSaslOptions KafkaProducerSaslOptions, + [property: JsonPropertyName("includeSensitiveData")] bool IncludeSensitiveData + ); + + internal record NotificationIDList( + [property: JsonPropertyName("4")] bool _4 + ); + + internal record NotificationList( + [property: JsonPropertyName("id")] int Id, + [property: JsonPropertyName("name")] string Name, + [property: JsonPropertyName("active")] bool Active, + [property: JsonPropertyName("userId")] int UserId, + [property: JsonPropertyName("isDefault")] bool IsDefault, + [property: JsonPropertyName("config")] string Config + ); + + internal record Kuma( + [property: JsonPropertyName("version")] string Version, + [property: JsonPropertyName("notificationList")] IReadOnlyList NotificationList, + [property: JsonPropertyName("monitorList")] IReadOnlyList MonitorList + ); + + [JsonSourceGenerationOptions(WriteIndented = true)] + [JsonSerializable(typeof(Kuma))] + private partial class KumaCommonSourceGenerationContext : JsonSerializerContext { + } + + internal static void KumaToGatus(ILogger logger, List args) { + string url = args[4]; + string check = args[5]; + string fileName = args[3]; + string searchPattern = args[2]; + ParseMetrics(logger, fileName, url, check); + string sourceDirectory = Path.GetFullPath(args[0]); + string[] files = Directory.GetFiles(sourceDirectory, searchPattern, SearchOption.AllDirectories); + if (files.Length == 0) + logger.LogWarning("<{files}>(s)", files.Length); + else + KumaToGatus(files); + } + + private static void ParseMetrics(ILogger logger, string fileName, string url, string check) { + FileStream fileStream = new(fileName, FileMode.Truncate); + HttpClient httpClient = new(); + Task streamTask = httpClient.GetStreamAsync(url); + streamTask.Wait(); + Task task = streamTask.Result.CopyToAsync(fileStream); + task.Wait(); + ParseMetrics(logger, fileStream); + fileStream.Dispose(); + streamTask.Dispose(); + httpClient.Dispose(); + } + + private static void ParseMetrics(ILogger _, FileStream __) { + // Task> metrics = PrometheusMetricsParser.ParseAsync(fileStream); + // metrics.Wait(); + // foreach (IMetric metric in metrics.Result) { + // if (metric is not Gauge gauge) + // continue; + // foreach (GaugeMeasurement gaugeMeasurement in gauge.Measurements) { + // if (string.IsNullOrEmpty(metric.Name)) + // continue; + // foreach (KeyValuePair keyValuePair in gaugeMeasurement.Labels) { + // logger.LogInformation("name:{name}; timestamp:{timestamp}; value:{value}; key-name:{key-name}; key-value:{key-value}", + // metric.Name, + // gaugeMeasurement.Timestamp, + // gaugeMeasurement.Value, + // keyValuePair.Key, + // keyValuePair.Value); + // } + // } + // } + } + + private static void KumaToGatus(string[] files) { + Kuma kuma; + string json; + string checkFile; + foreach (string file in files) { + checkFile = file.ToLower().Replace('_', '-'); + if (checkFile != file) + File.Move(file, checkFile); + json = File.ReadAllText(checkFile); + kuma = JsonSerializer.Deserialize(json, KumaCommonSourceGenerationContext.Default.Kuma); + if (kuma is null) + continue; + WriteGatus(checkFile, kuma); + } + } + + private static void WriteGatus(string file, Kuma kuma) { + List results = [ + string.Empty, + $"# set GATUS_CONFIG_PATH=./{Path.GetFileName(file)}.yaml", + string.Empty, + "endpoints:" + ]; + string[] segments; + foreach (MonitorList monitorList in kuma.MonitorList) { + if (monitorList.Type is not "http" and not "postgres") + continue; + results.Add($" - name: {monitorList.Name}"); + results.Add($" group: {monitorList.PathName.Split(' ')[0]}"); + results.Add($" enabled: {monitorList.Active.ToString().ToLower()}"); + results.Add($" interval: {monitorList.Interval}s"); + if (monitorList.Type == "http") { + results.Add($" method: {monitorList.Method}"); + results.Add($" url: \"{monitorList.Url}\""); + if (monitorList.AuthMethod == "basic") { + results.Add($" # user: \"{monitorList.BasicAuthUser}\""); + results.Add($" # password: \"{monitorList.BasicAuthPass}\""); + } + results.Add(" conditions:"); + results.Add(" - \"[STATUS] < 300\""); + if (monitorList.Url.Contains("https")) + results.Add(" - \"[CERTIFICATE_EXPIRATION] > 48h\""); + results.Add($" - \"[RESPONSE_TIME] < {monitorList.Timeout}\""); + } else if (monitorList.Type == "postgres") { + segments = monitorList.DatabaseConnectionString.Split('@'); + if (segments.Length != 2) + continue; + results.Add($" # connectionString: \"{monitorList.DatabaseConnectionString}\""); + results.Add($" url: \"tcp://{segments[1].Split('/')[0]}\""); + results.Add(" conditions:"); + results.Add(" - \"[CONNECTED] == true\""); + } else + throw new NotImplementedException(); + results.Add(" alerts:"); + results.Add(" - type: email"); + results.Add(" description: \"healthcheck failed\""); + results.Add(" send-on-resolved: true"); + results.Add(" - type: gotify"); + results.Add(" description: \"healthcheck failed\""); + results.Add(" send-on-resolved: true"); + results.Add(string.Empty); + } + File.WriteAllText($"{file}.yaml", string.Join(Environment.NewLine, results)); + } + +} \ No newline at end of file diff --git a/Day/HelperDay.cs b/Day/HelperDay.cs index 51419f8..5fa2d78 100644 --- a/Day/HelperDay.cs +++ b/Day/HelperDay.cs @@ -151,6 +151,8 @@ internal static class HelperDay ADO2025.PI5.Helper20250320.SortCodeMethods(logger, args, cancellationToken); else if (args[1] == "Day-Helper-2025-03-21") ADO2025.PI5.Helper20250321.MoveToLast(logger, args); + else if (args[1] == "Day-Helper-2025-04-04") + ADO2025.PI5.Helper20250404.KumaToGatus(logger, args); else throw new Exception(appSettings.Company); }