Skip to content

Apply attribute value limit for BYTESLICE and KindBytes#7990

Merged
pellared merged 41 commits into
open-telemetry:mainfrom
NesterovYehor:feat/bytes-limit
Apr 29, 2026
Merged

Apply attribute value limit for BYTESLICE and KindBytes#7990
pellared merged 41 commits into
open-telemetry:mainfrom
NesterovYehor:feat/bytes-limit

Conversation

@NesterovYehor

@NesterovYehor NesterovYehor commented Mar 3, 2026

Copy link
Copy Markdown
Contributor

Fixes #7954

Apply the SDK attribute value limit to the new BYTESLICE attribute type.

The limiter has been implemented for trace and log attributes, ensuring values are truncated according to the configured attribute size limit (counting each byte as 1).

goos: darwin
goarch: arm64
pkg: go.opentelemetry.io/otel/sdk/trace
cpu: Apple M1
BenchmarkSpanLimits/None-8         	  275883	      4062 ns/op	   12448 B/op	      38 allocs/op
BenchmarkSpanLimits/AttributeValueLengthLimit-8         	  266834	      4407 ns/op	   13012 B/op	      47 allocs/op
BenchmarkSpanLimits/AttributeCountLimit-8               	  299941	      4025 ns/op	   11616 B/op	      38 allocs/op
BenchmarkSpanLimits/EventCountLimit-8                   	  305880	      3795 ns/op	   11376 B/op	      35 allocs/op
BenchmarkSpanLimits/LinkCountLimit-8                    	  314924	      4375 ns/op	   10976 B/op	      35 allocs/op
BenchmarkSpanLimits/AttributePerEventCountLimit-8       	  275667	      4125 ns/op	   12448 B/op	      38 allocs/op
BenchmarkSpanLimits/AttributePerLinkCountLimit-8        	  285484	      4022 ns/op	   12448 B/op	      38 allocs/op
PASS
ok  	go.opentelemetry.io/otel/sdk/trace	9.394s

@NesterovYehor NesterovYehor marked this pull request as draft March 3, 2026 11:55
Comment thread sdk/log/record.go
Comment thread sdk/log/record_test.go Outdated

@pellared pellared left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The approach looks good 👍 I think we can try shipping support for bytes in the upcoming release.

@codecov

codecov Bot commented Mar 3, 2026

Copy link
Copy Markdown

Codecov Report

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

Additional details and impacted files

Impacted file tree graph

@@           Coverage Diff           @@
##            main   #7990     +/-   ##
=======================================
- Coverage   82.9%   82.9%   -0.1%     
=======================================
  Files        314     314             
  Lines      24911   24934     +23     
=======================================
+ Hits       20665   20680     +15     
- Misses      3875    3882      +7     
- Partials     371     372      +1     
Files with missing lines Coverage Δ
sdk/log/provider.go 97.8% <ø> (ø)
sdk/log/record.go 100.0% <100.0%> (ø)
sdk/trace/span.go 87.2% <100.0%> (+0.3%) ⬆️
sdk/trace/span_limits.go 100.0% <ø> (ø)
trace/auto.go 97.4% <100.0%> (+<0.1%) ⬆️

... and 2 files with indirect coverage changes

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

@NesterovYehor NesterovYehor marked this pull request as ready for review March 7, 2026 14:14
@pellared pellared marked this pull request as draft April 7, 2026 09:24
@pellared

pellared commented Apr 7, 2026

Copy link
Copy Markdown
Member

Changed to draft. Please click "Ready for review" once the PR is ready 😉

@NesterovYehor NesterovYehor marked this pull request as ready for review April 7, 2026 10:28
@NesterovYehor

Copy link
Copy Markdown
Contributor Author

@pellared Sorry for the wait, I’ve been ill for the last couple of days. I'm feeling better now and plan to finish the updates today. Thanks for the patience!

Comment thread sdk/trace/span.go Outdated

@pellared pellared left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@pellared

Copy link
Copy Markdown
Member

cd5f4b4 this was correct. The happy path was not indented.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 10 out of 10 changed files in this pull request and generated 1 comment.

