Visitar URL original
attribute: add String method for Value type by pellared · Pull Request #8142 · open-telemetry/opentelemetry-go · GitHub
Skip to content

attribute: add String method for Value type - #8142

Merged
pellared merged 13 commits into
open-telemetry:mainfrom
pellared:attr-fmt
Apr 8, 2026
Merged

pellared merged 13 commits into
open-telemetry:mainfrom
pellared:attr-fmt

Conversation

@pellared

@pellared pellared commented Apr 7, 2026 •

Copy link
Copy Markdown
Member

Towards #7810

Fixes #8143

String representation follows: https://opentelemetry.io/docs/specs/otel/common/#anyvalue-representation-for-non-otlp-protocols

This uses optimizations like #8039 and we inline the JSON-array/string encoding logic so we avoid the extra allocations and reflection overhead of marshaling through encoding/json (the code is inlined here not to reimplement JSON broadly, but to provide a spec-specific, allocation-conscious formatter for a constrained data model).

Benchmarks of both String and Emit (that is going to be deprecated) showcase that String is even more efficient.

goos: linux
goarch: amd64
pkg: go.opentelemetry.io/otel/attribute
cpu: 13th Gen Intel(R) Core(TM) i7-13800H
BenchmarkBool/String-20                 100000000               10.20 ns/op            0 B/op          0 allocs/op
BenchmarkBool/Emit-20                   100000000               10.33 ns/op            0 B/op          0 allocs/op
BenchmarkBoolSlice/Len2/String-20               28427863                36.15 ns/op           16 B/op          1 allocs/op
BenchmarkBoolSlice/Len2/Emit-20                  5433291               201.8 ns/op            40 B/op          5 allocs/op
BenchmarkBoolSlice/Len8/String-20               12453201                99.46 ns/op           48 B/op          1 allocs/op
BenchmarkBoolSlice/Len8/Emit-20                  2185160               546.0 ns/op            88 B/op         11 allocs/op
BenchmarkInt/String-20                          100000000               10.73 ns/op            0 B/op          0 allocs/op
BenchmarkInt/Emit-20                            100000000               11.03 ns/op            0 B/op          0 allocs/op
BenchmarkIntSlice/Len2/String-20                17855926                61.57 ns/op           48 B/op          1 allocs/op
BenchmarkIntSlice/Len2/Emit-20                   6237072               184.9 ns/op            56 B/op          4 allocs/op
BenchmarkIntSlice/Len8/String-20                 6573506               192.1 ns/op           176 B/op          1 allocs/op
BenchmarkIntSlice/Len8/Emit-20                   3620901               332.8 ns/op           136 B/op          4 allocs/op
BenchmarkInt64/String-20                        100000000               10.90 ns/op            0 B/op          0 allocs/op
BenchmarkInt64/Emit-20                          100000000               10.91 ns/op            0 B/op          0 allocs/op
BenchmarkInt64Slice/Len2/String-20              20924970                59.59 ns/op           48 B/op          1 allocs/op
BenchmarkInt64Slice/Len2/Emit-20                 6755516               184.2 ns/op            56 B/op          4 allocs/op
BenchmarkInt64Slice/Len8/String-20               6033630               207.9 ns/op           176 B/op          1 allocs/op
BenchmarkInt64Slice/Len8/Emit-20                 3491808               327.2 ns/op           136 B/op          4 allocs/op
BenchmarkFloat64/String-20                      23607802                52.21 ns/op            2 B/op          1 allocs/op
BenchmarkFloat64/Emit-20                        13578472                93.34 ns/op           16 B/op          2 allocs/op
BenchmarkFloat64Slice/Len2/String-20                    12066591               111.0 ns/op            64 B/op          1 allocs/op
BenchmarkFloat64Slice/Len2/Emit-20                       5177293               234.3 ns/op            56 B/op          4 allocs/op
BenchmarkFloat64Slice/Len8/String-20                     3041408               381.9 ns/op           208 B/op          1 allocs/op
BenchmarkFloat64Slice/Len8/Emit-20                       2369974               548.3 ns/op           136 B/op          4 allocs/op
BenchmarkString/String-20                               137506468                8.578 ns/op           0 B/op          0 allocs/op
BenchmarkString/Emit-20                                 139229646                8.542 ns/op           0 B/op          0 allocs/op
BenchmarkStringSlice/Len2/Emit-20                        5809321               228.9 ns/op           120 B/op          4 allocs/op
BenchmarkStringSlice/Len8/String-20                      5089977               240.0 ns/op            96 B/op          1 allocs/op
BenchmarkStringSlice/Len8/Emit-20                        2569848               480.0 ns/op           344 B/op          4 allocs/op
BenchmarkByteSlice/String-20                            32244670                34.31 ns/op           16 B/op          1 allocs/op
BenchmarkByteSlice/Emit-20                              36643321                34.63 ns/op           16 B/op          1 allocs/op

@codecov

