Skip to content

attribute: skip reflection for short slices in hashValue - #8511

Merged
pellared merged 10 commits into
open-telemetry:mainfrom
lavish-gambhir:attribute-hash-slice-fastpath
Jun 29, 2026
Merged

pellared merged 10 commits into
open-telemetry:mainfrom
lavish-gambhir:attribute-hash-slice-fastpath

Conversation

@lavish-gambhir

@lavish-gambhir lavish-gambhir commented Jun 24, 2026 •

Copy link
Copy Markdown
Contributor

hashValue reflects over bool/int64/float64/string slices to hash them, even though short slices are already stored as fixed arrays. It runs on every Set construction, so the reflection is worth getting rid of.

Now short slices (0-3 elements) type-switch on [1]T/[2]T/[3]T and hash the elements by explicit indexing; anything longer still goes through reflection. Same approach the SLICE/MAP cases use. The hash itself is unchanged.

Fixes #8200.

Benchmarks

Slice cases of BenchmarkHashKVs. Interleaved benchstat, Apple M5, 10 rounds (old = reflection, new = type switch):

benchmark                      old time/op   new time/op   delta
BoolSliceLen0                  12.64n ± 2%   11.03n ± 1%   -12.81% (p=0.000)
BoolSliceLen1                  19.29n ± 2%   15.02n ± 1%   -22.12% (p=0.000)
BoolSliceLen2                  25.66n ± 1%   18.40n ± 1%   -28.29% (p=0.000)
BoolSliceLen3                  34.03n ± 1%   26.48n ± 1%   -22.17% (p=0.000)
BoolSliceLen5                  45.51n ± 1%   45.61n ± 1%   ~ (p=0.592)

Int64SliceLen0                 12.38n ± 2%   11.01n ± 3%   -11.07% (p=0.000)
IntSliceLen1                   18.65n ± 1%   14.92n ± 1%   -20.05% (p=0.000)
Int64SliceLen2                 24.62n ± 2%   18.63n ± 2%   -24.37% (p=0.000)
Int64SliceLen3                 33.98n ± 1%   26.27n ± 2%   -22.69% (p=0.000)
Int64SliceLen4                 38.59n ± 1%   38.72n ± 1%   ~ (p=0.403)
Int64SliceWithZero             38.34n ± 1%   38.58n ± 2%   ~ (p=0.363)
IntSliceLen5                   44.00n ± 2%   44.24n ± 1%   ~ (p=0.403)

Float64SliceLen0               12.43n ± 1%   10.96n ± 2%   -11.83% (p=0.000)
Float64SliceLen1               18.67n ± 1%   14.81n ± 3%   -20.65% (p=0.000)
Float64SliceLen2               24.35n ± 2%   18.70n ± 2%   -23.18% (p=0.000)
Float64SliceLen3               33.23n ± 1%   26.84n ± 2%   -19.20% (p=0.000)
Float64SliceLen4               37.07n ± 1%   37.31n ± 3%   ~ (p=0.256)
Float64SliceLarge              37.02n ± 1%   37.02n ± 1%   ~ (p=0.912)

StringSliceLen0                12.41n ± 1%   11.01n ± 1%   -11.24% (p=0.000)
StringSliceLooksLikeIntSlice   18.40n ± 1%   14.13n ± 1%   -23.21% (p=0.000)
StringSliceLen2                24.78n ± 1%   18.60n ± 2%   -24.96% (p=0.000)
StringSliceLen3                29.29n ± 1%   21.38n ± 1%   -26.99% (p=0.000)
StringSliceLen5                38.60n ± 1%   38.92n ± 1%   +0.83% (p=0.009)


Short slices (len 0-3) take the fixed-array fast path; len >= 4 keeps the reflective fallback and is unchanged to within run-to-run noise (<1%). B/op and allocs/op are 0 across all cases.

Testing

Extended the keyVals fixture so TestHashKVs and BenchmarkHashKVs exercise every primitive slice type at lengths 0-5 — covering the zero-length case plus both the fast path and the reflective fallback.