Comment thread trace/auto_test.go
@pellared pellared requested review from dmathieu and flc1125 April 27, 2026 18:42
Comment thread sdk/trace/span.go Outdated
Comment thread sdk/trace/span.go Outdated
Comment thread trace/auto.go Outdated
Comment thread sdk/trace/span_limits.go
Comment thread sdk/log/provider.go
Comment thread sdk/trace/span.go Outdated
  allocations of the full byte slice.
- Ensure only the truncated portion is allocated when limits are exceeded.
- Update documentation in sdk/trace, sdk/log, and trace packages to use
  consistent "bytes" terminology instead of "byte slice".
NesterovYehor and others added 2 commits April 29, 2026 12:11
…onsistently

  use "byte slice" instead of "bytes".
- Ensure terminology aligns with previous maintainer agreements.
@pellared pellared merged commit 1a87747 into open-telemetry:main Apr 29, 2026
34 checks passed
@pellared

Copy link
Copy Markdown
Member

@NesterovYehor, thanks for your contribution

@NesterovYehor

Copy link
Copy Markdown
Contributor Author

@pellared Thanks a lot for the merge! I really appreciate your time and patience throughout the review process.

@NesterovYehor NesterovYehor deleted the feat/bytes-limit branch May 7, 2026 14:24
@pellared pellared mentioned this pull request May 26, 2026
pellared added a commit that referenced this pull request May 27, 2026
### Added