codecov Bot commented Apr 7, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 99.21569% with 2 lines in your changes missing coverage. Please review.
✅ Project coverage is 82.0%. Comparing base (99b2206) to head (8eb5cae).
⚠️ Report is 1 commits behind head on main.

Files with missing lines Patch % Lines
attribute/value.go 99.2% 2 Missing ⚠️
Additional details and impacted files

Impacted file tree graph

@@           Coverage Diff           @@
##            main   #8142     +/-   ##
=======================================
+ Coverage   81.8%   82.0%   +0.2%     
=======================================
  Files        308     308             
  Lines      23802   24057    +255     
=======================================
+ Hits       19480   19741    +261     
+ Misses      3944    3939      -5     
+ Partials     378     377      -1     
Files with missing lines Coverage Δ
attribute/value.go 97.2% <99.2%> (+4.6%) ⬆️

... and 5 files with indirect coverage changes

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

@pellared
pellared marked this pull request as ready for review April 7, 2026 09:10
@pellared pellared added this to the v1.44.0 milestone Apr 7, 2026
@pellared

pellared commented Apr 7, 2026

Copy link
Copy Markdown
Member Author

CC @bboreham

@pellared pellared added enhancement New feature or request pkg:attribute Related to the attribute package labels Apr 7, 2026
Comment thread attribute/value.go Resolved
Comment thread attribute/value.go Resolved

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

Adds a String() method to attribute.Value so values print in a human-readable form consistent with the OpenTelemetry AnyValue (non-OTLP) string representation, with an allocation-conscious implementation and accompanying tests/benchmarks.

Changes:

  • Implement Value.String() with spec-aligned formatting for scalars and JSON-array formatting for slice types (with fast paths for small fixed arrays).
  • Inline JSON string escaping for string-slice formatting to avoid encoding/json allocations/reflection.
  • Add unit tests and benchmarks covering the new String() behavior.

Reviewed changes

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

File Description
CHANGELOG.md Documents the addition of Value.String() in the “Added” section.
attribute/value.go Adds Value.String() and supporting formatters (including inlined JSON-string escaping).
attribute/value_test.go Adds comprehensive tests for Value.String() across types and edge cases.
attribute/benchmark_test.go Adds String() benchmarks alongside existing Emit() benchmarks.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread attribute/value.go Resolved
@pellared
pellared merged commit 876f7c5 into open-telemetry:main Apr 8, 2026
33 checks passed
@pellared
pellared deleted the attr-fmt branch April 8, 2026 07:50
pull Bot pushed a commit to thompson-tomo/opentelemetry-specification that referenced this pull request May 20, 2026
…emetry#5028)

### What

Adds in-development guidance for representing a single OpenTelemetry
attribute as a string in non-OTLP protocols.

The recommended form is a single-entry JSON object, for example:

```json
{"http.request.method":"GET"}
```

**Implementation:**
- open-telemetry/opentelemetry-go#8205 in OTel
Go we are using non-OTLP string represnetation for debugging

### Why

- open-telemetry/opentelemetry-go#7810

The narrower purpose is to fill a gap in the existing non-OTLP string
representation guidance. The specification already has stable guidance
for representing `AnyValue` values as strings when a non-OTLP protocol
cannot represent some `AnyValue` types natively. What is missing is the
corresponding representation for a single `Attribute`, which is a key
plus an `AnyValue`. This PR proposes that the single attribute is
represented as a single-member JSON object, with the member value
following the existing non-OTLP `AnyValue` representation rules.

I originally thought about `key:value` (and even `key=value`
beforehand), but it is ambiguous when `:` appears in keys or string
values and is not a robust debugging representation.

Using a JSON object improves clarity for debugging output by:

- aligning with existing non-OTLP, JSON-based guidance for complex
`AnyValue` types
- making the representation easier to read and copy when needed

This also is consistent with how OTel Java, .NET, Python, Go are
representing attributes in standard output exporters. Therefore, I think
it would be most familiar representation for the users.

Why not OTLP/JSON?
For the OTel Go use case, the compact (lossy) non-OTLP representation is
practical for human-readable output such as test failures. `String()` is
intended for debugging and logging, and its output is not expected to be
lossless nor suitable for deserialization. A canonical OTLP JSON
`KeyValue` would need wrapper fields such as
`{"key":"http.request.method","value":{"stringValue":"GET"}}`, which is
much more verbose than `{"http.request.method":"GET"}` and harder to
scan in failure messages.
Moreover, OTel Go `attribute.Value.String()` already follows the
non-OTLP `AnyValue` rules:
<open-telemetry/opentelemetry-go#8142> (as OTel
Go maintainers, we want to use an OTel-wide representation even for
debugging output). We want `attribute.KeyValue.String()` to follow the
same rules, but the string representation of a single attribute is not
yet specified; this PR fills that gap and is currently blocking
<open-telemetry/opentelemetry-go#8205>.
@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))
hilmarf pushed a commit to apeirora/opentelemetry-specification that referenced this pull request Jun 1, 2026
…emetry#5028)

