func (eng *Engine) ObserveAt(t time.Time, name string, value interface{}, tags ...Tag) {
	eng.measure(t, name, value, Histogram, tags...)
}
ObserveAt reports value for the histogram identified by name and tags.
package stats
import (
	"os"
	"path/filepath"
	"reflect"
	"sync"
	"time"
)
type Engine struct {
	Handler Handler
	Prefix string
	Tags []Tag
	cache measureCache
}
func NewEngine(prefix string, handler Handler, tags ...Tag) *Engine {
	return &Engine{
		Handler: handler,
		Prefix:  prefix,
		Tags:    SortTags(copyTags(tags)),
	}
}
func (eng *Engine) Register(handler Handler) {
	if eng.Handler == Discard {
		eng.Handler = handler
	} else {
		eng.Handler = MultiHandler(eng.Handler, handler)
	}
}
func (eng *Engine) Flush() {
	flush(eng.Handler)
}
func (eng *Engine) WithPrefix(prefix string, tags ...Tag) *Engine {
	return &Engine{
		Handler: eng.Handler,
		Prefix:  eng.makeName(prefix),
		Tags:    eng.makeTags(tags),
	}
}
func (eng *Engine) WithTags(tags ...Tag) *Engine {
	return eng.WithPrefix("", tags...)
}
func (eng *Engine) Incr(name string, tags ...Tag) {
	eng.Add(name, 1, tags...)
}
func (eng *Engine) IncrAt(time time.Time, name string, tags ...Tag) {
	eng.AddAt(time, name, 1, tags...)
}
func (eng *Engine) Add(name string, value interface{}, tags ...Tag) {
	eng.measure(time.Now(), name, value, Counter, tags...)
}
func (eng *Engine) AddAt(t time.Time, name string, value interface{}, tags ...Tag) {
	eng.measure(t, name, value, Counter, tags...)
}
func (eng *Engine) Set(name string, value interface{}, tags ...Tag) {
	eng.measure(time.Now(), name, value, Gauge, tags...)
}
func (eng *Engine) SetAt(t time.Time, name string, value interface{}, tags ...Tag) {
	eng.measure(t, name, value, Gauge, tags...)
}
func (eng *Engine) Observe(name string, value interface{}, tags ...Tag) {
	eng.measure(time.Now(), name, value, Histogram, tags...)
}