1 // Copyright 2019 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
5 // Package metric aggregates events into metrics that can be exported.
13 "golang.org/x/tools/internal/event"
14 "golang.org/x/tools/internal/event/core"
15 "golang.org/x/tools/internal/event/keys"
16 "golang.org/x/tools/internal/event/label"
19 var Entries = keys.New("metric_entries", "The set of metrics calculated for an event")
22 subscribers map[interface{}][]subscriber
25 type subscriber func(time.Time, label.Map, label.Label) Data
27 func (e *Config) subscribe(key label.Key, s subscriber) {
28 if e.subscribers == nil {
29 e.subscribers = make(map[interface{}][]subscriber)
31 e.subscribers[key] = append(e.subscribers[key], s)
34 func (e *Config) Exporter(output event.Exporter) event.Exporter {
36 return func(ctx context.Context, ev core.Event, lm label.Map) context.Context {
37 if !event.IsMetric(ev) {
38 return output(ctx, ev, lm)
43 for index := 0; ev.Valid(index); index++ {
49 if list := e.subscribers[id]; len(list) > 0 {
50 for _, s := range list {
51 metrics = append(metrics, s(ev.At(), lm, l))
55 lm = label.MergeMaps(label.NewMap(Entries.Of(metrics)), lm)
56 return output(ctx, ev, lm)