GoPLS Viewer

Home|gopls/internal/event/export/metric/data.go
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.
4
5package metric
6
7import (
8    "fmt"
9    "sort"
10    "time"
11
12    "golang.org/x/tools/internal/event/keys"
13    "golang.org/x/tools/internal/event/label"
14)
15
16// Data represents a single point in the time series of a metric.
17// This provides the common interface to all metrics no matter their data
18// format.
19// To get the actual values for the metric you must type assert to a concrete
20// metric type.
21type Data interface {
22    // Handle returns the metric handle this data is for.
23    //TODO: rethink the concept of metric handles
24    Handle() string
25    // Groups reports the rows that currently exist for this metric.
26    Groups() [][]label.Label
27}
28
29// Int64Data is a concrete implementation of Data for int64 scalar metrics.
30type Int64Data struct {
31    // Info holds the original construction information.
32    Info *Scalar
33    // IsGauge is true for metrics that track values, rather than increasing over time.
34    IsGauge bool
35    // Rows holds the per group values for the metric.
36    Rows []int64
37    // End is the last time this metric was updated.
38    EndTime time.Time
39
40    groups [][]label.Label
41    key    *keys.Int64
42}
43
44// Float64Data is a concrete implementation of Data for float64 scalar metrics.
45type Float64Data struct {
46    // Info holds the original construction information.
47    Info *Scalar
48    // IsGauge is true for metrics that track values, rather than increasing over time.
49    IsGauge bool
50    // Rows holds the per group values for the metric.
51    Rows []float64
52    // End is the last time this metric was updated.
53    EndTime time.Time
54
55    groups [][]label.Label
56    key    *keys.Float64
57}
58
59// HistogramInt64Data is a concrete implementation of Data for int64 histogram metrics.
60type HistogramInt64Data struct {
61    // Info holds the original construction information.
62    Info *HistogramInt64
63    // Rows holds the per group values for the metric.
64    Rows []*HistogramInt64Row
65    // End is the last time this metric was updated.
66    EndTime time.Time
67
68    groups [][]label.Label
69    key    *keys.Int64
70}
71
72// HistogramInt64Row holds the values for a single row of a HistogramInt64Data.
73type HistogramInt64Row struct {
74    // Values is the counts per bucket.
75    Values []int64
76    // Count is the total count.
77    Count int64
78    // Sum is the sum of all the values recorded.
79    Sum int64
80    // Min is the smallest recorded value.
81    Min int64
82    // Max is the largest recorded value.
83    Max int64
84}
85
86// HistogramFloat64Data is a concrete implementation of Data for float64 histogram metrics.
87type HistogramFloat64Data struct {
88    // Info holds the original construction information.
89    Info *HistogramFloat64
90    // Rows holds the per group values for the metric.
91    Rows []*HistogramFloat64Row
92    // End is the last time this metric was updated.
93    EndTime time.Time
94
95    groups [][]label.Label
96    key    *keys.Float64
97}
98
99// HistogramFloat64Row holds the values for a single row of a HistogramFloat64Data.
100type HistogramFloat64Row struct {
101    // Values is the counts per bucket.
102    Values []int64
103    // Count is the total count.
104    Count int64
105    // Sum is the sum of all the values recorded.
106    Sum float64
107    // Min is the smallest recorded value.
108    Min float64
109    // Max is the largest recorded value.
110    Max float64
111}
112
113func labelListEqual(ab []label.Labelbool {
114    //TODO: make this more efficient
115    return fmt.Sprint(a) == fmt.Sprint(b)
116}
117
118func labelListLess(ab []label.Labelbool {
119    //TODO: make this more efficient
120    return fmt.Sprint(a) < fmt.Sprint(b)
121}
122
123func getGroup(lm label.Mapg *[][]label.Labelkeys []label.Key) (intbool) {
124    group := make([]label.Labellen(keys))
125    for ikey := range keys {
126        l := lm.Find(key)
127        if l.Valid() {
128            group[i] = l
129        }
130    }
131    old := *g
132    index := sort.Search(len(old), func(i intbool {
133        return !labelListLess(old[i], group)
134    })
135    if index < len(old) && labelListEqual(groupold[index]) {
136        // not a new group
137        return indexfalse
138    }
139    *g = make([][]label.Labellen(old)+1)
140    copy(*gold[:index])
141    copy((*g)[index+1:], old[index:])
142    (*g)[index] = group
143    return indextrue
144}
145
146func (data *Int64DataHandle() string          { return data.Info.Name }
147func (data *Int64DataGroups() [][]label.Label { return data.groups }
148
149func (data *Int64Datamodify(at time.Timelm label.Mapf func(v int64int64Data {
150    indexinsert := getGroup(lm, &data.groupsdata.Info.Keys)
151    old := data.Rows
152    if insert {
153        data.Rows = make([]int64len(old)+1)
154        copy(data.Rowsold[:index])
155        copy(data.Rows[index+1:], old[index:])
156    } else {
157        data.Rows = make([]int64len(old))
158        copy(data.Rowsold)
159    }
160    data.Rows[index] = f(data.Rows[index])
161    data.EndTime = at
162    frozen := *data
163    return &frozen
164}
165
166func (data *Int64Datacount(at time.Timelm label.Mapl label.LabelData {
167    return data.modify(atlm, func(v int64int64 {
168        return v + 1
169    })
170}
171
172func (data *Int64Datasum(at time.Timelm label.Mapl label.LabelData {
173    return data.modify(atlm, func(v int64int64 {
174        return v + data.key.From(l)
175    })
176}
177
178func (data *Int64Datalatest(at time.Timelm label.Mapl label.LabelData {
179    return data.modify(atlm, func(v int64int64 {
180        return data.key.From(l)
181    })
182}
183
184func (data *Float64DataHandle() string          { return data.Info.Name }
185func (data *Float64DataGroups() [][]label.Label { return data.groups }
186
187func (data *Float64Datamodify(at time.Timelm label.Mapf func(v float64float64Data {
188    indexinsert := getGroup(lm, &data.groupsdata.Info.Keys)
189    old := data.Rows
190    if insert {
191        data.Rows = make([]float64len(old)+1)
192        copy(data.Rowsold[:index])
193        copy(data.Rows[index+1:], old[index:])
194    } else {
195        data.Rows = make([]float64len(old))
196        copy(data.Rowsold)
197    }
198    data.Rows[index] = f(data.Rows[index])
199    data.EndTime = at
200    frozen := *data
201    return &frozen
202}
203
204func (data *Float64Datasum(at time.Timelm label.Mapl label.LabelData {
205    return data.modify(atlm, func(v float64float64 {
206        return v + data.key.From(l)
207    })
208}
209
210func (data *Float64Datalatest(at time.Timelm label.Mapl label.LabelData {
211    return data.modify(atlm, func(v float64float64 {
212        return data.key.From(l)
213    })
214}
215
216func (data *HistogramInt64DataHandle() string          { return data.Info.Name }
217func (data *HistogramInt64DataGroups() [][]label.Label { return data.groups }
218
219func (data *HistogramInt64Datamodify(at time.Timelm label.Mapf func(v *HistogramInt64Row)) Data {
220    indexinsert := getGroup(lm, &data.groupsdata.Info.Keys)
221    old := data.Rows
222    var v HistogramInt64Row
223    if insert {
224        data.Rows = make([]*HistogramInt64Rowlen(old)+1)
225        copy(data.Rowsold[:index])
226        copy(data.Rows[index+1:], old[index:])
227    } else {
228        data.Rows = make([]*HistogramInt64Rowlen(old))
229        copy(data.Rowsold)
230        v = *data.Rows[index]
231    }
232    oldValues := v.Values
233    v.Values = make([]int64len(data.Info.Buckets))
234    copy(v.ValuesoldValues)
235    f(&v)
236    data.Rows[index] = &v
237    data.EndTime = at
238    frozen := *data
239    return &frozen
240}
241
242func (data *HistogramInt64Datarecord(at time.Timelm label.Mapl label.LabelData {
243    return data.modify(atlm, func(v *HistogramInt64Row) {
244        value := data.key.From(l)
245        v.Sum += value
246        if v.Min > value || v.Count == 0 {
247            v.Min = value
248        }
249        if v.Max < value || v.Count == 0 {
250            v.Max = value
251        }
252        v.Count++
253        for ib := range data.Info.Buckets {
254            if value <= b {
255                v.Values[i]++
256            }
257        }
258    })
259}
260
261func (data *HistogramFloat64DataHandle() string          { return data.Info.Name }
262func (data *HistogramFloat64DataGroups() [][]label.Label { return data.groups }
263
264func (data *HistogramFloat64Datamodify(at time.Timelm label.Mapf func(v *HistogramFloat64Row)) Data {
265    indexinsert := getGroup(lm, &data.groupsdata.Info.Keys)
266    old := data.Rows
267    var v HistogramFloat64Row
268    if insert {
269        data.Rows = make([]*HistogramFloat64Rowlen(old)+1)
270        copy(data.Rowsold[:index])
271        copy(data.Rows[index+1:], old[index:])
272    } else {
273        data.Rows = make([]*HistogramFloat64Rowlen(old))
274        copy(data.Rowsold)
275        v = *data.Rows[index]
276    }
277    oldValues := v.Values
278    v.Values = make([]int64len(data.Info.Buckets))
279    copy(v.ValuesoldValues)
280    f(&v)
281    data.Rows[index] = &v
282    data.EndTime = at
283    frozen := *data
284    return &frozen
285}
286
287func (data *HistogramFloat64Datarecord(at time.Timelm label.Mapl label.LabelData {
288    return data.modify(atlm, func(v *HistogramFloat64Row) {
289        value := data.key.From(l)
290        v.Sum += value
291        if v.Min > value || v.Count == 0 {
292            v.Min = value
293        }
294        if v.Max < value || v.Count == 0 {
295            v.Max = value
296        }
297        v.Count++
298        for ib := range data.Info.Buckets {
299            if value <= b {
300                v.Values[i]++
301            }
302        }
303    })
304}
305
MembersX
Int64Data.latest.data
Float64Data.Groups.data
Int64Data.IsGauge
HistogramInt64Data.key
HistogramFloat64Data.groups
labelListEqual.b
labelListLess.b
Int64Data.modify.index
Int64Data.modify.data
HistogramInt64Data.Handle.data
HistogramInt64Data.record.BlockStmt.RangeStmt_7217.b
HistogramFloat64Data.Handle
HistogramFloat64Data.record.at
HistogramFloat64Data.record.l
Float64Data.sum.l
HistogramFloat64Data.record.lm
Float64Data.groups
Float64Data.key
HistogramInt64Row.Count
Int64Data.sum.at
Float64Data.modify.at
HistogramFloat64Data.Handle.data
HistogramInt64Data.EndTime
HistogramFloat64Row.Count
HistogramFloat64Row.Min
getGroup.lm
Float64Data.modify.frozen
HistogramInt64Data.record.l
HistogramInt64Data.record
HistogramInt64Data.record.BlockStmt.RangeStmt_7217.i
HistogramFloat64Data.record.data
HistogramFloat64Data.record.BlockStmt.value
HistogramFloat64Data.modify
HistogramFloat64Data.modify.at
label
Int64Data.Rows
Int64Data.modify.insert
Float64Data.latest.data
HistogramInt64Data.Handle
HistogramInt64Data.modify.index
HistogramInt64Data.Rows
HistogramInt64Row.Max
getGroup.g
Int64Data.count.at
HistogramInt64Data.record.lm
Float64Data.latest.at
HistogramFloat64Data.modify.oldValues
HistogramFloat64Data
labelListEqual
getGroup.RangeStmt_3605.BlockStmt.l
Int64Data.modify.f
Int64Data.count
Int64Data.sum.data
HistogramInt64Row.Values
HistogramFloat64Data.Groups
fmt
Int64Data.EndTime
HistogramFloat64Data.Rows
HistogramFloat64Row
Int64Data.Handle.data
HistogramInt64Data.modify.v
time
HistogramFloat64Data.Info
Int64Data.Groups
HistogramFloat64Data.modify.index
HistogramFloat64Row.Values
HistogramInt64Data.modify.f
HistogramInt64Data.record.at
HistogramFloat64Data.record.BlockStmt.RangeStmt_8453.i
Int64Data.latest
Float64Data.Handle
sort
Int64Data.Info
Int64Data.key
Float64Data.Rows
HistogramInt64Data.Info
labelListEqual.a
HistogramInt64Data.modify.at
HistogramInt64Data.record.BlockStmt.value
HistogramFloat64Data.Groups.data
HistogramInt64Row.Min
getGroup.index
Int64Data.modify.lm
Int64Data.modify.old
HistogramInt64Data.modify.data
HistogramFloat64Data.modify.v
HistogramFloat64Data.record.BlockStmt.RangeStmt_8453.b
labelListLess.a
getGroup.group
getGroup.old
Float64Data.latest.lm
Float64Data.latest.l
HistogramInt64Data.modify.insert
Int64Data.groups
Float64Data.modify.insert
HistogramFloat64Data.modify.insert
HistogramFloat64Data.modify.frozen
HistogramFloat64Data.record
HistogramInt64Data
getGroup
Int64Data.count.l
HistogramInt64Data.modify
HistogramInt64Data.modify.lm
HistogramInt64Data.record.data
Int64Data.modify
Float64Data.modify.index
Float64Data.sum
Int64Data
Float64Data.Info
HistogramInt64Row
Int64Data.sum
Float64Data.Groups
HistogramFloat64Data.modify.lm
Float64Data
HistogramInt64Data.groups
Float64Data.sum.lm
HistogramInt64Row.Sum
getGroup.RangeStmt_3605.key
Int64Data.latest.l
Float64Data.Handle.data
HistogramInt64Data.modify.frozen
HistogramFloat64Row.Max
Int64Data.modify.frozen
Int64Data.count.data
Int64Data.latest.lm
Int64Data.modify.at
Int64Data.latest.at
Float64Data.modify.old
Float64Data.sum.at
Float64Data.latest
Int64Data.Handle
Int64Data.Groups.data
Float64Data.modify.lm
Float64Data.modify.f
HistogramInt64Data.Groups.data
HistogramInt64Data.Groups
keys
getGroup.RangeStmt_3605.i
Int64Data.sum.lm
Int64Data.sum.l
HistogramFloat64Data.EndTime
HistogramFloat64Row.Sum
getGroup.keys
HistogramFloat64Data.modify.data
HistogramFloat64Data.modify.f
HistogramFloat64Data.modify.old
Float64Data.modify
HistogramInt64Data.modify.oldValues
Data
Float64Data.IsGauge
Float64Data.EndTime
HistogramFloat64Data.key
Int64Data.count.lm
Float64Data.modify.data
labelListLess
Float64Data.sum.data
HistogramInt64Data.modify.old
Members
X