|
98 | 98 | // cachedValue contains a `reflect.Value` of the `ordered`
|
99 | 99 | // member
|
100 | 100 | cachedValue reflect.Value
|
| 101 | + // cachedEncoded contains an encoded version of the |
| 102 | + // `ordered` member |
| 103 | + cachedEncoded string |
101 | 104 | }
|
102 | 105 |
|
103 | 106 | // mapkey uniquely describes a metric instrument in terms of
|
@@ -379,6 +382,14 @@ func (ls *labels) computeOrdered(kvs []core.KeyValue) {
|
379 | 382 | ls.cachedValue = reflect.ValueOf(ls.ordered)
|
380 | 383 | }
|
381 | 384 |
|
| 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 | + |
382 | 393 | func computeOrderedFixed(kvs []core.KeyValue) orderedLabels {
|
383 | 394 | switch len(kvs) {
|
384 | 395 | case 1:
|
@@ -556,12 +567,8 @@ func (m *SDK) checkpoint(ctx context.Context, descriptor *metric.Descriptor, rec
|
556 | 567 | }
|
557 | 568 | recorder.Checkpoint(ctx, descriptor)
|
558 | 569 |
|
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) |
565 | 572 | exportRecord := export.NewRecord(descriptor, exportLabels, recorder)
|
566 | 573 | err := m.batcher.Process(ctx, exportRecord)
|
567 | 574 | if err != nil {
|
|
0 commit comments