Skip to content

Update opentelemetry Rust crates#8013

Open
hash-worker[bot] wants to merge 1 commit into
mainfrom
deps/rs/opentelemetry-rust-crates
Open

Update opentelemetry Rust crates#8013
hash-worker[bot] wants to merge 1 commit into
mainfrom
deps/rs/opentelemetry-rust-crates

Conversation

@hash-worker

@hash-worker hash-worker Bot commented Nov 5, 2025

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

Package Type Update Change
opentelemetry (source) workspace.dependencies minor 0.30.00.32.0
opentelemetry-appender-tracing (source) workspace.dependencies minor 0.30.10.32.0
opentelemetry-otlp (source) workspace.dependencies minor 0.30.00.32.0
opentelemetry-semantic-conventions (source) workspace.dependencies minor 0.30.00.32.0
opentelemetry_sdk (source) workspace.dependencies minor 0.30.00.32.0
tracing-opentelemetry workspace.dependencies minor 0.31.00.33.0

Warning

Some dependencies could not be looked up. Check the Dependency Dashboard for more information.


Release Notes

open-telemetry/opentelemetry-rust (opentelemetry)

v0.32.0

Compare Source

Released 2026-May-08

  • Added BoundCounter<T> and BoundHistogram<T> types that cache resolved
    aggregator references for a fixed attribute set. Created via Counter::bind()
    and Histogram::bind(), bound instruments bypass per-call attribute lookup,
    providing significant performance improvements for hot paths where the same
    attributes are used repeatedly. Both types implement Clone so a single bound
    state can be shared across threads or modules without re-binding. Also adds
    the SyncInstrument::bind() trait method and BoundSyncInstrument<T> trait
    for SDK implementors; the trait method has a no-op default so custom
    SyncInstrument impls degrade gracefully without panicking. Gated behind the
    experimental_metrics_bound_instruments feature flag.
  • Add reserve method to opentelemetry::propagation::Injector to hint at the number of elements that will be added to avoid multiple resize operations of the underlying data structure. Has an empty default implementation.
  • Breaking Removed the following public fields and methods from the SpanBuilder #​3227:
    • trace_id, span_id, end_time, status, sampling_result
    • with_trace_id, with_span_id, with_end_time, with_status, with_sampling_result
  • Added #[must_use] attribute to opentelemetry::metrics::AsyncInstrumentBuilder to add compile time warning when .build() is not called on observable instrument builders, preventing silent failures where callbacks are never registered and metrics are never reported.
  • Breaking Moved the following SDK sampling types from opentelemetry::trace to opentelemetry_sdk::trace #​3277:
    • SamplingDecision, SamplingResult
    • These types are SDK implementation details and should be imported from opentelemetry_sdk::trace instead.
  • "spec_unstable_logs_enabled" feature flag is removed. The capability (and the
    backing specification) is now stable and is enabled by default.
    3278
  • Remove the empty "message" field from tracing events emitted via the internal-logs feature
  • Fix panic when calling Context::current() from Drop implementations triggered by ContextGuard cleanup (#​3262).

v0.31.0

Compare Source

Released 2025-Sep-25

  • Breaking Change return type of opentelemetry::global::set_tracer_provider to Unit to align with metrics counterpart
  • Add get_all method to opentelemetry::propagation::Extractor to return all values of the given propagation key and provide a default implementation.
  • Add an IntoIterator implementation for opentelemetry::trace::TraceState to allow iterating through its key-value pair collection.
open-telemetry/opentelemetry-rust (opentelemetry-appender-tracing)

v0.32.0

Released 2026-May-08

  • Add tracing span attribute enrichment (experimental). When enabled,
    attributes attached to active tracing spans are copied onto each emitted
    log record. "Span" here refers to a tracing::span! from the
    tracing crate (the appender's source), not an OpenTelemetry span.
    #​3482, #​3505

    Gated behind the new experimental_span_attributes cargo feature. As
    with all experimental_* features in this repo, the API may change without
    a major version bump until it is stabilized; once stable, the feature flag
    will be removed.

    Enrichment is disabled by default (no per-span overhead) and must be
    opted into at runtime via a single builder method that accepts a
    [TracingSpanAttributes] value:

    use opentelemetry_appender_tracing::layer::TracingSpanAttributes;
    
    // Copy all tracing-span attributes onto log records:
    let layer = OpenTelemetryTracingBridge::builder(&provider)
        .with_tracing_span_attributes(TracingSpanAttributes::all())
        .build();
    
    // Or copy only an allowlist of attributes:
    let layer = OpenTelemetryTracingBridge::builder(&provider)
        .with_tracing_span_attributes(TracingSpanAttributes::allowlist(["session.id"]))
        .build();
  • Remove the experimental_use_tracing_span_context since
    tracing-opentelemetry now supports activating the OpenTelemetry
    context for the current tracing span. This fixes #​3190 — the
    circular dependency introduced by depending on tracing-opentelemetry
    that depends on opentelemetry.

  • "spec_unstable_logs_enabled" feature flag is removed. The capability (and the
    backing specification) is now stable and is enabled by default. #​3278

v0.31.1

Released 2025-Oct-1

  • Bump tracing-opentelemetry to 0.32

v0.31.0

Released 2025-Sep-25

  • Updated opentelemetry dependency to version 0.31.0.
open-telemetry/opentelemetry-rust (opentelemetry-otlp)

v0.32.0

Compare Source

Released 2026-May-08

  • Add tls-provider-agnostic feature flag for environments that require a custom crypto backend (e.g., OpenSSL for FIPS compliance). Enables TLS code paths without bundling ring or aws-lc-rs.
  • Add build() directly on SpanExporterBuilder, MetricExporterBuilder, and LogExporterBuilder
    (before selecting a transport), which auto-selects the transport based on the
    OTEL_EXPORTER_OTLP_PROTOCOL environment variable or enabled features.
    #​3394
  • Breaking Removed ExportConfig, HasExportConfig, with_export_config(), HasTonicConfig, HasHttpConfig, TonicConfig, and HttpConfig from public API.
    Use the public WithExportConfig, WithTonicConfig, and WithHttpConfig trait methods instead, which remain unchanged.
  • The gRPC/tonic OTLP exporter's build method now returns an error for all signals (traces, metrics, logs) when
    an https:// endpoint is configured but no TLS feature (tls-ring or tls-aws-lc) is enabled, instead of
    silently sending unencrypted traffic. When a TLS feature is enabled and an https:// endpoint is used without
    an explicit .with_tls_config(), a default ClientTlsConfig is automatically applied.
    #​3182
  • Prevent auth tokens from leaking in export error messages. gRPC and HTTP
    exporter errors no longer include potentially sensitive server responses
    (e.g., authentication tokens echoed back). Error messages returned to SDK
    processors contain only the gRPC status code or HTTP status code. Full
    details are logged at DEBUG level only.
    #​3021
  • Surface pre-flight transport error details at ERROR level when grpc-tonic
    OTLP export fails due to a local misconfiguration. When the returned
    tonic::Status wraps a local transport error (invalid URL, connect failure,
    DNS), its source chain (e.g., "transport error: invalid URI") is appended
    to the returned error so SDK processors surface it at ERROR without
    requiring DEBUG logging. Server-returned gRPC status messages remain
    DEBUG-only to preserve the auth-token leak safeguards from
    #​3021.
    #​3331
  • Add support for per-signal protocol environment variables:
    OTEL_EXPORTER_OTLP_TRACES_PROTOCOL, OTEL_EXPORTER_OTLP_METRICS_PROTOCOL,
    OTEL_EXPORTER_OTLP_LOGS_PROTOCOL. These allow configuring different transport protocols
    per signal type. Signal-specific vars take precedence over generic OTEL_EXPORTER_OTLP_PROTOCOL.
    The auto-select build() method on each exporter builder now respects the full priority chain:
    signal-specific env var > generic env var > feature-based default.
  • Transport/protocol mismatch validation: HTTP transport returns InvalidConfig when gRPC protocol
    is requested; gRPC transport returns InvalidConfig when an HTTP protocol is requested.
  • Breaking: Protocol::default() no longer consults the OTEL_EXPORTER_OTLP_PROTOCOL
    environment variable. It now returns only the feature-based default (http-json > http-proto >
    grpc-tonic). Protocol resolution from environment variables is handled internally by the
    exporter builders. Users who relied on Protocol::default() to read env vars should use
    Protocol::from_env() instead.
  • Add support for OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE environment variable
    to configure metrics temporality. Accepted values: cumulative (default), delta,
    lowmemory (case-insensitive). Programmatic .with_temporality() overrides the env var.
  • Fix NoHttpClient error when multiple HTTP client features are enabled by using priority-based selection (reqwest-client > hyper-client > reqwest-blocking-client). #​2994
  • Add partial success response handling for OTLP exporters (traces, metrics, logs) per OTLP spec. Exporters now log warnings when the server returns partial success responses with rejected items and error messages. #​865
  • Refactor internal-logs feature in opentelemetry-otlp to reduce unnecessary dependencies3191
  • Fixed [#​2777](https://github.com/open-telemetry/opentelemetry rust/issues/2777) to properly handle shutdown_with_timeout() when using grpc-tonic.
  • Deprecate tls feature in favor of explicit tls-ring and tls-aws-lc features.
    Migration: Replace tls with tls-ring (or tls-aws-lc). Users of tls-roots or tls-webpki-roots must now also enable one of these.
  • Prevent logging of header values in OTLP tonic exporter #​3465

v0.31.1: opentelemetry-otlp 0.31.1

Compare Source

What's Changed

  • feat(OTLP): add tls-ring, tls-aws-lc, and tls-provider-agnostic feature flags [patch release v0.31.1] by @​lalitb in #​3426

Full Changelog: open-telemetry/opentelemetry-rust@v0.31.0...opentelemetry-otlp-0.31.1

v0.31.0

Compare Source

Released 2025-Sep-25

  • Update opentelemetry-proto and opentelemetry-http dependency version to 0.31.0
  • Add HTTP compression support with gzip-http and zstd-http feature flags
  • Add retry with exponential backoff and throttling support for HTTP and gRPC exporters
    This behaviour is opt in via the experimental-grpc-retry and experimental-http-retry flags on this crate. You can customize the retry policy using the with_retry_policy on the exporter builders.
open-telemetry/opentelemetry-rust (opentelemetry-semantic-conventions)

v0.32.0

Compare Source

Released 2026-May-08

v0.31.0

Compare Source

Released 2025-Sep-25

  • Update to v1.34.0 of the semantic conventions.
open-telemetry/opentelemetry-rust (opentelemetry_sdk)

v0.32.1

Released 2026-May-23

  • BaggagePropagator now enforces the W3C Baggage maximum header length
    (8192 bytes) and maximum list-member count (64) when extracting an inbound
    baggage header. Headers exceeding 8192 bytes are dropped at the
    propagator boundary; headers with more than 64 list members are
    truncated to the first 64 entries. The change keeps the propagator from
    parsing attacker-controlled input beyond the W3C limits instead of doing
    per-entry parse, decode, and allocation work only to discard the excess
    on Baggage insert. See https://www.w3.org/TR/baggage/#limits.
  • Reverted the SimpleSpanProcessor telemetry suppression added in 0.32.0
    (see #​3494), which caused a RefCell already borrowed panic when a span
    was started and dropped inside a get_active_span (or Context::map_current)
    closure. Tracked in #​3510. A proper fix for the underlying
    Context::map_current re-entrancy will be investigated separately, after
    which the suppression can be safely re-applied.
  • View-provided metric stream name (set via Stream::builder().with_name(...))
    is no longer validated against the instrument name syntax, per
    spec clarification.
    unit and other stream parameters continue to be validated.

v0.32.0

Compare Source

Released 2026-May-08

  • SimpleSpanProcessor now suppresses telemetry during export, preventing
    telemetry-induced-telemetry feedback loops. This aligns with the existing
    behavior in BatchSpanProcessor and SimpleLogProcessor.
  • Removed SimpleConcurrentLogProcessor and the experimental_logs_concurrent_log_processor
    feature flag. The use cases it was designed for (ETW/user_events exporters) are
    better served by modeling those exporters as processors directly.
  • Added Counter::bind() and Histogram::bind() SDK implementations that
    return pre-bound measurement handles (BoundCounter<T>, BoundHistogram<T>).
    Bound instruments resolve the attribute-to-aggregator mapping once at bind time
    and cache the result, eliminating per-call HashMap lookups. View attribute
    filtering is applied at bind time so the hot path stays free of per-call
    attribute processing. Bound and unbound recordings with the same (post-view)
    attribute set always aggregate into the same data point, including the empty
    attribute set. Bound entries are never evicted during delta collection while
    a handle exists — idle cycles produce no export but the tracker persists. If
    bind() is called at the cardinality limit, the handle binds directly to
    the overflow tracker — its writes stay on the same direct (no-lookup) hot
    path and consistently land in the otel.metric.overflow=true bucket for
    the lifetime of the handle. To recover a bound handle after delta collection
    frees space, drop the existing handle and call bind() again. Gated behind
    the experimental_metrics_bound_instruments feature flag. Benchmarks show
    ~28x speedup for counter operations and ~9x for histograms.
  • Delta metrics collection now uses in-place eviction instead of draining the
    HashMap on every collect cycle. Stale attribute sets that received no measurements
    since the last collection are evicted. Note: recovery from cardinality overflow
    now requires 2 collect cycles — the first marks entries as stale, the second
    evicts them.
  • Breaking The SDK testing feature is now runtime agnostic. #​3407
    • TokioSpanExporter and new_tokio_test_exporter have been renamed to TestSpanExporter and new_test_exporter.
    • The following transitive dependencies and features have been removed: tokio/rt, tokio/time, tokio/macros, tokio/rt-multi-thread, tokio-stream, experimental_async_runtime
  • Store InstrumentationScope in Arc internally in SdkTracer, making tracer clones cheaper (Arc refcount increment instead of deep copy).
  • Add 32-bit platform support by using portable-atomic for AtomicI64 and AtomicU64 in the metrics module. This enables compilation on 32-bit ARM targets (e.g., armv5te-unknown-linux-gnueabi, armv7-unknown-linux-gnueabihf).
  • Aggregation enum and StreamBuilder::with_aggregation() are now stable and no longer require the spec_unstable_metrics_views feature flag.
  • Fix service.name Resource attribute fallback to follow OpenTelemetry
    specification by using unknown_service:<process.executable.name> format when
    service name is not explicitly configured. Previously, it only used
    unknown_service.
  • Fix SpanExporter::shutdown() default timeout from 5 nanoseconds to 5 seconds.
  • Breaking SpanExporter trait methods shutdown, shutdown_with_timeout, and force_flush now take &self instead of &mut self for consistency with LogExporter and PushMetricExporter. Implementers using interior mutability (e.g., Mutex, AtomicBool) require no changes.
  • Added Resource::get_ref(&self, key: &Key) -> Option<&Value> to allow retrieving a reference to a resource value without cloning.
  • Breaking Removed the following public hidden methods from the SdkTracer #​3227:
    • id_generator, should_sample
  • Breaking Moved the following SDK sampling types from opentelemetry::trace to opentelemetry_sdk::trace #​3277:
    • SamplingDecision, SamplingResult
    • These types are SDK implementation details and should be imported from opentelemetry_sdk::trace instead.
  • StreamBuilder::build() now rejects usize::MAX as a cardinality limit
    with a validation error. #​3506
  • Fix Histogram boundaries being ignored in the presence of views #​3312
  • TracerProviderBuilder::with_sampler allows to pass boxed instance of ShouldSample [#​3313][3313]
  • Fix ObservableCounter and ObservableUpDownCounter now correctly report only data points from the current measurement cycle, removing stale attribute combinations that are no longer observed. #​3248
  • Fix panic when SpanProcessor::on_end calls Context::current() (#​3262).
    • Updated SpanProcessor::on_end documentation to clarify that Context::current() returns the parent context, not the span's context
  • Fix traceparent headers with unknown flags (e.g. W3C random-trace-id flag 0x02) being incorrectly rejected. Unknown flags are now accepted and zeroed out as required by the W3C trace-context spec. #​3435
  • Breaking InMemoryExporterError has been removed and replaced by OTelSdkError, and a new JaegerRemoteSamplerBuildError introduced to replace last uses of TraceError. #​3458
  • "spec_unstable_logs_enabled" feature flag is removed. The capability (and the
    backing specification) is now stable and is enabled by default. #​3278

v0.31.0

Compare Source

Released 2025-Sep-25

  • Updated opentelemetry and opentelemetry-http dependencies to version 0.31.0.

  • Feature: Add span flags support for isRemote property in OTLP exporter (#​3153)

  • Updated span and link transformations to properly set flags field (0x100 for local, 0x300 for remote)

  • TODO: Placeholder for Span processor related things

    • Fix SpanProcessor::on_start is no longer called on non recording spans
  • Fix: Restore true parallel exports in the async-native BatchSpanProcessor by honoring OTEL_BSP_MAX_CONCURRENT_EXPORTS (#​2959). A regression in #​2685 inadvertently awaited the export() future directly in opentelemetry-sdk/src/trace/span_processor_with_async_runtime.rs instead of spawning it on the runtime, forcing all exports to run sequentially.

  • Feature: Added Clone implementation to SdkLogger for API consistency with SdkTracer (#​3058).

  • Fix: batch size accounting in BatchSpanProcessor when queue is full (#​3089).

  • Fix: Resolved dependency issue where the "logs" feature incorrectly
    required the "trace" feature flag
    (#​3096).
    The logs functionality now operates independently, while automatic correlation
    between logs and traces continues to work when the "trace" feature is
    explicitly enabled.

  • Fix: Fix shutdown of SimpleLogProcessor and async BatchLogProcessor.

  • Default implementation of LogProcessor::shutdown_with_timeout() will now warn to encourage users to implement proper shutdown.

tokio-rs/tracing-opentelemetry (tracing-opentelemetry)

v0.33.0

Compare Source

Fixed
  • [breaking] avoid deadlock when entering a span (#​251)
Other

v0.32.1

Compare Source

Added
  • allow OpenTelemetry context access with SpanRef (#​234)
  • add event-counting filtering layer for spans (#​228)
  • publicly export SetParentError
Fixed
  • fix panic in multithreaded follows-from
Other
  • Remove unwanted dependency on opentelemetry sdk crate (#​241)
  • update README.md links to use the latest version (#​239)
  • remove thiserror and unused dependencies (#​238)

v0.32.0

Compare Source

Added
  • Add configuration for including target in spans (#​222)
Changed
  • OpenTelemetry context activation (#​202)
    • Trace ID and span ID can be obtained from OtelData via dedicated functions. Note that these
      will be available only if the context has already been built. (#​233)
  • Correctly track entered and exited state for timings (#​212)
  • Slightly improve error message on version mismatch (#​211)
  • Remove Lazy for thread_local static (#​215)
  • Update description of special fields and semantic conventions
Breaking Changes
  • The attributes code.filepath, code.lineno, and code.namespace have been renamed to
    code.file.path, and code.line.number, and code.module.name, to align with the opentelemetry
    semantic conventions for code. (#​225)
  • Upgrade from opentelemetry to 0.31.0. Refer to the upstream
    changelog
    for more information. (#​230)
  • Hold onto MetricsProvider in MetricsLayer (#​224)
  • The attribute otel.status_message was changed to otel.status_description to align with the
    opentelemetry semantic conventions for code. (#​209)
  • Remove the metrics_gauge_unstable feature.

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • "before 4am every weekday,every weekend"
  • Automerge
    • "before 4am every weekday,every weekend"

🚦 Automerge: Enabled.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.


  • If you want to rebase/retry this PR, check this box

This PR has been generated by Renovate Bot.

@vercel

vercel Bot commented Nov 19, 2025

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
ds-theme Ready Ready Preview, Comment Jun 9, 2026 5:21pm
hash Ready Ready Preview, Comment Jun 9, 2026 5:21pm
hashdotdesign Ready Ready Preview, Comment Jun 9, 2026 5:21pm
hashdotdesign-tokens Ready Ready Preview, Comment Jun 9, 2026 5:21pm
petrinaut Ready Ready Preview Jun 9, 2026 5:21pm

@codecov

codecov Bot commented Nov 19, 2025

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 59.13%. Comparing base (232b539) to head (f0d187e).
⚠️ Report is 4 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff           @@
##             main    #8013   +/-   ##
=======================================
  Coverage   59.13%   59.13%           
=======================================
  Files        1346     1346           
  Lines      130096   130105    +9     
  Branches     5883     5882    -1     
=======================================
+ Hits        76931    76939    +8     
- Misses      52259    52260    +1     
  Partials      906      906           
Flag Coverage Δ
apps.hash-ai-worker-ts 1.39% <ø> (ø)
apps.hash-api 0.00% <ø> (ø)
blockprotocol.type-system 40.84% <ø> (ø)
local.claude-hooks 0.00% <ø> (ø)
local.harpc-client 51.49% <ø> (ø)
local.hash-backend-utils 2.81% <ø> (ø)
local.hash-graph-sdk 9.63% <ø> (ø)
local.hash-isomorphic-utils 0.00% <ø> (ø)
rust.antsi 0.00% <ø> (ø)
rust.error-stack 90.87% <ø> (ø)
rust.harpc-codec 84.70% <ø> (ø)
rust.harpc-net 96.19% <ø> (-0.02%) ⬇️
rust.harpc-tower 67.03% <ø> (ø)
rust.harpc-types 0.00% <ø> (ø)
rust.harpc-wire-protocol 92.23% <ø> (ø)
rust.hash-codec 72.76% <ø> (ø)
rust.hash-graph-api 2.51% <ø> (ø)
rust.hash-graph-authorization 62.34% <ø> (ø)
rust.hash-graph-postgres-store 26.78% <ø> (+0.03%) ⬆️
rust.hash-graph-store 37.76% <ø> (ø)
rust.hash-graph-temporal-versioning 47.95% <ø> (ø)
rust.hash-graph-types 0.00% <ø> (ø)
rust.hash-graph-validation 83.43% <ø> (ø)
rust.hashql-ast 87.23% <ø> (ø)
rust.hashql-compiletest 28.26% <ø> (ø)
rust.hashql-core 79.28% <ø> (ø)
rust.hashql-diagnostics 72.53% <ø> (ø)
rust.hashql-eval 75.69% <ø> (ø)
rust.hashql-hir 89.06% <ø> (ø)
rust.hashql-mir 87.05% <ø> (ø)
rust.hashql-syntax-jexpr 94.06% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@cursor

cursor Bot commented Jan 12, 2026

Copy link
Copy Markdown

PR Summary

Medium Risk
Touches observability export and tracing integration across the graph; upstream 0.32 includes OTLP/TLS and API breaking changes that may surface at build or runtime even though this diff is dependency-only.

Overview
Bumps the workspace OpenTelemetry stack from 0.30.x to 0.32.0 (opentelemetry, opentelemetry-appender-tracing, opentelemetry-otlp, opentelemetry-semantic-conventions, opentelemetry_sdk) and tracing-opentelemetry from 0.31.0 to 0.33.0, with matching Cargo.lock resolution for crates such as hash-telemetry, hash-graph-api, hash-graph-type-fetcher, and hash-temporal-client.

The lockfile also deduplicates gRPC/protobuf by dropping older tonic 0.13 / prost 0.13 in favor of tonic 0.14.5 and prost 0.14.3, and pulls in tonic-types for the updated OTLP exporter. tarpc still resolves against OpenTelemetry 0.30, so 0.30 and 0.32 coexist in the graph until that dependency moves forward.

Reviewed by Cursor Bugbot for commit f0d187e. Bugbot is set up for automated code reviews on this repo. Configure here.

@codspeed-hq

codspeed-hq Bot commented Jan 22, 2026

Copy link
Copy Markdown

Merging this PR will improve performance by 18.18%

⚠️ Different runtime environments detected

Some benchmarks with significant performance changes were compared across different runtime environments,
which may affect the accuracy of the results.

Open the report in CodSpeed to investigate

⚡ 2 improved benchmarks
✅ 78 untouched benchmarks

Performance Changes

Benchmark BASE HEAD Efficiency
bit_matrix/dense/iter_row[64] 170 ns 140.8 ns +20.71%
bit_matrix/dense/iter_row[200] 215 ns 185.8 ns +15.7%

Tip

Curious why this is faster? Comment @codspeedbot explain why this is faster on this PR, or directly use the CodSpeed MCP with your agent.


Comparing deps/rs/opentelemetry-rust-crates (f0d187e) with main (232b539)1

Open in CodSpeed

Footnotes

  1. No successful run was found on main (ba3f0b1) during the generation of this report, so 232b539 was used instead as the comparison base. There might be some changes unrelated to this pull request in this report.

Comment thread Cargo.lock
"tokio-util",
"tracing",
"tracing-opentelemetry",
"tracing-opentelemetry 0.31.0",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Duplicate OpenTelemetry versions break tarpc trace propagation

Medium Severity

The tarpc git dependency is pinned to opentelemetry 0.30.0 and tracing-opentelemetry 0.31.0, while the workspace now uses opentelemetry 0.31.0 and tracing-opentelemetry 0.32.1. Before this PR, all crates shared a single version. Now, two incompatible versions of tracing-opentelemetry coexist in the binary. Since OpenTelemetrySpanExt methods interact with span extension data (OtelData) by TypeId, tarpc's version 0.31.0 OtelData won't match the application layer's version 0.32.1 OtelData. This silently breaks trace context propagation across tarpc RPC calls used by the type fetcher service.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 5ad55e9. Configure here.

Comment thread Cargo.toml Outdated
opentelemetry-appender-tracing = { version = "0.31.0", default-features = false }
opentelemetry-otlp = { version = "0.31.0", default-features = false }
opentelemetry-semantic-conventions = { version = "0.31.0", default-features = false }
opentelemetry_sdk = { version = "0.31.0", default-features = false }

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

OpenTelemetry version split breaks tarpc trace context propagation

Medium Severity

Updating the workspace opentelemetry to 0.31.0 and tracing-opentelemetry to 0.32.x introduces a version split because tarpc (pinned to a git revision) still depends on opentelemetry 0.30.0 and tracing-opentelemetry 0.31.0. Before this PR, all crates shared the same OpenTelemetry versions. Now two separate opentelemetry::global states exist — the app configures the 0.31.0 global (propagator, tracer provider), but tarpc operates on the unconfigured 0.30.0 global. Additionally, the tracing-opentelemetry 0.32.1 layer stores span extension data as its own types, which tarpc's 0.31.0 OpenTelemetrySpanExt calls can't retrieve. This silently breaks trace context propagation across tarpc RPC boundaries (the type-fetcher service).

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 728c751. Configure here.

@hash-worker hash-worker Bot force-pushed the deps/rs/opentelemetry-rust-crates branch from 728c751 to 3931625 Compare May 23, 2026 01:09
@hash-worker hash-worker Bot changed the title Update opentelemetry Rust crates Update opentelemetry Rust crates to 0.32.0 May 23, 2026

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

There are 4 total unresolved issues (including 3 from previous reviews).

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 3931625. Configure here.

Comment thread Cargo.toml Outdated
@github-actions

github-actions Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Benchmark results

@rust/hash-graph-benches – Integrations

policy_resolution_large

Function Value Mean Flame graphs
resolve_policies_for_actor user: empty, selectivity: high, policies: 2002 $$16.7 \mathrm{ms} \pm 99.5 \mathrm{μs}\left({\color{gray}-0.377 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$2.10 \mathrm{ms} \pm 10.5 \mathrm{μs}\left({\color{gray}0.217 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 1001 $$8.60 \mathrm{ms} \pm 73.6 \mathrm{μs}\left({\color{gray}0.735 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: high, policies: 3314 $$25.9 \mathrm{ms} \pm 204 \mathrm{μs}\left({\color{lightgreen}-8.229 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: low, policies: 1 $$9.54 \mathrm{ms} \pm 80.8 \mathrm{μs}\left({\color{lightgreen}-7.375 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: medium, policies: 1526 $$15.4 \mathrm{ms} \pm 137 \mathrm{μs}\left({\color{lightgreen}-7.842 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 2078 $$17.9 \mathrm{ms} \pm 147 \mathrm{μs}\left({\color{gray}1.04 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$2.34 \mathrm{ms} \pm 11.3 \mathrm{μs}\left({\color{gray}1.40 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 1033 $$8.99 \mathrm{ms} \pm 101 \mathrm{μs}\left({\color{lightgreen}-5.098 \mathrm{\%}}\right) $$ Flame Graph

policy_resolution_medium

Function Value Mean Flame graphs
resolve_policies_for_actor user: empty, selectivity: high, policies: 102 $$2.29 \mathrm{ms} \pm 11.3 \mathrm{μs}\left({\color{gray}-0.206 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$1.88 \mathrm{ms} \pm 8.52 \mathrm{μs}\left({\color{gray}-1.034 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 51 $$2.09 \mathrm{ms} \pm 12.1 \mathrm{μs}\left({\color{gray}0.208 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: high, policies: 269 $$3.15 \mathrm{ms} \pm 17.0 \mathrm{μs}\left({\color{gray}-1.871 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: low, policies: 1 $$2.22 \mathrm{ms} \pm 12.1 \mathrm{μs}\left({\color{gray}0.044 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: medium, policies: 107 $$2.51 \mathrm{ms} \pm 15.4 \mathrm{μs}\left({\color{gray}-1.170 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 133 $$2.64 \mathrm{ms} \pm 16.2 \mathrm{μs}\left({\color{gray}-0.827 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$2.15 \mathrm{ms} \pm 10.9 \mathrm{μs}\left({\color{gray}0.100 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 63 $$2.50 \mathrm{ms} \pm 13.4 \mathrm{μs}\left({\color{gray}0.234 \mathrm{\%}}\right) $$ Flame Graph

policy_resolution_none

Function Value Mean Flame graphs
resolve_policies_for_actor user: empty, selectivity: high, policies: 2 $$1.62 \mathrm{ms} \pm 5.53 \mathrm{μs}\left({\color{gray}-4.740 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$1.58 \mathrm{ms} \pm 9.34 \mathrm{μs}\left({\color{gray}0.177 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 1 $$1.62 \mathrm{ms} \pm 8.23 \mathrm{μs}\left({\color{gray}-3.840 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 8 $$1.80 \mathrm{ms} \pm 14.7 \mathrm{μs}\left({\color{gray}-2.401 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$1.66 \mathrm{ms} \pm 6.37 \mathrm{μs}\left({\color{gray}-3.755 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 3 $$1.78 \mathrm{ms} \pm 7.85 \mathrm{μs}\left({\color{gray}-3.785 \mathrm{\%}}\right) $$ Flame Graph

policy_resolution_small

Function Value Mean Flame graphs
resolve_policies_for_actor user: empty, selectivity: high, policies: 52 $$1.87 \mathrm{ms} \pm 8.22 \mathrm{μs}\left({\color{gray}-0.854 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$1.71 \mathrm{ms} \pm 6.19 \mathrm{μs}\left({\color{gray}0.272 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 25 $$1.87 \mathrm{ms} \pm 9.01 \mathrm{μs}\left({\color{gray}-0.495 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: high, policies: 94 $$2.10 \mathrm{ms} \pm 13.8 \mathrm{μs}\left({\color{gray}-0.755 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: low, policies: 1 $$1.88 \mathrm{ms} \pm 7.44 \mathrm{μs}\left({\color{gray}0.414 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: medium, policies: 26 $$2.06 \mathrm{ms} \pm 9.90 \mathrm{μs}\left({\color{gray}-1.340 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 66 $$2.03 \mathrm{ms} \pm 11.3 \mathrm{μs}\left({\color{gray}0.165 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$1.87 \mathrm{ms} \pm 11.7 \mathrm{μs}\left({\color{gray}0.822 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 29 $$2.06 \mathrm{ms} \pm 13.7 \mathrm{μs}\left({\color{gray}0.045 \mathrm{\%}}\right) $$ Flame Graph

read_scaling_complete

Function Value Mean Flame graphs
entity_by_id;one_depth 1 entities $$34.5 \mathrm{ms} \pm 178 \mathrm{μs}\left({\color{gray}-3.736 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 10 entities $$29.8 \mathrm{ms} \pm 189 \mathrm{μs}\left({\color{gray}-4.827 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 25 entities $$33.4 \mathrm{ms} \pm 164 \mathrm{μs}\left({\color{lightgreen}-5.454 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 5 entities $$28.8 \mathrm{ms} \pm 147 \mathrm{μs}\left({\color{lightgreen}-6.330 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 50 entities $$41.4 \mathrm{ms} \pm 257 \mathrm{μs}\left({\color{gray}-1.337 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 1 entities $$40.4 \mathrm{ms} \pm 197 \mathrm{μs}\left({\color{gray}-0.511 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 10 entities $$36.4 \mathrm{ms} \pm 178 \mathrm{μs}\left({\color{gray}-3.519 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 25 entities $$64.6 \mathrm{ms} \pm 385 \mathrm{μs}\left({\color{gray}-2.930 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 5 entities $$30.7 \mathrm{ms} \pm 161 \mathrm{μs}\left({\color{gray}-3.193 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 50 entities $$174 \mathrm{ms} \pm 543 \mathrm{μs}\left({\color{gray}3.20 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 1 entities $$12.4 \mathrm{ms} \pm 67.6 \mathrm{μs}\left({\color{lightgreen}-6.552 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 10 entities $$12.8 \mathrm{ms} \pm 70.0 \mathrm{μs}\left({\color{lightgreen}-5.916 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 25 entities $$13.6 \mathrm{ms} \pm 86.3 \mathrm{μs}\left({\color{gray}-0.775 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 5 entities $$12.1 \mathrm{ms} \pm 77.1 \mathrm{μs}\left({\color{lightgreen}-7.107 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 50 entities $$16.1 \mathrm{ms} \pm 128 \mathrm{μs}\left({\color{gray}-1.392 \mathrm{\%}}\right) $$ Flame Graph

read_scaling_linkless

Function Value Mean Flame graphs
entity_by_id 1 entities $$12.6 \mathrm{ms} \pm 63.5 \mathrm{μs}\left({\color{gray}-3.553 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 10 entities $$12.6 \mathrm{ms} \pm 78.7 \mathrm{μs}\left({\color{gray}-4.463 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 100 entities $$12.4 \mathrm{ms} \pm 119 \mathrm{μs}\left({\color{lightgreen}-6.416 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 1000 entities $$13.1 \mathrm{ms} \pm 62.2 \mathrm{μs}\left({\color{lightgreen}-5.926 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 10000 entities $$17.3 \mathrm{ms} \pm 101 \mathrm{μs}\left({\color{gray}-1.370 \mathrm{\%}}\right) $$ Flame Graph

representative_read_entity

Function Value Mean Flame graphs
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/block/v/1 $$22.3 \mathrm{ms} \pm 179 \mathrm{μs}\left({\color{gray}-3.586 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/book/v/1 $$21.6 \mathrm{ms} \pm 139 \mathrm{μs}\left({\color{gray}-3.835 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/building/v/1 $$22.3 \mathrm{ms} \pm 145 \mathrm{μs}\left({\color{gray}-4.272 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/organization/v/1 $$22.0 \mathrm{ms} \pm 168 \mathrm{μs}\left({\color{gray}-2.313 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/page/v/2 $$21.6 \mathrm{ms} \pm 197 \mathrm{μs}\left({\color{gray}-1.563 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/person/v/1 $$21.6 \mathrm{ms} \pm 161 \mathrm{μs}\left({\color{lightgreen}-5.862 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/playlist/v/1 $$23.0 \mathrm{ms} \pm 173 \mathrm{μs}\left({\color{gray}0.100 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/song/v/1 $$21.3 \mathrm{ms} \pm 157 \mathrm{μs}\left({\color{lightgreen}-5.156 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/uk-address/v/1 $$21.3 \mathrm{ms} \pm 154 \mathrm{μs}\left({\color{gray}-2.649 \mathrm{\%}}\right) $$ Flame Graph

representative_read_entity_type

Function Value Mean Flame graphs
get_entity_type_by_id Account ID: bf5a9ef5-dc3b-43cf-a291-6210c0321eba $$5.44 \mathrm{ms} \pm 21.5 \mathrm{μs}\left({\color{gray}-1.238 \mathrm{\%}}\right) $$ Flame Graph

representative_read_multiple_entities

Function Value Mean Flame graphs
entity_by_property traversal_paths=0 0 $$55.1 \mathrm{ms} \pm 307 \mathrm{μs}\left({\color{lightgreen}-12.789 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=255 1,resolve_depths=inherit:1;values:255;properties:255;links:127;link_dests:126;type:true $$91.3 \mathrm{ms} \pm 544 \mathrm{μs}\left({\color{lightgreen}-7.834 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:0;links:0;link_dests:0;type:false $$60.0 \mathrm{ms} \pm 490 \mathrm{μs}\left({\color{lightgreen}-11.634 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:0;links:1;link_dests:0;type:true $$66.2 \mathrm{ms} \pm 364 \mathrm{μs}\left({\color{lightgreen}-11.142 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:2;links:1;link_dests:0;type:true $$70.7 \mathrm{ms} \pm 418 \mathrm{μs}\left({\color{lightgreen}-11.803 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:2;properties:2;links:1;link_dests:0;type:true $$77.4 \mathrm{ms} \pm 576 \mathrm{μs}\left({\color{lightgreen}-9.082 \mathrm{\%}}\right) $$
link_by_source_by_property traversal_paths=0 0 $$62.7 \mathrm{ms} \pm 351 \mathrm{μs}\left({\color{lightgreen}-8.994 \mathrm{\%}}\right) $$
link_by_source_by_property traversal_paths=255 1,resolve_depths=inherit:1;values:255;properties:255;links:127;link_dests:126;type:true $$81.9 \mathrm{ms} \pm 408 \mathrm{μs}\left({\color{gray}0.706 \mathrm{\%}}\right) $$
link_by_source_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:0;links:0;link_dests:0;type:false $$66.5 \mathrm{ms} \pm 270 \mathrm{μs}\left({\color{lightgreen}-5.653 \mathrm{\%}}\right) $$
link_by_source_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:0;links:1;link_dests:0;type:true $$73.0 \mathrm{ms} \pm 453 \mathrm{μs}\left({\color{lightgreen}-5.850 \mathrm{\%}}\right) $$
link_by_source_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:2;links:1;link_dests:0;type:true $$74.6 \mathrm{ms} \pm 350 \mathrm{μs}\left({\color{gray}-3.012 \mathrm{\%}}\right) $$
link_by_source_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:2;properties:2;links:1;link_dests:0;type:true $$73.8 \mathrm{ms} \pm 303 \mathrm{μs}\left({\color{gray}-0.405 \mathrm{\%}}\right) $$

scenarios

Function Value Mean Flame graphs
full_test query-limited $$109 \mathrm{ms} \pm 309 \mathrm{μs}\left({\color{gray}-4.120 \mathrm{\%}}\right) $$ Flame Graph
full_test query-unlimited $$92.1 \mathrm{ms} \pm 295 \mathrm{μs}\left({\color{gray}-1.801 \mathrm{\%}}\right) $$ Flame Graph
linked_queries query-limited $$26.6 \mathrm{ms} \pm 137 \mathrm{μs}\left({\color{gray}1.47 \mathrm{\%}}\right) $$ Flame Graph
linked_queries query-unlimited $$352 \mathrm{ms} \pm 649 \mathrm{μs}\left({\color{gray}4.46 \mathrm{\%}}\right) $$ Flame Graph

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/deps Relates to third-party dependencies (area)

Development

Successfully merging this pull request may close these issues.

2 participants