Skip to content

Testing: Run sync measure benchmarks in parallel#7113

Merged
dashpole merged 2 commits intoopen-telemetry:mainfrom
dashpole:parallel_benchmark
Aug 6, 2025
Merged

Testing: Run sync measure benchmarks in parallel#7113
dashpole merged 2 commits intoopen-telemetry:mainfrom
dashpole:parallel_benchmark

Conversation

@dashpole
Copy link
Copy Markdown
Contributor

@dashpole dashpole commented Aug 1, 2025

I am looking into https://promlabs.com/blog/2025/07/17/why-i-recommend-native-prometheus-instrumentation-over-opentelemetry/#comparing-counter-increment-performance, which seems to suggest the OTel metrics SDK performs poorly when a counter is incremented concurrently. It is potentially a bit of an artificial benchmark, but does suggest there is some contention beyond just the fact that they are incrementing an atomic integer...

Original benchmarks from the blog post: https://github.com/promlabs/prometheus-otel-benchmarks/blob/main/otel_test.go

$ go test -run=xxxxxMatchNothingxxxxx -cpu=24 -test.benchtime=1s -bench=BenchmarkSyncMeasure/NoView/
goos: linux
goarch: amd64
pkg: go.opentelemetry.io/otel/sdk/metric
cpu: Intel(R) Xeon(R) CPU @ 2.20GHz
BenchmarkSyncMeasure/NoView/Int64Counter/Attributes/0-24         	 3946789	       313.2 ns/op
BenchmarkSyncMeasure/NoView/Int64Counter/Attributes/1-24         	 3420992	       374.4 ns/op
BenchmarkSyncMeasure/NoView/Int64Counter/Attributes/10-24        	  574608	      1745 ns/op
BenchmarkSyncMeasure/NoView/Float64Counter/Attributes/0-24       	 3996166	       281.1 ns/op
BenchmarkSyncMeasure/NoView/Float64Counter/Attributes/1-24       	 3091573	       367.1 ns/op
BenchmarkSyncMeasure/NoView/Float64Counter/Attributes/10-24      	  705693	      1660 ns/op
BenchmarkSyncMeasure/NoView/Int64UpDownCounter/Attributes/0-24   	 4098727	       296.4 ns/op
BenchmarkSyncMeasure/NoView/Int64UpDownCounter/Attributes/1-24   	 3029276	       355.4 ns/op
BenchmarkSyncMeasure/NoView/Int64UpDownCounter/Attributes/10-24  	  605174	      1803 ns/op
BenchmarkSyncMeasure/NoView/Float64UpDownCounter/Attributes/0-24 	 4057765	       298.6 ns/op
BenchmarkSyncMeasure/NoView/Float64UpDownCounter/Attributes/1-24 	 3384812	       366.9 ns/op
BenchmarkSyncMeasure/NoView/Float64UpDownCounter/Attributes/10-24         	  714900	      1742 ns/op
BenchmarkSyncMeasure/NoView/Int64Histogram/Attributes/0-24                	 3274644	       364.3 ns/op
BenchmarkSyncMeasure/NoView/Int64Histogram/Attributes/1-24                	 3780115	       316.1 ns/op
BenchmarkSyncMeasure/NoView/Int64Histogram/Attributes/10-24               	 1294364	       993.5 ns/op
BenchmarkSyncMeasure/NoView/Float64Histogram/Attributes/0-24              	 3543817	       343.2 ns/op
BenchmarkSyncMeasure/NoView/Float64Histogram/Attributes/1-24              	 3523102	       335.8 ns/op
BenchmarkSyncMeasure/NoView/Float64Histogram/Attributes/10-24             	 1329352	       956.3 ns/op
PASS
ok  	go.opentelemetry.io/otel/sdk/metric	27.504s
$ go test -run=xxxxxMatchNothingxxxxx -cpu=1 -test.benchtime=1s -bench=BenchmarkSyncMeasure/NoView/
goos: linux
goarch: amd64
pkg: go.opentelemetry.io/otel/sdk/metric
cpu: Intel(R) Xeon(R) CPU @ 2.20GHz
BenchmarkSyncMeasure/NoView/Int64Counter/Attributes/0         	 9905773	       121.3 ns/op
BenchmarkSyncMeasure/NoView/Int64Counter/Attributes/1         	 4079145	       296.5 ns/op
BenchmarkSyncMeasure/NoView/Int64Counter/Attributes/10        	  781627	      1531 ns/op
BenchmarkSyncMeasure/NoView/Float64Counter/Attributes/0       	10017988	       120.2 ns/op
BenchmarkSyncMeasure/NoView/Float64Counter/Attributes/1       	 4055418	       296.4 ns/op
BenchmarkSyncMeasure/NoView/Float64Counter/Attributes/10      	  761139	      1540 ns/op
BenchmarkSyncMeasure/NoView/Int64UpDownCounter/Attributes/0   	10017126	       121.1 ns/op
BenchmarkSyncMeasure/NoView/Int64UpDownCounter/Attributes/1   	 4037232	       295.3 ns/op
BenchmarkSyncMeasure/NoView/Int64UpDownCounter/Attributes/10  	  757010	      1539 ns/op
BenchmarkSyncMeasure/NoView/Float64UpDownCounter/Attributes/0 	10122925	       119.0 ns/op
BenchmarkSyncMeasure/NoView/Float64UpDownCounter/Attributes/1 	 4070942	       293.8 ns/op
BenchmarkSyncMeasure/NoView/Float64UpDownCounter/Attributes/10         	  788176	      1542 ns/op
BenchmarkSyncMeasure/NoView/Int64Histogram/Attributes/0                	10794142	       110.8 ns/op
BenchmarkSyncMeasure/NoView/Int64Histogram/Attributes/1                	 5929494	       201.0 ns/op
BenchmarkSyncMeasure/NoView/Int64Histogram/Attributes/10               	 1449292	       825.4 ns/op
BenchmarkSyncMeasure/NoView/Float64Histogram/Attributes/0              	10875385	       110.1 ns/op
BenchmarkSyncMeasure/NoView/Float64Histogram/Attributes/1              	 5903116	       202.4 ns/op
BenchmarkSyncMeasure/NoView/Float64Histogram/Attributes/10             	 1459578	       827.4 ns/op
PASS
ok  	go.opentelemetry.io/otel/sdk/metric	25.688s

