/// <summary> /// Metrics key/value. /// </summary> /// <param name="name">The metric name</param> /// <param name="value"> /// The metric value, which must be a valid numerical value, /// a valid value is neither negative nor NaN/Infinite. /// </param> /// <param name="average"> /// The data stream of the metric value, for trending over time. Metrics that are already /// averages (e.g. system load average) or finite (e.g. as number of processors), are not trended. /// </param> public Metric(string name, AnyNumber value, Option <EWMA> average) { if (!Defined(value)) { throw new ArgumentException(nameof(value), $"Invalid metric {name} value {value}"); } Name = name; Value = value; Average = average; ewma_ = average.HasValue ? average.Value : default(EWMA); }
public static bool Defined(AnyNumber value) { var n = ConvertNumber(value); if (n is Left <long, double> left) { return(left.Value >= 0); } else if (n is Right <long, double> right) { return(right.Value >= 0); } else { return(false); } }
public static Either <long, double> ConvertNumber(AnyNumber number) { switch (number.Type) { case AnyNumber.NumberType.Int: return(new Left <long, double>(Convert.ToInt32(number.LongValue))); case AnyNumber.NumberType.Long: return(new Left <long, double>(number.LongValue)); case AnyNumber.NumberType.Float: return(new Right <long, double>(Convert.ToSingle(number.DoubleValue))); case AnyNumber.NumberType.Double: return(new Right <long, double>(number.DoubleValue)); default: throw new ArgumentOutOfRangeException(); } }
/// <summary> /// Creates <see cref="EWMA"/> if decat factor is set, otherwise None is returned /// </summary> public static Option <EWMA> CreateEWMA(AnyNumber value, Option <double> decayFactor) => decayFactor.HasValue ? new EWMA(value.DoubleValue, decayFactor.Value) : Option <EWMA> .None;
/// <summary> /// Creates a new Metric instance if the value is valid, otherwise None /// is returned. Invalid numeric values are negative and NaN/Infinite. /// </summary> public static Option <Metric> Create(string name, AnyNumber value, Option <double> decayFactor) => Defined(value) ? new Metric(name, value, CreateEWMA(value, decayFactor)) : Option <Metric> .None;