@@ -10,9 +10,9 @@ import (
10
10
"fmt"
11
11
"net/http"
12
12
"sort"
13
+ "sync"
13
14
14
15
"golang.org/x/tools/internal/telemetry"
15
- "golang.org/x/tools/internal/telemetry/export"
16
16
"golang.org/x/tools/internal/telemetry/metric"
17
17
)
18
18
@@ -21,13 +21,16 @@ func New() *Exporter {
21
21
}
22
22
23
23
type Exporter struct {
24
+ mu sync.Mutex
24
25
metrics []telemetry.MetricData
25
26
}
26
27
27
28
func (e * Exporter ) StartSpan (ctx context.Context , span * telemetry.Span ) {}
28
29
func (e * Exporter ) FinishSpan (ctx context.Context , span * telemetry.Span ) {}
29
30
func (e * Exporter ) Log (ctx context.Context , event telemetry.Event ) {}
30
31
func (e * Exporter ) Metric (ctx context.Context , data telemetry.MetricData ) {
32
+ e .mu .Lock ()
33
+ defer e .mu .Unlock ()
31
34
name := data .Handle ()
32
35
// We keep the metrics in name sorted order so the page is stable and easy
33
36
// to read. We do this with an insertion sort rather than sorting the list
@@ -76,48 +79,45 @@ func (e *Exporter) row(w http.ResponseWriter, name string, group telemetry.TagLi
76
79
}
77
80
78
81
func (e * Exporter ) Serve (w http.ResponseWriter , r * http.Request ) {
79
- done := make (chan struct {})
80
- export .Do (func () {
81
- defer close (done )
82
- for _ , data := range e .metrics {
83
- switch data := data .(type ) {
84
- case * metric.Int64Data :
85
- e .header (w , data .Info .Name , data .Info .Description , data .IsGauge , false )
86
- for i , group := range data .Groups () {
87
- e .row (w , data .Info .Name , group , "" , data .Rows [i ])
88
- }
82
+ e .mu .Lock ()
83
+ defer e .mu .Unlock ()
84
+ for _ , data := range e .metrics {
85
+ switch data := data .(type ) {
86
+ case * metric.Int64Data :
87
+ e .header (w , data .Info .Name , data .Info .Description , data .IsGauge , false )
88
+ for i , group := range data .Groups () {
89
+ e .row (w , data .Info .Name , group , "" , data .Rows [i ])
90
+ }
89
91
90
- case * metric.Float64Data :
91
- e .header (w , data .Info .Name , data .Info .Description , data .IsGauge , false )
92
- for i , group := range data .Groups () {
93
- e .row (w , data .Info .Name , group , "" , data .Rows [i ])
94
- }
92
+ case * metric.Float64Data :
93
+ e .header (w , data .Info .Name , data .Info .Description , data .IsGauge , false )
94
+ for i , group := range data .Groups () {
95
+ e .row (w , data .Info .Name , group , "" , data .Rows [i ])
96
+ }
95
97
96
- case * metric.HistogramInt64Data :
97
- e .header (w , data .Info .Name , data .Info .Description , false , true )
98
- for i , group := range data .Groups () {
99
- row := data .Rows [i ]
100
- for j , b := range data .Info .Buckets {
101
- e .row (w , data .Info .Name + "_bucket" , group , fmt .Sprintf (`le="%v"` , b ), row .Values [j ])
102
- }
103
- e .row (w , data .Info .Name + "_bucket" , group , `le="+Inf"` , row .Count )
104
- e .row (w , data .Info .Name + "_count" , group , "" , row .Count )
105
- e .row (w , data .Info .Name + "_sum" , group , "" , row .Sum )
98
+ case * metric.HistogramInt64Data :
99
+ e .header (w , data .Info .Name , data .Info .Description , false , true )
100
+ for i , group := range data .Groups () {
101
+ row := data .Rows [i ]
102
+ for j , b := range data .Info .Buckets {
103
+ e .row (w , data .Info .Name + "_bucket" , group , fmt .Sprintf (`le="%v"` , b ), row .Values [j ])
106
104
}
105
+ e .row (w , data .Info .Name + "_bucket" , group , `le="+Inf"` , row .Count )
106
+ e .row (w , data .Info .Name + "_count" , group , "" , row .Count )
107
+ e .row (w , data .Info .Name + "_sum" , group , "" , row .Sum )
108
+ }
107
109
108
- case * metric.HistogramFloat64Data :
109
- e .header (w , data .Info .Name , data .Info .Description , false , true )
110
- for i , group := range data .Groups () {
111
- row := data .Rows [i ]
112
- for j , b := range data .Info .Buckets {
113
- e .row (w , data .Info .Name + "_bucket" , group , fmt .Sprintf (`le="%v"` , b ), row .Values [j ])
114
- }
115
- e .row (w , data .Info .Name + "_bucket" , group , `le="+Inf"` , row .Count )
116
- e .row (w , data .Info .Name + "_count" , group , "" , row .Count )
117
- e .row (w , data .Info .Name + "_sum" , group , "" , row .Sum )
110
+ case * metric.HistogramFloat64Data :
111
+ e .header (w , data .Info .Name , data .Info .Description , false , true )
112
+ for i , group := range data .Groups () {
113
+ row := data .Rows [i ]
114
+ for j , b := range data .Info .Buckets {
115
+ e .row (w , data .Info .Name + "_bucket" , group , fmt .Sprintf (`le="%v"` , b ), row .Values [j ])
118
116
}
117
+ e .row (w , data .Info .Name + "_bucket" , group , `le="+Inf"` , row .Count )
118
+ e .row (w , data .Info .Name + "_count" , group , "" , row .Count )
119
+ e .row (w , data .Info .Name + "_sum" , group , "" , row .Sum )
119
120
}
120
121
}
121
- })
122
- <- done
122
+ }
123
123
}
0 commit comments