// 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) { // Validate inputs if (message == null) { _log.ErrorFormat("Enqueue called with null message for provider {0}", provider); return; } if (!message.Id.HasValue) { _log.ErrorFormat("Enqueue called with message that has no Id assigned for provider {0}", provider); return; } if (!_telemetry.ContainsKey(provider)) _telemetry.Add(provider, new Dictionary()); Guid messageId = message.Id.Value; if (_telemetry[provider].ContainsKey(messageId)) { _telemetry[provider][messageId].NumTries++; } else { MessageTelemetry mt = new MessageTelemetry(); mt.SendDate = DateTime.Now; mt.NumTries = 1; _telemetry[provider][messageId] = mt; } } public static void Dequeue(Message.NSWProvider provider, Message message) { if (message == null) { _log.ErrorFormat("Dequeue called with null message for provider {0}", provider); return; } if (!message.Id.HasValue) { _log.ErrorFormat("Dequeue called with message that has no Id assigned for provider {0}", provider); return; } if (_telemetry.ContainsKey(provider)) { Guid messageId = message.Id.Value; if (_telemetry[provider].ContainsKey(messageId)) { MessageTelemetry mt = _telemetry[provider][messageId]; _log.InfoFormat("[{0,10}][{1,8}][{2:00000}][{3:00}] ", provider, message.MessageNotificationClassDisplay, (DateTime.Now - mt.SendDate).TotalSeconds, mt.NumTries); _telemetry[provider].Remove(messageId); } else { _log.WarnFormat("trying to deque a message from telemetry that we don't know about. Provider: {0} MessageId: {1}", provider.ToString(), messageId); } } } #endregion } }