)>}]
شركة التطبيقات المتكاملة لتصميم وبرمجة البرمجيات الخاصة ش.ش.و.
Integrated Applications Programming Company
Home » Code Library » Heartbeat (Ia.Ftn.Cl.Models.Business)

Public general use code classes and xml files that we've compiled and used over the years:

Heartbeat information support class for the Fixed Telecommunications Network business model

    1: using System;
    2: using System.Collections.Generic;
    3: using System.Linq;
    4: using System.Threading.Tasks;
    5:  
    6: namespace Ia.Ftn.Cl.Models.Business
    7: {
    8:     ////////////////////////////////////////////////////////////////////////////
    9:  
   10:     /// <summary publish="true">
   11:     /// Heartbeat information support class for the Fixed Telecommunications Network business model
   12:     /// </summary>
   13:     /// 
   14:     /// <remarks> 
   15:     /// Copyright © 2006-2022 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
   16:     /// </remarks> 
   17:     public class Heartbeat
   18:     {
   19:         private static Dictionary<string, DateTime> assemblyNameToCreatedDateTimeDictionary = new Dictionary<string, DateTime>();
   20:  
   21:         private static readonly object objectLock = new object();
   22:  
   23:         ////////////////////////////////////////////////////////////////////////////
   24:  
   25:         /// <summary>
   26:         ///
   27:         /// </summary>
   28:         public static Dictionary<string, DateTime> AssemblyNameToCreatedDateTimeDictionary
   29:         {
   30:             get { return assemblyNameToCreatedDateTimeDictionary; }
   31:  
   32:             set { assemblyNameToCreatedDateTimeDictionary = value; }
   33:         }
   34:  
   35:         ////////////////////////////////////////////////////////////////////////////
   36:  
   37:         /// <summary>
   38:         ///
   39:         /// </summary>
   40:         public Heartbeat() { }
   41:  
   42:         ////////////////////////////////////////////////////////////////////////////
   43:  
   44:         /// <summary>
   45:         /// 
   46:         /// </summary>
   47:         public static void Create(Ia.Ftn.Cl.Models.Business.MessageQueue.Application application)
   48:         {
   49:             if (!string.IsNullOrEmpty(application.Assembly))
   50:             {
   51:                 assemblyNameToCreatedDateTimeDictionary[application.Assembly] = DateTime.UtcNow.AddHours(3);
   52:             }
   53:             else
   54:             {
   55:             }
   56:         }
   57:  
   58:         ////////////////////////////////////////////////////////////////////////////
   59:  
   60:         /// <summary>
   61:         ///
   62:         /// </summary>
   63:         public static List<string> MissingAssemblyNameList(Dictionary<string, DateTime> assemblyNameToCreatedDateTimeDictionary)
   64:         {
   65:             bool assemblyWasSeen;
   66:  
   67:             var list = new List<string>();
   68:  
   69:             var assemblyNameList = (from h in assemblyNameToCreatedDateTimeDictionary
   70:                                     select h.Key).ToList();
   71:  
   72:             var text = string.Empty;
   73:             string applicationName, assemblyName;
   74:  
   75:             foreach (KeyValuePair<string, string> keyValuePair in Ia.Ftn.Cl.Models.Business.Default.ApplicationAssemblyNameToApplicationName)
   76:             {
   77:                 assemblyName = keyValuePair.Key;
   78:                 applicationName = keyValuePair.Value;
   79:  
   80:                 applicationName = applicationName.Replace("Fixed Telecommunications Network's Operations Support System ", "");
   81:  
   82:                 if (assemblyName == "ia.ftn.netm.ca" || assemblyName == "ia.ftn.citrixguistarter.ca")
   83:                 {
   84:                     // skip
   85:                     //text += applicationName + " (" + assembly + @") Active?: [<span style=""color:Orange"">Unknown</span>]<br/>";
   86:                 }
   87:                 else if (assemblyName == "ia.ftn.mdaa.ca")
   88:                 {
   89:                     // skip
   90:                 }
   91:                 else
   92:                 {
   93:                     assemblyWasSeen = assemblyNameList.Contains(assemblyName);
   94:  
   95:                     if (!assemblyWasSeen) list.Add(assemblyName);
   96:                 }
   97:             }
   98:  
   99:             return list;
  100:         }
  101:  
  102:         ////////////////////////////////////////////////////////////////////////////
  103:  
  104:         /// <summary>
  105:         ///
  106:         /// </summary>
  107:         public static List<string> WithinLastNMinuteAssemblyNameList(Dictionary<string, DateTime> assemblyNameToCreatedDateTimeDictionary, int withinLastNMinute)
  108:         {
  109:             bool assemblyIsActive;
  110:  
  111:             var list = new List<string>();
  112:  
  113:             var dateTime = DateTime.UtcNow.AddHours(3).AddMinutes(-withinLastNMinute);
  114:  
  115:             var assemblyNameWithinLastNMinuteList = (from h in assemblyNameToCreatedDateTimeDictionary
  116:                                                      where h.Value >= dateTime
  117:                                                      select h.Key).ToList();
  118:  
  119:             var text = string.Empty;
  120:             string applicationName, assemblyName;
  121:  
  122:             foreach (KeyValuePair<string, string> keyValuePair in Ia.Ftn.Cl.Models.Business.Default.ApplicationAssemblyNameToApplicationName)
  123:             {
  124:                 assemblyName = keyValuePair.Key;
  125:                 applicationName = keyValuePair.Value;
  126:  
  127:                 applicationName = applicationName.Replace("Fixed Telecommunications Network's Operations Support System ", "");
  128:  
  129:                 if (assemblyName == "ia.ftn.netm.ca" || assemblyName == "ia.ftn.citrixguistarter.ca")
  130:                 {
  131:                     //text += applicationName + " (" + assemblyName + ") Active?: Unknown\r\n\r\n";
  132:                 }
  133:                 else
  134:                 {
  135:                     assemblyIsActive = assemblyNameWithinLastNMinuteList.Contains(assemblyName);
  136:  
  137:                     if (assemblyIsActive) list.Add(assemblyName);
  138:                 }
  139:             }
  140:  
  141:             return list;
  142:         }
  143:  
  144:         ////////////////////////////////////////////////////////////////////////////
  145:  
  146:         /// <summary>
  147:         ///
  148:         /// </summary>
  149:         public static string WithinLastNMinuteTextTable(Dictionary<string, DateTime> assemblyNameToCreatedDateTimeDictionary, int withinLastNMinute)
  150:         {
  151:             // see below
  152:  
  153:             bool assemblyIsActive;
  154:  
  155:             var dateTime = DateTime.UtcNow.AddHours(3).AddMinutes(-withinLastNMinute);
  156:  
  157:             var assemblyNameWithinLastNMinuteList = (from h in assemblyNameToCreatedDateTimeDictionary
  158:                                                      where h.Value >= dateTime
  159:                                                      select h.Key).ToList();
  160:  
  161:             var text = string.Empty;
  162:             string applicationName, assembly;
  163:  
  164:             foreach (KeyValuePair<string, string> keyValuePair in Ia.Ftn.Cl.Models.Business.Default.ApplicationAssemblyNameToApplicationName)
  165:             {
  166:                 assembly = keyValuePair.Key;
  167:                 applicationName = keyValuePair.Value;
  168:  
  169:                 applicationName = applicationName.Replace("Fixed Telecommunications Network's Operations Support System ", "");
  170:  
  171:                 if (assembly == "ia.ftn.netm.ca" || assembly == "ia.ftn.citrixguistarter.ca")
  172:                 {
  173:                     text += applicationName + " (" + assembly + ") Active?: Unknown\r\n\r\n";
  174:                 }
  175:                 else
  176:                 {
  177:                     assemblyIsActive = assemblyNameWithinLastNMinuteList.Contains(assembly);
  178:  
  179:                     text += applicationName + " (" + assembly + ") Active?: " + Ia.Cl.Models.Default.YesNoText(assemblyIsActive) + "\r\n\r\n";
  180:                 }
  181:             }
  182:  
  183:             return text.Trim();
  184:         }
  185:  
  186:         ////////////////////////////////////////////////////////////////////////////
  187:  
  188:         /// <summary>
  189:         ///
  190:         /// </summary>
  191:         public static string WithinLastNMinuteHtmlTable(Dictionary<string, DateTime> assemblyNameToCreatedDateTimeDictionary, int withinLastNMinute)
  192:         {
  193:             // see above
  194:  
  195:             bool assemblyIsActive;
  196:  
  197:             var dateTime = DateTime.UtcNow.AddHours(3).AddMinutes(-withinLastNMinute);
  198:  
  199:             var assemblyNameWithinLastNMinuteList = (from h in assemblyNameToCreatedDateTimeDictionary
  200:                                                      where h.Value >= dateTime
  201:                                                      select h.Key).ToList();
  202:  
  203:             var text = string.Empty;
  204:             string applicationName, assembly;
  205:  
  206:             foreach (KeyValuePair<string, string> keyValuePair in Ia.Ftn.Cl.Models.Business.Default.ApplicationAssemblyNameToApplicationName)
  207:             {
  208:                 assembly = keyValuePair.Key;
  209:                 applicationName = keyValuePair.Value;
  210:  
  211:                 applicationName = applicationName.Replace("Fixed Telecommunications Network's Operations Support System ", "");
  212:  
  213:                 if (assembly == "ia.ftn.netm.ca" || assembly == "ia.ftn.citrixguistarter.ca")
  214:                 {
  215:                     text += applicationName + " (" + assembly + @") Active?: [<span style=""color:Orange"">Unknown</span>]<br/>";
  216:                 }
  217:                 else
  218:                 {
  219:                     assemblyIsActive = assemblyNameWithinLastNMinuteList.Contains(assembly);
  220:  
  221:                     text += applicationName + " (" + assembly + ") Active?: [" + Ia.Cl.Models.Default.YesNo(assemblyIsActive) + "]<br/>";
  222:                 }
  223:             }
  224:  
  225:             return text.Trim();
  226:         }
  227:  
  228:         ////////////////////////////////////////////////////////////////////////////
  229:  
  230:         /// <summary>
  231:         ///
  232:         /// </summary>
  233:         public static string MissingOrInactiveWithinLastNMinuteApplicationNameListText(Dictionary<string, DateTime> assemblyNameToCreatedDateTimeDictionary, int withinLastNMinute)
  234:         {
  235:             // see above
  236:  
  237:             var missingAssemblyNameList = MissingAssemblyNameList(assemblyNameToCreatedDateTimeDictionary);
  238:  
  239:             var heartbeatsWithinLastNMinuteAssemblyNameList = WithinLastNMinuteAssemblyNameList(assemblyNameToCreatedDateTimeDictionary, withinLastNMinute);
  240:  
  241:             bool missingOrInactiveAssemblyName;
  242:  
  243:             var dateTime = DateTime.UtcNow.AddHours(3).AddMinutes(-withinLastNMinute);
  244:  
  245:             var assemblyNameNotWithinLastNMinuteList = (from h in assemblyNameToCreatedDateTimeDictionary
  246:                                                         where h.Value < dateTime
  247:                                                         select h.Key).ToList();
  248:  
  249:             var missingOrInactiveAssemblyNameList = missingAssemblyNameList.Union(assemblyNameNotWithinLastNMinuteList).ToList();
  250:  
  251:             var text = string.Empty;
  252:             string applicationName, assembly;
  253:  
  254:             foreach (KeyValuePair<string, string> keyValuePair in Ia.Ftn.Cl.Models.Business.Default.ApplicationAssemblyNameToApplicationName)
  255:             {
  256:                 assembly = keyValuePair.Key;
  257:                 applicationName = keyValuePair.Value;
  258:  
  259:                 applicationName = applicationName.Replace("Fixed Telecommunications Network's Operations Support System ", "");
  260:  
  261:                 if (assembly == "ia.ftn.netm.ca" || assembly == "ia.ftn.citrixguistarter.ca")
  262:                 {
  263:                     // skip
  264:                     //text += applicationName + " (" + assembly + @") Active?: [<span style=""color:Orange"">Unknown</span>]<br/>";
  265:                 }
  266:                 else if (assembly == "ia.ftn.mdaa.ca")
  267:                 {
  268:                     // skip
  269:                 }
  270:                 else
  271:                 {
  272:                     missingOrInactiveAssemblyName = missingOrInactiveAssemblyNameList.Contains(assembly);
  273:  
  274:                     if (missingOrInactiveAssemblyName)
  275:                     {
  276:                         text += applicationName + " (" + assembly + ") ";// Active?: [" + Ia.Cl.Models.Default.YesNo(assemblyIsActive) + "]<br/>";
  277:                     }
  278:                 }
  279:             }
  280:  
  281:             return text.Trim();
  282:         }
  283:  
  284:         ////////////////////////////////////////////////////////////////////////////
  285:  
  286:         /// <summary>
  287:         ///
  288:         /// </summary>
  289:         public static bool AxeAndEwsdAreActive(Dictionary<string, DateTime> assemblyNameToCreatedDateTimeDictionary, int withinLastNMinute)
  290:         {
  291:             bool areActive;
  292:  
  293:             var axe = "ia.ftn.axe.ca";
  294:             var ewsd = "ia.ftn.netmanager.ca";
  295:  
  296:             var dateTime = DateTime.UtcNow.AddHours(3).AddMinutes(-withinLastNMinute);
  297:  
  298:             var list0 = (from h in assemblyNameToCreatedDateTimeDictionary
  299:                          where h.Value >= dateTime
  300:                          select h.Key).ToList();
  301:  
  302:             areActive = list0.Contains(axe) && list0.Contains(ewsd);
  303:  
  304:             return areActive;
  305:         }
  306:  
  307:         ////////////////////////////////////////////////////////////////////////////
  308:         ////////////////////////////////////////////////////////////////////////////
  309:  
  310:  
  311:  
  312:  
  313:         ////////////////////////////////////////////////////////////////////////////
  314:         ////////////////////////////////////////////////////////////////////////////
  315:  
  316:         /// <summary>
  317:         ///
  318:         /// </summary>
  319:         public static async Task<List<Ia.Cl.Models.Heartbeat>> HearbeatsAsync()
  320:         {
  321:             var heartbeats = await Ia.Cl.Models.Http.GetAsync<List<Ia.Cl.Models.Heartbeat>>("https://api.ia.com.kw", "api/heartbeats");
  322:  
  323:             return heartbeats;
  324:         }
  325:  
  326:         ////////////////////////////////////////////////////////////////////////////
  327:  
  328:         /// <summary>
  329:         ///
  330:         /// </summary>
  331:         public static async Task<string> HearbeatsWithinLastNMinutesTextAsync(int withinLastNMinute)
  332:         {
  333:             // see below
  334:  
  335:             bool assemblyIsActive;
  336:  
  337:             var dateTime = DateTime.UtcNow.AddHours(3).AddMinutes(-withinLastNMinute);
  338:  
  339:             var heartbeats = await Ia.Ftn.Cl.Models.Business.Heartbeat.HearbeatsAsync();
  340:  
  341:             var list = (from h in heartbeats where h.Created > dateTime select h.Name).Distinct().ToList();
  342:  
  343:             var text = string.Empty;
  344:             string applicationName, assembly;
  345:  
  346:             foreach (KeyValuePair<string, string> keyValuePair in Ia.Ftn.Cl.Models.Business.Default.ApplicationAssemblyNameToApplicationName)
  347:             {
  348:                 assembly = keyValuePair.Key;
  349:                 applicationName = keyValuePair.Value;
  350:  
  351:                 applicationName = applicationName.Replace("Fixed Telecommunications Network's Operations Support System ", "");
  352:  
  353:                 if (assembly == "ia.ftn.netm.ca" || assembly == "ia.ftn.citrixguistarter.ca")
  354:                 {
  355:                     text += applicationName + " (" + assembly + ") Active?: Unknown\r\n\r\n";
  356:                 }
  357:                 else
  358:                 {
  359:                     assemblyIsActive = list.Contains(assembly);
  360:  
  361:                     text += applicationName + " (" + assembly + ") Active?: " + Ia.Cl.Models.Default.YesNoText(assemblyIsActive) + "\r\n\r\n";
  362:                 }
  363:             }
  364:  
  365:             return text.Trim();
  366:         }
  367:  
  368:         ////////////////////////////////////////////////////////////////////////////
  369:  
  370:         /// <summary>
  371:         ///
  372:         /// </summary>
  373:         public static async Task<string> HearbeatsWithinLastNMinuteHtmlAsync(int withinLastNMinute)
  374:         {
  375:             // see above
  376:  
  377:             bool assemblyIsActive;
  378:  
  379:             var heartbeats = await Ia.Ftn.Cl.Models.Business.Heartbeat.HearbeatsAsync();
  380:  
  381:             var dateTime = DateTime.UtcNow.AddHours(3).AddMinutes(-withinLastNMinute);
  382:  
  383:             var list = (from h in heartbeats where h.Created > dateTime select h.Name).Distinct().ToList();
  384:  
  385:             var text = string.Empty;
  386:             string applicationName, assembly;
  387:  
  388:             foreach (KeyValuePair<string, string> keyValuePair in Ia.Ftn.Cl.Models.Business.Default.ApplicationAssemblyNameToApplicationName)
  389:             {
  390:                 assembly = keyValuePair.Key;
  391:                 applicationName = keyValuePair.Value;
  392:  
  393:                 applicationName = applicationName.Replace("Fixed Telecommunications Network's Operations Support System ", "");
  394:  
  395:                 if (assembly == "ia.ftn.netm.ca" || assembly == "ia.ftn.citrixguistarter.ca")
  396:                 {
  397:                     text += applicationName + " (" + assembly + @") Active?: [<span style=""color:Orange"">Unknown</span>]<br/>";
  398:                 }
  399:                 else
  400:                 {
  401:                     assemblyIsActive = list.Contains(assembly);
  402:  
  403:                     text += applicationName + " (" + assembly + ") Active?: [" + Ia.Cl.Models.Default.YesNo(assemblyIsActive) + "]<br/>";
  404:                 }
  405:             }
  406:  
  407:             return text.Trim();
  408:         }
  409:  
  410:         ////////////////////////////////////////////////////////////////////////////
  411:         ////////////////////////////////////////////////////////////////////////////   
  412:     }
  413:  
  414:     ////////////////////////////////////////////////////////////////////////////
  415:     ////////////////////////////////////////////////////////////////////////////   
  416: }