1
0
mirror of https://github.com/open-telemetry/opentelemetry-go.git synced 2025-11-27 22:49:15 +02:00
Files
opentelemetry-go/exporters/prometheus/benchmark_test.go

54 lines
1.4 KiB
Go
Raw Normal View History

// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
package prometheus
import (
"fmt"
"testing"
"github.com/prometheus/client_golang/prometheus"
"github.com/stretchr/testify/require"
"go.opentelemetry.io/otel/sdk/metric"
)
Optimize Observability return types in in Prometheus exporter (#7410) Do not allocate a return function from `ExportMetrics`, `RecordCollectionDuration`, or `RecordOperationDuration` to the heap. Use the added `ExportOp` or `Timer` type instead. ### Benchmarks #### `prometheus` ``` goos: linux goarch: amd64 pkg: go.opentelemetry.io/otel/exporters/prometheus cpu: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz │ main.bmark.result │ prom-optimize-observ.bmark.result │ │ sec/op │ sec/op vs base │ Collect1/ObservabilityDisabled-8 27.59µ ± 7% 27.55µ ± 2% ~ (p=0.631 n=10) Collect1/ObservabilityEnabled-8 29.23µ ± 1% 27.25µ ± 7% -6.78% (p=0.004 n=10) Collect10/ObservabilityDisabled-8 70.75µ ± 3% 66.81µ ± 4% -5.57% (p=0.003 n=10) Collect10/ObservabilityEnabled-8 75.41µ ± 5% 71.13µ ± 5% -5.68% (p=0.002 n=10) Collect100/ObservabilityDisabled-8 420.7µ ± 4% 425.4µ ± 6% ~ (p=0.912 n=10) Collect100/ObservabilityEnabled-8 432.3µ ± 3% 422.2µ ± 5% ~ (p=0.105 n=10) Collect1000/ObservabilityDisabled-8 3.929m ± 31% 3.808m ± 2% -3.09% (p=0.001 n=10) Collect1000/ObservabilityEnabled-8 4.150m ± 1% 3.964m ± 4% -4.48% (p=0.003 n=10) Collect10000/ObservabilityDisabled-8 37.64m ± 6% 37.52m ± 2% ~ (p=0.739 n=10) Collect10000/ObservabilityEnabled-8 39.46m ± 2% 39.81m ± 19% ~ (p=0.436 n=10) geomean 672.6µ 654.6µ -2.68% │ main.bmark.result │ prom-optimize-observ.bmark.result │ │ B/op │ B/op vs base │ Collect1/ObservabilityDisabled-8 34.40Ki ± 0% 34.40Ki ± 0% ~ (p=0.075 n=10) Collect1/ObservabilityEnabled-8 34.64Ki ± 0% 34.43Ki ± 0% -0.60% (p=0.000 n=10) Collect10/ObservabilityDisabled-8 47.26Ki ± 0% 47.25Ki ± 0% ~ (p=0.093 n=10) Collect10/ObservabilityEnabled-8 47.93Ki ± 0% 47.30Ki ± 0% -1.33% (p=0.000 n=10) Collect100/ObservabilityDisabled-8 191.3Ki ± 0% 191.0Ki ± 0% ~ (p=0.218 n=10) Collect100/ObservabilityEnabled-8 197.0Ki ± 0% 191.6Ki ± 0% -2.74% (p=0.000 n=10) Collect1000/ObservabilityDisabled-8 1.902Mi ± 1% 1.891Mi ± 1% ~ (p=0.353 n=10) Collect1000/ObservabilityEnabled-8 1.935Mi ± 2% 1.889Mi ± 1% -2.38% (p=0.000 n=10) Collect10000/ObservabilityDisabled-8 17.67Mi ± 4% 18.17Mi ± 5% ~ (p=0.190 n=10) Collect10000/ObservabilityEnabled-8 18.62Mi ± 4% 17.98Mi ± 6% -3.42% (p=0.035 n=10) geomean 410.4Ki 406.9Ki -0.85% │ main.bmark.result │ prom-optimize-observ.bmark.result │ │ allocs/op │ allocs/op vs base │ Collect1/ObservabilityDisabled-8 61.00 ± 0% 61.00 ± 0% ~ (p=1.000 n=10) ¹ Collect1/ObservabilityEnabled-8 64.00 ± 0% 61.00 ± 0% -4.69% (p=0.000 n=10) Collect10/ObservabilityDisabled-8 410.0 ± 0% 410.0 ± 0% ~ (p=1.000 n=10) ¹ Collect10/ObservabilityEnabled-8 423.0 ± 0% 411.0 ± 0% -2.84% (p=0.000 n=10) Collect100/ObservabilityDisabled-8 3.874k ± 0% 3.874k ± 0% ~ (p=0.272 n=10) Collect100/ObservabilityEnabled-8 3.979k ± 0% 3.876k ± 0% -2.59% (p=0.000 n=10) Collect1000/ObservabilityDisabled-8 38.90k ± 0% 38.88k ± 0% ~ (p=0.306 n=10) Collect1000/ObservabilityEnabled-8 39.88k ± 0% 38.88k ± 0% -2.51% (p=0.000 n=10) Collect10000/ObservabilityDisabled-8 387.9k ± 0% 388.9k ± 0% ~ (p=0.138 n=10) Collect10000/ObservabilityEnabled-8 399.0k ± 0% 388.6k ± 1% -2.60% (p=0.000 n=10) geomean 4.364k 4.298k -1.52% ¹ all samples are equal ``` #### `prometheus/internal/observ` ```terminal goos: linux goarch: amd64 pkg: go.opentelemetry.io/otel/exporters/prometheus/internal/observ cpu: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz │ main.bmark.result │ prom-optimize-observ.bmark.result │ │ sec/op │ sec/op vs base │ InstrumentationExportMetrics/NoError-8 92.64n ± 7% 56.07n ± 5% -39.48% (p=0.000 n=10) InstrumentationExportMetrics/AllError-8 664.6n ± 4% 579.9n ± 4% -12.74% (p=0.000 n=10) InstrumentationExportMetrics/PartialError-8 637.5n ± 10% 579.1n ± 6% -9.15% (p=0.000 n=10) InstrumentationRecordOperationDuration/NoError-8 148.3n ± 5% 109.9n ± 3% -25.89% (p=0.000 n=10) InstrumentationRecordOperationDuration/Error-8 709.9n ± 8% 613.5n ± 3% -13.58% (p=0.000 n=10) InstrumentationRecordCollectionDuration/NoError-8 150.9n ± 11% 114.1n ± 5% -24.35% (p=0.000 n=10) InstrumentationRecordCollectionDuration/Error-8 723.5n ± 12% 629.2n ± 2% -13.04% (p=0.000 n=10) geomean 332.7n 264.8n -20.42% │ main.bmark.result │ prom-optimize-observ.bmark.result │ │ B/op │ B/op vs base │ InstrumentationExportMetrics/NoError-8 48.00 ± 0% 0.00 ± 0% -100.00% (p=0.000 n=10) InstrumentationExportMetrics/AllError-8 264.0 ± 0% 216.0 ± 0% -18.18% (p=0.000 n=10) InstrumentationExportMetrics/PartialError-8 264.0 ± 0% 216.0 ± 0% -18.18% (p=0.000 n=10) InstrumentationRecordOperationDuration/NoError-8 80.00 ± 0% 0.00 ± 0% -100.00% (p=0.000 n=10) InstrumentationRecordOperationDuration/Error-8 296.0 ± 0% 216.0 ± 0% -27.03% (p=0.000 n=10) InstrumentationRecordCollectionDuration/NoError-8 80.00 ± 0% 0.00 ± 0% -100.00% (p=0.000 n=10) InstrumentationRecordCollectionDuration/Error-8 296.0 ± 0% 216.0 ± 0% -27.03% (p=0.000 n=10) geomean 152.0 ? ¹ ² ¹ summaries must be >0 to compute geomean ² ratios must be >0 to compute geomean │ main.bmark.result │ prom-optimize-observ.bmark.result │ │ allocs/op │ allocs/op vs base │ InstrumentationExportMetrics/NoError-8 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.000 n=10) InstrumentationExportMetrics/AllError-8 3.000 ± 0% 2.000 ± 0% -33.33% (p=0.000 n=10) InstrumentationExportMetrics/PartialError-8 3.000 ± 0% 2.000 ± 0% -33.33% (p=0.000 n=10) InstrumentationRecordOperationDuration/NoError-8 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.000 n=10) InstrumentationRecordOperationDuration/Error-8 3.000 ± 0% 2.000 ± 0% -33.33% (p=0.000 n=10) InstrumentationRecordCollectionDuration/NoError-8 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.000 n=10) InstrumentationRecordCollectionDuration/Error-8 3.000 ± 0% 2.000 ± 0% -33.33% (p=0.000 n=10) geomean 1.873 ? ¹ ² ¹ summaries must be >0 to compute geomean ² ratios must be >0 to compute geomean ```
2025-09-25 11:39:53 -07:00
func run(n int) func(b *testing.B) {
return func(b *testing.B) {
ctx := b.Context()
registry := prometheus.NewRegistry()
exporter, err := New(WithRegisterer(registry))
require.NoError(b, err)
Optimize Observability return types in in Prometheus exporter (#7410) Do not allocate a return function from `ExportMetrics`, `RecordCollectionDuration`, or `RecordOperationDuration` to the heap. Use the added `ExportOp` or `Timer` type instead. ### Benchmarks #### `prometheus` ``` goos: linux goarch: amd64 pkg: go.opentelemetry.io/otel/exporters/prometheus cpu: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz │ main.bmark.result │ prom-optimize-observ.bmark.result │ │ sec/op │ sec/op vs base │ Collect1/ObservabilityDisabled-8 27.59µ ± 7% 27.55µ ± 2% ~ (p=0.631 n=10) Collect1/ObservabilityEnabled-8 29.23µ ± 1% 27.25µ ± 7% -6.78% (p=0.004 n=10) Collect10/ObservabilityDisabled-8 70.75µ ± 3% 66.81µ ± 4% -5.57% (p=0.003 n=10) Collect10/ObservabilityEnabled-8 75.41µ ± 5% 71.13µ ± 5% -5.68% (p=0.002 n=10) Collect100/ObservabilityDisabled-8 420.7µ ± 4% 425.4µ ± 6% ~ (p=0.912 n=10) Collect100/ObservabilityEnabled-8 432.3µ ± 3% 422.2µ ± 5% ~ (p=0.105 n=10) Collect1000/ObservabilityDisabled-8 3.929m ± 31% 3.808m ± 2% -3.09% (p=0.001 n=10) Collect1000/ObservabilityEnabled-8 4.150m ± 1% 3.964m ± 4% -4.48% (p=0.003 n=10) Collect10000/ObservabilityDisabled-8 37.64m ± 6% 37.52m ± 2% ~ (p=0.739 n=10) Collect10000/ObservabilityEnabled-8 39.46m ± 2% 39.81m ± 19% ~ (p=0.436 n=10) geomean 672.6µ 654.6µ -2.68% │ main.bmark.result │ prom-optimize-observ.bmark.result │ │ B/op │ B/op vs base │ Collect1/ObservabilityDisabled-8 34.40Ki ± 0% 34.40Ki ± 0% ~ (p=0.075 n=10) Collect1/ObservabilityEnabled-8 34.64Ki ± 0% 34.43Ki ± 0% -0.60% (p=0.000 n=10) Collect10/ObservabilityDisabled-8 47.26Ki ± 0% 47.25Ki ± 0% ~ (p=0.093 n=10) Collect10/ObservabilityEnabled-8 47.93Ki ± 0% 47.30Ki ± 0% -1.33% (p=0.000 n=10) Collect100/ObservabilityDisabled-8 191.3Ki ± 0% 191.0Ki ± 0% ~ (p=0.218 n=10) Collect100/ObservabilityEnabled-8 197.0Ki ± 0% 191.6Ki ± 0% -2.74% (p=0.000 n=10) Collect1000/ObservabilityDisabled-8 1.902Mi ± 1% 1.891Mi ± 1% ~ (p=0.353 n=10) Collect1000/ObservabilityEnabled-8 1.935Mi ± 2% 1.889Mi ± 1% -2.38% (p=0.000 n=10) Collect10000/ObservabilityDisabled-8 17.67Mi ± 4% 18.17Mi ± 5% ~ (p=0.190 n=10) Collect10000/ObservabilityEnabled-8 18.62Mi ± 4% 17.98Mi ± 6% -3.42% (p=0.035 n=10) geomean 410.4Ki 406.9Ki -0.85% │ main.bmark.result │ prom-optimize-observ.bmark.result │ │ allocs/op │ allocs/op vs base │ Collect1/ObservabilityDisabled-8 61.00 ± 0% 61.00 ± 0% ~ (p=1.000 n=10) ¹ Collect1/ObservabilityEnabled-8 64.00 ± 0% 61.00 ± 0% -4.69% (p=0.000 n=10) Collect10/ObservabilityDisabled-8 410.0 ± 0% 410.0 ± 0% ~ (p=1.000 n=10) ¹ Collect10/ObservabilityEnabled-8 423.0 ± 0% 411.0 ± 0% -2.84% (p=0.000 n=10) Collect100/ObservabilityDisabled-8 3.874k ± 0% 3.874k ± 0% ~ (p=0.272 n=10) Collect100/ObservabilityEnabled-8 3.979k ± 0% 3.876k ± 0% -2.59% (p=0.000 n=10) Collect1000/ObservabilityDisabled-8 38.90k ± 0% 38.88k ± 0% ~ (p=0.306 n=10) Collect1000/ObservabilityEnabled-8 39.88k ± 0% 38.88k ± 0% -2.51% (p=0.000 n=10) Collect10000/ObservabilityDisabled-8 387.9k ± 0% 388.9k ± 0% ~ (p=0.138 n=10) Collect10000/ObservabilityEnabled-8 399.0k ± 0% 388.6k ± 1% -2.60% (p=0.000 n=10) geomean 4.364k 4.298k -1.52% ¹ all samples are equal ``` #### `prometheus/internal/observ` ```terminal goos: linux goarch: amd64 pkg: go.opentelemetry.io/otel/exporters/prometheus/internal/observ cpu: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz │ main.bmark.result │ prom-optimize-observ.bmark.result │ │ sec/op │ sec/op vs base │ InstrumentationExportMetrics/NoError-8 92.64n ± 7% 56.07n ± 5% -39.48% (p=0.000 n=10) InstrumentationExportMetrics/AllError-8 664.6n ± 4% 579.9n ± 4% -12.74% (p=0.000 n=10) InstrumentationExportMetrics/PartialError-8 637.5n ± 10% 579.1n ± 6% -9.15% (p=0.000 n=10) InstrumentationRecordOperationDuration/NoError-8 148.3n ± 5% 109.9n ± 3% -25.89% (p=0.000 n=10) InstrumentationRecordOperationDuration/Error-8 709.9n ± 8% 613.5n ± 3% -13.58% (p=0.000 n=10) InstrumentationRecordCollectionDuration/NoError-8 150.9n ± 11% 114.1n ± 5% -24.35% (p=0.000 n=10) InstrumentationRecordCollectionDuration/Error-8 723.5n ± 12% 629.2n ± 2% -13.04% (p=0.000 n=10) geomean 332.7n 264.8n -20.42% │ main.bmark.result │ prom-optimize-observ.bmark.result │ │ B/op │ B/op vs base │ InstrumentationExportMetrics/NoError-8 48.00 ± 0% 0.00 ± 0% -100.00% (p=0.000 n=10) InstrumentationExportMetrics/AllError-8 264.0 ± 0% 216.0 ± 0% -18.18% (p=0.000 n=10) InstrumentationExportMetrics/PartialError-8 264.0 ± 0% 216.0 ± 0% -18.18% (p=0.000 n=10) InstrumentationRecordOperationDuration/NoError-8 80.00 ± 0% 0.00 ± 0% -100.00% (p=0.000 n=10) InstrumentationRecordOperationDuration/Error-8 296.0 ± 0% 216.0 ± 0% -27.03% (p=0.000 n=10) InstrumentationRecordCollectionDuration/NoError-8 80.00 ± 0% 0.00 ± 0% -100.00% (p=0.000 n=10) InstrumentationRecordCollectionDuration/Error-8 296.0 ± 0% 216.0 ± 0% -27.03% (p=0.000 n=10) geomean 152.0 ? ¹ ² ¹ summaries must be >0 to compute geomean ² ratios must be >0 to compute geomean │ main.bmark.result │ prom-optimize-observ.bmark.result │ │ allocs/op │ allocs/op vs base │ InstrumentationExportMetrics/NoError-8 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.000 n=10) InstrumentationExportMetrics/AllError-8 3.000 ± 0% 2.000 ± 0% -33.33% (p=0.000 n=10) InstrumentationExportMetrics/PartialError-8 3.000 ± 0% 2.000 ± 0% -33.33% (p=0.000 n=10) InstrumentationRecordOperationDuration/NoError-8 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.000 n=10) InstrumentationRecordOperationDuration/Error-8 3.000 ± 0% 2.000 ± 0% -33.33% (p=0.000 n=10) InstrumentationRecordCollectionDuration/NoError-8 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.000 n=10) InstrumentationRecordCollectionDuration/Error-8 3.000 ± 0% 2.000 ± 0% -33.33% (p=0.000 n=10) geomean 1.873 ? ¹ ² ¹ summaries must be >0 to compute geomean ² ratios must be >0 to compute geomean ```
2025-09-25 11:39:53 -07:00
provider := metric.NewMeterProvider(metric.WithReader(exporter))
meter := provider.Meter("testmeter")
for i := range n {
counter, err := meter.Float64Counter(fmt.Sprintf("foo_%d", i))
require.NoError(b, err)
counter.Add(ctx, float64(i))
}
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
_, err := registry.Gather()
require.NoError(b, err)
}
}
Optimize Observability return types in in Prometheus exporter (#7410) Do not allocate a return function from `ExportMetrics`, `RecordCollectionDuration`, or `RecordOperationDuration` to the heap. Use the added `ExportOp` or `Timer` type instead. ### Benchmarks #### `prometheus` ``` goos: linux goarch: amd64 pkg: go.opentelemetry.io/otel/exporters/prometheus cpu: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz │ main.bmark.result │ prom-optimize-observ.bmark.result │ │ sec/op │ sec/op vs base │ Collect1/ObservabilityDisabled-8 27.59µ ± 7% 27.55µ ± 2% ~ (p=0.631 n=10) Collect1/ObservabilityEnabled-8 29.23µ ± 1% 27.25µ ± 7% -6.78% (p=0.004 n=10) Collect10/ObservabilityDisabled-8 70.75µ ± 3% 66.81µ ± 4% -5.57% (p=0.003 n=10) Collect10/ObservabilityEnabled-8 75.41µ ± 5% 71.13µ ± 5% -5.68% (p=0.002 n=10) Collect100/ObservabilityDisabled-8 420.7µ ± 4% 425.4µ ± 6% ~ (p=0.912 n=10) Collect100/ObservabilityEnabled-8 432.3µ ± 3% 422.2µ ± 5% ~ (p=0.105 n=10) Collect1000/ObservabilityDisabled-8 3.929m ± 31% 3.808m ± 2% -3.09% (p=0.001 n=10) Collect1000/ObservabilityEnabled-8 4.150m ± 1% 3.964m ± 4% -4.48% (p=0.003 n=10) Collect10000/ObservabilityDisabled-8 37.64m ± 6% 37.52m ± 2% ~ (p=0.739 n=10) Collect10000/ObservabilityEnabled-8 39.46m ± 2% 39.81m ± 19% ~ (p=0.436 n=10) geomean 672.6µ 654.6µ -2.68% │ main.bmark.result │ prom-optimize-observ.bmark.result │ │ B/op │ B/op vs base │ Collect1/ObservabilityDisabled-8 34.40Ki ± 0% 34.40Ki ± 0% ~ (p=0.075 n=10) Collect1/ObservabilityEnabled-8 34.64Ki ± 0% 34.43Ki ± 0% -0.60% (p=0.000 n=10) Collect10/ObservabilityDisabled-8 47.26Ki ± 0% 47.25Ki ± 0% ~ (p=0.093 n=10) Collect10/ObservabilityEnabled-8 47.93Ki ± 0% 47.30Ki ± 0% -1.33% (p=0.000 n=10) Collect100/ObservabilityDisabled-8 191.3Ki ± 0% 191.0Ki ± 0% ~ (p=0.218 n=10) Collect100/ObservabilityEnabled-8 197.0Ki ± 0% 191.6Ki ± 0% -2.74% (p=0.000 n=10) Collect1000/ObservabilityDisabled-8 1.902Mi ± 1% 1.891Mi ± 1% ~ (p=0.353 n=10) Collect1000/ObservabilityEnabled-8 1.935Mi ± 2% 1.889Mi ± 1% -2.38% (p=0.000 n=10) Collect10000/ObservabilityDisabled-8 17.67Mi ± 4% 18.17Mi ± 5% ~ (p=0.190 n=10) Collect10000/ObservabilityEnabled-8 18.62Mi ± 4% 17.98Mi ± 6% -3.42% (p=0.035 n=10) geomean 410.4Ki 406.9Ki -0.85% │ main.bmark.result │ prom-optimize-observ.bmark.result │ │ allocs/op │ allocs/op vs base │ Collect1/ObservabilityDisabled-8 61.00 ± 0% 61.00 ± 0% ~ (p=1.000 n=10) ¹ Collect1/ObservabilityEnabled-8 64.00 ± 0% 61.00 ± 0% -4.69% (p=0.000 n=10) Collect10/ObservabilityDisabled-8 410.0 ± 0% 410.0 ± 0% ~ (p=1.000 n=10) ¹ Collect10/ObservabilityEnabled-8 423.0 ± 0% 411.0 ± 0% -2.84% (p=0.000 n=10) Collect100/ObservabilityDisabled-8 3.874k ± 0% 3.874k ± 0% ~ (p=0.272 n=10) Collect100/ObservabilityEnabled-8 3.979k ± 0% 3.876k ± 0% -2.59% (p=0.000 n=10) Collect1000/ObservabilityDisabled-8 38.90k ± 0% 38.88k ± 0% ~ (p=0.306 n=10) Collect1000/ObservabilityEnabled-8 39.88k ± 0% 38.88k ± 0% -2.51% (p=0.000 n=10) Collect10000/ObservabilityDisabled-8 387.9k ± 0% 388.9k ± 0% ~ (p=0.138 n=10) Collect10000/ObservabilityEnabled-8 399.0k ± 0% 388.6k ± 1% -2.60% (p=0.000 n=10) geomean 4.364k 4.298k -1.52% ¹ all samples are equal ``` #### `prometheus/internal/observ` ```terminal goos: linux goarch: amd64 pkg: go.opentelemetry.io/otel/exporters/prometheus/internal/observ cpu: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz │ main.bmark.result │ prom-optimize-observ.bmark.result │ │ sec/op │ sec/op vs base │ InstrumentationExportMetrics/NoError-8 92.64n ± 7% 56.07n ± 5% -39.48% (p=0.000 n=10) InstrumentationExportMetrics/AllError-8 664.6n ± 4% 579.9n ± 4% -12.74% (p=0.000 n=10) InstrumentationExportMetrics/PartialError-8 637.5n ± 10% 579.1n ± 6% -9.15% (p=0.000 n=10) InstrumentationRecordOperationDuration/NoError-8 148.3n ± 5% 109.9n ± 3% -25.89% (p=0.000 n=10) InstrumentationRecordOperationDuration/Error-8 709.9n ± 8% 613.5n ± 3% -13.58% (p=0.000 n=10) InstrumentationRecordCollectionDuration/NoError-8 150.9n ± 11% 114.1n ± 5% -24.35% (p=0.000 n=10) InstrumentationRecordCollectionDuration/Error-8 723.5n ± 12% 629.2n ± 2% -13.04% (p=0.000 n=10) geomean 332.7n 264.8n -20.42% │ main.bmark.result │ prom-optimize-observ.bmark.result │ │ B/op │ B/op vs base │ InstrumentationExportMetrics/NoError-8 48.00 ± 0% 0.00 ± 0% -100.00% (p=0.000 n=10) InstrumentationExportMetrics/AllError-8 264.0 ± 0% 216.0 ± 0% -18.18% (p=0.000 n=10) InstrumentationExportMetrics/PartialError-8 264.0 ± 0% 216.0 ± 0% -18.18% (p=0.000 n=10) InstrumentationRecordOperationDuration/NoError-8 80.00 ± 0% 0.00 ± 0% -100.00% (p=0.000 n=10) InstrumentationRecordOperationDuration/Error-8 296.0 ± 0% 216.0 ± 0% -27.03% (p=0.000 n=10) InstrumentationRecordCollectionDuration/NoError-8 80.00 ± 0% 0.00 ± 0% -100.00% (p=0.000 n=10) InstrumentationRecordCollectionDuration/Error-8 296.0 ± 0% 216.0 ± 0% -27.03% (p=0.000 n=10) geomean 152.0 ? ¹ ² ¹ summaries must be >0 to compute geomean ² ratios must be >0 to compute geomean │ main.bmark.result │ prom-optimize-observ.bmark.result │ │ allocs/op │ allocs/op vs base │ InstrumentationExportMetrics/NoError-8 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.000 n=10) InstrumentationExportMetrics/AllError-8 3.000 ± 0% 2.000 ± 0% -33.33% (p=0.000 n=10) InstrumentationExportMetrics/PartialError-8 3.000 ± 0% 2.000 ± 0% -33.33% (p=0.000 n=10) InstrumentationRecordOperationDuration/NoError-8 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.000 n=10) InstrumentationRecordOperationDuration/Error-8 3.000 ± 0% 2.000 ± 0% -33.33% (p=0.000 n=10) InstrumentationRecordCollectionDuration/NoError-8 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.000 n=10) InstrumentationRecordCollectionDuration/Error-8 3.000 ± 0% 2.000 ± 0% -33.33% (p=0.000 n=10) geomean 1.873 ? ¹ ² ¹ summaries must be >0 to compute geomean ² ratios must be >0 to compute geomean ```
2025-09-25 11:39:53 -07:00
}
Optimize Observability return types in in Prometheus exporter (#7410) Do not allocate a return function from `ExportMetrics`, `RecordCollectionDuration`, or `RecordOperationDuration` to the heap. Use the added `ExportOp` or `Timer` type instead. ### Benchmarks #### `prometheus` ``` goos: linux goarch: amd64 pkg: go.opentelemetry.io/otel/exporters/prometheus cpu: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz │ main.bmark.result │ prom-optimize-observ.bmark.result │ │ sec/op │ sec/op vs base │ Collect1/ObservabilityDisabled-8 27.59µ ± 7% 27.55µ ± 2% ~ (p=0.631 n=10) Collect1/ObservabilityEnabled-8 29.23µ ± 1% 27.25µ ± 7% -6.78% (p=0.004 n=10) Collect10/ObservabilityDisabled-8 70.75µ ± 3% 66.81µ ± 4% -5.57% (p=0.003 n=10) Collect10/ObservabilityEnabled-8 75.41µ ± 5% 71.13µ ± 5% -5.68% (p=0.002 n=10) Collect100/ObservabilityDisabled-8 420.7µ ± 4% 425.4µ ± 6% ~ (p=0.912 n=10) Collect100/ObservabilityEnabled-8 432.3µ ± 3% 422.2µ ± 5% ~ (p=0.105 n=10) Collect1000/ObservabilityDisabled-8 3.929m ± 31% 3.808m ± 2% -3.09% (p=0.001 n=10) Collect1000/ObservabilityEnabled-8 4.150m ± 1% 3.964m ± 4% -4.48% (p=0.003 n=10) Collect10000/ObservabilityDisabled-8 37.64m ± 6% 37.52m ± 2% ~ (p=0.739 n=10) Collect10000/ObservabilityEnabled-8 39.46m ± 2% 39.81m ± 19% ~ (p=0.436 n=10) geomean 672.6µ 654.6µ -2.68% │ main.bmark.result │ prom-optimize-observ.bmark.result │ │ B/op │ B/op vs base │ Collect1/ObservabilityDisabled-8 34.40Ki ± 0% 34.40Ki ± 0% ~ (p=0.075 n=10) Collect1/ObservabilityEnabled-8 34.64Ki ± 0% 34.43Ki ± 0% -0.60% (p=0.000 n=10) Collect10/ObservabilityDisabled-8 47.26Ki ± 0% 47.25Ki ± 0% ~ (p=0.093 n=10) Collect10/ObservabilityEnabled-8 47.93Ki ± 0% 47.30Ki ± 0% -1.33% (p=0.000 n=10) Collect100/ObservabilityDisabled-8 191.3Ki ± 0% 191.0Ki ± 0% ~ (p=0.218 n=10) Collect100/ObservabilityEnabled-8 197.0Ki ± 0% 191.6Ki ± 0% -2.74% (p=0.000 n=10) Collect1000/ObservabilityDisabled-8 1.902Mi ± 1% 1.891Mi ± 1% ~ (p=0.353 n=10) Collect1000/ObservabilityEnabled-8 1.935Mi ± 2% 1.889Mi ± 1% -2.38% (p=0.000 n=10) Collect10000/ObservabilityDisabled-8 17.67Mi ± 4% 18.17Mi ± 5% ~ (p=0.190 n=10) Collect10000/ObservabilityEnabled-8 18.62Mi ± 4% 17.98Mi ± 6% -3.42% (p=0.035 n=10) geomean 410.4Ki 406.9Ki -0.85% │ main.bmark.result │ prom-optimize-observ.bmark.result │ │ allocs/op │ allocs/op vs base │ Collect1/ObservabilityDisabled-8 61.00 ± 0% 61.00 ± 0% ~ (p=1.000 n=10) ¹ Collect1/ObservabilityEnabled-8 64.00 ± 0% 61.00 ± 0% -4.69% (p=0.000 n=10) Collect10/ObservabilityDisabled-8 410.0 ± 0% 410.0 ± 0% ~ (p=1.000 n=10) ¹ Collect10/ObservabilityEnabled-8 423.0 ± 0% 411.0 ± 0% -2.84% (p=0.000 n=10) Collect100/ObservabilityDisabled-8 3.874k ± 0% 3.874k ± 0% ~ (p=0.272 n=10) Collect100/ObservabilityEnabled-8 3.979k ± 0% 3.876k ± 0% -2.59% (p=0.000 n=10) Collect1000/ObservabilityDisabled-8 38.90k ± 0% 38.88k ± 0% ~ (p=0.306 n=10) Collect1000/ObservabilityEnabled-8 39.88k ± 0% 38.88k ± 0% -2.51% (p=0.000 n=10) Collect10000/ObservabilityDisabled-8 387.9k ± 0% 388.9k ± 0% ~ (p=0.138 n=10) Collect10000/ObservabilityEnabled-8 399.0k ± 0% 388.6k ± 1% -2.60% (p=0.000 n=10) geomean 4.364k 4.298k -1.52% ¹ all samples are equal ``` #### `prometheus/internal/observ` ```terminal goos: linux goarch: amd64 pkg: go.opentelemetry.io/otel/exporters/prometheus/internal/observ cpu: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz │ main.bmark.result │ prom-optimize-observ.bmark.result │ │ sec/op │ sec/op vs base │ InstrumentationExportMetrics/NoError-8 92.64n ± 7% 56.07n ± 5% -39.48% (p=0.000 n=10) InstrumentationExportMetrics/AllError-8 664.6n ± 4% 579.9n ± 4% -12.74% (p=0.000 n=10) InstrumentationExportMetrics/PartialError-8 637.5n ± 10% 579.1n ± 6% -9.15% (p=0.000 n=10) InstrumentationRecordOperationDuration/NoError-8 148.3n ± 5% 109.9n ± 3% -25.89% (p=0.000 n=10) InstrumentationRecordOperationDuration/Error-8 709.9n ± 8% 613.5n ± 3% -13.58% (p=0.000 n=10) InstrumentationRecordCollectionDuration/NoError-8 150.9n ± 11% 114.1n ± 5% -24.35% (p=0.000 n=10) InstrumentationRecordCollectionDuration/Error-8 723.5n ± 12% 629.2n ± 2% -13.04% (p=0.000 n=10) geomean 332.7n 264.8n -20.42% │ main.bmark.result │ prom-optimize-observ.bmark.result │ │ B/op │ B/op vs base │ InstrumentationExportMetrics/NoError-8 48.00 ± 0% 0.00 ± 0% -100.00% (p=0.000 n=10) InstrumentationExportMetrics/AllError-8 264.0 ± 0% 216.0 ± 0% -18.18% (p=0.000 n=10) InstrumentationExportMetrics/PartialError-8 264.0 ± 0% 216.0 ± 0% -18.18% (p=0.000 n=10) InstrumentationRecordOperationDuration/NoError-8 80.00 ± 0% 0.00 ± 0% -100.00% (p=0.000 n=10) InstrumentationRecordOperationDuration/Error-8 296.0 ± 0% 216.0 ± 0% -27.03% (p=0.000 n=10) InstrumentationRecordCollectionDuration/NoError-8 80.00 ± 0% 0.00 ± 0% -100.00% (p=0.000 n=10) InstrumentationRecordCollectionDuration/Error-8 296.0 ± 0% 216.0 ± 0% -27.03% (p=0.000 n=10) geomean 152.0 ? ¹ ² ¹ summaries must be >0 to compute geomean ² ratios must be >0 to compute geomean │ main.bmark.result │ prom-optimize-observ.bmark.result │ │ allocs/op │ allocs/op vs base │ InstrumentationExportMetrics/NoError-8 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.000 n=10) InstrumentationExportMetrics/AllError-8 3.000 ± 0% 2.000 ± 0% -33.33% (p=0.000 n=10) InstrumentationExportMetrics/PartialError-8 3.000 ± 0% 2.000 ± 0% -33.33% (p=0.000 n=10) InstrumentationRecordOperationDuration/NoError-8 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.000 n=10) InstrumentationRecordOperationDuration/Error-8 3.000 ± 0% 2.000 ± 0% -33.33% (p=0.000 n=10) InstrumentationRecordCollectionDuration/NoError-8 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.000 n=10) InstrumentationRecordCollectionDuration/Error-8 3.000 ± 0% 2.000 ± 0% -33.33% (p=0.000 n=10) geomean 1.873 ? ¹ ² ¹ summaries must be >0 to compute geomean ² ratios must be >0 to compute geomean ```
2025-09-25 11:39:53 -07:00
func benchmarkCollect(b *testing.B, n int) {
b.Run("ObservabilityDisabled", run(n))
b.Run("ObservabilityEnabled", func(b *testing.B) {
b.Setenv("OTEL_GO_X_OBSERVABILITY", "true")
bmark := run(n)
bmark(b)
})
}
func BenchmarkCollect1(b *testing.B) { benchmarkCollect(b, 1) }
func BenchmarkCollect10(b *testing.B) { benchmarkCollect(b, 10) }
func BenchmarkCollect100(b *testing.B) { benchmarkCollect(b, 100) }
func BenchmarkCollect1000(b *testing.B) { benchmarkCollect(b, 1000) }
func BenchmarkCollect10000(b *testing.B) { benchmarkCollect(b, 10000) }