stats.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package kubemodel
  2. import (
  3. "errors"
  4. "fmt"
  5. "math"
  6. )
  7. // @bingen:generate:StatType
  8. type StatType string
  9. const (
  10. StatAvg StatType = "avg"
  11. StatMax StatType = "max"
  12. StatMin StatType = "min"
  13. StatP95 StatType = "p95"
  14. StatP85 StatType = "p85"
  15. )
  16. // @bingen:generate:Stats
  17. type Stats map[StatType]float64
  18. func NewStats(capacity ...int) Stats {
  19. if len(capacity) == 1 {
  20. s := make(map[StatType]float64, capacity[0])
  21. return s
  22. }
  23. return map[StatType]float64{}
  24. }
  25. func (s Stats) Avg() (float64, bool) {
  26. if s == nil {
  27. return 0.0, false
  28. }
  29. val, ok := s[StatAvg]
  30. return val, ok
  31. }
  32. func (s Stats) Max() (float64, bool) {
  33. if s == nil {
  34. return 0.0, false
  35. }
  36. val, ok := s[StatMax]
  37. return val, ok
  38. }
  39. func (s Stats) Min() (float64, bool) {
  40. if s == nil {
  41. return 0.0, false
  42. }
  43. val, ok := s[StatMin]
  44. return val, ok
  45. }
  46. func (s Stats) P95() (float64, bool) {
  47. if s == nil {
  48. return 0.0, false
  49. }
  50. val, ok := s[StatP95]
  51. return val, ok
  52. }
  53. func (s Stats) P85() (float64, bool) {
  54. if s == nil {
  55. return 0.0, false
  56. }
  57. val, ok := s[StatP85]
  58. return val, ok
  59. }
  60. func (s Stats) Sanitize() error {
  61. if s == nil {
  62. return nil
  63. }
  64. var errs []error
  65. for t := range s {
  66. if math.IsNaN(s[t]) {
  67. delete(s, t)
  68. errs = append(errs, fmt.Errorf("%v is NaN", t))
  69. }
  70. if math.IsInf(s[t], 0) {
  71. delete(s, t)
  72. errs = append(errs, fmt.Errorf("%v is Inf", t))
  73. }
  74. }
  75. if len(errs) > 0 {
  76. errStr := fmt.Sprintf("%d errors:", len(errs))
  77. for _, e := range errs {
  78. errStr += fmt.Sprintf(" [%s]", e)
  79. }
  80. return errors.New(errStr)
  81. }
  82. return nil
  83. }