diff --git a/stats/record.go b/stats/record.go index f8a52bcd9..00a2afb42 100644 --- a/stats/record.go +++ b/stats/record.go @@ -86,6 +86,8 @@ func createRecordOption(ros ...Options) *recordOptions { return o } +var DefaultRecorder func(tags *tag.Map, measurement []Measurement, attachments map[string]interface{}) + // Record records one or multiple measurements with the same context at once. // If there are any tags in the context, measurements will be tagged with them. func Record(ctx context.Context, ms ...Measurement) { @@ -94,7 +96,7 @@ func Record(ctx context.Context, ms ...Measurement) { if len(ms) == 0 { return } - recorder := internal.DefaultRecorder + recorder := DefaultRecorder record := false for _, m := range ms { if m.desc.subscribed() { diff --git a/stats/view/worker.go b/stats/view/worker.go index 6e8d18b7f..7c8757f12 100644 --- a/stats/view/worker.go +++ b/stats/view/worker.go @@ -33,6 +33,7 @@ func init() { defaultWorker = NewMeter().(*worker) go defaultWorker.start() internal.DefaultRecorder = record + stats.DefaultRecorder = defaultWorker.recordMeasurement } type measureRef struct { @@ -201,9 +202,15 @@ func record(tags *tag.Map, ms interface{}, attachments map[string]interface{}) { // Record records a set of measurements ms associated with the given tags and attachments. func (w *worker) Record(tags *tag.Map, ms interface{}, attachments map[string]interface{}) { + w.recordMeasurement(tags, ms.([]stats.Measurement), attachments) +} + +// recordMeasurement records a set of measurements ms associated with the given tags and attachments. +// This is the same as Record but without an interface{} type to avoid allocations +func (w *worker) recordMeasurement(tags *tag.Map, ms []stats.Measurement, attachments map[string]interface{}) { req := &recordReq{ tm: tags, - ms: ms.([]stats.Measurement), + ms: ms, attachments: attachments, t: time.Now(), }