예제 #1
0
                /// <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);
                }
예제 #2
0
                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);
                    }
                }
예제 #3
0
                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();
                    }
                }
예제 #4
0
 /// <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;
예제 #5
0
 /// <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;