handler.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package protocol
  2. import (
  3. "bytes"
  4. "errors"
  5. "strconv"
  6. "time"
  7. )
  8. // MetricHandler implements the Handler interface and produces Metric.
  9. type MetricHandler struct {
  10. timePrecision time.Duration
  11. timeFunc TimeFunc
  12. metric MutableMetric
  13. }
  14. func NewMetricHandler() *MetricHandler {
  15. return &MetricHandler{
  16. timePrecision: time.Nanosecond,
  17. timeFunc: time.Now,
  18. }
  19. }
  20. func (h *MetricHandler) SetTimePrecision(p time.Duration) {
  21. h.timePrecision = p
  22. // When the timestamp is omitted from the metric, the timestamp
  23. // comes from the server clock, truncated to the nearest unit of
  24. // measurement provided in precision.
  25. //
  26. // When a timestamp is provided in the metric, precsision is
  27. // overloaded to hold the unit of measurement of the timestamp.
  28. }
  29. func (h *MetricHandler) SetTimeFunc(f TimeFunc) {
  30. h.timeFunc = f
  31. }
  32. func (h *MetricHandler) Metric() (Metric, error) {
  33. if h.metric.Time().IsZero() {
  34. h.metric.SetTime(h.timeFunc().Truncate(h.timePrecision))
  35. }
  36. return h.metric, nil
  37. }
  38. func (h *MetricHandler) SetMeasurement(name []byte) error {
  39. var err error
  40. h.metric, err = New(nameUnescape(name),
  41. nil, nil, time.Time{})
  42. return err
  43. }
  44. func (h *MetricHandler) AddTag(key []byte, value []byte) error {
  45. tk := unescape(key)
  46. tv := unescape(value)
  47. h.metric.AddTag(tk, tv)
  48. return nil
  49. }
  50. func (h *MetricHandler) AddInt(key []byte, value []byte) error {
  51. fk := unescape(key)
  52. fv, err := parseIntBytes(bytes.TrimSuffix(value, []byte("i")), 10, 64)
  53. if err != nil {
  54. if numerr, ok := err.(*strconv.NumError); ok {
  55. return numerr.Err
  56. }
  57. return err
  58. }
  59. h.metric.AddField(fk, fv)
  60. return nil
  61. }
  62. func (h *MetricHandler) AddUint(key []byte, value []byte) error {
  63. fk := unescape(key)
  64. fv, err := parseUintBytes(bytes.TrimSuffix(value, []byte("u")), 10, 64)
  65. if err != nil {
  66. if numerr, ok := err.(*strconv.NumError); ok {
  67. return numerr.Err
  68. }
  69. return err
  70. }
  71. h.metric.AddField(fk, fv)
  72. return nil
  73. }
  74. func (h *MetricHandler) AddFloat(key []byte, value []byte) error {
  75. fk := unescape(key)
  76. fv, err := parseFloatBytes(value, 64)
  77. if err != nil {
  78. if numerr, ok := err.(*strconv.NumError); ok {
  79. return numerr.Err
  80. }
  81. return err
  82. }
  83. h.metric.AddField(fk, fv)
  84. return nil
  85. }
  86. func (h *MetricHandler) AddString(key []byte, value []byte) error {
  87. fk := unescape(key)
  88. fv := stringFieldUnescape(value)
  89. h.metric.AddField(fk, fv)
  90. return nil
  91. }
  92. func (h *MetricHandler) AddBool(key []byte, value []byte) error {
  93. fk := unescape(key)
  94. fv, err := parseBoolBytes(value)
  95. if err != nil {
  96. return errors.New("unparseable bool")
  97. }
  98. h.metric.AddField(fk, fv)
  99. return nil
  100. }
  101. func (h *MetricHandler) SetTimestamp(tm []byte) error {
  102. v, err := parseIntBytes(tm, 10, 64)
  103. if err != nil {
  104. if numerr, ok := err.(*strconv.NumError); ok {
  105. return numerr.Err
  106. }
  107. return err
  108. }
  109. //time precision is overloaded to mean time unit here
  110. ns := v * int64(h.timePrecision)
  111. h.metric.SetTime(time.Unix(0, ns))
  112. return nil
  113. }