// Copyright (c) 2024-present schick Informatik // Description: The purpose of telemetry is to record message transmission times (and failures) using System; using System.Collections.Generic; using log4net; using System.Linq; using System.Text; using System.Threading.Tasks; namespace bsmd.database { public class MessageTelemetry { #region Fields private static readonly Dictionary> _telemetry = new Dictionary>(); private static readonly ILog _log = LogManager.GetLogger(typeof(MessageTelemetry)); #endregion #region Properties public DateTime SendDate { get; private set; } public int NumTries { get; set; } #endregion #region public static methods public static void Enqueue(Message.NSWProvider provider, Message message) { if (!_telemetry.ContainsKey(provider)) _telemetry.Add(provider, new Dictionary()); if (_telemetry[provider].ContainsKey(message.Id.Value)) { _telemetry[provider][message.Id.Value].NumTries++; } else { MessageTelemetry mt = new MessageTelemetry(); mt.SendDate = DateTime.Now; mt.NumTries = 1; _telemetry[provider][message.Id.Value] = mt; } } public static void Dequeue(Message.NSWProvider provider, Message message) { if (_telemetry.ContainsKey(provider)) { if (_telemetry[provider].ContainsKey(message.Id.Value)) { MessageTelemetry mt = _telemetry[provider][message.Id.Value]; _log.InfoFormat("[{0,10}][{1,8}][{2:00000}][{3:00}] ",provider, message.MessageNotificationClassDisplay, (DateTime.Now - mt.SendDate).TotalSeconds, mt.NumTries); _telemetry[provider].Remove(message.Id.Value); } else { _log.ErrorFormat("trying to deque a message from telemetry that we don't know about. Provider: {0} MessageId: {1}", provider.ToString(), message.Id.Value); } } } #endregion } }