From 49b62aef665325d78fe23c4ebe791eb0184a4a65 Mon Sep 17 00:00:00 2001 From: Joshua MacDonald Date: Tue, 1 Nov 2022 08:50:49 -0700 Subject: [PATCH] New benchmark derived from otel-launcher-go (#3395) * New benchmark derived from otel-launcher-go * edit * refactoring from PR feedback * refactoring from PR feedback * update for upstream main * revert view change Co-authored-by: Chester Cheung Co-authored-by: Tyler Yahn --- sdk/metric/benchmark_test.go | 105 +++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 sdk/metric/benchmark_test.go diff --git a/sdk/metric/benchmark_test.go b/sdk/metric/benchmark_test.go new file mode 100644 index 00000000000..d26f598f676 --- /dev/null +++ b/sdk/metric/benchmark_test.go @@ -0,0 +1,105 @@ +// Copyright The OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package metric // import "go.opentelemetry.io/otel/sdk/metric" + +import ( + "context" + "testing" + + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/metric/instrument/syncint64" + "go.opentelemetry.io/otel/sdk/metric/view" +) + +func benchCounter(b *testing.B, views ...view.View) (context.Context, Reader, syncint64.Counter) { + ctx := context.Background() + rdr := NewManualReader() + provider := NewMeterProvider(WithReader(rdr), WithView(views...)) + cntr, _ := provider.Meter("test").SyncInt64().Counter("hello") + b.ResetTimer() + b.ReportAllocs() + return ctx, rdr, cntr +} + +func BenchmarkCounterAddNoAttrs(b *testing.B) { + ctx, _, cntr := benchCounter(b) + + for i := 0; i < b.N; i++ { + cntr.Add(ctx, 1) + } +} + +func BenchmarkCounterAddOneAttr(b *testing.B) { + ctx, _, cntr := benchCounter(b) + + for i := 0; i < b.N; i++ { + cntr.Add(ctx, 1, attribute.String("K", "V")) + } +} + +func BenchmarkCounterAddOneInvalidAttr(b *testing.B) { + ctx, _, cntr := benchCounter(b) + + for i := 0; i < b.N; i++ { + cntr.Add(ctx, 1, attribute.String("", "V"), attribute.String("K", "V")) + } +} + +func BenchmarkCounterAddSingleUseAttrs(b *testing.B) { + ctx, _, cntr := benchCounter(b) + + for i := 0; i < b.N; i++ { + cntr.Add(ctx, 1, attribute.Int("K", i)) + } +} + +func BenchmarkCounterAddSingleUseInvalidAttrs(b *testing.B) { + ctx, _, cntr := benchCounter(b) + + for i := 0; i < b.N; i++ { + cntr.Add(ctx, 1, attribute.Int("", i), attribute.Int("K", i)) + } +} + +func BenchmarkCounterAddSingleUseFilteredAttrs(b *testing.B) { + vw, _ := view.New(view.WithFilterAttributes(attribute.Key("K"))) + + ctx, _, cntr := benchCounter(b, vw) + + for i := 0; i < b.N; i++ { + cntr.Add(ctx, 1, attribute.Int("L", i), attribute.Int("K", i)) + } +} + +func BenchmarkCounterCollectOneAttr(b *testing.B) { + ctx, rdr, cntr := benchCounter(b) + + for i := 0; i < b.N; i++ { + cntr.Add(ctx, 1, attribute.Int("K", 1)) + + _, _ = rdr.Collect(ctx) + } +} + +func BenchmarkCounterCollectTenAttrs(b *testing.B) { + ctx, rdr, cntr := benchCounter(b) + + for i := 0; i < b.N; i++ { + for j := 0; j < 10; j++ { + cntr.Add(ctx, 1, attribute.Int("K", j)) + } + _, _ = rdr.Collect(ctx) + } +}