- Add `ByteSlice` and `ByteSliceValue` functions for new `BYTESLICE`
attribute type in `go.opentelemetry.io/otel/attribute`. (#7948)
- Apply attribute value limit to the `KindBytes` attribute type in
`go.opentelemetry.io/otel/sdk/log`. (#7990)
- Apply attribute value limit to the `BYTESLICE` attribute type in
`go.opentelemetry.io/otel/sdk/trace`. (#7990)
- Support `BYTESLICE` attributes in `go.opentelemetry.io/otel/trace`.
(#8153)
- Support `BYTESLICE` attributes in
`go.opentelemetry.io/otel/exporters/otlp/otlptrace`. (#8153)
- Support `BYTESLICE` attributes in
`go.opentelemetry.io/otel/exporters/otlp/otlplog`. (#8153)
- Support `BYTESLICE` attributes in
`go.opentelemetry.io/otel/exporters/otlp/otlpmetric`. (#8153)
- Support `BYTESLICE` attributes in
`go.opentelemetry.io/otel/exporters/zipkin`. (#8153)
- Add `String` method for `Value` type in
`go.opentelemetry.io/otel/attribute`. (#8142)
- Add `Slice` and `SliceValue` functions for new `SLICE` attribute type
in `go.opentelemetry.io/otel/attribute`. (#8166)
- Support `SLICE` attributes in
`go.opentelemetry.io/otel/exporters/otlp/otlptrace`. (#8216)
- Support `SLICE` attributes in
`go.opentelemetry.io/otel/exporters/otlp/otlplog`. (#8216)
- Support `SLICE` attributes in
`go.opentelemetry.io/otel/exporters/otlp/otlpmetric`. (#8216)
- Support `SLICE` attributes in
`go.opentelemetry.io/otel/exporters/zipkin`. (#8216)
- Apply `AttributeValueLengthLimit` to `attribute.SLICE` type attribute
values in `go.opentelemetry.io/otel/sdk/trace`, recursively truncating
contained string values. (#8217)
- Add `Error` field on `Record` type in
`go.opentelemetry.io/otel/log/logtest`. (#8148)
- Add `WithMaxRequestSize` option in
`go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc`.
(#8157)
- Add `WithMaxRequestSize` option in
`go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`.
(#8157)
- Add `WithMaxRequestSize` option in
`go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc`.
(#8157)
- Add `WithMaxRequestSize` option in
`go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp`.
(#8157)
- Add `WithMaxRequestSize` option in
`go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc`. (#8157)
- Add `WithMaxRequestSize` option in
`go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp`. (#8157)
- Add `Settable` to `go.opentelemetry.io/otel/metric/x` to allow reusing
attribute options. (#8178)
- Add experimental support for splitting metric data across multiple
batches in `go.opentelemetry.io/otel/sdk/metric`.
Set `OTEL_GO_X_METRIC_EXPORT_BATCH_SIZE=<max_size>` to enable for all
periodic readers.
See `go.opentelemetry.io/otel/sdk/metric/internal/x` for feature
documentation. (#8071)
- Add experimental self-observability metrics in
`go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc`.
  Enable with `OTEL_GO_X_SELF_OBSERVABILITY=true` environment variable.
See
`go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc/internal/x`
for feature documentation. (#8192)
- Add experimental self-observability metrics in
`go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp`.
  Enable with `OTEL_GO_X_SELF_OBSERVABILITY=true` environment variable.
See
`go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp/internal/x`
for feature documentation. (#8194)
- Add experimental self-observability metrics in
`go.opentelemetry.io/otel/exporters/stdout/stdoutlog`.
  Enable with `OTEL_GO_X_SELF_OBSERVABILITY=true` environment variable.
See `go.opentelemetry.io/otel/stdout/stdoutlog/internal/x` for feature
documentation. (#8263)
- Add `WithDefaultAttributes` to `go.opentelemetry.io/otel/metric/x` to
support setting default attributes on instruments. (#8135)
- Add `go.opentelemetry.io/otel/semconv/v1.41.0` package.
The package contains semantic conventions from the `v1.41.0` version of
the OpenTelemetry Semantic Conventions.
See the [migration documentation](./semconv/v1.41.0/MIGRATION.md) for
information on how to upgrade from
`go.opentelemetry.io/otel/semconv/v1.40.0`. (#8324)
- Add Observable variants of instruments to
`go.opentelemetry.io/otel/semconv/v1.41.0` package. (#8350)
- Generate explicit histogram bucket boundaries from weaver
configuration for HTTP and RPC duration instruments in
`go.opentelemetry.io/otel/semconv/v1.41.0`. (#8002)

### Changed

- ⚠️ **Breaking Change:** `go.opentelemetry.io/otel/sdk/metric` now
applies a default cardinality limit of 2000 to comply with the Metrics
SDK specification recommendation.
New attribute sets are dropped when the cardinality limit is reached.
The measurement of these sets are aggregated into a special attribute
set containing `attribute.Bool("otel.metric.overflow", true)`.
  This can break users who relied on the previous unlimited default.
Set `WithCardinalityLimit(0)` or the deprecated
`OTEL_GO_X_CARDINALITY_LIMIT=0` environment variable to preserve
unlimited cardinality.
Note that support for `OTEL_GO_X_CARDINALITY_LIMIT` may be removed in a
future release. (#8247)
- `ErrorType` in `go.opentelemetry.io/otel/semconv` now unwraps errors
created with `fmt.Errorf` when deriving the `error.type` attribute.
(#8133)
- `go.opentelemetry.io/otel/sdk/log` now unwraps error chains created
with `fmt.Errorf` when deriving the `error.type` attribute from errors
on log records. (#8133)
- `Set.MarshalLog` method in `go.opentelemetry.io/otel/attribute` now
uses `Value.String` formatting following the [OpenTelemetry AnyValue
representation for non-OTLP
protocols](https://opentelemetry.io/docs/specs/otel/common/#anyvalue).
(#8169)
- Optimize `go.opentelemetry.io/otel/sdk/metric` to return a drop
reservoir and short-circuit `Offer` calls to the exemplar reservoir when
`exemplar.AlwaysOffFilter` is configured. (#8211) (#8267)
- Optimize `go.opentelemetry.io/otel/sdk/metric` to return a drop
reservoir for asynchronous instruments when `exemplar.TraceBasedFilter`
is configured. (#8286)

### Deprecated

- Deprecate `Value.Emit` method in `go.opentelemetry.io/otel/attribute`.
  Use `Value.String` instead. (#8176)

### Fixed

- Limit OTLP request size to 64 MiB by default in
`go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc`.
The limit applies before compression, oversized requests are treated as
non-retryable errors, and the limit can be configured with the new
`WithMaxRequestSize` option. (#8157, #8365)
- Limit OTLP request size to 64 MiB by default in
`go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`.
The limit applies before compression, oversized requests are treated as
non-retryable errors, and the limit can be configured with the new
`WithMaxRequestSize` option. (#8157, #8365)
- Limit OTLP request size to 64 MiB by default in
`go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc`.
The limit applies before compression, oversized requests are treated as
non-retryable errors, and the limit can be configured with the new
`WithMaxRequestSize` option. (#8157, #8365)
- Limit OTLP request size to 64 MiB by default in
`go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp`.
The limit applies before compression, oversized requests are treated as
non-retryable errors, and the limit can be configured with the new
`WithMaxRequestSize` option. (#8157, #8365)
- Limit OTLP request size to 64 MiB by default in
`go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc`.
The limit applies before compression, oversized requests are treated as
non-retryable errors, and the limit can be configured with the new
`WithMaxRequestSize` option. (#8157, #8365)
- Limit OTLP request size to 64 MiB by default in
`go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp`.
The limit applies before compression, oversized requests are treated as
non-retryable errors, and the limit can be configured with the new
`WithMaxRequestSize` option. (#8157, #8365)
- Fix gzipped request body replay on redirect in
`go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp`.
(#8135)
- Fix gzipped request body replay on redirect in
`go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp`. (#8152)
- `go.opentelemetry.io/otel/exporters/prometheus` now uses
`Value.String` formatting for label values following the [OpenTelemetry
AnyValue representation for non-OTLP
protocols](https://opentelemetry.io/docs/specs/otel/common/#anyvalue).
(#8170)
- Propagate errors from the exporter when calling `Shutdown` on
`BatchSpanProcessor` in `go.opentelemetry.io/otel/sdk/trace`. (#8197)
- Fix stale status code reporting on self-observability metrics in
`go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp` and
`go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp`. (#8226)
- Fix a concurrent `Collect` data race and potential panic in
`go.opentelemetry.io/otel/exporters/prometheus` when
`WithResourceAsConstantLabels` option is used. (#8227)
- Fix race condition in `FixedSizeReservoir` in
`go.opentelemetry.io/otel/sdk/metric/exemplar` by reverting #7447.
(#8249)
- Fix `FixedSizeReservoir` in
`go.opentelemetry.io/otel/sdk/metric/exemplar` to safely handle zero
size.
A capacity check in the constructor initializes the reservoir safely and
skips initialization for zero-cap; early returns in `Offer()` and
`Collect()` ensure no-op behavior. (#8295)
- Fix counting of spans and logs in self-observability metrics in
`go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc`,
`go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`,
`go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc`, and
`go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp`. (#8254)
- Drop conflicting scope attributes named `name`, `version`, or
`schema_url` from metric labels in
`go.opentelemetry.io/otel/exporters/prometheus`, preserving the
dedicated `otel_scope_name`, `otel_scope_version`, and
`otel_scope_schema_url` labels. (#8264)
- Close schema files opened by `ParseFile` in
`go.opentelemetry.io/otel/schema/v1.0` and
`go.opentelemetry.io/otel/schema/v1.1`.
([GHSA-995v-fvrw-c78m](GHSA-995v-fvrw-c78m))
- Enforce the 8192-byte baggage size limit during extraction/parsing,
changing behavior when the limit is exceeded in
`go.opentelemetry.io/otel/baggage` and
`go.opentelemetry.io/otel/propagation`. (#8222)
- Fix `go.opentelemetry.io/otel/semconv/v1.41.0` to include `Attr*`
helper methods for required attributes on observable instruments.
(#8361)
- Limit baggage extraction error reporting in
`go.opentelemetry.io/otel/propagation` to prevent malformed or oversized
baggage headers from flooding logs.
([GHSA-5wrp-cwcj-q835](GHSA-5wrp-cwcj-q835))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

sdk: Apply attribute value limit for BYTES

8 participants