/// <summary> /// Trace the specified log into database. /// </summary> /// <param name="metricInstance"></param> private static void ProcessInstance(MetricInstance metricInstance) { try { if (metricInstance == null || !IsActive(metricInstance)) { return; } if (metricInstance.Type.Equals(MetricType.Unique)) { SaveUniqueInstanceMetric(metricInstance); } else { RecordMetric(metricInstance); } } catch (Exception e) { STrace.Exception(typeof(Consumer).FullName, e); ReEqnueue(metricInstance); } }
/// <summary> /// Determines if the givenn metric is an active configured metric that is currently receiving ocurrences. /// </summary> /// <param name="metricInstance"></param> /// <returns></returns> private static bool IsActive(MetricInstance metricInstance) { return(Configuration.Any(metric => metric.Name.Equals(metricInstance.Name) && metric.Class.Equals(metricInstance.Component) && (metric.StartDate.Equals(default(DateTime)) || metric.StartDate <= metricInstance.DateTime) && (metric.EndDate.Equals(default(DateTime)) || metric.EndDate >= metricInstance.DateTime))); }
/// <summary> /// Gets the key associated to the current metric instance. /// </summary> /// <param name="metricInstance"></param> /// <returns></returns> private static String GenerateKey(MetricInstance metricInstance) { var vehicleType = metricInstance.VehicleType.HasValue ? metricInstance.VehicleType.Value.ToString() : "-1"; var deviceType = metricInstance.DeviceType.HasValue ? metricInstance.DeviceType.Value.ToString() : "-1"; return(String.Format("{0} - {1} - {2} - {3}", metricInstance.Component, metricInstance.Name, vehicleType, deviceType)); }
/// <summary> /// Updates the specified metric value with the givenn metric instance. /// </summary> /// <param name="metricInstance"></param> /// <param name="key"></param> private static void UpdateMetricVaslues(MetricInstance metricInstance, String key) { Metrics[key].Ocurrences++; Metrics[key].CurrentValue = GetMetricCurrentValue(Metrics[key], metricInstance); Metrics[key].LastInstance = metricInstance.DateTime; }
/// <summary> /// Equeues in the internal metrics queue the given metric instance. /// </summary> /// <param name="instance"></param> public static void Enqueue(MetricInstance instance) { lock (Metrics) { Metrics.Add(instance); Consumer.Start(); } }
/// <summary> /// Tries to re enqueue the log. /// </summary> /// <param name="metricInstance"></param> private static void ReEqnueue(MetricInstance metricInstance) { Thread.Sleep(ErrorInterval); metricInstance.Retries++; if (metricInstance.Retries < MaxRetries) { Queue.Enqueue(metricInstance); } _semaphore.Release(); }
/// <summary> /// Gets a unique ocurrence metric. /// </summary> /// <param name="metricInstance"></param> /// <returns></returns> private static Metric GetUniqueInstance(MetricInstance metricInstance) { return(new Metric { Component = metricInstance.Component, DeviceType = metricInstance.DeviceType, End = metricInstance.DateTime, Module = metricInstance.Module, Name = metricInstance.Name, Start = metricInstance.DateTime, Value = metricInstance.Value, VehicleType = metricInstance.VehicleType }); }
/// <summary> /// Calculates the new metric current value. /// </summary> /// <param name="metricValue"></param> /// <param name="metricInstance"></param> /// <returns></returns> private static Double GetMetricCurrentValue(MetricValue metricValue, MetricInstance metricInstance) { var newValue = metricValue.CurrentValue; switch (metricInstance.Type) { case MetricType.Average: case MetricType.Sum: newValue += metricInstance.Value; break; case MetricType.Max: newValue = Math.Max(newValue, metricInstance.Value); break; case MetricType.Min: newValue = Math.Min(newValue, metricInstance.Value); break; } return(newValue); }
/// <summary> /// Gets a new current value for the specified metric. /// </summary> /// <param name="metricInstance"></param> /// <returns></returns> private static MetricValue GetNewCurrentValue(MetricInstance metricInstance) { return(new MetricValue { Module = metricInstance.Module, Component = metricInstance.Component, Name = metricInstance.Name, FirstInstance = metricInstance.DateTime, LastInstance = metricInstance.DateTime, CurrentValue = metricInstance.Value, Ocurrences = 1, DeviceType = metricInstance.DeviceType, VehicleType = metricInstance.VehicleType, Type = metricInstance.Type }); }
/// <summary> /// Records the current metric /// </summary> /// <param name="metricInstance"></param> private static void RecordMetric(MetricInstance metricInstance) { lock (Metrics) { var key = GenerateKey(metricInstance); if (Metrics.ContainsKey(key)) { UpdateMetricVaslues(metricInstance, key); } else { AddNewMetric(metricInstance, key); } } }
/// <summary> /// Saves a unique ocurrence metric into database. /// </summary> /// <param name="metricInstance"></param> private static void SaveUniqueInstanceMetric(MetricInstance metricInstance) { Save(GetUniqueInstance(metricInstance)); }
/// <summary> /// Adds a new metric value for the current metric instance. /// </summary> /// <param name="metricInstance"></param> /// <param name="key"></param> private static void AddNewMetric(MetricInstance metricInstance, String key) { Metrics.Add(key, GetNewCurrentValue(metricInstance)); }