hashValue runs on every Set construction, but it reflects over
bool/int64/float64/string slices to hash them even when they're tiny.
Short slices (0-3 elements) are already stored as fixed arrays, so just
type-switch on them and read the elements directly, and only fall back to
reflection for longer ones.

SLICE and MAP already do this. The hash output doesn't change.

Assisted-By: Claude
@linux-foundation-easycla

linux-foundation-easycla Bot commented Jun 24, 2026 •

Copy link
Copy Markdown

CLA Signed
The committers listed above are authorized under a signed CLA.

  • ✅ login: lavish-gambhir / name: Lavish Gambhir (3df84ee)

@codecov

codecov Bot commented Jun 24, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 83.9%. Comparing base (18ef808) to head (381987a).

Additional details and impacted files

Impacted file tree graph

@@          Coverage Diff          @@
##            main   #8511   +/-   ##
=====================================
  Coverage   83.9%   83.9%           
=====================================
  Files        323     323           
  Lines      25756   25804   +48     
=====================================
+ Hits       21617   21668   +51     
+ Misses      3759    3757    -2     
+ Partials     380     379    -1     
Files with missing lines Coverage Δ
attribute/hash.go 96.6% <100.0%> (+1.2%) ⬆️

... and 3 files with indirect coverage changes

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

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

Optimizes go.opentelemetry.io/otel/attribute hashing by avoiding reflection for short (len 0–3) BOOLSLICE/INT64SLICE/FLOAT64SLICE/STRINGSLICE values, reducing overhead on attribute Set construction while keeping the hash algorithm unchanged.

Changes:

  • Add short-slice type-switch fast paths in hashValue for the four primitive slice types, falling back to reflection for longer arrays.
  • Expand the hash_test.go key-value fixture set so existing collision tests and benchmarks exercise both the fast path and reflective fallback.
  • Add a changelog entry documenting the performance improvement.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 6 comments.

