Skip to content

Commit cc756f6

Browse files
krnowakrghetia
andauthoredMar 20, 2020
Encode labels once during checkpoint (#572)
The `checkpoint` function is executed in a single thread so we can do the encoding lazily before passing the encoded version of labels to the exporter. This is a cheap and quick way to avoid encoding the labels on every collection interval. Co-authored-by: Rahul Patel <rahulpa@google.com>
1 parent f7df68b commit cc756f6

File tree

1 file changed

+13
-6
lines changed

1 file changed

+13
-6
lines changed
 

‎sdk/metric/sdk.go

+13-6
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,9 @@ type (
9898
// cachedValue contains a `reflect.Value` of the `ordered`
9999
// member
100100
cachedValue reflect.Value
101+
// cachedEncoded contains an encoded version of the
102+
// `ordered` member
103+
cachedEncoded string
101104
}
102105

103106
// mapkey uniquely describes a metric instrument in terms of
@@ -379,6 +382,14 @@ func (ls *labels) computeOrdered(kvs []core.KeyValue) {
379382
ls.cachedValue = reflect.ValueOf(ls.ordered)
380383
}
381384

385+
func (ls *labels) ensureEncoded(encoder export.LabelEncoder) {
386+
if ls.cachedEncoded != "" {
387+
return
388+
}
389+
iter := export.NewLabelIterator(ls)
390+
ls.cachedEncoded = encoder.Encode(iter)
391+
}
392+
382393
func computeOrderedFixed(kvs []core.KeyValue) orderedLabels {
383394
switch len(kvs) {
384395
case 1:
@@ -556,12 +567,8 @@ func (m *SDK) checkpoint(ctx context.Context, descriptor *metric.Descriptor, rec
556567
}
557568
recorder.Checkpoint(ctx, descriptor)
558569

559-
// TODO Labels are encoded once per collection interval,
560-
// instead of once per bound instrument lifetime. This can be
561-
// addressed similarly to OTEP 78, see
562-
// https://github.com/jmacd/opentelemetry-go/blob/8bed2e14df7f9f4688fbab141924bb786dc9a3a1/api/context/internal/set.go#L89
563-
iter := export.NewLabelIterator(labels)
564-
exportLabels := export.NewLabels(labels, m.labelEncoder.Encode(iter), m.labelEncoder)
570+
labels.ensureEncoded(m.labelEncoder)
571+
exportLabels := export.NewLabels(labels, labels.cachedEncoded, m.labelEncoder)
565572
exportRecord := export.NewRecord(descriptor, exportLabels, recorder)
566573
err := m.batcher.Process(ctx, exportRecord)
567574
if err != nil {

0 commit comments

Comments
 (0)
Please sign in to comment.