### What

Adds in-development guidance for representing a single OpenTelemetry
attribute as a string in non-OTLP protocols.

The recommended form is a single-entry JSON object, for example:

```json
{"http.request.method":"GET"}
```

**Implementation:**
- open-telemetry/opentelemetry-go#8205 in OTel
Go we are using non-OTLP string represnetation for debugging

### Why

- open-telemetry/opentelemetry-go#7810

The narrower purpose is to fill a gap in the existing non-OTLP string
representation guidance. The specification already has stable guidance
for representing `AnyValue` values as strings when a non-OTLP protocol
cannot represent some `AnyValue` types natively. What is missing is the
corresponding representation for a single `Attribute`, which is a key
plus an `AnyValue`. This PR proposes that the single attribute is
represented as a single-member JSON object, with the member value
following the existing non-OTLP `AnyValue` representation rules.

I originally thought about `key:value` (and even `key=value`
beforehand), but it is ambiguous when `:` appears in keys or string
values and is not a robust debugging representation.

Using a JSON object improves clarity for debugging output by:

- aligning with existing non-OTLP, JSON-based guidance for complex
`AnyValue` types
- making the representation easier to read and copy when needed

This also is consistent with how OTel Java, .NET, Python, Go are
representing attributes in standard output exporters. Therefore, I think
it would be most familiar representation for the users.

Why not OTLP/JSON?
For the OTel Go use case, the compact (lossy) non-OTLP representation is
practical for human-readable output such as test failures. `String()` is
intended for debugging and logging, and its output is not expected to be
lossless nor suitable for deserialization. A canonical OTLP JSON
`KeyValue` would need wrapper fields such as
`{"key":"http.request.method","value":{"stringValue":"GET"}}`, which is
much more verbose than `{"http.request.method":"GET"}` and harder to
scan in failure messages.
Moreover, OTel Go `attribute.Value.String()` already follows the
non-OTLP `AnyValue` rules:
<open-telemetry/opentelemetry-go#8142> (as OTel
Go maintainers, we want to use an OTel-wide representation even for
debugging output). We want `attribute.KeyValue.String()` to follow the
same rules, but the string representation of a single attribute is not
yet specified; this PR fills that gap and is currently blocking
<open-telemetry/opentelemetry-go#8205>.
vbonnet added a commit to vbonnet/dear-agent that referenced this pull request Jun 7, 2026
…l 1.44

otel 1.44.0 deprecates attribute.Value.Emit in favor of Value.String
(open-telemetry/opentelemetry-go#8142). The JSONL exporter flattened span
and event attributes via Emit at jsonl_exporter.go:114,127, which trips the
staticcheck deprecation lint once otel is bumped to 1.44.

String is the otel-sanctioned drop-in replacement; for STRING-typed
attributes (the common case here) the output is byte-identical, and numeric
and slice types adopt the new canonical formatting.

Bumps otel, otel/sdk, otel/trace (and transitive otel/metric) to 1.44.0 in
the same change because Value.String does not exist in 1.43 — the code and
the bump must land together. This unblocks the otel 1.44 dependency bumps
(#170, #173, #175).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
vbonnet added a commit to vbonnet/dear-agent that referenced this pull request Jun 7, 2026
…l 1.44

otel 1.44.0 deprecates attribute.Value.Emit in favor of Value.String
(open-telemetry/opentelemetry-go#8142). The JSONL exporter flattened span
and event attributes via Emit at jsonl_exporter.go:114,127, which trips the
staticcheck deprecation lint once otel is bumped to 1.44.

String is the otel-sanctioned drop-in replacement; for STRING-typed
attributes (the common case here) the output is byte-identical, and numeric
and slice types adopt the new canonical formatting.

Bumps otel, otel/sdk, otel/trace (and transitive otel/metric) to 1.44.0 in
the same change because Value.String does not exist in 1.43 — the code and
the bump must land together. This unblocks the otel 1.44 dependency bumps
(#170, #173, #175).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
vbonnet added a commit to vbonnet/dear-agent that referenced this pull request Jun 7, 2026
…l 1.44 (#184)

otel 1.44.0 deprecates attribute.Value.Emit in favor of Value.String
(open-telemetry/opentelemetry-go#8142). The JSONL exporter flattened span
and event attributes via Emit at jsonl_exporter.go:114,127, which trips the
staticcheck deprecation lint once otel is bumped to 1.44.

String is the otel-sanctioned drop-in replacement; for STRING-typed
attributes (the common case here) the output is byte-identical, and numeric
and slice types adopt the new canonical formatting.

Bumps otel, otel/sdk, otel/trace (and transitive otel/metric) to 1.44.0 in
the same change because Value.String does not exist in 1.43 — the code and
the bump must land together. This unblocks the otel 1.44 dependency bumps
(#170, #173, #175).

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request pkg:attribute Related to the attribute package

Projects

None yet

Development

Successfully merging this pull request may close these issues.

attribute: add Value.String

5 participants