Skip to content
This repository was archived by the owner on Oct 3, 2023. It is now read-only.

Commit 8033da9

Browse files
authored
Small optimization to avoid unnecesarry allocations. (#228)
* Small optimization to avoid unnecesarry allocations. Signed-off-by: Bogdan Drutu <bogdandrutu@gmail.com> * Move timeout to all create metric descriptor. Signed-off-by: Bogdan Drutu <bogdandrutu@gmail.com>
1 parent 9cc5395 commit 8033da9

5 files changed

Lines changed: 39 additions & 32 deletions

File tree

metrics.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -168,17 +168,21 @@ func (se *statsExporter) metricToMpbTs(ctx context.Context, metric *metricdata.M
168168
}
169169

170170
func metricLabelsToTsLabels(defaults map[string]labelValue, labelKeys []metricdata.LabelKey, labelValues []metricdata.LabelValue) (map[string]string, error) {
171+
// Perform this sanity check now.
172+
if len(labelKeys) != len(labelValues) {
173+
return nil, fmt.Errorf("length mismatch: len(labelKeys)=%d len(labelValues)=%d", len(labelKeys), len(labelValues))
174+
}
175+
176+
if len(defaults)+len(labelKeys) == 0 {
177+
return nil, nil
178+
}
179+
171180
labels := make(map[string]string)
172181
// Fill in the defaults firstly, irrespective of if the labelKeys and labelValues are mismatched.
173182
for key, label := range defaults {
174183
labels[sanitize(key)] = label.val
175184
}
176185

177-
// Perform this sanity check now.
178-
if len(labelKeys) != len(labelValues) {
179-
return labels, fmt.Errorf("length mismatch: len(labelKeys)=%d len(labelValues)=%d", len(labelKeys), len(labelValues))
180-
}
181-
182186
for i, labelKey := range labelKeys {
183187
labelValue := labelValues[i]
184188
labels[sanitize(labelKey.Key)] = labelValue.Value

metrics_proto.go

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -67,14 +67,14 @@ func (se *statsExporter) PushMetricsProto(ctx context.Context, node *commonpb.No
6767
if metric.GetMetricDescriptor().GetType() == metricspb.MetricDescriptor_SUMMARY {
6868
summaryMtcs := se.convertSummaryMetrics(metric)
6969
for _, summaryMtc := range summaryMtcs {
70-
if err := se.createMetricDescriptorWithTimeout(ctx, summaryMtc); err != nil {
70+
if err := se.createMetricDescriptorFromMetricProto(ctx, summaryMtc); err != nil {
7171
mb.recordDroppedTimeseries(len(summaryMtc.GetTimeseries()), err)
7272
continue
7373
}
7474
se.protoMetricToTimeSeries(ctx, mappedRsc, summaryMtc, mb)
7575
}
7676
} else {
77-
if err := se.createMetricDescriptorWithTimeout(ctx, metric); err != nil {
77+
if err := se.createMetricDescriptorFromMetricProto(ctx, metric); err != nil {
7878
mb.recordDroppedTimeseries(len(metric.GetTimeseries()), err)
7979
continue
8080
}
@@ -236,8 +236,7 @@ func (se *statsExporter) protoMetricToTimeSeries(ctx context.Context, mappedRsc
236236
mb.recordDroppedTimeseries(len(metric.GetTimeseries()), errNilMetricOrMetricDescriptor)
237237
}
238238

239-
metricName := metric.GetMetricDescriptor().GetName()
240-
metricType := se.metricTypeFromProto(metricName)
239+
metricType := se.metricTypeFromProto(metric.GetMetricDescriptor().GetName())
241240
metricLabelKeys := metric.GetMetricDescriptor().GetLabelKeys()
242241
metricKind, valueType := protoMetricDescriptorTypeToMetricKind(metric)
243242
labelKeys := make([]string, 0, len(metricLabelKeys))
@@ -246,6 +245,11 @@ func (se *statsExporter) protoMetricToTimeSeries(ctx context.Context, mappedRsc
246245
}
247246

248247
for _, protoTimeSeries := range metric.Timeseries {
248+
if len(protoTimeSeries.Points) == 0 {
249+
// No points to send just move forward.
250+
continue
251+
}
252+
249253
sdPoints, err := se.protoTimeSeriesToMonitoringPoints(protoTimeSeries, metricKind)
250254
if err != nil {
251255
mb.recordDroppedTimeseries(1, err)
@@ -273,17 +277,21 @@ func (se *statsExporter) protoMetricToTimeSeries(ctx context.Context, mappedRsc
273277
}
274278

275279
func labelsPerTimeSeries(defaults map[string]labelValue, labelKeys []string, labelValues []*metricspb.LabelValue) (map[string]string, error) {
280+
if len(labelKeys) != len(labelValues) {
281+
return nil, fmt.Errorf("length mismatch: len(labelKeys)=%d len(labelValues)=%d", len(labelKeys), len(labelValues))
282+
}
283+
284+
if len(defaults)+len(labelKeys) == 0 {
285+
// No labels for this metric
286+
return nil, nil
287+
}
288+
276289
labels := make(map[string]string)
277290
// Fill in the defaults firstly, irrespective of if the labelKeys and labelValues are mismatched.
278291
for key, label := range defaults {
279292
labels[key] = label.val
280293
}
281294

282-
// Perform this sanity check now.
283-
if len(labelKeys) != len(labelValues) {
284-
return labels, fmt.Errorf("length mismatch: len(labelKeys)=%d len(labelValues)=%d", len(labelKeys), len(labelValues))
285-
}
286-
287295
for i, labelKey := range labelKeys {
288296
labelValue := labelValues[i]
289297
if !labelValue.GetHasValue() {
@@ -295,21 +303,15 @@ func labelsPerTimeSeries(defaults map[string]labelValue, labelKeys []string, lab
295303
return labels, nil
296304
}
297305

298-
func (se *statsExporter) createMetricDescriptorWithTimeout(ctx context.Context, metric *metricspb.Metric) error {
299-
ctx, cancel := newContextWithTimeout(ctx, se.o.Timeout)
300-
defer cancel()
301-
302-
return se.protoCreateMetricDescriptor(ctx, metric)
303-
}
304-
305-
// createMetricDescriptor creates a metric descriptor from the OpenCensus proto metric
306-
// and then creates it remotely using Stackdriver's API.
307-
func (se *statsExporter) protoCreateMetricDescriptor(ctx context.Context, metric *metricspb.Metric) error {
306+
func (se *statsExporter) createMetricDescriptorFromMetricProto(ctx context.Context, metric *metricspb.Metric) error {
308307
// Skip create metric descriptor if configured
309308
if se.o.SkipCMD {
310309
return nil
311310
}
312311

312+
ctx, cancel := newContextWithTimeout(ctx, se.o.Timeout)
313+
defer cancel()
314+
313315
se.protoMu.Lock()
314316
defer se.protoMu.Unlock()
315317

@@ -338,15 +340,15 @@ func (se *statsExporter) protoCreateMetricDescriptor(ctx context.Context, metric
338340
return nil
339341
}
340342

341-
func (se *statsExporter) protoTimeSeriesToMonitoringPoints(ts *metricspb.TimeSeries, metricKind googlemetricpb.MetricDescriptor_MetricKind) (sptl []*monitoringpb.Point, err error) {
343+
func (se *statsExporter) protoTimeSeriesToMonitoringPoints(ts *metricspb.TimeSeries, metricKind googlemetricpb.MetricDescriptor_MetricKind) ([]*monitoringpb.Point, error) {
344+
sptl := make([]*monitoringpb.Point, 0, len(ts.Points))
342345
for _, pt := range ts.Points {
343346
// If we have a last value aggregation point i.e. MetricDescriptor_GAUGE
344347
// StartTime should be nil.
345348
startTime := ts.StartTimestamp
346349
if metricKind == googlemetricpb.MetricDescriptor_GAUGE {
347350
startTime = nil
348351
}
349-
350352
spt, err := fromProtoPoint(startTime, pt)
351353
if err != nil {
352354
return nil, err

metrics_proto_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ func TestProtoMetricToCreateTimeSeriesRequest(t *testing.T) {
269269
{
270270
Metric: &googlemetricpb.Metric{
271271
Type: "custom.googleapis.com/opencensus/with_metric_descriptor",
272-
Labels: map[string]string{},
272+
Labels: nil,
273273
},
274274
Resource: &monitoredrespb.MonitoredResource{
275275
Type: "global",
@@ -455,7 +455,7 @@ func TestProtoMetricWithDifferentResource(t *testing.T) {
455455
{
456456
Metric: &googlemetricpb.Metric{
457457
Type: "custom.googleapis.com/opencensus/with_container_resource",
458-
Labels: map[string]string{},
458+
Labels: nil,
459459
},
460460
Resource: &monitoredrespb.MonitoredResource{
461461
Type: "k8s_container",
@@ -527,7 +527,7 @@ func TestProtoMetricWithDifferentResource(t *testing.T) {
527527
{
528528
Metric: &googlemetricpb.Metric{
529529
Type: "custom.googleapis.com/opencensus/with_gce_resource",
530-
Labels: map[string]string{},
530+
Labels: nil,
531531
},
532532
Resource: &monitoredrespb.MonitoredResource{
533533
Type: "gce_instance",

metrics_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ func TestMetricToCreateTimeSeriesRequest(t *testing.T) {
145145
{
146146
Metric: &googlemetricpb.Metric{
147147
Type: "custom.googleapis.com/opencensus/with_metric_descriptor",
148-
Labels: map[string]string{},
148+
Labels: nil,
149149
},
150150
Resource: &monitoredrespb.MonitoredResource{
151151
Type: "global",
@@ -229,7 +229,7 @@ func TestMetricToCreateTimeSeriesRequest(t *testing.T) {
229229
{
230230
Metric: &googlemetricpb.Metric{
231231
Type: "custom.googleapis.com/opencensus/with_metric_descriptor",
232-
Labels: map[string]string{},
232+
Labels: nil,
233233
},
234234
Resource: &monitoredrespb.MonitoredResource{
235235
Type: "global",

stats.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -597,11 +597,12 @@ func newLabelDescriptors(defaults map[string]labelValue, keys []tag.Key) []*labe
597597
}
598598

599599
func (e *statsExporter) createMetricDescriptor(ctx context.Context, md *metric.MetricDescriptor) error {
600+
ctx, cancel := newContextWithTimeout(ctx, e.o.Timeout)
601+
defer cancel()
600602
cmrdesc := &monitoringpb.CreateMetricDescriptorRequest{
601603
Name: fmt.Sprintf("projects/%s", e.o.ProjectID),
602604
MetricDescriptor: md,
603605
}
604-
605606
_, err := createMetricDescriptor(ctx, e.c, cmrdesc)
606607
return err
607608
}

0 commit comments

Comments
 (0)