using System; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Utilities; using Unity.Services.Core.Configuration.Internal; using Unity.Services.Core.Environments.Internal; using Unity.Services.Core.Scheduler.Internal; namespace Unity.Services.Core.Telemetry.Internal { /// /// Handles common logic between all instances. /// class MetricsHandler : TelemetryHandler { public MetricsHandler( TelemetryConfig config, CachedPayload cache, IActionScheduler scheduler, ICachePersister cachePersister, TelemetrySender sender) : base(config, cache, scheduler, cachePersister, sender) { // prevent .ctor of StringEnumConverter from being stripped AotHelper.EnsureType(); } internal override void SendPersistedCache(CachedPayload persistedCache) { if (!AreMetricsOutdated()) { m_Sender.SendAsync(persistedCache.Payload); } m_CachePersister.Delete(); bool AreMetricsOutdated() { var differenceFromUtcNow = DateTime.UtcNow - new DateTime(persistedCache.TimeOfOccurenceTicks); return differenceFromUtcNow.TotalSeconds > Config.PayloadExpirationSeconds; } } internal override void FetchSpecificCommonTags(ICloudProjectId cloudProjectId, IEnvironments environments) { Cache.Payload.MetricsCommonTags.Clear(); } internal override void SendCachedPayload() { if (Cache.Payload.Metrics.Count <= 0) return; m_Sender.SendAsync(Cache.Payload); Cache.Payload.Metrics.Clear(); Cache.TimeOfOccurenceTicks = 0; if (m_CachePersister.CanPersist) { m_CachePersister.Delete(); } } } }