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

7 Commits

Author SHA1 Message Date
David Ashpole 28df982c8b Add support for experimental options in the metrics API (#8111)
Part of https://github.com/open-telemetry/opentelemetry-go/issues/8110

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

I'm hoping to find a better way to support experimental Options types in
our API packages. This is one approach to consider.

This contains no public API changes. It introduces a type:
`ExperimentalOption` in `/metric/internal/x`, which can be used by our
experimental options defined outside of the module. Options that embed
this interface are ignored by `New*Config` builder functions in the
metrics API to prevent them from panicing when used. Only SDKs that
explicitly support the experimental option in question will respect it.
Alternative SDKs will ignore the experimental options. We would still
need to treat ExperimentalOption as a stable artifact, since the SDK
will indirectly depend on it.

See
https://github.com/open-telemetry/opentelemetry-go/compare/main...dashpole:opentelemetry-go:attributes_advisory
for how this would be used to support the advisory attributes parameter.
2026-04-03 15:56:57 -04:00
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 e3e8879eb3 Implement the LoggerConfig and add the LoggerOptions (#4937)
* Implement the LoggerConfig

* Add the LoggerOptions

* Add NewLoggerConfig test
2024-02-18 08:13:42 -08:00