ops_repo_latency_histogram_buckets.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package repository
  2. import (
  3. "fmt"
  4. "strings"
  5. )
  6. type latencyHistogramBucket struct {
  7. upperMs int
  8. label string
  9. }
  10. var latencyHistogramBuckets = []latencyHistogramBucket{
  11. {upperMs: 100, label: "0-100ms"},
  12. {upperMs: 200, label: "100-200ms"},
  13. {upperMs: 500, label: "200-500ms"},
  14. {upperMs: 1000, label: "500-1000ms"},
  15. {upperMs: 2000, label: "1000-2000ms"},
  16. {upperMs: 0, label: "2000ms+"}, // default bucket
  17. }
  18. var latencyHistogramOrderedRanges = func() []string {
  19. out := make([]string, 0, len(latencyHistogramBuckets))
  20. for _, b := range latencyHistogramBuckets {
  21. out = append(out, b.label)
  22. }
  23. return out
  24. }()
  25. func latencyHistogramRangeCaseExpr(column string) string {
  26. var sb strings.Builder
  27. _, _ = sb.WriteString("CASE\n")
  28. for _, b := range latencyHistogramBuckets {
  29. if b.upperMs <= 0 {
  30. continue
  31. }
  32. fmt.Fprintf(&sb, "\tWHEN %s < %d THEN '%s'\n", column, b.upperMs, b.label)
  33. }
  34. // Default bucket.
  35. last := latencyHistogramBuckets[len(latencyHistogramBuckets)-1]
  36. fmt.Fprintf(&sb, "\tELSE '%s'\n", last.label)
  37. _, _ = sb.WriteString("END")
  38. return sb.String()
  39. }
  40. func latencyHistogramRangeOrderCaseExpr(column string) string {
  41. var sb strings.Builder
  42. _, _ = sb.WriteString("CASE\n")
  43. order := 1
  44. for _, b := range latencyHistogramBuckets {
  45. if b.upperMs <= 0 {
  46. continue
  47. }
  48. fmt.Fprintf(&sb, "\tWHEN %s < %d THEN %d\n", column, b.upperMs, order)
  49. order++
  50. }
  51. fmt.Fprintf(&sb, "\tELSE %d\n", order)
  52. _, _ = sb.WriteString("END")
  53. return sb.String()
  54. }