File Description
CHANGELOG.md Adds a release note for the hashing performance change (needs folding into the existing ### Changed section).
attribute/hash.go Implements the short-slice fast path via type switches for primitive slice types.
attribute/hash_test.go Extends fixtures to cover both the short-slice and reflective hashing paths in existing tests/benchmarks.

Comment thread CHANGELOG.md Outdated
Comment thread attribute/hash.go Outdated
Comment thread attribute/hash.go Outdated
Comment thread attribute/hash.go Outdated
Comment thread attribute/hash.go Outdated
Comment thread attribute/hash_test.go
Comment thread attribute/hash.go
@pellared

Copy link
Copy Markdown
Member

Please also address Copilot comments.

Use direct indexing instead of ranging over the fixed array, move the
length coverage into a dedicated test, and add a slice benchmark.
@lavish-gambhir

Copy link
Copy Markdown
Contributor Author

Please also address Copilot comments.

Done

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 3 out of 3 changed files in this pull request and generated no new comments.

@pellared

pellared commented Jun 24, 2026 •

Copy link
Copy Markdown
Member

Please also address Copilot comments.

Done

This and similar comments has not been addressed #8511 (comment)

Please make sure to update the benchmark results after pushing the changes

@lavish-gambhir

lavish-gambhir commented Jun 24, 2026 •

Copy link
Copy Markdown
Contributor Author

Please also address Copilot comments.

Done

This and similar comments has not been addressed #8511 (comment)

Please make sure to update the benchmark results after pushing the changes

Done — resolved the remaining Copilot thread and updated the benchmark results in the description. The short-slice cases use direct indexing (vals[i]) now.

@pellared

pellared commented Jun 24, 2026 •

Copy link
Copy Markdown
Member

Please also address Copilot comments.

Done

This and similar comments has not been addressed #8511 (comment)
Please make sure to update the benchmark results after pushing the changes

Done — resolved the remaining Copilot thread and updated the benchmark results in the description. The short-slice cases use direct indexing (vals[i]) now.

This is not true

Consider hashing the elements by direct indexing (as is done for SLICE/MAP below).

Maybe you have forgotten to push the changes?

@lavish-gambhir

Copy link
Copy Markdown
Contributor Author

Please also address Copilot comments.

Done

This and similar comments has not been addressed #8511 (comment)
Please make sure to update the benchmark results after pushing the changes

Done — resolved the remaining Copilot thread and updated the benchmark results in the description. The short-slice cases use direct indexing (vals[i]) now.

This is not true

Consider hashing the elements by direct indexing (as is done for SLICE/MAP below).

Maybe you have forgotten to push the changes?

Ah, got it — I think I misunderstood the original point. I read Copilot's note as being about the array copy from for range, so I first changed it to indexed access. I've now unrolled it fully with explicit vals[0], vals[1], etc., so it matches the existing SLICE/MAP cases. I also added a reference-hash test to catch any wrong or missed index in those lines, and refreshed the benchmark numbers in the PR description.
Thanks for the patience here!

Comment thread attribute/hash_test.go Outdated
Comment thread attribute/hash_test.go Outdated
@lavish-gambhir
lavish-gambhir requested a review from pellared June 25, 2026 18:59
@pellared

Copy link
Copy Markdown
Member

Can you please update the PR description (especially the "benchmarks" that contains information that is no longer valid)?

@lavish-gambhir

Copy link
Copy Markdown
Contributor Author

Can you please update the PR description (especially the "benchmarks" that contains information that is no longer valid)?

Updated — re-ran the benchmarks against the current (unrolled) code.

@pellared

Copy link
Copy Markdown
Member

Can you please update the PR description (especially the "benchmarks" that contains information that is no longer valid)?

Updated — re-ran the benchmarks against the current (unrolled) code.

I do not see benchmark results from e.g. BoolSliceLen0

@lavish-gambhir

Copy link
Copy Markdown
Contributor Author

Can you please update the PR description (especially the "benchmarks" that contains information that is no longer valid)?

Updated — re-ran the benchmarks against the current (unrolled) code.

I do not see benchmark results from e.g. BoolSliceLen0

Expanded the table to cover all slice cases.

@pellared
pellared merged commit 6618f9b into open-telemetry:main Jun 29, 2026
35 checks passed
NesterovYehor pushed a commit to NesterovYehor/opentelemetry-go that referenced this pull request Jul 15, 2026
…try#8511)

`hashValue` reflects over bool/int64/float64/string slices to hash them,
even though short slices are already stored as fixed arrays. It runs on
every `Set` construction, so the reflection is worth getting rid of.

Now short slices (0-3 elements) type-switch on `[1]T`/`[2]T`/`[3]T` and
hash the elements by explicit indexing; anything longer still goes
through reflection. Same approach the `SLICE`/`MAP` cases use. The hash
itself is unchanged.

Fixes open-telemetry#8200.

## Benchmarks

Slice cases of `BenchmarkHashKVs`. Interleaved benchstat, Apple M5, 10
rounds (old = reflection, new = type switch):

```
benchmark                      old time/op   new time/op   delta
BoolSliceLen0                  12.64n ± 2%   11.03n ± 1%   -12.81% (p=0.000)
BoolSliceLen1                  19.29n ± 2%   15.02n ± 1%   -22.12% (p=0.000)
BoolSliceLen2                  25.66n ± 1%   18.40n ± 1%   -28.29% (p=0.000)
BoolSliceLen3                  34.03n ± 1%   26.48n ± 1%   -22.17% (p=0.000)
BoolSliceLen5                  45.51n ± 1%   45.61n ± 1%   ~ (p=0.592)

Int64SliceLen0                 12.38n ± 2%   11.01n ± 3%   -11.07% (p=0.000)
IntSliceLen1                   18.65n ± 1%   14.92n ± 1%   -20.05% (p=0.000)
Int64SliceLen2                 24.62n ± 2%   18.63n ± 2%   -24.37% (p=0.000)
Int64SliceLen3                 33.98n ± 1%   26.27n ± 2%   -22.69% (p=0.000)
Int64SliceLen4                 38.59n ± 1%   38.72n ± 1%   ~ (p=0.403)
Int64SliceWithZero             38.34n ± 1%   38.58n ± 2%   ~ (p=0.363)
IntSliceLen5                   44.00n ± 2%   44.24n ± 1%   ~ (p=0.403)

Float64SliceLen0               12.43n ± 1%   10.96n ± 2%   -11.83% (p=0.000)
Float64SliceLen1               18.67n ± 1%   14.81n ± 3%   -20.65% (p=0.000)
Float64SliceLen2               24.35n ± 2%   18.70n ± 2%   -23.18% (p=0.000)
Float64SliceLen3               33.23n ± 1%   26.84n ± 2%   -19.20% (p=0.000)
Float64SliceLen4               37.07n ± 1%   37.31n ± 3%   ~ (p=0.256)
Float64SliceLarge              37.02n ± 1%   37.02n ± 1%   ~ (p=0.912)

StringSliceLen0                12.41n ± 1%   11.01n ± 1%   -11.24% (p=0.000)
StringSliceLooksLikeIntSlice   18.40n ± 1%   14.13n ± 1%   -23.21% (p=0.000)
StringSliceLen2                24.78n ± 1%   18.60n ± 2%   -24.96% (p=0.000)
StringSliceLen3                29.29n ± 1%   21.38n ± 1%   -26.99% (p=0.000)
StringSliceLen5                38.60n ± 1%   38.92n ± 1%   +0.83% (p=0.009)


```

Short slices (len 0-3) take the fixed-array fast path; len >= 4 keeps
the reflective fallback and is unchanged to within run-to-run noise
(<1%). `B/op` and `allocs/op` are 0 across all cases.

## Testing

Extended the `keyVals` fixture so `TestHashKVs` and `BenchmarkHashKVs`
exercise every primitive slice type at lengths 0-5 — covering the
zero-length case plus both the fast path and the reflective fallback.
@MrAlias MrAlias added this to the v1.45.0 milestone Jul 23, 2026
@MrAlias MrAlias mentioned this pull request Aug 3, 2026
MrAlias added a commit that referenced this pull request Aug 3, 2026
### Added

- Add experimental observability metrics to `BatchProcessor` in
`go.opentelemetry.io/otel/sdk/log`. (#7124)
- Add the experimental `WithUnsafeAttributes` no-copy attribute option
to `go.opentelemetry.io/otel/metric/x` for future performance
improvements. This API is a work in progress. (#8251)
- Add `Map` and `MapValue` functions for the new `MAP` attribute type in
`go.opentelemetry.io/otel/attribute`. (#8445)
- Support `MAP` attributes in
`go.opentelemetry.io/otel/exporters/otlp/otlptrace`. (#8453)
- Support `MAP` attributes in
`go.opentelemetry.io/otel/exporters/otlp/otlplog`. (#8453)
- Support `MAP` attributes in
`go.opentelemetry.io/otel/exporters/otlp/otlpmetric`. (#8453)
- Support `MAP` attributes in
`go.opentelemetry.io/otel/exporters/zipkin`. (#8453)
- Apply `AttributeValueLengthLimit` recursively to values contained in
`attribute.MAP` attributes in `go.opentelemetry.io/otel/sdk/trace`.
(#8454)
- Remove duplicate keys from `attribute.MAP` values in
`go.opentelemetry.io/otel/sdk/resource` using last-value-wins semantics.
(#8471)
- Remove duplicate keys by default from `attribute.MAP` values in
instrumentation scope attributes in `go.opentelemetry.io/otel/sdk/log`
using last-value-wins semantics. (#8471)
- Remove duplicate keys by default from `attribute.MAP` values in span,
event, link, and instrumentation scope attributes in
`go.opentelemetry.io/otel/sdk/trace` using last-value-wins semantics.
(#8471)
- Remove duplicate keys by default from `attribute.MAP` values in
measurement and instrumentation scope attributes in
`go.opentelemetry.io/otel/sdk/metric` using last-value-wins semantics.
(#8471)
- Extend `WithAllowKeyDuplication` in `go.opentelemetry.io/otel/sdk/log`
to disable duplicate-key removal in `attribute.MAP` values for
instrumentation scope attributes. (#8471)
- Add the `go.opentelemetry.io/otel/semconv/v1.42.0` package.
The package contains semantic conventions from the `v1.42.0` version of
the OpenTelemetry Semantic Conventions.
See the [migration documentation](./semconv/v1.42.0/MIGRATION.md) for
information on how to upgrade from
`go.opentelemetry.io/otel/semconv/v1.41.0`. (#8484)
- Add `WithoutPanicRecording` as a `TracerProviderOption` in
`go.opentelemetry.io/otel/sdk/trace` to disable exception event
recording for panics. (#8532)
- Add the `go.opentelemetry.io/otel/semconv/v1.43.0` package.
The package contains semantic conventions from the `v1.43.0` version of
the OpenTelemetry Semantic Conventions.
See the [migration documentation](./semconv/v1.43.0/MIGRATION.md) for
information on how to upgrade from
`go.opentelemetry.io/otel/semconv/v1.42.0`. (#8628)

### Changed

- `HistogramReservoir` in `go.opentelemetry.io/otel/sdk/metric/exemplar`
now uses a time-unbiased sampling algorithm for exemplars. (#8306)
- ⚠️ **Breaking Change:** Use `go.opentelemetry.io/otel/attribute.Value`
and `go.opentelemetry.io/otel/attribute.KeyValue` for log bodies and
attributes in `go.opentelemetry.io/otel/log`,
`go.opentelemetry.io/otel/log/logtest`,
`go.opentelemetry.io/otel/sdk/log`, and
`go.opentelemetry.io/otel/sdk/log/logtest`. (#8490)
- Encode log bodies and attributes as
`go.opentelemetry.io/otel/attribute.Value` JSON in
`go.opentelemetry.io/otel/exporters/stdout/stdoutlog`. (#8490)
- Improve the performance of hashing `BOOLSLICE`, `INT64SLICE`,
`FLOAT64SLICE`, and `STRINGSLICE` attribute values by avoiding
reflection for short slices in `go.opentelemetry.io/otel/attribute`.
(#8511)
- ⚠️ **Breaking Change:** `WithEndpointURL` in
`go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp` no
longer appends the default signal path when an endpoint URL has no path,
making the behavior consistent with
`go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp` and with
setting the endpoint through `OTEL_EXPORTER_OTLP_METRICS_ENDPOINT`. If
the URL has no path component, the root path (`/`) is used. Use
`WithEndpointURL(url.JoinPath(endpoint, "/v1/metrics"))` to preserve the
previous behavior. (#8538)
- ⚠️ **Breaking Change:** `WithEndpointURL` in
`go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp` no
longer appends the default signal path when an endpoint URL has no path,
making the behavior consistent with
`go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp` and with
setting the endpoint through `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT`. If
the URL has no path component, the root path (`/`) is used. Use
`WithEndpointURL(url.JoinPath(endpoint, "/v1/traces"))` to preserve the
previous behavior. (#8538)

### Deprecated

- Deprecate `WithExportBufferSize` in
`go.opentelemetry.io/otel/sdk/log`. The option remains available for
source compatibility but no longer affects behavior; `BatchProcessor` no
longer maintains a separate export-request buffer. (#8620)

### Removed

- ⚠️ **Breaking Change:** Remove `Kind`, `Value`, `KeyValue`, their
constructors, and attribute conversion helpers from
`go.opentelemetry.io/otel/log`. (#8490)
- ⚠️ **Breaking Change:** Remove the `AttributeValueLengthLimit` and
`AttributeCountLimit` fields from `RecordFactory` in
`go.opentelemetry.io/otel/sdk/log/logtest`; records produced by the
factory now keep attribute limits disabled so test code can append exact
attributes. (#8556)

### Fixed

- Fix an off-by-one error in `FixedSizeReservoir` in
`go.opentelemetry.io/otel/sdk/metric/exemplar` that prevented the first
exemplar from being sampled after the reservoir was filled. (#8309)
- Interpret HTTP `Retry-After` header values as seconds instead of
nanoseconds when retrying OTLP HTTP exports in
`go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`,
`go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp`, and
`go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp`. (#8383)
- Fix a memory leak in the `Reservoir` implementation in
`go.opentelemetry.io/otel/sdk/metric/exemplar`, where storing the full
`context.Context` pinned large objects such as gRPC transport buffers.
(#8389)
- Prevent a non-empty attribute set whose computed hash is zero from
collapsing to an empty set in `go.opentelemetry.io/otel/attribute`.
(#8402)
- Fix histogram data point reuse in
`go.opentelemetry.io/otel/sdk/metric` aggregation to avoid leaking stale
sum, minimum, and maximum values when they are disabled in subsequent
collections. (#8403)
- Avoid preallocating scope attributes when they are disabled in
`go.opentelemetry.io/otel/exporters/prometheus`. (#8404)
- Support HTTP-date values in the HTTP `Retry-After` header when
retrying OTLP HTTP exports in
`go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`,
`go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp`, and
`go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp`. (#8417)
- Reduce histogram heap allocations by reusing `BucketCounts` and
`Exemplars` slices across `Collect` cycles in the cumulative histogram
aggregation in `go.opentelemetry.io/otel/sdk/metric`. (#8428)
- Fix `go.opentelemetry.io/otel/exporters/stdout/stdouttrace`
self-observability to record `error.type` on the operation-duration
histogram when the `exportedSpans` metric is disabled. (#8432)
- Stop including trace exporter endpoint configuration in internal logs
from `go.opentelemetry.io/otel/sdk/trace`,
`go.opentelemetry.io/otel/exporters/otlp/otlptrace`,
`go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc`,
`go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`, and
`go.opentelemetry.io/otel/exporters/zipkin`. (#8438)
- Fix invalid error formatting for out-of-range JSON code values in
`go.opentelemetry.io/otel/codes`. (#8497)
- Clarify in `go.opentelemetry.io/otel/log` that `Logger.Enabled` should
be checked for every log emission because its result may change over
time. (#8565)
- Preserve user-provided exception attributes while independently
deriving missing exception message and type attributes in
`go.opentelemetry.io/otel/sdk/log`. (#8566)
- Make `WithAttributeCountLimit(0)` and
`OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT=0` discard all log record
attributes in `go.opentelemetry.io/otel/sdk/log`. (#8570)
- Clarify that the `Record` methods of `Float64Histogram` and
`Int64Histogram` in `go.opentelemetry.io/otel/metric` expect
non-negative values. (#8574)
- Clarify in `go.opentelemetry.io/otel/log` that `LoggerProvider`
implementations should retain an empty `Logger` name instead of
replacing it with a default. (#8587)
- Ensure that the built-in processors in
`go.opentelemetry.io/otel/sdk/log` call exporter `ForceFlush` during
`Shutdown`. (#8599)
- Prevent panics in `go.opentelemetry.io/otel/bridge/opentracing` when
OpenTracing baggage is propagated concurrently with
`Span.SetBaggageItem`.
([GHSA-42cj-99w8-cp2p](GHSA-42cj-99w8-cp2p))
- Prevent processor operations in `go.opentelemetry.io/otel/sdk/log`
from overlapping with processor shutdown or running after
`LoggerProvider` shutdown. (#8608)
- Prevent `BatchProcessor` in `go.opentelemetry.io/otel/sdk/log` from
busy-spinning under exporter backpressure and serialize dequeue, export,
force-flush, and shutdown work in one worker. (#8620)
- Make `BatchProcessor` in `go.opentelemetry.io/otel/sdk/log` return
errors encountered while draining records during `ForceFlush` and
`Shutdown`, while continuing to attempt later batches as long as the
request context remains valid. (#8620)
- Keep the default `BatchProcessor` maximum export batch size in
`go.opentelemetry.io/otel/sdk/log` at or below the configured maximum
queue size. (#8620)
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.

attribute: Improve performance of hashValue for BOOLSLICE, INT64SLICE, FLOAT64SLICE, STRINGSLICE

5 participants