Results are significantly worse (almost > 2x in some cases) with parallelism, but don't initially seem as bad as the blog post suggests. I only have 24 cores, so I can't test higher numbers.

Do we want to have parallel benchmarks in addition to our current non-parallel ones?

@codecov
Copy link
Copy Markdown

codecov Bot commented Aug 1, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 82.9%. Comparing base (75bf4b8) to head (cf15d7c).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files

Impacted file tree graph

@@           Coverage Diff           @@
##            main   #7113     +/-   ##
=======================================
- Coverage   82.9%   82.9%   -0.1%     
=======================================
  Files        262     262             
  Lines      24461   24461             
=======================================
- Hits       20293   20291      -2     
- Misses      3792    3794      +2     
  Partials     376     376             

see 3 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@dashpole dashpole added the Skip Changelog PRs that do not require a CHANGELOG.md entry label Aug 1, 2025
Copy link
Copy Markdown
Member

@pellared pellared left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can simply have the parallel benchmarks given making concurrent measurements is a typical use case.

@dashpole dashpole marked this pull request as ready for review August 5, 2025 14:14
@dashpole dashpole merged commit b7610a7 into open-telemetry:main Aug 6, 2025
31 checks passed
@dashpole dashpole deleted the parallel_benchmark branch August 6, 2025 12:50
@MrAlias MrAlias added this to the v1.38.0 milestone Aug 20, 2025
@MrAlias MrAlias mentioned this pull request Jan 16, 2026
39 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Skip Changelog PRs that do not require a CHANGELOG.md entry

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants