1
0
mirror of https://github.com/open-telemetry/opentelemetry-go.git synced 2026-06-03 18:35:08 +02:00
Commit Graph

8 Commits

Author SHA1 Message Date
Andrew Wilkins e2da30d7d0 trace,metric,log: change WithInstrumentationAttributes to not de-depuplicate the passed attributes in a closure (#7266)
WithInstrumentationAttributes is creating a closure with a reference to
a slice which is later passed to attribute.NewSet.

attribute.NewSet may mutate the slice, so this will lead to a data race
when the option is applied concurrently. We can fix this by moving the
call to attribute.NewSet outside the closure.

Fixes #7217

<details>
<summary>benchstat for New*Config</summary>

```
goos: linux
goarch: amd64
pkg: go.opentelemetry.io/otel/log
cpu: Intel(R) Core(TM) Ultra 7 155U
                                                      │ /tmp/old.txt │            /tmp/new.txt            │
                                                      │    sec/op    │   sec/op     vs base               │
NewLoggerConfig/with_no_options-14                       2.961n ± 6%   3.091n ± 6%        ~ (p=0.132 n=6)
NewLoggerConfig/with_an_instrumentation_version-14       24.75n ± 4%   25.04n ± 5%        ~ (p=0.126 n=6)
NewLoggerConfig/with_a_schema_url-14                     24.97n ± 6%   24.79n ± 4%        ~ (p=0.974 n=6)
NewLoggerConfig/with_instrumentation_attribute-14        55.32n ± 4%   25.32n ± 4%  -54.23% (p=0.002 n=6)
NewLoggerConfig/with_instrumentation_attribute_set-14    24.77n ± 3%   24.96n ± 4%        ~ (p=0.394 n=6)
geomean                                                  19.05n        16.47n       -13.52%

                                                      │ /tmp/old.txt │              /tmp/new.txt              │
                                                      │     B/op     │    B/op     vs base                    │
NewLoggerConfig/with_no_options-14                      0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewLoggerConfig/with_an_instrumentation_version-14      0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewLoggerConfig/with_a_schema_url-14                    0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewLoggerConfig/with_instrumentation_attribute-14       64.00 ± 0%      0.00 ± 0%  -100.00% (p=0.002 n=6)
NewLoggerConfig/with_instrumentation_attribute_set-14   0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
geomean                                                            ²               ?                      ² ³
¹ all samples are equal
² summaries must be >0 to compute geomean
³ ratios must be >0 to compute geomean

                                                      │ /tmp/old.txt │              /tmp/new.txt              │
                                                      │  allocs/op   │ allocs/op   vs base                    │
NewLoggerConfig/with_no_options-14                      0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewLoggerConfig/with_an_instrumentation_version-14      0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewLoggerConfig/with_a_schema_url-14                    0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewLoggerConfig/with_instrumentation_attribute-14       1.000 ± 0%     0.000 ± 0%  -100.00% (p=0.002 n=6)
NewLoggerConfig/with_instrumentation_attribute_set-14   0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
geomean                                                            ²               ?                      ² ³
¹ all samples are equal
² summaries must be >0 to compute geomean
³ ratios must be >0 to compute geomean

pkg: go.opentelemetry.io/otel/metric
                                                     │ /tmp/old.txt │            /tmp/new.txt            │
                                                     │    sec/op    │   sec/op     vs base               │
NewMeterConfig/with_no_options-14                       3.255n ± 2%   3.045n ± 4%   -6.42% (p=0.002 n=6)
NewMeterConfig/with_an_instrumentation_version-14       22.84n ± 6%   23.14n ± 3%        ~ (p=0.818 n=6)
NewMeterConfig/with_a_schema_url-14                     24.71n ± 5%   25.29n ± 4%        ~ (p=0.132 n=6)
NewMeterConfig/with_instrumentation_attribute-14        61.30n ± 5%   25.36n ± 7%  -58.63% (p=0.002 n=6)
NewMeterConfig/with_instrumentation_attribute_set-14    25.93n ± 5%   26.24n ± 4%        ~ (p=0.485 n=6)
geomean                                                 19.64n        16.40n       -16.49%

                                                     │ /tmp/old.txt │              /tmp/new.txt              │
                                                     │     B/op     │    B/op     vs base                    │
NewMeterConfig/with_no_options-14                      0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewMeterConfig/with_an_instrumentation_version-14      0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewMeterConfig/with_a_schema_url-14                    0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewMeterConfig/with_instrumentation_attribute-14       64.00 ± 0%      0.00 ± 0%  -100.00% (p=0.002 n=6)
NewMeterConfig/with_instrumentation_attribute_set-14   0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
geomean                                                           ²               ?                      ² ³
¹ all samples are equal
² summaries must be >0 to compute geomean
³ ratios must be >0 to compute geomean

                                                     │ /tmp/old.txt │              /tmp/new.txt              │
                                                     │  allocs/op   │ allocs/op   vs base                    │
NewMeterConfig/with_no_options-14                      0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewMeterConfig/with_an_instrumentation_version-14      0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewMeterConfig/with_a_schema_url-14                    0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewMeterConfig/with_instrumentation_attribute-14       1.000 ± 0%     0.000 ± 0%  -100.00% (p=0.002 n=6)
NewMeterConfig/with_instrumentation_attribute_set-14   0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
geomean                                                           ²               ?                      ² ³
¹ all samples are equal
² summaries must be >0 to compute geomean
³ ratios must be >0 to compute geomean

pkg: go.opentelemetry.io/otel/trace
                                                         │ /tmp/old.txt  │            /tmp/new.txt             │
                                                         │    sec/op     │    sec/op     vs base               │
NewTracerConfig/with_no_options-14                          2.980n ±  5%   2.948n ±  3%        ~ (p=0.240 n=6)
NewTracerConfig/with_an_instrumentation_version-14          24.44n ±  4%   23.54n ±  1%   -3.70% (p=0.002 n=6)
NewTracerConfig/with_a_schema_url-14                        24.47n ±  5%   23.95n ±  7%        ~ (p=0.180 n=6)
NewTracerConfig/with_instrumentation_attribute-14           58.39n ±  7%   25.54n ±  6%  -56.25% (p=0.002 n=6)
NewTracerConfig/with_instrumentation_attribute_set-14       25.70n ±  3%   26.55n ±  6%        ~ (p=0.310 n=6)
NewSpanStartConfig/with_no_options-14                       2.670n ±  7%   2.838n ±  6%        ~ (p=0.093 n=6)
NewSpanStartConfig/with_attributes-14                       60.65n ± 20%   51.84n ±  8%        ~ (p=0.240 n=6)
NewSpanStartConfig/with_attributes_set_multiple_times-14    115.4n ± 10%   110.0n ±  7%   -4.68% (p=0.004 n=6)
NewSpanStartConfig/with_a_timestamp-14                      18.03n ±  3%   17.77n ±  4%        ~ (p=0.937 n=6)
NewSpanStartConfig/with_links-14                            66.63n ±  8%   75.60n ±  8%  +13.47% (p=0.009 n=6)
NewSpanStartConfig/with_links_set_multiple_times-14         155.2n ±  4%   162.8n ± 18%        ~ (p=0.485 n=6)
NewSpanStartConfig/with_new_root-14                         26.59n ± 19%   23.04n ±  4%  -13.32% (p=0.004 n=6)
NewSpanStartConfig/with_span_kind-14                        24.02n ±  4%   23.72n ±  9%        ~ (p=0.589 n=6)
NewSpanEndConfig/with_no_options-14                         2.673n ± 10%   2.765n ±  7%        ~ (p=0.485 n=6)
NewSpanEndConfig/with_a_timestamp-14                        17.37n ±  9%   18.04n ±  4%        ~ (p=0.093 n=6)
NewSpanEndConfig/with_stack_trace-14                        16.70n ±  3%   16.59n ±  4%        ~ (p=0.937 n=6)
NewEventConfig/with_no_options-14                           37.14n ±  6%   36.63n ±  3%        ~ (p=0.818 n=6)
NewEventConfig/with_attributes-14                          117.15n ±  9%   98.92n ± 14%  -15.56% (p=0.009 n=6)
NewEventConfig/with_attributes_set_multiple_times-14        172.6n ±  5%   168.1n ±  9%        ~ (p=0.333 n=6)
NewEventConfig/with_a_timestamp-14                          25.41n ±  3%   26.66n ±  3%   +4.92% (p=0.002 n=6)
NewEventConfig/with_a_stacktrace-14                         51.01n ± 15%   52.45n ±  2%        ~ (p=0.093 n=6)
geomean                                                     28.82n         27.38n         -4.98%

                                                         │ /tmp/old.txt │              /tmp/new.txt              │
                                                         │     B/op     │    B/op     vs base                    │
NewTracerConfig/with_no_options-14                         0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewTracerConfig/with_an_instrumentation_version-14         0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewTracerConfig/with_a_schema_url-14                       0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewTracerConfig/with_instrumentation_attribute-14          64.00 ± 0%      0.00 ± 0%  -100.00% (p=0.002 n=6)
NewTracerConfig/with_instrumentation_attribute_set-14      0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewSpanStartConfig/with_no_options-14                      0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewSpanStartConfig/with_attributes-14                      64.00 ± 0%     64.00 ± 0%         ~ (p=1.000 n=6) ¹
NewSpanStartConfig/with_attributes_set_multiple_times-14   192.0 ± 0%     192.0 ± 0%         ~ (p=1.000 n=6) ¹
NewSpanStartConfig/with_a_timestamp-14                     0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewSpanStartConfig/with_links-14                           96.00 ± 0%     96.00 ± 0%         ~ (p=1.000 n=6) ¹
NewSpanStartConfig/with_links_set_multiple_times-14        272.0 ± 0%     272.0 ± 0%         ~ (p=1.000 n=6) ¹
NewSpanStartConfig/with_new_root-14                        0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewSpanStartConfig/with_span_kind-14                       0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewSpanEndConfig/with_no_options-14                        0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewSpanEndConfig/with_a_timestamp-14                       0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewSpanEndConfig/with_stack_trace-14                       0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewEventConfig/with_no_options-14                          0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewEventConfig/with_attributes-14                          64.00 ± 0%     64.00 ± 0%         ~ (p=1.000 n=6) ¹
NewEventConfig/with_attributes_set_multiple_times-14       192.0 ± 0%     192.0 ± 0%         ~ (p=1.000 n=6) ¹
NewEventConfig/with_a_timestamp-14                         0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewEventConfig/with_a_stacktrace-14                        0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
geomean                                                               ²               ?                      ² ³
¹ all samples are equal
² summaries must be >0 to compute geomean
³ ratios must be >0 to compute geomean

                                                         │ /tmp/old.txt │              /tmp/new.txt              │
                                                         │  allocs/op   │ allocs/op   vs base                    │
NewTracerConfig/with_no_options-14                         0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewTracerConfig/with_an_instrumentation_version-14         0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewTracerConfig/with_a_schema_url-14                       0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewTracerConfig/with_instrumentation_attribute-14          1.000 ± 0%     0.000 ± 0%  -100.00% (p=0.002 n=6)
NewTracerConfig/with_instrumentation_attribute_set-14      0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewSpanStartConfig/with_no_options-14                      0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewSpanStartConfig/with_attributes-14                      1.000 ± 0%     1.000 ± 0%         ~ (p=1.000 n=6) ¹
NewSpanStartConfig/with_attributes_set_multiple_times-14   2.000 ± 0%     2.000 ± 0%         ~ (p=1.000 n=6) ¹
NewSpanStartConfig/with_a_timestamp-14                     0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewSpanStartConfig/with_links-14                           1.000 ± 0%     1.000 ± 0%         ~ (p=1.000 n=6) ¹
NewSpanStartConfig/with_links_set_multiple_times-14        2.000 ± 0%     2.000 ± 0%         ~ (p=1.000 n=6) ¹
NewSpanStartConfig/with_new_root-14                        0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewSpanStartConfig/with_span_kind-14                       0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewSpanEndConfig/with_no_options-14                        0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewSpanEndConfig/with_a_timestamp-14                       0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewSpanEndConfig/with_stack_trace-14                       0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewEventConfig/with_no_options-14                          0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewEventConfig/with_attributes-14                          1.000 ± 0%     1.000 ± 0%         ~ (p=1.000 n=6) ¹
NewEventConfig/with_attributes_set_multiple_times-14       2.000 ± 0%     2.000 ± 0%         ~ (p=1.000 n=6) ¹
NewEventConfig/with_a_timestamp-14                         0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
NewEventConfig/with_a_stacktrace-14                        0.000 ± 0%     0.000 ± 0%         ~ (p=1.000 n=6) ¹
geomean                                                               ²               ?                      ² ³
¹ all samples are equal
² summaries must be >0 to compute geomean
³ ratios must be >0 to compute geomean
```
</details>

---------

Co-authored-by: Robert Pająk <pellared@hotmail.com>
Co-authored-by: Flc゛ <four_leaf_clover@foxmail.com>
Co-authored-by: Tyler Yahn <MrAlias@users.noreply.github.com>
2025-09-11 08:47:22 -07:00
Robert Pająk 07a91dd2b0 trace,metric,log: add WithInstrumentationAttributeSet option (#7287)
Per
https://github.com/open-telemetry/opentelemetry-go/pull/7266#issuecomment-3237027300

Related to
https://github.com/open-telemetry/opentelemetry-go/issues/7217

## What

This PR adds `WithInstrumentationAttributeSet` option functions to the
`log`, `metric`, and `trace` packages as suggested in
https://github.com/open-telemetry/opentelemetry-go/pull/7266#issuecomment-3237027300.
These new functions provide a more concurrent-safe alternative to the
existing `WithInstrumentationAttributes` functions by accepting a
pre-constructed `attribute.Set` instead of variadic `attribute.KeyValue`
parameters.

## Why

As discussed in #7266, the existing `WithInstrumentationAttributes`
functions can lead to data races when used concurrently because
`attribute.NewSet()` may mutate the passed slice in-place. While the
issue was partially addressed by moving the `attribute.NewSet()` call
outside the closure, the best long-term solution is to provide an
alternative that accepts an immutable `attribute.Set`.

**Benefits:**

1. **Concurrent Safety**: Since `attribute.Set` is immutable, these
functions are inherently safe for concurrent use
2. **Performance**: Avoids repeated calls to `attribute.NewSet()` when
the same attributes are used multiple times
3. **Consistency**: Matches the existing pattern used in
`metric.WithAttributeSet()`
4. **Flexibility**: Allows users to pre-compute attribute sets and reuse
them

Deprecating `WithInstrumentationAttributes` is out of scope. See
https://github.com/open-telemetry/opentelemetry-go/pull/7287#issuecomment-3245820459.

## Benchmarks

```
goos: linux
goarch: amd64
pkg: go.opentelemetry.io/otel/trace
cpu: 13th Gen Intel(R) Core(TM) i7-13800H
BenchmarkNewTracerConfig/with_no_options-20         	280298306	         4.268 ns/op	       0 B/op	       0 allocs/op
BenchmarkNewTracerConfig/with_an_instrumentation_version-20         	33389427	        30.84 ns/op	       0 B/op	       0 allocs/op
BenchmarkNewTracerConfig/with_a_schema_url-20                       	35441077	        30.46 ns/op	       0 B/op	       0 allocs/op
BenchmarkNewTracerConfig/with_instrumentation_attribute-20          	17607649	        88.23 ns/op	      64 B/op	       1 allocs/op
BenchmarkNewTracerConfig/with_instrumentation_attribute_set-20      	38336211	        31.30 ns/op	       0 B/op	       0 allocs/op
```

```
goos: linux
goarch: amd64
pkg: go.opentelemetry.io/otel/metric
cpu: 13th Gen Intel(R) Core(TM) i7-13800H
BenchmarkNewMeterConfig/with_no_options-20         	262998199	         4.525 ns/op	       0 B/op	       0 allocs/op
BenchmarkNewMeterConfig/with_an_instrumentation_version-20         	40483780	        29.31 ns/op	       0 B/op	       0 allocs/op
BenchmarkNewMeterConfig/with_a_schema_url-20                       	39162420	        30.58 ns/op	       0 B/op	       0 allocs/op
BenchmarkNewMeterConfig/with_instrumentation_attribute-20          	19900275	        77.50 ns/op	      64 B/op	       1 allocs/op
BenchmarkNewMeterConfig/with_instrumentation_attribute_set-20      	37519020	        31.93 ns/op	       0 B/op	       0 allocs/op
```

```
goos: linux
goarch: amd64
pkg: go.opentelemetry.io/otel/log
cpu: 13th Gen Intel(R) Core(TM) i7-13800H
BenchmarkNewLoggerConfig/with_no_options-20         	271100760	         4.322 ns/op	       0 B/op	       0 allocs/op
BenchmarkNewLoggerConfig/with_an_instrumentation_version-20         	38392390	        30.77 ns/op	       0 B/op	       0 allocs/op
BenchmarkNewLoggerConfig/with_a_schema_url-20                       	39615074	        30.25 ns/op	       0 B/op	       0 allocs/op
BenchmarkNewLoggerConfig/with_instrumentation_attribute-20          	17108463	        82.51 ns/op	      64 B/op	       1 allocs/op
BenchmarkNewLoggerConfig/with_instrumentation_attribute_set-20      	37746534	        31.70 ns/op	       0 B/op	       0 allocs/op
```
2025-09-08 17:21:37 +02:00
Robert Pająk dcf14aa937 trace,metric,log: WithInstrumentationAttributes options to merge attributes (#7300)
## What

Fix `WithInstrumentationAttributes` options in
`go.opentelemetry.io/otel/trace`, `go.opentelemetry.io/otel/metric`, and
`go.opentelemetry.io/otel/log` to properly merge attributes when passed
multiple times instead of replacing them. Attributes with duplicate keys
will use the last value passed.

## Why

Per
https://github.com/open-telemetry/opentelemetry-go/pull/7287#pullrequestreview-3181379062
and
https://github.com/open-telemetry/opentelemetry-go/pull/7287#issuecomment-3250085450

Not that this does not address
https://github.com/open-telemetry/opentelemetry-go/issues/7217. This is
left to a seperate PR to not scope creep this one. CC @axw

---------

Co-authored-by: Damien Mathieu <42@dmathieu.com>
2025-09-08 10:46:08 +02:00
Damien Mathieu 0174808b2b Fix schema urls (#7288)
The 1.0.0 schema now returns a 404 on opentelemetry.io.
2025-09-02 14:51:02 +02:00
Robert Pająk 7dea232a46 [chore] Simplify the license header (#4987) 2024-02-29 07:05:28 +01:00
Tyler Yahn c5c3c95077 Accept scope attributes during Meter creation (#3738)
* Accept scope attr during Meter creation

* Fix lint

* Add changes to changelog

* Return a Set from InstrumentationAttributes

Likely these attributes will be stored as a Set in the SDK. Don't cause
two conversions because we return a slice here.

* Add config tests

* Fix lint
2023-02-17 10:00:19 -08:00
Aaron Clawson 7aba25d651 Revert Adding attributes to the instrumentation scope.
Revert "Add instrumentation scope attributes (#3131)" (#3154)

This reverts commit 0078faeb0e.

Revert "Add WithScopeAttributes MeterOption to metric API package (#3132)"

This reverts commit 81a9bab814.
2022-09-09 09:06:58 -05:00
Tyler Yahn 81a9bab814 Add WithScopeAttributes MeterOption to metric API package (#3132)
* Add WithScopeAttributes MeterOption to metric pkg

* Add MeterConfig unit tests

* Add changes to changelog

* Fix import linting

* Update MeterProvider documentation

Include information about how to use WithScopeAttributes.
2022-09-01 14:19:03 -07:00