123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- package event
- import (
- "fmt"
- "time"
- )
- // PrecisionTiming keeps min/max/avg information about a timer over a certain interval
- type PrecisionTiming struct {
- Name string
- Min time.Duration
- Max time.Duration
- Value time.Duration
- Count int64
- }
- // NewPrecisionTiming is a factory for a Timing event, setting the Count to 1 to prevent div_by_0 errors
- func NewPrecisionTiming(k string, delta time.Duration) *PrecisionTiming {
- return &PrecisionTiming{Name: k, Min: delta, Max: delta, Value: delta, Count: 1}
- }
- // Update the event with metrics coming from a new one of the same type and with the same key
- func (e *PrecisionTiming) Update(e2 Event) error {
- if e.Type() != e2.Type() {
- return fmt.Errorf("statsd event type conflict: %s vs %s ", e.String(), e2.String())
- }
- p := e2.Payload().(PrecisionTiming)
- e.Count += p.Count
- e.Value += p.Value
- e.Min = time.Duration(minInt64(int64(e.Min), int64(p.Min)))
- e.Max = time.Duration(maxInt64(int64(e.Max), int64(p.Min)))
- return nil
- }
- // Payload returns the aggregated value for this event
- func (e PrecisionTiming) Payload() interface{} {
- return e
- }
- // Stats returns an array of StatsD events as they travel over UDP
- func (e PrecisionTiming) Stats() []string {
- return []string{
- fmt.Sprintf("%s.count:%d|c", e.Name, e.Count),
- fmt.Sprintf("%s.avg:%.6f|ms", e.Name, float64(int64(e.Value)/e.Count)/1000000), // make sure e.Count != 0
- fmt.Sprintf("%s.min:%.6f|ms", e.Name, e.durationToMs(e.Min)),
- fmt.Sprintf("%s.max:%.6f|ms", e.Name, e.durationToMs(e.Max)),
- }
- }
- // durationToMs converts time.Duration into the corresponding value in milliseconds
- func (e PrecisionTiming) durationToMs(x time.Duration) float64 {
- return float64(x) / float64(time.Millisecond)
- }
- // Key returns the name of this metric
- func (e PrecisionTiming) Key() string {
- return e.Name
- }
- // SetKey sets the name of this metric
- func (e *PrecisionTiming) SetKey(key string) {
- e.Name = key
- }
- // Type returns an integer identifier for this type of metric
- func (e PrecisionTiming) Type() int {
- return EventPrecisionTiming
- }
- // TypeString returns a name for this type of metric
- func (e PrecisionTiming) TypeString() string {
- return "PrecisionTiming"
- }
- // String returns a debug-friendly representation of this metric
- func (e PrecisionTiming) String() string {
- return fmt.Sprintf("{Type: %s, Key: %s, Value: %+v}", e.TypeString(), e.Name, e.Payload())
- }
|