From dace695a39aab5c5aac92a3ca0a4ec634a431814 Mon Sep 17 00:00:00 2001 From: Caleb Schoepp Date: Fri, 22 Mar 2024 12:22:48 -0600 Subject: [PATCH 01/18] feat(wasi-otel): A WASI OTel host component Signed-off-by: Caleb Schoepp fix: update opentelemetry version Signed-off-by: Andrew Steurer <94206073+asteurer@users.noreply.github.com> Fix out of date Cargo.lock from bad rebase Signed-off-by: Caleb Schoepp feat(factor-otel): adding metrics Signed-off-by: Andrew Steurer <94206073+asteurer@users.noreply.github.com> feat(factor-otel): refactoring otel conversions Signed-off-by: Andrew Steurer <94206073+asteurer@users.noreply.github.com> fix(telemetry): update BatchLogProcessor to be async Signed-off-by: Andrew Steurer <94206073+asteurer@users.noreply.github.com> feat(factor-otel): refactoring WIT and updating conversions Signed-off-by: Andrew Steurer <94206073+asteurer@users.noreply.github.com> fix(factor-otel): updating WIT Signed-off-by: Andrew Steurer <94206073+asteurer@users.noreply.github.com> feat(factor-otel): updating WIT and conversions Signed-off-by: Andrew Steurer <94206073+asteurer@users.noreply.github.com> feat(factor-otel): small refactors Signed-off-by: Andrew Steurer <94206073+asteurer@users.noreply.github.com> fix(factor-otel): rebasing wasi-otel branch on main Signed-off-by: Andrew Steurer <94206073+asteurer@users.noreply.github.com> --- Cargo.lock | 3134 +++++++++++------ Cargo.toml | 6 + crates/factor-key-value/Cargo.toml | 1 + crates/factor-key-value/src/host.rs | 24 +- crates/factor-key-value/src/lib.rs | 8 +- crates/factor-llm/Cargo.toml | 1 + crates/factor-llm/src/host.rs | 4 + crates/factor-llm/src/lib.rs | 6 +- crates/factor-otel/Cargo.toml | 25 + crates/factor-otel/src/host.rs | 87 + crates/factor-otel/src/lib.rs | 213 ++ crates/factor-outbound-http/Cargo.toml | 1 + crates/factor-outbound-http/src/lib.rs | 5 + crates/factor-outbound-http/src/spin.rs | 2 + crates/factor-outbound-mqtt/Cargo.toml | 1 + crates/factor-outbound-mqtt/src/host.rs | 13 +- crates/factor-outbound-mqtt/src/lib.rs | 4 + crates/factor-outbound-mysql/Cargo.toml | 1 + crates/factor-outbound-mysql/src/host.rs | 3 + crates/factor-outbound-mysql/src/lib.rs | 5 + crates/factor-outbound-pg/Cargo.toml | 1 + crates/factor-outbound-pg/src/host.rs | 4 + crates/factor-outbound-pg/src/lib.rs | 6 + crates/factor-outbound-redis/Cargo.toml | 1 + crates/factor-outbound-redis/src/host.rs | 23 +- crates/factor-outbound-redis/src/lib.rs | 4 + crates/factor-sqlite/Cargo.toml | 1 + crates/factor-sqlite/src/host.rs | 6 + crates/factor-sqlite/src/lib.rs | 5 +- crates/factor-variables/Cargo.toml | 1 + crates/factor-variables/src/host.rs | 1 + crates/factor-variables/src/lib.rs | 6 +- crates/runtime-config/Cargo.toml | 1 + crates/runtime-config/src/lib.rs | 7 + crates/runtime-factors/Cargo.toml | 1 + crates/runtime-factors/src/lib.rs | 3 + crates/telemetry/Cargo.toml | 6 +- crates/telemetry/src/env.rs | 18 +- crates/telemetry/src/lib.rs | 12 +- crates/telemetry/src/logs.rs | 5 +- crates/telemetry/src/metrics.rs | 5 +- crates/telemetry/src/traces.rs | 7 +- crates/trigger-http/Cargo.toml | 1 + crates/trigger-http/src/wasi.rs | 1 + crates/world/Cargo.toml | 3 + crates/world/src/conversions.rs | 492 +++ tests/integration.rs | 437 ++- tests/test-components/components/Cargo.lock | 865 +++-- .../components/otel-smoke-test/Cargo.toml | 12 + .../components/otel-smoke-test/src/lib.rs | 22 + .../components/wasi-otel-tracing/Cargo.toml | 16 + .../components/wasi-otel-tracing/src/lib.rs | 130 + tests/testcases/otel-smoke-test/spin.toml | 13 +- tests/testcases/wasi-otel-tracing/spin.toml | 19 + wit/deps/otel/metrics.wit | 264 ++ wit/deps/otel/tracing.wit | 122 + wit/deps/otel/types.wit | 48 + wit/deps/otel/world.wit | 7 + wit/world.wit | 1 + 59 files changed, 4736 insertions(+), 1385 deletions(-) create mode 100644 crates/factor-otel/Cargo.toml create mode 100644 crates/factor-otel/src/host.rs create mode 100644 crates/factor-otel/src/lib.rs create mode 100644 tests/test-components/components/otel-smoke-test/Cargo.toml create mode 100644 tests/test-components/components/otel-smoke-test/src/lib.rs create mode 100644 tests/test-components/components/wasi-otel-tracing/Cargo.toml create mode 100644 tests/test-components/components/wasi-otel-tracing/src/lib.rs create mode 100644 tests/testcases/wasi-otel-tracing/spin.toml create mode 100644 wit/deps/otel/metrics.wit create mode 100644 wit/deps/otel/tracing.wit create mode 100644 wit/deps/otel/types.wit create mode 100644 wit/deps/otel/world.wit diff --git a/Cargo.lock b/Cargo.lock index 78dde56106..35f072bd3c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,10 +4,11 @@ version = 4 [[package]] name = "addr2line" -version = "0.24.2" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ +<<<<<<< HEAD "gimli 0.31.1", ] @@ -18,13 +19,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ "gimli 0.32.3", +======= + "gimli", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) ] [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "adler32" @@ -49,37 +53,39 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "once_cell", "version_check", ] [[package]] name = "ahash" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", + "getrandom 0.3.4", "once_cell", + "serde", "version_check", "zerocopy", ] [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] [[package]] name = "allocator-api2" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45862d1c77f2228b9e10bc609d5bc203d86ebc9b87ad8d5d5167a6c9abf739d9" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "ambient-authority" @@ -87,12 +93,6 @@ version = "0.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9d4ee0d472d1cd2e28c97dfa124b3d8d992e10eb0a035f33f5d12e3a177ba3b" -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - [[package]] name = "android_system_properties" version = "0.1.5" @@ -104,9 +104,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.18" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" dependencies = [ "anstyle", "anstyle-parse", @@ -119,36 +119,37 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.10" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anstyle-parse" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.2" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.6" +version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" dependencies = [ "anstyle", - "windows-sys 0.59.0", + "once_cell_polyfill", + "windows-sys 0.60.2", ] [[package]] @@ -199,7 +200,7 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" dependencies = [ - "event-listener 5.3.1", + "event-listener 5.4.1", "event-listener-strategy", "futures-core", "pin-project-lite", @@ -218,9 +219,9 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.3.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" dependencies = [ "concurrent-queue", "event-listener-strategy", @@ -230,67 +231,82 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.17" +version = "0.4.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cb8f1d480b0ea3783ab015936d2a55c87e219676f0c0b7dec61494043f21857" +checksum = "5a89bce6054c720275ac2432fbba080a66a2106a44a1b804553930ca6909f4e0" dependencies = [ - "flate2", + "compression-codecs", + "compression-core", "futures-core", - "memchr", "pin-project-lite", "tokio", ] [[package]] name = "async-executor" -version = "1.13.1" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" +checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" dependencies = [ "async-task", "concurrent-queue", - "fastrand 2.2.0", - "futures-lite 2.5.0", + "fastrand 2.3.0", + "futures-lite 2.6.1", + "pin-project-lite", "slab", ] [[package]] name = "async-fs" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" +checksum = "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b304567052e294c5" dependencies = [ "async-lock", "blocking", - "futures-lite 2.5.0", + "futures-lite 2.6.1", ] [[package]] -name = "async-io" -version = "2.4.0" +name = "async-global-executor" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" +checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" dependencies = [ + "async-channel 2.5.0", + "async-executor", + "async-io", "async-lock", + "blocking", + "futures-lite 2.6.1", + "once_cell", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", "cfg-if", "concurrent-queue", "futures-io", - "futures-lite 2.5.0", + "futures-lite 2.6.1", "parking", "polling", - "rustix 0.38.40", + "rustix 1.1.2", "slab", - "tracing", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "async-lock" -version = "3.4.0" +version = "3.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" dependencies = [ - "event-listener 5.3.1", + "event-listener 5.4.1", "event-listener-strategy", "pin-project-lite", ] @@ -312,21 +328,20 @@ dependencies = [ [[package]] name = "async-process" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" dependencies = [ - "async-channel 2.3.1", + "async-channel 2.5.0", "async-io", "async-lock", "async-signal", "async-task", "blocking", "cfg-if", - "event-listener 5.3.1", - "futures-lite 2.5.0", - "rustix 0.38.40", - "tracing", + "event-listener 5.4.1", + "futures-lite 2.6.1", + "rustix 1.1.2", ] [[package]] @@ -342,9 +357,9 @@ dependencies = [ [[package]] name = "async-signal" -version = "0.2.10" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" +checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" dependencies = [ "async-io", "async-lock", @@ -352,10 +367,37 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix 0.38.40", + "rustix 1.1.2", "signal-hook-registry", "slab", - "windows-sys 0.59.0", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-std" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c8e079a4ab67ae52b7403632e4618815d6db36d2a010cfe41b02c1b1578f93b" +dependencies = [ + "async-channel 1.9.0", + "async-global-executor", + "async-io", + "async-lock", + "async-process", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite 2.6.1", + "gloo-timers", + "kv-log-macro", + "log", + "memchr", + "once_cell", + "pin-project-lite", + "pin-utils", + "slab", + "wasm-bindgen-futures", ] [[package]] @@ -434,15 +476,15 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-config" -version = "1.5.10" +version = "1.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b49afaa341e8dd8577e1a2200468f98956d6eda50bcf4a53246cc00174ba924" +checksum = "1856b1b48b65f71a4dd940b1c0931f9a7b646d4a924b9828ffefc1454714668a" dependencies = [ "aws-credential-types", "aws-runtime", @@ -457,9 +499,9 @@ dependencies = [ "aws-smithy-types", "aws-types", "bytes", - "fastrand 2.2.0", + "fastrand 2.3.0", "hex", - "http 0.2.12", + "http 1.3.1", "ring", "time", "tokio", @@ -470,9 +512,9 @@ dependencies = [ [[package]] name = "aws-credential-types" -version = "1.2.1" +version = "1.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60e8f6b615cb5fc60a98132268508ad104310f0cfb25a1c22eee76efdf9154da" +checksum = "faf26925f4a5b59eb76722b63c2892b1d70d06fa053c72e4a100ec308c1d47bc" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", @@ -482,9 +524,9 @@ dependencies = [ [[package]] name = "aws-runtime" -version = "1.4.3" +version = "1.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a10d5c055aa540164d9561a0e2e74ad30f0dcf7393c3a92f6733ddf9c5762468" +checksum = "9f2402da1a5e16868ba98725e5d73f26b8116eaa892e56f2cd0bf5eec7985f70" dependencies = [ "aws-credential-types", "aws-sigv4", @@ -495,10 +537,9 @@ dependencies = [ "aws-smithy-types", "aws-types", "bytes", - "fastrand 2.2.0", + "fastrand 2.3.0", "http 0.2.12", "http-body 0.4.6", - "once_cell", "percent-encoding", "pin-project-lite", "tracing", @@ -507,9 +548,9 @@ dependencies = [ [[package]] name = "aws-sdk-dynamodb" -version = "1.53.0" +version = "1.97.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6355a9536b92daf4c4b7d4d4f60dd08ea780259ed80bac0312f2e1df4398176" +checksum = "6034694d9f6b47ead8af47a1b79a85e185751d1171e9b983c4b3328bbff480c6" dependencies = [ "aws-credential-types", "aws-runtime", @@ -521,18 +562,17 @@ dependencies = [ "aws-smithy-types", "aws-types", "bytes", - "fastrand 2.2.0", + "fastrand 2.3.0", "http 0.2.12", - "once_cell", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-sso" -version = "1.49.0" +version = "1.88.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09677244a9da92172c8dc60109b4a9658597d4d298b188dd0018b6a66b410ca4" +checksum = "d05b276777560aa9a196dbba2e3aada4d8006d3d7eeb3ba7fe0c317227d933c4" dependencies = [ "aws-credential-types", "aws-runtime", @@ -544,17 +584,17 @@ dependencies = [ "aws-smithy-types", "aws-types", "bytes", + "fastrand 2.3.0", "http 0.2.12", - "once_cell", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-ssooidc" -version = "1.50.0" +version = "1.90.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fea2f3a8bb3bd10932ae7ad59cc59f65f270fc9183a7e91f501dc5efbef7ee" +checksum = "f9be14d6d9cd761fac3fd234a0f47f7ed6c0df62d83c0eeb7012750e4732879b" dependencies = [ "aws-credential-types", "aws-runtime", @@ -566,17 +606,17 @@ dependencies = [ "aws-smithy-types", "aws-types", "bytes", + "fastrand 2.3.0", "http 0.2.12", - "once_cell", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-sts" -version = "1.49.0" +version = "1.90.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53dcf5e7d9bd1517b8b998e170e650047cea8a2b85fe1835abe3210713e541b7" +checksum = "98a862d704c817d865c8740b62d8bbeb5adcb30965e93b471df8a5bcefa20a80" dependencies = [ "aws-credential-types", "aws-runtime", @@ -589,17 +629,17 @@ dependencies = [ "aws-smithy-types", "aws-smithy-xml", "aws-types", + "fastrand 2.3.0", "http 0.2.12", - "once_cell", "regex-lite", "tracing", ] [[package]] name = "aws-sigv4" -version = "1.2.5" +version = "1.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5619742a0d8f253be760bfbb8e8e8368c69e3587e4637af5754e488a611499b1" +checksum = "c35452ec3f001e1f2f6db107b6373f1f48f05ec63ba2c5c9fa91f07dad32af11" dependencies = [ "aws-credential-types", "aws-smithy-http", @@ -611,7 +651,10 @@ dependencies = [ "hmac", "http 0.2.12", "http 1.3.1", +<<<<<<< HEAD "once_cell", +======= +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "percent-encoding", "sha2", "time", @@ -620,9 +663,9 @@ dependencies = [ [[package]] name = "aws-smithy-async" -version = "1.2.1" +version = "1.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62220bc6e97f946ddd51b5f1361f78996e704677afc518a4ff66b7a72ea1378c" +checksum = "127fcfad33b7dfc531141fda7e1c402ac65f88aca5511a4d31e2e3d2cd01ce9c" dependencies = [ "futures-util", "pin-project-lite", @@ -631,38 +674,69 @@ dependencies = [ [[package]] name = "aws-smithy-http" -version = "0.60.11" +version = "0.62.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8bc3e8fdc6b8d07d976e301c02fe553f72a39b7a9fea820e023268467d7ab6" +checksum = "445d5d720c99eed0b4aa674ed00d835d9b1427dd73e04adaf2f94c6b2d6f9fca" dependencies = [ "aws-smithy-runtime-api", "aws-smithy-types", "bytes", "bytes-utils", "futures-core", + "futures-util", "http 0.2.12", + "http 1.3.1", "http-body 0.4.6", - "once_cell", "percent-encoding", "pin-project-lite", "pin-utils", "tracing", ] +[[package]] +name = "aws-smithy-http-client" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "623254723e8dfd535f566ee7b2381645f8981da086b5c4aa26c0c41582bb1d2c" +dependencies = [ + "aws-smithy-async", + "aws-smithy-runtime-api", + "aws-smithy-types", + "h2 0.3.27", + "h2 0.4.12", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.32", + "hyper-rustls 0.24.2", + "pin-project-lite", + "rustls 0.21.12", + "tokio", + "tracing", +] + [[package]] name = "aws-smithy-json" -version = "0.60.7" +version = "0.61.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4683df9469ef09468dad3473d129960119a0d3593617542b7d52086c8486f2d6" +checksum = "2db31f727935fc63c6eeae8b37b438847639ec330a9161ece694efba257e0c54" dependencies = [ "aws-smithy-types", ] +[[package]] +name = "aws-smithy-observability" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d1881b1ea6d313f9890710d65c158bdab6fb08c91ea825f74c1c8c357baf4cc" +dependencies = [ + "aws-smithy-runtime-api", +] + [[package]] name = "aws-smithy-query" -version = "0.60.7" +version = "0.60.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2fbd61ceb3fe8a1cb7352e42689cec5335833cd9f94103a61e98f9bb61c64bb" +checksum = "d28a63441360c477465f80c7abac3b9c4d075ca638f982e605b7dc2a2c7156c9" dependencies = [ "aws-smithy-types", "urlencoding", @@ -670,36 +744,33 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "1.7.3" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be28bd063fa91fd871d131fc8b68d7cd4c5fa0869bea68daca50dcb1cbd76be2" +checksum = "0bbe9d018d646b96c7be063dd07987849862b0e6d07c778aad7d93d1be6c1ef0" dependencies = [ "aws-smithy-async", "aws-smithy-http", + "aws-smithy-http-client", + "aws-smithy-observability", "aws-smithy-runtime-api", "aws-smithy-types", "bytes", - "fastrand 2.2.0", - "h2 0.3.26", + "fastrand 2.3.0", "http 0.2.12", + "http 1.3.1", "http-body 0.4.6", "http-body 1.0.1", - "httparse", - "hyper 0.14.31", - "hyper-rustls 0.24.2", - "once_cell", "pin-project-lite", "pin-utils", - "rustls 0.21.12", "tokio", "tracing", ] [[package]] name = "aws-smithy-runtime-api" -version = "1.7.3" +version = "1.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92165296a47a812b267b4f41032ff8069ab7ff783696d217f0994a0d7ab585cd" +checksum = "ec7204f9fd94749a7c53b26da1b961b4ac36bf070ef1e0b94bb09f79d4f6c193" dependencies = [ "aws-smithy-async", "aws-smithy-types", @@ -714,9 +785,9 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "1.2.9" +version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fbd94a32b3a7d55d3806fe27d98d3ad393050439dd05eb53ece36ec5e3d3510" +checksum = "25f535879a207fce0db74b679cfc3e91a3159c8144d717d55f5832aea9eef46e" dependencies = [ "base64-simd", "bytes", @@ -740,18 +811,18 @@ dependencies = [ [[package]] name = "aws-smithy-xml" -version = "0.60.9" +version = "0.60.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab0b0166827aa700d3dc519f72f8b3a91c35d0b8d042dc5d643a91e6f80648fc" +checksum = "eab77cdd036b11056d2a30a7af7b775789fb024bf216acc13884c6c97752ae56" dependencies = [ "xmlparser", ] [[package]] name = "aws-types" -version = "1.3.3" +version = "1.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5221b91b3e441e6675310829fd8984801b772cb1546ef6c0e54dec9f1ac13fef" +checksum = "d79fb68e3d7fe5d4833ea34dc87d2e97d26d3086cb3da660bb6b1f76d98680b6" dependencies = [ "aws-credential-types", "aws-smithy-async", @@ -782,7 +853,7 @@ dependencies = [ "pin-project-lite", "rustversion", "serde", - "sync_wrapper 1.0.1", + "sync_wrapper 1.0.2", "tower 0.5.2", "tower-layer", "tower-service", @@ -803,7 +874,7 @@ dependencies = [ "mime", "pin-project-lite", "rustversion", - "sync_wrapper 1.0.1", + "sync_wrapper 1.0.2", "tower-layer", "tower-service", ] @@ -818,13 +889,13 @@ dependencies = [ "bytes", "dyn-clone", "futures", - "getrandom 0.2.15", + "getrandom 0.2.16", "http-types", "once_cell", "paste", "pin-project", "rand 0.8.5", - "reqwest 0.12.9", + "reqwest 0.12.24", "rustc_version", "serde", "serde_json", @@ -845,14 +916,14 @@ dependencies = [ "bytes", "dyn-clone", "futures", - "getrandom 0.2.15", + "getrandom 0.2.16", "hmac", "http-types", "once_cell", "paste", "pin-project", "rand 0.8.5", - "reqwest 0.12.9", + "reqwest 0.12.24", "rustc_version", "serde", "serde_json", @@ -938,26 +1009,26 @@ dependencies = [ [[package]] name = "backon" -version = "1.5.2" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "592277618714fbcecda9a02ba7a8781f319d26532a88553bbacc77ba5d2b3a8d" +checksum = "cffb0e931875b666fc4fcb20fee52e9bbd1ef836fd9e9e04ec21555f9f85f7ef" dependencies = [ - "fastrand 2.2.0", + "fastrand 2.3.0", ] [[package]] name = "backtrace" -version = "0.3.74" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ - "addr2line 0.24.2", + "addr2line", "cfg-if", "libc", "miniz_oxide", - "object 0.36.5", + "object", "rustc-demangle", - "windows-targets 0.52.6", + "windows-link 0.2.1", ] [[package]] @@ -996,9 +1067,9 @@ dependencies = [ [[package]] name = "base64ct" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" [[package]] name = "beef" @@ -1101,16 +1172,25 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + [[package]] name = "blocking" -version = "1.6.1" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" dependencies = [ - "async-channel 2.3.1", + "async-channel 2.5.0", "async-task", "futures-io", - "futures-lite 2.5.0", + "futures-lite 2.6.1", "piper", ] @@ -1159,9 +1239,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" dependencies = [ "allocator-api2", ] @@ -1190,18 +1270,18 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.19.0" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.8.0" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" dependencies = [ "proc-macro2", "quote", @@ -1216,9 +1296,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" +<<<<<<< HEAD version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +======= +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "serde", ] @@ -1235,11 +1321,11 @@ dependencies = [ [[package]] name = "camino" -version = "1.1.9" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -1258,7 +1344,7 @@ dependencies = [ "metal 0.27.0", "num-traits", "num_cpus", - "rand 0.9.1", + "rand 0.9.2", "rand_distr", "rayon", "safetensors 0.4.5", @@ -1266,7 +1352,7 @@ dependencies = [ "ug", "ug-cuda", "ug-metal", - "yoke", + "yoke 0.7.5", "zip", ] @@ -1319,7 +1405,7 @@ dependencies = [ "candle-nn", "fancy-regex", "num-traits", - "rand 0.9.1", + "rand 0.9.2", "rayon", "serde", "serde_json", @@ -1407,9 +1493,9 @@ dependencies = [ [[package]] name = "cargo-platform" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" dependencies = [ "serde", ] @@ -1443,7 +1529,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a969e13a7589e9e3e4207e153bae624ade2b5622fb4684a4923b23ec3d57719" dependencies = [ "serde", +<<<<<<< HEAD "toml 0.8.19", +======= + "toml 0.8.23", +] + +[[package]] +name = "castaway" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" +dependencies = [ + "rustversion", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) ] [[package]] @@ -1457,9 +1556,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.41" +version = "1.2.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac9fe6cdbb24b6ade63616c0a0688e45bb56732262c158df3c0c4bea4ca47cb7" +checksum = "37521ac7aabe3d13122dc382493e20c9416f299d2ccd5b3a5340a2570cdeb0f3" dependencies = [ "find-msvc-tools", "jobserver", @@ -1469,9 +1568,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" @@ -1481,17 +1580,16 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ - "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.52.6", + "windows-link 0.2.1", ] [[package]] @@ -1523,23 +1621,23 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.20" +version = "4.5.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5" dependencies = [ "clap_builder", - "clap_derive 4.5.18", + "clap_derive 4.5.49", ] [[package]] name = "clap_builder" -version = "4.5.20" +version = "4.5.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a" dependencies = [ "anstream", "anstyle", - "clap_lex 0.7.2", + "clap_lex 0.7.6", "strsim 0.11.1", ] @@ -1558,9 +1656,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.18" +version = "4.5.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -1579,15 +1677,15 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.2" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" [[package]] name = "clearscreen" -version = "4.0.1" +version = "4.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c41dc435a7b98e4608224bbf65282309f5403719df9113621b30f8b6f74e2f4" +checksum = "85a8ab73a1c02b0c15597b22e09c7dc36e63b2f601f9d1e83ac0c3decd38b1ae" dependencies = [ "nix 0.29.0", "terminfo", @@ -1598,9 +1696,9 @@ dependencies = [ [[package]] name = "cmake" -version = "0.1.51" +version = "0.1.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb1e43aa7fd152b1f968787f7dbcdeb306d1867ff373c69955211876c053f91a" +checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" dependencies = [ "cc", ] @@ -1616,9 +1714,9 @@ dependencies = [ [[package]] name = "colorchoice" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "combine" @@ -1636,14 +1734,13 @@ dependencies = [ [[package]] name = "comfy-table" -version = "7.1.1" +version = "7.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b34115915337defe99b2aff5c2ce6771e5fbc4079f4b506301f5cf394c8452f7" +checksum = "b03b7db8e0b4b2fdad6c551e634134e99ec000e5c8c3b6856c65e8bbaded7a3b" dependencies = [ "crossterm", - "strum 0.26.3", - "strum_macros 0.26.4", - "unicode-width 0.1.14", + "unicode-segmentation", + "unicode-width 0.2.2", ] [[package]] @@ -1658,6 +1755,38 @@ dependencies = [ "winapi", ] +[[package]] +name = "compact_str" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb1325a1cece981e8a296ab8f0f9b63ae357bd0784a9faaf548cc7b480707a" +dependencies = [ + "castaway", + "cfg-if", + "itoa", + "rustversion", + "ryu", + "serde", + "static_assertions", +] + +[[package]] +name = "compression-codecs" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef8a506ec4b81c460798f572caead636d57d3d7e940f998160f52bd254bf2d23" +dependencies = [ + "compression-core", + "flate2", + "memchr", +] + +[[package]] +name = "compression-core" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e47641d3deaf41fb1538ac1f54735925e275eaf3bf4d55c81b137fba797e5cbb" + [[package]] name = "concurrent-queue" version = "2.5.0" @@ -1682,7 +1811,11 @@ dependencies = [ "rust-ini", "serde", "serde_json", +<<<<<<< HEAD "toml 0.8.19", +======= + "toml 0.8.23", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "yaml-rust2", ] @@ -1705,7 +1838,7 @@ dependencies = [ "flate2", "json5", "libtest-mimic", - "reqwest 0.12.9", + "reqwest 0.12.24", "serde", "tar", "test-environment", @@ -1713,15 +1846,15 @@ dependencies = [ [[package]] name = "console" -version = "0.15.8" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" dependencies = [ "encode_unicode", - "lazy_static 1.5.0", "libc", - "unicode-width 0.1.14", - "windows-sys 0.52.0", + "once_cell", + "unicode-width 0.2.2", + "windows-sys 0.59.0", ] [[package]] @@ -1745,16 +1878,16 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "once_cell", "tiny-keccak", ] [[package]] name = "const_fn" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "373e9fafaa20882876db20562275ff58d50e0caa2590077fe7ce7bef90211d0d" +checksum = "2f8a2ca5ac02d09563609681103aada9e1777d54fc57a5acd7a41404f9c93b6e" [[package]] name = "convert_case" @@ -1777,9 +1910,9 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" dependencies = [ "core-foundation-sys", "libc", @@ -1804,54 +1937,78 @@ dependencies = [ [[package]] name = "cpp_demangle" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96e58d342ad113c2b878f16d5d034c03be492ae460cdbc02b7f0f2284d310c7d" +checksum = "f2bb79cb74d735044c972aae58ed0aaa9a837e85b01106a54c39e42e97f62253" dependencies = [ "cfg-if", ] [[package]] name = "cpufeatures" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ca741a962e1b0bff6d724a1a0958b686406e853bb14061f218562e1896f95e6" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] [[package]] name = "cranelift-assembler-x64" +<<<<<<< HEAD version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30054f4aef4d614d37f27d5b77e36e165f0b27a71563be348e7c9fcfac41eed8" +======= +version = "0.124.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e2df3d5caad11e71bb0b70115a5210c3af4a0bcb2893f78ee9311b1b266b05" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "cranelift-assembler-x64-meta", ] [[package]] name = "cranelift-assembler-x64-meta" +<<<<<<< HEAD version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0beab56413879d4f515e08bcf118b1cb85f294129bb117057f573d37bfbb925a" +======= +version = "0.124.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63e87985fc9166a2541b05fd5f913a398cff9aec6b13ebca865253cdee15806" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "cranelift-srcgen", ] [[package]] name = "cranelift-bforest" +<<<<<<< HEAD version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d054747549a69b264d5299c8ca1b0dd45dc6bd0ee43f1edfcc42a8b12952c7a" +======= +version = "0.124.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b5364dfe182d4b89af2f4bd0dafc8f6c590bbf0216ee8ce60bfd8893c3d14a6" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-bitset" +<<<<<<< HEAD version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98b92d481b77a7dc9d07c96e24a16f29e0c9c27d042828fdf7e49e54ee9819bf" +======= +version = "0.124.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3067ca8c10796434497a5faac73d949b5ac0008ed572013debe88694bfef426e" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "serde", "serde_derive", @@ -1859,9 +2016,15 @@ dependencies = [ [[package]] name = "cranelift-codegen" +<<<<<<< HEAD version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6eeccfc043d599b0ef1806942707fc51cdd1c3965c343956dc975a55d82a920f" +======= +version = "0.124.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eb420cc46d7f0956e2e3d9e6389036c612ada3542a29edc6f5deedf86d568ba" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "bumpalo", "cranelift-assembler-x64", @@ -1872,8 +2035,13 @@ dependencies = [ "cranelift-control", "cranelift-entity", "cranelift-isle", +<<<<<<< HEAD "gimli 0.32.3", "hashbrown 0.15.2", +======= + "gimli", + "hashbrown 0.15.5", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "log", "pulley-interpreter", "regalloc2", @@ -1886,9 +2054,15 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" +<<<<<<< HEAD version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1174cdb9d9d43b2bdaa612a07ed82af13db9b95526bc2c286c2aec4689bcc038" +======= +version = "0.124.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "440d31dd36e477fb6292821b593da65df60328bca1046ea5881f424aa5a44b5d" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "cranelift-assembler-x64-meta", "cranelift-codegen-shared", @@ -1899,6 +2073,7 @@ dependencies = [ [[package]] name = "cranelift-codegen-shared" +<<<<<<< HEAD version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d572be73fae802eb115f45e7e67a9ed16acb4ee683b67c4086768786545419a" @@ -1908,15 +2083,32 @@ name = "cranelift-control" version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1587465cc84c5cc793b44add928771945f3132bbf6b3621ee9473c631a87156" +======= +version = "0.124.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0b342ef4835787577f6e7553747cdd902797509eb5af733cd89e5ce97cea0f0" + +[[package]] +name = "cranelift-control" +version = "0.124.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b34de54534b61c3f3e475558cf19c90b2a7a758c7018e557e5d1a47b9a1fbb03" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "arbitrary", ] [[package]] name = "cranelift-entity" +<<<<<<< HEAD version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "063b83448b1343e79282c3c7cbda7ed5f0816f0b763a4c15f7cecb0a17d87ea6" +======= +version = "0.124.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3d7bf1aae1800d053aa965381dcb01054404d0bcd8ea5ffe65bb855b8e3f654" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "cranelift-bitset", "serde", @@ -1925,9 +2117,15 @@ dependencies = [ [[package]] name = "cranelift-frontend" +<<<<<<< HEAD version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa4461c2d2ca48bc72883f5f5c3129d9aefac832df1db824af9db8db3efee109" +======= +version = "0.124.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36158c03d70e1f443cc2d6d9adc838fc0a031b166f3861534e9cb77742380e2a" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "cranelift-codegen", "log", @@ -1937,6 +2135,7 @@ dependencies = [ [[package]] name = "cranelift-isle" +<<<<<<< HEAD version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acd811b25e18f14810d09c504e06098acc1d9dbfa24879bf0d6b6fb44415fc66" @@ -1946,6 +2145,17 @@ name = "cranelift-native" version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2417046989d8d6367a55bbab2e406a9195d176f4779be4aa484d645887217d37" +======= +version = "0.124.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fa194bbc189c965454f3a94c1acb6c89d63d5d0b183e60edc17db758bfbe519" + +[[package]] +name = "cranelift-native" +version = "0.124.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c469bb98ffe9f38a1a5ada0427ab096f0f1b9a22a30149fc705205c56cf8985" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "cranelift-codegen", "libc", @@ -1954,15 +2164,21 @@ dependencies = [ [[package]] name = "cranelift-srcgen" +<<<<<<< HEAD version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d039de901c8d928222b8128e1b9a9ab27b82a7445cb749a871c75d9cb25c57d" +======= +version = "0.124.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12d694cd4c6b28fb8a4d0cf5b58d532b6b3b6e4afb2b65603e2ab8dc35bf18bd" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] @@ -1991,9 +2207,9 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -2010,29 +2226,30 @@ dependencies = [ [[package]] name = "crossbeam-queue" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crossterm" -version = "0.27.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df" +checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" dependencies = [ "bitflags 2.10.0", "crossterm_winapi", - "libc", + "document-features", "parking_lot", + "rustix 1.1.2", "winapi", ] @@ -2047,9 +2264,9 @@ dependencies = [ [[package]] name = "crunchy" -version = "0.2.2" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-bigint" @@ -2075,12 +2292,13 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.4.5" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90eeab0aa92f3f9b4e87f258c72b139c207d251f9cbc1080a0086b86a8870dd3" +checksum = "73736a89c4aff73035ba2ed2e565061954da00d4970fc9ac25dcc85a2a20d790" dependencies = [ - "nix 0.29.0", - "windows-sys 0.59.0", + "dispatch2", + "nix 0.30.1", + "windows-sys 0.61.2", ] [[package]] @@ -2105,12 +2323,22 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.10" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core 0.20.11", + "darling_macro 0.20.11", +] + +[[package]] +name = "darling" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" dependencies = [ - "darling_core 0.20.10", - "darling_macro 0.20.10", + "darling_core 0.21.3", + "darling_macro 0.21.3", ] [[package]] @@ -2129,9 +2357,23 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.11.1", + "syn 2.0.108", +] + +[[package]] +name = "darling_core" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" dependencies = [ "fnv", "ident_case", @@ -2154,51 +2396,72 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ - "darling_core 0.20.10", + "darling_core 0.20.11", "quote", "syn 2.0.108", ] +[[package]] +name = "darling_macro" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +dependencies = [ + "darling_core 0.21.3", + "quote", + "syn 2.0.108", +] + +[[package]] +name = "dary_heap" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06d2e3287df1c007e74221c49ca10a95d557349e54b3a75dc2fb14712c751f04" +dependencies = [ + "serde", +] + [[package]] name = "dbus" -version = "0.9.7" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bb21987b9fb1613058ba3843121dd18b163b254d8a6e797e144cbac14d96d1b" +checksum = "190b6255e8ab55a7b568df5a883e9497edc3e4821c06396612048b430e5ad1e9" dependencies = [ "libc", "libdbus-sys", - "winapi", + "windows-sys 0.59.0", ] [[package]] name = "dbus-secret-service" -version = "4.0.3" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42a16374481d92aed73ae45b1f120207d8e71d24fb89f357fadbd8f946fd84b" +checksum = "708b509edf7889e53d7efb0ffadd994cc6c2345ccb62f55cfd6b0682165e4fa6" dependencies = [ "aes", "block-padding", "cbc", "dbus", - "futures-util", + "fastrand 2.3.0", "hkdf", "num", "once_cell", - "rand 0.8.5", "sha2", + "zeroize", ] [[package]] name = "deadpool" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ed5957ff93768adf7a65ab167a17835c3d2c3c50d084fe305174c112f468e2f" +checksum = "0be2b1d1d6ec8d846f05e137292d0b89133caf95ef33695424c09568bdd39b1b" dependencies = [ "deadpool-runtime", + "lazy_static 1.5.0", "num_cpus", "tokio", ] @@ -2211,7 +2474,7 @@ checksum = "3d697d376cbfa018c23eb4caab1fd1883dd9c906a8c034e8d9a3cb06a7e0bef9" dependencies = [ "async-trait", "deadpool", - "getrandom 0.2.15", + "getrandom 0.2.16", "tokio", "tokio-postgres", "tracing", @@ -2237,9 +2500,9 @@ dependencies = [ [[package]] name = "der" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ "const-oid", "pem-rfc7468", @@ -2248,19 +2511,19 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.11" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" dependencies = [ "powerfmt", - "serde", + "serde_core", ] [[package]] name = "derive_arbitrary" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", @@ -2303,7 +2566,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" dependencies = [ - "darling 0.20.10", + "darling 0.20.11", "proc-macro2", "quote", "syn 2.0.108", @@ -2417,7 +2680,11 @@ checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" dependencies = [ "libc", "option-ext", +<<<<<<< HEAD "redox_users 0.5.0", +======= + "redox_users 0.5.2", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "windows-sys 0.61.2", ] @@ -2432,6 +2699,18 @@ dependencies = [ "winapi", ] +[[package]] +name = "dispatch2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags 2.10.0", + "block2", + "libc", + "objc2", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -2479,23 +2758,26 @@ dependencies = [ "const-random", ] -[[package]] -name = "doc-comment" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" - [[package]] name = "docker_credential" -version = "1.3.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31951f49556e34d90ed28342e1df7e1cb7a229c4cab0aecc627b5d91edd41d07" +checksum = "1d89dfcba45b4afad7450a99b39e751590463e45c04728cf555d36bb66940de8" dependencies = [ "base64 0.21.7", "serde", "serde_json", ] +[[package]] +name = "document-features" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", +] + [[package]] name = "dotenvy" version = "0.15.7" @@ -2510,9 +2792,9 @@ checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "dyn-clone" -version = "1.0.17" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "dyn-stack" @@ -2526,13 +2808,20 @@ dependencies = [ [[package]] name = "dyn-stack" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "490bd48eb68fffcfed519b4edbfd82c69cbe741d175b84f0e0cbe8c57cbe0bdd" +checksum = "1c4713e43e2886ba72b8271aa66c93d722116acf7a75555cce11dcde84388fe8" dependencies = [ "bytemuck", + "dyn-stack-macros", ] +[[package]] +name = "dyn-stack-macros" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d926b4d407d372f141f93bb444696142c29d32962ccbd3531117cf3aa0bfa9" + [[package]] name = "ecdsa" version = "0.16.9" @@ -2549,9 +2838,9 @@ dependencies = [ [[package]] name = "either" -version = "1.13.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "elliptic-curve" @@ -2587,9 +2876,9 @@ checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" [[package]] name = "encode_unicode" -version = "0.3.6" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "encoding_rs" @@ -2626,9 +2915,9 @@ dependencies = [ [[package]] name = "enumflags2" -version = "0.7.10" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" dependencies = [ "enumflags2_derive", "serde", @@ -2636,9 +2925,9 @@ dependencies = [ [[package]] name = "enumflags2_derive" -version = "0.7.10" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" dependencies = [ "proc-macro2", "quote", @@ -2666,18 +2955,18 @@ dependencies = [ [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.11" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -2725,9 +3014,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "5.3.1" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" dependencies = [ "concurrent-queue", "parking", @@ -2736,11 +3025,11 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.2" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ - "event-listener 5.3.1", + "event-listener 5.4.1", "pin-project-lite", ] @@ -2759,6 +3048,25 @@ dependencies = [ "syn 2.0.108", ] +[[package]] +name = "fake-opentelemetry-collector" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce713bed1dfc379216421ebf0c4ee2268b5cb4d7894bed8a96d267834590916" +dependencies = [ + "futures", + "hex", + "opentelemetry", + "opentelemetry-otlp", + "opentelemetry-proto", + "opentelemetry_sdk", + "serde", + "tokio", + "tokio-stream", + "tonic", + "tracing", +] + [[package]] name = "fallible-iterator" version = "0.2.0" @@ -2809,26 +3117,26 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fd-lock" -version = "4.0.2" +version = "4.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e5768da2206272c81ef0b5e951a41862938a6070da63bcea197899942d3b947" +checksum = "0ce92ff622d6dadf7349484f42c93271a0d49b7cc4d466a936405bacbe10aa78" dependencies = [ "cfg-if", - "rustix 0.38.40", - "windows-sys 0.52.0", + "rustix 1.1.2", + "windows-sys 0.59.0", ] [[package]] name = "ff" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" dependencies = [ "rand_core 0.6.4", "subtle", @@ -2846,14 +3154,14 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.25" +version = "0.2.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" +checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" dependencies = [ "cfg-if", "libc", "libredox", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -2870,9 +3178,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.1.0" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" dependencies = [ "crc32fast", "miniz_oxide", @@ -2897,9 +3205,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foldhash" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] name = "foreign-types" @@ -3068,11 +3376,11 @@ dependencies = [ [[package]] name = "futures-lite" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" dependencies = [ - "fastrand 2.2.0", + "fastrand 2.3.0", "futures-core", "futures-io", "parking", @@ -3160,7 +3468,7 @@ version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab96b703d31950f1aeddded248bc95543c9efc7ac9c4a21fda8703a83ee35451" dependencies = [ - "dyn-stack 0.13.0", + "dyn-stack 0.13.2", "gemm-c32 0.18.2", "gemm-c64 0.18.2", "gemm-common 0.18.2", @@ -3170,7 +3478,7 @@ dependencies = [ "num-complex", "num-traits", "paste", - "raw-cpuid 11.5.0", + "raw-cpuid 11.6.0", "seq-macro", ] @@ -3195,12 +3503,12 @@ version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6db9fd9f40421d00eea9dd0770045a5603b8d684654816637732463f4073847" dependencies = [ - "dyn-stack 0.13.0", + "dyn-stack 0.13.2", "gemm-common 0.18.2", "num-complex", "num-traits", "paste", - "raw-cpuid 11.5.0", + "raw-cpuid 11.6.0", "seq-macro", ] @@ -3225,12 +3533,12 @@ version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfcad8a3d35a43758330b635d02edad980c1e143dc2f21e6fd25f9e4eada8edf" dependencies = [ - "dyn-stack 0.13.0", + "dyn-stack 0.13.2", "gemm-common 0.18.2", "num-complex", "num-traits", "paste", - "raw-cpuid 11.5.0", + "raw-cpuid 11.6.0", "seq-macro", ] @@ -3261,15 +3569,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a352d4a69cbe938b9e2a9cb7a3a63b7e72f9349174a2752a558a8a563510d0f3" dependencies = [ "bytemuck", - "dyn-stack 0.13.0", + "dyn-stack 0.13.2", "half", "libm", "num-complex", "num-traits", "once_cell", "paste", - "pulp 0.21.4", - "raw-cpuid 11.5.0", + "pulp 0.21.5", + "raw-cpuid 11.6.0", "rayon", "seq-macro", "sysctl 0.6.0", @@ -3299,14 +3607,14 @@ version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cff95ae3259432f3c3410eaa919033cd03791d81cebd18018393dc147952e109" dependencies = [ - "dyn-stack 0.13.0", + "dyn-stack 0.13.2", "gemm-common 0.18.2", "gemm-f32 0.18.2", "half", "num-complex", "num-traits", "paste", - "raw-cpuid 11.5.0", + "raw-cpuid 11.6.0", "rayon", "seq-macro", ] @@ -3332,12 +3640,12 @@ version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc8d3d4385393304f407392f754cd2dc4b315d05063f62cf09f47b58de276864" dependencies = [ - "dyn-stack 0.13.0", + "dyn-stack 0.13.2", "gemm-common 0.18.2", "num-complex", "num-traits", "paste", - "raw-cpuid 11.5.0", + "raw-cpuid 11.6.0", "seq-macro", ] @@ -3362,34 +3670,20 @@ version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35b2a4f76ce4b8b16eadc11ccf2e083252d8237c1b589558a49b0183545015bd" dependencies = [ - "dyn-stack 0.13.0", + "dyn-stack 0.13.2", "gemm-common 0.18.2", "num-complex", "num-traits", "paste", - "raw-cpuid 11.5.0", + "raw-cpuid 11.6.0", "seq-macro", ] -[[package]] -name = "generator" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d18470a76cb7f8ff746cf1f7470914f900252ec36bbc40b569d74b1258446827" -dependencies = [ - "cc", - "cfg-if", - "libc", - "log", - "rustversion", - "windows", -] - [[package]] name = "generic-array" -version = "0.14.7" +version = "0.14.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" dependencies = [ "typenum", "version_check", @@ -3409,34 +3703,36 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", + "js-sys", "libc", "r-efi", - "wasi 0.14.2+wasi-0.2.4", + "wasip2", + "wasm-bindgen", ] [[package]] name = "getset" -version = "0.1.3" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f636605b743120a8d32ed92fc27b6cde1a769f8f936c065151eb66f88ded513c" +checksum = "9cf0fc11e47561d47397154977bc219f4cf809b2974facc3ccb3b89e2436f912" dependencies = [ "proc-macro-error2", "proc-macro2", @@ -3446,14 +3742,17 @@ dependencies = [ [[package]] name = "gimli" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" +<<<<<<< HEAD checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "gimli" version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" +======= +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" dependencies = [ "fallible-iterator 0.3.0", @@ -3472,7 +3771,7 @@ dependencies = [ "gix-utils", "itoa", "thiserror 2.0.17", - "winnow 0.7.13", + "winnow", ] [[package]] @@ -3493,7 +3792,7 @@ dependencies = [ "smallvec", "thiserror 2.0.17", "unicode-bom", - "winnow 0.7.13", + "winnow", ] [[package]] @@ -3543,7 +3842,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67a0637149b4ef24d3ea55f81f77231401c8463fae6da27331c987957eb597c7" dependencies = [ "bstr", - "fastrand 2.2.0", + "fastrand 2.3.0", "gix-features", "gix-path", "gix-utils", @@ -3614,7 +3913,7 @@ dependencies = [ "itoa", "smallvec", "thiserror 2.0.17", - "winnow 0.7.13", + "winnow", ] [[package]] @@ -3648,7 +3947,7 @@ dependencies = [ "gix-validate", "memmap2", "thiserror 2.0.17", - "winnow 0.7.13", + "winnow", ] [[package]] @@ -3688,7 +3987,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "befcdbdfb1238d2854591f760a48711bed85e72d80a10e8f2f93f656746ef7c5" dependencies = [ - "fastrand 2.2.0", + "fastrand 2.3.0", "unicode-normalization", ] @@ -3704,15 +4003,15 @@ dependencies = [ [[package]] name = "glob" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "globset" -version = "0.4.15" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15f1ce686646e7f1e19bf7d5533fe443a45dbfb990e00629110797578b42fb19" +checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3" dependencies = [ "aho-corasick", "bstr", @@ -3721,6 +4020,18 @@ dependencies = [ "regex-syntax", ] +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + [[package]] name = "group" version = "0.13.0" @@ -3734,9 +4045,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" dependencies = [ "bytes", "fnv", @@ -3753,9 +4064,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.6" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" dependencies = [ "atomic-waker", "bytes", @@ -3772,16 +4083,17 @@ dependencies = [ [[package]] name = "half" -version = "2.6.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" dependencies = [ "bytemuck", "cfg-if", "crunchy", "num-traits", - "rand 0.9.1", + "rand 0.9.2", "rand_distr", + "zerocopy", ] [[package]] @@ -3808,15 +4120,15 @@ version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ - "ahash 0.8.11", + "ahash 0.8.12", "allocator-api2", ] [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ "allocator-api2", "equivalent", @@ -3845,7 +4157,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" dependencies = [ - "hashbrown 0.15.2", + "hashbrown 0.15.5", ] [[package]] @@ -3890,15 +4202,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "hermit-abi" -version = "0.4.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "hex" @@ -3926,11 +4232,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.9" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -4020,9 +4326,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.5" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" @@ -4032,28 +4338,28 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "humantime" -version = "2.1.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" [[package]] name = "hyper" -version = "0.14.31" +version = "0.14.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" dependencies = [ "bytes", "futures-channel", "futures-core", "futures-util", - "h2 0.3.26", + "h2 0.3.27", "http 0.2.12", "http-body 0.4.6", "httparse", "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.7", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -4062,15 +4368,25 @@ dependencies = [ [[package]] name = "hyper" +<<<<<<< HEAD version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +======= +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "atomic-waker", "bytes", "futures-channel", "futures-core", +<<<<<<< HEAD "h2 0.4.6", +======= + "h2 0.4.12", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "http 1.3.1", "http-body 1.0.1", "httparse", @@ -4091,7 +4407,7 @@ checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", "http 0.2.12", - "hyper 0.14.31", + "hyper 0.14.32", "log", "rustls 0.21.12", "rustls-native-certs 0.6.3", @@ -4107,32 +4423,37 @@ checksum = "399c78f9338483cb7e630c8474b07268983c6bd5acee012e4211f9f7bb21b070" dependencies = [ "futures-util", "http 0.2.12", - "hyper 0.14.31", + "hyper 0.14.32", "log", "rustls 0.22.4", "rustls-native-certs 0.7.3", "rustls-pki-types", "tokio", "tokio-rustls 0.25.0", - "webpki-roots", + "webpki-roots 0.26.11", ] [[package]] name = "hyper-rustls" -version = "0.27.3" +version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ +<<<<<<< HEAD "futures-util", "http 1.3.1", "hyper 1.8.1", +======= + "http 1.3.1", + "hyper 1.7.0", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "hyper-util", - "rustls 0.23.18", + "rustls 0.23.34", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.0", + "tokio-rustls 0.26.4", "tower-service", - "webpki-roots", + "webpki-roots 1.0.4", ] [[package]] @@ -4141,7 +4462,11 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ +<<<<<<< HEAD "hyper 1.8.1", +======= + "hyper 1.7.0", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "hyper-util", "pin-project-lite", "tokio", @@ -4155,7 +4480,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper 0.14.31", + "hyper 0.14.32", "native-tls", "tokio", "tokio-native-tls", @@ -4169,7 +4494,11 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", +<<<<<<< HEAD "hyper 1.8.1", +======= + "hyper 1.7.0", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "hyper-util", "native-tls", "tokio", @@ -4179,35 +4508,47 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" dependencies = [ + "base64 0.22.1", "bytes", "futures-channel", + "futures-core", "futures-util", "http 1.3.1", "http-body 1.0.1", +<<<<<<< HEAD "hyper 1.8.1", +======= + "hyper 1.7.0", + "ipnet", + "libc", + "percent-encoding", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "pin-project-lite", - "socket2 0.5.7", + "socket2 0.6.1", + "system-configuration 0.6.1", "tokio", "tower-service", "tracing", + "windows-registry", ] [[package]] name = "iana-time-zone" -version = "0.1.61" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", - "windows-core 0.52.0", + "windows-core 0.62.2", ] [[package]] @@ -4221,21 +4562,22 @@ dependencies = [ [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" dependencies = [ "displaydoc", - "yoke", + "potential_utf", + "yoke 0.8.1", "zerofrom", "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale_core" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" dependencies = [ "displaydoc", "litemap", @@ -4244,99 +4586,61 @@ dependencies = [ "zerovec", ] -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" - [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" dependencies = [ - "displaydoc", "icu_collections", "icu_normalizer_data", "icu_properties", "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" dependencies = [ - "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" +checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr", + "icu_locale_core", "writeable", - "yoke", + "yoke 0.8.1", "zerofrom", + "zerotrie", "zerovec", ] -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.108", -] - [[package]] name = "id-arena" version = "2.2.1" @@ -4362,9 +4666,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", @@ -4372,9 +4676,9 @@ dependencies = [ [[package]] name = "ignore" -version = "0.4.23" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b" +checksum = "d3d782a365a015e0f5c04902246139249abf769125006fbe7649e2ee88169b4a" dependencies = [ "crossbeam-deque", "globset", @@ -4444,14 +4748,14 @@ dependencies = [ [[package]] name = "indicatif" -version = "0.17.9" +version = "0.17.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf675b85ed934d3c67b5c5469701eec7db22689d0a2139d856e0925fa28b281" +checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" dependencies = [ "console", "number_prefix", "portable-atomic", - "unicode-width 0.2.0", + "unicode-width 0.2.2", "web-time", ] @@ -4483,9 +4787,9 @@ dependencies = [ [[package]] name = "inout" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ "block-padding", "generic-array", @@ -4502,19 +4806,19 @@ dependencies = [ [[package]] name = "io-extras" -version = "0.18.3" +version = "0.18.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d45fd7584f9b67ac37bc041212d06bfac0700b36456b05890d36a3b626260eb" +checksum = "2285ddfe3054097ef4b2fe909ef8c3bcd1ea52a8f0d274416caebeef39f04a65" dependencies = [ "io-lifetimes", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "io-lifetimes" -version = "2.0.3" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a611371471e98973dbcab4e0ec66c31a10bc356eeb4d54a0e05eac8158fe38c" +checksum = "06432fb54d3be7964ecd3649233cddf80db2832f47fec34c01f65b3d9d774983" [[package]] name = "ip_network" @@ -4540,26 +4844,36 @@ checksum = "8e537132deb99c0eb4b752f0346b6a836200eaaa3516dd7e5514b63930a09e5d" [[package]] name = "ipnet" -version = "2.10.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] [[package]] name = "is-terminal" -version = "0.4.13" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" +checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ - "hermit-abi 0.4.0", + "hermit-abi 0.5.2", "libc", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] name = "is_terminal_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itertools" @@ -4579,15 +4893,6 @@ dependencies = [ "either", ] -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.14.0" @@ -4599,9 +4904,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "ittapi" @@ -4666,19 +4971,21 @@ dependencies = [ [[package]] name = "jobserver" -version = "0.1.32" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ + "getrandom 0.3.4", "libc", ] [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -4733,9 +5040,9 @@ dependencies = [ [[package]] name = "keyring" -version = "3.6.2" +version = "3.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1961983669d57bdfe6c0f3ef8e4c229b5ef751afcc7d87e4271d2f71f6ccfa8b" +checksum = "eebcc3aff044e5944a8fbaf69eb277d11986064cba30c468730e8b9909fb551c" dependencies = [ "byteorder", "dbus-secret-service", @@ -4743,9 +5050,10 @@ dependencies = [ "log", "secret-service", "security-framework 2.11.1", - "security-framework 3.2.0", - "windows-sys 0.59.0", + "security-framework 3.5.1", + "windows-sys 0.60.2", "zbus", + "zeroize", ] [[package]] @@ -4778,6 +5086,15 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "kv-log-macro" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +dependencies = [ + "log", +] + [[package]] name = "lazy_static" version = "0.2.11" @@ -4816,9 +5133,9 @@ checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libdbus-sys" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06085512b750d640299b79be4bad3d2fa90a9c00b1fd9e1b46364f66f0485c72" +checksum = "5cbe856efeb50e4681f010e9aaa2bf0a644e10139e54cde10fc83a307c23bd9f" dependencies = [ "pkg-config", ] @@ -4845,12 +5162,12 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.5" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-link 0.2.1", ] [[package]] @@ -4861,9 +5178,9 @@ checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libredox" -version = "0.1.3" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ "bitflags 2.10.0", "libc", @@ -4884,7 +5201,7 @@ dependencies = [ "fallible-iterator 0.3.0", "futures", "http 0.2.12", - "hyper 0.14.31", + "hyper 0.14.32", "hyper-rustls 0.25.0", "libsql-hrana", "libsql-sqlite3-parser", @@ -4921,9 +5238,9 @@ dependencies = [ "indexmap 2.12.0", "log", "memchr", - "phf", + "phf 0.11.3", "phf_codegen", - "phf_shared", + "phf_shared 0.11.3", "uncased", ] @@ -4944,7 +5261,7 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc0bda45ed5b3a2904262c1bb91e526127aa70e7ef3758aba2ef93cf896b9b58" dependencies = [ - "clap 4.5.20", + "clap 4.5.51", "escape8259", "termcolor", "threadpool", @@ -4962,9 +5279,9 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "linux-raw-sys" @@ -4974,11 +5291,10 @@ checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "liquid" -version = "0.26.9" +version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cdcc72b82748f47c2933c172313f5a9aea5b2c4eb3fa4c66b4ea55bb60bb4b1" +checksum = "2a494c3f9dad3cb7ed16f1c51812cbe4b29493d6c2e5cd1e2b87477263d9534d" dependencies = [ - "doc-comment", "liquid-core", "liquid-derive", "liquid-lib", @@ -4987,15 +5303,14 @@ dependencies = [ [[package]] name = "liquid-core" -version = "0.26.9" +version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2752e978ffc53670f3f2e8b3ef09f348d6f7b5474a3be3f8a5befe5382e4effb" +checksum = "fc623edee8a618b4543e8e8505584f4847a4e51b805db1af6d9af0a3395d0d57" dependencies = [ "anymap2", - "itertools 0.13.0", + "itertools 0.14.0", "kstring", "liquid-derive", - "num-traits", "pest", "pest_derive", "regex", @@ -5005,9 +5320,9 @@ dependencies = [ [[package]] name = "liquid-derive" -version = "0.26.8" +version = "0.26.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b51f1d220e3fa869e24cfd75915efe3164bd09bb11b3165db3f37f57bf673e3" +checksum = "de66c928222984aea59fcaed8ba627f388aaac3c1f57dcb05cc25495ef8faefe" dependencies = [ "proc-macro2", "quote", @@ -5016,13 +5331,12 @@ dependencies = [ [[package]] name = "liquid-lib" -version = "0.26.9" +version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b1a298d3d2287ee5b1e43840d885b8fdfc37d3f4e90d82aacfd04d021618da" +checksum = "9befeedd61f5995bc128c571db65300aeb50d62e4f0542c88282dbcb5f72372a" dependencies = [ - "itertools 0.13.0", + "itertools 0.14.0", "liquid-core", - "once_cell", "percent-encoding", "regex", "time", @@ -5031,17 +5345,22 @@ dependencies = [ [[package]] name = "litemap" -version = "0.7.3" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + +[[package]] +name = "litrs" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] @@ -5050,21 +5369,27 @@ name = "log" version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +<<<<<<< HEAD +======= +dependencies = [ + "value-bag", +] +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) [[package]] name = "logos" -version = "0.14.2" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c6b6e02facda28ca5fb8dbe4b152496ba3b1bd5a4b40bb2b1b2d8ad74e0f39b" +checksum = "7251356ef8cb7aec833ddf598c6cb24d17b689d20b993f9d11a3d764e34e6458" dependencies = [ "logos-derive", ] [[package]] name = "logos-codegen" -version = "0.14.2" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b32eb6b5f26efacd015b000bfc562186472cd9b34bdba3f6b264e2a052676d10" +checksum = "59f80069600c0d66734f5ff52cc42f2dabd6b29d205f333d61fd7832e9e9963f" dependencies = [ "beef", "fnv", @@ -5077,49 +5402,42 @@ dependencies = [ [[package]] name = "logos-derive" -version = "0.14.2" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e5d0c5463c911ef55624739fc353238b4e310f0144be1f875dc42fec6bfd5ec" +checksum = "24fb722b06a9dc12adb0963ed585f19fc61dc5413e6a9be9422ef92c091e731d" dependencies = [ "logos-codegen", ] -[[package]] -name = "loom" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" -dependencies = [ - "cfg-if", - "generator", - "scoped-tls", - "tracing", - "tracing-subscriber", -] - [[package]] name = "lru" version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.15.2", + "hashbrown 0.15.5", ] +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + [[package]] name = "mach2" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" +checksum = "d640282b302c0bb0a2a8e0233ead9035e3bed871f0b7e81fe4a1ec829765db44" dependencies = [ "libc", ] [[package]] name = "macro_rules_attribute" -version = "0.2.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a82271f7bc033d84bbca59a3ce3e4159938cb08a9c3aebbe54d215131518a13" +checksum = "65049d7923698040cd0b1ddcced9b0eb14dd22c5f86ae59c3740eab64a676520" dependencies = [ "macro_rules_attribute-proc_macro", "paste", @@ -5127,9 +5445,9 @@ dependencies = [ [[package]] name = "macro_rules_attribute-proc_macro" -version = "0.2.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8dd856d451cc0da70e2ef2ce95a18e39a93b7558bedf10201ad28503f918568" +checksum = "670fdfda89751bc4a84ac13eaa63e205cf0fd22b4c9a5fbfa085b63c1f1d3a30" [[package]] name = "malloc_buf" @@ -5173,9 +5491,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "memfd" @@ -5188,9 +5506,9 @@ dependencies = [ [[package]] name = "memmap2" -version = "0.9.5" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" +checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490" dependencies = [ "libc", "stable_deref_trait", @@ -5237,21 +5555,20 @@ dependencies = [ [[package]] name = "miette" -version = "7.2.0" +version = "7.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4edc8853320c2a0dab800fbda86253c8938f6ea88510dc92c5f1ed20e794afc1" +checksum = "5f98efec8807c63c752b5bd61f862c165c115b0a35685bdcfd9238c7aeb592b7" dependencies = [ "cfg-if", "miette-derive", - "thiserror 1.0.69", "unicode-width 0.1.14", ] [[package]] name = "miette-derive" -version = "7.2.0" +version = "7.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf09caffaac8068c346b6df2a7fc27a177fd20b39421a39ce0a211bde679a6c" +checksum = "db5b29714e950dbb20d5e6f74f9dcec4edbcc1067bb7f8ed198c097b8c1a818b" dependencies = [ "proc-macro2", "quote", @@ -5272,59 +5589,60 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.5" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", + "simd-adler32", ] [[package]] name = "mio" -version = "1.0.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" dependencies = [ "libc", "log", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.59.0", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.61.2", ] [[package]] name = "moka" -version = "0.12.10" +version = "0.12.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9321642ca94a4282428e6ea4af8cc2ca4eac48ac7a6a4ea8f33f76d0ce70926" +checksum = "8261cd88c312e0004c1d51baad2980c66528dfdb2bee62003e643a4d8f86b077" dependencies = [ "crossbeam-channel", "crossbeam-epoch", "crossbeam-utils", - "loom", + "equivalent", "parking_lot", "portable-atomic", "rustc_version", "smallvec", "tagptr", - "thiserror 1.0.69", "uuid", ] [[package]] name = "monostate" -version = "0.1.13" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d208407d7552cd041d8cdb69a1bc3303e029c598738177a3d87082004dc0e1e" +checksum = "3341a273f6c9d5bef1908f17b7267bbab0e95c9bf69a0d4dcf8e9e1b2c76ef67" dependencies = [ "monostate-impl", "serde", + "serde_core", ] [[package]] name = "monostate-impl" -version = "0.1.13" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7ce64b975ed4f123575d11afd9491f2e37bbd5813fbfbc0f09ae1fbddea74e0" +checksum = "e4db6d5580af57bf992f59068d4ea26fd518574ff48d7639b255a36f9de6e7e9" dependencies = [ "proc-macro2", "quote", @@ -5333,9 +5651,9 @@ dependencies = [ [[package]] name = "multimap" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" +checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" [[package]] name = "mysql_async" @@ -5359,7 +5677,7 @@ dependencies = [ "rand 0.8.5", "serde", "serde_json", - "socket2 0.5.7", + "socket2 0.5.10", "thiserror 2.0.17", "tokio", "tokio-native-tls", @@ -5401,9 +5719,9 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" dependencies = [ "libc", "log", @@ -5485,11 +5803,11 @@ checksum = "f5438dd2b2ff4c6df6e1ce22d825ed2fa93ee2922235cc45186991717f0a892d" [[package]] name = "normpath" -version = "1.3.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8911957c4b1549ac0dc74e30db9c8b0e66ddcd6d7acc33098f4c63a64a6d7ed" +checksum = "bf23ab2b905654b4cb177e30b629937b3868311d4e1cba859f899c041046e69b" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -5608,28 +5926,29 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ - "hermit-abi 0.3.9", + "hermit-abi 0.5.2", "libc", ] [[package]] name = "num_enum" -version = "0.7.3" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" dependencies = [ "num_enum_derive", + "rustversion", ] [[package]] name = "num_enum_derive" -version = "0.7.3" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -5660,7 +5979,7 @@ checksum = "c38841cdd844847e3e7c8d29cef9dcfed8877f8f56f9071f77843ecf3baf937f" dependencies = [ "base64 0.13.1", "chrono", - "getrandom 0.2.15", + "getrandom 0.2.16", "http 0.2.12", "rand 0.8.5", "serde", @@ -5682,21 +6001,27 @@ dependencies = [ ] [[package]] -name = "objc_exception" -version = "0.1.2" +name = "objc2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" dependencies = [ - "cc", + "objc2-encode", ] [[package]] -name = "object" -version = "0.36.5" +name = "objc2-encode" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc_exception" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" dependencies = [ - "memchr", + "cc", ] [[package]] @@ -5706,7 +6031,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" dependencies = [ "crc32fast", - "hashbrown 0.15.2", + "hashbrown 0.15.5", "indexmap 2.12.0", "memchr", ] @@ -5727,7 +6052,7 @@ dependencies = [ "oci-spec", "olpc-cjson", "regex", - "reqwest 0.12.9", + "reqwest 0.12.24", "serde", "serde_json", "sha2", @@ -5751,7 +6076,7 @@ dependencies = [ "lazy_static 1.5.0", "olpc-cjson", "regex", - "reqwest 0.12.9", + "reqwest 0.12.24", "serde", "serde_json", "sha2", @@ -5775,7 +6100,7 @@ dependencies = [ "lazy_static 1.5.0", "olpc-cjson", "regex", - "reqwest 0.12.9", + "reqwest 0.12.24", "serde", "serde_json", "sha2", @@ -5835,6 +6160,12 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + [[package]] name = "onig" version = "6.5.1" @@ -5885,9 +6216,9 @@ dependencies = [ [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" @@ -5937,7 +6268,7 @@ dependencies = [ "bytes", "http 1.3.1", "opentelemetry", - "reqwest 0.12.9", + "reqwest 0.12.24", "tracing", ] @@ -5954,12 +6285,11 @@ dependencies = [ "opentelemetry-http", "opentelemetry-proto", "opentelemetry_sdk", - "prost 0.13.3", - "reqwest 0.12.9", + "prost 0.13.5", + "reqwest 0.12.24", "thiserror 2.0.17", "tokio", "tonic", - "tracing", ] [[package]] @@ -5970,7 +6300,7 @@ checksum = "56f8870d3024727e99212eb3bb1762ec16e255e3e6f58eeb3dc8db1aa226746d" dependencies = [ "opentelemetry", "opentelemetry_sdk", - "prost 0.13.3", + "prost 0.13.5", "tonic", ] @@ -5980,6 +6310,7 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84dfad6042089c7fc1f6118b7040dc2eb4ab520abbf410b79dc481032af39570" dependencies = [ + "async-std", "async-trait", "futures-channel", "futures-executor", @@ -6038,9 +6369,9 @@ checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" [[package]] name = "outref" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4030760ffd992bef45b0ae3f10ce1aba99e33464c90d14dd7c039884963ddc7a" +checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" [[package]] name = "p256" @@ -6062,9 +6393,9 @@ checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -6072,15 +6403,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-link 0.2.1", ] [[package]] @@ -6109,9 +6440,9 @@ dependencies = [ [[package]] name = "pathdiff" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c5ce1153ab5b689d0c074c4e7fc613e942dfb7dd9eea5ab202d2ad91fe361" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" [[package]] name = "pbjson" @@ -6152,12 +6483,12 @@ dependencies = [ [[package]] name = "pem" -version = "3.0.4" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" +checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" dependencies = [ "base64 0.22.1", - "serde", + "serde_core", ] [[package]] @@ -6177,20 +6508,19 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.7.14" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442" +checksum = "989e7521a040efde50c3ab6bbadafbe15ab6dc042686926be59ac35d74607df4" dependencies = [ "memchr", - "thiserror 1.0.69", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.7.14" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d214365f632b123a47fd913301e14c946c61d1c183ee245fa76eb752e59a02dd" +checksum = "187da9a3030dbafabbbfb20cb323b976dc7b7ce91fcd84f2f74d6e31d378e2de" dependencies = [ "pest", "pest_generator", @@ -6198,9 +6528,9 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.14" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb55586734301717aea2ac313f50b2eb8f60d2fc3dc01d190eefa2e625f60c4e" +checksum = "49b401d98f5757ebe97a26085998d6c0eecec4995cad6ab7fc30ffdf4b052843" dependencies = [ "pest", "pest_meta", @@ -6211,11 +6541,10 @@ dependencies = [ [[package]] name = "pest_meta" -version = "2.7.14" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b75da2a70cf4d9cb76833c990ac9cd3923c9a8905a8929789ce347c84564d03d" +checksum = "72f27a2cfee9f9039c4d86faa5af122a0ac3851441a34865b8a043b46be0065a" dependencies = [ - "once_cell", "pest", "sha2", ] @@ -6232,57 +6561,76 @@ dependencies = [ [[package]] name = "phf" -version = "0.11.2" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_shared 0.11.3", +] + +[[package]] +name = "phf" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" dependencies = [ - "phf_shared", + "phf_shared 0.13.1", + "serde", ] [[package]] name = "phf_codegen" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" dependencies = [ "phf_generator", - "phf_shared", + "phf_shared 0.11.3", ] [[package]] name = "phf_generator" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ - "phf_shared", + "phf_shared 0.11.3", "rand 0.8.5", ] [[package]] name = "phf_shared" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" dependencies = [ "siphasher", "uncased", ] +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher", +] + [[package]] name = "pin-project" -version = "1.1.7" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.7" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", @@ -6308,7 +6656,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" dependencies = [ "atomic-waker", - "fastrand 2.2.0", + "fastrand 2.3.0", "futures-io", ] @@ -6324,23 +6672,22 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "polling" -version = "3.7.4" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" dependencies = [ "cfg-if", "concurrent-queue", - "hermit-abi 0.4.0", + "hermit-abi 0.5.2", "pin-project-lite", - "rustix 0.38.40", - "tracing", - "windows-sys 0.59.0", + "rustix 1.1.2", + "windows-sys 0.61.2", ] [[package]] @@ -6372,11 +6719,10 @@ dependencies = [ [[package]] name = "postgres-native-tls" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d442770e2b1e244bb5eb03b31c79b65bb2568f413b899eaba850fa945a65954" +checksum = "ac73153d92e4bde922bd6f1dfba7f1ab8132266c031153b55e20a1521cd36d49" dependencies = [ - "futures", "native-tls", "tokio", "tokio-native-tls", @@ -6385,9 +6731,9 @@ dependencies = [ [[package]] name = "postgres-protocol" -version = "0.6.7" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acda0ebdebc28befa84bee35e651e4c5f09073d668c7aed4cf7e23c3cda84b23" +checksum = "fbef655056b916eb868048276cfd5d6a7dea4f81560dfd047f97c8c6fe3fcfd4" dependencies = [ "base64 0.22.1", "byteorder", @@ -6396,22 +6742,22 @@ dependencies = [ "hmac", "md-5", "memchr", - "rand 0.8.5", + "rand 0.9.2", "sha2", "stringprep", ] [[package]] name = "postgres-types" -version = "0.2.8" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f66ea23a2d0e5734297357705193335e0a957696f34bed2f2faefacb2fec336f" +checksum = "ef4605b7c057056dd35baeb6ac0c0338e4975b1f2bef0f65da953285eb007095" dependencies = [ "bytes", "chrono", "fallible-iterator 0.2.0", "postgres-protocol", - "serde", + "serde_core", "serde_json", "uuid", ] @@ -6426,6 +6772,15 @@ dependencies = [ "postgres-types", ] +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -6434,9 +6789,9 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ "zerocopy", ] @@ -6453,9 +6808,9 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.25" +version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", "syn 2.0.108", @@ -6472,11 +6827,11 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.2.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ - "toml_edit", + "toml_edit 0.23.7", ] [[package]] @@ -6581,12 +6936,12 @@ dependencies = [ [[package]] name = "prost" -version = "0.13.3" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0487d90e047de87f984913713b85c601c05609aad5b0df4b4573fbf69aa13f" +checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" dependencies = [ "bytes", - "prost-derive 0.13.3", + "prost-derive 0.13.5", ] [[package]] @@ -6625,12 +6980,12 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.13.3" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9552f850d5f0964a4e4d0bf306459ac29323ddfbae05e35a7c0d35cb0803cc5" +checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" dependencies = [ "anyhow", - "itertools 0.13.0", + "itertools 0.14.0", "proc-macro2", "quote", "syn 2.0.108", @@ -6722,9 +7077,15 @@ dependencies = [ [[package]] name = "pulley-interpreter" +<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a09eb45f768f3a0396e85822790d867000c8b5f11551e7268c279e991457b16" +======= +version = "37.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cff3cc2c3a933419d4989b9dcdee724ebc9ee4cdc1f175dbaeef71d3b963336" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "cranelift-bitset", "log", @@ -6734,9 +7095,15 @@ dependencies = [ [[package]] name = "pulley-macros" +<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e29368432b8b7a8a343b75a6914621fad905c95d5c5297449a6546c127224f7a" +======= +version = "37.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56fca4a86a359a71f35f188de13bdfa9dc5b56a36d236fa98cb0db601ef4d21" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "proc-macro2", "quote", @@ -6757,9 +7124,9 @@ dependencies = [ [[package]] name = "pulp" -version = "0.21.4" +version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95fb7a99b37aaef4c7dd2fd15a819eb8010bfc7a2c2155230d51f497316cad6d" +checksum = "96b86df24f0a7ddd5e4b95c94fc9ed8a98f1ca94d3b01bdce2824097e7835907" dependencies = [ "bytemuck", "cfg-if", @@ -6771,51 +7138,57 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.5" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" dependencies = [ "bytes", + "cfg_aliases", "pin-project-lite", "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.18", - "socket2 0.5.7", - "thiserror 1.0.69", + "rustls 0.23.34", + "socket2 0.6.1", + "thiserror 2.0.17", "tokio", "tracing", + "web-time", ] [[package]] name = "quinn-proto" -version = "0.11.8" +version = "0.11.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ "bytes", - "rand 0.8.5", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.2", "ring", "rustc-hash", - "rustls 0.23.18", + "rustls 0.23.34", + "rustls-pki-types", "slab", - "thiserror 1.0.69", + "thiserror 2.0.17", "tinyvec", "tracing", + "web-time", ] [[package]] name = "quinn-udp" -version = "0.5.7" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5a626c6807713b15cac82a6acaccd6043c9a5408c24baae07611fec3f243da" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.5.7", + "socket2 0.6.1", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -6829,9 +7202,9 @@ dependencies = [ [[package]] name = "r-efi" -version = "5.2.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "radium" @@ -6875,9 +7248,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", @@ -6928,7 +7301,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", ] [[package]] @@ -6937,7 +7310,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.2", + "getrandom 0.3.4", ] [[package]] @@ -6947,7 +7320,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463" dependencies = [ "num-traits", - "rand 0.9.1", + "rand 0.9.2", ] [[package]] @@ -6979,18 +7352,18 @@ dependencies = [ [[package]] name = "raw-cpuid" -version = "11.5.0" +version = "11.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6df7ab838ed27997ba19a4664507e6f82b41fe6e20be42929332156e5e85146" +checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" dependencies = [ "bitflags 2.10.0", ] [[package]] name = "rayon" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" dependencies = [ "either", "rayon-core", @@ -6998,20 +7371,20 @@ dependencies = [ [[package]] name = "rayon-cond" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "059f538b55efd2309c9794130bc149c6a553db90e9d99c2030785c82f0bd7df9" +checksum = "2964d0cf57a3e7a06e8183d14a8b527195c706b7983549cd5462d5aa3747438f" dependencies = [ "either", - "itertools 0.11.0", + "itertools 0.14.0", "rayon", ] [[package]] name = "rayon-core" -version = "1.12.1" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -7025,9 +7398,9 @@ checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430" [[package]] name = "redis" -version = "0.32.5" +version = "0.32.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd3650deebc68526b304898b192fa4102a4ef0b9ada24da096559cb60e0eef8" +checksum = "014cc767fefab6a3e798ca45112bccad9c6e0e218fbd49720042716c73cfef44" dependencies = [ "arc-swap", "backon", @@ -7043,7 +7416,7 @@ dependencies = [ "pin-project-lite", "ryu", "sha1_smol", - "socket2 0.6.0", + "socket2 0.6.1", "tokio", "tokio-native-tls", "tokio-util", @@ -7052,9 +7425,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.7" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ "bitflags 2.10.0", ] @@ -7065,31 +7438,58 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "libredox", "thiserror 1.0.69", ] [[package]] name = "redox_users" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "libredox", "thiserror 2.0.17", ] [[package]] +<<<<<<< HEAD name = "regalloc2" version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e249c660440317032a71ddac302f25f1d5dff387667bcc3978d1f77aa31ac34" +======= +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", +] + +[[package]] +name = "regalloc2" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efd8138ce7c3d7c13be4f61893154b5d711bd798d2d7be3ecb8dcc7e7a06ca98" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "allocator-api2", "bumpalo", - "hashbrown 0.15.2", + "hashbrown 0.15.5", "log", "rustc-hash", "smallvec", @@ -7097,9 +7497,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.1" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", @@ -7109,9 +7509,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", @@ -7120,15 +7520,15 @@ dependencies = [ [[package]] name = "regex-lite" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" +checksum = "8d942b98df5e658f56f20d592c7f868833fe38115e65c33003d8cd224b0155da" [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "rend" @@ -7150,10 +7550,10 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2 0.3.26", + "h2 0.3.27", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.31", + "hyper 0.14.32", "hyper-tls 0.5.0", "ipnet", "js-sys", @@ -7183,9 +7583,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.9" +version = "0.12.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" +checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" dependencies = [ "async-compression", "base64 0.22.1", @@ -7194,44 +7594,49 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", +<<<<<<< HEAD "h2 0.4.6", "http 1.3.1", "http-body 1.0.1", "http-body-util", "hyper 1.8.1", "hyper-rustls 0.27.3", +======= + "h2 0.4.12", + "http 1.3.1", + "http-body 1.0.1", + "http-body-util", + "hyper 1.7.0", + "hyper-rustls 0.27.7", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "hyper-tls 0.6.0", "hyper-util", - "ipnet", "js-sys", "log", "mime", "native-tls", - "once_cell", "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.18", - "rustls-pemfile 2.2.0", + "rustls 0.23.34", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 1.0.1", - "system-configuration 0.6.1", + "sync_wrapper 1.0.2", "tokio", "tokio-native-tls", - "tokio-rustls 0.26.0", - "tokio-socks", + "tokio-rustls 0.26.4", "tokio-util", + "tower 0.5.2", + "tower-http", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots", - "windows-registry", + "webpki-roots 1.0.4", ] [[package]] @@ -7252,7 +7657,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.15", + "getrandom 0.2.16", "libc", "untrusted", "windows-sys 0.52.0", @@ -7317,23 +7722,23 @@ dependencies = [ [[package]] name = "rpassword" -version = "7.3.1" +version = "7.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80472be3c897911d0137b2d2b9055faf6eeac5b14e324073d83bc17b191d7e3f" +checksum = "66d4c8b64f049c6721ec8ccec37ddfc3d641c4a7fca57e8f2a89de509c73df39" dependencies = [ "libc", "rtoolbox", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] name = "rtoolbox" -version = "0.0.2" +version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c247d24e63230cdb56463ae328478bd5eac8b8faa8c69461a77e8e323afac90e" +checksum = "a7cc970b249fbe527d6e02e0a227762c9108b2f49d81094fe357ffc6d14d7f6f" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -7393,9 +7798,9 @@ dependencies = [ [[package]] name = "rust_decimal" -version = "1.37.2" +version = "1.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b203a6425500a03e0919c42d3c47caca51e79f1132046626d2c8871c5092035d" +checksum = "35affe401787a9bd846712274d97654355d21b2a2c092a3139aabe31e9022282" dependencies = [ "arrayvec", "borsh", @@ -7410,9 +7815,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "rustc-hash" @@ -7431,15 +7836,19 @@ dependencies = [ [[package]] name = "rustify" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d375f36613139ffb8d55ead633a4904c74ffa1279cbdd2b96a037184cb56d932" +checksum = "759a090a17ce545d1adcffcc48207d5136c8984d8153bd8247b1ad4a71e49f5f" dependencies = [ "anyhow", "async-trait", "bytes", "http 1.3.1", +<<<<<<< HEAD "reqwest 0.12.9", +======= + "reqwest 0.12.24", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "rustify_derive", "serde", "serde_json", @@ -7451,9 +7860,9 @@ dependencies = [ [[package]] name = "rustify_derive" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7345f32672da54338227b727bd578c897859ddfaad8952e0b0d787fb4e58f07d" +checksum = "f07d43b2dbdbd99aaed648192098f0f413b762f0f352667153934ef3955f1793" dependencies = [ "proc-macro2", "quote", @@ -7465,15 +7874,15 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.40" +version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99e4ea3e1cdc4b559b8e5650f9c8e5998e3e5c1343b4eaf034565f32318d63c0" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ "bitflags 2.10.0", "errno", "libc", - "linux-raw-sys 0.4.14", - "windows-sys 0.52.0", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", ] [[package]] @@ -7527,15 +7936,15 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.18" +version = "0.23.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9cc1d47e243d655ace55ed38201c19ae02c148ae56412ab8750e8f0166ab7f" +checksum = "6a9586e9ee2b4f8fab52a0048ca7334d7024eef48e2cb9407e3497bb7cab7fa7" dependencies = [ "log", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.102.8", + "rustls-webpki 0.103.8", "subtle", "zeroize", ] @@ -7585,10 +7994,11 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" dependencies = [ + "web-time", "zeroize", ] @@ -7613,17 +8023,28 @@ dependencies = [ "untrusted", ] +[[package]] +name = "rustls-webpki" +version = "0.103.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "rustversion" -version = "1.0.18" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "safetensors" @@ -7672,11 +8093,11 @@ checksum = "ece8e78b2f38ec51c51f5d475df0a7187ba5111b2a28bdc761ee05b075d40a71" [[package]] name = "schannel" -version = "0.1.26" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -7693,6 +8114,30 @@ dependencies = [ "serde_json", ] +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1317c3bf3e7df961da95b0a56a172a02abead31276215a0497241a7624b487ce" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + [[package]] name = "schemars_derive" version = "0.8.22" @@ -7705,12 +8150,6 @@ dependencies = [ "syn 2.0.108", ] -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - [[package]] name = "scopeguard" version = "1.2.0" @@ -7791,12 +8230,12 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.2.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" dependencies = [ "bitflags 2.10.0", - "core-foundation 0.10.0", + "core-foundation 0.10.1", "core-foundation-sys", "libc", "security-framework-sys", @@ -7804,9 +8243,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.14.0" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" dependencies = [ "core-foundation-sys", "libc", @@ -7824,9 +8263,9 @@ dependencies = [ [[package]] name = "seq-macro" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3f0bf26fd526d2a95683cd0f87bf103b8539e2ca1ef48ce002d67aad59aa0b4" +checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" [[package]] name = "serde" @@ -7881,33 +8320,36 @@ dependencies = [ [[package]] name = "serde_ignored" -version = "0.1.10" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8e319a36d1b52126a0d608f24e93b2d81297091818cd70625fcf50a15d84ddf" +checksum = "115dffd5f3853e06e746965a20dcbae6ee747ae30b543d91b0e089668bb07798" dependencies = [ "serde", + "serde_core", ] [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] name = "serde_path_to_error" -version = "0.1.16" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" dependencies = [ "itoa", "serde", + "serde_core", ] [[package]] @@ -7932,9 +8374,9 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", @@ -7943,9 +8385,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" dependencies = [ "serde", ] @@ -7973,17 +8415,18 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.11.0" +version = "3.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" +checksum = "aa66c845eee442168b2c8134fec70ac50dc20e760769c8ba0ad1319ca1959b04" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", "indexmap 2.12.0", - "serde", - "serde_derive", + "schemars 0.9.0", + "schemars 1.0.5", + "serde_core", "serde_json", "serde_with_macros", "time", @@ -7991,11 +8434,11 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.11.0" +version = "3.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" +checksum = "b91a903660542fced4e99881aa481bdbaec1634568ee02e0b8bd57c64cb38955" dependencies = [ - "darling 0.20.10", + "darling 0.21.3", "proc-macro2", "quote", "syn 2.0.108", @@ -8043,9 +8486,9 @@ checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -8054,9 +8497,9 @@ dependencies = [ [[package]] name = "sha256" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18278f6a914fa3070aa316493f7d2ddfb9ac86ebc06fa3b83bffda487e9065b0" +checksum = "f880fc8562bdeb709793f00eb42a2ad0e672c4f883bbe59122b926eca935c8f6" dependencies = [ "async-trait", "bytes", @@ -8088,9 +8531,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" dependencies = [ "libc", ] @@ -8105,6 +8548,12 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + [[package]] name = "simdutf8" version = "0.1.5" @@ -8113,15 +8562,15 @@ checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" [[package]] name = "similar" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1de1d4f81173b03af4c0cbed3c898f6bff5b870e4a7f5d6f4057d62a7a4b686e" +checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" [[package]] name = "siphasher" -version = "0.3.11" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "sized-chunks" @@ -8135,12 +8584,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" @@ -8195,9 +8641,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.7" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", "windows-sys 0.52.0", @@ -8205,19 +8651,19 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "spdx" -version = "0.10.6" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47317bbaf63785b53861e1ae2d11b80d6b624211d42cb20efcd210ee6f8a14bc" +checksum = "c3e17e880bafaeb362a7b751ec46bdc5b61445a188f80e0606e68167cd540fa3" dependencies = [ "smallvec", ] @@ -8241,7 +8687,11 @@ dependencies = [ "spin-factors-test", "spin-locked-app", "tokio", +<<<<<<< HEAD "toml 0.8.19", +======= + "toml 0.8.23", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) ] [[package]] @@ -8257,7 +8707,11 @@ dependencies = [ "subprocess", "terminal", "tokio", +<<<<<<< HEAD "toml 0.8.19", +======= + "toml 0.8.23", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "topological-sort", "tracing", ] @@ -8278,11 +8732,16 @@ dependencies = [ "conformance-tests", "ctrlc", "dialoguer", + "fake-opentelemetry-collector", "futures", "hex", "http 1.3.1", "http-body-util", +<<<<<<< HEAD "hyper 1.8.1", +======= + "hyper 1.7.0", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "hyper-util", "indicatif", "itertools 0.14.0", @@ -8295,10 +8754,10 @@ dependencies = [ "rand 0.9.1", "redis", "regex", - "reqwest 0.12.9", + "reqwest 0.12.24", "rpassword", "runtime-tests", - "schemars", + "schemars 0.8.22", "semver", "serde", "serde_json", @@ -8329,7 +8788,11 @@ dependencies = [ "test-environment", "testing-framework", "tokio", +<<<<<<< HEAD "toml 0.8.19", +======= + "toml 0.8.23", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "tracing", "url", "uuid", @@ -8358,14 +8821,18 @@ dependencies = [ "anyhow", "async-trait", "cap-std", - "rand 0.9.1", + "rand 0.9.2", "rand_chacha 0.3.1", "rand_core 0.6.4", "serde", "serde_json", "tempfile", "tokio", +<<<<<<< HEAD "toml 0.8.19", +======= + "toml 0.8.23", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "tracing", "wasm-encoder 0.240.0", "wasm-metadata 0.240.0", @@ -8419,7 +8886,7 @@ dependencies = [ "anyhow", "async-trait", "glob", - "reqwest 0.12.9", + "reqwest 0.12.24", "serde", "similar", "spin-common", @@ -8427,8 +8894,13 @@ dependencies = [ "tempfile", "terminal", "tokio", +<<<<<<< HEAD "toml 0.8.19", "toml_edit", +======= + "toml 0.8.23", + "toml_edit 0.22.27", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "tracing", "ui-testing", ] @@ -8456,7 +8928,11 @@ dependencies = [ "spin-manifest", "spin-serde", "tokio", +<<<<<<< HEAD "toml 0.8.19", +======= + "toml 0.8.23", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "tracing", "wac-graph", "wac-types", @@ -8477,7 +8953,11 @@ dependencies = [ "spin-locked-app", "thiserror 2.0.17", "tokio", +<<<<<<< HEAD "toml 0.8.19", +======= + "toml 0.8.23", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) ] [[package]] @@ -8487,6 +8967,7 @@ dependencies = [ "anyhow", "serde", "spin-core", + "spin-factor-otel", "spin-factors", "spin-factors-test", "spin-key-value-redis", @@ -8498,7 +8979,11 @@ dependencies = [ "tempfile", "thiserror 2.0.17", "tokio", +<<<<<<< HEAD "toml 0.8.19", +======= + "toml 0.8.23", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "tracing", ] @@ -8509,6 +8994,7 @@ dependencies = [ "anyhow", "async-trait", "serde", + "spin-factor-otel", "spin-factors", "spin-factors-test", "spin-llm-local", @@ -8517,11 +9003,34 @@ dependencies = [ "spin-telemetry", "spin-world", "tokio", +<<<<<<< HEAD "toml 0.8.19", +======= + "toml 0.8.23", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "tracing", "url", ] +[[package]] +name = "spin-factor-otel" +version = "3.6.0-pre0" +dependencies = [ + "anyhow", + "indexmap 2.12.0", + "opentelemetry", + "opentelemetry-otlp", + "opentelemetry_sdk", + "spin-core", + "spin-factors", + "spin-resource-table", + "spin-telemetry", + "spin-world", + "toml 0.5.11", + "tracing", + "tracing-opentelemetry", +] + [[package]] name = "spin-factor-outbound-http" version = "3.6.0-pre0" @@ -8531,13 +9040,18 @@ dependencies = [ "http 1.3.1", "http-body 1.0.1", "http-body-util", +<<<<<<< HEAD "hyper 1.8.1", +======= + "hyper 1.7.0", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "hyper-util", "pin-project-lite", - "reqwest 0.12.9", - "rustls 0.23.18", + "reqwest 0.12.24", + "rustls 0.23.34", "serde", "spin-common", + "spin-factor-otel", "spin-factor-outbound-networking", "spin-factor-variables", "spin-factors", @@ -8545,7 +9059,7 @@ dependencies = [ "spin-telemetry", "spin-world", "tokio", - "tokio-rustls 0.26.0", + "tokio-rustls 0.26.4", "tower-service", "tracing", "wasmtime", @@ -8560,6 +9074,7 @@ dependencies = [ "anyhow", "rumqttc", "spin-core", + "spin-factor-otel", "spin-factor-outbound-networking", "spin-factor-variables", "spin-factors", @@ -8577,6 +9092,7 @@ dependencies = [ "anyhow", "mysql_async", "spin-core", + "spin-factor-otel", "spin-factor-outbound-networking", "spin-factor-variables", "spin-factors", @@ -8596,7 +9112,7 @@ dependencies = [ "futures-util", "http 1.3.1", "ip_network", - "rustls 0.23.18", + "rustls 0.23.34", "rustls-pki-types", "serde", "spin-factor-variables", @@ -8609,11 +9125,15 @@ dependencies = [ "spin-serde", "tempfile", "tokio", +<<<<<<< HEAD "toml 0.8.19", +======= + "toml 0.8.23", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "tracing", "url", "wasmtime-wasi", - "webpki-roots", + "webpki-roots 0.26.11", ] [[package]] @@ -8631,6 +9151,7 @@ dependencies = [ "rust_decimal", "serde_json", "spin-core", + "spin-factor-otel", "spin-factor-outbound-networking", "spin-factor-variables", "spin-factors", @@ -8650,6 +9171,7 @@ dependencies = [ "anyhow", "redis", "spin-core", + "spin-factor-otel", "spin-factor-outbound-networking", "spin-factor-variables", "spin-factors", @@ -8665,6 +9187,7 @@ name = "spin-factor-sqlite" version = "3.6.0-pre0" dependencies = [ "async-trait", + "spin-factor-otel", "spin-factors", "spin-factors-test", "spin-locked-app", @@ -8679,6 +9202,7 @@ name = "spin-factor-variables" version = "3.6.0-pre0" dependencies = [ "spin-expressions", + "spin-factor-otel", "spin-factors", "spin-factors-test", "spin-telemetry", @@ -8710,7 +9234,11 @@ dependencies = [ "spin-app", "spin-factors-derive", "thiserror 2.0.17", +<<<<<<< HEAD "toml 0.8.19", +======= + "toml 0.8.23", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "wasmtime", ] @@ -8746,7 +9274,11 @@ dependencies = [ "spin-loader", "spin-telemetry", "tempfile", +<<<<<<< HEAD "toml 0.8.19", +======= + "toml 0.8.23", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) ] [[package]] @@ -8756,7 +9288,11 @@ dependencies = [ "anyhow", "http 1.3.1", "http-body-util", +<<<<<<< HEAD "hyper 1.8.1", +======= + "hyper 1.7.0", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "indexmap 2.12.0", "percent-encoding", "routefinder", @@ -8765,7 +9301,11 @@ dependencies = [ "spin-factor-outbound-http", "spin-http-routes", "terminal", +<<<<<<< HEAD "toml 0.8.19", +======= + "toml 0.8.23", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "tracing", "wasmtime", "wasmtime-wasi", @@ -8808,7 +9348,7 @@ dependencies = [ "azure_data_cosmos", "azure_identity 0.21.0", "futures", - "reqwest 0.12.9", + "reqwest 0.12.24", "serde", "spin-factor-key-value", ] @@ -8847,7 +9387,7 @@ dependencies = [ "candle-core", "candle-nn", "candle-transformers", - "rand 0.9.1", + "rand 0.9.2", "safetensors 0.5.3", "serde", "serde_json", @@ -8864,7 +9404,7 @@ name = "spin-llm-remote-http" version = "3.6.0-pre0" dependencies = [ "anyhow", - "reqwest 0.12.9", + "reqwest 0.12.24", "serde", "serde_json", "spin-telemetry", @@ -8881,7 +9421,7 @@ dependencies = [ "futures", "glob", "path-absolutize", - "reqwest 0.12.9", + "reqwest 0.12.24", "semver", "serde", "serde_json", @@ -8895,7 +9435,11 @@ dependencies = [ "tempfile", "terminal", "tokio", +<<<<<<< HEAD "toml 0.8.19", +======= + "toml 0.8.23", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "tracing", "ui-testing", "wasm-pkg-client", @@ -8921,14 +9465,18 @@ dependencies = [ "anyhow", "glob", "indexmap 2.12.0", - "schemars", + "schemars 0.8.22", "semver", "serde", "serde_json", "spin-serde", "terminal", "thiserror 2.0.17", +<<<<<<< HEAD "toml 0.8.19", +======= + "toml 0.8.23", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "ui-testing", "url", "wasm-pkg-common", @@ -8949,7 +9497,7 @@ dependencies = [ "futures-util", "itertools 0.14.0", "oci-distribution 0.11.0 (git+https://github.com/fermyon/oci-distribution?rev=7b291a39f74d1a3c9499d934a56cae6580fc8e37)", - "reqwest 0.12.9", + "reqwest 0.12.24", "serde", "serde_json", "spin-common", @@ -8994,7 +9542,7 @@ dependencies = [ "fd-lock", "flate2", "path-absolutize", - "reqwest 0.12.9", + "reqwest 0.12.24", "semver", "serde", "serde_json", @@ -9022,6 +9570,7 @@ dependencies = [ "spin-expressions", "spin-factor-key-value", "spin-factor-llm", + "spin-factor-otel", "spin-factor-outbound-http", "spin-factor-outbound-mqtt", "spin-factor-outbound-mysql", @@ -9046,7 +9595,11 @@ dependencies = [ "spin-world", "tempfile", "tokio", +<<<<<<< HEAD "toml 0.8.19", +======= + "toml 0.8.23", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) ] [[package]] @@ -9058,6 +9611,7 @@ dependencies = [ "spin-common", "spin-factor-key-value", "spin-factor-llm", + "spin-factor-otel", "spin-factor-outbound-http", "spin-factor-outbound-mqtt", "spin-factor-outbound-mysql", @@ -9083,7 +9637,7 @@ dependencies = [ "anyhow", "base64 0.22.1", "indexmap 2.12.0", - "schemars", + "schemars 0.8.22", "semver", "serde", "wasm-pkg-common", @@ -9098,7 +9652,11 @@ dependencies = [ "spin-factors", "spin-sqlite-inproc", "spin-sqlite-libsql", +<<<<<<< HEAD "toml 0.8.19", +======= + "toml 0.8.23", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) ] [[package]] @@ -9161,7 +9719,7 @@ dependencies = [ "path-absolutize", "pathdiff", "regex", - "reqwest 0.12.9", + "reqwest 0.12.24", "semver", "serde", "spin-common", @@ -9170,8 +9728,13 @@ dependencies = [ "tempfile", "terminal", "tokio", +<<<<<<< HEAD "toml 0.8.19", "toml_edit", +======= + "toml 0.8.23", + "toml_edit 0.22.27", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "url", "walkdir", ] @@ -9214,16 +9777,24 @@ dependencies = [ "http 1.3.1", "http-body 1.0.1", "http-body-util", +<<<<<<< HEAD "hyper 1.8.1", "hyper-util", "pin-project-lite", "rand 0.9.1", "rustls 0.23.18", +======= + "hyper 1.7.0", + "hyper-util", + "pin-project-lite", + "rustls 0.23.34", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "rustls-pki-types", "serde", "serde_json", "spin-app", "spin-core", + "spin-factor-otel", "spin-factor-outbound-http", "spin-factor-outbound-networking", "spin-factor-wasi", @@ -9235,7 +9806,7 @@ dependencies = [ "spin-world", "terminal", "tokio", - "tokio-rustls 0.26.0", + "tokio-rustls 0.26.4", "tracing", "wasmtime", "wasmtime-wasi", @@ -9296,7 +9867,11 @@ dependencies = [ "spin-expressions", "spin-factors", "tempfile", +<<<<<<< HEAD "toml 0.8.19", +======= + "toml 0.8.23", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) ] [[package]] @@ -9314,7 +9889,10 @@ dependencies = [ name = "spin-world" version = "3.6.0-pre0" dependencies = [ + "anyhow", "async-trait", + "opentelemetry", + "opentelemetry_sdk", "wasmtime", ] @@ -9342,9 +9920,9 @@ dependencies = [ [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "static_assertions" @@ -9459,9 +10037,9 @@ checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" [[package]] name = "sync_wrapper" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" dependencies = [ "futures-core", ] @@ -9480,9 +10058,9 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", @@ -9570,7 +10148,11 @@ dependencies = [ "cap-std", "fd-lock", "io-lifetimes", +<<<<<<< HEAD "rustix 0.38.40", +======= + "rustix 0.38.44", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "windows-sys 0.59.0", "winx", ] @@ -9589,9 +10171,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tar" -version = "0.4.43" +version = "0.4.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c65998313f8e17d0d553d28f91a0df93e4dbbbf770279c7bc21ca0f09ea1a1f6" +checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" dependencies = [ "filetime", "libc", @@ -9600,15 +10182,15 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.13.1" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc12939a1c9b9d391e0b7135f72fd30508b73450753e28341fed159317582a77" +checksum = "df7f62577c25e07834649fc3b39fafdc597c0a3527dc1c60129201ccfcbaa50c" [[package]] name = "temp-dir" -version = "0.1.14" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc1ee6eef34f12f765cb94725905c6312b6610ab2b0940889cfe58dae7bc3c72" +checksum = "83176759e9416cf81ee66cb6508dbfe9c96f20b8b56265a39917551c23c70964" [[package]] name = "tempfile" @@ -9616,8 +10198,8 @@ version = "3.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ - "fastrand 2.2.0", - "getrandom 0.3.2", + "fastrand 2.3.0", + "getrandom 0.3.4", "once_cell", "rustix 1.1.2", "windows-sys 0.61.2", @@ -9647,7 +10229,7 @@ checksum = "d4ea810f0692f9f51b382fff5893887bb4580f5fa246fde546e0b13e7fcee662" dependencies = [ "fnv", "nom", - "phf", + "phf 0.11.3", "phf_codegen", ] @@ -9676,7 +10258,7 @@ dependencies = [ "anyhow", "fslock", "regex", - "reqwest 0.12.9", + "reqwest 0.12.24", "temp-dir", "tokio", ] @@ -9690,7 +10272,7 @@ dependencies = [ "http-body-util", "log", "nix 0.29.0", - "reqwest 0.12.9", + "reqwest 0.12.24", "spin-app", "spin-http", "spin-loader", @@ -9703,9 +10285,9 @@ dependencies = [ [[package]] name = "textwrap" -version = "0.16.1" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" +checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" [[package]] name = "thiserror" @@ -9749,12 +10331,11 @@ dependencies = [ [[package]] name = "thread_local" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" dependencies = [ "cfg-if", - "once_cell", ] [[package]] @@ -9768,9 +10349,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.36" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", "itoa", @@ -9786,15 +10367,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.2" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" dependencies = [ "num-conv", "time-core", @@ -9820,9 +10401,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" dependencies = [ "displaydoc", "zerovec", @@ -9830,9 +10411,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" dependencies = [ "tinyvec_macros", ] @@ -9845,23 +10426,25 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokenizers" -version = "0.21.1" +version = "0.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3169b3195f925496c895caee7978a335d49218488ef22375267fba5a46a40bd7" +checksum = "a620b996116a59e184c2fa2dfd8251ea34a36d0a514758c6f966386bd2e03476" dependencies = [ + "ahash 0.8.12", "aho-corasick", + "compact_str", + "dary_heap", "derive_builder 0.20.2", "esaxx-rs", - "getrandom 0.2.15", + "getrandom 0.3.4", "indicatif", - "itertools 0.13.0", - "lazy_static 1.5.0", + "itertools 0.14.0", "log", "macro_rules_attribute", "monostate", "onig", "paste", - "rand 0.8.5", + "rand 0.9.2", "rayon", "rayon-cond", "regex", @@ -9887,7 +10470,11 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", +<<<<<<< HEAD "socket2 0.6.0", +======= + "socket2 0.6.1", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "tokio-macros", "windows-sys 0.61.2", ] @@ -9915,9 +10502,9 @@ dependencies = [ [[package]] name = "tokio-postgres" -version = "0.7.12" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b5d3742945bc7d7f210693b0c58ae542c6fd47b17adbbda0885f3dcb34a6bdb" +checksum = "2b40d66d9b2cfe04b628173409368e58247e8eddbbd3b0e6c6ba1d09f20f6c9e" dependencies = [ "async-trait", "byteorder", @@ -9928,12 +10515,12 @@ dependencies = [ "log", "parking_lot", "percent-encoding", - "phf", + "phf 0.13.1", "pin-project-lite", "postgres-protocol", "postgres-types", - "rand 0.8.5", - "socket2 0.5.7", + "rand 0.9.2", + "socket2 0.6.1", "tokio", "tokio-util", "whoami", @@ -9962,32 +10549,19 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" -dependencies = [ - "rustls 0.23.18", - "rustls-pki-types", - "tokio", -] - -[[package]] -name = "tokio-socks" -version = "0.5.2" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d4770b8024672c1101b3f6733eab95b18007dbe0847a8afe341fcf79e06043f" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "either", - "futures-util", - "thiserror 1.0.69", + "rustls 0.23.34", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ "futures-core", "pin-project-lite", @@ -10010,15 +10584,30 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.19" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "toml" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "indexmap 2.12.0", "serde", +<<<<<<< HEAD "serde_spanned 0.6.8", "toml_datetime 0.6.8", "toml_edit", +======= + "serde_spanned", + "toml_datetime 0.6.11", + "toml_edit 0.22.27", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) ] [[package]] @@ -10038,9 +10627,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" dependencies = [ "serde", ] @@ -10048,6 +10637,7 @@ dependencies = [ [[package]] name = "toml_datetime" version = "0.7.3" +<<<<<<< HEAD source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" dependencies = [ @@ -10057,22 +10647,56 @@ dependencies = [ [[package]] name = "toml_edit" version = "0.22.22" +======= +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap 2.12.0", "serde", +<<<<<<< HEAD "serde_spanned 0.6.8", "toml_datetime 0.6.8", "winnow 0.6.20", ] [[package]] +======= + "serde_spanned", + "toml_datetime 0.6.11", + "toml_write", + "winnow", +] + +[[package]] +name = "toml_edit" +version = "0.23.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" +dependencies = [ + "indexmap 2.12.0", + "toml_datetime 0.7.3", + "toml_parser", + "winnow", +] + +[[package]] +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) name = "toml_parser" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" dependencies = [ +<<<<<<< HEAD "winnow 0.7.13", ] @@ -10081,6 +10705,16 @@ name = "toml_writer" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" +======= + "winnow", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) [[package]] name = "tonic" @@ -10093,17 +10727,25 @@ dependencies = [ "axum", "base64 0.22.1", "bytes", +<<<<<<< HEAD "h2 0.4.6", "http 1.3.1", "http-body 1.0.1", "http-body-util", - "hyper 1.8.1", + "hyper 1.8.1", +======= + "h2 0.4.12", + "http 1.3.1", + "http-body 1.0.1", + "http-body-util", + "hyper 1.7.0", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "hyper-timeout", "hyper-util", "percent-encoding", "pin-project", - "prost 0.13.3", - "socket2 0.5.7", + "prost 0.13.5", + "socket2 0.5.10", "tokio", "tokio-stream", "tower 0.4.13", @@ -10147,7 +10789,26 @@ dependencies = [ "futures-core", "futures-util", "pin-project-lite", - "sync_wrapper 1.0.1", + "sync_wrapper 1.0.2", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "bitflags 2.10.0", + "bytes", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "iri-string", + "pin-project-lite", + "tower 0.5.2", "tower-layer", "tower-service", ] @@ -10178,9 +10839,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", @@ -10189,9 +10850,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", "valuable", @@ -10265,15 +10926,15 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "twox-hash" -version = "2.1.0" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7b17f197b3050ba473acf9181f7b1d3b66d1cf7356c6cc57886662276e65908" +checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" [[package]] name = "typenum" -version = "1.17.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "tz-rs" @@ -10319,7 +10980,7 @@ dependencies = [ "serde", "thiserror 1.0.69", "tracing", - "yoke", + "yoke 0.7.5", ] [[package]] @@ -10371,15 +11032,15 @@ dependencies = [ [[package]] name = "unicase" -version = "2.8.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-bidi" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-bom" @@ -10389,15 +11050,15 @@ checksum = "7eec5d1121208364f6793f7d2e222bf75a915c19557537745b195b253dd64217" [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "unicode-normalization" -version = "0.1.24" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" dependencies = [ "tinyvec", ] @@ -10413,9 +11074,9 @@ dependencies = [ [[package]] name = "unicode-properties" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" +checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" [[package]] name = "unicode-segmentation" @@ -10431,9 +11092,9 @@ checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode-width" -version = "0.2.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" [[package]] name = "unicode-xid" @@ -10477,12 +11138,6 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -10497,30 +11152,42 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.11.0" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" +checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.3.4", + "js-sys", + "wasm-bindgen", ] [[package]] name = "valuable" -version = "0.1.0" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "value-bag" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +checksum = "943ce29a8a743eb10d6082545d861b24f9d1b160b7d741e0f2cdf726bec909c5" [[package]] name = "vaultrs" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a769a71e45deef489beed23167f79ee75d41f482b5e3d96ddab833f24fd07e51" +checksum = "f81eb4d9221ca29bad43d4b6871b6d2e7656e1af2cfca624a87e5d17880d831d" dependencies = [ "async-trait", "bytes", "derive_builder 0.12.0", "http 1.3.1", +<<<<<<< HEAD "reqwest 0.12.9", +======= + "reqwest 0.12.24", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "rustify", "rustify_derive", "serde", @@ -10645,7 +11312,7 @@ dependencies = [ "async-recursion", "async-trait", "bytes", - "clap 4.5.20", + "clap 4.5.51", "dialoguer", "dirs 5.0.1", "futures-util", @@ -10657,7 +11324,7 @@ dependencies = [ "once_cell", "pathdiff", "ptree", - "reqwest 0.12.9", + "reqwest 0.12.24", "secrecy", "semver", "serde", @@ -10766,17 +11433,17 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" +name = "wasip2" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "wit-bindgen-rt", + "wit-bindgen", ] [[package]] @@ -10787,47 +11454,35 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.108", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.45" +version = "0.4.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -10835,22 +11490,25 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" dependencies = [ + "bumpalo", "proc-macro2", "quote", "syn 2.0.108", - "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +dependencies = [ + "unicode-ident", +] [[package]] name = "wasm-compose" @@ -10945,6 +11603,7 @@ dependencies = [ ] [[package]] +<<<<<<< HEAD name = "wasm-encoder" version = "0.241.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -10955,6 +11614,8 @@ dependencies = [ ] [[package]] +======= +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) name = "wasm-metadata" version = "0.224.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -11043,7 +11704,7 @@ dependencies = [ "futures-util", "oci-client", "oci-wasm", - "reqwest 0.12.9", + "reqwest 0.12.24", "secrecy", "serde", "serde_json", @@ -11051,7 +11712,11 @@ dependencies = [ "thiserror 1.0.69", "tokio", "tokio-util", +<<<<<<< HEAD "toml 0.8.19", +======= + "toml 0.8.23", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "tracing", "tracing-subscriber", "url", @@ -11080,7 +11745,11 @@ dependencies = [ "sha2", "thiserror 1.0.69", "tokio", +<<<<<<< HEAD "toml 0.8.19", +======= + "toml 0.8.23", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) ] [[package]] @@ -11114,7 +11783,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04f17a5917c2ddd3819e84c661fae0d6ba29d7b9c1f0e96c708c65a9c4188e11" dependencies = [ "bitflags 2.10.0", - "hashbrown 0.15.2", + "hashbrown 0.15.5", "indexmap 2.12.0", "semver", ] @@ -11126,7 +11795,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "161296c618fa2d63f6ed5fffd1112937e803cb9ec71b32b01a76321555660917" dependencies = [ "bitflags 2.10.0", - "hashbrown 0.15.2", + "hashbrown 0.15.5", "indexmap 2.12.0", "semver", ] @@ -11138,7 +11807,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c9d90bb93e764f6beabf1d02028c70a2156a6583e63ac4218dd07ef733368b0" dependencies = [ "bitflags 2.10.0", - "hashbrown 0.15.2", + "hashbrown 0.15.5", "indexmap 2.12.0", "semver", "serde", @@ -11151,6 +11820,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b722dcf61e0ea47440b53ff83ccb5df8efec57a69d150e4f24882e4eba7e24a4" dependencies = [ "bitflags 2.10.0", +<<<<<<< HEAD "hashbrown 0.15.2", "indexmap 2.12.0", "semver", @@ -11164,6 +11834,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46d90019b1afd4b808c263e428de644f3003691f243387d30d673211ee0cb8e8" dependencies = [ "bitflags 2.10.0", +======= +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "indexmap 2.12.0", "semver", ] @@ -11191,11 +11863,19 @@ dependencies = [ [[package]] name = "wasmtime" +<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "511bc19c2d48f338007dc941cb40c833c4707023fdaf9ec9b97cf1d5a62d26bb" dependencies = [ "addr2line 0.25.1", +======= +version = "37.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1092d79769b1f888940a572ed881eec18f837cb96201985eb5928226759ebc3e" +dependencies = [ + "addr2line", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "anyhow", "async-trait", "bitflags 2.10.0", @@ -11206,15 +11886,20 @@ dependencies = [ "encoding_rs", "futures", "fxprof-processed-profile", +<<<<<<< HEAD "gimli 0.32.3", "hashbrown 0.15.2", +======= + "gimli", + "hashbrown 0.15.5", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "indexmap 2.12.0", "ittapi", "libc", "log", "mach2", "memfd", - "object 0.37.3", + "object", "once_cell", "postcard", "pulley-interpreter", @@ -11249,18 +11934,28 @@ dependencies = [ [[package]] name = "wasmtime-environ" +<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3b0d53657fea2a8cee8ed1866ad45d2e5bc21be958a626a1dd9b7de589851b3" +======= +version = "37.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "484db5c4dd06e96559217b60893b5dbb9fe3cd28489c83a4257b277c9ead959c" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "anyhow", "cpp_demangle", "cranelift-bitset", "cranelift-entity", +<<<<<<< HEAD "gimli 0.32.3", +======= + "gimli", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "indexmap 2.12.0", "log", - "object 0.37.3", + "object", "postcard", "rustc-demangle", "semver", @@ -11275,10 +11970,26 @@ dependencies = [ ] [[package]] +<<<<<<< HEAD name = "wasmtime-internal-cache" version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35e065628d2a6eccb722de71c6d9b58771f5c3c4f9d35f6cb6d9d92370f4c2b4" +======= +name = "wasmtime-internal-asm-macros" +version = "37.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60d3903b8db592bb4f5e847bd6dc38f485791d4d9ebc9e2df167d3c7f072115c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "wasmtime-internal-cache" +version = "37.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ab11f58f3b24a4a47d7d99b45ca22635c33cf26acdda1fe77612180e7285e2f" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "anyhow", "base64 0.22.1", @@ -11289,16 +12000,26 @@ dependencies = [ "serde", "serde_derive", "sha2", +<<<<<<< HEAD "toml 0.9.8", +======= + "toml 0.8.23", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "windows-sys 0.60.2", "zstd", ] [[package]] name = "wasmtime-internal-component-macro" +<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c933104f57d27dd1e6c7bd9ee5df3242bdd1962d9381bc08fa5d4e60e1f5ebdf" +======= +version = "37.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73c7d26d0c0d6da9f35dd56e3651a84bc4741646803e78886a3144aaf15c941e" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "anyhow", "proc-macro2", @@ -11311,6 +12032,7 @@ dependencies = [ [[package]] name = "wasmtime-internal-component-util" +<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63ef2a95a5dbaa70fc3ef682ea8997e51cdd819b4d157a1100477cf43949d454" @@ -11320,6 +12042,17 @@ name = "wasmtime-internal-cranelift" version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73122df6a8cf417ce486a94e844d3a60797217ce7ae69653e0ee9e28269e0fa5" +======= +version = "37.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb62647125f7a0833cefb9a8862bc7886d206fe4e7131201bddd8d3979abbb02" + +[[package]] +name = "wasmtime-internal-cranelift" +version = "37.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d802c0a214c82fbf3e60ead87bf4d5dff7fc957c9a4449ceeae74bd89283ee57" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "anyhow", "cfg-if", @@ -11328,10 +12061,14 @@ dependencies = [ "cranelift-entity", "cranelift-frontend", "cranelift-native", +<<<<<<< HEAD "gimli 0.32.3", +======= + "gimli", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "itertools 0.14.0", "log", - "object 0.37.3", + "object", "pulley-interpreter", "smallvec", "target-lexicon", @@ -11345,36 +12082,61 @@ dependencies = [ [[package]] name = "wasmtime-internal-fiber" +<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54ead059e58b54a7abbe0bfb9457b3833ebd2ad84326c248a835ff76d64c7c6f" +======= +version = "37.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43fdeb4c50dbbb3ebf01f7e6d270ba4239c8db5ff1e68725386abad2e5250be4" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "anyhow", "cc", "cfg-if", "libc", "rustix 1.1.2", +<<<<<<< HEAD +======= + "wasmtime-internal-asm-macros", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "wasmtime-internal-versioned-export-macros", "windows-sys 0.60.2", ] [[package]] name = "wasmtime-internal-jit-debug" +<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3af620a4ac1623298c90d3736644e12d66974951d1e38d0464798de85c984e17" dependencies = [ "cc", "object 0.37.3", +======= +version = "37.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fe059ecd3f572ec2f616f036e5f31a88649a5f16e4838147cb3af6c3b5cedd5" +dependencies = [ + "cc", + "object", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "rustix 1.1.2", "wasmtime-internal-versioned-export-macros", ] [[package]] name = "wasmtime-internal-jit-icache-coherence" +<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b97ccd36e25390258ce6720add639ffe5a7d81a5c904350aa08f5bbc60433d22" +======= +version = "37.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a03f55a9dbfa30f2ed269fa9735c2994b8423461d45c3ca08aa7a103daeff20" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "anyhow", "cfg-if", @@ -11384,15 +12146,22 @@ dependencies = [ [[package]] name = "wasmtime-internal-math" +<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd1b856e1bbf0230ab560ba4204e944b141971adc4e6cdf3feb6979c1a7b7953" +======= +version = "37.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed7f491d2c7f1be3f6e5485ab5a26f26f177860c8b5c16d3ab87df4b24f28e40" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "libm", ] [[package]] name = "wasmtime-internal-slab" +<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8908e71a780b97cbd3d8f3a0c446ac8df963069e0f3f38c9eace4f199d4d3e65" @@ -11402,19 +12171,36 @@ name = "wasmtime-internal-unwinder" version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb9c2f8223a0ef96527f0446b80c7d0d9bb0577c7b918e3104bd6d4cdba1d101" +======= +version = "37.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce79a933dd9c5fdcc1ce1f6b46e89e72ccb6767619557f0468d97fbfb0475db6" + +[[package]] +name = "wasmtime-internal-unwinder" +version = "37.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0e12be7ff91e956c6e7cee17654982669493c4aaa861e3536f7b1c22999519d" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "anyhow", "cfg-if", "cranelift-codegen", "log", - "object 0.37.3", + "object", ] [[package]] name = "wasmtime-internal-versioned-export-macros" +<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b0fb82cdbffd6cafc812c734a22fa753102888b8760ecf6a08cbb50367a458a" +======= +version = "37.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67d114c747409b6f76ddf86deb2c5976f809baed3eea8fdca493063ea182246b" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "proc-macro2", "quote", @@ -11423,6 +12209,7 @@ dependencies = [ [[package]] name = "wasmtime-internal-winch" +<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1cfd68149cef86afd9a6c9b51e461266dfa66b37b4c6fdf1201ddbf7f906271" @@ -11430,8 +12217,17 @@ dependencies = [ "anyhow", "cranelift-codegen", "gimli 0.32.3", +======= +version = "37.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc9d9e984025efce72ec4b90b95790e857f2fef7601c317abedf61226e21585" +dependencies = [ + "anyhow", + "cranelift-codegen", + "gimli", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "log", - "object 0.37.3", + "object", "target-lexicon", "wasmparser 0.240.0", "wasmtime-environ", @@ -11441,9 +12237,15 @@ dependencies = [ [[package]] name = "wasmtime-internal-wit-bindgen" +<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a628437073400148f1ba2b55beb60eb376dc5ca538745994c83332b037d1f3fa" +======= +version = "37.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fb054d6661ef694d1d90e1c01233cb8ef0d7f84b73980709d3facef1373e189" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "anyhow", "bitflags 2.10.0", @@ -11454,9 +12256,15 @@ dependencies = [ [[package]] name = "wasmtime-wasi" +<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "517604b1ce13a56ae3e360217095d7d4db90e84deaa3fba078877c2b80cc5851" +======= +version = "37.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da6617d09fda0be82e11227418e5561c67a8469709215d7c05a9d9f4d2192dc7" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "anyhow", "async-trait", @@ -11485,9 +12293,15 @@ dependencies = [ [[package]] name = "wasmtime-wasi-http" +<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63d735c8a0ef1bb49810f4da75acfdba2390cb4e9de7385bffb8cda77d20d401" +======= +version = "37.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3822921e191aa0b6aaf7015f12dad4703e54dad0a9b41b68d846c79ea19e7d21" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "anyhow", "async-trait", @@ -11496,7 +12310,11 @@ dependencies = [ "http 1.3.1", "http-body 1.0.1", "http-body-util", +<<<<<<< HEAD "hyper 1.8.1", +======= + "hyper 1.7.0", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "rustls 0.22.4", "tokio", "tokio-rustls 0.25.0", @@ -11505,14 +12323,20 @@ dependencies = [ "wasmtime", "wasmtime-wasi", "wasmtime-wasi-io", - "webpki-roots", + "webpki-roots 0.26.11", ] [[package]] name = "wasmtime-wasi-io" +<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ec66fc94ceb9497d62a3d082bd2cce10348975795516553df4cd89f7d5fc14b" +======= +version = "37.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdca5f5ac3e7814f184f44e49add8e99a3e92bc1ceb45c05ba013b2822b7b705" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "anyhow", "async-trait", @@ -11532,24 +12356,43 @@ dependencies = [ [[package]] name = "wast" +<<<<<<< HEAD version = "241.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63f66e07e2ddf531fef6344dbf94d112df7c2f23ed6ffb10962e711500b8d816" +======= +version = "240.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0efe1c93db4ac562b9733e3dca19ed7fc878dba29aef22245acf84f13da4a19" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "bumpalo", "leb128fmt", "memchr", +<<<<<<< HEAD "unicode-width 0.2.0", "wasm-encoder 0.241.2", +======= + "unicode-width 0.2.2", + "wasm-encoder 0.240.0", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) ] [[package]] name = "wat" +<<<<<<< HEAD version = "1.241.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45f923705c40830af909c5dec2352ec2821202e4a66008194585e1917458a26d" dependencies = [ "wast 241.0.2", +======= +version = "1.240.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec9b6eab7ecd4d639d78515e9ea491c9bacf494aa5eda10823bd35992cf8c1e" +dependencies = [ + "wast 240.0.0", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) ] [[package]] @@ -11638,9 +12481,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" dependencies = [ "js-sys", "wasm-bindgen", @@ -11658,20 +12501,28 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.6" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.4", +] + +[[package]] +name = "webpki-roots" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" +checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" dependencies = [ "rustls-pki-types", ] [[package]] name = "which" -version = "7.0.3" +version = "8.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d643ce3fd3e5b54854602a080f34fb10ab75e0b813ee32d00ca2b44fa74762" +checksum = "d3fabb953106c3c8eea8306e4393700d7657561cb43122571b172bbfb7c7ba1d" dependencies = [ - "either", "env_home", "rustix 1.1.2", "winsafe", @@ -11679,20 +12530,26 @@ dependencies = [ [[package]] name = "whoami" -version = "1.5.2" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" +checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d" dependencies = [ - "redox_syscall", + "libredox", "wasite", "web-sys", ] [[package]] name = "wiggle" +<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb9c745158119785cf3098c97151cfcc33104ade6489bfa158b73d3f5979fa24" +======= +version = "37.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e45c8d34846d01d20157c00cd61e207e4f4d8889cfc69b45d43e5114834e71e" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "anyhow", "bitflags 2.10.0", @@ -11704,9 +12561,15 @@ dependencies = [ [[package]] name = "wiggle-generate" +<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8a98d02cd1ba87ca6039f28f4f4c0b53a9ff2684f5f2640f471af9bc608b9d9" +======= +version = "37.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772a63dfce3a1bce1cc019720e43603633c5a2cb84291bec77f438ec38b55bf2" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "anyhow", "heck 0.5.0", @@ -11718,9 +12581,15 @@ dependencies = [ [[package]] name = "wiggle-macro" +<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a111938ed6e662d5f5036bb3cac8d10d5bea77a536885d6d4a4667c9cba97a2" +======= +version = "37.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3636c0c0352f54b28f45d1327784176e134009db4230024be6509966c88adf74" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "proc-macro2", "quote", @@ -11746,11 +12615,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -11761,14 +12630,24 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "winch-codegen" +<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1de5a648102e39c8e817ed25e3820f4b9772f3c9c930984f32737be60e3156b" +======= +version = "37.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61aeea98b13a9d2f537b9aec71a168397aefd5a3faebdc6b3d96ff7df4592e59" +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "anyhow", "cranelift-assembler-x64", "cranelift-codegen", +<<<<<<< HEAD "gimli 0.32.3", +======= + "gimli", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "regalloc2", "smallvec", "target-lexicon", @@ -11803,24 +12682,28 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.52.0" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ - "windows-targets 0.52.6", + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", ] [[package]] name = "windows-core" -version = "0.61.2" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ "windows-implement", "windows-interface", - "windows-link 0.1.3", - "windows-result 0.3.4", - "windows-strings 0.4.2", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", ] [[package]] @@ -11836,9 +12719,9 @@ dependencies = [ [[package]] name = "windows-implement" -version = "0.60.0" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", @@ -11847,9 +12730,9 @@ dependencies = [ [[package]] name = "windows-interface" -version = "0.59.1" +version = "0.59.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", @@ -11880,50 +12763,52 @@ dependencies = [ [[package]] name = "windows-registry" -version = "0.2.0" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" dependencies = [ - "windows-result 0.2.0", - "windows-strings 0.1.0", - "windows-targets 0.52.6", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", ] [[package]] name = "windows-result" -version = "0.2.0" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ - "windows-targets 0.52.6", + "windows-link 0.1.3", ] [[package]] name = "windows-result" -version = "0.3.4" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ - "windows-link 0.1.3", + "windows-link 0.2.1", ] [[package]] name = "windows-strings" -version = "0.1.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ - "windows-result 0.2.0", - "windows-targets 0.52.6", + "windows-link 0.1.3", +<<<<<<< HEAD +======= ] [[package]] name = "windows-strings" -version = "0.4.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ - "windows-link 0.1.3", + "windows-link 0.2.1", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) ] [[package]] @@ -11959,7 +12844,16 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.3", + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", ] [[package]] @@ -12004,10 +12898,11 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.3" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ +<<<<<<< HEAD "windows-link 0.1.3", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", @@ -12017,6 +12912,17 @@ dependencies = [ "windows_x86_64_gnu 0.53.0", "windows_x86_64_gnullvm 0.53.0", "windows_x86_64_msvc 0.53.0", +======= + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +>>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) ] [[package]] @@ -12042,9 +12948,9 @@ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" [[package]] name = "windows_aarch64_msvc" @@ -12060,9 +12966,9 @@ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" [[package]] name = "windows_i686_gnu" @@ -12078,9 +12984,9 @@ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" [[package]] name = "windows_i686_gnullvm" @@ -12090,9 +12996,9 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" [[package]] name = "windows_i686_msvc" @@ -12108,9 +13014,9 @@ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" [[package]] name = "windows_x86_64_gnu" @@ -12126,9 +13032,9 @@ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" [[package]] name = "windows_x86_64_gnullvm" @@ -12144,9 +13050,9 @@ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" [[package]] name = "windows_x86_64_msvc" @@ -12162,18 +13068,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" - -[[package]] -name = "winnow" -version = "0.6.20" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" -dependencies = [ - "memchr", -] +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" @@ -12202,22 +13099,19 @@ checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" [[package]] name = "winx" -version = "0.36.3" +version = "0.36.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9643b83820c0cd246ecabe5fa454dd04ba4fa67996369466d0747472d337346" +checksum = "3f3fd376f71958b862e7afb20cfe5a22830e1963462f3a17f49d82a6c1d1f42d" dependencies = [ "bitflags 2.10.0", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] -name = "wit-bindgen-rt" -version = "0.39.0" +name = "wit-bindgen" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags 2.10.0", -] +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "wit-component" @@ -12356,17 +13250,11 @@ dependencies = [ "wast 35.0.2", ] -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" [[package]] name = "wyz" @@ -12379,13 +13267,12 @@ dependencies = [ [[package]] name = "xattr" -version = "1.3.1" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" dependencies = [ "libc", - "linux-raw-sys 0.4.14", - "rustix 0.38.40", + "rustix 1.1.2", ] [[package]] @@ -12423,26 +13310,49 @@ checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] name = "yoke" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" dependencies = [ "serde", "stable_deref_trait", - "yoke-derive", + "yoke-derive 0.7.5", + "zerofrom", +] + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive 0.8.1", "zerofrom", ] [[package]] name = "yoke-derive" -version = "0.7.4" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", + "synstructure 0.13.2", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", "syn 2.0.108", - "synstructure 0.13.1", + "synstructure 0.13.2", ] [[package]] @@ -12462,7 +13372,7 @@ dependencies = [ "async-trait", "blocking", "enumflags2", - "event-listener 5.3.1", + "event-listener 5.4.1", "futures-core", "futures-sink", "futures-util", @@ -12509,19 +13419,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.35" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" dependencies = [ - "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.35" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", @@ -12530,47 +13439,72 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", "syn 2.0.108", - "synstructure 0.13.1", + "synstructure 0.13.2", ] [[package]] name = "zeroize" -version = "1.8.1" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke 0.8.1", + "zerofrom", +] [[package]] name = "zerovec" -version = "0.10.4" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" dependencies = [ - "yoke", + "yoke 0.8.1", "zerofrom", "zerovec-derive", ] [[package]] name = "zerovec-derive" -version = "0.10.3" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", @@ -12594,27 +13528,27 @@ dependencies = [ [[package]] name = "zstd" -version = "0.13.2" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "7.2.1" +version = "7.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.13+zstd.1.5.6" +version = "2.0.16+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" dependencies = [ "cc", "pkg-config", diff --git a/Cargo.toml b/Cargo.toml index 8a6bd78017..baf5cb6345 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -85,6 +85,7 @@ openssl = { version = "0.10" } anyhow = { workspace = true, features = ["backtrace"] } conformance = { path = "tests/conformance-tests" } conformance-tests = { workspace = true } +fake-opentelemetry-collector = "0.26" hex = "0.4" http-body-util = { workspace = true } hyper = { workspace = true } @@ -145,6 +146,10 @@ hyper-util = { version = "0.1", features = ["tokio"] } indexmap = "2" itertools = "0.14" lazy_static = "1.5" +opentelemetry = "0.28" +# The default `reqwest-blocking-client` causes a runtime panic +opentelemetry-otlp = { version = "0.28", default-features = false, features = ["http-proto", "reqwest-client", "logs"]} +opentelemetry_sdk = {version = "0.28", features = ["experimental_metrics_periodicreader_with_async_runtime", "experimental_trace_batch_span_processor_with_async_runtime", "experimental_logs_batch_log_processor_with_async_runtime"]} path-absolutize = "3" pin-project-lite = "0.2.16" quote = "1" @@ -173,6 +178,7 @@ toml_edit = "0.22" tower-service = "0.3.3" tracing = { version = "0.1.41", features = ["log"] } url = "2.5.7" +tracing-opentelemetry = "0.29" walkdir = "2" wac-graph = "0.8.1" wasm-encoder = "0.240.0" diff --git a/crates/factor-key-value/Cargo.toml b/crates/factor-key-value/Cargo.toml index 8327737bd1..f0bdd6a2b9 100644 --- a/crates/factor-key-value/Cargo.toml +++ b/crates/factor-key-value/Cargo.toml @@ -8,6 +8,7 @@ edition = { workspace = true } anyhow = { workspace = true } serde = { workspace = true } spin-core = { path = "../core" } +spin-factor-otel = { path = "../factor-otel" } spin-factors = { path = "../factors" } spin-locked-app = { path = "../locked-app" } spin-resource-table = { path = "../table" } diff --git a/crates/factor-key-value/src/host.rs b/crates/factor-key-value/src/host.rs index ada4ece9b2..a7aef7005c 100644 --- a/crates/factor-key-value/src/host.rs +++ b/crates/factor-key-value/src/host.rs @@ -1,6 +1,7 @@ use super::{Cas, SwapError}; use anyhow::{Context, Result}; use spin_core::{async_trait, wasmtime::component::Resource}; +use spin_factor_otel::OtelContext; use spin_resource_table::Table; use spin_telemetry::traces::{self, Blame}; use spin_world::v2::key_value; @@ -49,23 +50,26 @@ pub struct KeyValueDispatch { manager: Arc, stores: Table>, compare_and_swaps: Table>, + otel_context: Option, } impl KeyValueDispatch { pub fn new(allowed_stores: HashSet, manager: Arc) -> Self { - Self::new_with_capacity(allowed_stores, manager, DEFAULT_STORE_TABLE_CAPACITY) + Self::new_with_capacity(allowed_stores, manager, DEFAULT_STORE_TABLE_CAPACITY, None) } pub fn new_with_capacity( allowed_stores: HashSet, manager: Arc, capacity: u32, + otel_context: Option, ) -> Self { Self { allowed_stores, manager, stores: Table::new(capacity), compare_and_swaps: Table::new(capacity), + otel_context, } } @@ -113,6 +117,9 @@ impl key_value::Host for KeyValueDispatch {} impl key_value::HostStore for KeyValueDispatch { #[instrument(name = "spin_key_value.open", skip(self), err, fields(otel.kind = "client", kv.backend=self.manager.summary(&name).unwrap_or("unknown".to_string())))] async fn open(&mut self, name: String) -> Result, Error>> { + if let Some(otel_context) = self.otel_context.as_ref() { + otel_context.reparent_tracing_span() + } Ok(async { if self.allowed_stores.contains(&name) { let store = self.manager.get(&name).await?; @@ -135,6 +142,9 @@ impl key_value::HostStore for KeyValueDispatch { store: Resource, key: String, ) -> Result>, Error>> { + if let Some(otel_context) = self.otel_context.as_ref() { + otel_context.reparent_tracing_span() + } let store = self.get_store(store)?; Ok(store.get(&key).await.map_err(track_error_on_span)) } @@ -146,6 +156,9 @@ impl key_value::HostStore for KeyValueDispatch { key: String, value: Vec, ) -> Result> { + if let Some(otel_context) = self.otel_context.as_ref() { + otel_context.reparent_tracing_span() + } let store = self.get_store(store)?; Ok(store.set(&key, &value).await.map_err(track_error_on_span)) } @@ -156,6 +169,9 @@ impl key_value::HostStore for KeyValueDispatch { store: Resource, key: String, ) -> Result> { + if let Some(otel_context) = self.otel_context.as_ref() { + otel_context.reparent_tracing_span() + } let store = self.get_store(store)?; Ok(store.delete(&key).await.map_err(track_error_on_span)) } @@ -166,6 +182,9 @@ impl key_value::HostStore for KeyValueDispatch { store: Resource, key: String, ) -> Result> { + if let Some(otel_context) = self.otel_context.as_ref() { + otel_context.reparent_tracing_span() + } let store = self.get_store(store)?; Ok(store.exists(&key).await.map_err(track_error_on_span)) } @@ -175,6 +194,9 @@ impl key_value::HostStore for KeyValueDispatch { &mut self, store: Resource, ) -> Result, Error>> { + if let Some(otel_context) = self.otel_context.as_ref() { + otel_context.reparent_tracing_span() + } let store = self.get_store(store)?; Ok(store.get_keys().await.map_err(track_error_on_span)) } diff --git a/crates/factor-key-value/src/lib.rs b/crates/factor-key-value/src/lib.rs index 792ea18b92..62929a75ff 100644 --- a/crates/factor-key-value/src/lib.rs +++ b/crates/factor-key-value/src/lib.rs @@ -8,6 +8,7 @@ use std::{ }; use anyhow::ensure; +use spin_factor_otel::OtelContext; use spin_factors::{ ConfigureAppContext, Factor, FactorData, FactorInstanceBuilder, InitContext, PrepareContext, RuntimeFactors, @@ -87,7 +88,7 @@ impl Factor for KeyValueFactor { fn prepare( &self, - ctx: PrepareContext, + mut ctx: PrepareContext, ) -> anyhow::Result { let app_state = ctx.app_state(); let allowed_stores = app_state @@ -95,9 +96,11 @@ impl Factor for KeyValueFactor { .get(ctx.app_component().id()) .expect("component should be in component_stores") .clone(); + let otel_context = OtelContext::from_prepare_context(&mut ctx)?; Ok(InstanceBuilder { store_manager: app_state.store_manager.clone(), allowed_stores, + otel_context, }) } } @@ -177,6 +180,7 @@ pub struct InstanceBuilder { store_manager: Arc, /// The allowed stores for this component instance. allowed_stores: HashSet, + otel_context: OtelContext, } impl FactorInstanceBuilder for InstanceBuilder { @@ -186,11 +190,13 @@ impl FactorInstanceBuilder for InstanceBuilder { let Self { store_manager, allowed_stores, + otel_context, } = self; Ok(KeyValueDispatch::new_with_capacity( allowed_stores, store_manager, u32::MAX, + Some(otel_context), )) } } diff --git a/crates/factor-llm/Cargo.toml b/crates/factor-llm/Cargo.toml index c43a7bbd6c..61121c6a49 100644 --- a/crates/factor-llm/Cargo.toml +++ b/crates/factor-llm/Cargo.toml @@ -17,6 +17,7 @@ llm-cublas = ["llm", "spin-llm-local/cublas"] anyhow = { workspace = true } async-trait = { workspace = true } serde = { workspace = true } +spin-factor-otel = { path = "../factor-otel" } spin-factors = { path = "../factors" } spin-llm-local = { path = "../llm-local", optional = true } spin-llm-remote-http = { path = "../llm-remote-http" } diff --git a/crates/factor-llm/src/host.rs b/crates/factor-llm/src/host.rs index 63a5525146..61c49b5313 100644 --- a/crates/factor-llm/src/host.rs +++ b/crates/factor-llm/src/host.rs @@ -13,6 +13,8 @@ impl v2::Host for InstanceState { prompt: String, params: Option, ) -> Result { + self.otel_context.reparent_tracing_span(); + if !self.allowed_models.contains(&model) { return Err(access_denied_error(&model)); } @@ -40,6 +42,8 @@ impl v2::Host for InstanceState { model: v1::EmbeddingModel, data: Vec, ) -> Result { + self.otel_context.reparent_tracing_span(); + if !self.allowed_models.contains(&model) { return Err(access_denied_error(&model)); } diff --git a/crates/factor-llm/src/lib.rs b/crates/factor-llm/src/lib.rs index 4f43feac68..b3e5c6a700 100644 --- a/crates/factor-llm/src/lib.rs +++ b/crates/factor-llm/src/lib.rs @@ -5,6 +5,7 @@ use std::collections::{HashMap, HashSet}; use std::sync::Arc; use async_trait::async_trait; +use spin_factor_otel::OtelContext; use spin_factors::{ ConfigureAppContext, Factor, FactorData, PrepareContext, RuntimeFactors, SelfInstanceBuilder, }; @@ -73,7 +74,7 @@ impl Factor for LlmFactor { fn prepare( &self, - ctx: PrepareContext, + mut ctx: PrepareContext, ) -> anyhow::Result { let allowed_models = ctx .app_state() @@ -82,10 +83,12 @@ impl Factor for LlmFactor { .cloned() .unwrap_or_default(); let engine = ctx.app_state().engine.clone(); + let otel_context = OtelContext::from_prepare_context(&mut ctx)?; Ok(InstanceState { engine, allowed_models, + otel_context, }) } } @@ -100,6 +103,7 @@ pub struct AppState { pub struct InstanceState { engine: Arc>, pub allowed_models: Arc>, + otel_context: OtelContext, } /// The runtime configuration for the LLM factor. diff --git a/crates/factor-otel/Cargo.toml b/crates/factor-otel/Cargo.toml new file mode 100644 index 0000000000..1dcdb98c82 --- /dev/null +++ b/crates/factor-otel/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "spin-factor-otel" +version = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } + +[dependencies] +anyhow = { workspace = true } +indexmap = "2.2.6" +opentelemetry = { workspace = true } +opentelemetry_sdk = { workspace = true } +opentelemetry-otlp = { workspace = true } +spin-core = { path = "../core" } +spin-factors = { path = "../factors" } +spin-resource-table = { path = "../table" } +spin-telemetry = { path = "../telemetry" } +spin-world = { path = "../world" } +tracing = { workspace = true } +tracing-opentelemetry = { workspace = true } + +[dev-dependencies] +toml = "0.5" + +[lints] +workspace = true diff --git a/crates/factor-otel/src/host.rs b/crates/factor-otel/src/host.rs new file mode 100644 index 0000000000..8ece27d5b1 --- /dev/null +++ b/crates/factor-otel/src/host.rs @@ -0,0 +1,87 @@ +use crate::InstanceState; +use anyhow::anyhow; +use anyhow::Result; +use opentelemetry::trace::TraceContextExt; +use opentelemetry_sdk::error::OTelSdkError; +use opentelemetry_sdk::metrics::exporter::PushMetricExporter; +use opentelemetry_sdk::trace::SpanProcessor; +use spin_world::wasi; +use tracing_opentelemetry::OpenTelemetrySpanExt; + +impl wasi::otel::tracing::Host for InstanceState { + async fn on_start(&mut self, context: wasi::otel::tracing::SpanContext) -> Result<()> { + let mut state = self.state.write().unwrap(); + + // Before we do anything make sure we track the original host span ID for reparenting + if state.original_host_span_id.is_none() { + state.original_host_span_id = Some( + tracing::Span::current() + .context() + .span() + .span_context() + .span_id(), + ); + } + + // Track the guest spans context in our ordered map + let span_context: opentelemetry::trace::SpanContext = context.into(); + state + .guest_span_contexts + .insert(span_context.span_id(), span_context); + + Ok(()) + } + + async fn on_end(&mut self, span_data: wasi::otel::tracing::SpanData) -> Result<()> { + let mut state = self.state.write().unwrap(); + + let span_context: opentelemetry::trace::SpanContext = span_data.span_context.clone().into(); + let span_id: opentelemetry::trace::SpanId = span_context.span_id(); + + if state.guest_span_contexts.shift_remove(&span_id).is_none() { + Err(anyhow!("Trying to end a span that was not started"))?; + } + + self.span_processor.on_end(span_data.into()); + + Ok(()) + } + + async fn outer_span_context(&mut self) -> Result { + Ok(tracing::Span::current() + .context() + .span() + .span_context() + .clone() + .into()) + } +} + +impl wasi::otel::metrics::Host for InstanceState { + async fn export( + &mut self, + metrics: wasi::otel::metrics::ResourceMetrics, + ) -> spin_core::wasmtime::Result> { + let mut rm: opentelemetry_sdk::metrics::data::ResourceMetrics = metrics.into(); + match self.metric_exporter.export(&mut rm).await { + Ok(_) => Ok(Ok(())), + Err(e) => match e { + OTelSdkError::AlreadyShutdown => { + let msg = "Shutdown has already been invoked"; + tracing::error!(msg); + Ok(Err(msg.to_string())) + } + OTelSdkError::InternalFailure(e) => { + let detailed_msg = format!("Internal failure: {}", e); + tracing::error!(detailed_msg); + Ok(Err("Internal failure.".to_string())) + } + OTelSdkError::Timeout(d) => { + let detailed_msg = format!("Operation timed out after {} seconds", d.as_secs()); + tracing::error!(detailed_msg); + Ok(Err("Operation timed out.".to_string())) + } + }, + } + } +} diff --git a/crates/factor-otel/src/lib.rs b/crates/factor-otel/src/lib.rs new file mode 100644 index 0000000000..c224ce3730 --- /dev/null +++ b/crates/factor-otel/src/lib.rs @@ -0,0 +1,213 @@ +mod host; + +use anyhow::bail; +use indexmap::IndexMap; +use opentelemetry::{ + trace::{SpanContext, SpanId, TraceContextExt}, + Context, +}; +use opentelemetry_otlp::MetricExporter; +use opentelemetry_sdk::{ + resource::{EnvResourceDetector, ResourceDetector, TelemetryResourceDetector}, + runtime::Tokio, + trace::{span_processor_with_async_runtime::BatchSpanProcessor, SpanProcessor}, + Resource, +}; +use spin_factors::{Factor, FactorData, PrepareContext, RuntimeFactors, SelfInstanceBuilder}; +use spin_telemetry::{detector::SpinResourceDetector, env::OtlpProtocol}; +use std::sync::{Arc, RwLock}; +use tracing_opentelemetry::OpenTelemetrySpanExt; + +pub struct OtelFactor { + span_processor: Arc>, + metric_exporter: Arc, +} + +impl Factor for OtelFactor { + type RuntimeConfig = (); + type AppState = (); + type InstanceBuilder = InstanceState; + + fn init(&mut self, ctx: &mut impl spin_factors::InitContext) -> anyhow::Result<()> { + ctx.link_bindings(spin_world::wasi::otel::tracing::add_to_linker::<_, FactorData>)?; + ctx.link_bindings(spin_world::wasi::otel::metrics::add_to_linker::<_, FactorData>)?; + Ok(()) + } + + fn configure_app( + &self, + _ctx: spin_factors::ConfigureAppContext, + ) -> anyhow::Result { + Ok(()) + } + + fn prepare( + &self, + _: spin_factors::PrepareContext, + ) -> anyhow::Result { + Ok(InstanceState { + state: Arc::new(RwLock::new(State { + guest_span_contexts: Default::default(), + original_host_span_id: None, + })), + span_processor: self.span_processor.clone(), + metric_exporter: self.metric_exporter.clone(), + }) + } +} + +impl OtelFactor { + pub fn new() -> anyhow::Result { + // This is a hack b/c we know the version of this crate will be the same as the version of Spin + let spin_version = env!("CARGO_PKG_VERSION").to_string(); + + let resource = Resource::builder() + .with_detectors(&[ + // Set service.name from env OTEL_SERVICE_NAME > env OTEL_RESOURCE_ATTRIBUTES > spin + // Set service.version from Spin metadata + Box::new(SpinResourceDetector::new(spin_version)) as Box, + // Sets fields from env OTEL_RESOURCE_ATTRIBUTES + Box::new(EnvResourceDetector::new()), + // Sets telemetry.sdk{name, language, version} + Box::new(TelemetryResourceDetector), + ]) + .build(); + + // This will configure the exporter based on the OTEL_EXPORTER_* environment variables. + let span_exporter = match OtlpProtocol::traces_protocol_from_env() { + OtlpProtocol::Grpc => opentelemetry_otlp::SpanExporter::builder() + .with_tonic() + .build()?, + OtlpProtocol::HttpProtobuf => opentelemetry_otlp::SpanExporter::builder() + .with_http() + .build()?, + OtlpProtocol::HttpJson => bail!("http/json OTLP protocol is not supported"), + }; + + let mut span_processor = BatchSpanProcessor::builder(span_exporter, Tokio).build(); + + span_processor.set_resource(&resource); + + let metric_exporter = match OtlpProtocol::metrics_protocol_from_env() { + OtlpProtocol::Grpc => opentelemetry_otlp::MetricExporter::builder() + .with_tonic() + .build()?, + OtlpProtocol::HttpProtobuf => opentelemetry_otlp::MetricExporter::builder() + .with_http() + .build()?, + OtlpProtocol::HttpJson => bail!("http/json OTLP protocol is not supported"), + }; + + Ok(Self { + span_processor: Arc::new(span_processor), + metric_exporter: Arc::new(metric_exporter), + }) + } +} + +pub struct InstanceState { + pub(crate) state: Arc>, + pub(crate) span_processor: Arc>, + pub(crate) metric_exporter: Arc, +} + +impl SelfInstanceBuilder for InstanceState {} + +/// Internal state of the OtelFactor instance state. +/// +/// This data lives here rather than directly on InstanceState so that we can have multiple things +/// take Arc references to it. +pub(crate) struct State { + /// An order-preserved mapping between immutable [SpanId]s of guest created spans and their + /// corresponding [SpanContext]. + /// + /// The topmost [SpanId] is the last active span. When a span is ended it is removed from this + /// map (regardless of whether it is the active span) and all other spans are shifted back to + /// retain relative order. + pub(crate) guest_span_contexts: IndexMap, + + /// Id of the last span emitted from within the host before entering the guest. + /// + /// We use this to avoid accidentally reparenting the original host span as a child of a guest + /// span. + pub(crate) original_host_span_id: Option, +} + +/// Manages access to the OtelFactor state for the purpose of maintaining proper span +/// parent/child relationships when WASI Otel spans are being created. +pub struct OtelContext { + pub(crate) state: Option>>, +} + +impl OtelContext { + /// Creates an [`OtelContext`] from a [`PrepareContext`]. + /// + /// If [`RuntimeFactors`] does not contain an [`OtelFactor`], then calling + /// [`OtelContext::reparent_tracing_span`] will be a no-op. + pub fn from_prepare_context( + prepare_context: &mut PrepareContext, + ) -> anyhow::Result { + let state = match prepare_context.instance_builder::() { + Ok(instance_state) => Some(instance_state.state.clone()), + Err(spin_factors::Error::NoSuchFactor(_)) => None, + Err(e) => return Err(e.into()), + }; + Ok(Self { state }) + } + + /// Reparents the current [tracing] span to be a child of the last active guest span. + /// + /// The otel factor enables guests to emit spans that should be part of the same trace as the + /// host is producing for a request. Below is an example trace. A request is made to an app, a + /// guest span is created and then the host is re-entered to fetch a key value. + /// + /// ```text + /// | GET /... _________________________________| + /// | execute_wasm_component foo ___________| + /// | my_guest_span ___________________| + /// | spin_key_value.get | + /// ``` + /// + /// Setting the guest spans parent as the host is enabled through current_span_context. + /// However, the more difficult task is having the host factor spans be children of the guest + /// span. [`OtelContext::reparent_tracing_span`] handles this by reparenting the current span to + /// be a child of the last active guest span (which is tracked internally in the otel factor). + /// + /// Note that if the otel factor is not in your [`RuntimeFactors`] than this is effectively a + /// no-op. + /// + /// This MUST only be called from a factor host implementation function that is instrumented. + /// + /// This MUST be called at the very start of the function before any awaits. + pub fn reparent_tracing_span(&self) { + // If state is None then we want to return early b/c the factor doesn't depend on the + // Otel factor and therefore there is nothing to do + let state = if let Some(state) = self.state.as_ref() { + state.read().unwrap() + } else { + return; + }; + + // If there are no active guest spans then there is nothing to do + let Some((_, active_span_context)) = state.guest_span_contexts.last() else { + return; + }; + + // Ensure that we are not reparenting the original host span + if let Some(original_host_span_id) = state.original_host_span_id { + if tracing::Span::current() + .context() + .span() + .span_context() + .span_id() + .eq(&original_host_span_id) + { + panic!("Incorrectly attempting to reparent the original host span. Likely `reparent_tracing_span` was called in an incorrect location.") + } + } + + // Now reparent the current span to the last active guest span + let parent_context = Context::new().with_remote_span_context(active_span_context.clone()); + tracing::Span::current().set_parent(parent_context); + } +} diff --git a/crates/factor-outbound-http/Cargo.toml b/crates/factor-outbound-http/Cargo.toml index 6e6d14cf01..008d1c6a16 100644 --- a/crates/factor-outbound-http/Cargo.toml +++ b/crates/factor-outbound-http/Cargo.toml @@ -16,6 +16,7 @@ pin-project-lite = { workspace = true } reqwest = { workspace = true, features = ["gzip"] } rustls = { workspace = true } serde = { workspace = true } +spin-factor-otel = { path = "../factor-otel" } spin-factor-outbound-networking = { path = "../factor-outbound-networking" } spin-factors = { path = "../factors" } spin-telemetry = { path = "../telemetry" } diff --git a/crates/factor-outbound-http/src/lib.rs b/crates/factor-outbound-http/src/lib.rs index 1324250110..0f75d87b06 100644 --- a/crates/factor-outbound-http/src/lib.rs +++ b/crates/factor-outbound-http/src/lib.rs @@ -14,6 +14,7 @@ use http::{ }; use intercept::OutboundHttpInterceptor; use runtime_config::RuntimeConfig; +use spin_factor_otel::OtelContext; use spin_factor_outbound_networking::{ config::{allowed_hosts::OutboundAllowedHosts, blocked_networks::BlockedNetworks}, ComponentTlsClientConfigs, OutboundNetworkingFactor, @@ -74,6 +75,7 @@ impl Factor for OutboundHttpFactor { let allowed_hosts = outbound_networking.allowed_hosts(); let blocked_networks = outbound_networking.blocked_networks(); let component_tls_configs = outbound_networking.component_tls_configs(); + let otel_context = OtelContext::from_prepare_context(&mut ctx)?; Ok(InstanceState { wasi_http_ctx: WasiHttpCtx::new(), allowed_hosts, @@ -88,6 +90,7 @@ impl Factor for OutboundHttpFactor { .app_state() .concurrent_outbound_connections_semaphore .clone(), + otel_context, }) } } @@ -114,6 +117,8 @@ pub struct InstanceState { connection_pooling_enabled: bool, /// A semaphore to limit the number of concurrent outbound connections. concurrent_outbound_connections_semaphore: Option>, + /// Manages access to the OtelFactor state. + otel_context: OtelContext, } impl InstanceState { diff --git a/crates/factor-outbound-http/src/spin.rs b/crates/factor-outbound-http/src/spin.rs index 08d725632c..445c1075fb 100644 --- a/crates/factor-outbound-http/src/spin.rs +++ b/crates/factor-outbound-http/src/spin.rs @@ -15,6 +15,8 @@ impl spin_http::Host for crate::InstanceState { fields(otel.kind = "client", url.full = Empty, http.request.method = Empty, http.response.status_code = Empty, otel.name = Empty, server.address = Empty, server.port = Empty))] async fn send_request(&mut self, req: Request) -> Result { + self.otel_context.reparent_tracing_span(); + let span = Span::current(); record_request_fields(&span, &req); diff --git a/crates/factor-outbound-mqtt/Cargo.toml b/crates/factor-outbound-mqtt/Cargo.toml index bd5222881c..962b5efb0a 100644 --- a/crates/factor-outbound-mqtt/Cargo.toml +++ b/crates/factor-outbound-mqtt/Cargo.toml @@ -8,6 +8,7 @@ edition = { workspace = true } anyhow = { workspace = true } rumqttc = { version = "0.24", features = ["url"] } spin-core = { path = "../core" } +spin-factor-otel = { path = "../factor-otel" } spin-factor-outbound-networking = { path = "../factor-outbound-networking" } spin-factors = { path = "../factors" } spin-resource-table = { path = "../table" } diff --git a/crates/factor-outbound-mqtt/src/host.rs b/crates/factor-outbound-mqtt/src/host.rs index 28ca42885d..53cb6a9830 100644 --- a/crates/factor-outbound-mqtt/src/host.rs +++ b/crates/factor-outbound-mqtt/src/host.rs @@ -4,6 +4,7 @@ use anyhow::Result; use spin_core::{async_trait, wasmtime::component::Resource}; use spin_factor_outbound_networking::config::allowed_hosts::OutboundAllowedHosts; use spin_world::v2::mqtt::{self as v2, Connection, Error, Qos}; +use spin_factor_otel::OtelContext; use tracing::{instrument, Level}; use crate::ClientCreator; @@ -12,14 +13,20 @@ pub struct InstanceState { allowed_hosts: OutboundAllowedHosts, connections: spin_resource_table::Table>, create_client: Arc, + otel_context: OtelContext, } impl InstanceState { - pub fn new(allowed_hosts: OutboundAllowedHosts, create_client: Arc) -> Self { + pub fn new( + allowed_hosts: OutboundAllowedHosts, + create_client: Arc, + otel_context: OtelContext, + ) -> Self { Self { allowed_hosts, create_client, connections: spin_resource_table::Table::new(1024), + otel_context, } } } @@ -72,6 +79,8 @@ impl v2::HostConnection for InstanceState { password: String, keep_alive_interval: u64, ) -> Result, Error> { + self.otel_context.reparent_tracing_span(); + if !self .is_address_allowed(&address) .await @@ -105,6 +114,8 @@ impl v2::HostConnection for InstanceState { payload: Vec, qos: Qos, ) -> Result<(), Error> { + self.otel_context.reparent_tracing_span(); + let conn = self.get_conn(connection).await.map_err(other_error)?; conn.publish_bytes(topic, qos, payload).await?; diff --git a/crates/factor-outbound-mqtt/src/lib.rs b/crates/factor-outbound-mqtt/src/lib.rs index a5de2696b9..250aa09d5c 100644 --- a/crates/factor-outbound-mqtt/src/lib.rs +++ b/crates/factor-outbound-mqtt/src/lib.rs @@ -7,6 +7,7 @@ use host::other_error; use host::InstanceState; use rumqttc::{AsyncClient, Event, Incoming, Outgoing, QoS}; use spin_core::async_trait; +use spin_factor_otel::OtelContext; use spin_factor_outbound_networking::OutboundNetworkingFactor; use spin_factors::{ ConfigureAppContext, Factor, FactorData, PrepareContext, RuntimeFactors, SelfInstanceBuilder, @@ -50,9 +51,12 @@ impl Factor for OutboundMqttFactor { let allowed_hosts = ctx .instance_builder::()? .allowed_hosts(); + let otel_context = OtelContext::from_prepare_context(&mut ctx)?; + Ok(InstanceState::new( allowed_hosts, self.create_client.clone(), + otel_context, )) } } diff --git a/crates/factor-outbound-mysql/Cargo.toml b/crates/factor-outbound-mysql/Cargo.toml index 4ae73f9fbc..ed6a0b01a0 100644 --- a/crates/factor-outbound-mysql/Cargo.toml +++ b/crates/factor-outbound-mysql/Cargo.toml @@ -14,6 +14,7 @@ mysql_async = { version = "0.35", default-features = false, features = [ "native-tls-tls", ] } spin-core = { path = "../core" } +spin-factor-otel = { path = "../factor-otel" } spin-factor-outbound-networking = { path = "../factor-outbound-networking" } spin-factors = { path = "../factors" } spin-resource-table = { path = "../table" } diff --git a/crates/factor-outbound-mysql/src/host.rs b/crates/factor-outbound-mysql/src/host.rs index e562d4d741..ca113206aa 100644 --- a/crates/factor-outbound-mysql/src/host.rs +++ b/crates/factor-outbound-mysql/src/host.rs @@ -38,6 +38,7 @@ impl v2::Host for InstanceState {} impl v2::HostConnection for InstanceState { #[instrument(name = "spin_outbound_mysql.open", skip(self, address), err(level = Level::INFO), fields(otel.kind = "client", db.system = "mysql", db.address = Empty, server.port = Empty, db.namespace = Empty))] async fn open(&mut self, address: String) -> Result, v2::Error> { + self.otel_context.reparent_tracing_span(); spin_factor_outbound_networking::record_address_fields(&address); if !self @@ -59,6 +60,7 @@ impl v2::HostConnection for InstanceState { statement: String, params: Vec, ) -> Result<(), v2::Error> { + self.otel_context.reparent_tracing_span(); self.get_client(connection) .await? .execute(statement, params) @@ -72,6 +74,7 @@ impl v2::HostConnection for InstanceState { statement: String, params: Vec, ) -> Result { + self.otel_context.reparent_tracing_span(); self.get_client(connection) .await? .query(statement, params) diff --git a/crates/factor-outbound-mysql/src/lib.rs b/crates/factor-outbound-mysql/src/lib.rs index fbe213bf9e..e1bf9aabdb 100644 --- a/crates/factor-outbound-mysql/src/lib.rs +++ b/crates/factor-outbound-mysql/src/lib.rs @@ -3,6 +3,7 @@ mod host; use client::Client; use mysql_async::Conn as MysqlClient; +use spin_factor_otel::OtelContext; use spin_factor_outbound_networking::{ config::allowed_hosts::OutboundAllowedHosts, OutboundNetworkingFactor, }; @@ -39,9 +40,12 @@ impl Factor for OutboundMysqlFactor { let allowed_hosts = ctx .instance_builder::()? .allowed_hosts(); + let otel_context = OtelContext::from_prepare_context(&mut ctx)?; + Ok(InstanceState { allowed_hosts, connections: Default::default(), + otel_context, }) } } @@ -63,6 +67,7 @@ impl OutboundMysqlFactor { pub struct InstanceState { allowed_hosts: OutboundAllowedHosts, connections: spin_resource_table::Table, + otel_context: OtelContext, } impl SelfInstanceBuilder for InstanceState {} diff --git a/crates/factor-outbound-pg/Cargo.toml b/crates/factor-outbound-pg/Cargo.toml index 6b8f32bb4c..6436d55268 100644 --- a/crates/factor-outbound-pg/Cargo.toml +++ b/crates/factor-outbound-pg/Cargo.toml @@ -16,6 +16,7 @@ postgres_range = "0.11" rust_decimal = { version = "1.37", features = ["db-tokio-postgres"] } serde_json = { workspace = true } spin-core = { path = "../core" } +spin-factor-otel = { path = "../factor-otel" } spin-factor-outbound-networking = { path = "../factor-outbound-networking" } spin-factors = { path = "../factors" } spin-resource-table = { path = "../table" } diff --git a/crates/factor-outbound-pg/src/host.rs b/crates/factor-outbound-pg/src/host.rs index 111df6f998..81dda9bbe6 100644 --- a/crates/factor-outbound-pg/src/host.rs +++ b/crates/factor-outbound-pg/src/host.rs @@ -219,6 +219,7 @@ impl v2::Host for InstanceState {} impl v2::HostConnection for InstanceState { #[instrument(name = "spin_outbound_pg.open", skip(self, address), err(level = Level::INFO), fields(otel.kind = "client", db.system = "postgresql", db.address = Empty, server.port = Empty, db.namespace = Empty))] async fn open(&mut self, address: String) -> Result, v2::Error> { + self.otel_context.reparent_tracing_span(); spin_factor_outbound_networking::record_address_fields(&address); if !self @@ -240,6 +241,8 @@ impl v2::HostConnection for InstanceState { statement: String, params: Vec, ) -> Result { + self.otel_context.reparent_tracing_span(); + Ok(self .get_client(connection) .await? @@ -254,6 +257,7 @@ impl v2::HostConnection for InstanceState { statement: String, params: Vec, ) -> Result { + self.otel_context.reparent_tracing_span(); Ok(self .get_client(connection) .await? diff --git a/crates/factor-outbound-pg/src/lib.rs b/crates/factor-outbound-pg/src/lib.rs index b3a433946e..a793271fef 100644 --- a/crates/factor-outbound-pg/src/lib.rs +++ b/crates/factor-outbound-pg/src/lib.rs @@ -4,7 +4,9 @@ mod types; use std::sync::Arc; +use client::Client; use client::ClientFactory; +use spin_factor_otel::OtelContext; use spin_factor_outbound_networking::{ config::allowed_hosts::OutboundAllowedHosts, OutboundNetworkingFactor, }; @@ -48,10 +50,13 @@ impl Factor for OutboundPgFactor { let allowed_hosts = ctx .instance_builder::()? .allowed_hosts(); + let otel_context = OtelContext::from_prepare_context(&mut ctx)?; + Ok(InstanceState { allowed_hosts, client_factory: ctx.app_state().clone(), connections: Default::default(), + otel_context, }) } } @@ -74,6 +79,7 @@ pub struct InstanceState { allowed_hosts: OutboundAllowedHosts, client_factory: Arc, connections: spin_resource_table::Table, + otel_context: OtelContext, } impl SelfInstanceBuilder for InstanceState {} diff --git a/crates/factor-outbound-redis/Cargo.toml b/crates/factor-outbound-redis/Cargo.toml index 73f5d86017..6518459d79 100644 --- a/crates/factor-outbound-redis/Cargo.toml +++ b/crates/factor-outbound-redis/Cargo.toml @@ -8,6 +8,7 @@ edition = { workspace = true } anyhow = { workspace = true } redis = { workspace = true , features = ["tokio-comp", "tokio-native-tls-comp", "aio"] } spin-core = { path = "../core" } +spin-factor-otel = { path = "../factor-otel" } spin-factor-outbound-networking = { path = "../factor-outbound-networking" } spin-factors = { path = "../factors" } spin-resource-table = { path = "../table" } diff --git a/crates/factor-outbound-redis/src/host.rs b/crates/factor-outbound-redis/src/host.rs index 5dcb0d3475..ac1c817ebb 100644 --- a/crates/factor-outbound-redis/src/host.rs +++ b/crates/factor-outbound-redis/src/host.rs @@ -5,6 +5,7 @@ use redis::io::AsyncDNSResolver; use redis::AsyncConnectionConfig; use redis::{aio::MultiplexedConnection, AsyncCommands, FromRedisValue, Value}; use spin_core::wasmtime::component::Resource; +use spin_factor_otel::OtelContext; use spin_factor_outbound_networking::config::allowed_hosts::OutboundAllowedHosts; use spin_factor_outbound_networking::config::blocked_networks::BlockedNetworks; use spin_world::v1::{redis as v1, redis_types}; @@ -18,6 +19,7 @@ pub struct InstanceState { pub allowed_hosts: OutboundAllowedHosts, pub blocked_networks: BlockedNetworks, pub connections: spin_resource_table::Table, + pub otel_context: OtelContext, } impl InstanceState { @@ -63,8 +65,7 @@ impl v2::Host for crate::InstanceState { impl v2::HostConnection for crate::InstanceState { #[instrument(name = "spin_outbound_redis.open_connection", skip(self, address), err(level = Level::INFO), fields(otel.kind = "client", db.system = "redis", db.address = Empty, server.port = Empty, db.namespace = Empty))] async fn open(&mut self, address: String) -> Result, Error> { - spin_factor_outbound_networking::record_address_fields(&address); - + self.otel_context.reparent_tracing_span(); if !self .is_address_allowed(&address) .await @@ -83,6 +84,8 @@ impl v2::HostConnection for crate::InstanceState { channel: String, payload: Vec, ) -> Result<(), Error> { + self.otel_context.reparent_tracing_span(); + let conn = self.get_conn(connection).await.map_err(other_error)?; // The `let () =` syntax is needed to suppress a warning when the result type is inferred. // You can read more about the issue here: @@ -99,6 +102,8 @@ impl v2::HostConnection for crate::InstanceState { connection: Resource, key: String, ) -> Result>, Error> { + self.otel_context.reparent_tracing_span(); + let conn = self.get_conn(connection).await.map_err(other_error)?; let value = conn.get(&key).await.map_err(other_error)?; Ok(value) @@ -111,6 +116,8 @@ impl v2::HostConnection for crate::InstanceState { key: String, value: Vec, ) -> Result<(), Error> { + self.otel_context.reparent_tracing_span(); + let conn = self.get_conn(connection).await.map_err(other_error)?; // The `let () =` syntax is needed to suppress a warning when the result type is inferred. // You can read more about the issue here: @@ -124,6 +131,8 @@ impl v2::HostConnection for crate::InstanceState { connection: Resource, key: String, ) -> Result { + self.otel_context.reparent_tracing_span(); + let conn = self.get_conn(connection).await.map_err(other_error)?; let value = conn.incr(&key, 1).await.map_err(other_error)?; Ok(value) @@ -135,6 +144,8 @@ impl v2::HostConnection for crate::InstanceState { connection: Resource, keys: Vec, ) -> Result { + self.otel_context.reparent_tracing_span(); + let conn = self.get_conn(connection).await.map_err(other_error)?; let value = conn.del(&keys).await.map_err(other_error)?; Ok(value) @@ -147,6 +158,8 @@ impl v2::HostConnection for crate::InstanceState { key: String, values: Vec, ) -> Result { + self.otel_context.reparent_tracing_span(); + let conn = self.get_conn(connection).await.map_err(other_error)?; let value = conn.sadd(&key, &values).await.map_err(|e| { if e.kind() == redis::ErrorKind::TypeError { @@ -164,6 +177,8 @@ impl v2::HostConnection for crate::InstanceState { connection: Resource, key: String, ) -> Result, Error> { + self.otel_context.reparent_tracing_span(); + let conn = self.get_conn(connection).await.map_err(other_error)?; let value = conn.smembers(&key).await.map_err(other_error)?; Ok(value) @@ -176,6 +191,8 @@ impl v2::HostConnection for crate::InstanceState { key: String, values: Vec, ) -> Result { + self.otel_context.reparent_tracing_span(); + let conn = self.get_conn(connection).await.map_err(other_error)?; let value = conn.srem(&key, &values).await.map_err(other_error)?; Ok(value) @@ -188,6 +205,8 @@ impl v2::HostConnection for crate::InstanceState { command: String, arguments: Vec, ) -> Result, Error> { + self.otel_context.reparent_tracing_span(); + let conn = self.get_conn(connection).await?; let mut cmd = redis::cmd(&command); arguments.iter().for_each(|value| match value { diff --git a/crates/factor-outbound-redis/src/lib.rs b/crates/factor-outbound-redis/src/lib.rs index 731321618a..09bf410931 100644 --- a/crates/factor-outbound-redis/src/lib.rs +++ b/crates/factor-outbound-redis/src/lib.rs @@ -1,6 +1,7 @@ mod host; use host::InstanceState; +use spin_factor_otel::OtelContext; use spin_factor_outbound_networking::OutboundNetworkingFactor; use spin_factors::{ anyhow, ConfigureAppContext, Factor, FactorData, PrepareContext, RuntimeFactors, @@ -41,11 +42,14 @@ impl Factor for OutboundRedisFactor { &self, mut ctx: PrepareContext, ) -> anyhow::Result { + let otel_context = OtelContext::from_prepare_context(&mut ctx)?; let outbound_networking = ctx.instance_builder::()?; + Ok(InstanceState { allowed_hosts: outbound_networking.allowed_hosts(), blocked_networks: outbound_networking.blocked_networks(), connections: spin_resource_table::Table::new(1024), + otel_context, }) } } diff --git a/crates/factor-sqlite/Cargo.toml b/crates/factor-sqlite/Cargo.toml index ee945ed4fa..98a6325ad7 100644 --- a/crates/factor-sqlite/Cargo.toml +++ b/crates/factor-sqlite/Cargo.toml @@ -10,6 +10,7 @@ rust-version.workspace = true [dependencies] async-trait = { workspace = true } +spin-factor-otel = { path = "../factor-otel" } spin-factors = { path = "../factors" } spin-locked-app = { path = "../locked-app" } spin-resource-table = { path = "../table" } diff --git a/crates/factor-sqlite/src/host.rs b/crates/factor-sqlite/src/host.rs index 953ee70cc4..e6ed819a54 100644 --- a/crates/factor-sqlite/src/host.rs +++ b/crates/factor-sqlite/src/host.rs @@ -1,6 +1,7 @@ use std::collections::{HashMap, HashSet}; use std::sync::Arc; +use spin_factor_otel::OtelContext; use spin_factors::wasmtime::component::Resource; use spin_factors::{anyhow, SelfInstanceBuilder}; use spin_world::spin::sqlite::sqlite as v3; @@ -17,6 +18,7 @@ pub struct InstanceState { connections: spin_resource_table::Table>, /// A map from database label to connection creators. connection_creators: HashMap>, + otel_context: OtelContext, } impl InstanceState { @@ -26,11 +28,13 @@ impl InstanceState { pub fn new( allowed_databases: Arc>, connection_creators: HashMap>, + otel_context: OtelContext, ) -> Self { Self { allowed_databases, connections: spin_resource_table::Table::new(256), connection_creators, + otel_context, } } @@ -154,6 +158,7 @@ impl v2::Host for InstanceState { impl v2::HostConnection for InstanceState { #[instrument(name = "spin_sqlite.open", skip(self), err(level = Level::INFO), fields(otel.kind = "client", db.system = "sqlite", sqlite.backend = Empty))] async fn open(&mut self, database: String) -> Result, v2::Error> { + self.otel_context.reparent_tracing_span(); self.open_impl(database).await.map_err(to_v2_error) } @@ -164,6 +169,7 @@ impl v2::HostConnection for InstanceState { query: String, parameters: Vec, ) -> Result { + self.otel_context.reparent_tracing_span(); self.execute_impl( connection, query, diff --git a/crates/factor-sqlite/src/lib.rs b/crates/factor-sqlite/src/lib.rs index 9fafdb796a..ae3b4686e0 100644 --- a/crates/factor-sqlite/src/lib.rs +++ b/crates/factor-sqlite/src/lib.rs @@ -8,6 +8,7 @@ use host::InstanceState; use async_trait::async_trait; use spin_factors::{anyhow, Factor, FactorData}; +use spin_factor_otel::OtelContext; use spin_locked_app::MetadataKey; use spin_world::spin::sqlite::sqlite as v3; use spin_world::v1::sqlite as v1; @@ -74,7 +75,7 @@ impl Factor for SqliteFactor { fn prepare( &self, - ctx: spin_factors::PrepareContext, + mut ctx: spin_factors::PrepareContext, ) -> spin_factors::anyhow::Result { let allowed_databases = ctx .app_state() @@ -82,9 +83,11 @@ impl Factor for SqliteFactor { .get(ctx.app_component().id()) .cloned() .unwrap_or_default(); + let otel_context = OtelContext::from_prepare_context(&mut ctx)?; Ok(InstanceState::new( allowed_databases, ctx.app_state().connection_creators.clone(), + otel_context, )) } } diff --git a/crates/factor-variables/Cargo.toml b/crates/factor-variables/Cargo.toml index 4a1a76f83e..c24c6ebb7c 100644 --- a/crates/factor-variables/Cargo.toml +++ b/crates/factor-variables/Cargo.toml @@ -6,6 +6,7 @@ edition = { workspace = true } [dependencies] spin-expressions = { path = "../expressions" } +spin-factor-otel = { path = "../factor-otel" } spin-factors = { path = "../factors" } spin-telemetry = { path = "../telemetry" } spin-world = { path = "../world" } diff --git a/crates/factor-variables/src/host.rs b/crates/factor-variables/src/host.rs index 31706af0ca..784cebd280 100644 --- a/crates/factor-variables/src/host.rs +++ b/crates/factor-variables/src/host.rs @@ -8,6 +8,7 @@ use crate::InstanceState; impl variables::Host for InstanceState { #[instrument(name = "spin_variables.get", skip(self), fields(otel.kind = "client"))] async fn get(&mut self, key: String) -> Result { + self.otel_context.reparent_tracing_span(); let key = spin_expressions::Key::new(&key).map_err(expressions_to_variables_err)?; self.expression_resolver .resolve(&self.component_id, key) diff --git a/crates/factor-variables/src/lib.rs b/crates/factor-variables/src/lib.rs index b75824b9ba..43d489ecae 100644 --- a/crates/factor-variables/src/lib.rs +++ b/crates/factor-variables/src/lib.rs @@ -5,6 +5,7 @@ use std::sync::Arc; use runtime_config::RuntimeConfig; use spin_expressions::{ProviderResolver as ExpressionResolver, Template}; +use spin_factor_otel::OtelContext; use spin_factors::{ anyhow, ConfigureAppContext, Factor, FactorData, InitContext, PrepareContext, RuntimeFactors, SelfInstanceBuilder, @@ -62,13 +63,15 @@ impl Factor for VariablesFactor { fn prepare( &self, - ctx: PrepareContext, + mut ctx: PrepareContext, ) -> anyhow::Result { let component_id = ctx.app_component().id().to_string(); let expression_resolver = ctx.app_state().expression_resolver.clone(); + let otel_context = OtelContext::from_prepare_context(&mut ctx)?; Ok(InstanceState { component_id, expression_resolver, + otel_context, }) } } @@ -94,6 +97,7 @@ impl AppState { pub struct InstanceState { component_id: String, expression_resolver: Arc, + otel_context: OtelContext, } impl InstanceState { diff --git a/crates/runtime-config/Cargo.toml b/crates/runtime-config/Cargo.toml index 5a8aa05ad0..1b08cda8f7 100644 --- a/crates/runtime-config/Cargo.toml +++ b/crates/runtime-config/Cargo.toml @@ -15,6 +15,7 @@ spin-common = { path = "../common" } spin-expressions = { path = "../expressions" } spin-factor-key-value = { path = "../factor-key-value" } spin-factor-llm = { path = "../factor-llm" } +spin-factor-otel = { path = "../factor-otel" } spin-factor-outbound-http = { path = "../factor-outbound-http" } spin-factor-outbound-mqtt = { path = "../factor-outbound-mqtt" } spin-factor-outbound-mysql = { path = "../factor-outbound-mysql" } diff --git a/crates/runtime-config/src/lib.rs b/crates/runtime-config/src/lib.rs index 4c0d6f4b1f..fedd1b1512 100644 --- a/crates/runtime-config/src/lib.rs +++ b/crates/runtime-config/src/lib.rs @@ -5,6 +5,7 @@ use spin_common::ui::quoted_path; use spin_factor_key_value::runtime_config::spin::{self as key_value}; use spin_factor_key_value::KeyValueFactor; use spin_factor_llm::{spin as llm, LlmFactor}; +use spin_factor_otel::OtelFactor; use spin_factor_outbound_http::OutboundHttpFactor; use spin_factor_outbound_mqtt::OutboundMqttFactor; use spin_factor_outbound_mysql::OutboundMysqlFactor; @@ -398,6 +399,12 @@ impl FactorRuntimeConfigSource for TomlRuntimeConfigSource<'_, '_> } } +impl FactorRuntimeConfigSource for TomlRuntimeConfigSource<'_, '_> { + fn get_runtime_config(&mut self) -> anyhow::Result> { + Ok(None) + } +} + impl RuntimeConfigSourceFinalizer for TomlRuntimeConfigSource<'_, '_> { fn finalize(&mut self) -> anyhow::Result<()> { Ok(self.toml.validate_all_keys_used()?) diff --git a/crates/runtime-factors/Cargo.toml b/crates/runtime-factors/Cargo.toml index 257c3f36fa..4e36fccca2 100644 --- a/crates/runtime-factors/Cargo.toml +++ b/crates/runtime-factors/Cargo.toml @@ -19,6 +19,7 @@ clap = { workspace = true, features = ["derive", "env"] } spin-common = { path = "../common" } spin-factor-key-value = { path = "../factor-key-value" } spin-factor-llm = { path = "../factor-llm" } +spin-factor-otel = { path = "../factor-otel" } spin-factor-outbound-http = { path = "../factor-outbound-http" } spin-factor-outbound-mqtt = { path = "../factor-outbound-mqtt" } spin-factor-outbound-mysql = { path = "../factor-outbound-mysql" } diff --git a/crates/runtime-factors/src/lib.rs b/crates/runtime-factors/src/lib.rs index 4e2ef09d02..b1865e444c 100644 --- a/crates/runtime-factors/src/lib.rs +++ b/crates/runtime-factors/src/lib.rs @@ -10,6 +10,7 @@ use anyhow::Context as _; use spin_common::arg_parser::parse_kv; use spin_factor_key_value::KeyValueFactor; use spin_factor_llm::LlmFactor; +use spin_factor_otel::OtelFactor; use spin_factor_outbound_http::OutboundHttpFactor; use spin_factor_outbound_mqtt::{NetworkedMqttClient, OutboundMqttFactor}; use spin_factor_outbound_mysql::OutboundMysqlFactor; @@ -25,6 +26,7 @@ use spin_variables_static::VariableSource; #[derive(RuntimeFactors)] pub struct TriggerFactors { + pub otel: OtelFactor, pub wasi: WasiFactor, pub variables: VariablesFactor, pub key_value: KeyValueFactor, @@ -45,6 +47,7 @@ impl TriggerFactors { allow_transient_writes: bool, ) -> anyhow::Result { Ok(Self { + otel: OtelFactor::new()?, wasi: wasi_factor(working_dir, allow_transient_writes), variables: VariablesFactor::default(), key_value: KeyValueFactor::new(), diff --git a/crates/telemetry/Cargo.toml b/crates/telemetry/Cargo.toml index bf5079ac37..0ef7d9150f 100644 --- a/crates/telemetry/Cargo.toml +++ b/crates/telemetry/Cargo.toml @@ -10,11 +10,11 @@ http0 = { version = "0.2.9", package = "http" } http1 = { version = "1.0.0", package = "http" } opentelemetry = { version = "0.28", features = ["metrics", "trace", "logs"] } opentelemetry-appender-tracing = "0.28" -opentelemetry-otlp = { version = "0.28", features = ["grpc-tonic"] } -opentelemetry_sdk = { version = "0.28", features = ["rt-tokio", "spec_unstable_logs_enabled", "metrics"] } +opentelemetry-otlp = { workspace = true, features = ["grpc-tonic"] } +opentelemetry_sdk = { workspace = true, features = ["rt-tokio", "spec_unstable_logs_enabled", "metrics"] } terminal = { path = "../terminal" } tracing = { workspace = true } -tracing-opentelemetry = { version = "0.29", default-features = false, features = ["metrics"] } +tracing-opentelemetry = { workspace = true, default-features = false, features = ["metrics"] } tracing-subscriber = { version = "0.3", default-features = false, features = ["smallvec", "fmt", "ansi", "std", "env-filter", "json", "registry"] } [features] diff --git a/crates/telemetry/src/env.rs b/crates/telemetry/src/env.rs index 5786e236df..487aad6227 100644 --- a/crates/telemetry/src/env.rs +++ b/crates/telemetry/src/env.rs @@ -19,7 +19,7 @@ const SPIN_DISABLE_LOG_TO_TRACING: &str = "SPIN_DISABLE_LOG_TO_TRACING"; /// - `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` /// /// Note that this is overridden if OTEL_SDK_DISABLED is set and not empty. -pub(crate) fn otel_tracing_enabled() -> bool { +pub fn otel_tracing_enabled() -> bool { any_vars_set(&[ OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_EXPORTER_OTLP_TRACES_ENDPOINT, @@ -33,7 +33,7 @@ pub(crate) fn otel_tracing_enabled() -> bool { /// - `OTEL_EXPORTER_OTLP_METRICS_ENDPOINT` /// /// Note that this is overridden if OTEL_SDK_DISABLED is set and not empty. -pub(crate) fn otel_metrics_enabled() -> bool { +pub fn otel_metrics_enabled() -> bool { any_vars_set(&[ OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_EXPORTER_OTLP_METRICS_ENDPOINT, @@ -47,7 +47,7 @@ pub(crate) fn otel_metrics_enabled() -> bool { /// - `OTEL_EXPORTER_OTLP_LOGS_ENDPOINT` /// /// Note that this is overridden if OTEL_SDK_DISABLED is set and not empty. -pub(crate) fn otel_logs_enabled() -> bool { +pub fn otel_logs_enabled() -> bool { any_vars_set(&[ OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_EXPORTER_OTLP_LOGS_ENDPOINT, @@ -59,7 +59,7 @@ pub(crate) fn otel_logs_enabled() -> bool { /// /// It is considered disabled if the environment variable `SPIN_DISABLED_LOG_TO_TRACING` is set and not /// empty. By default the features is enabled. -pub(crate) fn spin_disable_log_to_tracing() -> bool { +pub fn spin_disable_log_to_tracing() -> bool { any_vars_set(&[SPIN_DISABLE_LOG_TO_TRACING]) } @@ -72,13 +72,13 @@ fn any_vars_set(enabling_vars: &[&str]) -> bool { /// Returns a boolean indicating if the OTEL SDK should be disabled for all signals. /// /// It is considered disabled if the environment variable `OTEL_SDK_DISABLED` is set and not empty. -pub(crate) fn otel_sdk_disabled() -> bool { +pub fn otel_sdk_disabled() -> bool { std::env::var_os(OTEL_SDK_DISABLED).is_some_and(|val| !val.is_empty()) } /// The protocol to use for OTLP exporter. #[derive(Debug)] -pub(crate) enum OtlpProtocol { +pub enum OtlpProtocol { Grpc, HttpProtobuf, HttpJson, @@ -86,7 +86,7 @@ pub(crate) enum OtlpProtocol { impl OtlpProtocol { /// Returns the protocol to be used for exporting traces as defined by the environment. - pub(crate) fn traces_protocol_from_env() -> Self { + pub fn traces_protocol_from_env() -> Self { Self::protocol_from_env( std::env::var(OTEL_EXPORTER_OTLP_TRACES_PROTOCOL), std::env::var(OTEL_EXPORTER_OTLP_PROTOCOL), @@ -94,7 +94,7 @@ impl OtlpProtocol { } /// Returns the protocol to be used for exporting metrics as defined by the environment. - pub(crate) fn metrics_protocol_from_env() -> Self { + pub fn metrics_protocol_from_env() -> Self { Self::protocol_from_env( std::env::var(OTEL_EXPORTER_OTLP_METRICS_PROTOCOL), std::env::var(OTEL_EXPORTER_OTLP_PROTOCOL), @@ -102,7 +102,7 @@ impl OtlpProtocol { } /// Returns the protocol to be used for exporting logs as defined by the environment. - pub(crate) fn logs_protocol_from_env() -> Self { + pub fn logs_protocol_from_env() -> Self { Self::protocol_from_env( std::env::var(OTEL_EXPORTER_OTLP_LOGS_PROTOCOL), std::env::var(OTEL_EXPORTER_OTLP_PROTOCOL), diff --git a/crates/telemetry/src/lib.rs b/crates/telemetry/src/lib.rs index 4c5c99074e..dd1343e13d 100644 --- a/crates/telemetry/src/lib.rs +++ b/crates/telemetry/src/lib.rs @@ -9,7 +9,7 @@ use tracing_subscriber::{fmt, prelude::*, registry, EnvFilter, Layer}; mod alert_in_dev; pub mod detector; -mod env; +pub mod env; pub mod logs; pub mod metrics; mod propagation; @@ -53,6 +53,15 @@ pub use propagation::inject_trace_context; /// spin_telemetry::metrics::monotonic_counter!(spin.metric_name = 1, metric_attribute = "value"); /// ``` pub fn init(spin_version: String) -> anyhow::Result<()> { + // This filter globally filters out spans produced by wasi_http so that they don't conflict with + // the behaviour of the wasi-otel factor. + let wasi_http_trace_filter = tracing_subscriber::filter::filter_fn(|metadata| { + if metadata.is_span() && metadata.name() == "wit-bindgen export" { + return false; + } + true + }); + // This layer will print all tracing library log messages to stderr. let fmt_layer = fmt::layer() .with_writer(std::io::stderr) @@ -91,6 +100,7 @@ pub fn init(spin_version: String) -> anyhow::Result<()> { // Build a registry subscriber with the layers we want to use. registry() + .with(wasi_http_trace_filter) .with(otel_tracing_layer) .with(otel_metrics_layer) .with(fmt_layer) diff --git a/crates/telemetry/src/logs.rs b/crates/telemetry/src/logs.rs index f87857bb70..deb0166389 100644 --- a/crates/telemetry/src/logs.rs +++ b/crates/telemetry/src/logs.rs @@ -3,8 +3,9 @@ use std::{ascii::escape_default, sync::OnceLock}; use anyhow::bail; use opentelemetry::logs::{LogRecord, Logger, LoggerProvider}; use opentelemetry_sdk::{ - logs::{BatchConfigBuilder, BatchLogProcessor, SdkLogger}, + logs::{log_processor_with_async_runtime::BatchLogProcessor, BatchConfigBuilder, SdkLogger}, resource::{EnvResourceDetector, ResourceDetector, TelemetryResourceDetector}, + runtime::Tokio, Resource, }; @@ -97,7 +98,7 @@ pub(crate) fn init_otel_logging_backend(spin_version: String) -> anyhow::Result< let provider = opentelemetry_sdk::logs::SdkLoggerProvider::builder() .with_resource(resource) .with_log_processor( - BatchLogProcessor::builder(exporter) + BatchLogProcessor::builder(exporter, Tokio) .with_batch_config(BatchConfigBuilder::default().build()) .build(), ) diff --git a/crates/telemetry/src/metrics.rs b/crates/telemetry/src/metrics.rs index 07a0b50e66..4a0ee1614f 100644 --- a/crates/telemetry/src/metrics.rs +++ b/crates/telemetry/src/metrics.rs @@ -1,8 +1,9 @@ use anyhow::{bail, Result}; use opentelemetry::global; use opentelemetry_sdk::{ - metrics::{PeriodicReader, SdkMeterProvider}, + metrics::{periodic_reader_with_async_runtime::PeriodicReader, SdkMeterProvider}, resource::{EnvResourceDetector, ResourceDetector, TelemetryResourceDetector}, + runtime::Tokio, Resource, }; use tracing::Subscriber; @@ -45,7 +46,7 @@ pub(crate) fn otel_metrics_layer LookupSpan<'span>>( OtlpProtocol::HttpJson => bail!("http/json OTLP protocol is not supported"), }; - let reader = PeriodicReader::builder(exporter).build(); + let reader = PeriodicReader::builder(exporter, Tokio).build(); let meter_provider = SdkMeterProvider::builder() .with_reader(reader) .with_resource(resource) diff --git a/crates/telemetry/src/traces.rs b/crates/telemetry/src/traces.rs index fdccd4b44a..0b9f92f020 100644 --- a/crates/telemetry/src/traces.rs +++ b/crates/telemetry/src/traces.rs @@ -2,6 +2,7 @@ use anyhow::bail; use opentelemetry::{global, trace::TracerProvider}; use opentelemetry_sdk::{ resource::{EnvResourceDetector, ResourceDetector, TelemetryResourceDetector}, + runtime::Tokio, Resource, }; use tracing::Subscriber; @@ -42,7 +43,11 @@ pub(crate) fn otel_tracing_layer LookupSpan<'span>>( OtlpProtocol::HttpJson => bail!("http/json OTLP protocol is not supported"), }; - let span_processor = opentelemetry_sdk::trace::BatchSpanProcessor::builder(exporter).build(); + let span_processor = + opentelemetry_sdk::trace::span_processor_with_async_runtime::BatchSpanProcessor::builder( + exporter, Tokio, + ) + .build(); let tracer_provider = opentelemetry_sdk::trace::SdkTracerProvider::builder() .with_resource(resource) diff --git a/crates/trigger-http/Cargo.toml b/crates/trigger-http/Cargo.toml index 2bce144d6d..ee595bd55b 100644 --- a/crates/trigger-http/Cargo.toml +++ b/crates/trigger-http/Cargo.toml @@ -33,6 +33,7 @@ spin-http = { path = "../http" } spin-telemetry = { path = "../telemetry" } spin-trigger = { path = "../trigger" } spin-world = { path = "../world" } +spin-factor-otel = { path = "../factor-otel" } terminal = { path = "../terminal" } tokio = { workspace = true, features = ["full"] } tokio-rustls = { workspace = true } diff --git a/crates/trigger-http/src/wasi.rs b/crates/trigger-http/src/wasi.rs index f44169e2eb..d41ec69292 100644 --- a/crates/trigger-http/src/wasi.rs +++ b/crates/trigger-http/src/wasi.rs @@ -109,6 +109,7 @@ impl HttpExecutor for WasiHttpExecutor<'_, S> { HandlerType::Wagi(_) => unreachable!("should have used WagiExecutor instead"), }; + let span = tracing::debug_span!("execute_wasi"); let handle = task::spawn( async move { let result = match handler { diff --git a/crates/world/Cargo.toml b/crates/world/Cargo.toml index fd4763100d..4508fb7e6a 100644 --- a/crates/world/Cargo.toml +++ b/crates/world/Cargo.toml @@ -5,5 +5,8 @@ authors = { workspace = true } edition = { workspace = true } [dependencies] +anyhow = { workspace = true } async-trait = { workspace = true } +opentelemetry = { workspace = true } +opentelemetry_sdk = { workspace = true } wasmtime = { workspace = true } diff --git a/crates/world/src/conversions.rs b/crates/world/src/conversions.rs index 8177b623b2..2362ab8954 100644 --- a/crates/world/src/conversions.rs +++ b/crates/world/src/conversions.rs @@ -553,3 +553,495 @@ mod llm { } } } + +mod otel { + use super::*; + use opentelemetry::StringValue; + use opentelemetry_sdk::trace::{SpanEvents, SpanLinks}; + use std::borrow::Cow; + use std::time::{Duration, SystemTime, UNIX_EPOCH}; + use wasi::clocks0_2_0::wall_clock; + + impl From + for opentelemetry_sdk::metrics::data::ResourceMetrics + { + fn from(value: wasi::otel::metrics::ResourceMetrics) -> Self { + Self { + resource: value.resource.into(), + scope_metrics: value.scope_metrics.into_iter().map(Into::into).collect(), + } + } + } + + impl From for opentelemetry_sdk::Resource { + fn from(value: wasi::otel::metrics::Resource) -> Self { + let attributes: Vec = + value.attributes.into_iter().map(Into::into).collect(); + let schema_url: Option = value.schema_url.into(); + + match schema_url { + Some(url) => opentelemetry_sdk::resource::Resource::builder() + .with_schema_url(attributes, url) + .build(), + None => opentelemetry_sdk::resource::Resource::builder() + .with_attributes(attributes) + .build(), + } + } + } + + impl From for opentelemetry_sdk::metrics::data::ScopeMetrics { + fn from(value: wasi::otel::metrics::ScopeMetrics) -> Self { + Self { + scope: value.scope.into(), + metrics: value.metrics.into_iter().map(Into::into).collect(), + } + } + } + + impl From for opentelemetry_sdk::metrics::data::Metric { + fn from(value: wasi::otel::metrics::Metric) -> Self { + Self { + name: Cow::Owned(value.name), + description: Cow::Owned(value.description), + unit: Cow::Owned(value.unit), + data: value.data.into(), + } + } + } + + /// Converts a Wasi exemplar to an OTel exemplar + macro_rules! exemplars_to_otel { + ( + $wasi_exemplar_list:expr, + $exemplar_type:ty + ) => { + $wasi_exemplar_list + .iter() + .map(|e| { + let span_id: [u8; 8] = e + .span_id + .as_bytes() + .try_into() + .expect("Span ID is longer than 8 bytes"); + let trace_id: [u8; 16] = e + .trace_id + .as_bytes() + .try_into() + .expect("Trace ID is longer than 16 bytes"); + opentelemetry_sdk::metrics::data::Exemplar::<$exemplar_type> { + filtered_attributes: e + .filtered_attributes + .to_owned() + .into_iter() + .map(Into::into) + .collect(), + time: e.time.into(), + value: e.value.into(), + span_id, + trace_id, + } + }) + .collect() + }; + } + + /// Converts a WASI Gauge to an OTel Gauge + macro_rules! wasi_gauge_to_otel { + ($gauge:expr, $number_type:ty) => { + Box::new(opentelemetry_sdk::metrics::data::Gauge { + data_points: $gauge + .data_points + .iter() + .map(|dp| opentelemetry_sdk::metrics::data::GaugeDataPoint { + attributes: dp.attributes.iter().map(Into::into).collect(), + value: dp.value.into(), + exemplars: exemplars_to_otel!(dp.exemplars, $number_type), + }) + .collect(), + start_time: match $gauge.start_time { + Some(t) => Some(t.into()), + None => None, + }, + time: $gauge.time.into(), + }) + }; + } + + /// Converts a WASI Sum to an OTel Sum + macro_rules! wasi_sum_to_otel { + ($sum:expr, $number_type:ty) => { + Box::new(opentelemetry_sdk::metrics::data::Sum { + data_points: $sum + .data_points + .iter() + .map(|dp| opentelemetry_sdk::metrics::data::SumDataPoint { + attributes: dp.attributes.iter().map(Into::into).collect(), + exemplars: exemplars_to_otel!(dp.exemplars, $number_type), + value: dp.value.into(), + }) + .collect(), + start_time: $sum.start_time.into(), + time: $sum.time.into(), + temporality: $sum.temporality.into(), + is_monotonic: $sum.is_monotonic, + }) + }; + } + + /// Converts a WASI Histogram to an OTel Histogram + macro_rules! wasi_histogram_to_otel { + ($histogram:expr, $number_type:ty) => { + Box::new(opentelemetry_sdk::metrics::data::Histogram { + data_points: $histogram + .data_points + .iter() + .map(|dp| opentelemetry_sdk::metrics::data::HistogramDataPoint { + attributes: dp.attributes.iter().map(Into::into).collect(), + bounds: dp.bounds.to_owned(), + bucket_counts: dp.bucket_counts.to_owned(), + exemplars: exemplars_to_otel!(dp.exemplars, $number_type), + count: dp.count, + max: match dp.max { + Some(m) => Some(m.into()), + None => None, + }, + min: match dp.min { + Some(m) => Some(m.into()), + None => None, + }, + sum: dp.sum.into(), + }) + .collect(), + start_time: $histogram.start_time.into(), + time: $histogram.time.into(), + temporality: $histogram.temporality.into(), + }) + }; + } + + /// Converts a WASI ExponentialHistogram to an OTel ExponentialHistogram + macro_rules! wasi_exponential_histogram_to_otel { + ($histogram:expr, $number_type:ty) => { + Box::new(opentelemetry_sdk::metrics::data::ExponentialHistogram { + data_points: $histogram + .data_points + .iter() + .map( + |dp| opentelemetry_sdk::metrics::data::ExponentialHistogramDataPoint { + attributes: dp.attributes.iter().map(Into::into).collect(), + exemplars: exemplars_to_otel!(dp.exemplars, $number_type), + count: dp.count as usize, + max: match dp.max { + Some(m) => Some(m.into()), + None => None, + }, + min: match dp.min { + Some(m) => Some(m.into()), + None => None, + }, + sum: dp.sum.into(), + scale: dp.scale, + zero_count: dp.zero_count, + positive_bucket: dp.positive_bucket.to_owned().into(), + negative_bucket: dp.negative_bucket.to_owned().into(), + zero_threshold: dp.zero_threshold, + }, + ) + .collect(), + start_time: $histogram.start_time.into(), + time: $histogram.time.into(), + temporality: $histogram.temporality.into(), + }) + }; + } + + impl From + for Box + { + fn from(value: wasi::otel::metrics::MetricData) -> Self { + match value { + wasi::otel::metrics::MetricData::F64Sum(s) => wasi_sum_to_otel!(s, f64), + wasi::otel::metrics::MetricData::S64Sum(s) => wasi_sum_to_otel!(s, i64), + wasi::otel::metrics::MetricData::U64Sum(s) => wasi_sum_to_otel!(s, u64), + wasi::otel::metrics::MetricData::F64Gauge(g) => wasi_gauge_to_otel!(g, f64), + wasi::otel::metrics::MetricData::S64Gauge(g) => wasi_gauge_to_otel!(g, i64), + wasi::otel::metrics::MetricData::U64Gauge(g) => wasi_gauge_to_otel!(g, u64), + wasi::otel::metrics::MetricData::F64Histogram(h) => wasi_histogram_to_otel!(h, f64), + wasi::otel::metrics::MetricData::S64Histogram(h) => wasi_histogram_to_otel!(h, i64), + wasi::otel::metrics::MetricData::U64Histogram(h) => wasi_histogram_to_otel!(h, u64), + wasi::otel::metrics::MetricData::F64ExponentialHistogram(h) => { + wasi_exponential_histogram_to_otel!(h, f64) + } + wasi::otel::metrics::MetricData::S64ExponentialHistogram(h) => { + wasi_exponential_histogram_to_otel!(h, i64) + } + wasi::otel::metrics::MetricData::U64ExponentialHistogram(h) => { + wasi_exponential_histogram_to_otel!(h, u64) + } + } + } + } + + impl From for f64 { + fn from(value: wasi::otel::metrics::MetricNumber) -> Self { + match value { + wasi::otel::metrics::MetricNumber::F64(n) => n, + _ => panic!("error converting WASI MetricNumber to f64"), + } + } + } + + impl From for u64 { + fn from(value: wasi::otel::metrics::MetricNumber) -> Self { + match value { + wasi::otel::metrics::MetricNumber::U64(n) => n, + _ => panic!("error converting WASI MetricNumber to u64"), + } + } + } + + impl From for i64 { + fn from(value: wasi::otel::metrics::MetricNumber) -> Self { + match value { + wasi::otel::metrics::MetricNumber::S64(n) => n, + _ => panic!("error converting WASI MetricNumber to i64"), + } + } + } + + impl From + for opentelemetry_sdk::metrics::data::ExponentialBucket + { + fn from(value: wasi::otel::metrics::ExponentialBucket) -> Self { + Self { + offset: value.offset, + counts: value.counts, + } + } + } + + impl From for opentelemetry_sdk::metrics::Temporality { + fn from(value: wasi::otel::metrics::Temporality) -> Self { + use opentelemetry_sdk::metrics::Temporality; + match value { + wasi::otel::metrics::Temporality::Cumulative => Temporality::Cumulative, + wasi::otel::metrics::Temporality::Delta => Temporality::Delta, + wasi::otel::metrics::Temporality::LowMemory => Temporality::LowMemory, + } + } + } + + impl From for opentelemetry_sdk::trace::SpanData { + fn from(value: wasi::otel::tracing::SpanData) -> Self { + let mut span_events = SpanEvents::default(); + span_events.events = value.events.into_iter().map(Into::into).collect(); + span_events.dropped_count = value.dropped_events; + let mut span_links = SpanLinks::default(); + span_links.links = value.links.into_iter().map(Into::into).collect(); + span_links.dropped_count = value.dropped_links; + Self { + span_context: value.span_context.into(), + parent_span_id: opentelemetry::trace::SpanId::from_hex(&value.parent_span_id) + .unwrap_or(opentelemetry::trace::SpanId::INVALID), + span_kind: value.span_kind.into(), + name: value.name.into(), + start_time: value.start_time.into(), + end_time: value.end_time.into(), + attributes: value.attributes.into_iter().map(Into::into).collect(), + dropped_attributes_count: value.dropped_attributes, + events: span_events, + links: span_links, + status: value.status.into(), + instrumentation_scope: value.instrumentation_scope.into(), + } + } + } + + impl From for opentelemetry::trace::SpanContext { + fn from(sc: wasi::otel::tracing::SpanContext) -> Self { + let trace_id = opentelemetry::trace::TraceId::from_hex(&sc.trace_id) + .unwrap_or(opentelemetry::trace::TraceId::INVALID); + let span_id = opentelemetry::trace::SpanId::from_hex(&sc.span_id) + .unwrap_or(opentelemetry::trace::SpanId::INVALID); + let trace_state = opentelemetry::trace::TraceState::from_key_value(sc.trace_state) + .unwrap_or_else(|_| opentelemetry::trace::TraceState::default()); + Self::new( + trace_id, + span_id, + sc.trace_flags.into(), + sc.is_remote, + trace_state, + ) + } + } + + impl From for wasi::otel::tracing::SpanContext { + fn from(sc: opentelemetry::trace::SpanContext) -> Self { + Self { + trace_id: format!("{:x}", sc.trace_id()), + span_id: format!("{:x}", sc.span_id()), + trace_flags: sc.trace_flags().into(), + is_remote: sc.is_remote(), + trace_state: sc + .trace_state() + .header() + .split(',') + .filter_map(|s| { + if let Some((key, value)) = s.split_once('=') { + Some((key.to_string(), value.to_string())) + } else { + None + } + }) + .collect(), + } + } + } + + impl From for opentelemetry::trace::TraceFlags { + fn from(flags: wasi::otel::tracing::TraceFlags) -> Self { + Self::new(flags.as_array()[0] as u8) + } + } + + impl From for wasi::otel::tracing::TraceFlags { + fn from(flags: opentelemetry::trace::TraceFlags) -> Self { + if flags.is_sampled() { + wasi::otel::tracing::TraceFlags::SAMPLED + } else { + wasi::otel::tracing::TraceFlags::empty() + } + } + } + + impl From for opentelemetry::trace::SpanKind { + fn from(kind: wasi::otel::tracing::SpanKind) -> Self { + match kind { + wasi::otel::tracing::SpanKind::Client => opentelemetry::trace::SpanKind::Client, + wasi::otel::tracing::SpanKind::Server => opentelemetry::trace::SpanKind::Server, + wasi::otel::tracing::SpanKind::Producer => opentelemetry::trace::SpanKind::Producer, + wasi::otel::tracing::SpanKind::Consumer => opentelemetry::trace::SpanKind::Consumer, + wasi::otel::tracing::SpanKind::Internal => opentelemetry::trace::SpanKind::Internal, + } + } + } + + impl From for opentelemetry::KeyValue { + fn from(kv: wasi::otel::tracing::KeyValue) -> Self { + opentelemetry::KeyValue::new(kv.key, kv.value) + } + } + + impl From<&wasi::otel::tracing::KeyValue> for opentelemetry::KeyValue { + fn from(kv: &wasi::otel::tracing::KeyValue) -> Self { + opentelemetry::KeyValue::new(kv.key.to_owned(), kv.value.to_owned()) + } + } + + impl From for opentelemetry::Value { + fn from(value: wasi::otel::types::Value) -> Self { + match value { + wasi::otel::types::Value::String(v) => v.into(), + wasi::otel::types::Value::Bool(v) => v.into(), + wasi::otel::types::Value::F64(v) => v.into(), + wasi::otel::types::Value::S64(v) => v.into(), + wasi::otel::types::Value::StringArray(v) => opentelemetry::Value::Array( + v.into_iter() + .map(StringValue::from) + .collect::>() + .into(), + ), + wasi::otel::types::Value::BoolArray(v) => opentelemetry::Value::Array(v.into()), + wasi::otel::types::Value::F64Array(v) => opentelemetry::Value::Array(v.into()), + wasi::otel::types::Value::S64Array(v) => opentelemetry::Value::Array(v.into()), + } + } + } + + impl From for opentelemetry::trace::Event { + fn from(event: wasi::otel::tracing::Event) -> Self { + Self::new( + event.name, + event.time.into(), + event.attributes.into_iter().map(Into::into).collect(), + 0, + ) + } + } + + impl From for opentelemetry::trace::Link { + fn from(link: wasi::otel::tracing::Link) -> Self { + Self::new( + link.span_context.into(), + link.attributes.into_iter().map(Into::into).collect(), + 0, + ) + } + } + + impl From for opentelemetry::trace::Status { + fn from(status: wasi::otel::tracing::Status) -> Self { + match status { + wasi::otel::tracing::Status::Unset => Self::Unset, + wasi::otel::tracing::Status::Ok => Self::Ok, + wasi::otel::tracing::Status::Error(s) => Self::Error { + description: s.into(), + }, + } + } + } + + impl From for opentelemetry::InstrumentationScope { + fn from(value: wasi::otel::tracing::InstrumentationScope) -> Self { + let builder = Self::builder(value.name) + .with_attributes(value.attributes.into_iter().map(Into::into)); + match (value.version, value.schema_url) { + (Some(version), Some(schema_url)) => builder + .with_version(version) + .with_schema_url(schema_url) + .build(), + (Some(version), None) => builder.with_version(version).build(), + (None, Some(schema_url)) => builder.with_schema_url(schema_url).build(), + (None, None) => builder.build(), + } + } + } + + impl From for SystemTime { + fn from(timestamp: wall_clock::Datetime) -> Self { + UNIX_EPOCH + + Duration::from_secs(timestamp.seconds) + + Duration::from_nanos(timestamp.nanoseconds as u64) + } + } + + mod test { + #[test] + fn trace_flags() { + let flags = opentelemetry::trace::TraceFlags::SAMPLED; + let flags2 = crate::wasi::otel::tracing::TraceFlags::from(flags); + let flags3 = opentelemetry::trace::TraceFlags::from(flags2); + assert_eq!(flags, flags3); + } + + #[test] + fn span_context() { + let sc = opentelemetry::trace::SpanContext::new( + opentelemetry::trace::TraceId::from_hex("4fb34cb4484029f7881399b149e41e98") + .unwrap(), + opentelemetry::trace::SpanId::from_hex("9ffd58d3cd4dd90b").unwrap(), + opentelemetry::trace::TraceFlags::SAMPLED, + false, + opentelemetry::trace::TraceState::from_key_value(vec![ + ("foo", "bar"), + ("baz", "qux"), + ]) + .unwrap(), + ); + let sc2 = crate::wasi::otel::tracing::SpanContext::from(sc.clone()); + let sc3 = opentelemetry::trace::SpanContext::from(sc2); + assert_eq!(sc, sc3); + } + } +} diff --git a/tests/integration.rs b/tests/integration.rs index 5e20ebe197..8663b9abf6 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -1,6 +1,7 @@ -mod testcases; +pub mod testcases; mod integration_tests { + use anyhow::Context; use sha2::Digest; use std::collections::HashMap; use test_environment::{ @@ -9,13 +10,12 @@ mod integration_tests { }; use testing_framework::runtimes::{spin_cli::SpinConfig, SpinAppType}; - use super::testcases::{ + pub use super::testcases::{ assert_spin_request, bootstap_env, http_smoke_test_template, run_test, spin_binary, }; - use anyhow::Context; - /// Helper macro to assert that a condition is true eventually #[cfg(feature = "extern-dependencies-tests")] + /// Helper macro to assert that a condition is true eventually macro_rules! assert_eventually { ($e:expr, $t:expr) => { let mut i = 0; @@ -1717,3 +1717,432 @@ route = "/..." Ok(()) } } + +mod otel_integration_tests { + use fake_opentelemetry_collector::FakeCollectorServer; + use std::time::Duration; + use test_environment::{ + http::{Method, Request, Response}, + services::ServicesConfig, + }; + use testing_framework::runtimes::{spin_cli::SpinConfig, SpinAppType}; + + use crate::testcases::run_test_inited; + + use super::testcases::{assert_spin_request, spin_binary}; + + #[test] + // Test that basic otel tracing and inbound/outbound context propagation works + fn otel_smoke_test() -> anyhow::Result<()> { + let rt = tokio::runtime::Runtime::new()?; + let mut collector = rt + .block_on(FakeCollectorServer::start()) + .expect("fake collector server should start"); + let collector_endpoint = collector.endpoint().clone(); + + run_test_inited( + "otel-smoke-test", + SpinConfig { + binary_path: spin_binary(), + spin_up_args: Vec::new(), + app_type: SpinAppType::Http, + }, + ServicesConfig::none(), + |env| { + env.set_env_var("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", collector_endpoint); + env.set_env_var("OTEL_EXPORTER_OTLP_TRACES_PROTOCOL", "grpc"); + env.set_env_var("OTEL_BSP_SCHEDULE_DELAY", "5"); + Ok(()) + }, + move |env| { + let spin = env.runtime_mut(); + assert_spin_request(spin, Request::new(Method::Get, "/one"), Response::new(200))?; + + let spans = rt.block_on(collector.exported_spans(5, Duration::from_secs(5))); + + assert_eq!(spans.len(), 5); + + // They're all part of the same trace which implies context propagation is working + assert!(spans + .iter() + .map(|s| s.trace_id.clone()) + .all(|t| t == spans[0].trace_id)); + + Ok(()) + }, + )?; + + Ok(()) + } + + #[test] + fn wasi_otel_nested_spans() -> anyhow::Result<()> { + let rt = tokio::runtime::Runtime::new()?; + let mut collector = rt + .block_on(FakeCollectorServer::start()) + .expect("fake collector server should start"); + let collector_endpoint = collector.endpoint().clone(); + + run_test_inited( + "wasi-otel-tracing", + SpinConfig { + binary_path: spin_binary(), + spin_up_args: Vec::new(), + app_type: SpinAppType::Http, + }, + ServicesConfig::none(), + |env| { + env.set_env_var("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", collector_endpoint); + env.set_env_var("OTEL_EXPORTER_OTLP_TRACES_PROTOCOL", "grpc"); + env.set_env_var("OTEL_BSP_SCHEDULE_DELAY", "5"); + Ok(()) + }, + move |env| { + let spin = env.runtime_mut(); + assert_spin_request( + spin, + Request::new(Method::Get, "/nested-spans"), + Response::new(200), + )?; + + let spans = rt.block_on(collector.exported_spans(4, Duration::from_secs(5))); + + assert_eq!(spans.len(), 4); + + let handle_request_span = spans + .iter() + .find(|s| s.name == "GET /...") + .expect("'GET /...' span should exist"); + let exec_component_span = spans + .iter() + .find(|s| s.name == "execute_wasm_component wasi-otel-tracing") + .expect("'execute_wasm_component wasi-otel-tracing' span should exist"); + let outer_span = spans + .iter() + .find(|s| s.name == "outer_func") + .expect("'outer_func' span should exist"); + let inner_span = spans + .iter() + .find(|s| s.name == "inner_func") + .expect("'inner_func' span should exist"); + + assert!( + handle_request_span.trace_id == exec_component_span.trace_id + && exec_component_span.trace_id == outer_span.trace_id + && outer_span.trace_id == inner_span.trace_id + ); + assert_eq!( + exec_component_span.parent_span_id, + handle_request_span.span_id + ); + assert_eq!(outer_span.parent_span_id, exec_component_span.span_id); + assert_eq!(inner_span.parent_span_id, outer_span.span_id); + + Ok(()) + }, + )?; + + Ok(()) + } + + #[test] + fn wasi_otel_setting_attributes() -> anyhow::Result<()> { + let rt = tokio::runtime::Runtime::new()?; + let mut collector = rt + .block_on(FakeCollectorServer::start()) + .expect("fake collector server should start"); + let collector_endpoint = collector.endpoint().clone(); + + run_test_inited( + "wasi-otel-tracing", + SpinConfig { + binary_path: spin_binary(), + spin_up_args: Vec::new(), + app_type: SpinAppType::Http, + }, + ServicesConfig::none(), + |env| { + env.set_env_var("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", collector_endpoint); + env.set_env_var("OTEL_EXPORTER_OTLP_TRACES_PROTOCOL", "grpc"); + env.set_env_var("OTEL_BSP_SCHEDULE_DELAY", "5"); + Ok(()) + }, + move |env| { + let spin = env.runtime_mut(); + assert_spin_request( + spin, + Request::new(Method::Get, "/setting-attributes"), + Response::new(200), + )?; + + let spans = rt.block_on(collector.exported_spans(3, Duration::from_secs(5))); + + assert_eq!(spans.len(), 3); + + let attr_span = spans + .iter() + .find(|s| s.name == "setting_attributes") + .expect("'setting_attributes' span should exist"); + + // There are some other attributes already set on the span + assert_eq!(attr_span.attributes.len(), 2); + + assert_eq!( + attr_span + .attributes + .get("foo") + .expect("'foo' attribute should exist"), + "Some(AnyValue { value: Some(StringValue(\"baz\")) })" + ); + assert_eq!( + attr_span.attributes.get("qux").expect("'qux' attribute should exist"), + "Some(AnyValue { value: Some(ArrayValue(ArrayValue { values: [AnyValue { value: Some(StringValue(\"qaz\")) }, AnyValue { value: Some(StringValue(\"thud\")) }] })) })" + ); + + Ok(()) + }, + )?; + + Ok(()) + } + + #[test] + fn wasi_otel_host_guest_host() -> anyhow::Result<()> { + let rt = tokio::runtime::Runtime::new()?; + let mut collector = rt + .block_on(FakeCollectorServer::start()) + .expect("fake collector server should start"); + let collector_endpoint = collector.endpoint().clone(); + + run_test_inited( + "wasi-otel-tracing", + SpinConfig { + binary_path: spin_binary(), + spin_up_args: Vec::new(), + app_type: SpinAppType::Http, + }, + ServicesConfig::none(), + |env| { + env.set_env_var("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", collector_endpoint); + env.set_env_var("OTEL_EXPORTER_OTLP_TRACES_PROTOCOL", "grpc"); + env.set_env_var("OTEL_BSP_SCHEDULE_DELAY", "5"); + Ok(()) + }, + move |env| { + let spin = env.runtime_mut(); + assert_spin_request( + spin, + Request::new(Method::Get, "/host-guest-host"), + Response::new(200), + )?; + + let spans = rt.block_on(collector.exported_spans(4, Duration::from_secs(5))); + + assert_eq!(spans.len(), 4); + + assert!(spans + .iter() + .map(|s| s.trace_id.clone()) + .all(|t| t == spans[0].trace_id)); + + let exec_component_span = spans + .iter() + .find(|s| s.name == "execute_wasm_component wasi-otel-tracing") + .expect("'execute_wasm_component wasi-otel-tracing' span should exist"); + let guest_span = spans + .iter() + .find(|s| s.name == "guest") + .expect("'guest' span should exist"); + let get_span = spans + .iter() + .find(|s| s.name == "GET") + .expect("'GET' span should exist"); + + assert_eq!(guest_span.parent_span_id, exec_component_span.span_id); + assert_eq!(get_span.parent_span_id, guest_span.span_id); + + Ok(()) + }, + )?; + + Ok(()) + } + + #[test] + fn wasi_otel_events() -> anyhow::Result<()> { + let rt = tokio::runtime::Runtime::new()?; + let mut collector = rt + .block_on(FakeCollectorServer::start()) + .expect("fake collector server should start"); + let collector_endpoint = collector.endpoint().clone(); + + run_test_inited( + "wasi-otel-tracing", + SpinConfig { + binary_path: spin_binary(), + spin_up_args: Vec::new(), + app_type: SpinAppType::Http, + }, + ServicesConfig::none(), + |env| { + env.set_env_var("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", collector_endpoint); + env.set_env_var("OTEL_EXPORTER_OTLP_TRACES_PROTOCOL", "grpc"); + env.set_env_var("OTEL_BSP_SCHEDULE_DELAY", "5"); + Ok(()) + }, + move |env| { + let spin = env.runtime_mut(); + assert_spin_request( + spin, + Request::new(Method::Get, "/events"), + Response::new(200), + )?; + + let spans = rt.block_on(collector.exported_spans(3, Duration::from_secs(5))); + + assert_eq!(spans.len(), 3); + + let event_span = spans + .iter() + .find(|s| s.name == "events") + .expect("'events' span should exist"); + + let events = event_span.events.clone(); + assert_eq!(events.len(), 3); + + let basic_event = events + .iter() + .find(|e| e.name == "basic-event") + .expect("'basic' event should exist"); + let event_with_attributes = events + .iter() + .find(|e| e.name == "event-with-attributes") + .expect("'event_with_attributes' event should exist"); + let event_with_timestamp = events + .iter() + .find(|e| e.name == "event-with-timestamp") + .expect("'event_with_timestamp' event should exist"); + + assert!(basic_event.time_unix_nano < event_with_attributes.time_unix_nano); + assert_eq!(event_with_attributes.attributes.len(), 1); + assert!(event_with_attributes.time_unix_nano < event_with_timestamp.time_unix_nano); + + Ok(()) + }, + )?; + + Ok(()) + } + + #[test] + fn wasi_otel_links() -> anyhow::Result<()> { + let rt = tokio::runtime::Runtime::new()?; + let mut collector = rt + .block_on(FakeCollectorServer::start()) + .expect("fake collector server should start"); + let collector_endpoint = collector.endpoint().clone(); + + run_test_inited( + "wasi-otel-tracing", + SpinConfig { + binary_path: spin_binary(), + spin_up_args: Vec::new(), + app_type: SpinAppType::Http, + }, + ServicesConfig::none(), + |env| { + env.set_env_var("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", collector_endpoint); + env.set_env_var("OTEL_EXPORTER_OTLP_TRACES_PROTOCOL", "grpc"); + env.set_env_var("OTEL_BSP_SCHEDULE_DELAY", "5"); + Ok(()) + }, + move |env| { + let spin = env.runtime_mut(); + assert_spin_request( + spin, + Request::new(Method::Get, "/links"), + Response::new(200), + )?; + + let spans = rt.block_on(collector.exported_spans(4, Duration::from_secs(5))); + + assert_eq!(spans.len(), 4); + + let first_span = spans + .iter() + .find(|s| s.name == "first") + .expect("'first' span should exist"); + let second_span = spans + .iter() + .find(|s| s.name == "second") + .expect("'second' span should exist"); + + assert_eq!(first_span.links.len(), 0); + assert_eq!(second_span.links.len(), 1); + assert_eq!( + second_span.links.first().unwrap().span_id, + first_span.span_id + ); + assert_eq!(second_span.links.first().unwrap().attributes.len(), 1); + + Ok(()) + }, + )?; + + Ok(()) + } + + #[test] + fn wasi_otel_root_span() -> anyhow::Result<()> { + let rt = tokio::runtime::Runtime::new()?; + let mut collector = rt + .block_on(FakeCollectorServer::start()) + .expect("fake collector server should start"); + let collector_endpoint = collector.endpoint().clone(); + + run_test_inited( + "wasi-otel-tracing", + SpinConfig { + binary_path: spin_binary(), + spin_up_args: Vec::new(), + app_type: SpinAppType::Http, + }, + ServicesConfig::none(), + |env| { + env.set_env_var("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", collector_endpoint); + env.set_env_var("OTEL_EXPORTER_OTLP_TRACES_PROTOCOL", "grpc"); + env.set_env_var("OTEL_BSP_SCHEDULE_DELAY", "5"); + Ok(()) + }, + move |env| { + let spin = env.runtime_mut(); + assert_spin_request( + spin, + Request::new(Method::Get, "/root-span"), + Response::new(200), + )?; + + let spans = rt.block_on(collector.exported_spans(7, Duration::from_secs(5))); + + assert_eq!(spans.len(), 4); + + let root_span = spans + .iter() + .find(|s| s.name == "root") + .expect("'root' span should exist"); + let request_span = spans + .iter() + .find(|s| s.name == "GET") + .expect("'GET' span should exist"); + + assert_eq!(root_span.trace_id, request_span.trace_id); + assert_eq!(root_span.span_id, request_span.parent_span_id); + assert_eq!(root_span.parent_span_id, "".to_string()); + + Ok(()) + }, + )?; + + Ok(()) + } +} diff --git a/tests/test-components/components/Cargo.lock b/tests/test-components/components/Cargo.lock index 6f6bbff2ba..44ed4f0b48 100644 --- a/tests/test-components/components/Cargo.lock +++ b/tests/test-components/components/Cargo.lock @@ -2,6 +2,18 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "ai" version = "0.1.0" @@ -21,9 +33,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.99" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "arrayvec" @@ -33,20 +45,20 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "async-trait" -version = "0.1.77" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.108", ] [[package]] name = "autocfg" -version = "1.1.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "base64" @@ -56,9 +68,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" [[package]] name = "block-buffer" @@ -83,15 +95,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.5.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.2.40" +version = "1.2.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d05d92f4b1fd76aad469d46cdd858ca761576082cd37df81416691e50199fb" +checksum = "37521ac7aabe3d13122dc382493e20c9416f299d2ccd5b3a5340a2570cdeb0f3" dependencies = [ "find-msvc-tools", "shlex", @@ -99,9 +111,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "chrono" @@ -124,9 +136,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] @@ -160,14 +172,14 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.108", ] [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "fallible-iterator" @@ -177,9 +189,9 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "find-msvc-tools" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0399f9d26e5191ce32c498bebd31e7a3ceabc2745f0ac54af3f335126c3f24b3" +checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" [[package]] name = "fnv" @@ -258,7 +270,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.108", ] [[package]] @@ -293,9 +305,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.7" +version = "0.14.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" dependencies = [ "typenum", "version_check", @@ -303,14 +315,23 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "libc", "r-efi", - "wasi 0.14.7+wasi-0.2.4", + "wasip2", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", ] [[package]] @@ -322,6 +343,12 @@ dependencies = [ "foldhash", ] +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" + [[package]] name = "head-rust-sdk-redis" version = "0.1.0" @@ -336,7 +363,7 @@ name = "headers-dynamic-env" version = "0.1.0" dependencies = [ "anyhow", - "http 0.2.11", + "http 0.2.12", "spin-sdk 2.2.0", ] @@ -360,7 +387,7 @@ name = "hello-world" version = "0.1.0" dependencies = [ "anyhow", - "http 0.2.11", + "http 0.2.12", "spin-sdk 2.2.0", ] @@ -388,9 +415,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", @@ -399,9 +426,9 @@ dependencies = [ [[package]] name = "http" -version = "1.1.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" dependencies = [ "bytes", "fnv", @@ -443,9 +470,9 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" dependencies = [ "displaydoc", "potential_utf", @@ -456,9 +483,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" dependencies = [ "displaydoc", "litemap", @@ -469,11 +496,10 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" dependencies = [ - "displaydoc", "icu_collections", "icu_normalizer_data", "icu_properties", @@ -484,42 +510,38 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" dependencies = [ - "displaydoc", "icu_collections", "icu_locale_core", "icu_properties_data", "icu_provider", - "potential_utf", "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" +checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" [[package]] name = "icu_provider" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" dependencies = [ "displaydoc", "icu_locale_core", - "stable_deref_trait", - "tinystr", "writeable", "yoke", "zerofrom", @@ -556,12 +578,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.11.3" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92119844f513ffa41556430369ab02c295a3578af21cf945caa3e9e0c2481ac3" +checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.16.0", "serde", "serde_core", ] @@ -571,7 +593,7 @@ name = "integration-simple" version = "0.1.0" dependencies = [ "anyhow", - "http 0.2.11", + "http 0.2.12", "spin-sdk 2.2.0", ] @@ -619,7 +641,7 @@ version = "0.1.0" dependencies = [ "anyhow", "helper", - "http 0.2.11", + "http 0.2.12", "spin-sdk 2.2.0", ] @@ -629,7 +651,7 @@ version = "0.1.0" dependencies = [ "anyhow", "helper", - "http 0.2.11", + "http 0.2.12", "spin-sdk 2.2.0", ] @@ -639,7 +661,7 @@ version = "0.1.0" dependencies = [ "anyhow", "helper", - "http 0.2.11", + "http 0.2.12", "spin-sdk 2.2.0", ] @@ -658,20 +680,20 @@ dependencies = [ "anyhow", "futures", "helper", - "spin-sdk 3.0.0", + "spin-sdk 3.1.1", ] [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "js-sys" -version = "0.3.81" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" +checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" dependencies = [ "once_cell", "wasm-bindgen", @@ -694,6 +716,12 @@ dependencies = [ "spin-sdk 2.2.0", ] +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + [[package]] name = "leb128" version = "0.2.5" @@ -708,21 +736,21 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.176" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "litemap" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] name = "log" -version = "0.4.20" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "md-5" @@ -736,32 +764,41 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "mini-internal" -version = "0.1.36" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51c55587ac25c2d63a75e4171221b2803a9b9e83aeb7bdfde5833c4cd578b50d" +checksum = "560f32b6891d8d9bade8942c45a27694f16d789d3b4b8e6b7135a5240de0a8af" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.108", ] [[package]] name = "miniserde" -version = "0.1.36" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8621df4a46e5de4c1541242407da38281ea0e320b94e238477688a36a1a059f7" +checksum = "ac79f4123c070de643a7a93b9339abf18c30005c622bf4b1c29c2c0960f52d39" dependencies = [ "itoa", "mini-internal", "ryu", ] +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -773,16 +810,70 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.19.0" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "opentelemetry" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaf416e4cb72756655126f7dd7bb0af49c674f4c1b9903e80c009e0c37e552e6" +dependencies = [ + "futures-core", + "futures-sink", + "js-sys", + "pin-project-lite", + "thiserror 2.0.17", + "tracing", +] + +[[package]] +name = "opentelemetry-wasi" +version = "0.27.0" +source = "git+https://github.com/calebschoepp/opentelemetry-wasi?rev=60df119fbc03ed83d0e2cc1300f6a8eb055d23f7#60df119fbc03ed83d0e2cc1300f6a8eb055d23f7" +dependencies = [ + "anyhow", + "opentelemetry", + "opentelemetry_sdk", + "spin-sdk 3.1.1", + "tracing", + "tracing-opentelemetry", + "tracing-subscriber", + "wit-bindgen 0.30.0", +] + +[[package]] +name = "opentelemetry_sdk" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "11f644aa9e5e31d11896e024305d7e3c98a88884d9f8919dbf37a9991bc47a4b" +dependencies = [ + "futures-channel", + "futures-executor", + "futures-util", + "opentelemetry", + "percent-encoding", + "rand", + "serde_json", + "thiserror 2.0.17", +] + +[[package]] +name = "otel-smoke-test" +version = "0.1.0" +dependencies = [ + "anyhow", + "http 0.2.12", + "spin-sdk 2.2.0", +] [[package]] name = "outbound-http-component" version = "0.1.0" dependencies = [ "anyhow", - "http 0.2.11", + "http 0.2.12", "spin-sdk 2.2.0", ] @@ -826,9 +917,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -856,9 +947,9 @@ dependencies = [ [[package]] name = "postgres-types" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a120daaabfcb0e324d5bf6e411e9222994cb3795c79943a0ef28ed27ea76e4" +checksum = "ef4605b7c057056dd35baeb6ac0c0338e4975b1f2bef0f65da953285eb007095" dependencies = [ "bytes", "fallible-iterator", @@ -877,9 +968,9 @@ dependencies = [ [[package]] name = "potential_utf" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" dependencies = [ "zerovec", ] @@ -895,28 +986,28 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.29" +version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.98", + "syn 2.0.108", ] [[package]] name = "proc-macro2" -version = "1.0.93" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.35" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" dependencies = [ "proc-macro2", ] @@ -958,9 +1049,9 @@ dependencies = [ [[package]] name = "routefinder" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94f8f99b10dedd317514253dda1fa7c14e344aac96e1f78149a64879ce282aca" +checksum = "0971d3c8943a6267d6bd0d782fdc4afa7593e7381a92a3df950ff58897e066b5" dependencies = [ "smartcow", "smartstring", @@ -968,9 +1059,9 @@ dependencies = [ [[package]] name = "rust_decimal" -version = "1.38.0" +version = "1.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8975fc98059f365204d635119cf9c5a60ae67b841ed49b5422a9a7e56cdfac0" +checksum = "35affe401787a9bd846712274d97654355d21b2a2c092a3139aabe31e9022282" dependencies = [ "arrayvec", "num-traits", @@ -984,21 +1075,21 @@ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" -version = "1.0.16" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "semver" -version = "1.0.20" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" [[package]] name = "serde" -version = "1.0.225" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6c24dee235d0da097043389623fb913daddf92c76e9f5a1db88607a0bcbd1d" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ "serde_core", "serde_derive", @@ -1006,33 +1097,35 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.225" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "659356f9a0cb1e529b24c01e43ad2bdf520ec4ceaf83047b83ddcc2251f96383" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.225" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea936adf78b1f766949a4977b91d2f5595825bd6ec079aa9543ad2685fc4516" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.108", ] [[package]] name = "serde_json" -version = "1.0.108" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", + "memchr", "ryu", "serde", + "serde_core", ] [[package]] @@ -1043,7 +1136,7 @@ checksum = "0431a35568651e363364210c91983c1da5eb29404d9f0928b67d4ebcfa7d330c" dependencies = [ "percent-encoding", "serde", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1057,6 +1150,15 @@ dependencies = [ "digest", ] +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + [[package]] name = "shlex" version = "1.3.0" @@ -1065,12 +1167,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "slab" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" @@ -1100,22 +1199,33 @@ dependencies = [ [[package]] name = "spdx" -version = "0.10.2" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b19b32ed6d899ab23174302ff105c1577e45a06b08d4fe0a9dd13ce804bbbf71" +checksum = "c3e17e880bafaeb362a7b751ec46bdc5b61445a188f80e0606e68167cd540fa3" dependencies = [ "smallvec", ] [[package]] name = "spin-executor" -version = "5.0.0" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d11baf86ca52100e8742ea43d2c342cf4d75b94f8a85454cf44fd108cdd71d5" +dependencies = [ + "futures", + "once_cell", + "wit-bindgen 0.16.0", +] + +[[package]] +name = "spin-executor" +version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde323c004c7d9d68fbccd1dd6caee6330aaefbcb40562587fc0356bd0ea8e5f" +checksum = "9fa74c56ad71afb64fff0566d7cb313567d0469ba2a75b0af58c323f59b74280" dependencies = [ "futures", "once_cell", - "wasi 0.13.1+wasi-0.2.0", + "wasi", ] [[package]] @@ -1126,7 +1236,7 @@ checksum = "13524474ab9f876586e29f954377a66ed14fcb646fc9893e6f0e762213ddbd86" dependencies = [ "anyhow", "bytes", - "http 0.2.11", + "http 0.2.12", "proc-macro2", "quote", "syn 1.0.109", @@ -1134,9 +1244,9 @@ dependencies = [ [[package]] name = "spin-macro" -version = "3.0.0" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a161ae2fefde8582ef555ead81d87cf897cd31a23a1d1e0c22a9c43fd9af421a" +checksum = "988ffe27470862bf28fe9b4f0268361040d4732cd86bcaebe45aa3d3b3e3d896" dependencies = [ "anyhow", "bytes", @@ -1147,9 +1257,9 @@ dependencies = [ [[package]] name = "spin-macro" -version = "5.0.0" +version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1592d94530c032aa8676c8adee71022fba49504ae6d4d8961a454029d3bac6f" +checksum = "74edf3aab0f4e24b30e765d10fcdbff69aa2d1906907f3318c5f8a8106daef34" dependencies = [ "anyhow", "bytes", @@ -1177,42 +1287,44 @@ dependencies = [ "bytes", "form_urlencoded", "futures", - "http 0.2.11", + "http 0.2.12", "once_cell", "routefinder", "serde", "serde_json", "spin-macro 2.2.0", - "thiserror", + "thiserror 1.0.69", "wit-bindgen 0.13.1", ] [[package]] name = "spin-sdk" -version = "3.0.0" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2c02cf00c243c03fb330cb5be7bf4eb3c8db7c5476425068c7385ddff1567aa" +checksum = "f845e889d8431740806e04704ac5aa619466dfaef626f3c15952ecf823913e01" dependencies = [ "anyhow", "async-trait", "bytes", + "chrono", "form_urlencoded", "futures", - "http 1.1.0", + "http 1.3.1", "once_cell", "routefinder", "serde", "serde_json", - "spin-macro 3.0.0", - "thiserror", + "spin-executor 3.1.1", + "spin-macro 3.1.1", + "thiserror 1.0.69", "wit-bindgen 0.16.0", ] [[package]] name = "spin-sdk" -version = "5.0.0" +version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72e9705e63f1e7f955b3c9bef754a6f957624d734c6091990a2dc6f1e135625d" +checksum = "5374bed998dc151d3c3a45ffdba3269d9f94ea6cf19f002ff7fc744edb09a5f8" dependencies = [ "anyhow", "async-trait", @@ -1220,18 +1332,18 @@ dependencies = [ "chrono", "form_urlencoded", "futures", - "http 1.1.0", + "http 1.3.1", "once_cell", "postgres_range", "routefinder", "rust_decimal", "serde", "serde_json", - "spin-executor", - "spin-macro 5.0.0", - "thiserror", + "spin-executor 5.1.0", + "spin-macro 5.1.0", + "thiserror 2.0.17", "uuid", - "wasi 0.13.1+wasi-0.2.0", + "wasi", "wit-bindgen 0.43.0", ] @@ -1245,9 +1357,9 @@ dependencies = [ [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "static_assertions" @@ -1285,9 +1397,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.98" +version = "2.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" +checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" dependencies = [ "proc-macro2", "quote", @@ -1302,7 +1414,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.108", ] [[package]] @@ -1315,29 +1427,58 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.56" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl", + "thiserror-impl 2.0.17", ] [[package]] name = "thiserror-impl" -version = "1.0.56" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.108", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", ] [[package]] name = "tinystr" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" dependencies = [ "displaydoc", "zerovec", @@ -1358,11 +1499,86 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-opentelemetry" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddcf5959f39507d0d04d6413119c04f33b623f4f951ebcbdddddfad2d0623a9c" +dependencies = [ + "js-sys", + "once_cell", + "opentelemetry", + "opentelemetry_sdk", + "smallvec", + "tracing", + "tracing-core", + "tracing-log", + "tracing-subscriber", + "web-time", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" +dependencies = [ + "nu-ansi-term", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", +] + [[package]] name = "typenum" -version = "1.17.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "unicode-bidi" @@ -1372,43 +1588,43 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "unicode-normalization" -version = "0.1.24" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" dependencies = [ "tinyvec", ] [[package]] name = "unicode-properties" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" +checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" [[package]] name = "unicode-segmentation" -version = "1.10.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-xid" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "unsupported-import" version = "0.1.0" dependencies = [ "anyhow", - "spin-sdk 5.0.0", + "spin-sdk 5.1.0", "wit-bindgen 0.43.0", ] @@ -1440,6 +1656,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + [[package]] name = "variables" version = "0.1.0" @@ -1453,15 +1675,15 @@ name = "vault-variables-test" version = "0.1.0" dependencies = [ "anyhow", - "http 0.2.11", + "http 0.2.12", "spin-sdk 2.2.0", ] [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "wasi" @@ -1472,15 +1694,6 @@ dependencies = [ "wit-bindgen-rt 0.24.0", ] -[[package]] -name = "wasi" -version = "0.14.7+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" -dependencies = [ - "wasip2", -] - [[package]] name = "wasi-config" version = "0.1.0" @@ -1522,6 +1735,19 @@ dependencies = [ "wit-bindgen 0.46.0", ] +[[package]] +name = "wasi-otel-tracing" +version = "0.1.0" +dependencies = [ + "anyhow", + "http 0.2.12", + "opentelemetry", + "opentelemetry-wasi", + "opentelemetry_sdk", + "spin-sdk 3.1.1", + "wit-bindgen 0.30.0", +] + [[package]] name = "wasip2" version = "1.0.1+wasi-0.2.4" @@ -1533,9 +1759,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.104" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" +checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" dependencies = [ "cfg-if", "once_cell", @@ -1544,25 +1770,11 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.98", - "wasm-bindgen-shared", -] - [[package]] name = "wasm-bindgen-macro" -version = "0.2.104" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" +checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1570,22 +1782,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.104" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" +checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" dependencies = [ + "bumpalo", "proc-macro2", "quote", - "syn 2.0.98", - "wasm-bindgen-backend", + "syn 2.0.108", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.104" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" +checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" dependencies = [ "unicode-ident", ] @@ -1617,6 +1829,16 @@ dependencies = [ "leb128", ] +[[package]] +name = "wasm-encoder" +version = "0.215.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb56df3e06b8e6b77e37d2969a50ba51281029a9aeb3855e76b7f49b6418847" +dependencies = [ + "leb128", + "wasmparser 0.215.0", +] + [[package]] name = "wasm-encoder" version = "0.235.0" @@ -1653,6 +1875,22 @@ dependencies = [ "wasmparser 0.121.2", ] +[[package]] +name = "wasm-metadata" +version = "0.215.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c6bb07c5576b608f7a2a9baa2294c1a3584a249965d695a9814a496cb6d232f" +dependencies = [ + "anyhow", + "indexmap", + "serde", + "serde_derive", + "serde_json", + "spdx", + "wasm-encoder 0.215.0", + "wasmparser 0.215.0", +] + [[package]] name = "wasm-metadata" version = "0.235.0" @@ -1689,9 +1927,9 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.118.1" +version = "0.118.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ee9723b928e735d53000dec9eae7b07a60e490c85ab54abb66659fc61bfcd9" +checksum = "77f1154f1ab868e2a01d9834a805faca7bf8b50d041b4ca714d005d0dab1c50c" dependencies = [ "indexmap", "semver", @@ -1708,6 +1946,19 @@ dependencies = [ "semver", ] +[[package]] +name = "wasmparser" +version = "0.215.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fbde0881f24199b81cf49b6ff8f9c145ac8eb1b7fc439adb5c099734f7d90e" +dependencies = [ + "ahash", + "bitflags", + "hashbrown 0.14.5", + "indexmap", + "semver", +] + [[package]] name = "wasmparser" version = "0.235.0" @@ -1715,7 +1966,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "161296c618fa2d63f6ed5fffd1112937e803cb9ec71b32b01a76321555660917" dependencies = [ "bitflags", - "hashbrown", + "hashbrown 0.15.5", "indexmap", "semver", ] @@ -1727,16 +1978,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c9d90bb93e764f6beabf1d02028c70a2156a6583e63ac4218dd07ef733368b0" dependencies = [ "bitflags", - "hashbrown", + "hashbrown 0.15.5", "indexmap", "semver", ] +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "windows-core" -version = "0.62.1" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6844ee5416b285084d3d3fffd743b925a6c9385455f64f6d4fa3031c4c2749a9" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ "windows-implement", "windows-interface", @@ -1747,46 +2008,55 @@ dependencies = [ [[package]] name = "windows-implement" -version = "0.60.1" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edb307e42a74fb6de9bf3a02d9712678b22399c87e6fa869d6dfcd8c1b7754e0" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.108", ] [[package]] name = "windows-interface" -version = "0.59.2" +version = "0.59.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0abd1ddbc6964ac14db11c7213d6532ef34bd9aa042c2e5935f59d7908b46a5" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.108", ] [[package]] name = "windows-link" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-result" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ "windows-link", ] [[package]] name = "windows-strings" -version = "0.5.0" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ "windows-link", ] @@ -1811,6 +2081,16 @@ dependencies = [ "wit-bindgen-rust-macro 0.16.0", ] +[[package]] +name = "wit-bindgen" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4bac478334a647374ff24a74b66737a4cb586dc8288bc3080a93252cd1105c" +dependencies = [ + "wit-bindgen-rt 0.30.0", + "wit-bindgen-rust-macro 0.30.0", +] + [[package]] name = "wit-bindgen" version = "0.43.0" @@ -1852,7 +2132,18 @@ checksum = "75d55e1a488af2981fb0edac80d8d20a51ac36897a1bdef4abde33c29c1b6d0d" dependencies = [ "anyhow", "wit-component 0.18.2", - "wit-parser 0.13.0", + "wit-parser 0.13.2", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb7e3df01cd43cfa1cb52602e4fc05cb2b62217655f6705639b6953eb0a3fed2" +dependencies = [ + "anyhow", + "heck 0.5.0", + "wit-parser 0.215.0", ] [[package]] @@ -1886,6 +2177,15 @@ dependencies = [ "bitflags", ] +[[package]] +name = "wit-bindgen-rt" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2de7a3b06b9725d129b5cbd1beca968feed919c433305a23da46843185ecdd6" +dependencies = [ + "bitflags", +] + [[package]] name = "wit-bindgen-rt" version = "0.43.0" @@ -1923,6 +2223,22 @@ dependencies = [ "wit-component 0.18.2", ] +[[package]] +name = "wit-bindgen-rust" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61a767d1a8eb4e908bfc53febc48b87ada545703b16fe0148ee7736a29a01417" +dependencies = [ + "anyhow", + "heck 0.5.0", + "indexmap", + "prettyplease", + "syn 2.0.108", + "wasm-metadata 0.215.0", + "wit-bindgen-core 0.30.0", + "wit-component 0.215.0", +] + [[package]] name = "wit-bindgen-rust" version = "0.43.0" @@ -1933,7 +2249,7 @@ dependencies = [ "heck 0.5.0", "indexmap", "prettyplease", - "syn 2.0.98", + "syn 2.0.108", "wasm-metadata 0.235.0", "wit-bindgen-core 0.43.0", "wit-component 0.235.0", @@ -1949,7 +2265,7 @@ dependencies = [ "heck 0.5.0", "indexmap", "prettyplease", - "syn 2.0.98", + "syn 2.0.108", "wasm-metadata 0.239.0", "wit-bindgen-core 0.46.0", "wit-component 0.239.0", @@ -1964,7 +2280,7 @@ dependencies = [ "anyhow", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.108", "wit-bindgen-core 0.13.1", "wit-bindgen-rust 0.13.2", "wit-component 0.17.0", @@ -1979,12 +2295,27 @@ dependencies = [ "anyhow", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.108", "wit-bindgen-core 0.16.0", "wit-bindgen-rust 0.16.0", "wit-component 0.18.2", ] +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b185c342d0d27bd83d4080f5a66cf3b4f247fa49d679bceb66e11cc7eb58b99" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.108", + "wit-bindgen-core 0.30.0", + "wit-bindgen-rust 0.30.0", +] + [[package]] name = "wit-bindgen-rust-macro" version = "0.43.0" @@ -1995,7 +2326,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.108", "wit-bindgen-core 0.43.0", "wit-bindgen-rust 0.43.0", ] @@ -2010,7 +2341,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.108", "wit-bindgen-core 0.46.0", "wit-bindgen-rust 0.46.0", ] @@ -2049,8 +2380,27 @@ dependencies = [ "serde_json", "wasm-encoder 0.38.1", "wasm-metadata 0.10.20", - "wasmparser 0.118.1", - "wit-parser 0.13.0", + "wasmparser 0.118.2", + "wit-parser 0.13.2", +] + +[[package]] +name = "wit-component" +version = "0.215.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f725e3885fc5890648be5c5cbc1353b755dc932aa5f1aa7de968b912a3280743" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder 0.215.0", + "wasm-metadata 0.215.0", + "wasmparser 0.215.0", + "wit-parser 0.215.0", ] [[package]] @@ -2110,9 +2460,9 @@ dependencies = [ [[package]] name = "wit-parser" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15df6b7b28ce94b8be39d8df5cb21a08a4f3b9f33b631aedb4aa5776f785ead3" +checksum = "316b36a9f0005f5aa4b03c39bc3728d045df136f8c13a73b7db4510dec725e08" dependencies = [ "anyhow", "id-arena", @@ -2125,6 +2475,24 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "wit-parser" +version = "0.215.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "935a97eaffd57c3b413aa510f8f0b550a4a9fe7d59e79cd8b89a83dcb860321f" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser 0.215.0", +] + [[package]] name = "wit-parser" version = "0.235.0" @@ -2163,17 +2531,16 @@ dependencies = [ [[package]] name = "writeable" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" [[package]] name = "yoke" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" dependencies = [ - "serde", "stable_deref_trait", "yoke-derive", "zerofrom", @@ -2181,13 +2548,13 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.108", "synstructure", ] @@ -2208,7 +2575,7 @@ checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.108", ] [[package]] @@ -2228,15 +2595,15 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.108", "synstructure", ] [[package]] name = "zerotrie" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" dependencies = [ "displaydoc", "yoke", @@ -2245,9 +2612,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.4" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" dependencies = [ "yoke", "zerofrom", @@ -2256,11 +2623,11 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.108", ] diff --git a/tests/test-components/components/otel-smoke-test/Cargo.toml b/tests/test-components/components/otel-smoke-test/Cargo.toml new file mode 100644 index 0000000000..521468b790 --- /dev/null +++ b/tests/test-components/components/otel-smoke-test/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "otel-smoke-test" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +anyhow = "1" +http = "0.2" +spin-sdk = "2.2.0" diff --git a/tests/test-components/components/otel-smoke-test/src/lib.rs b/tests/test-components/components/otel-smoke-test/src/lib.rs new file mode 100644 index 0000000000..85c4326102 --- /dev/null +++ b/tests/test-components/components/otel-smoke-test/src/lib.rs @@ -0,0 +1,22 @@ +use spin_sdk::{ + http::{Method, Params, Request, Response, Router}, + http_component, +}; + +#[http_component] +fn handle(req: http::Request<()>) -> Response { + let mut router = Router::new(); + router.get_async("/one", one); + router.get_async("/two", two); + router.handle(req) +} + +async fn one(_req: Request, _params: Params) -> Response { + let req = Request::builder().method(Method::Get).uri("/two").build(); + let _res: Response = spin_sdk::http::send(req).await.unwrap(); + Response::new(200, "") +} + +async fn two(_req: Request, _params: Params) -> Response { + Response::new(201, "") +} diff --git a/tests/test-components/components/wasi-otel-tracing/Cargo.toml b/tests/test-components/components/wasi-otel-tracing/Cargo.toml new file mode 100644 index 0000000000..4a434653e1 --- /dev/null +++ b/tests/test-components/components/wasi-otel-tracing/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "wasi-otel-tracing" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +anyhow = "1" +http = "0.2" +opentelemetry = "0.30.0" +opentelemetry_sdk = "0.30.0" +opentelemetry-wasi = { git = "https://github.com/calebschoepp/opentelemetry-wasi", rev = "60df119fbc03ed83d0e2cc1300f6a8eb055d23f7" } +spin-sdk = "3.1.0" +wit-bindgen = "0.30.0" diff --git a/tests/test-components/components/wasi-otel-tracing/src/lib.rs b/tests/test-components/components/wasi-otel-tracing/src/lib.rs new file mode 100644 index 0000000000..c7d427b8bc --- /dev/null +++ b/tests/test-components/components/wasi-otel-tracing/src/lib.rs @@ -0,0 +1,130 @@ +use std::time; + +use opentelemetry::{ + global::{self, BoxedTracer, ObjectSafeSpan}, + trace::{TraceContextExt, Tracer}, + Array, Context, ContextGuard, KeyValue, Value, +}; +use opentelemetry_sdk::trace::SdkTracerProvider; +use opentelemetry_wasi::WasiPropagator; +use spin_sdk::{ + http::{IntoResponse, Method, Params, Request, Response, Router}, + http_component, +}; + +#[http_component] +fn handle(req: Request) -> anyhow::Result { + let mut router = Router::new(); + router.get("/nested-spans", nested_spans); + router.get("/setting-attributes", setting_attributes); + router.get_async("/host-guest-host", host_guest_host); + router.get("/events", events); + router.get("/links", links); + router.get_async("/root-span", root_span); + Ok(router.handle(req)) +} + +fn setup_tracer(propagate_context: bool) -> (BoxedTracer, Option) { + // Set up a tracer using the WASI processor + let wasi_processor = opentelemetry_wasi::WasiProcessor::new(); + let tracer_provider = SdkTracerProvider::builder() + .with_span_processor(wasi_processor) + .build(); + global::set_tracer_provider(tracer_provider); + let tracer = global::tracer("wasi-otel-tracing"); + + if propagate_context { + let wasi_propagator = opentelemetry_wasi::TraceContextPropagator::new(); + ( + tracer, + Some(wasi_propagator.extract(&Context::current()).attach()), + ) + } else { + (tracer, None) + } +} + +fn nested_spans(_req: Request, _params: Params) -> Response { + let (tracer, _ctx) = setup_tracer(true); + tracer.in_span("outer_func", |_| { + tracer.in_span("inner_func", |_| {}); + }); + Response::new(200, "") +} + +fn setting_attributes(_req: Request, _params: Params) -> Response { + let (tracer, _ctx) = setup_tracer(true); + tracer.in_span("setting_attributes", |cx| { + let span = cx.span(); + span.set_attribute(KeyValue::new("foo", "bar")); + span.set_attribute(KeyValue::new("foo", "baz")); + span.set_attribute(KeyValue::new( + "qux", + Value::Array(Array::String(vec!["qaz".into(), "thud".into()])), + )); + }); + + Response::new(200, "") +} + +async fn host_guest_host(_req: Request, _params: Params) -> Response { + let (tracer, _ctx) = setup_tracer(true); + let mut span = tracer.start("guest"); + make_request().await; + span.end(); + + Response::new(200, "") +} + +fn events(_req: Request, _params: Params) -> Response { + let (tracer, _ctx) = setup_tracer(true); + tracer.in_span("events", |cx| { + let span = cx.span(); + span.add_event("basic-event".to_string(), vec![]); + span.add_event( + "event-with-attributes".to_string(), + vec![KeyValue::new("foo", true)], + ); + let time = time::SystemTime::now() + .duration_since(time::UNIX_EPOCH) + .unwrap(); + let time = time.as_secs_f64(); + let time = time::Duration::from_secs_f64(time + 1.0); + let time = time::SystemTime::UNIX_EPOCH + time; + span.add_event_with_timestamp("event-with-timestamp", time, vec![]); + }); + Response::new(200, "") +} + +fn links(_req: Request, _params: Params) -> Response { + let (tracer, _ctx) = setup_tracer(true); + let mut first = tracer.start("first"); + first.end(); + let mut second = tracer.start("second"); + second.add_link( + first.span_context().clone(), + vec![KeyValue::new("foo", "bar")], + ); + second.end(); + Response::new(200, "") +} + +async fn root_span(_req: Request, _params: Params) -> Response { + let (tracer, _ctx) = setup_tracer(false); + let mut span = tracer.start("root"); + make_request().await; + span.end(); + Response::new(200, "") +} + +async fn make_request() { + let req = Request::builder() + .method(Method::Get) + .uri("https://asdf.com") + .build(); + let _res: Response = spin_sdk::http::send(req).await.unwrap(); +} + +// TODO: Test what happens if start is called but not end +// TODO: Test what happens if end is called but not start +// TODO: What happens if child span outlives parent diff --git a/tests/testcases/otel-smoke-test/spin.toml b/tests/testcases/otel-smoke-test/spin.toml index bc143dd323..909149421f 100644 --- a/tests/testcases/otel-smoke-test/spin.toml +++ b/tests/testcases/otel-smoke-test/spin.toml @@ -1,12 +1,13 @@ spin_version = "1" -authors = ["Spin Framework Contributors"] -description = "A simple application that returns hello and goodbye." -name = "head-rust-sdk-http" +authors = ["Fermyon Engineering "] +description = "A simple application that tests otel." +name = "otel-smoke-test" trigger = { type = "http" } version = "1.0.0" [[component]] -id = "hello" -source = "%{source=hello-world}" +id = "otel" +source = "%{source=otel-smoke-test}" +allowed_outbound_hosts = ["http://self"] [component.trigger] -route = "/hello/..." +route = "/..." diff --git a/tests/testcases/wasi-otel-tracing/spin.toml b/tests/testcases/wasi-otel-tracing/spin.toml new file mode 100644 index 0000000000..a54f57210b --- /dev/null +++ b/tests/testcases/wasi-otel-tracing/spin.toml @@ -0,0 +1,19 @@ +spin_manifest_version = 2 + +[application] +authors = ["Fermyon Engineering "] +description = "An application to exercise wasi-otel tracing functionality." +name = "wasi-otel-tracing" +version = "1.0.0" + +[[trigger.http]] +route = "/..." +component = "wasi-otel-tracing" + +[component.wasi-otel-tracing] +source = "%{source=wasi-otel-tracing}" +key_value_stores = ["default"] +allowed_outbound_hosts = ["http://self", "https://asdf.com"] +[component.wasi-otel-tracing.build] +command = "cargo build --target wasm32-wasi --release" +watch = ["src/**/*.rs", "Cargo.toml"] diff --git a/wit/deps/otel/metrics.wit b/wit/deps/otel/metrics.wit new file mode 100644 index 0000000000..8255684a4e --- /dev/null +++ b/wit/deps/otel/metrics.wit @@ -0,0 +1,264 @@ +interface metrics { + use wasi:clocks/wall-clock@0.2.0.{datetime}; + use wasi:clocks/monotonic-clock@0.2.0.{duration}; + use types.{key-value, instrumentation-scope}; + use tracing.{span-id, trace-id}; + + /// Exports a resource's metric data. + %export: func(metrics: resource-metrics) -> result<_, error>; + + /// An error resulting from `export` being called. + type error = string; + + /// A collection of `scope-metrics` and the associated `resource` that created them. + record resource-metrics { + /// The entity that collected the metrics. + %resource: %resource, + /// The collection of metrics with unique `instrumentation-scope`s. + scope-metrics: list, + } + + /// An immutable representation of the entity producing telemetry as attributes. + record %resource { + /// Attributes that identify the resource. + attributes: list, + /// The schema URL to be recorded in the emitted resource. + schema-url: option, + } + + /// A collection of `metric`s produced by a meter. + record scope-metrics { + /// The instrumentation scope that the meter was created with. + scope: instrumentation-scope, + /// The list of aggregations created by the meter. + metrics: list, + } + + /// A collection of one or more aggregated time series from a metric. + record metric { + /// The name of the metric that created this data. + name: string, + /// The description of the metric, which can be used in documentation. + description: string, + /// The unit in which the metric reports. + unit: string, + /// The aggregated data from a metric. + data: metric-data + } + + /// Metric data for all types. + variant metric-data { + /// Metric data for an f64 gauge. + f64-gauge(gauge), + /// Metric data for an f64 sum. + f64-sum(sum), + /// Metric data for an f64 histogram. + f64-histogram(histogram), + /// Metric data for an f64 exponential-histogram. + f64-exponential-histogram(exponential-histogram), + /// Metric data for an u64 gauge. + u64-gauge(gauge), + /// Metric data for an u64 sum. + u64-sum(sum), + /// Metric data for an u64 histogram. + u64-histogram(histogram), + /// Metric data for an u64 exponential-histogram. + u64-exponential-histogram(exponential-histogram), + /// Metric data for an s64 gauge. + s64-gauge(gauge), + /// Metric data for an s64 sum. + s64-sum(sum), + /// Metric data for an s64 histogram. + s64-histogram(histogram), + /// Metric data for an s64 exponential-histogram. + s64-exponential-histogram(exponential-histogram), + } + + /// A measurement of the current value of an instrument. + record gauge { + /// Represents individual aggregated measurements with unique attributes. + data-points: list, + /// The time when the time series was started. + start-time: option, + /// The time when the time series was recorded. + time: datetime, + } + + /// A single data point in a time series to be associated with a `gauge`. + record gauge-data-point { + /// `attributes` is the set of key value pairs that uniquely identify the + /// time series. + attributes: list, + /// The value of this data point. + value: metric-number, + /// The sampled `exemplar`s collected during the time series. + exemplars: list, + } + + /// Represents the sum of all measurements of values from an instrument. + record sum { + /// Represents individual aggregated measurements with unique attributes. + data-points: list, + /// The time when the time series was started. + start-time: datetime, + /// The time when the time series was recorded. + time: datetime, + /// Describes if the aggregation is reported as the change from the last report + /// time, or the cumulative changes since a fixed start time. + temporality: temporality, + /// Whether this aggregation only increases or decreases. + is-monotonic: bool, + } + + /// A single data point in a time series to be associated with a `sum`. + record sum-data-point { + /// `attributes` is the set of key value pairs that uniquely identify the + /// time series. + attributes: list, + /// The value of this data point. + value: metric-number, + /// The sampled `exemplar`s collected during the time series. + exemplars: list, + } + + /// Represents the histogram of all measurements of values from an instrument. + record histogram { + /// Individual aggregated measurements with unique attributes. + data-points: list, + /// The time when the time series was started. + start-time: datetime, + /// The time when the time series was recorded. + time: datetime, + /// Describes if the aggregation is reported as the change from the last report + /// time, or the cumulative changes since a fixed start time. + temporality: temporality, + } + + /// A single data point in a time series to be associated with a `histogram`. + record histogram-data-point { + /// The set of key value pairs that uniquely identify the time series. + attributes: list, + /// The number of updates this histogram has been calculated with. + count: u64, + /// The upper bounds of the buckets of the histogram. + bounds: list, + /// The count of each of the buckets. + bucket-counts: list, + /// The minimum value recorded. + min: option, + /// The maximum value recorded. + max: option, + /// The sum of the values recorded + sum: metric-number, + /// The sampled `exemplar`s collected during the time series. + exemplars: list, + } + + /// The histogram of all measurements of values from an instrument. + record exponential-histogram { + /// The individual aggregated measurements with unique attributes. + data-points: list, + /// When the time series was started. + start-time: datetime, + /// The time when the time series was recorded. + time: datetime, + /// Describes if the aggregation is reported as the change from the last report + /// time, or the cumulative changes since a fixed start time. + temporality: temporality, + } + + /// A single data point in a time series to be associated with an `exponential-histogram `. + record exponential-histogram-data-point { + /// The set of key value pairs that uniquely identify the time series. + attributes: list, + /// The number of updates this histogram has been calculated with. + count: u64, + /// The minimum value recorded. + min: option, + /// The maximum value recorded. + max: option, + /// The maximum value recorded. + sum: metric-number, + /// Describes the resolution of the histogram. + /// + /// Boundaries are located at powers of the base, where: + /// + /// base = 2 ^ (2 ^ -scale) + scale: s8, + /// The number of values whose absolute value is less than or equal to + /// `zero_threshold`. + /// + /// When `zero_threshold` is `0`, this is the number of values that cannot be + /// expressed using the standard exponential formula as well as values that have + /// been rounded to zero. + zero-count: u64, + /// The range of positive value bucket counts. + positive-bucket: exponential-bucket, + /// The range of negative value bucket counts. + negative-bucket: exponential-bucket, + /// The width of the zero region. + /// + /// Where the zero region is defined as the closed interval + /// [-zero_threshold, zero_threshold]. + zero-threshold: f64, + /// The sampled exemplars collected during the time series. + exemplars: list, + } + + /// A set of bucket counts, encoded in a contiguous array of counts. + record exponential-bucket { + /// The bucket index of the first entry in the `counts` list. + offset: s32, + /// A list where `counts[i]` carries the count of the bucket at index `offset + i`. + /// + /// `counts[i]` is the count of values greater than base^(offset+i) and less than + /// or equal to base^(offset+i+1). + counts: list, + } + + /// A measurement sampled from a time series providing a typical example. + record exemplar { + /// The attributes recorded with the measurement but filtered out of the + /// time series' aggregated data. + filtered-attributes: list, + /// The time when the measurement was recorded. + time: datetime, + /// The measured value. + value: metric-number, + /// The ID of the span that was active during the measurement. + /// + /// If no span was active or the span was not sampled this will be empty. + span-id: span-id, + /// The ID of the trace the active span belonged to during the measurement. + /// + /// If no span was active or the span was not sampled this will be empty. + trace-id: trace-id, + } + + /// Defines the window that an aggregation was calculated over. + enum temporality { + /// A measurement interval that continues to expand forward in time from a + /// starting point. + /// + /// New measurements are added to all previous measurements since a start time. + /// + /// This is the default temporality. + cumulative, + /// A measurement interval that resets each cycle. + /// + /// Measurements from one cycle are recorded independently, measurements from + /// other cycles do not affect them. + delta, + /// Configures Synchronous Counter and Histogram instruments to use + /// Delta aggregation temporality, which allows them to shed memory + /// following a cardinality explosion, thus use less memory. + low-memory, + } + + /// The number types available for any given instrument. + variant metric-number { + %f64(f64), + %s64(s64), + %u64(u64), + } +} diff --git a/wit/deps/otel/tracing.wit b/wit/deps/otel/tracing.wit new file mode 100644 index 0000000000..1143e9bcd4 --- /dev/null +++ b/wit/deps/otel/tracing.wit @@ -0,0 +1,122 @@ +interface tracing { + use wasi:clocks/wall-clock@0.2.0.{datetime}; + use types.{key-value, instrumentation-scope}; + + /// Called when a span is started. + on-start: func(context: span-context); + + /// Called when a span is ended. + on-end: func(span: span-data); + + /// Returns the span context of the host. + outer-span-context: func() -> span-context; + + /// The data associated with a span. + record span-data { + /// Span context. + span-context: span-context, + /// Span parent id. + parent-span-id: string, + /// Span kind. + span-kind: span-kind, + // Span name. + name: string, + /// Span start time. + start-time: datetime, + /// Span end time. + end-time: datetime, + /// Span attributes. + attributes: list, + /// Span events. + events: list, + /// Span Links. + links: list, + /// Span status. + status: status, + /// Instrumentation scope that produced this span. + instrumentation-scope: instrumentation-scope, + /// Number of attributes dropped by the span due to limits being reached. + dropped-attributes: u32, + /// Number of events dropped by the span due to limits being reached. + dropped-events: u32, + /// Number of links dropped by the span due to limits being reached. + dropped-links: u32, + } + + /// Identifying trace information about a span that can be serialized and propagated. + record span-context { + /// The `trace-id` for this `span-context`. + trace-id: trace-id, + /// The `span-id` for this `span-context`. + span-id: span-id, + /// The `trace-flags` for this `span-context`. + trace-flags: trace-flags, + /// Whether this `span-context` was propagated from a remote parent. + is-remote: bool, + /// The `trace-state` for this `span-context`. + trace-state: trace-state, + } + + /// The trace that this `span-context` belongs to. + /// + /// 16 bytes encoded as a hexadecimal string. + type trace-id = string; + + /// The id of this `span-context`. + /// + /// 8 bytes encoded as a hexadecimal string. + type span-id = string; + + /// Flags that can be set on a `span-context`. + flags trace-flags { + /// Whether the `span` should be sampled or not. + sampled, + } + + /// Carries system-specific configuration data, represented as a list of key-value pairs. `trace-state` allows multiple tracing systems to participate in the same trace. + /// + /// If any invalid keys or values are provided then the `trace-state` will be treated as an empty list. + type trace-state = list>; + + /// Describes the relationship between the Span, its parents, and its children in a trace. + enum span-kind { + /// Indicates that the span describes a request to some remote service. This span is usually the parent of a remote server span and does not end until the response is received. + client, + /// Indicates that the span covers server-side handling of a synchronous RPC or other remote request. This span is often the child of a remote client span that was expected to wait for a response. + server, + /// Indicates that the span describes the initiators of an asynchronous request. This parent span will often end before the corresponding child consumer span, possibly even before the child span starts. In messaging scenarios with batching, tracing individual messages requires a new producer span per message to be created. + producer, + /// Indicates that the span describes a child of an asynchronous consumer request. + consumer, + /// Default value. Indicates that the span represents an internal operation within an application, as opposed to an operations with remote parents or children. + internal + } + + /// An event describing a specific moment in time on a span and associated attributes. + record event { + /// Event name. + name: string, + /// Event time. + time: datetime, + /// Event attributes. + attributes: list, + } + + /// Describes a relationship to another `span`. + record link { + /// Denotes which `span` to link to. + span-context: span-context, + /// Attributes describing the link. + attributes: list, + } + + /// The `status` of a `span`. + variant status { + /// The default status. + unset, + /// The operation has been validated by an Application developer or Operator to have completed successfully. + ok, + /// The operation contains an error with a description. + error(string), + } +} diff --git a/wit/deps/otel/types.wit b/wit/deps/otel/types.wit new file mode 100644 index 0000000000..f9c30c9869 --- /dev/null +++ b/wit/deps/otel/types.wit @@ -0,0 +1,48 @@ +interface types { + /// A key-value pair describing an attribute. + record key-value { + /// The attribute name. + key: key, + /// The attribute value. + value: value, + } + + /// The key part of attribute `key-value` pairs. + type key = string; + + /// The value part of attribute `key-value` pairs. + variant value { + /// A string value. + %string(string), + /// A boolean value. + %bool(bool), + /// A double precision floating point value. + %f64(f64), + /// A signed 64 bit integer value. + %s64(s64), + /// A homogeneous array of string values. + string-array(list), + /// A homogeneous array of boolean values. + bool-array(list), + /// A homogeneous array of double precision floating point values. + f64-array(list), + /// A homogeneous array of 64 bit integer values. + s64-array(list), + } + + /// Describes the instrumentation scope that produced telemetry. + record instrumentation-scope { + /// Name of the instrumentation scope. + name: string, + + /// The library version. + version: option, + + /// Schema URL used by this library. + /// https://github.com/open-telemetry/opentelemetry-specification/blob/v1.9.0/specification/schemas/overview.md#schema-url + schema-url: option, + + /// Specifies the instrumentation scope attributes to associate with emitted telemetry. + attributes: list, + } +} diff --git a/wit/deps/otel/world.wit b/wit/deps/otel/world.wit new file mode 100644 index 0000000000..5824151cba --- /dev/null +++ b/wit/deps/otel/world.wit @@ -0,0 +1,7 @@ +package wasi:otel@0.2.0-draft; + +world imports { + import types; + import tracing; + import metrics; +} diff --git a/wit/world.wit b/wit/world.wit index e8c89b2bf0..763d91b193 100644 --- a/wit/world.wit +++ b/wit/world.wit @@ -12,6 +12,7 @@ world platform { import wasi:http/outgoing-handler@0.2.6; include wasi:cli/imports@0.3.0-rc-2025-09-16; import wasi:http/handler@0.3.0-rc-2025-09-16; + include wasi:otel/imports@0.2.0-draft; include fermyon:spin/platform@2.0.0; include wasi:keyvalue/imports@0.2.0-draft2; import spin:postgres/postgres@3.0.0; From 493831fb93dab063b3f641d9ca3c49a4d9a6d93b Mon Sep 17 00:00:00 2001 From: Andrew Steurer <94206073+asteurer@users.noreply.github.com> Date: Fri, 21 Nov 2025 00:01:17 +0000 Subject: [PATCH 02/18] fix(wasi-otel): misc refactoring Signed-off-by: Andrew Steurer <94206073+asteurer@users.noreply.github.com> --- Cargo.lock | 13 +- crates/factor-key-value/src/host.rs | 6 +- crates/factor-key-value/src/lib.rs | 6 +- crates/factor-llm/src/lib.rs | 6 +- crates/factor-otel/Cargo.toml | 2 +- crates/factor-otel/src/host.rs | 3 +- crates/factor-otel/src/lib.rs | 15 +- crates/factor-outbound-http/src/lib.rs | 6 +- crates/factor-outbound-mqtt/src/host.rs | 6 +- crates/factor-outbound-mqtt/src/lib.rs | 4 +- crates/factor-outbound-mysql/src/lib.rs | 6 +- crates/factor-outbound-pg/src/lib.rs | 10 +- crates/factor-outbound-redis/src/host.rs | 4 +- crates/factor-outbound-redis/src/lib.rs | 4 +- crates/factor-sqlite/src/host.rs | 6 +- crates/factor-sqlite/src/lib.rs | 4 +- crates/factor-variables/src/lib.rs | 6 +- crates/trigger-http/src/wasi.rs | 1 - crates/wasi-otel/Cargo.toml | 12 + crates/wasi-otel/src/conversions.rs | 484 ++++++++++++++++++++++ crates/wasi-otel/src/lib.rs | 49 +++ crates/world/src/conversions.rs | 492 ----------------------- 22 files changed, 604 insertions(+), 541 deletions(-) create mode 100644 crates/wasi-otel/Cargo.toml create mode 100644 crates/wasi-otel/src/conversions.rs create mode 100644 crates/wasi-otel/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 35f072bd3c..1b17309114 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9025,10 +9025,10 @@ dependencies = [ "spin-factors", "spin-resource-table", "spin-telemetry", - "spin-world", "toml 0.5.11", "tracing", "tracing-opentelemetry", + "wasi-otel", ] [[package]] @@ -11437,6 +11437,17 @@ version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" +[[package]] +name = "wasi-otel" +version = "3.6.0-pre0" +dependencies = [ + "anyhow", + "async-trait", + "opentelemetry", + "opentelemetry_sdk", + "wasmtime", +] + [[package]] name = "wasip2" version = "1.0.1+wasi-0.2.4" diff --git a/crates/factor-key-value/src/host.rs b/crates/factor-key-value/src/host.rs index a7aef7005c..eda69ace6d 100644 --- a/crates/factor-key-value/src/host.rs +++ b/crates/factor-key-value/src/host.rs @@ -1,7 +1,7 @@ use super::{Cas, SwapError}; use anyhow::{Context, Result}; use spin_core::{async_trait, wasmtime::component::Resource}; -use spin_factor_otel::OtelContext; +use spin_factor_otel::OtelFactorState; use spin_resource_table::Table; use spin_telemetry::traces::{self, Blame}; use spin_world::v2::key_value; @@ -50,7 +50,7 @@ pub struct KeyValueDispatch { manager: Arc, stores: Table>, compare_and_swaps: Table>, - otel_context: Option, + otel_context: Option, } impl KeyValueDispatch { @@ -62,7 +62,7 @@ impl KeyValueDispatch { allowed_stores: HashSet, manager: Arc, capacity: u32, - otel_context: Option, + otel_context: Option, ) -> Self { Self { allowed_stores, diff --git a/crates/factor-key-value/src/lib.rs b/crates/factor-key-value/src/lib.rs index 62929a75ff..a9650baa40 100644 --- a/crates/factor-key-value/src/lib.rs +++ b/crates/factor-key-value/src/lib.rs @@ -8,7 +8,7 @@ use std::{ }; use anyhow::ensure; -use spin_factor_otel::OtelContext; +use spin_factor_otel::OtelFactorState; use spin_factors::{ ConfigureAppContext, Factor, FactorData, FactorInstanceBuilder, InitContext, PrepareContext, RuntimeFactors, @@ -96,7 +96,7 @@ impl Factor for KeyValueFactor { .get(ctx.app_component().id()) .expect("component should be in component_stores") .clone(); - let otel_context = OtelContext::from_prepare_context(&mut ctx)?; + let otel_context = OtelFactorState::from_prepare_context(&mut ctx)?; Ok(InstanceBuilder { store_manager: app_state.store_manager.clone(), allowed_stores, @@ -180,7 +180,7 @@ pub struct InstanceBuilder { store_manager: Arc, /// The allowed stores for this component instance. allowed_stores: HashSet, - otel_context: OtelContext, + otel_context: OtelFactorState, } impl FactorInstanceBuilder for InstanceBuilder { diff --git a/crates/factor-llm/src/lib.rs b/crates/factor-llm/src/lib.rs index b3e5c6a700..106594beeb 100644 --- a/crates/factor-llm/src/lib.rs +++ b/crates/factor-llm/src/lib.rs @@ -5,7 +5,7 @@ use std::collections::{HashMap, HashSet}; use std::sync::Arc; use async_trait::async_trait; -use spin_factor_otel::OtelContext; +use spin_factor_otel::OtelFactorState; use spin_factors::{ ConfigureAppContext, Factor, FactorData, PrepareContext, RuntimeFactors, SelfInstanceBuilder, }; @@ -83,7 +83,7 @@ impl Factor for LlmFactor { .cloned() .unwrap_or_default(); let engine = ctx.app_state().engine.clone(); - let otel_context = OtelContext::from_prepare_context(&mut ctx)?; + let otel_context = OtelFactorState::from_prepare_context(&mut ctx)?; Ok(InstanceState { engine, @@ -103,7 +103,7 @@ pub struct AppState { pub struct InstanceState { engine: Arc>, pub allowed_models: Arc>, - otel_context: OtelContext, + otel_context: OtelFactorState, } /// The runtime configuration for the LLM factor. diff --git a/crates/factor-otel/Cargo.toml b/crates/factor-otel/Cargo.toml index 1dcdb98c82..eb51afc54c 100644 --- a/crates/factor-otel/Cargo.toml +++ b/crates/factor-otel/Cargo.toml @@ -14,7 +14,7 @@ spin-core = { path = "../core" } spin-factors = { path = "../factors" } spin-resource-table = { path = "../table" } spin-telemetry = { path = "../telemetry" } -spin-world = { path = "../world" } +wasi-otel = { path = "../wasi-otel" } tracing = { workspace = true } tracing-opentelemetry = { workspace = true } diff --git a/crates/factor-otel/src/host.rs b/crates/factor-otel/src/host.rs index 8ece27d5b1..b9b7baf5c3 100644 --- a/crates/factor-otel/src/host.rs +++ b/crates/factor-otel/src/host.rs @@ -5,8 +5,9 @@ use opentelemetry::trace::TraceContextExt; use opentelemetry_sdk::error::OTelSdkError; use opentelemetry_sdk::metrics::exporter::PushMetricExporter; use opentelemetry_sdk::trace::SpanProcessor; -use spin_world::wasi; use tracing_opentelemetry::OpenTelemetrySpanExt; +// TODO: This feels weird. I'm wondering if it can be fixed by wrangling the bindgen macro in `crates/wasi_otel/lib.rs`. +use wasi_otel::wasi; impl wasi::otel::tracing::Host for InstanceState { async fn on_start(&mut self, context: wasi::otel::tracing::SpanContext) -> Result<()> { diff --git a/crates/factor-otel/src/lib.rs b/crates/factor-otel/src/lib.rs index c224ce3730..8563bd17ff 100644 --- a/crates/factor-otel/src/lib.rs +++ b/crates/factor-otel/src/lib.rs @@ -29,8 +29,9 @@ impl Factor for OtelFactor { type InstanceBuilder = InstanceState; fn init(&mut self, ctx: &mut impl spin_factors::InitContext) -> anyhow::Result<()> { - ctx.link_bindings(spin_world::wasi::otel::tracing::add_to_linker::<_, FactorData>)?; - ctx.link_bindings(spin_world::wasi::otel::metrics::add_to_linker::<_, FactorData>)?; + // TODO: This feels weird. I'm wondering if it can be fixed by wrangling the bindgen macro in `crates/wasi_otel/lib.rs`. + ctx.link_bindings(wasi_otel::wasi::otel::tracing::add_to_linker::<_, FactorData>)?; + ctx.link_bindings(wasi_otel::wasi::otel::metrics::add_to_linker::<_, FactorData>)?; Ok(()) } @@ -135,15 +136,15 @@ pub(crate) struct State { /// Manages access to the OtelFactor state for the purpose of maintaining proper span /// parent/child relationships when WASI Otel spans are being created. -pub struct OtelContext { +pub struct OtelFactorState { pub(crate) state: Option>>, } -impl OtelContext { - /// Creates an [`OtelContext`] from a [`PrepareContext`]. +impl OtelFactorState { + /// Creates an [`OtelFactorState`] from a [`PrepareContext`]. /// /// If [`RuntimeFactors`] does not contain an [`OtelFactor`], then calling - /// [`OtelContext::reparent_tracing_span`] will be a no-op. + /// [`OtelFactorState::reparent_tracing_span`] will be a no-op. pub fn from_prepare_context( prepare_context: &mut PrepareContext, ) -> anyhow::Result { @@ -170,7 +171,7 @@ impl OtelContext { /// /// Setting the guest spans parent as the host is enabled through current_span_context. /// However, the more difficult task is having the host factor spans be children of the guest - /// span. [`OtelContext::reparent_tracing_span`] handles this by reparenting the current span to + /// span. [`OtelFactorState::reparent_tracing_span`] handles this by reparenting the current span to /// be a child of the last active guest span (which is tracked internally in the otel factor). /// /// Note that if the otel factor is not in your [`RuntimeFactors`] than this is effectively a diff --git a/crates/factor-outbound-http/src/lib.rs b/crates/factor-outbound-http/src/lib.rs index 0f75d87b06..63a9812134 100644 --- a/crates/factor-outbound-http/src/lib.rs +++ b/crates/factor-outbound-http/src/lib.rs @@ -14,7 +14,7 @@ use http::{ }; use intercept::OutboundHttpInterceptor; use runtime_config::RuntimeConfig; -use spin_factor_otel::OtelContext; +use spin_factor_otel::OtelFactorState; use spin_factor_outbound_networking::{ config::{allowed_hosts::OutboundAllowedHosts, blocked_networks::BlockedNetworks}, ComponentTlsClientConfigs, OutboundNetworkingFactor, @@ -75,7 +75,7 @@ impl Factor for OutboundHttpFactor { let allowed_hosts = outbound_networking.allowed_hosts(); let blocked_networks = outbound_networking.blocked_networks(); let component_tls_configs = outbound_networking.component_tls_configs(); - let otel_context = OtelContext::from_prepare_context(&mut ctx)?; + let otel_context = OtelFactorState::from_prepare_context(&mut ctx)?; Ok(InstanceState { wasi_http_ctx: WasiHttpCtx::new(), allowed_hosts, @@ -118,7 +118,7 @@ pub struct InstanceState { /// A semaphore to limit the number of concurrent outbound connections. concurrent_outbound_connections_semaphore: Option>, /// Manages access to the OtelFactor state. - otel_context: OtelContext, + otel_context: OtelFactorState, } impl InstanceState { diff --git a/crates/factor-outbound-mqtt/src/host.rs b/crates/factor-outbound-mqtt/src/host.rs index 53cb6a9830..a39d1a4b60 100644 --- a/crates/factor-outbound-mqtt/src/host.rs +++ b/crates/factor-outbound-mqtt/src/host.rs @@ -2,9 +2,9 @@ use std::{sync::Arc, time::Duration}; use anyhow::Result; use spin_core::{async_trait, wasmtime::component::Resource}; +use spin_factor_otel::OtelFactorState; use spin_factor_outbound_networking::config::allowed_hosts::OutboundAllowedHosts; use spin_world::v2::mqtt::{self as v2, Connection, Error, Qos}; -use spin_factor_otel::OtelContext; use tracing::{instrument, Level}; use crate::ClientCreator; @@ -13,14 +13,14 @@ pub struct InstanceState { allowed_hosts: OutboundAllowedHosts, connections: spin_resource_table::Table>, create_client: Arc, - otel_context: OtelContext, + otel_context: OtelFactorState, } impl InstanceState { pub fn new( allowed_hosts: OutboundAllowedHosts, create_client: Arc, - otel_context: OtelContext, + otel_context: OtelFactorState, ) -> Self { Self { allowed_hosts, diff --git a/crates/factor-outbound-mqtt/src/lib.rs b/crates/factor-outbound-mqtt/src/lib.rs index 250aa09d5c..7297624696 100644 --- a/crates/factor-outbound-mqtt/src/lib.rs +++ b/crates/factor-outbound-mqtt/src/lib.rs @@ -7,7 +7,7 @@ use host::other_error; use host::InstanceState; use rumqttc::{AsyncClient, Event, Incoming, Outgoing, QoS}; use spin_core::async_trait; -use spin_factor_otel::OtelContext; +use spin_factor_otel::OtelFactorState; use spin_factor_outbound_networking::OutboundNetworkingFactor; use spin_factors::{ ConfigureAppContext, Factor, FactorData, PrepareContext, RuntimeFactors, SelfInstanceBuilder, @@ -51,7 +51,7 @@ impl Factor for OutboundMqttFactor { let allowed_hosts = ctx .instance_builder::()? .allowed_hosts(); - let otel_context = OtelContext::from_prepare_context(&mut ctx)?; + let otel_context = OtelFactorState::from_prepare_context(&mut ctx)?; Ok(InstanceState::new( allowed_hosts, diff --git a/crates/factor-outbound-mysql/src/lib.rs b/crates/factor-outbound-mysql/src/lib.rs index e1bf9aabdb..2e6faddc84 100644 --- a/crates/factor-outbound-mysql/src/lib.rs +++ b/crates/factor-outbound-mysql/src/lib.rs @@ -3,7 +3,7 @@ mod host; use client::Client; use mysql_async::Conn as MysqlClient; -use spin_factor_otel::OtelContext; +use spin_factor_otel::OtelFactorState; use spin_factor_outbound_networking::{ config::allowed_hosts::OutboundAllowedHosts, OutboundNetworkingFactor, }; @@ -40,7 +40,7 @@ impl Factor for OutboundMysqlFactor { let allowed_hosts = ctx .instance_builder::()? .allowed_hosts(); - let otel_context = OtelContext::from_prepare_context(&mut ctx)?; + let otel_context = OtelFactorState::from_prepare_context(&mut ctx)?; Ok(InstanceState { allowed_hosts, @@ -67,7 +67,7 @@ impl OutboundMysqlFactor { pub struct InstanceState { allowed_hosts: OutboundAllowedHosts, connections: spin_resource_table::Table, - otel_context: OtelContext, + otel_context: OtelFactorState, } impl SelfInstanceBuilder for InstanceState {} diff --git a/crates/factor-outbound-pg/src/lib.rs b/crates/factor-outbound-pg/src/lib.rs index a793271fef..37c7f13573 100644 --- a/crates/factor-outbound-pg/src/lib.rs +++ b/crates/factor-outbound-pg/src/lib.rs @@ -2,11 +2,8 @@ pub mod client; mod host; mod types; -use std::sync::Arc; - -use client::Client; use client::ClientFactory; -use spin_factor_otel::OtelContext; +use spin_factor_otel::OtelFactorState; use spin_factor_outbound_networking::{ config::allowed_hosts::OutboundAllowedHosts, OutboundNetworkingFactor, }; @@ -14,6 +11,7 @@ use spin_factors::{ anyhow, ConfigureAppContext, Factor, FactorData, PrepareContext, RuntimeFactors, SelfInstanceBuilder, }; +use std::sync::Arc; pub struct OutboundPgFactor { _phantom: std::marker::PhantomData, @@ -50,7 +48,7 @@ impl Factor for OutboundPgFactor { let allowed_hosts = ctx .instance_builder::()? .allowed_hosts(); - let otel_context = OtelContext::from_prepare_context(&mut ctx)?; + let otel_context = OtelFactorState::from_prepare_context(&mut ctx)?; Ok(InstanceState { allowed_hosts, @@ -79,7 +77,7 @@ pub struct InstanceState { allowed_hosts: OutboundAllowedHosts, client_factory: Arc, connections: spin_resource_table::Table, - otel_context: OtelContext, + otel_context: OtelFactorState, } impl SelfInstanceBuilder for InstanceState {} diff --git a/crates/factor-outbound-redis/src/host.rs b/crates/factor-outbound-redis/src/host.rs index ac1c817ebb..2f265b90dc 100644 --- a/crates/factor-outbound-redis/src/host.rs +++ b/crates/factor-outbound-redis/src/host.rs @@ -5,7 +5,7 @@ use redis::io::AsyncDNSResolver; use redis::AsyncConnectionConfig; use redis::{aio::MultiplexedConnection, AsyncCommands, FromRedisValue, Value}; use spin_core::wasmtime::component::Resource; -use spin_factor_otel::OtelContext; +use spin_factor_otel::OtelFactorState; use spin_factor_outbound_networking::config::allowed_hosts::OutboundAllowedHosts; use spin_factor_outbound_networking::config::blocked_networks::BlockedNetworks; use spin_world::v1::{redis as v1, redis_types}; @@ -19,7 +19,7 @@ pub struct InstanceState { pub allowed_hosts: OutboundAllowedHosts, pub blocked_networks: BlockedNetworks, pub connections: spin_resource_table::Table, - pub otel_context: OtelContext, + pub otel_context: OtelFactorState, } impl InstanceState { diff --git a/crates/factor-outbound-redis/src/lib.rs b/crates/factor-outbound-redis/src/lib.rs index 09bf410931..d432bf5c51 100644 --- a/crates/factor-outbound-redis/src/lib.rs +++ b/crates/factor-outbound-redis/src/lib.rs @@ -1,7 +1,7 @@ mod host; use host::InstanceState; -use spin_factor_otel::OtelContext; +use spin_factor_otel::OtelFactorState; use spin_factor_outbound_networking::OutboundNetworkingFactor; use spin_factors::{ anyhow, ConfigureAppContext, Factor, FactorData, PrepareContext, RuntimeFactors, @@ -42,7 +42,7 @@ impl Factor for OutboundRedisFactor { &self, mut ctx: PrepareContext, ) -> anyhow::Result { - let otel_context = OtelContext::from_prepare_context(&mut ctx)?; + let otel_context = OtelFactorState::from_prepare_context(&mut ctx)?; let outbound_networking = ctx.instance_builder::()?; Ok(InstanceState { diff --git a/crates/factor-sqlite/src/host.rs b/crates/factor-sqlite/src/host.rs index e6ed819a54..ddc6d0f5a8 100644 --- a/crates/factor-sqlite/src/host.rs +++ b/crates/factor-sqlite/src/host.rs @@ -1,7 +1,7 @@ use std::collections::{HashMap, HashSet}; use std::sync::Arc; -use spin_factor_otel::OtelContext; +use spin_factor_otel::OtelFactorState; use spin_factors::wasmtime::component::Resource; use spin_factors::{anyhow, SelfInstanceBuilder}; use spin_world::spin::sqlite::sqlite as v3; @@ -18,7 +18,7 @@ pub struct InstanceState { connections: spin_resource_table::Table>, /// A map from database label to connection creators. connection_creators: HashMap>, - otel_context: OtelContext, + otel_context: OtelFactorState, } impl InstanceState { @@ -28,7 +28,7 @@ impl InstanceState { pub fn new( allowed_databases: Arc>, connection_creators: HashMap>, - otel_context: OtelContext, + otel_context: OtelFactorState, ) -> Self { Self { allowed_databases, diff --git a/crates/factor-sqlite/src/lib.rs b/crates/factor-sqlite/src/lib.rs index ae3b4686e0..cf7d955680 100644 --- a/crates/factor-sqlite/src/lib.rs +++ b/crates/factor-sqlite/src/lib.rs @@ -7,8 +7,8 @@ use std::sync::Arc; use host::InstanceState; use async_trait::async_trait; +use spin_factor_otel::OtelFactorState; use spin_factors::{anyhow, Factor, FactorData}; -use spin_factor_otel::OtelContext; use spin_locked_app::MetadataKey; use spin_world::spin::sqlite::sqlite as v3; use spin_world::v1::sqlite as v1; @@ -83,7 +83,7 @@ impl Factor for SqliteFactor { .get(ctx.app_component().id()) .cloned() .unwrap_or_default(); - let otel_context = OtelContext::from_prepare_context(&mut ctx)?; + let otel_context = OtelFactorState::from_prepare_context(&mut ctx)?; Ok(InstanceState::new( allowed_databases, ctx.app_state().connection_creators.clone(), diff --git a/crates/factor-variables/src/lib.rs b/crates/factor-variables/src/lib.rs index 43d489ecae..7801b9f18e 100644 --- a/crates/factor-variables/src/lib.rs +++ b/crates/factor-variables/src/lib.rs @@ -5,7 +5,7 @@ use std::sync::Arc; use runtime_config::RuntimeConfig; use spin_expressions::{ProviderResolver as ExpressionResolver, Template}; -use spin_factor_otel::OtelContext; +use spin_factor_otel::OtelFactorState; use spin_factors::{ anyhow, ConfigureAppContext, Factor, FactorData, InitContext, PrepareContext, RuntimeFactors, SelfInstanceBuilder, @@ -67,7 +67,7 @@ impl Factor for VariablesFactor { ) -> anyhow::Result { let component_id = ctx.app_component().id().to_string(); let expression_resolver = ctx.app_state().expression_resolver.clone(); - let otel_context = OtelContext::from_prepare_context(&mut ctx)?; + let otel_context = OtelFactorState::from_prepare_context(&mut ctx)?; Ok(InstanceState { component_id, expression_resolver, @@ -97,7 +97,7 @@ impl AppState { pub struct InstanceState { component_id: String, expression_resolver: Arc, - otel_context: OtelContext, + otel_context: OtelFactorState, } impl InstanceState { diff --git a/crates/trigger-http/src/wasi.rs b/crates/trigger-http/src/wasi.rs index d41ec69292..f44169e2eb 100644 --- a/crates/trigger-http/src/wasi.rs +++ b/crates/trigger-http/src/wasi.rs @@ -109,7 +109,6 @@ impl HttpExecutor for WasiHttpExecutor<'_, S> { HandlerType::Wagi(_) => unreachable!("should have used WagiExecutor instead"), }; - let span = tracing::debug_span!("execute_wasi"); let handle = task::spawn( async move { let result = match handler { diff --git a/crates/wasi-otel/Cargo.toml b/crates/wasi-otel/Cargo.toml new file mode 100644 index 0000000000..b923f7b938 --- /dev/null +++ b/crates/wasi-otel/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "wasi-otel" +version = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } + +[dependencies] +anyhow = { workspace = true } +async-trait = { workspace = true } +opentelemetry = { workspace = true } +opentelemetry_sdk = { workspace = true } +wasmtime = { workspace = true } diff --git a/crates/wasi-otel/src/conversions.rs b/crates/wasi-otel/src/conversions.rs new file mode 100644 index 0000000000..d8b21719ce --- /dev/null +++ b/crates/wasi-otel/src/conversions.rs @@ -0,0 +1,484 @@ +use super::*; +use opentelemetry::StringValue; +use opentelemetry_sdk::trace::{SpanEvents, SpanLinks}; +use std::borrow::Cow; +use std::time::{Duration, SystemTime, UNIX_EPOCH}; +use wasi::clocks0_2_0::wall_clock; + +impl From + for opentelemetry_sdk::metrics::data::ResourceMetrics +{ + fn from(value: wasi::otel::metrics::ResourceMetrics) -> Self { + Self { + resource: value.resource.into(), + scope_metrics: value.scope_metrics.into_iter().map(Into::into).collect(), + } + } +} + +impl From for opentelemetry_sdk::Resource { + fn from(value: wasi::otel::metrics::Resource) -> Self { + let attributes: Vec = + value.attributes.into_iter().map(Into::into).collect(); + let schema_url: Option = value.schema_url; + match schema_url { + Some(url) => opentelemetry_sdk::resource::Resource::builder() + .with_schema_url(attributes, url) + .build(), + None => opentelemetry_sdk::resource::Resource::builder() + .with_attributes(attributes) + .build(), + } + } +} + +impl From for opentelemetry_sdk::metrics::data::ScopeMetrics { + fn from(value: wasi::otel::metrics::ScopeMetrics) -> Self { + Self { + scope: value.scope.into(), + metrics: value.metrics.into_iter().map(Into::into).collect(), + } + } +} + +impl From for opentelemetry_sdk::metrics::data::Metric { + fn from(value: wasi::otel::metrics::Metric) -> Self { + Self { + name: Cow::Owned(value.name), + description: Cow::Owned(value.description), + unit: Cow::Owned(value.unit), + data: value.data.into(), + } + } +} + +/// Converts a Wasi exemplar to an OTel exemplar +macro_rules! exemplars_to_otel { + ( + $wasi_exemplar_list:expr, + $exemplar_type:ty + ) => { + $wasi_exemplar_list + .iter() + .map(|e| { + let span_id: [u8; 8] = e + .span_id + .as_bytes() + .try_into() + .expect("failed to parse span ID"); + let trace_id: [u8; 16] = e + .trace_id + .as_bytes() + .try_into() + .expect("failed to parse trace ID"); + opentelemetry_sdk::metrics::data::Exemplar::<$exemplar_type> { + filtered_attributes: e + .filtered_attributes + .to_owned() + .into_iter() + .map(Into::into) + .collect(), + time: e.time.into(), + value: e.value.into(), + span_id, + trace_id, + } + }) + .collect() + }; +} + +/// Converts a WASI Gauge to an OTel Gauge +macro_rules! wasi_gauge_to_otel { + ($gauge:expr, $number_type:ty) => { + Box::new(opentelemetry_sdk::metrics::data::Gauge { + data_points: $gauge + .data_points + .iter() + .map(|dp| opentelemetry_sdk::metrics::data::GaugeDataPoint { + attributes: dp.attributes.iter().map(Into::into).collect(), + value: dp.value.into(), + exemplars: exemplars_to_otel!(dp.exemplars, $number_type), + }) + .collect(), + start_time: match $gauge.start_time { + Some(t) => Some(t.into()), + None => None, + }, + time: $gauge.time.into(), + }) + }; +} + +/// Converts a WASI Sum to an OTel Sum +macro_rules! wasi_sum_to_otel { + ($sum:expr, $number_type:ty) => { + Box::new(opentelemetry_sdk::metrics::data::Sum { + data_points: $sum + .data_points + .iter() + .map(|dp| opentelemetry_sdk::metrics::data::SumDataPoint { + attributes: dp.attributes.iter().map(Into::into).collect(), + exemplars: exemplars_to_otel!(dp.exemplars, $number_type), + value: dp.value.into(), + }) + .collect(), + start_time: $sum.start_time.into(), + time: $sum.time.into(), + temporality: $sum.temporality.into(), + is_monotonic: $sum.is_monotonic, + }) + }; +} + +/// Converts a WASI Histogram to an OTel Histogram +macro_rules! wasi_histogram_to_otel { + ($histogram:expr, $number_type:ty) => { + Box::new(opentelemetry_sdk::metrics::data::Histogram { + data_points: $histogram + .data_points + .iter() + .map(|dp| opentelemetry_sdk::metrics::data::HistogramDataPoint { + attributes: dp.attributes.iter().map(Into::into).collect(), + bounds: dp.bounds.to_owned(), + bucket_counts: dp.bucket_counts.to_owned(), + exemplars: exemplars_to_otel!(dp.exemplars, $number_type), + count: dp.count, + max: match dp.max { + Some(m) => Some(m.into()), + None => None, + }, + min: match dp.min { + Some(m) => Some(m.into()), + None => None, + }, + sum: dp.sum.into(), + }) + .collect(), + start_time: $histogram.start_time.into(), + time: $histogram.time.into(), + temporality: $histogram.temporality.into(), + }) + }; +} + +/// Converts a WASI ExponentialHistogram to an OTel ExponentialHistogram +macro_rules! wasi_exponential_histogram_to_otel { + ($histogram:expr, $number_type:ty) => { + Box::new(opentelemetry_sdk::metrics::data::ExponentialHistogram { + data_points: $histogram + .data_points + .iter() + .map( + |dp| opentelemetry_sdk::metrics::data::ExponentialHistogramDataPoint { + attributes: dp.attributes.iter().map(Into::into).collect(), + exemplars: exemplars_to_otel!(dp.exemplars, $number_type), + count: dp.count as usize, + max: match dp.max { + Some(m) => Some(m.into()), + None => None, + }, + min: match dp.min { + Some(m) => Some(m.into()), + None => None, + }, + sum: dp.sum.into(), + scale: dp.scale, + zero_count: dp.zero_count, + positive_bucket: dp.positive_bucket.to_owned().into(), + negative_bucket: dp.negative_bucket.to_owned().into(), + zero_threshold: dp.zero_threshold, + }, + ) + .collect(), + start_time: $histogram.start_time.into(), + time: $histogram.time.into(), + temporality: $histogram.temporality.into(), + }) + }; +} + +impl From + for Box +{ + fn from(value: wasi::otel::metrics::MetricData) -> Self { + match value { + wasi::otel::metrics::MetricData::F64Sum(s) => wasi_sum_to_otel!(s, f64), + wasi::otel::metrics::MetricData::S64Sum(s) => wasi_sum_to_otel!(s, i64), + wasi::otel::metrics::MetricData::U64Sum(s) => wasi_sum_to_otel!(s, u64), + wasi::otel::metrics::MetricData::F64Gauge(g) => wasi_gauge_to_otel!(g, f64), + wasi::otel::metrics::MetricData::S64Gauge(g) => wasi_gauge_to_otel!(g, i64), + wasi::otel::metrics::MetricData::U64Gauge(g) => wasi_gauge_to_otel!(g, u64), + wasi::otel::metrics::MetricData::F64Histogram(h) => wasi_histogram_to_otel!(h, f64), + wasi::otel::metrics::MetricData::S64Histogram(h) => wasi_histogram_to_otel!(h, i64), + wasi::otel::metrics::MetricData::U64Histogram(h) => wasi_histogram_to_otel!(h, u64), + wasi::otel::metrics::MetricData::F64ExponentialHistogram(h) => { + wasi_exponential_histogram_to_otel!(h, f64) + } + wasi::otel::metrics::MetricData::S64ExponentialHistogram(h) => { + wasi_exponential_histogram_to_otel!(h, i64) + } + wasi::otel::metrics::MetricData::U64ExponentialHistogram(h) => { + wasi_exponential_histogram_to_otel!(h, u64) + } + } + } +} + +impl From for f64 { + fn from(value: wasi::otel::metrics::MetricNumber) -> Self { + match value { + wasi::otel::metrics::MetricNumber::F64(n) => n, + _ => panic!("error converting WASI MetricNumber to f64"), + } + } +} + +impl From for u64 { + fn from(value: wasi::otel::metrics::MetricNumber) -> Self { + match value { + wasi::otel::metrics::MetricNumber::U64(n) => n, + _ => panic!("error converting WASI MetricNumber to u64"), + } + } +} + +impl From for i64 { + fn from(value: wasi::otel::metrics::MetricNumber) -> Self { + match value { + wasi::otel::metrics::MetricNumber::S64(n) => n, + _ => panic!("error converting WASI MetricNumber to i64"), + } + } +} + +impl From + for opentelemetry_sdk::metrics::data::ExponentialBucket +{ + fn from(value: wasi::otel::metrics::ExponentialBucket) -> Self { + Self { + offset: value.offset, + counts: value.counts, + } + } +} + +impl From for opentelemetry_sdk::metrics::Temporality { + fn from(value: wasi::otel::metrics::Temporality) -> Self { + use opentelemetry_sdk::metrics::Temporality; + match value { + wasi::otel::metrics::Temporality::Cumulative => Temporality::Cumulative, + wasi::otel::metrics::Temporality::Delta => Temporality::Delta, + wasi::otel::metrics::Temporality::LowMemory => Temporality::LowMemory, + } + } +} + +impl From for opentelemetry_sdk::trace::SpanData { + fn from(value: wasi::otel::tracing::SpanData) -> Self { + let mut span_events = SpanEvents::default(); + span_events.events = value.events.into_iter().map(Into::into).collect(); + span_events.dropped_count = value.dropped_events; + let mut span_links = SpanLinks::default(); + span_links.links = value.links.into_iter().map(Into::into).collect(); + span_links.dropped_count = value.dropped_links; + Self { + span_context: value.span_context.into(), + parent_span_id: opentelemetry::trace::SpanId::from_hex(&value.parent_span_id) + .unwrap_or(opentelemetry::trace::SpanId::INVALID), + span_kind: value.span_kind.into(), + name: value.name.into(), + start_time: value.start_time.into(), + end_time: value.end_time.into(), + attributes: value.attributes.into_iter().map(Into::into).collect(), + dropped_attributes_count: value.dropped_attributes, + events: span_events, + links: span_links, + status: value.status.into(), + instrumentation_scope: value.instrumentation_scope.into(), + } + } +} + +impl From for opentelemetry::trace::SpanContext { + fn from(sc: wasi::otel::tracing::SpanContext) -> Self { + let trace_id = opentelemetry::trace::TraceId::from_hex(&sc.trace_id) + .unwrap_or(opentelemetry::trace::TraceId::INVALID); + let span_id = opentelemetry::trace::SpanId::from_hex(&sc.span_id) + .unwrap_or(opentelemetry::trace::SpanId::INVALID); + let trace_state = opentelemetry::trace::TraceState::from_key_value(sc.trace_state) + .unwrap_or_else(|_| opentelemetry::trace::TraceState::default()); + Self::new( + trace_id, + span_id, + sc.trace_flags.into(), + sc.is_remote, + trace_state, + ) + } +} + +impl From for wasi::otel::tracing::SpanContext { + fn from(sc: opentelemetry::trace::SpanContext) -> Self { + Self { + trace_id: format!("{:x}", sc.trace_id()), + span_id: format!("{:x}", sc.span_id()), + trace_flags: sc.trace_flags().into(), + is_remote: sc.is_remote(), + trace_state: sc + .trace_state() + .header() + .split(',') + .filter_map(|s| { + if let Some((key, value)) = s.split_once('=') { + Some((key.to_string(), value.to_string())) + } else { + None + } + }) + .collect(), + } + } +} + +impl From for opentelemetry::trace::TraceFlags { + fn from(flags: wasi::otel::tracing::TraceFlags) -> Self { + Self::new(flags.as_array()[0] as u8) + } +} + +impl From for wasi::otel::tracing::TraceFlags { + fn from(flags: opentelemetry::trace::TraceFlags) -> Self { + if flags.is_sampled() { + wasi::otel::tracing::TraceFlags::SAMPLED + } else { + wasi::otel::tracing::TraceFlags::empty() + } + } +} + +impl From for opentelemetry::trace::SpanKind { + fn from(kind: wasi::otel::tracing::SpanKind) -> Self { + match kind { + wasi::otel::tracing::SpanKind::Client => opentelemetry::trace::SpanKind::Client, + wasi::otel::tracing::SpanKind::Server => opentelemetry::trace::SpanKind::Server, + wasi::otel::tracing::SpanKind::Producer => opentelemetry::trace::SpanKind::Producer, + wasi::otel::tracing::SpanKind::Consumer => opentelemetry::trace::SpanKind::Consumer, + wasi::otel::tracing::SpanKind::Internal => opentelemetry::trace::SpanKind::Internal, + } + } +} + +impl From for opentelemetry::KeyValue { + fn from(kv: wasi::otel::tracing::KeyValue) -> Self { + opentelemetry::KeyValue::new(kv.key, kv.value) + } +} + +impl From<&wasi::otel::tracing::KeyValue> for opentelemetry::KeyValue { + fn from(kv: &wasi::otel::tracing::KeyValue) -> Self { + opentelemetry::KeyValue::new(kv.key.to_owned(), kv.value.to_owned()) + } +} + +impl From for opentelemetry::Value { + fn from(value: wasi::otel::types::Value) -> Self { + match value { + wasi::otel::types::Value::String(v) => v.into(), + wasi::otel::types::Value::Bool(v) => v.into(), + wasi::otel::types::Value::F64(v) => v.into(), + wasi::otel::types::Value::S64(v) => v.into(), + wasi::otel::types::Value::StringArray(v) => opentelemetry::Value::Array( + v.into_iter() + .map(StringValue::from) + .collect::>() + .into(), + ), + wasi::otel::types::Value::BoolArray(v) => opentelemetry::Value::Array(v.into()), + wasi::otel::types::Value::F64Array(v) => opentelemetry::Value::Array(v.into()), + wasi::otel::types::Value::S64Array(v) => opentelemetry::Value::Array(v.into()), + } + } +} + +impl From for opentelemetry::trace::Event { + fn from(event: wasi::otel::tracing::Event) -> Self { + Self::new( + event.name, + event.time.into(), + event.attributes.into_iter().map(Into::into).collect(), + 0, + ) + } +} + +impl From for opentelemetry::trace::Link { + fn from(link: wasi::otel::tracing::Link) -> Self { + Self::new( + link.span_context.into(), + link.attributes.into_iter().map(Into::into).collect(), + 0, + ) + } +} + +impl From for opentelemetry::trace::Status { + fn from(status: wasi::otel::tracing::Status) -> Self { + match status { + wasi::otel::tracing::Status::Unset => Self::Unset, + wasi::otel::tracing::Status::Ok => Self::Ok, + wasi::otel::tracing::Status::Error(s) => Self::Error { + description: s.into(), + }, + } + } +} + +impl From for opentelemetry::InstrumentationScope { + fn from(value: wasi::otel::tracing::InstrumentationScope) -> Self { + let builder = + Self::builder(value.name).with_attributes(value.attributes.into_iter().map(Into::into)); + match (value.version, value.schema_url) { + (Some(version), Some(schema_url)) => builder + .with_version(version) + .with_schema_url(schema_url) + .build(), + (Some(version), None) => builder.with_version(version).build(), + (None, Some(schema_url)) => builder.with_schema_url(schema_url).build(), + (None, None) => builder.build(), + } + } +} + +impl From for SystemTime { + fn from(timestamp: wall_clock::Datetime) -> Self { + UNIX_EPOCH + + Duration::from_secs(timestamp.seconds) + + Duration::from_nanos(timestamp.nanoseconds as u64) + } +} + +mod test { + #[test] + fn trace_flags() { + let flags = opentelemetry::trace::TraceFlags::SAMPLED; + let flags2 = crate::wasi::otel::tracing::TraceFlags::from(flags); + let flags3 = opentelemetry::trace::TraceFlags::from(flags2); + assert_eq!(flags, flags3); + } + + #[test] + fn span_context() { + let sc = opentelemetry::trace::SpanContext::new( + opentelemetry::trace::TraceId::from_hex("4fb34cb4484029f7881399b149e41e98").unwrap(), + opentelemetry::trace::SpanId::from_hex("9ffd58d3cd4dd90b").unwrap(), + opentelemetry::trace::TraceFlags::SAMPLED, + false, + opentelemetry::trace::TraceState::from_key_value(vec![("foo", "bar"), ("baz", "qux")]) + .unwrap(), + ); + let sc2 = crate::wasi::otel::tracing::SpanContext::from(sc.clone()); + let sc3 = opentelemetry::trace::SpanContext::from(sc2); + assert_eq!(sc, sc3); + } +} diff --git a/crates/wasi-otel/src/lib.rs b/crates/wasi-otel/src/lib.rs new file mode 100644 index 0000000000..52c8a5e63f --- /dev/null +++ b/crates/wasi-otel/src/lib.rs @@ -0,0 +1,49 @@ +#![allow(missing_docs)] +#![allow(non_camel_case_types)] // bindgen emits Host_Pre and Host_Indices + +pub use async_trait::async_trait; + +wasmtime::component::bindgen!({ + inline: r#" + package fermyon:runtime; + world host { + include fermyon:spin/host; + include fermyon:spin/platform@2.0.0; + include fermyon:spin/platform@3.0.0; + include spin:up/platform@3.2.0; + include spin:up/platform@3.4.0; + include spin:up/platform@3.5.0; + include wasi:keyvalue/imports@0.2.0-draft2; + } + "#, + path: "../../wit", + imports: { default: async | trappable }, + exports: { default: async }, + // The following is a roundabout way of saying "the host implementations for these interfaces don't trap" + trappable_error_type: { + "fermyon:spin/config/error" => v1::config::Error, + "fermyon:spin/http-types/http-error" => v1::http_types::HttpError, + "fermyon:spin/llm@2.0.0/error" => v2::llm::Error, + "fermyon:spin/llm/error" => v1::llm::Error, + "fermyon:spin/mqtt@2.0.0/error" => v2::mqtt::Error, + "fermyon:spin/mysql/mysql-error" => v1::mysql::MysqlError, + "fermyon:spin/postgres/pg-error" => v1::postgres::PgError, + "fermyon:spin/rdbms-types@2.0.0/error" => v2::rdbms_types::Error, + "fermyon:spin/redis-types/error" => v1::redis_types::Error, + "fermyon:spin/redis@2.0.0/error" => v2::redis::Error, + "fermyon:spin/sqlite@2.0.0/error" => v2::sqlite::Error, + "fermyon:spin/sqlite/error" => v1::sqlite::Error, + "fermyon:spin/variables@2.0.0/error" => v2::variables::Error, + "spin:postgres/postgres@3.0.0/error" => spin::postgres3_0_0::postgres::Error, + "spin:postgres/postgres@4.0.0/error" => spin::postgres4_0_0::postgres::Error, + "spin:sqlite/sqlite/error" => spin::sqlite::sqlite::Error, + "wasi:config/store@0.2.0-draft-2024-09-27/error" => wasi::config::store::Error, + "wasi:keyvalue/store/error" => wasi::keyvalue::store::Error, + "wasi:keyvalue/atomics/cas-error" => wasi::keyvalue::atomics::CasError, + }, +}); + +pub use fermyon::spin as v1; +pub use fermyon::spin2_0_0 as v2; + +mod conversions; diff --git a/crates/world/src/conversions.rs b/crates/world/src/conversions.rs index 2362ab8954..8177b623b2 100644 --- a/crates/world/src/conversions.rs +++ b/crates/world/src/conversions.rs @@ -553,495 +553,3 @@ mod llm { } } } - -mod otel { - use super::*; - use opentelemetry::StringValue; - use opentelemetry_sdk::trace::{SpanEvents, SpanLinks}; - use std::borrow::Cow; - use std::time::{Duration, SystemTime, UNIX_EPOCH}; - use wasi::clocks0_2_0::wall_clock; - - impl From - for opentelemetry_sdk::metrics::data::ResourceMetrics - { - fn from(value: wasi::otel::metrics::ResourceMetrics) -> Self { - Self { - resource: value.resource.into(), - scope_metrics: value.scope_metrics.into_iter().map(Into::into).collect(), - } - } - } - - impl From for opentelemetry_sdk::Resource { - fn from(value: wasi::otel::metrics::Resource) -> Self { - let attributes: Vec = - value.attributes.into_iter().map(Into::into).collect(); - let schema_url: Option = value.schema_url.into(); - - match schema_url { - Some(url) => opentelemetry_sdk::resource::Resource::builder() - .with_schema_url(attributes, url) - .build(), - None => opentelemetry_sdk::resource::Resource::builder() - .with_attributes(attributes) - .build(), - } - } - } - - impl From for opentelemetry_sdk::metrics::data::ScopeMetrics { - fn from(value: wasi::otel::metrics::ScopeMetrics) -> Self { - Self { - scope: value.scope.into(), - metrics: value.metrics.into_iter().map(Into::into).collect(), - } - } - } - - impl From for opentelemetry_sdk::metrics::data::Metric { - fn from(value: wasi::otel::metrics::Metric) -> Self { - Self { - name: Cow::Owned(value.name), - description: Cow::Owned(value.description), - unit: Cow::Owned(value.unit), - data: value.data.into(), - } - } - } - - /// Converts a Wasi exemplar to an OTel exemplar - macro_rules! exemplars_to_otel { - ( - $wasi_exemplar_list:expr, - $exemplar_type:ty - ) => { - $wasi_exemplar_list - .iter() - .map(|e| { - let span_id: [u8; 8] = e - .span_id - .as_bytes() - .try_into() - .expect("Span ID is longer than 8 bytes"); - let trace_id: [u8; 16] = e - .trace_id - .as_bytes() - .try_into() - .expect("Trace ID is longer than 16 bytes"); - opentelemetry_sdk::metrics::data::Exemplar::<$exemplar_type> { - filtered_attributes: e - .filtered_attributes - .to_owned() - .into_iter() - .map(Into::into) - .collect(), - time: e.time.into(), - value: e.value.into(), - span_id, - trace_id, - } - }) - .collect() - }; - } - - /// Converts a WASI Gauge to an OTel Gauge - macro_rules! wasi_gauge_to_otel { - ($gauge:expr, $number_type:ty) => { - Box::new(opentelemetry_sdk::metrics::data::Gauge { - data_points: $gauge - .data_points - .iter() - .map(|dp| opentelemetry_sdk::metrics::data::GaugeDataPoint { - attributes: dp.attributes.iter().map(Into::into).collect(), - value: dp.value.into(), - exemplars: exemplars_to_otel!(dp.exemplars, $number_type), - }) - .collect(), - start_time: match $gauge.start_time { - Some(t) => Some(t.into()), - None => None, - }, - time: $gauge.time.into(), - }) - }; - } - - /// Converts a WASI Sum to an OTel Sum - macro_rules! wasi_sum_to_otel { - ($sum:expr, $number_type:ty) => { - Box::new(opentelemetry_sdk::metrics::data::Sum { - data_points: $sum - .data_points - .iter() - .map(|dp| opentelemetry_sdk::metrics::data::SumDataPoint { - attributes: dp.attributes.iter().map(Into::into).collect(), - exemplars: exemplars_to_otel!(dp.exemplars, $number_type), - value: dp.value.into(), - }) - .collect(), - start_time: $sum.start_time.into(), - time: $sum.time.into(), - temporality: $sum.temporality.into(), - is_monotonic: $sum.is_monotonic, - }) - }; - } - - /// Converts a WASI Histogram to an OTel Histogram - macro_rules! wasi_histogram_to_otel { - ($histogram:expr, $number_type:ty) => { - Box::new(opentelemetry_sdk::metrics::data::Histogram { - data_points: $histogram - .data_points - .iter() - .map(|dp| opentelemetry_sdk::metrics::data::HistogramDataPoint { - attributes: dp.attributes.iter().map(Into::into).collect(), - bounds: dp.bounds.to_owned(), - bucket_counts: dp.bucket_counts.to_owned(), - exemplars: exemplars_to_otel!(dp.exemplars, $number_type), - count: dp.count, - max: match dp.max { - Some(m) => Some(m.into()), - None => None, - }, - min: match dp.min { - Some(m) => Some(m.into()), - None => None, - }, - sum: dp.sum.into(), - }) - .collect(), - start_time: $histogram.start_time.into(), - time: $histogram.time.into(), - temporality: $histogram.temporality.into(), - }) - }; - } - - /// Converts a WASI ExponentialHistogram to an OTel ExponentialHistogram - macro_rules! wasi_exponential_histogram_to_otel { - ($histogram:expr, $number_type:ty) => { - Box::new(opentelemetry_sdk::metrics::data::ExponentialHistogram { - data_points: $histogram - .data_points - .iter() - .map( - |dp| opentelemetry_sdk::metrics::data::ExponentialHistogramDataPoint { - attributes: dp.attributes.iter().map(Into::into).collect(), - exemplars: exemplars_to_otel!(dp.exemplars, $number_type), - count: dp.count as usize, - max: match dp.max { - Some(m) => Some(m.into()), - None => None, - }, - min: match dp.min { - Some(m) => Some(m.into()), - None => None, - }, - sum: dp.sum.into(), - scale: dp.scale, - zero_count: dp.zero_count, - positive_bucket: dp.positive_bucket.to_owned().into(), - negative_bucket: dp.negative_bucket.to_owned().into(), - zero_threshold: dp.zero_threshold, - }, - ) - .collect(), - start_time: $histogram.start_time.into(), - time: $histogram.time.into(), - temporality: $histogram.temporality.into(), - }) - }; - } - - impl From - for Box - { - fn from(value: wasi::otel::metrics::MetricData) -> Self { - match value { - wasi::otel::metrics::MetricData::F64Sum(s) => wasi_sum_to_otel!(s, f64), - wasi::otel::metrics::MetricData::S64Sum(s) => wasi_sum_to_otel!(s, i64), - wasi::otel::metrics::MetricData::U64Sum(s) => wasi_sum_to_otel!(s, u64), - wasi::otel::metrics::MetricData::F64Gauge(g) => wasi_gauge_to_otel!(g, f64), - wasi::otel::metrics::MetricData::S64Gauge(g) => wasi_gauge_to_otel!(g, i64), - wasi::otel::metrics::MetricData::U64Gauge(g) => wasi_gauge_to_otel!(g, u64), - wasi::otel::metrics::MetricData::F64Histogram(h) => wasi_histogram_to_otel!(h, f64), - wasi::otel::metrics::MetricData::S64Histogram(h) => wasi_histogram_to_otel!(h, i64), - wasi::otel::metrics::MetricData::U64Histogram(h) => wasi_histogram_to_otel!(h, u64), - wasi::otel::metrics::MetricData::F64ExponentialHistogram(h) => { - wasi_exponential_histogram_to_otel!(h, f64) - } - wasi::otel::metrics::MetricData::S64ExponentialHistogram(h) => { - wasi_exponential_histogram_to_otel!(h, i64) - } - wasi::otel::metrics::MetricData::U64ExponentialHistogram(h) => { - wasi_exponential_histogram_to_otel!(h, u64) - } - } - } - } - - impl From for f64 { - fn from(value: wasi::otel::metrics::MetricNumber) -> Self { - match value { - wasi::otel::metrics::MetricNumber::F64(n) => n, - _ => panic!("error converting WASI MetricNumber to f64"), - } - } - } - - impl From for u64 { - fn from(value: wasi::otel::metrics::MetricNumber) -> Self { - match value { - wasi::otel::metrics::MetricNumber::U64(n) => n, - _ => panic!("error converting WASI MetricNumber to u64"), - } - } - } - - impl From for i64 { - fn from(value: wasi::otel::metrics::MetricNumber) -> Self { - match value { - wasi::otel::metrics::MetricNumber::S64(n) => n, - _ => panic!("error converting WASI MetricNumber to i64"), - } - } - } - - impl From - for opentelemetry_sdk::metrics::data::ExponentialBucket - { - fn from(value: wasi::otel::metrics::ExponentialBucket) -> Self { - Self { - offset: value.offset, - counts: value.counts, - } - } - } - - impl From for opentelemetry_sdk::metrics::Temporality { - fn from(value: wasi::otel::metrics::Temporality) -> Self { - use opentelemetry_sdk::metrics::Temporality; - match value { - wasi::otel::metrics::Temporality::Cumulative => Temporality::Cumulative, - wasi::otel::metrics::Temporality::Delta => Temporality::Delta, - wasi::otel::metrics::Temporality::LowMemory => Temporality::LowMemory, - } - } - } - - impl From for opentelemetry_sdk::trace::SpanData { - fn from(value: wasi::otel::tracing::SpanData) -> Self { - let mut span_events = SpanEvents::default(); - span_events.events = value.events.into_iter().map(Into::into).collect(); - span_events.dropped_count = value.dropped_events; - let mut span_links = SpanLinks::default(); - span_links.links = value.links.into_iter().map(Into::into).collect(); - span_links.dropped_count = value.dropped_links; - Self { - span_context: value.span_context.into(), - parent_span_id: opentelemetry::trace::SpanId::from_hex(&value.parent_span_id) - .unwrap_or(opentelemetry::trace::SpanId::INVALID), - span_kind: value.span_kind.into(), - name: value.name.into(), - start_time: value.start_time.into(), - end_time: value.end_time.into(), - attributes: value.attributes.into_iter().map(Into::into).collect(), - dropped_attributes_count: value.dropped_attributes, - events: span_events, - links: span_links, - status: value.status.into(), - instrumentation_scope: value.instrumentation_scope.into(), - } - } - } - - impl From for opentelemetry::trace::SpanContext { - fn from(sc: wasi::otel::tracing::SpanContext) -> Self { - let trace_id = opentelemetry::trace::TraceId::from_hex(&sc.trace_id) - .unwrap_or(opentelemetry::trace::TraceId::INVALID); - let span_id = opentelemetry::trace::SpanId::from_hex(&sc.span_id) - .unwrap_or(opentelemetry::trace::SpanId::INVALID); - let trace_state = opentelemetry::trace::TraceState::from_key_value(sc.trace_state) - .unwrap_or_else(|_| opentelemetry::trace::TraceState::default()); - Self::new( - trace_id, - span_id, - sc.trace_flags.into(), - sc.is_remote, - trace_state, - ) - } - } - - impl From for wasi::otel::tracing::SpanContext { - fn from(sc: opentelemetry::trace::SpanContext) -> Self { - Self { - trace_id: format!("{:x}", sc.trace_id()), - span_id: format!("{:x}", sc.span_id()), - trace_flags: sc.trace_flags().into(), - is_remote: sc.is_remote(), - trace_state: sc - .trace_state() - .header() - .split(',') - .filter_map(|s| { - if let Some((key, value)) = s.split_once('=') { - Some((key.to_string(), value.to_string())) - } else { - None - } - }) - .collect(), - } - } - } - - impl From for opentelemetry::trace::TraceFlags { - fn from(flags: wasi::otel::tracing::TraceFlags) -> Self { - Self::new(flags.as_array()[0] as u8) - } - } - - impl From for wasi::otel::tracing::TraceFlags { - fn from(flags: opentelemetry::trace::TraceFlags) -> Self { - if flags.is_sampled() { - wasi::otel::tracing::TraceFlags::SAMPLED - } else { - wasi::otel::tracing::TraceFlags::empty() - } - } - } - - impl From for opentelemetry::trace::SpanKind { - fn from(kind: wasi::otel::tracing::SpanKind) -> Self { - match kind { - wasi::otel::tracing::SpanKind::Client => opentelemetry::trace::SpanKind::Client, - wasi::otel::tracing::SpanKind::Server => opentelemetry::trace::SpanKind::Server, - wasi::otel::tracing::SpanKind::Producer => opentelemetry::trace::SpanKind::Producer, - wasi::otel::tracing::SpanKind::Consumer => opentelemetry::trace::SpanKind::Consumer, - wasi::otel::tracing::SpanKind::Internal => opentelemetry::trace::SpanKind::Internal, - } - } - } - - impl From for opentelemetry::KeyValue { - fn from(kv: wasi::otel::tracing::KeyValue) -> Self { - opentelemetry::KeyValue::new(kv.key, kv.value) - } - } - - impl From<&wasi::otel::tracing::KeyValue> for opentelemetry::KeyValue { - fn from(kv: &wasi::otel::tracing::KeyValue) -> Self { - opentelemetry::KeyValue::new(kv.key.to_owned(), kv.value.to_owned()) - } - } - - impl From for opentelemetry::Value { - fn from(value: wasi::otel::types::Value) -> Self { - match value { - wasi::otel::types::Value::String(v) => v.into(), - wasi::otel::types::Value::Bool(v) => v.into(), - wasi::otel::types::Value::F64(v) => v.into(), - wasi::otel::types::Value::S64(v) => v.into(), - wasi::otel::types::Value::StringArray(v) => opentelemetry::Value::Array( - v.into_iter() - .map(StringValue::from) - .collect::>() - .into(), - ), - wasi::otel::types::Value::BoolArray(v) => opentelemetry::Value::Array(v.into()), - wasi::otel::types::Value::F64Array(v) => opentelemetry::Value::Array(v.into()), - wasi::otel::types::Value::S64Array(v) => opentelemetry::Value::Array(v.into()), - } - } - } - - impl From for opentelemetry::trace::Event { - fn from(event: wasi::otel::tracing::Event) -> Self { - Self::new( - event.name, - event.time.into(), - event.attributes.into_iter().map(Into::into).collect(), - 0, - ) - } - } - - impl From for opentelemetry::trace::Link { - fn from(link: wasi::otel::tracing::Link) -> Self { - Self::new( - link.span_context.into(), - link.attributes.into_iter().map(Into::into).collect(), - 0, - ) - } - } - - impl From for opentelemetry::trace::Status { - fn from(status: wasi::otel::tracing::Status) -> Self { - match status { - wasi::otel::tracing::Status::Unset => Self::Unset, - wasi::otel::tracing::Status::Ok => Self::Ok, - wasi::otel::tracing::Status::Error(s) => Self::Error { - description: s.into(), - }, - } - } - } - - impl From for opentelemetry::InstrumentationScope { - fn from(value: wasi::otel::tracing::InstrumentationScope) -> Self { - let builder = Self::builder(value.name) - .with_attributes(value.attributes.into_iter().map(Into::into)); - match (value.version, value.schema_url) { - (Some(version), Some(schema_url)) => builder - .with_version(version) - .with_schema_url(schema_url) - .build(), - (Some(version), None) => builder.with_version(version).build(), - (None, Some(schema_url)) => builder.with_schema_url(schema_url).build(), - (None, None) => builder.build(), - } - } - } - - impl From for SystemTime { - fn from(timestamp: wall_clock::Datetime) -> Self { - UNIX_EPOCH - + Duration::from_secs(timestamp.seconds) - + Duration::from_nanos(timestamp.nanoseconds as u64) - } - } - - mod test { - #[test] - fn trace_flags() { - let flags = opentelemetry::trace::TraceFlags::SAMPLED; - let flags2 = crate::wasi::otel::tracing::TraceFlags::from(flags); - let flags3 = opentelemetry::trace::TraceFlags::from(flags2); - assert_eq!(flags, flags3); - } - - #[test] - fn span_context() { - let sc = opentelemetry::trace::SpanContext::new( - opentelemetry::trace::TraceId::from_hex("4fb34cb4484029f7881399b149e41e98") - .unwrap(), - opentelemetry::trace::SpanId::from_hex("9ffd58d3cd4dd90b").unwrap(), - opentelemetry::trace::TraceFlags::SAMPLED, - false, - opentelemetry::trace::TraceState::from_key_value(vec![ - ("foo", "bar"), - ("baz", "qux"), - ]) - .unwrap(), - ); - let sc2 = crate::wasi::otel::tracing::SpanContext::from(sc.clone()); - let sc3 = opentelemetry::trace::SpanContext::from(sc2); - assert_eq!(sc, sc3); - } - } -} From 28a111171b10e4352b14718cf7563edf621e19ea Mon Sep 17 00:00:00 2001 From: Andrew Steurer <94206073+asteurer@users.noreply.github.com> Date: Mon, 24 Nov 2025 09:35:43 -0600 Subject: [PATCH 03/18] Update crates/factor-otel/src/lib.rs Co-authored-by: Ryan Levick --- crates/factor-otel/src/lib.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/crates/factor-otel/src/lib.rs b/crates/factor-otel/src/lib.rs index 8563bd17ff..3b3cb67c9d 100644 --- a/crates/factor-otel/src/lib.rs +++ b/crates/factor-otel/src/lib.rs @@ -183,11 +183,7 @@ impl OtelFactorState { pub fn reparent_tracing_span(&self) { // If state is None then we want to return early b/c the factor doesn't depend on the // Otel factor and therefore there is nothing to do - let state = if let Some(state) = self.state.as_ref() { - state.read().unwrap() - } else { - return; - }; + let Some(state) = self.state.as_ref() { state.read().unwrap() } else { return }; // If there are no active guest spans then there is nothing to do let Some((_, active_span_context)) = state.guest_span_contexts.last() else { From 3c5e16487dae00a1a4aecda9b05d8107d074b68f Mon Sep 17 00:00:00 2001 From: Andrew Steurer <94206073+asteurer@users.noreply.github.com> Date: Mon, 24 Nov 2025 09:35:53 -0600 Subject: [PATCH 04/18] Update crates/factor-otel/src/lib.rs Co-authored-by: Ryan Levick --- crates/factor-otel/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/factor-otel/src/lib.rs b/crates/factor-otel/src/lib.rs index 3b3cb67c9d..27183d2cae 100644 --- a/crates/factor-otel/src/lib.rs +++ b/crates/factor-otel/src/lib.rs @@ -169,7 +169,7 @@ impl OtelFactorState { /// | spin_key_value.get | /// ``` /// - /// Setting the guest spans parent as the host is enabled through current_span_context. + /// Setting the guest spans parent as the host is enabled through current_span_context. /// However, the more difficult task is having the host factor spans be children of the guest /// span. [`OtelFactorState::reparent_tracing_span`] handles this by reparenting the current span to /// be a child of the last active guest span (which is tracked internally in the otel factor). From f99f4595a3fd05f8be6580e5c31957de8f1c4f74 Mon Sep 17 00:00:00 2001 From: Andrew Steurer <94206073+asteurer@users.noreply.github.com> Date: Mon, 24 Nov 2025 16:02:56 +0000 Subject: [PATCH 05/18] fix: misc refactors Signed-off-by: Andrew Steurer <94206073+asteurer@users.noreply.github.com> --- crates/factor-key-value/src/host.rs | 12 +++---- crates/factor-llm/src/host.rs | 8 +++-- crates/factor-otel/src/lib.rs | 23 ++++++++------ crates/factor-outbound-http/src/spin.rs | 5 ++- crates/factor-outbound-mqtt/src/host.rs | 8 +++-- crates/factor-outbound-mysql/src/host.rs | 12 +++++-- crates/factor-outbound-pg/src/host.rs | 13 +++++--- crates/factor-outbound-redis/src/host.rs | 40 ++++++++++++++++++------ crates/factor-sqlite/src/host.rs | 8 +++-- crates/factor-variables/src/host.rs | 4 ++- crates/runtime-factors/src/build.rs | 4 +++ crates/runtime-factors/src/lib.rs | 3 +- 12 files changed, 98 insertions(+), 42 deletions(-) diff --git a/crates/factor-key-value/src/host.rs b/crates/factor-key-value/src/host.rs index eda69ace6d..f77d105579 100644 --- a/crates/factor-key-value/src/host.rs +++ b/crates/factor-key-value/src/host.rs @@ -118,7 +118,7 @@ impl key_value::HostStore for KeyValueDispatch { #[instrument(name = "spin_key_value.open", skip(self), err, fields(otel.kind = "client", kv.backend=self.manager.summary(&name).unwrap_or("unknown".to_string())))] async fn open(&mut self, name: String) -> Result, Error>> { if let Some(otel_context) = self.otel_context.as_ref() { - otel_context.reparent_tracing_span() + otel_context.reparent_tracing_span()?; } Ok(async { if self.allowed_stores.contains(&name) { @@ -143,7 +143,7 @@ impl key_value::HostStore for KeyValueDispatch { key: String, ) -> Result>, Error>> { if let Some(otel_context) = self.otel_context.as_ref() { - otel_context.reparent_tracing_span() + otel_context.reparent_tracing_span()?; } let store = self.get_store(store)?; Ok(store.get(&key).await.map_err(track_error_on_span)) @@ -157,7 +157,7 @@ impl key_value::HostStore for KeyValueDispatch { value: Vec, ) -> Result> { if let Some(otel_context) = self.otel_context.as_ref() { - otel_context.reparent_tracing_span() + otel_context.reparent_tracing_span()?; } let store = self.get_store(store)?; Ok(store.set(&key, &value).await.map_err(track_error_on_span)) @@ -170,7 +170,7 @@ impl key_value::HostStore for KeyValueDispatch { key: String, ) -> Result> { if let Some(otel_context) = self.otel_context.as_ref() { - otel_context.reparent_tracing_span() + otel_context.reparent_tracing_span()?; } let store = self.get_store(store)?; Ok(store.delete(&key).await.map_err(track_error_on_span)) @@ -183,7 +183,7 @@ impl key_value::HostStore for KeyValueDispatch { key: String, ) -> Result> { if let Some(otel_context) = self.otel_context.as_ref() { - otel_context.reparent_tracing_span() + otel_context.reparent_tracing_span()?; } let store = self.get_store(store)?; Ok(store.exists(&key).await.map_err(track_error_on_span)) @@ -195,7 +195,7 @@ impl key_value::HostStore for KeyValueDispatch { store: Resource, ) -> Result, Error>> { if let Some(otel_context) = self.otel_context.as_ref() { - otel_context.reparent_tracing_span() + otel_context.reparent_tracing_span()?; } let store = self.get_store(store)?; Ok(store.get_keys().await.map_err(track_error_on_span)) diff --git a/crates/factor-llm/src/host.rs b/crates/factor-llm/src/host.rs index 61c49b5313..42aa457e59 100644 --- a/crates/factor-llm/src/host.rs +++ b/crates/factor-llm/src/host.rs @@ -13,7 +13,9 @@ impl v2::Host for InstanceState { prompt: String, params: Option, ) -> Result { - self.otel_context.reparent_tracing_span(); + if let Err(e) = self.otel_context.reparent_tracing_span() { + return Err(v2::Error::RuntimeError(e.to_string())); + }; if !self.allowed_models.contains(&model) { return Err(access_denied_error(&model)); @@ -42,7 +44,9 @@ impl v2::Host for InstanceState { model: v1::EmbeddingModel, data: Vec, ) -> Result { - self.otel_context.reparent_tracing_span(); + if let Err(e) = self.otel_context.reparent_tracing_span() { + return Err(v2::Error::RuntimeError(e.to_string())); + }; if !self.allowed_models.contains(&model) { return Err(access_denied_error(&model)); diff --git a/crates/factor-otel/src/lib.rs b/crates/factor-otel/src/lib.rs index 27183d2cae..31e46e2b60 100644 --- a/crates/factor-otel/src/lib.rs +++ b/crates/factor-otel/src/lib.rs @@ -1,6 +1,6 @@ mod host; -use anyhow::bail; +use anyhow::{anyhow, bail, Error, Result}; use indexmap::IndexMap; use opentelemetry::{ trace::{SpanContext, SpanId, TraceContextExt}, @@ -58,15 +58,13 @@ impl Factor for OtelFactor { } impl OtelFactor { - pub fn new() -> anyhow::Result { - // This is a hack b/c we know the version of this crate will be the same as the version of Spin - let spin_version = env!("CARGO_PKG_VERSION").to_string(); - + pub fn new(spin_version: &str) -> anyhow::Result { let resource = Resource::builder() .with_detectors(&[ // Set service.name from env OTEL_SERVICE_NAME > env OTEL_RESOURCE_ATTRIBUTES > spin // Set service.version from Spin metadata - Box::new(SpinResourceDetector::new(spin_version)) as Box, + Box::new(SpinResourceDetector::new(spin_version.to_string())) + as Box, // Sets fields from env OTEL_RESOURCE_ATTRIBUTES Box::new(EnvResourceDetector::new()), // Sets telemetry.sdk{name, language, version} @@ -180,14 +178,18 @@ impl OtelFactorState { /// This MUST only be called from a factor host implementation function that is instrumented. /// /// This MUST be called at the very start of the function before any awaits. - pub fn reparent_tracing_span(&self) { + pub fn reparent_tracing_span(&self) -> Result<(), Error> { // If state is None then we want to return early b/c the factor doesn't depend on the // Otel factor and therefore there is nothing to do - let Some(state) = self.state.as_ref() { state.read().unwrap() } else { return }; + let state = if let Some(state) = self.state.as_ref() { + state.read().unwrap() + } else { + return Ok(()); + }; // If there are no active guest spans then there is nothing to do let Some((_, active_span_context)) = state.guest_span_contexts.last() else { - return; + return Ok(()); }; // Ensure that we are not reparenting the original host span @@ -199,12 +201,13 @@ impl OtelFactorState { .span_id() .eq(&original_host_span_id) { - panic!("Incorrectly attempting to reparent the original host span. Likely `reparent_tracing_span` was called in an incorrect location.") + return Err(anyhow!("Incorrectly attempting to reparent the original host span. Likely `reparent_tracing_span` was called in an incorrect location.")); } } // Now reparent the current span to the last active guest span let parent_context = Context::new().with_remote_span_context(active_span_context.clone()); tracing::Span::current().set_parent(parent_context); + Ok(()) } } diff --git a/crates/factor-outbound-http/src/spin.rs b/crates/factor-outbound-http/src/spin.rs index 445c1075fb..9891f43e2f 100644 --- a/crates/factor-outbound-http/src/spin.rs +++ b/crates/factor-outbound-http/src/spin.rs @@ -15,7 +15,10 @@ impl spin_http::Host for crate::InstanceState { fields(otel.kind = "client", url.full = Empty, http.request.method = Empty, http.response.status_code = Empty, otel.name = Empty, server.address = Empty, server.port = Empty))] async fn send_request(&mut self, req: Request) -> Result { - self.otel_context.reparent_tracing_span(); + if let Err(e) = self.otel_context.reparent_tracing_span() { + tracing::error!("{}", e.to_string()); + return Err(HttpError::RuntimeError); + }; let span = Span::current(); record_request_fields(&span, &req); diff --git a/crates/factor-outbound-mqtt/src/host.rs b/crates/factor-outbound-mqtt/src/host.rs index a39d1a4b60..cd59e1f700 100644 --- a/crates/factor-outbound-mqtt/src/host.rs +++ b/crates/factor-outbound-mqtt/src/host.rs @@ -79,7 +79,9 @@ impl v2::HostConnection for InstanceState { password: String, keep_alive_interval: u64, ) -> Result, Error> { - self.otel_context.reparent_tracing_span(); + if let Err(e) = self.otel_context.reparent_tracing_span() { + return Err(Error::Other(e.to_string())); + }; if !self .is_address_allowed(&address) @@ -114,7 +116,9 @@ impl v2::HostConnection for InstanceState { payload: Vec, qos: Qos, ) -> Result<(), Error> { - self.otel_context.reparent_tracing_span(); + if let Err(e) = self.otel_context.reparent_tracing_span() { + return Err(Error::Other(e.to_string())); + }; let conn = self.get_conn(connection).await.map_err(other_error)?; diff --git a/crates/factor-outbound-mysql/src/host.rs b/crates/factor-outbound-mysql/src/host.rs index ca113206aa..26a646c5a0 100644 --- a/crates/factor-outbound-mysql/src/host.rs +++ b/crates/factor-outbound-mysql/src/host.rs @@ -38,7 +38,9 @@ impl v2::Host for InstanceState {} impl v2::HostConnection for InstanceState { #[instrument(name = "spin_outbound_mysql.open", skip(self, address), err(level = Level::INFO), fields(otel.kind = "client", db.system = "mysql", db.address = Empty, server.port = Empty, db.namespace = Empty))] async fn open(&mut self, address: String) -> Result, v2::Error> { - self.otel_context.reparent_tracing_span(); + if let Err(e) = self.otel_context.reparent_tracing_span() { + return Err(v2::Error::Other(e.to_string())); + }; spin_factor_outbound_networking::record_address_fields(&address); if !self @@ -60,7 +62,9 @@ impl v2::HostConnection for InstanceState { statement: String, params: Vec, ) -> Result<(), v2::Error> { - self.otel_context.reparent_tracing_span(); + if let Err(e) = self.otel_context.reparent_tracing_span() { + return Err(v2::Error::Other(e.to_string())); + }; self.get_client(connection) .await? .execute(statement, params) @@ -74,7 +78,9 @@ impl v2::HostConnection for InstanceState { statement: String, params: Vec, ) -> Result { - self.otel_context.reparent_tracing_span(); + if let Err(e) = self.otel_context.reparent_tracing_span() { + return Err(v2::Error::Other(e.to_string())); + }; self.get_client(connection) .await? .query(statement, params) diff --git a/crates/factor-outbound-pg/src/host.rs b/crates/factor-outbound-pg/src/host.rs index 81dda9bbe6..d11a991f96 100644 --- a/crates/factor-outbound-pg/src/host.rs +++ b/crates/factor-outbound-pg/src/host.rs @@ -219,7 +219,9 @@ impl v2::Host for InstanceState {} impl v2::HostConnection for InstanceState { #[instrument(name = "spin_outbound_pg.open", skip(self, address), err(level = Level::INFO), fields(otel.kind = "client", db.system = "postgresql", db.address = Empty, server.port = Empty, db.namespace = Empty))] async fn open(&mut self, address: String) -> Result, v2::Error> { - self.otel_context.reparent_tracing_span(); + if let Err(e) = self.otel_context.reparent_tracing_span() { + return Err(v2::Error::Other(e.to_string())); + }; spin_factor_outbound_networking::record_address_fields(&address); if !self @@ -241,8 +243,9 @@ impl v2::HostConnection for InstanceState { statement: String, params: Vec, ) -> Result { - self.otel_context.reparent_tracing_span(); - + if let Err(e) = self.otel_context.reparent_tracing_span() { + return Err(v2::Error::Other(e.to_string())); + }; Ok(self .get_client(connection) .await? @@ -257,7 +260,9 @@ impl v2::HostConnection for InstanceState { statement: String, params: Vec, ) -> Result { - self.otel_context.reparent_tracing_span(); + if let Err(e) = self.otel_context.reparent_tracing_span() { + return Err(v2::Error::Other(e.to_string())); + }; Ok(self .get_client(connection) .await? diff --git a/crates/factor-outbound-redis/src/host.rs b/crates/factor-outbound-redis/src/host.rs index 2f265b90dc..c7eae93902 100644 --- a/crates/factor-outbound-redis/src/host.rs +++ b/crates/factor-outbound-redis/src/host.rs @@ -65,7 +65,9 @@ impl v2::Host for crate::InstanceState { impl v2::HostConnection for crate::InstanceState { #[instrument(name = "spin_outbound_redis.open_connection", skip(self, address), err(level = Level::INFO), fields(otel.kind = "client", db.system = "redis", db.address = Empty, server.port = Empty, db.namespace = Empty))] async fn open(&mut self, address: String) -> Result, Error> { - self.otel_context.reparent_tracing_span(); + if let Err(e) = self.otel_context.reparent_tracing_span() { + return Err(Error::Other(e.to_string())); + }; if !self .is_address_allowed(&address) .await @@ -84,7 +86,9 @@ impl v2::HostConnection for crate::InstanceState { channel: String, payload: Vec, ) -> Result<(), Error> { - self.otel_context.reparent_tracing_span(); + if let Err(e) = self.otel_context.reparent_tracing_span() { + return Err(Error::Other(e.to_string())); + }; let conn = self.get_conn(connection).await.map_err(other_error)?; // The `let () =` syntax is needed to suppress a warning when the result type is inferred. @@ -102,7 +106,9 @@ impl v2::HostConnection for crate::InstanceState { connection: Resource, key: String, ) -> Result>, Error> { - self.otel_context.reparent_tracing_span(); + if let Err(e) = self.otel_context.reparent_tracing_span() { + return Err(Error::Other(e.to_string())); + }; let conn = self.get_conn(connection).await.map_err(other_error)?; let value = conn.get(&key).await.map_err(other_error)?; @@ -116,7 +122,9 @@ impl v2::HostConnection for crate::InstanceState { key: String, value: Vec, ) -> Result<(), Error> { - self.otel_context.reparent_tracing_span(); + if let Err(e) = self.otel_context.reparent_tracing_span() { + return Err(Error::Other(e.to_string())); + }; let conn = self.get_conn(connection).await.map_err(other_error)?; // The `let () =` syntax is needed to suppress a warning when the result type is inferred. @@ -131,7 +139,9 @@ impl v2::HostConnection for crate::InstanceState { connection: Resource, key: String, ) -> Result { - self.otel_context.reparent_tracing_span(); + if let Err(e) = self.otel_context.reparent_tracing_span() { + return Err(Error::Other(e.to_string())); + }; let conn = self.get_conn(connection).await.map_err(other_error)?; let value = conn.incr(&key, 1).await.map_err(other_error)?; @@ -144,7 +154,9 @@ impl v2::HostConnection for crate::InstanceState { connection: Resource, keys: Vec, ) -> Result { - self.otel_context.reparent_tracing_span(); + if let Err(e) = self.otel_context.reparent_tracing_span() { + return Err(Error::Other(e.to_string())); + }; let conn = self.get_conn(connection).await.map_err(other_error)?; let value = conn.del(&keys).await.map_err(other_error)?; @@ -158,7 +170,9 @@ impl v2::HostConnection for crate::InstanceState { key: String, values: Vec, ) -> Result { - self.otel_context.reparent_tracing_span(); + if let Err(e) = self.otel_context.reparent_tracing_span() { + return Err(Error::Other(e.to_string())); + }; let conn = self.get_conn(connection).await.map_err(other_error)?; let value = conn.sadd(&key, &values).await.map_err(|e| { @@ -177,7 +191,9 @@ impl v2::HostConnection for crate::InstanceState { connection: Resource, key: String, ) -> Result, Error> { - self.otel_context.reparent_tracing_span(); + if let Err(e) = self.otel_context.reparent_tracing_span() { + return Err(Error::Other(e.to_string())); + }; let conn = self.get_conn(connection).await.map_err(other_error)?; let value = conn.smembers(&key).await.map_err(other_error)?; @@ -191,7 +207,9 @@ impl v2::HostConnection for crate::InstanceState { key: String, values: Vec, ) -> Result { - self.otel_context.reparent_tracing_span(); + if let Err(e) = self.otel_context.reparent_tracing_span() { + return Err(Error::Other(e.to_string())); + }; let conn = self.get_conn(connection).await.map_err(other_error)?; let value = conn.srem(&key, &values).await.map_err(other_error)?; @@ -205,7 +223,9 @@ impl v2::HostConnection for crate::InstanceState { command: String, arguments: Vec, ) -> Result, Error> { - self.otel_context.reparent_tracing_span(); + if let Err(e) = self.otel_context.reparent_tracing_span() { + return Err(Error::Other(e.to_string())); + }; let conn = self.get_conn(connection).await?; let mut cmd = redis::cmd(&command); diff --git a/crates/factor-sqlite/src/host.rs b/crates/factor-sqlite/src/host.rs index ddc6d0f5a8..3011f72e4d 100644 --- a/crates/factor-sqlite/src/host.rs +++ b/crates/factor-sqlite/src/host.rs @@ -158,7 +158,9 @@ impl v2::Host for InstanceState { impl v2::HostConnection for InstanceState { #[instrument(name = "spin_sqlite.open", skip(self), err(level = Level::INFO), fields(otel.kind = "client", db.system = "sqlite", sqlite.backend = Empty))] async fn open(&mut self, database: String) -> Result, v2::Error> { - self.otel_context.reparent_tracing_span(); + if let Err(e) = self.otel_context.reparent_tracing_span() { + return Err(v2::Error::Io(e.to_string())); + }; self.open_impl(database).await.map_err(to_v2_error) } @@ -169,7 +171,9 @@ impl v2::HostConnection for InstanceState { query: String, parameters: Vec, ) -> Result { - self.otel_context.reparent_tracing_span(); + if let Err(e) = self.otel_context.reparent_tracing_span() { + return Err(v2::Error::Io(e.to_string())); + }; self.execute_impl( connection, query, diff --git a/crates/factor-variables/src/host.rs b/crates/factor-variables/src/host.rs index 784cebd280..bbef549987 100644 --- a/crates/factor-variables/src/host.rs +++ b/crates/factor-variables/src/host.rs @@ -8,7 +8,9 @@ use crate::InstanceState; impl variables::Host for InstanceState { #[instrument(name = "spin_variables.get", skip(self), fields(otel.kind = "client"))] async fn get(&mut self, key: String) -> Result { - self.otel_context.reparent_tracing_span(); + if let Err(e) = self.otel_context.reparent_tracing_span() { + return Err(variables::Error::Other(e.to_string())); + }; let key = spin_expressions::Key::new(&key).map_err(expressions_to_variables_err)?; self.expression_resolver .resolve(&self.component_id, key) diff --git a/crates/runtime-factors/src/build.rs b/crates/runtime-factors/src/build.rs index c09ee39337..da50f3cd98 100644 --- a/crates/runtime-factors/src/build.rs +++ b/crates/runtime-factors/src/build.rs @@ -46,10 +46,14 @@ impl RuntimeFactorsBuilder for FactorsBuilder { runtime_config.summarize(config.runtime_config_file.as_deref()); + // This is a hack b/c we know the version of this crate will be the same as the version of Spin + let spin_version = env!("CARGO_PKG_VERSION"); + let factors = TriggerFactors::new( runtime_config.state_dir(), config.working_dir.clone(), args.allow_transient_write, + spin_version, ) .context("failed to create factors")?; Ok((factors, runtime_config)) diff --git a/crates/runtime-factors/src/lib.rs b/crates/runtime-factors/src/lib.rs index b1865e444c..a5e2ca6ea7 100644 --- a/crates/runtime-factors/src/lib.rs +++ b/crates/runtime-factors/src/lib.rs @@ -45,9 +45,10 @@ impl TriggerFactors { state_dir: Option, working_dir: impl Into, allow_transient_writes: bool, + spin_version: &str, ) -> anyhow::Result { Ok(Self { - otel: OtelFactor::new()?, + otel: OtelFactor::new(spin_version)?, wasi: wasi_factor(working_dir, allow_transient_writes), variables: VariablesFactor::default(), key_value: KeyValueFactor::new(), From 3e699c9b094694efe8ad4dc61be58f737e1eb0ed Mon Sep 17 00:00:00 2001 From: Andrew Steurer <94206073+asteurer@users.noreply.github.com> Date: Mon, 24 Nov 2025 16:11:31 +0000 Subject: [PATCH 06/18] fix: misc refactors Signed-off-by: Andrew Steurer <94206073+asteurer@users.noreply.github.com> --- crates/telemetry/src/env.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/telemetry/src/env.rs b/crates/telemetry/src/env.rs index 487aad6227..b234476638 100644 --- a/crates/telemetry/src/env.rs +++ b/crates/telemetry/src/env.rs @@ -19,7 +19,7 @@ const SPIN_DISABLE_LOG_TO_TRACING: &str = "SPIN_DISABLE_LOG_TO_TRACING"; /// - `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` /// /// Note that this is overridden if OTEL_SDK_DISABLED is set and not empty. -pub fn otel_tracing_enabled() -> bool { +pub(crate) fn otel_tracing_enabled() -> bool { any_vars_set(&[ OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_EXPORTER_OTLP_TRACES_ENDPOINT, From 0ceb5c86f35f299d6ad79ff9cb7f8086f6886596 Mon Sep 17 00:00:00 2001 From: Andrew Steurer <94206073+asteurer@users.noreply.github.com> Date: Tue, 25 Nov 2025 05:38:40 +0000 Subject: [PATCH 07/18] feat(wasi-otel): more refactoring Signed-off-by: Andrew Steurer <94206073+asteurer@users.noreply.github.com> --- crates/factor-key-value/src/host.rs | 12 +- crates/factor-llm/src/host.rs | 8 +- crates/factor-otel/src/lib.rs | 11 +- crates/factor-outbound-http/src/spin.rs | 5 +- crates/factor-outbound-mqtt/src/host.rs | 8 +- crates/factor-outbound-mysql/src/host.rs | 12 +- crates/factor-outbound-pg/src/host.rs | 12 +- crates/factor-outbound-redis/src/host.rs | 40 +--- crates/factor-sqlite/src/host.rs | 8 +- crates/factor-variables/src/host.rs | 4 +- crates/wasi-otel/src/common_conversions.rs | 58 +++++ crates/wasi-otel/src/lib.rs | 4 +- ...{conversions.rs => metrics_conversions.rs} | 215 +----------------- crates/wasi-otel/src/trace_conversions.rs | 155 +++++++++++++ 14 files changed, 252 insertions(+), 300 deletions(-) create mode 100644 crates/wasi-otel/src/common_conversions.rs rename crates/wasi-otel/src/{conversions.rs => metrics_conversions.rs} (55%) create mode 100644 crates/wasi-otel/src/trace_conversions.rs diff --git a/crates/factor-key-value/src/host.rs b/crates/factor-key-value/src/host.rs index f77d105579..6d5c103386 100644 --- a/crates/factor-key-value/src/host.rs +++ b/crates/factor-key-value/src/host.rs @@ -118,7 +118,7 @@ impl key_value::HostStore for KeyValueDispatch { #[instrument(name = "spin_key_value.open", skip(self), err, fields(otel.kind = "client", kv.backend=self.manager.summary(&name).unwrap_or("unknown".to_string())))] async fn open(&mut self, name: String) -> Result, Error>> { if let Some(otel_context) = self.otel_context.as_ref() { - otel_context.reparent_tracing_span()?; + otel_context.reparent_tracing_span(); } Ok(async { if self.allowed_stores.contains(&name) { @@ -143,7 +143,7 @@ impl key_value::HostStore for KeyValueDispatch { key: String, ) -> Result>, Error>> { if let Some(otel_context) = self.otel_context.as_ref() { - otel_context.reparent_tracing_span()?; + otel_context.reparent_tracing_span(); } let store = self.get_store(store)?; Ok(store.get(&key).await.map_err(track_error_on_span)) @@ -157,7 +157,7 @@ impl key_value::HostStore for KeyValueDispatch { value: Vec, ) -> Result> { if let Some(otel_context) = self.otel_context.as_ref() { - otel_context.reparent_tracing_span()?; + otel_context.reparent_tracing_span(); } let store = self.get_store(store)?; Ok(store.set(&key, &value).await.map_err(track_error_on_span)) @@ -170,7 +170,7 @@ impl key_value::HostStore for KeyValueDispatch { key: String, ) -> Result> { if let Some(otel_context) = self.otel_context.as_ref() { - otel_context.reparent_tracing_span()?; + otel_context.reparent_tracing_span(); } let store = self.get_store(store)?; Ok(store.delete(&key).await.map_err(track_error_on_span)) @@ -183,7 +183,7 @@ impl key_value::HostStore for KeyValueDispatch { key: String, ) -> Result> { if let Some(otel_context) = self.otel_context.as_ref() { - otel_context.reparent_tracing_span()?; + otel_context.reparent_tracing_span(); } let store = self.get_store(store)?; Ok(store.exists(&key).await.map_err(track_error_on_span)) @@ -195,7 +195,7 @@ impl key_value::HostStore for KeyValueDispatch { store: Resource, ) -> Result, Error>> { if let Some(otel_context) = self.otel_context.as_ref() { - otel_context.reparent_tracing_span()?; + otel_context.reparent_tracing_span(); } let store = self.get_store(store)?; Ok(store.get_keys().await.map_err(track_error_on_span)) diff --git a/crates/factor-llm/src/host.rs b/crates/factor-llm/src/host.rs index 42aa457e59..61c49b5313 100644 --- a/crates/factor-llm/src/host.rs +++ b/crates/factor-llm/src/host.rs @@ -13,9 +13,7 @@ impl v2::Host for InstanceState { prompt: String, params: Option, ) -> Result { - if let Err(e) = self.otel_context.reparent_tracing_span() { - return Err(v2::Error::RuntimeError(e.to_string())); - }; + self.otel_context.reparent_tracing_span(); if !self.allowed_models.contains(&model) { return Err(access_denied_error(&model)); @@ -44,9 +42,7 @@ impl v2::Host for InstanceState { model: v1::EmbeddingModel, data: Vec, ) -> Result { - if let Err(e) = self.otel_context.reparent_tracing_span() { - return Err(v2::Error::RuntimeError(e.to_string())); - }; + self.otel_context.reparent_tracing_span(); if !self.allowed_models.contains(&model) { return Err(access_denied_error(&model)); diff --git a/crates/factor-otel/src/lib.rs b/crates/factor-otel/src/lib.rs index 31e46e2b60..3cd00d71cf 100644 --- a/crates/factor-otel/src/lib.rs +++ b/crates/factor-otel/src/lib.rs @@ -1,6 +1,6 @@ mod host; -use anyhow::{anyhow, bail, Error, Result}; +use anyhow::bail; use indexmap::IndexMap; use opentelemetry::{ trace::{SpanContext, SpanId, TraceContextExt}, @@ -178,18 +178,18 @@ impl OtelFactorState { /// This MUST only be called from a factor host implementation function that is instrumented. /// /// This MUST be called at the very start of the function before any awaits. - pub fn reparent_tracing_span(&self) -> Result<(), Error> { + pub fn reparent_tracing_span(&self) { // If state is None then we want to return early b/c the factor doesn't depend on the // Otel factor and therefore there is nothing to do let state = if let Some(state) = self.state.as_ref() { state.read().unwrap() } else { - return Ok(()); + return; }; // If there are no active guest spans then there is nothing to do let Some((_, active_span_context)) = state.guest_span_contexts.last() else { - return Ok(()); + return; }; // Ensure that we are not reparenting the original host span @@ -201,13 +201,12 @@ impl OtelFactorState { .span_id() .eq(&original_host_span_id) { - return Err(anyhow!("Incorrectly attempting to reparent the original host span. Likely `reparent_tracing_span` was called in an incorrect location.")); + panic!("Incorrectly attempting to reparent the original host span. Likely `reparent_tracing_span` was called in an incorrect location."); } } // Now reparent the current span to the last active guest span let parent_context = Context::new().with_remote_span_context(active_span_context.clone()); tracing::Span::current().set_parent(parent_context); - Ok(()) } } diff --git a/crates/factor-outbound-http/src/spin.rs b/crates/factor-outbound-http/src/spin.rs index 9891f43e2f..445c1075fb 100644 --- a/crates/factor-outbound-http/src/spin.rs +++ b/crates/factor-outbound-http/src/spin.rs @@ -15,10 +15,7 @@ impl spin_http::Host for crate::InstanceState { fields(otel.kind = "client", url.full = Empty, http.request.method = Empty, http.response.status_code = Empty, otel.name = Empty, server.address = Empty, server.port = Empty))] async fn send_request(&mut self, req: Request) -> Result { - if let Err(e) = self.otel_context.reparent_tracing_span() { - tracing::error!("{}", e.to_string()); - return Err(HttpError::RuntimeError); - }; + self.otel_context.reparent_tracing_span(); let span = Span::current(); record_request_fields(&span, &req); diff --git a/crates/factor-outbound-mqtt/src/host.rs b/crates/factor-outbound-mqtt/src/host.rs index cd59e1f700..a39d1a4b60 100644 --- a/crates/factor-outbound-mqtt/src/host.rs +++ b/crates/factor-outbound-mqtt/src/host.rs @@ -79,9 +79,7 @@ impl v2::HostConnection for InstanceState { password: String, keep_alive_interval: u64, ) -> Result, Error> { - if let Err(e) = self.otel_context.reparent_tracing_span() { - return Err(Error::Other(e.to_string())); - }; + self.otel_context.reparent_tracing_span(); if !self .is_address_allowed(&address) @@ -116,9 +114,7 @@ impl v2::HostConnection for InstanceState { payload: Vec, qos: Qos, ) -> Result<(), Error> { - if let Err(e) = self.otel_context.reparent_tracing_span() { - return Err(Error::Other(e.to_string())); - }; + self.otel_context.reparent_tracing_span(); let conn = self.get_conn(connection).await.map_err(other_error)?; diff --git a/crates/factor-outbound-mysql/src/host.rs b/crates/factor-outbound-mysql/src/host.rs index 26a646c5a0..ca113206aa 100644 --- a/crates/factor-outbound-mysql/src/host.rs +++ b/crates/factor-outbound-mysql/src/host.rs @@ -38,9 +38,7 @@ impl v2::Host for InstanceState {} impl v2::HostConnection for InstanceState { #[instrument(name = "spin_outbound_mysql.open", skip(self, address), err(level = Level::INFO), fields(otel.kind = "client", db.system = "mysql", db.address = Empty, server.port = Empty, db.namespace = Empty))] async fn open(&mut self, address: String) -> Result, v2::Error> { - if let Err(e) = self.otel_context.reparent_tracing_span() { - return Err(v2::Error::Other(e.to_string())); - }; + self.otel_context.reparent_tracing_span(); spin_factor_outbound_networking::record_address_fields(&address); if !self @@ -62,9 +60,7 @@ impl v2::HostConnection for InstanceState { statement: String, params: Vec, ) -> Result<(), v2::Error> { - if let Err(e) = self.otel_context.reparent_tracing_span() { - return Err(v2::Error::Other(e.to_string())); - }; + self.otel_context.reparent_tracing_span(); self.get_client(connection) .await? .execute(statement, params) @@ -78,9 +74,7 @@ impl v2::HostConnection for InstanceState { statement: String, params: Vec, ) -> Result { - if let Err(e) = self.otel_context.reparent_tracing_span() { - return Err(v2::Error::Other(e.to_string())); - }; + self.otel_context.reparent_tracing_span(); self.get_client(connection) .await? .query(statement, params) diff --git a/crates/factor-outbound-pg/src/host.rs b/crates/factor-outbound-pg/src/host.rs index d11a991f96..59ec645dff 100644 --- a/crates/factor-outbound-pg/src/host.rs +++ b/crates/factor-outbound-pg/src/host.rs @@ -219,9 +219,7 @@ impl v2::Host for InstanceState {} impl v2::HostConnection for InstanceState { #[instrument(name = "spin_outbound_pg.open", skip(self, address), err(level = Level::INFO), fields(otel.kind = "client", db.system = "postgresql", db.address = Empty, server.port = Empty, db.namespace = Empty))] async fn open(&mut self, address: String) -> Result, v2::Error> { - if let Err(e) = self.otel_context.reparent_tracing_span() { - return Err(v2::Error::Other(e.to_string())); - }; + self.otel_context.reparent_tracing_span(); spin_factor_outbound_networking::record_address_fields(&address); if !self @@ -243,9 +241,7 @@ impl v2::HostConnection for InstanceState { statement: String, params: Vec, ) -> Result { - if let Err(e) = self.otel_context.reparent_tracing_span() { - return Err(v2::Error::Other(e.to_string())); - }; + self.otel_context.reparent_tracing_span(); Ok(self .get_client(connection) .await? @@ -260,9 +256,7 @@ impl v2::HostConnection for InstanceState { statement: String, params: Vec, ) -> Result { - if let Err(e) = self.otel_context.reparent_tracing_span() { - return Err(v2::Error::Other(e.to_string())); - }; + self.otel_context.reparent_tracing_span(); Ok(self .get_client(connection) .await? diff --git a/crates/factor-outbound-redis/src/host.rs b/crates/factor-outbound-redis/src/host.rs index c7eae93902..2f265b90dc 100644 --- a/crates/factor-outbound-redis/src/host.rs +++ b/crates/factor-outbound-redis/src/host.rs @@ -65,9 +65,7 @@ impl v2::Host for crate::InstanceState { impl v2::HostConnection for crate::InstanceState { #[instrument(name = "spin_outbound_redis.open_connection", skip(self, address), err(level = Level::INFO), fields(otel.kind = "client", db.system = "redis", db.address = Empty, server.port = Empty, db.namespace = Empty))] async fn open(&mut self, address: String) -> Result, Error> { - if let Err(e) = self.otel_context.reparent_tracing_span() { - return Err(Error::Other(e.to_string())); - }; + self.otel_context.reparent_tracing_span(); if !self .is_address_allowed(&address) .await @@ -86,9 +84,7 @@ impl v2::HostConnection for crate::InstanceState { channel: String, payload: Vec, ) -> Result<(), Error> { - if let Err(e) = self.otel_context.reparent_tracing_span() { - return Err(Error::Other(e.to_string())); - }; + self.otel_context.reparent_tracing_span(); let conn = self.get_conn(connection).await.map_err(other_error)?; // The `let () =` syntax is needed to suppress a warning when the result type is inferred. @@ -106,9 +102,7 @@ impl v2::HostConnection for crate::InstanceState { connection: Resource, key: String, ) -> Result>, Error> { - if let Err(e) = self.otel_context.reparent_tracing_span() { - return Err(Error::Other(e.to_string())); - }; + self.otel_context.reparent_tracing_span(); let conn = self.get_conn(connection).await.map_err(other_error)?; let value = conn.get(&key).await.map_err(other_error)?; @@ -122,9 +116,7 @@ impl v2::HostConnection for crate::InstanceState { key: String, value: Vec, ) -> Result<(), Error> { - if let Err(e) = self.otel_context.reparent_tracing_span() { - return Err(Error::Other(e.to_string())); - }; + self.otel_context.reparent_tracing_span(); let conn = self.get_conn(connection).await.map_err(other_error)?; // The `let () =` syntax is needed to suppress a warning when the result type is inferred. @@ -139,9 +131,7 @@ impl v2::HostConnection for crate::InstanceState { connection: Resource, key: String, ) -> Result { - if let Err(e) = self.otel_context.reparent_tracing_span() { - return Err(Error::Other(e.to_string())); - }; + self.otel_context.reparent_tracing_span(); let conn = self.get_conn(connection).await.map_err(other_error)?; let value = conn.incr(&key, 1).await.map_err(other_error)?; @@ -154,9 +144,7 @@ impl v2::HostConnection for crate::InstanceState { connection: Resource, keys: Vec, ) -> Result { - if let Err(e) = self.otel_context.reparent_tracing_span() { - return Err(Error::Other(e.to_string())); - }; + self.otel_context.reparent_tracing_span(); let conn = self.get_conn(connection).await.map_err(other_error)?; let value = conn.del(&keys).await.map_err(other_error)?; @@ -170,9 +158,7 @@ impl v2::HostConnection for crate::InstanceState { key: String, values: Vec, ) -> Result { - if let Err(e) = self.otel_context.reparent_tracing_span() { - return Err(Error::Other(e.to_string())); - }; + self.otel_context.reparent_tracing_span(); let conn = self.get_conn(connection).await.map_err(other_error)?; let value = conn.sadd(&key, &values).await.map_err(|e| { @@ -191,9 +177,7 @@ impl v2::HostConnection for crate::InstanceState { connection: Resource, key: String, ) -> Result, Error> { - if let Err(e) = self.otel_context.reparent_tracing_span() { - return Err(Error::Other(e.to_string())); - }; + self.otel_context.reparent_tracing_span(); let conn = self.get_conn(connection).await.map_err(other_error)?; let value = conn.smembers(&key).await.map_err(other_error)?; @@ -207,9 +191,7 @@ impl v2::HostConnection for crate::InstanceState { key: String, values: Vec, ) -> Result { - if let Err(e) = self.otel_context.reparent_tracing_span() { - return Err(Error::Other(e.to_string())); - }; + self.otel_context.reparent_tracing_span(); let conn = self.get_conn(connection).await.map_err(other_error)?; let value = conn.srem(&key, &values).await.map_err(other_error)?; @@ -223,9 +205,7 @@ impl v2::HostConnection for crate::InstanceState { command: String, arguments: Vec, ) -> Result, Error> { - if let Err(e) = self.otel_context.reparent_tracing_span() { - return Err(Error::Other(e.to_string())); - }; + self.otel_context.reparent_tracing_span(); let conn = self.get_conn(connection).await?; let mut cmd = redis::cmd(&command); diff --git a/crates/factor-sqlite/src/host.rs b/crates/factor-sqlite/src/host.rs index 3011f72e4d..ddc6d0f5a8 100644 --- a/crates/factor-sqlite/src/host.rs +++ b/crates/factor-sqlite/src/host.rs @@ -158,9 +158,7 @@ impl v2::Host for InstanceState { impl v2::HostConnection for InstanceState { #[instrument(name = "spin_sqlite.open", skip(self), err(level = Level::INFO), fields(otel.kind = "client", db.system = "sqlite", sqlite.backend = Empty))] async fn open(&mut self, database: String) -> Result, v2::Error> { - if let Err(e) = self.otel_context.reparent_tracing_span() { - return Err(v2::Error::Io(e.to_string())); - }; + self.otel_context.reparent_tracing_span(); self.open_impl(database).await.map_err(to_v2_error) } @@ -171,9 +169,7 @@ impl v2::HostConnection for InstanceState { query: String, parameters: Vec, ) -> Result { - if let Err(e) = self.otel_context.reparent_tracing_span() { - return Err(v2::Error::Io(e.to_string())); - }; + self.otel_context.reparent_tracing_span(); self.execute_impl( connection, query, diff --git a/crates/factor-variables/src/host.rs b/crates/factor-variables/src/host.rs index bbef549987..784cebd280 100644 --- a/crates/factor-variables/src/host.rs +++ b/crates/factor-variables/src/host.rs @@ -8,9 +8,7 @@ use crate::InstanceState; impl variables::Host for InstanceState { #[instrument(name = "spin_variables.get", skip(self), fields(otel.kind = "client"))] async fn get(&mut self, key: String) -> Result { - if let Err(e) = self.otel_context.reparent_tracing_span() { - return Err(variables::Error::Other(e.to_string())); - }; + self.otel_context.reparent_tracing_span(); let key = spin_expressions::Key::new(&key).map_err(expressions_to_variables_err)?; self.expression_resolver .resolve(&self.component_id, key) diff --git a/crates/wasi-otel/src/common_conversions.rs b/crates/wasi-otel/src/common_conversions.rs new file mode 100644 index 0000000000..06c53fce1f --- /dev/null +++ b/crates/wasi-otel/src/common_conversions.rs @@ -0,0 +1,58 @@ +use super::wasi::{self, clocks0_2_0::wall_clock}; +use std::time::{Duration, SystemTime, UNIX_EPOCH}; + +impl From for opentelemetry::KeyValue { + fn from(kv: wasi::otel::types::KeyValue) -> Self { + opentelemetry::KeyValue::new(kv.key, kv.value) + } +} + +impl From<&wasi::otel::types::KeyValue> for opentelemetry::KeyValue { + fn from(kv: &wasi::otel::types::KeyValue) -> Self { + opentelemetry::KeyValue::new(kv.key.to_owned(), kv.value.to_owned()) + } +} + +impl From for opentelemetry::Value { + fn from(value: wasi::otel::types::Value) -> Self { + match value { + wasi::otel::types::Value::String(v) => v.into(), + wasi::otel::types::Value::Bool(v) => v.into(), + wasi::otel::types::Value::F64(v) => v.into(), + wasi::otel::types::Value::S64(v) => v.into(), + wasi::otel::types::Value::StringArray(v) => opentelemetry::Value::Array( + v.into_iter() + .map(opentelemetry::StringValue::from) + .collect::>() + .into(), + ), + wasi::otel::types::Value::BoolArray(v) => opentelemetry::Value::Array(v.into()), + wasi::otel::types::Value::F64Array(v) => opentelemetry::Value::Array(v.into()), + wasi::otel::types::Value::S64Array(v) => opentelemetry::Value::Array(v.into()), + } + } +} + +impl From for opentelemetry::InstrumentationScope { + fn from(value: wasi::otel::tracing::InstrumentationScope) -> Self { + let builder = + Self::builder(value.name).with_attributes(value.attributes.into_iter().map(Into::into)); + match (value.version, value.schema_url) { + (Some(version), Some(schema_url)) => builder + .with_version(version) + .with_schema_url(schema_url) + .build(), + (Some(version), None) => builder.with_version(version).build(), + (None, Some(schema_url)) => builder.with_schema_url(schema_url).build(), + (None, None) => builder.build(), + } + } +} + +impl From for SystemTime { + fn from(timestamp: wall_clock::Datetime) -> Self { + UNIX_EPOCH + + Duration::from_secs(timestamp.seconds) + + Duration::from_nanos(timestamp.nanoseconds as u64) + } +} diff --git a/crates/wasi-otel/src/lib.rs b/crates/wasi-otel/src/lib.rs index 52c8a5e63f..fc9619e675 100644 --- a/crates/wasi-otel/src/lib.rs +++ b/crates/wasi-otel/src/lib.rs @@ -46,4 +46,6 @@ wasmtime::component::bindgen!({ pub use fermyon::spin as v1; pub use fermyon::spin2_0_0 as v2; -mod conversions; +mod common_conversions; +mod metrics_conversions; +mod trace_conversions; diff --git a/crates/wasi-otel/src/conversions.rs b/crates/wasi-otel/src/metrics_conversions.rs similarity index 55% rename from crates/wasi-otel/src/conversions.rs rename to crates/wasi-otel/src/metrics_conversions.rs index d8b21719ce..ddb7af498e 100644 --- a/crates/wasi-otel/src/conversions.rs +++ b/crates/wasi-otel/src/metrics_conversions.rs @@ -1,9 +1,5 @@ -use super::*; -use opentelemetry::StringValue; -use opentelemetry_sdk::trace::{SpanEvents, SpanLinks}; +use super::wasi; use std::borrow::Cow; -use std::time::{Duration, SystemTime, UNIX_EPOCH}; -use wasi::clocks0_2_0::wall_clock; impl From for opentelemetry_sdk::metrics::data::ResourceMetrics @@ -273,212 +269,3 @@ impl From for opentelemetry_sdk::metrics::Temp } } } - -impl From for opentelemetry_sdk::trace::SpanData { - fn from(value: wasi::otel::tracing::SpanData) -> Self { - let mut span_events = SpanEvents::default(); - span_events.events = value.events.into_iter().map(Into::into).collect(); - span_events.dropped_count = value.dropped_events; - let mut span_links = SpanLinks::default(); - span_links.links = value.links.into_iter().map(Into::into).collect(); - span_links.dropped_count = value.dropped_links; - Self { - span_context: value.span_context.into(), - parent_span_id: opentelemetry::trace::SpanId::from_hex(&value.parent_span_id) - .unwrap_or(opentelemetry::trace::SpanId::INVALID), - span_kind: value.span_kind.into(), - name: value.name.into(), - start_time: value.start_time.into(), - end_time: value.end_time.into(), - attributes: value.attributes.into_iter().map(Into::into).collect(), - dropped_attributes_count: value.dropped_attributes, - events: span_events, - links: span_links, - status: value.status.into(), - instrumentation_scope: value.instrumentation_scope.into(), - } - } -} - -impl From for opentelemetry::trace::SpanContext { - fn from(sc: wasi::otel::tracing::SpanContext) -> Self { - let trace_id = opentelemetry::trace::TraceId::from_hex(&sc.trace_id) - .unwrap_or(opentelemetry::trace::TraceId::INVALID); - let span_id = opentelemetry::trace::SpanId::from_hex(&sc.span_id) - .unwrap_or(opentelemetry::trace::SpanId::INVALID); - let trace_state = opentelemetry::trace::TraceState::from_key_value(sc.trace_state) - .unwrap_or_else(|_| opentelemetry::trace::TraceState::default()); - Self::new( - trace_id, - span_id, - sc.trace_flags.into(), - sc.is_remote, - trace_state, - ) - } -} - -impl From for wasi::otel::tracing::SpanContext { - fn from(sc: opentelemetry::trace::SpanContext) -> Self { - Self { - trace_id: format!("{:x}", sc.trace_id()), - span_id: format!("{:x}", sc.span_id()), - trace_flags: sc.trace_flags().into(), - is_remote: sc.is_remote(), - trace_state: sc - .trace_state() - .header() - .split(',') - .filter_map(|s| { - if let Some((key, value)) = s.split_once('=') { - Some((key.to_string(), value.to_string())) - } else { - None - } - }) - .collect(), - } - } -} - -impl From for opentelemetry::trace::TraceFlags { - fn from(flags: wasi::otel::tracing::TraceFlags) -> Self { - Self::new(flags.as_array()[0] as u8) - } -} - -impl From for wasi::otel::tracing::TraceFlags { - fn from(flags: opentelemetry::trace::TraceFlags) -> Self { - if flags.is_sampled() { - wasi::otel::tracing::TraceFlags::SAMPLED - } else { - wasi::otel::tracing::TraceFlags::empty() - } - } -} - -impl From for opentelemetry::trace::SpanKind { - fn from(kind: wasi::otel::tracing::SpanKind) -> Self { - match kind { - wasi::otel::tracing::SpanKind::Client => opentelemetry::trace::SpanKind::Client, - wasi::otel::tracing::SpanKind::Server => opentelemetry::trace::SpanKind::Server, - wasi::otel::tracing::SpanKind::Producer => opentelemetry::trace::SpanKind::Producer, - wasi::otel::tracing::SpanKind::Consumer => opentelemetry::trace::SpanKind::Consumer, - wasi::otel::tracing::SpanKind::Internal => opentelemetry::trace::SpanKind::Internal, - } - } -} - -impl From for opentelemetry::KeyValue { - fn from(kv: wasi::otel::tracing::KeyValue) -> Self { - opentelemetry::KeyValue::new(kv.key, kv.value) - } -} - -impl From<&wasi::otel::tracing::KeyValue> for opentelemetry::KeyValue { - fn from(kv: &wasi::otel::tracing::KeyValue) -> Self { - opentelemetry::KeyValue::new(kv.key.to_owned(), kv.value.to_owned()) - } -} - -impl From for opentelemetry::Value { - fn from(value: wasi::otel::types::Value) -> Self { - match value { - wasi::otel::types::Value::String(v) => v.into(), - wasi::otel::types::Value::Bool(v) => v.into(), - wasi::otel::types::Value::F64(v) => v.into(), - wasi::otel::types::Value::S64(v) => v.into(), - wasi::otel::types::Value::StringArray(v) => opentelemetry::Value::Array( - v.into_iter() - .map(StringValue::from) - .collect::>() - .into(), - ), - wasi::otel::types::Value::BoolArray(v) => opentelemetry::Value::Array(v.into()), - wasi::otel::types::Value::F64Array(v) => opentelemetry::Value::Array(v.into()), - wasi::otel::types::Value::S64Array(v) => opentelemetry::Value::Array(v.into()), - } - } -} - -impl From for opentelemetry::trace::Event { - fn from(event: wasi::otel::tracing::Event) -> Self { - Self::new( - event.name, - event.time.into(), - event.attributes.into_iter().map(Into::into).collect(), - 0, - ) - } -} - -impl From for opentelemetry::trace::Link { - fn from(link: wasi::otel::tracing::Link) -> Self { - Self::new( - link.span_context.into(), - link.attributes.into_iter().map(Into::into).collect(), - 0, - ) - } -} - -impl From for opentelemetry::trace::Status { - fn from(status: wasi::otel::tracing::Status) -> Self { - match status { - wasi::otel::tracing::Status::Unset => Self::Unset, - wasi::otel::tracing::Status::Ok => Self::Ok, - wasi::otel::tracing::Status::Error(s) => Self::Error { - description: s.into(), - }, - } - } -} - -impl From for opentelemetry::InstrumentationScope { - fn from(value: wasi::otel::tracing::InstrumentationScope) -> Self { - let builder = - Self::builder(value.name).with_attributes(value.attributes.into_iter().map(Into::into)); - match (value.version, value.schema_url) { - (Some(version), Some(schema_url)) => builder - .with_version(version) - .with_schema_url(schema_url) - .build(), - (Some(version), None) => builder.with_version(version).build(), - (None, Some(schema_url)) => builder.with_schema_url(schema_url).build(), - (None, None) => builder.build(), - } - } -} - -impl From for SystemTime { - fn from(timestamp: wall_clock::Datetime) -> Self { - UNIX_EPOCH - + Duration::from_secs(timestamp.seconds) - + Duration::from_nanos(timestamp.nanoseconds as u64) - } -} - -mod test { - #[test] - fn trace_flags() { - let flags = opentelemetry::trace::TraceFlags::SAMPLED; - let flags2 = crate::wasi::otel::tracing::TraceFlags::from(flags); - let flags3 = opentelemetry::trace::TraceFlags::from(flags2); - assert_eq!(flags, flags3); - } - - #[test] - fn span_context() { - let sc = opentelemetry::trace::SpanContext::new( - opentelemetry::trace::TraceId::from_hex("4fb34cb4484029f7881399b149e41e98").unwrap(), - opentelemetry::trace::SpanId::from_hex("9ffd58d3cd4dd90b").unwrap(), - opentelemetry::trace::TraceFlags::SAMPLED, - false, - opentelemetry::trace::TraceState::from_key_value(vec![("foo", "bar"), ("baz", "qux")]) - .unwrap(), - ); - let sc2 = crate::wasi::otel::tracing::SpanContext::from(sc.clone()); - let sc3 = opentelemetry::trace::SpanContext::from(sc2); - assert_eq!(sc, sc3); - } -} diff --git a/crates/wasi-otel/src/trace_conversions.rs b/crates/wasi-otel/src/trace_conversions.rs new file mode 100644 index 0000000000..37e9fa1231 --- /dev/null +++ b/crates/wasi-otel/src/trace_conversions.rs @@ -0,0 +1,155 @@ +use super::wasi; +use opentelemetry_sdk::trace::{SpanEvents, SpanLinks}; + +impl From for opentelemetry_sdk::trace::SpanData { + fn from(value: wasi::otel::tracing::SpanData) -> Self { + let mut span_events = SpanEvents::default(); + span_events.events = value.events.into_iter().map(Into::into).collect(); + span_events.dropped_count = value.dropped_events; + let mut span_links = SpanLinks::default(); + span_links.links = value.links.into_iter().map(Into::into).collect(); + span_links.dropped_count = value.dropped_links; + Self { + span_context: value.span_context.into(), + parent_span_id: opentelemetry::trace::SpanId::from_hex(&value.parent_span_id) + .unwrap_or(opentelemetry::trace::SpanId::INVALID), + span_kind: value.span_kind.into(), + name: value.name.into(), + start_time: value.start_time.into(), + end_time: value.end_time.into(), + attributes: value.attributes.into_iter().map(Into::into).collect(), + dropped_attributes_count: value.dropped_attributes, + events: span_events, + links: span_links, + status: value.status.into(), + instrumentation_scope: value.instrumentation_scope.into(), + } + } +} + +impl From for opentelemetry::trace::SpanContext { + fn from(sc: wasi::otel::tracing::SpanContext) -> Self { + let trace_id = opentelemetry::trace::TraceId::from_hex(&sc.trace_id) + .unwrap_or(opentelemetry::trace::TraceId::INVALID); + let span_id = opentelemetry::trace::SpanId::from_hex(&sc.span_id) + .unwrap_or(opentelemetry::trace::SpanId::INVALID); + let trace_state = opentelemetry::trace::TraceState::from_key_value(sc.trace_state) + .unwrap_or_else(|_| opentelemetry::trace::TraceState::default()); + Self::new( + trace_id, + span_id, + sc.trace_flags.into(), + sc.is_remote, + trace_state, + ) + } +} + +impl From for wasi::otel::tracing::SpanContext { + fn from(sc: opentelemetry::trace::SpanContext) -> Self { + Self { + trace_id: format!("{:x}", sc.trace_id()), + span_id: format!("{:x}", sc.span_id()), + trace_flags: sc.trace_flags().into(), + is_remote: sc.is_remote(), + trace_state: sc + .trace_state() + .header() + .split(',') + .filter_map(|s| { + if let Some((key, value)) = s.split_once('=') { + Some((key.to_string(), value.to_string())) + } else { + None + } + }) + .collect(), + } + } +} + +impl From for opentelemetry::trace::TraceFlags { + fn from(flags: wasi::otel::tracing::TraceFlags) -> Self { + Self::new(flags.as_array()[0] as u8) + } +} + +impl From for wasi::otel::tracing::TraceFlags { + fn from(flags: opentelemetry::trace::TraceFlags) -> Self { + if flags.is_sampled() { + wasi::otel::tracing::TraceFlags::SAMPLED + } else { + wasi::otel::tracing::TraceFlags::empty() + } + } +} + +impl From for opentelemetry::trace::SpanKind { + fn from(kind: wasi::otel::tracing::SpanKind) -> Self { + match kind { + wasi::otel::tracing::SpanKind::Client => opentelemetry::trace::SpanKind::Client, + wasi::otel::tracing::SpanKind::Server => opentelemetry::trace::SpanKind::Server, + wasi::otel::tracing::SpanKind::Producer => opentelemetry::trace::SpanKind::Producer, + wasi::otel::tracing::SpanKind::Consumer => opentelemetry::trace::SpanKind::Consumer, + wasi::otel::tracing::SpanKind::Internal => opentelemetry::trace::SpanKind::Internal, + } + } +} + +impl From for opentelemetry::trace::Event { + fn from(event: wasi::otel::tracing::Event) -> Self { + Self::new( + event.name, + event.time.into(), + event.attributes.into_iter().map(Into::into).collect(), + 0, + ) + } +} + +impl From for opentelemetry::trace::Link { + fn from(link: wasi::otel::tracing::Link) -> Self { + Self::new( + link.span_context.into(), + link.attributes.into_iter().map(Into::into).collect(), + 0, + ) + } +} + +impl From for opentelemetry::trace::Status { + fn from(status: wasi::otel::tracing::Status) -> Self { + match status { + wasi::otel::tracing::Status::Unset => Self::Unset, + wasi::otel::tracing::Status::Ok => Self::Ok, + wasi::otel::tracing::Status::Error(s) => Self::Error { + description: s.into(), + }, + } + } +} + +mod test { + #[test] + fn trace_flags() { + let flags = opentelemetry::trace::TraceFlags::SAMPLED; + let flags2 = crate::wasi::otel::tracing::TraceFlags::from(flags); + let flags3 = opentelemetry::trace::TraceFlags::from(flags2); + assert_eq!(flags, flags3); + } + + #[test] + fn span_context() { + let sc = opentelemetry::trace::SpanContext::new( + opentelemetry::trace::TraceId::from_hex("4fb34cb4484029f7881399b149e41e98").unwrap(), + opentelemetry::trace::SpanId::from_hex("9ffd58d3cd4dd90b").unwrap(), + opentelemetry::trace::TraceFlags::SAMPLED, + false, + opentelemetry::trace::TraceState::from_key_value(vec![("foo", "bar"), ("baz", "qux")]) + .unwrap(), + ); + let sc2 = crate::wasi::otel::tracing::SpanContext::from(sc.clone()); + let sc3 = opentelemetry::trace::SpanContext::from(sc2); + assert_eq!(sc, sc3); + } +} From c7a53df01fdc436de1872f47e1d5e2c3ac51f9e8 Mon Sep 17 00:00:00 2001 From: Andrew Steurer <94206073+asteurer@users.noreply.github.com> Date: Tue, 25 Nov 2025 22:28:11 +0000 Subject: [PATCH 08/18] feat(test): adding tests Signed-off-by: Andrew Steurer <94206073+asteurer@users.noreply.github.com> --- .../components/wasi-otel-tracing/src/lib.rs | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/tests/test-components/components/wasi-otel-tracing/src/lib.rs b/tests/test-components/components/wasi-otel-tracing/src/lib.rs index c7d427b8bc..c604e2f3b5 100644 --- a/tests/test-components/components/wasi-otel-tracing/src/lib.rs +++ b/tests/test-components/components/wasi-otel-tracing/src/lib.rs @@ -1,5 +1,3 @@ -use std::time; - use opentelemetry::{ global::{self, BoxedTracer, ObjectSafeSpan}, trace::{TraceContextExt, Tracer}, @@ -11,6 +9,7 @@ use spin_sdk::{ http::{IntoResponse, Method, Params, Request, Response, Router}, http_component, }; +use std::time; #[http_component] fn handle(req: Request) -> anyhow::Result { @@ -21,6 +20,8 @@ fn handle(req: Request) -> anyhow::Result { router.get("/events", events); router.get("/links", links); router.get_async("/root-span", root_span); + router.get("/start-called-end-not-called", start_called_end_not_called); + router.get("/child-span-outlives-parent", child_span_outlives_parent); Ok(router.handle(req)) } @@ -125,6 +126,22 @@ async fn make_request() { let _res: Response = spin_sdk::http::send(req).await.unwrap(); } -// TODO: Test what happens if start is called but not end -// TODO: Test what happens if end is called but not start -// TODO: What happens if child span outlives parent +fn start_called_end_not_called(_req: Request, _params: Params) -> Response { + let (tracer, _ctx) = setup_tracer(false); + let _span = tracer.start("start_called_end_not_called"); + // span.end() is not called... + Response::new(200, "") +} + +fn child_span_outlives_parent(_req: Request, _params: Params) -> Response { + let (tracer, _ctx) = setup_tracer(false); + let child = { + let parent = tracer.start("parent"); + let parent_ctx = Context::current_with_span(parent); + let _guard = parent_ctx.clone().attach(); + let child = tracer.start("child"); + child + }; + drop(child); + Response::new(200, "") +} From 9d29b4430654c70ba90b328f6e6df519f5e83ea9 Mon Sep 17 00:00:00 2001 From: Andrew Steurer <94206073+asteurer@users.noreply.github.com> Date: Tue, 25 Nov 2025 22:29:43 +0000 Subject: [PATCH 09/18] removing unhelpful comments Signed-off-by: Andrew Steurer <94206073+asteurer@users.noreply.github.com> --- crates/factor-otel/src/host.rs | 1 - crates/factor-otel/src/lib.rs | 1 - 2 files changed, 2 deletions(-) diff --git a/crates/factor-otel/src/host.rs b/crates/factor-otel/src/host.rs index b9b7baf5c3..aeae4ea08c 100644 --- a/crates/factor-otel/src/host.rs +++ b/crates/factor-otel/src/host.rs @@ -6,7 +6,6 @@ use opentelemetry_sdk::error::OTelSdkError; use opentelemetry_sdk::metrics::exporter::PushMetricExporter; use opentelemetry_sdk::trace::SpanProcessor; use tracing_opentelemetry::OpenTelemetrySpanExt; -// TODO: This feels weird. I'm wondering if it can be fixed by wrangling the bindgen macro in `crates/wasi_otel/lib.rs`. use wasi_otel::wasi; impl wasi::otel::tracing::Host for InstanceState { diff --git a/crates/factor-otel/src/lib.rs b/crates/factor-otel/src/lib.rs index 3cd00d71cf..626944a0e4 100644 --- a/crates/factor-otel/src/lib.rs +++ b/crates/factor-otel/src/lib.rs @@ -29,7 +29,6 @@ impl Factor for OtelFactor { type InstanceBuilder = InstanceState; fn init(&mut self, ctx: &mut impl spin_factors::InitContext) -> anyhow::Result<()> { - // TODO: This feels weird. I'm wondering if it can be fixed by wrangling the bindgen macro in `crates/wasi_otel/lib.rs`. ctx.link_bindings(wasi_otel::wasi::otel::tracing::add_to_linker::<_, FactorData>)?; ctx.link_bindings(wasi_otel::wasi::otel::metrics::add_to_linker::<_, FactorData>)?; Ok(()) From ccd34c3c1da181f9066478c2d49776d3f0049863 Mon Sep 17 00:00:00 2001 From: Andrew Steurer <94206073+asteurer@users.noreply.github.com> Date: Tue, 25 Nov 2025 22:47:45 +0000 Subject: [PATCH 10/18] fix: removing empty test Signed-off-by: Andrew Steurer <94206073+asteurer@users.noreply.github.com> --- .../components/otel-smoke-test/Cargo.toml | 12 ---------- .../components/otel-smoke-test/src/lib.rs | 22 ------------------- 2 files changed, 34 deletions(-) delete mode 100644 tests/test-components/components/otel-smoke-test/Cargo.toml delete mode 100644 tests/test-components/components/otel-smoke-test/src/lib.rs diff --git a/tests/test-components/components/otel-smoke-test/Cargo.toml b/tests/test-components/components/otel-smoke-test/Cargo.toml deleted file mode 100644 index 521468b790..0000000000 --- a/tests/test-components/components/otel-smoke-test/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "otel-smoke-test" -version = "0.1.0" -edition = "2021" - -[lib] -crate-type = ["cdylib"] - -[dependencies] -anyhow = "1" -http = "0.2" -spin-sdk = "2.2.0" diff --git a/tests/test-components/components/otel-smoke-test/src/lib.rs b/tests/test-components/components/otel-smoke-test/src/lib.rs deleted file mode 100644 index 85c4326102..0000000000 --- a/tests/test-components/components/otel-smoke-test/src/lib.rs +++ /dev/null @@ -1,22 +0,0 @@ -use spin_sdk::{ - http::{Method, Params, Request, Response, Router}, - http_component, -}; - -#[http_component] -fn handle(req: http::Request<()>) -> Response { - let mut router = Router::new(); - router.get_async("/one", one); - router.get_async("/two", two); - router.handle(req) -} - -async fn one(_req: Request, _params: Params) -> Response { - let req = Request::builder().method(Method::Get).uri("/two").build(); - let _res: Response = spin_sdk::http::send(req).await.unwrap(); - Response::new(200, "") -} - -async fn two(_req: Request, _params: Params) -> Response { - Response::new(201, "") -} From 20dda442a755f1c2a8edfef5bf5c43c747cef998 Mon Sep 17 00:00:00 2001 From: Andrew Steurer <94206073+asteurer@users.noreply.github.com> Date: Tue, 25 Nov 2025 22:47:53 +0000 Subject: [PATCH 11/18] fix: removing empty test Signed-off-by: Andrew Steurer <94206073+asteurer@users.noreply.github.com> --- tests/test-components/components/Cargo.lock | 9 --------- 1 file changed, 9 deletions(-) diff --git a/tests/test-components/components/Cargo.lock b/tests/test-components/components/Cargo.lock index 44ed4f0b48..fc46090628 100644 --- a/tests/test-components/components/Cargo.lock +++ b/tests/test-components/components/Cargo.lock @@ -859,15 +859,6 @@ dependencies = [ "thiserror 2.0.17", ] -[[package]] -name = "otel-smoke-test" -version = "0.1.0" -dependencies = [ - "anyhow", - "http 0.2.12", - "spin-sdk 2.2.0", -] - [[package]] name = "outbound-http-component" version = "0.1.0" From ea6d79be2548fc56ef32a7b0e37b63331a9db96c Mon Sep 17 00:00:00 2001 From: Andrew Steurer <94206073+asteurer@users.noreply.github.com> Date: Tue, 25 Nov 2025 22:49:34 +0000 Subject: [PATCH 12/18] fix: removing empty test Signed-off-by: Andrew Steurer <94206073+asteurer@users.noreply.github.com> --- tests/testcases/otel-smoke-test/spin.toml | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 tests/testcases/otel-smoke-test/spin.toml diff --git a/tests/testcases/otel-smoke-test/spin.toml b/tests/testcases/otel-smoke-test/spin.toml deleted file mode 100644 index 909149421f..0000000000 --- a/tests/testcases/otel-smoke-test/spin.toml +++ /dev/null @@ -1,13 +0,0 @@ -spin_version = "1" -authors = ["Fermyon Engineering "] -description = "A simple application that tests otel." -name = "otel-smoke-test" -trigger = { type = "http" } -version = "1.0.0" - -[[component]] -id = "otel" -source = "%{source=otel-smoke-test}" -allowed_outbound_hosts = ["http://self"] -[component.trigger] -route = "/..." From 9f7243c07aa08745f25a5ef64e4b9e378aaa0689 Mon Sep 17 00:00:00 2001 From: Andrew Steurer <94206073+asteurer@users.noreply.github.com> Date: Wed, 26 Nov 2025 15:49:53 -0600 Subject: [PATCH 13/18] fix: linting Signed-off-by: Andrew Steurer <94206073+asteurer@users.noreply.github.com> --- tests/test-components/components/wasi-otel-tracing/src/lib.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/test-components/components/wasi-otel-tracing/src/lib.rs b/tests/test-components/components/wasi-otel-tracing/src/lib.rs index c604e2f3b5..c32c3123f0 100644 --- a/tests/test-components/components/wasi-otel-tracing/src/lib.rs +++ b/tests/test-components/components/wasi-otel-tracing/src/lib.rs @@ -139,8 +139,7 @@ fn child_span_outlives_parent(_req: Request, _params: Params) -> Response { let parent = tracer.start("parent"); let parent_ctx = Context::current_with_span(parent); let _guard = parent_ctx.clone().attach(); - let child = tracer.start("child"); - child + tracer.start("child") }; drop(child); Response::new(200, "") From 99d675bb981ac91a526ee9ade5f39c5fe7db7802 Mon Sep 17 00:00:00 2001 From: Andrew Steurer <94206073+asteurer@users.noreply.github.com> Date: Mon, 1 Dec 2025 11:31:08 +0000 Subject: [PATCH 14/18] fix: fixing tests Signed-off-by: Andrew Steurer <94206073+asteurer@users.noreply.github.com> --- examples/spin-timer/Cargo.lock | 45 ++++- tests/integration.rs | 6 +- tests/test-components/components/Cargo.lock | 165 +++++++++++++++--- .../components/wasi-otel-tracing/Cargo.toml | 8 +- .../components/wasi-otel-tracing/src/lib.rs | 2 +- tests/testcases/otel-smoke-test/spin.toml | 12 ++ 6 files changed, 210 insertions(+), 28 deletions(-) create mode 100644 tests/testcases/otel-smoke-test/spin.toml diff --git a/examples/spin-timer/Cargo.lock b/examples/spin-timer/Cargo.lock index e6756c536b..8c887a5656 100644 --- a/examples/spin-timer/Cargo.lock +++ b/examples/spin-timer/Cargo.lock @@ -3272,7 +3272,6 @@ dependencies = [ "thiserror 2.0.17", "tokio", "tonic", - "tracing", ] [[package]] @@ -4875,6 +4874,7 @@ dependencies = [ "anyhow", "serde", "spin-core", + "spin-factor-otel", "spin-factors", "spin-locked-app", "spin-resource-table", @@ -4893,6 +4893,7 @@ dependencies = [ "anyhow", "async-trait", "serde", + "spin-factor-otel", "spin-factors", "spin-llm-remote-http", "spin-locked-app", @@ -4904,6 +4905,24 @@ dependencies = [ "url", ] +[[package]] +name = "spin-factor-otel" +version = "3.6.0-pre0" +dependencies = [ + "anyhow", + "indexmap 2.9.0", + "opentelemetry", + "opentelemetry-otlp", + "opentelemetry_sdk", + "spin-core", + "spin-factors", + "spin-resource-table", + "spin-telemetry", + "tracing", + "tracing-opentelemetry", + "wasi-otel", +] + [[package]] name = "spin-factor-outbound-http" version = "3.6.0-pre0" @@ -4919,6 +4938,7 @@ dependencies = [ "reqwest", "rustls 0.23.25", "serde", + "spin-factor-otel", "spin-factor-outbound-networking", "spin-factors", "spin-telemetry", @@ -4939,6 +4959,7 @@ dependencies = [ "anyhow", "rumqttc", "spin-core", + "spin-factor-otel", "spin-factor-outbound-networking", "spin-factors", "spin-resource-table", @@ -4954,6 +4975,7 @@ dependencies = [ "anyhow", "mysql_async", "spin-core", + "spin-factor-otel", "spin-factor-outbound-networking", "spin-factors", "spin-resource-table", @@ -5001,6 +5023,7 @@ dependencies = [ "rust_decimal", "serde_json", "spin-core", + "spin-factor-otel", "spin-factor-outbound-networking", "spin-factors", "spin-resource-table", @@ -5018,6 +5041,7 @@ dependencies = [ "anyhow", "redis", "spin-core", + "spin-factor-otel", "spin-factor-outbound-networking", "spin-factors", "spin-resource-table", @@ -5031,6 +5055,7 @@ name = "spin-factor-sqlite" version = "3.6.0-pre0" dependencies = [ "async-trait", + "spin-factor-otel", "spin-factors", "spin-locked-app", "spin-resource-table", @@ -5044,6 +5069,7 @@ name = "spin-factor-variables" version = "3.6.0-pre0" dependencies = [ "spin-expressions", + "spin-factor-otel", "spin-factors", "spin-telemetry", "spin-world", @@ -5222,6 +5248,7 @@ dependencies = [ "spin-expressions", "spin-factor-key-value", "spin-factor-llm", + "spin-factor-otel", "spin-factor-outbound-http", "spin-factor-outbound-mqtt", "spin-factor-outbound-mysql", @@ -5254,6 +5281,7 @@ dependencies = [ "spin-common", "spin-factor-key-value", "spin-factor-llm", + "spin-factor-otel", "spin-factor-outbound-http", "spin-factor-outbound-mqtt", "spin-factor-outbound-mysql", @@ -5417,7 +5445,10 @@ dependencies = [ name = "spin-world" version = "3.6.0-pre0" dependencies = [ + "anyhow", "async-trait", + "opentelemetry", + "opentelemetry_sdk", "wasmtime", ] @@ -6056,6 +6087,7 @@ dependencies = [ "smallvec", "tracing", "tracing-core", + "tracing-log", "tracing-subscriber", "web-time", ] @@ -6345,6 +6377,17 @@ dependencies = [ "wit-bindgen-rt", ] +[[package]] +name = "wasi-otel" +version = "3.6.0-pre0" +dependencies = [ + "anyhow", + "async-trait", + "opentelemetry", + "opentelemetry_sdk", + "wasmtime", +] + [[package]] name = "wasite" version = "0.1.0" diff --git a/tests/integration.rs b/tests/integration.rs index 8663b9abf6..36ad3c3174 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -1756,7 +1756,11 @@ mod otel_integration_tests { }, move |env| { let spin = env.runtime_mut(); - assert_spin_request(spin, Request::new(Method::Get, "/one"), Response::new(200))?; + assert_spin_request( + spin, + Request::new(Method::Get, "/hello"), + Response::new_with_body(200, "Hello World!\n"), + )?; let spans = rt.block_on(collector.exported_spans(5, Duration::from_secs(5))); diff --git a/tests/test-components/components/Cargo.lock b/tests/test-components/components/Cargo.lock index fc46090628..d8a2eb79df 100644 --- a/tests/test-components/components/Cargo.lock +++ b/tests/test-components/components/Cargo.lock @@ -816,9 +816,9 @@ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "opentelemetry" -version = "0.30.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaf416e4cb72756655126f7dd7bb0af49c674f4c1b9903e80c009e0c37e552e6" +checksum = "b84bcd6ae87133e903af7ef497404dda70c60d0ea14895fc8a5e6722754fc2a0" dependencies = [ "futures-core", "futures-sink", @@ -831,23 +831,23 @@ dependencies = [ [[package]] name = "opentelemetry-wasi" version = "0.27.0" -source = "git+https://github.com/calebschoepp/opentelemetry-wasi?rev=60df119fbc03ed83d0e2cc1300f6a8eb055d23f7#60df119fbc03ed83d0e2cc1300f6a8eb055d23f7" +source = "git+https://github.com/calebschoepp/opentelemetry-wasi?rev=3c2c38478e02a1a4d3bfb56c02cbc39daaccd0e4#3c2c38478e02a1a4d3bfb56c02cbc39daaccd0e4" dependencies = [ "anyhow", "opentelemetry", "opentelemetry_sdk", - "spin-sdk 3.1.1", + "spin-sdk 5.1.1", "tracing", "tracing-opentelemetry", "tracing-subscriber", - "wit-bindgen 0.30.0", + "wit-bindgen 0.47.0", ] [[package]] name = "opentelemetry_sdk" -version = "0.30.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11f644aa9e5e31d11896e024305d7e3c98a88884d9f8919dbf37a9991bc47a4b" +checksum = "e14ae4f5991976fd48df6d843de219ca6d31b01daaab2dad5af2badeded372bd" dependencies = [ "futures-channel", "futures-executor", @@ -855,7 +855,6 @@ dependencies = [ "opentelemetry", "percent-encoding", "rand", - "serde_json", "thiserror 2.0.17", ] @@ -1210,9 +1209,9 @@ dependencies = [ [[package]] name = "spin-executor" -version = "5.1.0" +version = "5.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa74c56ad71afb64fff0566d7cb313567d0469ba2a75b0af58c323f59b74280" +checksum = "dd83f9f07676e2a8a1e9eaccd245344a67296712c24828bd69f3d11c127cd59d" dependencies = [ "futures", "once_cell", @@ -1248,9 +1247,9 @@ dependencies = [ [[package]] name = "spin-macro" -version = "5.1.0" +version = "5.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74edf3aab0f4e24b30e765d10fcdbff69aa2d1906907f3318c5f8a8106daef34" +checksum = "607df2c3b413f7086fa47a5402daa0d51640ba9b9b8e8955c43a58bd4057d2f4" dependencies = [ "anyhow", "bytes", @@ -1313,9 +1312,9 @@ dependencies = [ [[package]] name = "spin-sdk" -version = "5.1.0" +version = "5.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5374bed998dc151d3c3a45ffdba3269d9f94ea6cf19f002ff7fc744edb09a5f8" +checksum = "4952d7c69dbfbeff54d62f0e3b3e14c105b80871d2100557f7b1b1429beffc24" dependencies = [ "anyhow", "async-trait", @@ -1330,8 +1329,8 @@ dependencies = [ "rust_decimal", "serde", "serde_json", - "spin-executor 5.1.0", - "spin-macro 5.1.0", + "spin-executor 5.1.1", + "spin-macro 5.1.1", "thiserror 2.0.17", "uuid", "wasi", @@ -1535,15 +1534,16 @@ dependencies = [ [[package]] name = "tracing-opentelemetry" -version = "0.31.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddcf5959f39507d0d04d6413119c04f33b623f4f951ebcbdddddfad2d0623a9c" +checksum = "1e6e5658463dd88089aba75c7791e1d3120633b1bfde22478b28f625a9bb1b8e" dependencies = [ "js-sys", - "once_cell", "opentelemetry", "opentelemetry_sdk", + "rustversion", "smallvec", + "thiserror 2.0.17", "tracing", "tracing-core", "tracing-log", @@ -1615,7 +1615,7 @@ name = "unsupported-import" version = "0.1.0" dependencies = [ "anyhow", - "spin-sdk 5.1.0", + "spin-sdk 5.1.1", "wit-bindgen 0.43.0", ] @@ -1735,7 +1735,7 @@ dependencies = [ "opentelemetry", "opentelemetry-wasi", "opentelemetry_sdk", - "spin-sdk 3.1.1", + "spin-sdk 5.1.1", "wit-bindgen 0.30.0", ] @@ -1850,6 +1850,16 @@ dependencies = [ "wasmparser 0.239.0", ] +[[package]] +name = "wasm-encoder" +version = "0.240.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06d642d8c5ecc083aafe9ceb32809276a304547a3a6eeecceb5d8152598bc71f" +dependencies = [ + "leb128fmt", + "wasmparser 0.240.0", +] + [[package]] name = "wasm-metadata" version = "0.10.20" @@ -1906,6 +1916,18 @@ dependencies = [ "wasmparser 0.239.0", ] +[[package]] +name = "wasm-metadata" +version = "0.240.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee093e1e1ccffa005b9b778f7a10ccfd58e25a20eccad294a1a93168d076befb" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder 0.240.0", + "wasmparser 0.240.0", +] + [[package]] name = "wasmparser" version = "0.116.1" @@ -1974,6 +1996,18 @@ dependencies = [ "semver", ] +[[package]] +name = "wasmparser" +version = "0.240.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b722dcf61e0ea47440b53ff83ccb5df8efec57a69d150e4f24882e4eba7e24a4" +dependencies = [ + "bitflags", + "hashbrown 0.15.5", + "indexmap", + "semver", +] + [[package]] name = "web-time" version = "1.1.0" @@ -2104,6 +2138,16 @@ dependencies = [ "wit-bindgen-rust-macro 0.46.0", ] +[[package]] +name = "wit-bindgen" +version = "0.47.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a374235c3c0dff10537040b437073d09f1e38f13216b5f3cbc809c6226814e5c" +dependencies = [ + "bitflags", + "wit-bindgen-rust-macro 0.47.0", +] + [[package]] name = "wit-bindgen-core" version = "0.13.1" @@ -2159,6 +2203,17 @@ dependencies = [ "wit-parser 0.239.0", ] +[[package]] +name = "wit-bindgen-core" +version = "0.47.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdf62e62178415a705bda25dc01c54ed65c0f956e4efd00ca89447a9a84f4881" +dependencies = [ + "anyhow", + "heck 0.5.0", + "wit-parser 0.240.0", +] + [[package]] name = "wit-bindgen-rt" version = "0.24.0" @@ -2262,6 +2317,22 @@ dependencies = [ "wit-component 0.239.0", ] +[[package]] +name = "wit-bindgen-rust" +version = "0.47.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6d585319871ca18805056f69ddec7541770fc855820f9944029cb2b75ea108f" +dependencies = [ + "anyhow", + "heck 0.5.0", + "indexmap", + "prettyplease", + "syn 2.0.108", + "wasm-metadata 0.240.0", + "wit-bindgen-core 0.47.0", + "wit-component 0.240.0", +] + [[package]] name = "wit-bindgen-rust-macro" version = "0.13.1" @@ -2337,6 +2408,21 @@ dependencies = [ "wit-bindgen-rust 0.46.0", ] +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.47.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bde589435d322e88b8f708f70e313f60dfb7975ac4e7c623fef6f1e5685d90e8" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.108", + "wit-bindgen-core 0.47.0", + "wit-bindgen-rust 0.47.0", +] + [[package]] name = "wit-component" version = "0.17.0" @@ -2432,6 +2518,25 @@ dependencies = [ "wit-parser 0.239.0", ] +[[package]] +name = "wit-component" +version = "0.240.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dc5474b078addc5fe8a72736de8da3acfb3ff324c2491133f8b59594afa1a20" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder 0.240.0", + "wasm-metadata 0.240.0", + "wasmparser 0.240.0", + "wit-parser 0.240.0", +] + [[package]] name = "wit-parser" version = "0.12.2" @@ -2520,6 +2625,24 @@ dependencies = [ "wasmparser 0.239.0", ] +[[package]] +name = "wit-parser" +version = "0.240.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9875ea3fa272f57cc1fc50f225a7b94021a7878c484b33792bccad0d93223439" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser 0.240.0", +] + [[package]] name = "writeable" version = "0.6.2" diff --git a/tests/test-components/components/wasi-otel-tracing/Cargo.toml b/tests/test-components/components/wasi-otel-tracing/Cargo.toml index 4a434653e1..858383c4d2 100644 --- a/tests/test-components/components/wasi-otel-tracing/Cargo.toml +++ b/tests/test-components/components/wasi-otel-tracing/Cargo.toml @@ -9,8 +9,8 @@ crate-type = ["cdylib"] [dependencies] anyhow = "1" http = "0.2" -opentelemetry = "0.30.0" -opentelemetry_sdk = "0.30.0" -opentelemetry-wasi = { git = "https://github.com/calebschoepp/opentelemetry-wasi", rev = "60df119fbc03ed83d0e2cc1300f6a8eb055d23f7" } -spin-sdk = "3.1.0" +opentelemetry = "0.31.0" +opentelemetry_sdk = "0.31.0" +opentelemetry-wasi = { git = "https://github.com/calebschoepp/opentelemetry-wasi", rev = "3c2c38478e02a1a4d3bfb56c02cbc39daaccd0e4" } +spin-sdk = "5.1.1" wit-bindgen = "0.30.0" diff --git a/tests/test-components/components/wasi-otel-tracing/src/lib.rs b/tests/test-components/components/wasi-otel-tracing/src/lib.rs index c32c3123f0..f67ddaed18 100644 --- a/tests/test-components/components/wasi-otel-tracing/src/lib.rs +++ b/tests/test-components/components/wasi-otel-tracing/src/lib.rs @@ -27,7 +27,7 @@ fn handle(req: Request) -> anyhow::Result { fn setup_tracer(propagate_context: bool) -> (BoxedTracer, Option) { // Set up a tracer using the WASI processor - let wasi_processor = opentelemetry_wasi::WasiProcessor::new(); + let wasi_processor = opentelemetry_wasi::WasiSpanProcessor::new(); let tracer_provider = SdkTracerProvider::builder() .with_span_processor(wasi_processor) .build(); diff --git a/tests/testcases/otel-smoke-test/spin.toml b/tests/testcases/otel-smoke-test/spin.toml new file mode 100644 index 0000000000..bc143dd323 --- /dev/null +++ b/tests/testcases/otel-smoke-test/spin.toml @@ -0,0 +1,12 @@ +spin_version = "1" +authors = ["Spin Framework Contributors"] +description = "A simple application that returns hello and goodbye." +name = "head-rust-sdk-http" +trigger = { type = "http" } +version = "1.0.0" + +[[component]] +id = "hello" +source = "%{source=hello-world}" +[component.trigger] +route = "/hello/..." From b6a7ae090b5c5f814d3be465c111551ba62fb102 Mon Sep 17 00:00:00 2001 From: Andrew Steurer <94206073+asteurer@users.noreply.github.com> Date: Mon, 1 Dec 2025 19:10:58 +0000 Subject: [PATCH 15/18] fix(wasi-otel): partial fixes to integration tests Signed-off-by: Andrew Steurer <94206073+asteurer@users.noreply.github.com> --- tests/integration.rs | 90 ++++++++++++++++++- .../components/wasi-otel-tracing/src/lib.rs | 4 +- 2 files changed, 91 insertions(+), 3 deletions(-) diff --git a/tests/integration.rs b/tests/integration.rs index 36ad3c3174..8c69e4405a 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -1764,7 +1764,7 @@ mod otel_integration_tests { let spans = rt.block_on(collector.exported_spans(5, Duration::from_secs(5))); - assert_eq!(spans.len(), 5); + assert_eq!(spans.len(), 2); // They're all part of the same trace which implies context propagation is working assert!(spans @@ -2149,4 +2149,92 @@ mod otel_integration_tests { Ok(()) } + + #[test] + fn wasi_otel_start_called_end_not_called() -> anyhow::Result<()> { + let rt = tokio::runtime::Runtime::new()?; + let mut collector = rt + .block_on(FakeCollectorServer::start()) + .expect("fake collector server should start"); + let collector_endpoint = collector.endpoint().clone(); + + run_test_inited( + "wasi-otel-tracing", + SpinConfig { + binary_path: spin_binary(), + spin_up_args: Vec::new(), + app_type: SpinAppType::Http, + }, + ServicesConfig::none(), + |env| { + env.set_env_var("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", collector_endpoint); + env.set_env_var("OTEL_EXPORTER_OTLP_TRACES_PROTOCOL", "grpc"); + env.set_env_var("OTEL_BSP_SCHEDULE_DELAY", "5"); + Ok(()) + }, + move |env| { + let spin = env.runtime_mut(); + assert_spin_request( + spin, + Request::new(Method::Get, "/start-called-end-not-called"), + Response::new(200), + )?; + + let spans = rt.block_on(collector.exported_spans(7, Duration::from_secs(5))); + + assert!(spans + .iter() + .map(|s| s.trace_id.clone()) + .all(|t| t == spans[0].trace_id)); + + Ok(()) + }, + )?; + + Ok(()) + } + + #[test] + fn wasi_otel_child_span_outlives_parent() -> anyhow::Result<()> { + let rt = tokio::runtime::Runtime::new()?; + let mut collector = rt + .block_on(FakeCollectorServer::start()) + .expect("fake collector server should start"); + let collector_endpoint = collector.endpoint().clone(); + + run_test_inited( + "wasi-otel-tracing", + SpinConfig { + binary_path: spin_binary(), + spin_up_args: Vec::new(), + app_type: SpinAppType::Http, + }, + ServicesConfig::none(), + |env| { + env.set_env_var("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", collector_endpoint); + env.set_env_var("OTEL_EXPORTER_OTLP_TRACES_PROTOCOL", "grpc"); + env.set_env_var("OTEL_BSP_SCHEDULE_DELAY", "5"); + Ok(()) + }, + move |env| { + let spin = env.runtime_mut(); + assert_spin_request( + spin, + Request::new(Method::Get, "/child-span-outlives-parent"), + Response::new(200), + )?; + + let spans = rt.block_on(collector.exported_spans(7, Duration::from_secs(5))); + + assert!(spans + .iter() + .map(|s| s.trace_id.clone()) + .all(|t| t == spans[0].trace_id)); + + Ok(()) + }, + )?; + + Ok(()) + } } diff --git a/tests/test-components/components/wasi-otel-tracing/src/lib.rs b/tests/test-components/components/wasi-otel-tracing/src/lib.rs index f67ddaed18..dcc002b1cd 100644 --- a/tests/test-components/components/wasi-otel-tracing/src/lib.rs +++ b/tests/test-components/components/wasi-otel-tracing/src/lib.rs @@ -127,14 +127,14 @@ async fn make_request() { } fn start_called_end_not_called(_req: Request, _params: Params) -> Response { - let (tracer, _ctx) = setup_tracer(false); + let (tracer, _ctx) = setup_tracer(true); let _span = tracer.start("start_called_end_not_called"); // span.end() is not called... Response::new(200, "") } fn child_span_outlives_parent(_req: Request, _params: Params) -> Response { - let (tracer, _ctx) = setup_tracer(false); + let (tracer, _ctx) = setup_tracer(true); let child = { let parent = tracer.start("parent"); let parent_ctx = Context::current_with_span(parent); From aa7245945ddd31473f7375ccfe2af045a5499b47 Mon Sep 17 00:00:00 2001 From: Andrew Steurer <94206073+asteurer@users.noreply.github.com> Date: Tue, 16 Dec 2025 21:46:15 +0000 Subject: [PATCH 16/18] fix: rebasing on main Signed-off-by: Andrew Steurer <94206073+asteurer@users.noreply.github.com> --- Cargo.lock | 1413 +++++++++++------------------------ crates/wasi-otel/Cargo.toml | 4 +- crates/wasi-otel/src/lib.rs | 40 +- crates/world/Cargo.toml | 2 - 4 files changed, 443 insertions(+), 1016 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1b17309114..74b46d4a5b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,20 +8,7 @@ version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ -<<<<<<< HEAD - "gimli 0.31.1", -] - -[[package]] -name = "addr2line" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" -dependencies = [ - "gimli 0.32.3", -======= "gimli", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) ] [[package]] @@ -134,22 +121,22 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.10" +version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -231,9 +218,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.32" +version = "0.4.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a89bce6054c720275ac2432fbba080a66a2106a44a1b804553930ca6909f4e0" +checksum = "98ec5f6c2f8bc326c994cb9e241cc257ddaba9afa8555a43cffbb5dd86efaa37" dependencies = [ "compression-codecs", "compression-core", @@ -352,7 +339,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -419,7 +406,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -436,7 +423,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -482,9 +469,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-config" -version = "1.8.10" +version = "1.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1856b1b48b65f71a4dd940b1c0931f9a7b646d4a924b9828ffefc1454714668a" +checksum = "96571e6996817bf3d58f6b569e4b9fd2e9d2fcf9f7424eed07b2ce9bb87535e5" dependencies = [ "aws-credential-types", "aws-runtime", @@ -501,7 +488,7 @@ dependencies = [ "bytes", "fastrand 2.3.0", "hex", - "http 1.3.1", + "http 1.4.0", "ring", "time", "tokio", @@ -512,9 +499,9 @@ dependencies = [ [[package]] name = "aws-credential-types" -version = "1.2.8" +version = "1.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf26925f4a5b59eb76722b63c2892b1d70d06fa053c72e4a100ec308c1d47bc" +checksum = "3cd362783681b15d136480ad555a099e82ecd8e2d10a841e14dfd0078d67fee3" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", @@ -524,9 +511,9 @@ dependencies = [ [[package]] name = "aws-runtime" -version = "1.5.13" +version = "1.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f2402da1a5e16868ba98725e5d73f26b8116eaa892e56f2cd0bf5eec7985f70" +checksum = "d81b5b2898f6798ad58f484856768bca817e3cd9de0974c24ae0f1113fe88f1b" dependencies = [ "aws-credential-types", "aws-sigv4", @@ -548,9 +535,9 @@ dependencies = [ [[package]] name = "aws-sdk-dynamodb" -version = "1.97.0" +version = "1.101.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6034694d9f6b47ead8af47a1b79a85e185751d1171e9b983c4b3328bbff480c6" +checksum = "b6f98cd9e5f2fc790aff1f393bc3c8680deea31c05d3c6f23b625cdc50b1b6b4" dependencies = [ "aws-credential-types", "aws-runtime", @@ -570,9 +557,9 @@ dependencies = [ [[package]] name = "aws-sdk-sso" -version = "1.88.0" +version = "1.91.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05b276777560aa9a196dbba2e3aada4d8006d3d7eeb3ba7fe0c317227d933c4" +checksum = "8ee6402a36f27b52fe67661c6732d684b2635152b676aa2babbfb5204f99115d" dependencies = [ "aws-credential-types", "aws-runtime", @@ -592,9 +579,9 @@ dependencies = [ [[package]] name = "aws-sdk-ssooidc" -version = "1.90.0" +version = "1.93.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9be14d6d9cd761fac3fd234a0f47f7ed6c0df62d83c0eeb7012750e4732879b" +checksum = "a45a7f750bbd170ee3677671ad782d90b894548f4e4ae168302c57ec9de5cb3e" dependencies = [ "aws-credential-types", "aws-runtime", @@ -614,9 +601,9 @@ dependencies = [ [[package]] name = "aws-sdk-sts" -version = "1.90.0" +version = "1.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98a862d704c817d865c8740b62d8bbeb5adcb30965e93b471df8a5bcefa20a80" +checksum = "55542378e419558e6b1f398ca70adb0b2088077e79ad9f14eb09441f2f7b2164" dependencies = [ "aws-credential-types", "aws-runtime", @@ -637,9 +624,9 @@ dependencies = [ [[package]] name = "aws-sigv4" -version = "1.3.6" +version = "1.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c35452ec3f001e1f2f6db107b6373f1f48f05ec63ba2c5c9fa91f07dad32af11" +checksum = "69e523e1c4e8e7e8ff219d732988e22bfeae8a1cafdbe6d9eca1546fa080be7c" dependencies = [ "aws-credential-types", "aws-smithy-http", @@ -650,11 +637,7 @@ dependencies = [ "hex", "hmac", "http 0.2.12", - "http 1.3.1", -<<<<<<< HEAD - "once_cell", -======= ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) + "http 1.4.0", "percent-encoding", "sha2", "time", @@ -663,9 +646,9 @@ dependencies = [ [[package]] name = "aws-smithy-async" -version = "1.2.6" +version = "1.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "127fcfad33b7dfc531141fda7e1c402ac65f88aca5511a4d31e2e3d2cd01ce9c" +checksum = "9ee19095c7c4dda59f1697d028ce704c24b2d33c6718790c7f1d5a3015b4107c" dependencies = [ "futures-util", "pin-project-lite", @@ -674,9 +657,9 @@ dependencies = [ [[package]] name = "aws-smithy-http" -version = "0.62.5" +version = "0.62.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445d5d720c99eed0b4aa674ed00d835d9b1427dd73e04adaf2f94c6b2d6f9fca" +checksum = "826141069295752372f8203c17f28e30c464d22899a43a0c9fd9c458d469c88b" dependencies = [ "aws-smithy-runtime-api", "aws-smithy-types", @@ -685,7 +668,7 @@ dependencies = [ "futures-core", "futures-util", "http 0.2.12", - "http 1.3.1", + "http 1.4.0", "http-body 0.4.6", "percent-encoding", "pin-project-lite", @@ -695,9 +678,9 @@ dependencies = [ [[package]] name = "aws-smithy-http-client" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "623254723e8dfd535f566ee7b2381645f8981da086b5c4aa26c0c41582bb1d2c" +checksum = "59e62db736db19c488966c8d787f52e6270be565727236fd5579eaa301e7bc4a" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", @@ -710,33 +693,34 @@ dependencies = [ "hyper-rustls 0.24.2", "pin-project-lite", "rustls 0.21.12", + "rustls-native-certs 0.8.2", "tokio", "tracing", ] [[package]] name = "aws-smithy-json" -version = "0.61.7" +version = "0.61.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2db31f727935fc63c6eeae8b37b438847639ec330a9161ece694efba257e0c54" +checksum = "a6864c190cbb8e30cf4b77b2c8f3b6dfffa697a09b7218d2f7cd3d4c4065a9f7" dependencies = [ "aws-smithy-types", ] [[package]] name = "aws-smithy-observability" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d1881b1ea6d313f9890710d65c158bdab6fb08c91ea825f74c1c8c357baf4cc" +checksum = "17f616c3f2260612fe44cede278bafa18e73e6479c4e393e2c4518cf2a9a228a" dependencies = [ "aws-smithy-runtime-api", ] [[package]] name = "aws-smithy-query" -version = "0.60.8" +version = "0.60.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d28a63441360c477465f80c7abac3b9c4d075ca638f982e605b7dc2a2c7156c9" +checksum = "ae5d689cf437eae90460e944a58b5668530d433b4ff85789e69d2f2a556e057d" dependencies = [ "aws-smithy-types", "urlencoding", @@ -744,9 +728,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "1.9.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bbe9d018d646b96c7be063dd07987849862b0e6d07c778aad7d93d1be6c1ef0" +checksum = "a392db6c583ea4a912538afb86b7be7c5d8887d91604f50eb55c262ee1b4a5f5" dependencies = [ "aws-smithy-async", "aws-smithy-http", @@ -757,7 +741,7 @@ dependencies = [ "bytes", "fastrand 2.3.0", "http 0.2.12", - "http 1.3.1", + "http 1.4.0", "http-body 0.4.6", "http-body 1.0.1", "pin-project-lite", @@ -768,15 +752,15 @@ dependencies = [ [[package]] name = "aws-smithy-runtime-api" -version = "1.9.2" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7204f9fd94749a7c53b26da1b961b4ac36bf070ef1e0b94bb09f79d4f6c193" +checksum = "ab0d43d899f9e508300e587bf582ba54c27a452dd0a9ea294690669138ae14a2" dependencies = [ "aws-smithy-async", "aws-smithy-types", "bytes", "http 0.2.12", - "http 1.3.1", + "http 1.4.0", "pin-project-lite", "tokio", "tracing", @@ -785,16 +769,16 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "1.3.4" +version = "1.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25f535879a207fce0db74b679cfc3e91a3159c8144d717d55f5832aea9eef46e" +checksum = "905cb13a9895626d49cf2ced759b062d913834c7482c38e49557eac4e6193f01" dependencies = [ "base64-simd", "bytes", "bytes-utils", "futures-core", "http 0.2.12", - "http 1.3.1", + "http 1.4.0", "http-body 0.4.6", "http-body 1.0.1", "http-body-util", @@ -811,18 +795,18 @@ dependencies = [ [[package]] name = "aws-smithy-xml" -version = "0.60.12" +version = "0.60.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eab77cdd036b11056d2a30a7af7b775789fb024bf216acc13884c6c97752ae56" +checksum = "11b2f670422ff42bf7065031e72b45bc52a3508bd089f743ea90731ca2b6ea57" dependencies = [ "xmlparser", ] [[package]] name = "aws-types" -version = "1.3.10" +version = "1.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d79fb68e3d7fe5d4833ea34dc87d2e97d26d3086cb3da660bb6b1f76d98680b6" +checksum = "1d980627d2dd7bfc32a3c025685a033eeab8d365cc840c631ef59d1b8f428164" dependencies = [ "aws-credential-types", "aws-smithy-async", @@ -842,7 +826,7 @@ dependencies = [ "axum-core", "bytes", "futures-util", - "http 1.3.1", + "http 1.4.0", "http-body 1.0.1", "http-body-util", "itoa", @@ -868,7 +852,7 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http 1.3.1", + "http 1.4.0", "http-body 1.0.1", "http-body-util", "mime", @@ -895,7 +879,7 @@ dependencies = [ "paste", "pin-project", "rand 0.8.5", - "reqwest 0.12.24", + "reqwest 0.12.26", "rustc_version", "serde", "serde_json", @@ -923,7 +907,7 @@ dependencies = [ "paste", "pin-project", "rand 0.8.5", - "reqwest 0.12.24", + "reqwest 0.12.26", "rustc_version", "serde", "serde_json", @@ -1067,9 +1051,9 @@ dependencies = [ [[package]] name = "base64ct" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" +checksum = "0e050f626429857a27ddccb31e0aca21356bfa709c04041aefddac081a8f068a" [[package]] name = "beef" @@ -1196,9 +1180,9 @@ dependencies = [ [[package]] name = "borsh" -version = "1.5.7" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce" +checksum = "d1da5ab77c1437701eeff7c88d968729e7766172279eab0676857b3d63af7a6f" dependencies = [ "borsh-derive", "cfg_aliases", @@ -1206,15 +1190,15 @@ dependencies = [ [[package]] name = "borsh-derive" -version = "1.5.7" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3" +checksum = "0686c856aa6aac0c4498f936d7d6a02df690f614c03e4d906d1018062b5c5e2c" dependencies = [ "once_cell", "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -1285,7 +1269,7 @@ checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -1296,15 +1280,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -<<<<<<< HEAD version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" -======= -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "serde", ] @@ -1321,9 +1299,9 @@ dependencies = [ [[package]] name = "camino" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" dependencies = [ "serde_core", ] @@ -1529,9 +1507,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a969e13a7589e9e3e4207e153bae624ade2b5622fb4684a4923b23ec3d57719" dependencies = [ "serde", -<<<<<<< HEAD - "toml 0.8.19", -======= "toml 0.8.23", ] @@ -1542,7 +1517,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" dependencies = [ "rustversion", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) ] [[package]] @@ -1556,9 +1530,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.44" +version = "1.2.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37521ac7aabe3d13122dc382493e20c9416f299d2ccd5b3a5340a2570cdeb0f3" +checksum = "90583009037521a116abf44494efecd645ba48b6622457080f080b85544e2215" dependencies = [ "find-msvc-tools", "jobserver", @@ -1621,9 +1595,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.51" +version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5" +checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" dependencies = [ "clap_builder", "clap_derive 4.5.49", @@ -1631,9 +1605,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.51" +version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a" +checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" dependencies = [ "anstream", "anstyle", @@ -1663,7 +1637,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -1696,9 +1670,9 @@ dependencies = [ [[package]] name = "cmake" -version = "0.1.54" +version = "0.1.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" +checksum = "b042e5d8a74ae91bb0961acd039822472ec99f8ab0948cbf6d1369588f8be586" dependencies = [ "cc", ] @@ -1772,9 +1746,9 @@ dependencies = [ [[package]] name = "compression-codecs" -version = "0.4.31" +version = "0.4.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef8a506ec4b81c460798f572caead636d57d3d7e940f998160f52bd254bf2d23" +checksum = "b0f7ac3e5b97fdce45e8922fb05cae2c37f7bbd63d30dd94821dacfd8f3f2bf2" dependencies = [ "compression-core", "flate2", @@ -1783,9 +1757,9 @@ dependencies = [ [[package]] name = "compression-core" -version = "0.4.29" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e47641d3deaf41fb1538ac1f54735925e275eaf3bf4d55c81b137fba797e5cbb" +checksum = "75984efb6ed102a0d42db99afb6c1948f0380d1d91808d5529916e6c08b49d8d" [[package]] name = "concurrent-queue" @@ -1811,11 +1785,7 @@ dependencies = [ "rust-ini", "serde", "serde_json", -<<<<<<< HEAD - "toml 0.8.19", -======= "toml 0.8.23", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "yaml-rust2", ] @@ -1838,7 +1808,7 @@ dependencies = [ "flate2", "json5", "libtest-mimic", - "reqwest 0.12.24", + "reqwest 0.12.26", "serde", "tar", "test-environment", @@ -1955,60 +1925,36 @@ dependencies = [ [[package]] name = "cranelift-assembler-x64" -<<<<<<< HEAD version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30054f4aef4d614d37f27d5b77e36e165f0b27a71563be348e7c9fcfac41eed8" -======= -version = "0.124.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e2df3d5caad11e71bb0b70115a5210c3af4a0bcb2893f78ee9311b1b266b05" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "cranelift-assembler-x64-meta", ] [[package]] name = "cranelift-assembler-x64-meta" -<<<<<<< HEAD version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0beab56413879d4f515e08bcf118b1cb85f294129bb117057f573d37bfbb925a" -======= -version = "0.124.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b63e87985fc9166a2541b05fd5f913a398cff9aec6b13ebca865253cdee15806" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "cranelift-srcgen", ] [[package]] name = "cranelift-bforest" -<<<<<<< HEAD version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d054747549a69b264d5299c8ca1b0dd45dc6bd0ee43f1edfcc42a8b12952c7a" -======= -version = "0.124.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b5364dfe182d4b89af2f4bd0dafc8f6c590bbf0216ee8ce60bfd8893c3d14a6" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-bitset" -<<<<<<< HEAD version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98b92d481b77a7dc9d07c96e24a16f29e0c9c27d042828fdf7e49e54ee9819bf" -======= -version = "0.124.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3067ca8c10796434497a5faac73d949b5ac0008ed572013debe88694bfef426e" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "serde", "serde_derive", @@ -2016,15 +1962,9 @@ dependencies = [ [[package]] name = "cranelift-codegen" -<<<<<<< HEAD version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6eeccfc043d599b0ef1806942707fc51cdd1c3965c343956dc975a55d82a920f" -======= -version = "0.124.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eb420cc46d7f0956e2e3d9e6389036c612ada3542a29edc6f5deedf86d568ba" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "bumpalo", "cranelift-assembler-x64", @@ -2035,13 +1975,8 @@ dependencies = [ "cranelift-control", "cranelift-entity", "cranelift-isle", -<<<<<<< HEAD - "gimli 0.32.3", - "hashbrown 0.15.2", -======= "gimli", "hashbrown 0.15.5", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "log", "pulley-interpreter", "regalloc2", @@ -2054,15 +1989,9 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -<<<<<<< HEAD version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1174cdb9d9d43b2bdaa612a07ed82af13db9b95526bc2c286c2aec4689bcc038" -======= -version = "0.124.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "440d31dd36e477fb6292821b593da65df60328bca1046ea5881f424aa5a44b5d" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "cranelift-assembler-x64-meta", "cranelift-codegen-shared", @@ -2073,7 +2002,6 @@ dependencies = [ [[package]] name = "cranelift-codegen-shared" -<<<<<<< HEAD version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d572be73fae802eb115f45e7e67a9ed16acb4ee683b67c4086768786545419a" @@ -2083,32 +2011,15 @@ name = "cranelift-control" version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1587465cc84c5cc793b44add928771945f3132bbf6b3621ee9473c631a87156" -======= -version = "0.124.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0b342ef4835787577f6e7553747cdd902797509eb5af733cd89e5ce97cea0f0" - -[[package]] -name = "cranelift-control" -version = "0.124.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b34de54534b61c3f3e475558cf19c90b2a7a758c7018e557e5d1a47b9a1fbb03" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "arbitrary", ] [[package]] name = "cranelift-entity" -<<<<<<< HEAD version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "063b83448b1343e79282c3c7cbda7ed5f0816f0b763a4c15f7cecb0a17d87ea6" -======= -version = "0.124.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d7bf1aae1800d053aa965381dcb01054404d0bcd8ea5ffe65bb855b8e3f654" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "cranelift-bitset", "serde", @@ -2117,15 +2028,9 @@ dependencies = [ [[package]] name = "cranelift-frontend" -<<<<<<< HEAD version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa4461c2d2ca48bc72883f5f5c3129d9aefac832df1db824af9db8db3efee109" -======= -version = "0.124.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36158c03d70e1f443cc2d6d9adc838fc0a031b166f3861534e9cb77742380e2a" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "cranelift-codegen", "log", @@ -2135,7 +2040,6 @@ dependencies = [ [[package]] name = "cranelift-isle" -<<<<<<< HEAD version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acd811b25e18f14810d09c504e06098acc1d9dbfa24879bf0d6b6fb44415fc66" @@ -2145,17 +2049,6 @@ name = "cranelift-native" version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2417046989d8d6367a55bbab2e406a9195d176f4779be4aa484d645887217d37" -======= -version = "0.124.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fa194bbc189c965454f3a94c1acb6c89d63d5d0b183e60edc17db758bfbe519" - -[[package]] -name = "cranelift-native" -version = "0.124.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c469bb98ffe9f38a1a5ada0427ab096f0f1b9a22a30149fc705205c56cf8985" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "cranelift-codegen", "libc", @@ -2164,15 +2057,9 @@ dependencies = [ [[package]] name = "cranelift-srcgen" -<<<<<<< HEAD version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d039de901c8d928222b8128e1b9a9ab27b82a7445cb749a871c75d9cb25c57d" -======= -version = "0.124.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12d694cd4c6b28fb8a4d0cf5b58d532b6b3b6e4afb2b65603e2ab8dc35bf18bd" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) [[package]] name = "crc32fast" @@ -2282,9 +2169,9 @@ dependencies = [ [[package]] name = "crypto-common" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", "typenum", @@ -2366,7 +2253,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -2380,7 +2267,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -2402,7 +2289,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core 0.20.11", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -2413,7 +2300,7 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core 0.21.3", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -2427,9 +2314,9 @@ dependencies = [ [[package]] name = "dbus" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190b6255e8ab55a7b568df5a883e9497edc3e4821c06396612048b430e5ad1e9" +checksum = "21b3aa68d7e7abee336255bd7248ea965cc393f3e70411135a6f6a4b651345d4" dependencies = [ "libc", "libdbus-sys", @@ -2527,7 +2414,7 @@ checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -2569,7 +2456,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -2589,7 +2476,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core 0.20.2", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -2680,11 +2567,7 @@ checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" dependencies = [ "libc", "option-ext", -<<<<<<< HEAD - "redox_users 0.5.0", -======= "redox_users 0.5.2", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "windows-sys 0.61.2", ] @@ -2719,7 +2602,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -2891,9 +2774,9 @@ dependencies = [ [[package]] name = "endi" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" [[package]] name = "endian-type" @@ -2910,7 +2793,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -2931,7 +2814,7 @@ checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -3045,7 +2928,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -3166,9 +3049,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" [[package]] name = "fixedbitset" @@ -3236,7 +3119,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -3395,7 +3278,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -3681,9 +3564,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.9" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -3737,26 +3620,17 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] name = "gimli" version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -<<<<<<< HEAD -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - -[[package]] -name = "gimli" -version = "0.32.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -======= ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" dependencies = [ "fallible-iterator 0.3.0", - "indexmap 2.12.0", + "indexmap 2.12.1", "stable_deref_trait", ] @@ -3918,14 +3792,13 @@ dependencies = [ [[package]] name = "gix-path" -version = "0.10.21" +version = "0.10.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0416b41cd00ff292af9b94b0660880c44bd2ed66828ddca9a2b333535cbb71b8" +checksum = "7cb06c3e4f8eed6e24fd915fa93145e28a511f4ea0e768bae16673e05ed3f366" dependencies = [ "bstr", "gix-trace", "gix-validate", - "home", "thiserror 2.0.17", ] @@ -4055,7 +3928,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.12.0", + "indexmap 2.12.1", "slab", "tokio", "tokio-util", @@ -4073,8 +3946,8 @@ dependencies = [ "fnv", "futures-core", "futures-sink", - "http 1.3.1", - "indexmap 2.12.0", + "http 1.4.0", + "indexmap 2.12.1", "slab", "tokio", "tokio-util", @@ -4138,9 +4011,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" [[package]] name = "hashlink" @@ -4252,12 +4125,11 @@ dependencies = [ [[package]] name = "http" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ "bytes", - "fnv", "itoa", ] @@ -4288,7 +4160,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.3.1", + "http 1.4.0", ] [[package]] @@ -4299,7 +4171,7 @@ checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", "futures-core", - "http 1.3.1", + "http 1.4.0", "http-body 1.0.1", "pin-project-lite", ] @@ -4368,26 +4240,16 @@ dependencies = [ [[package]] name = "hyper" -<<<<<<< HEAD version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" -======= -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "atomic-waker", "bytes", "futures-channel", "futures-core", -<<<<<<< HEAD - "h2 0.4.6", -======= "h2 0.4.12", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) - "http 1.3.1", + "http 1.4.0", "http-body 1.0.1", "httparse", "httpdate", @@ -4410,7 +4272,6 @@ dependencies = [ "hyper 0.14.32", "log", "rustls 0.21.12", - "rustls-native-certs 0.6.3", "tokio", "tokio-rustls 0.24.1", ] @@ -4439,16 +4300,10 @@ version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ -<<<<<<< HEAD - "futures-util", - "http 1.3.1", + "http 1.4.0", "hyper 1.8.1", -======= - "http 1.3.1", - "hyper 1.7.0", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "hyper-util", - "rustls 0.23.34", + "rustls 0.23.35", "rustls-pki-types", "tokio", "tokio-rustls 0.26.4", @@ -4462,11 +4317,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ -<<<<<<< HEAD "hyper 1.8.1", -======= - "hyper 1.7.0", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "hyper-util", "pin-project-lite", "tokio", @@ -4494,11 +4345,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", -<<<<<<< HEAD "hyper 1.8.1", -======= - "hyper 1.7.0", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "hyper-util", "native-tls", "tokio", @@ -4508,25 +4355,21 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.17" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" +checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" dependencies = [ "base64 0.22.1", "bytes", "futures-channel", "futures-core", "futures-util", - "http 1.3.1", + "http 1.4.0", "http-body 1.0.1", -<<<<<<< HEAD "hyper 1.8.1", -======= - "hyper 1.7.0", "ipnet", "libc", "percent-encoding", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "pin-project-lite", "socket2 0.6.1", "system-configuration 0.6.1", @@ -4608,9 +4451,9 @@ checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" dependencies = [ "icu_collections", "icu_locale_core", @@ -4622,9 +4465,9 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" [[package]] name = "icu_provider" @@ -4736,12 +4579,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.12.0" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" dependencies = [ "equivalent", - "hashbrown 0.16.0", + "hashbrown 0.16.1", "serde", "serde_core", ] @@ -4850,9 +4693,9 @@ checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "iri-string" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" dependencies = [ "memchr", "serde", @@ -4930,35 +4773,35 @@ dependencies = [ [[package]] name = "jiff" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be1f93b8b1eb69c77f24bbb0afdf66f54b632ee39af40ca21c4365a1d7347e49" +checksum = "49cce2b81f2098e7e3efc35bc2e0a6b7abec9d34128283d7a26fa8f32a6dbb35" dependencies = [ "jiff-static", "jiff-tzdb-platform", "log", "portable-atomic", "portable-atomic-util", - "serde", - "windows-sys 0.59.0", + "serde_core", + "windows-sys 0.61.2", ] [[package]] name = "jiff-static" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" +checksum = "980af8b43c3ad5d8d349ace167ec8170839f753a42d233ba19e08afe1850fa69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] name = "jiff-tzdb" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1283705eb0a21404d2bfd6eef2a7593d240bc42a0bdb39db0ad6fa2ec026524" +checksum = "68971ebff725b9e2ca27a601c5eb38a4c5d64422c4cbab0c535f248087eda5c2" [[package]] name = "jiff-tzdb-platform" @@ -4981,9 +4824,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.82" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" +checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" dependencies = [ "once_cell", "wasm-bindgen", @@ -5035,7 +4878,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ee7893dab2e44ae5f9d0173f26ff4aa327c10b01b06a72b52dd9405b628640d" dependencies = [ - "indexmap 2.12.0", + "indexmap 2.12.1", ] [[package]] @@ -5127,15 +4970,15 @@ checksum = "db13adb97ab515a3691f56e4dbab09283d0b86cb45abd991d8634a9d6f501760" [[package]] name = "libc" -version = "0.2.177" +version = "0.2.178" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" +checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" [[package]] name = "libdbus-sys" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cbe856efeb50e4681f010e9aaa2bf0a644e10139e54cde10fc83a307c23bd9f" +checksum = "328c4789d42200f1eeec05bd86c9c13c7f091d2ba9a6ea35acdf51f31bc0f043" dependencies = [ "pkg-config", ] @@ -5178,13 +5021,13 @@ checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libredox" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +checksum = "df15f6eac291ed1cf25865b1ee60399f57e7c227e7f51bdbd4c5270396a9ed50" dependencies = [ "bitflags 2.10.0", "libc", - "redox_syscall", + "redox_syscall 0.6.0", ] [[package]] @@ -5235,7 +5078,7 @@ dependencies = [ "bitflags 2.10.0", "cc", "fallible-iterator 0.3.0", - "indexmap 2.12.0", + "indexmap 2.12.1", "log", "memchr", "phf 0.11.3", @@ -5261,7 +5104,7 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc0bda45ed5b3a2904262c1bb91e526127aa70e7ef3758aba2ef93cf896b9b58" dependencies = [ - "clap 4.5.51", + "clap 4.5.53", "escape8259", "termcolor", "threadpool", @@ -5326,7 +5169,7 @@ checksum = "de66c928222984aea59fcaed8ba627f388aaac3c1f57dcb05cc25495ef8faefe" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -5366,15 +5209,12 @@ dependencies = [ [[package]] name = "log" -version = "0.4.28" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" -<<<<<<< HEAD -======= +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" dependencies = [ "value-bag", ] ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) [[package]] name = "logos" @@ -5397,7 +5237,7 @@ dependencies = [ "proc-macro2", "quote", "regex-syntax", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -5572,7 +5412,7 @@ checksum = "db5b29714e950dbb20d5e6f74f9dcec4edbcc1067bb7f8ed198c097b8c1a818b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -5599,9 +5439,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" dependencies = [ "libc", "log", @@ -5646,7 +5486,7 @@ checksum = "e4db6d5580af57bf992f59068d4ea26fd518574ff48d7639b255a36f9de6e7e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -5953,7 +5793,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -6032,7 +5872,7 @@ checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" dependencies = [ "crc32fast", "hashbrown 0.15.5", - "indexmap 2.12.0", + "indexmap 2.12.1", "memchr", ] @@ -6045,14 +5885,14 @@ dependencies = [ "bytes", "chrono", "futures-util", - "http 1.3.1", + "http 1.4.0", "http-auth", "jwt 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.5.0", "oci-spec", "olpc-cjson", "regex", - "reqwest 0.12.24", + "reqwest 0.12.26", "serde", "serde_json", "sha2", @@ -6070,13 +5910,13 @@ dependencies = [ "bytes", "chrono", "futures-util", - "http 1.3.1", + "http 1.4.0", "http-auth", "jwt 0.16.0 (git+https://github.com/vdice/rust-jwt?rev=c5b596d28a39dd428350b445d5c5829ba6352f02)", "lazy_static 1.5.0", "olpc-cjson", "regex", - "reqwest 0.12.24", + "reqwest 0.12.26", "serde", "serde_json", "sha2", @@ -6094,13 +5934,13 @@ dependencies = [ "bytes", "chrono", "futures-util", - "http 1.3.1", + "http 1.4.0", "http-auth", "jwt 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.5.0", "olpc-cjson", "regex", - "reqwest 0.12.24", + "reqwest 0.12.26", "serde", "serde_json", "sha2", @@ -6190,9 +6030,9 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.74" +version = "0.10.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24ad14dd45412269e1a30f52ad8f0664f0f4f4a89ee8fe28c3b3527021ebb654" +checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" dependencies = [ "bitflags 2.10.0", "cfg-if", @@ -6211,7 +6051,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -6222,9 +6062,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.110" +version = "0.9.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a9f0075ba3c21b09f8e8b2026584b1d18d49388648f2fbbf3c97ea8deced8e2" +checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" dependencies = [ "cc", "libc", @@ -6266,9 +6106,9 @@ checksum = "a8863faf2910030d139fb48715ad5ff2f35029fc5f244f6d5f689ddcf4d26253" dependencies = [ "async-trait", "bytes", - "http 1.3.1", + "http 1.4.0", "opentelemetry", - "reqwest 0.12.24", + "reqwest 0.12.26", "tracing", ] @@ -6280,13 +6120,13 @@ checksum = "5bef114c6d41bea83d6dc60eb41720eedd0261a67af57b66dd2b84ac46c01d91" dependencies = [ "async-trait", "futures-core", - "http 1.3.1", + "http 1.4.0", "opentelemetry", "opentelemetry-http", "opentelemetry-proto", "opentelemetry_sdk", "prost 0.13.5", - "reqwest 0.12.24", + "reqwest 0.12.26", "thiserror 2.0.17", "tokio", "tonic", @@ -6409,7 +6249,7 @@ checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.18", "smallvec", "windows-link 0.2.1", ] @@ -6508,9 +6348,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.8.3" +version = "2.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989e7521a040efde50c3ab6bbadafbe15ab6dc042686926be59ac35d74607df4" +checksum = "cbcfd20a6d4eeba40179f05735784ad32bdaef05ce8e8af05f180d45bb3e7e22" dependencies = [ "memchr", "ucd-trie", @@ -6518,9 +6358,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.8.3" +version = "2.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "187da9a3030dbafabbbfb20cb323b976dc7b7ce91fcd84f2f74d6e31d378e2de" +checksum = "51f72981ade67b1ca6adc26ec221be9f463f2b5839c7508998daa17c23d94d7f" dependencies = [ "pest", "pest_generator", @@ -6528,22 +6368,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.8.3" +version = "2.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b401d98f5757ebe97a26085998d6c0eecec4995cad6ab7fc30ffdf4b052843" +checksum = "dee9efd8cdb50d719a80088b76f81aec7c41ed6d522ee750178f83883d271625" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] name = "pest_meta" -version = "2.8.3" +version = "2.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f27a2cfee9f9039c4d86faa5af122a0ac3851441a34865b8a043b46be0065a" +checksum = "bf1d70880e76bdc13ba52eafa6239ce793d85c8e43896507e43dd8984ff05b82" dependencies = [ "pest", "sha2", @@ -6556,7 +6396,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.12.0", + "indexmap 2.12.1", ] [[package]] @@ -6634,7 +6474,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -6813,7 +6653,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -6831,7 +6671,7 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ - "toml_edit 0.23.7", + "toml_edit 0.23.9", ] [[package]] @@ -6877,7 +6717,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -6896,7 +6736,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3ef4f2f0422f23a82ec9f628ea2acd12871c81a9362b02c43c1aa86acfc3ba1" dependencies = [ "futures", - "indexmap 2.12.0", + "indexmap 2.12.1", "nix 0.30.1", "tokio", "tracing", @@ -6961,7 +6801,7 @@ dependencies = [ "prost 0.12.6", "prost-types", "regex", - "syn 2.0.108", + "syn 2.0.111", "tempfile", ] @@ -6975,7 +6815,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -6988,7 +6828,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -7077,15 +6917,9 @@ dependencies = [ [[package]] name = "pulley-interpreter" -<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a09eb45f768f3a0396e85822790d867000c8b5f11551e7268c279e991457b16" -======= -version = "37.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cff3cc2c3a933419d4989b9dcdee724ebc9ee4cdc1f175dbaeef71d3b963336" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "cranelift-bitset", "log", @@ -7095,19 +6929,13 @@ dependencies = [ [[package]] name = "pulley-macros" -<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e29368432b8b7a8a343b75a6914621fad905c95d5c5297449a6546c127224f7a" -======= -version = "37.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56fca4a86a359a71f35f188de13bdfa9dc5b56a36d236fa98cb0db601ef4d21" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -7148,7 +6976,7 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.34", + "rustls 0.23.35", "socket2 0.6.1", "thiserror 2.0.17", "tokio", @@ -7168,7 +6996,7 @@ dependencies = [ "rand 0.9.2", "ring", "rustc-hash", - "rustls 0.23.34", + "rustls 0.23.35", "rustls-pki-types", "slab", "thiserror 2.0.17", @@ -7193,9 +7021,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.41" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] @@ -7432,6 +7260,15 @@ dependencies = [ "bitflags 2.10.0", ] +[[package]] +name = "redox_syscall" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec96166dafa0886eb81fe1c0a388bece180fbef2135f97c1e2cf8302e74b43b5" +dependencies = [ + "bitflags 2.10.0", +] + [[package]] name = "redox_users" version = "0.4.6" @@ -7455,12 +7292,6 @@ dependencies = [ ] [[package]] -<<<<<<< HEAD -name = "regalloc2" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e249c660440317032a71ddac302f25f1d5dff387667bcc3978d1f77aa31ac34" -======= name = "ref-cast" version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -7477,15 +7308,14 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] name = "regalloc2" -version = "0.13.2" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd8138ce7c3d7c13be4f61893154b5d711bd798d2d7be3ecb8dcc7e7a06ca98" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) +checksum = "4e249c660440317032a71ddac302f25f1d5dff387667bcc3978d1f77aa31ac34" dependencies = [ "allocator-api2", "bumpalo", @@ -7583,32 +7413,22 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.24" +version = "0.12.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" +checksum = "3b4c14b2d9afca6a60277086b0cc6a6ae0b568f6f7916c943a8cdc79f8be240f" dependencies = [ - "async-compression", "base64 0.22.1", "bytes", "encoding_rs", "futures-channel", "futures-core", "futures-util", -<<<<<<< HEAD - "h2 0.4.6", - "http 1.3.1", - "http-body 1.0.1", - "http-body-util", - "hyper 1.8.1", - "hyper-rustls 0.27.3", -======= "h2 0.4.12", - "http 1.3.1", + "http 1.4.0", "http-body 1.0.1", "http-body-util", - "hyper 1.7.0", + "hyper 1.8.1", "hyper-rustls 0.27.7", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "hyper-tls 0.6.0", "hyper-util", "js-sys", @@ -7618,7 +7438,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.34", + "rustls 0.23.35", "rustls-pki-types", "serde", "serde_json", @@ -7843,12 +7663,8 @@ dependencies = [ "anyhow", "async-trait", "bytes", - "http 1.3.1", -<<<<<<< HEAD - "reqwest 0.12.9", -======= - "reqwest 0.12.24", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) + "http 1.4.0", + "reqwest 0.12.26", "rustify_derive", "serde", "serde_json", @@ -7936,9 +7752,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.34" +version = "0.23.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a9586e9ee2b4f8fab52a0048ca7334d7024eef48e2cb9407e3497bb7cab7fa7" +checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" dependencies = [ "log", "once_cell", @@ -7951,27 +7767,27 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.6.3" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" dependencies = [ "openssl-probe", - "rustls-pemfile 1.0.4", + "rustls-pemfile 2.2.0", + "rustls-pki-types", "schannel", "security-framework 2.11.1", ] [[package]] name = "rustls-native-certs" -version = "0.7.3" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" +checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923" dependencies = [ "openssl-probe", - "rustls-pemfile 2.2.0", "rustls-pki-types", "schannel", - "security-framework 2.11.1", + "security-framework 3.5.1", ] [[package]] @@ -7994,9 +7810,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" +checksum = "708c0f9d5f54ba0272468c1d306a52c495b31fa155e91bc25371e6df7996908c" dependencies = [ "web-time", "zeroize", @@ -8107,7 +7923,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" dependencies = [ "dyn-clone", - "indexmap 2.12.0", + "indexmap 2.12.1", "schemars_derive", "semver", "serde", @@ -8128,9 +7944,9 @@ dependencies = [ [[package]] name = "schemars" -version = "1.0.5" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1317c3bf3e7df961da95b0a56a172a02abead31276215a0497241a7624b487ce" +checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289" dependencies = [ "dyn-clone", "ref-cast", @@ -8147,7 +7963,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -8304,7 +8120,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -8315,7 +8131,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -8380,7 +8196,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -8415,17 +8231,17 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.15.1" +version = "3.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa66c845eee442168b2c8134fec70ac50dc20e760769c8ba0ad1319ca1959b04" +checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.12.0", + "indexmap 2.12.1", "schemars 0.9.0", - "schemars 1.0.5", + "schemars 1.1.0", "serde_core", "serde_json", "serde_with_macros", @@ -8434,14 +8250,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.15.1" +version = "3.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91a903660542fced4e99881aa481bdbaec1634568ee02e0b8bd57c64cb38955" +checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" dependencies = [ "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -8450,7 +8266,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.12.0", + "indexmap 2.12.1", "itoa", "ryu", "serde", @@ -8519,9 +8335,9 @@ dependencies = [ [[package]] name = "shell-words" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" +checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77" [[package]] name = "shlex" @@ -8531,9 +8347,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.6" +version = "1.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" dependencies = [ "libc", ] @@ -8550,9 +8366,9 @@ dependencies = [ [[package]] name = "simd-adler32" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" [[package]] name = "simdutf8" @@ -8687,11 +8503,7 @@ dependencies = [ "spin-factors-test", "spin-locked-app", "tokio", -<<<<<<< HEAD - "toml 0.8.19", -======= "toml 0.8.23", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) ] [[package]] @@ -8707,11 +8519,7 @@ dependencies = [ "subprocess", "terminal", "tokio", -<<<<<<< HEAD - "toml 0.8.19", -======= "toml 0.8.23", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "topological-sort", "tracing", ] @@ -8735,13 +8543,9 @@ dependencies = [ "fake-opentelemetry-collector", "futures", "hex", - "http 1.3.1", + "http 1.4.0", "http-body-util", -<<<<<<< HEAD "hyper 1.8.1", -======= - "hyper 1.7.0", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "hyper-util", "indicatif", "itertools 0.14.0", @@ -8751,10 +8555,10 @@ dependencies = [ "openssl", "path-absolutize", "pretty_assertions", - "rand 0.9.1", + "rand 0.9.2", "redis", "regex", - "reqwest 0.12.24", + "reqwest 0.12.26", "rpassword", "runtime-tests", "schemars 0.8.22", @@ -8788,11 +8592,7 @@ dependencies = [ "test-environment", "testing-framework", "tokio", -<<<<<<< HEAD - "toml 0.8.19", -======= "toml 0.8.23", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "tracing", "url", "uuid", @@ -8828,11 +8628,7 @@ dependencies = [ "serde_json", "tempfile", "tokio", -<<<<<<< HEAD - "toml 0.8.19", -======= "toml 0.8.23", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "tracing", "wasm-encoder 0.240.0", "wasm-metadata 0.240.0", @@ -8850,7 +8646,7 @@ version = "3.6.0-pre0" dependencies = [ "anyhow", "async-trait", - "indexmap 2.12.0", + "indexmap 2.12.1", "semver", "spin-app", "spin-common", @@ -8886,7 +8682,7 @@ dependencies = [ "anyhow", "async-trait", "glob", - "reqwest 0.12.24", + "reqwest 0.12.26", "serde", "similar", "spin-common", @@ -8894,13 +8690,8 @@ dependencies = [ "tempfile", "terminal", "tokio", -<<<<<<< HEAD - "toml 0.8.19", - "toml_edit", -======= "toml 0.8.23", "toml_edit 0.22.27", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "tracing", "ui-testing", ] @@ -8916,7 +8707,7 @@ dependencies = [ "futures", "futures-util", "id-arena", - "indexmap 2.12.0", + "indexmap 2.12.1", "oci-distribution 0.11.0 (git+https://github.com/fermyon/oci-distribution?rev=7e4ce9be9bcd22e78a28f06204931f10c44402ba)", "semver", "serde", @@ -8928,11 +8719,7 @@ dependencies = [ "spin-manifest", "spin-serde", "tokio", -<<<<<<< HEAD - "toml 0.8.19", -======= "toml 0.8.23", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "tracing", "wac-graph", "wac-types", @@ -8953,11 +8740,7 @@ dependencies = [ "spin-locked-app", "thiserror 2.0.17", "tokio", -<<<<<<< HEAD - "toml 0.8.19", -======= "toml 0.8.23", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) ] [[package]] @@ -8979,11 +8762,7 @@ dependencies = [ "tempfile", "thiserror 2.0.17", "tokio", -<<<<<<< HEAD - "toml 0.8.19", -======= "toml 0.8.23", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "tracing", ] @@ -9003,11 +8782,7 @@ dependencies = [ "spin-telemetry", "spin-world", "tokio", -<<<<<<< HEAD - "toml 0.8.19", -======= "toml 0.8.23", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "tracing", "url", ] @@ -9017,7 +8792,7 @@ name = "spin-factor-otel" version = "3.6.0-pre0" dependencies = [ "anyhow", - "indexmap 2.12.0", + "indexmap 2.12.1", "opentelemetry", "opentelemetry-otlp", "opentelemetry_sdk", @@ -9037,18 +8812,14 @@ version = "3.6.0-pre0" dependencies = [ "anyhow", "bytes", - "http 1.3.1", + "http 1.4.0", "http-body 1.0.1", "http-body-util", -<<<<<<< HEAD "hyper 1.8.1", -======= - "hyper 1.7.0", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "hyper-util", "pin-project-lite", - "reqwest 0.12.24", - "rustls 0.23.34", + "reqwest 0.12.26", + "rustls 0.23.35", "serde", "spin-common", "spin-factor-otel", @@ -9110,9 +8881,9 @@ version = "3.6.0-pre0" dependencies = [ "anyhow", "futures-util", - "http 1.3.1", + "http 1.4.0", "ip_network", - "rustls 0.23.34", + "rustls 0.23.35", "rustls-pki-types", "serde", "spin-factor-variables", @@ -9125,11 +8896,7 @@ dependencies = [ "spin-serde", "tempfile", "tokio", -<<<<<<< HEAD - "toml 0.8.19", -======= "toml 0.8.23", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "tracing", "url", "wasmtime-wasi", @@ -9234,11 +9001,7 @@ dependencies = [ "spin-app", "spin-factors-derive", "thiserror 2.0.17", -<<<<<<< HEAD - "toml 0.8.19", -======= "toml 0.8.23", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "wasmtime", ] @@ -9249,7 +9012,7 @@ dependencies = [ "expander", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -9274,11 +9037,7 @@ dependencies = [ "spin-loader", "spin-telemetry", "tempfile", -<<<<<<< HEAD - "toml 0.8.19", -======= "toml 0.8.23", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) ] [[package]] @@ -9286,14 +9045,10 @@ name = "spin-http" version = "3.6.0-pre0" dependencies = [ "anyhow", - "http 1.3.1", + "http 1.4.0", "http-body-util", -<<<<<<< HEAD "hyper 1.8.1", -======= - "hyper 1.7.0", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) - "indexmap 2.12.0", + "indexmap 2.12.1", "percent-encoding", "routefinder", "serde", @@ -9301,11 +9056,7 @@ dependencies = [ "spin-factor-outbound-http", "spin-http-routes", "terminal", -<<<<<<< HEAD - "toml 0.8.19", -======= "toml 0.8.23", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "tracing", "wasmtime", "wasmtime-wasi", @@ -9317,7 +9068,7 @@ name = "spin-http-routes" version = "3.6.0-pre0" dependencies = [ "anyhow", - "indexmap 2.12.0", + "indexmap 2.12.1", "percent-encoding", "routefinder", "serde", @@ -9348,7 +9099,7 @@ dependencies = [ "azure_data_cosmos", "azure_identity 0.21.0", "futures", - "reqwest 0.12.24", + "reqwest 0.12.26", "serde", "spin-factor-key-value", ] @@ -9404,7 +9155,7 @@ name = "spin-llm-remote-http" version = "3.6.0-pre0" dependencies = [ "anyhow", - "reqwest 0.12.24", + "reqwest 0.12.26", "serde", "serde_json", "spin-telemetry", @@ -9421,7 +9172,7 @@ dependencies = [ "futures", "glob", "path-absolutize", - "reqwest 0.12.24", + "reqwest 0.12.26", "semver", "serde", "serde_json", @@ -9435,11 +9186,7 @@ dependencies = [ "tempfile", "terminal", "tokio", -<<<<<<< HEAD - "toml 0.8.19", -======= "toml 0.8.23", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "tracing", "ui-testing", "wasm-pkg-client", @@ -9464,7 +9211,7 @@ version = "3.6.0-pre0" dependencies = [ "anyhow", "glob", - "indexmap 2.12.0", + "indexmap 2.12.1", "schemars 0.8.22", "semver", "serde", @@ -9472,11 +9219,7 @@ dependencies = [ "spin-serde", "terminal", "thiserror 2.0.17", -<<<<<<< HEAD - "toml 0.8.19", -======= "toml 0.8.23", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "ui-testing", "url", "wasm-pkg-common", @@ -9497,7 +9240,7 @@ dependencies = [ "futures-util", "itertools 0.14.0", "oci-distribution 0.11.0 (git+https://github.com/fermyon/oci-distribution?rev=7b291a39f74d1a3c9499d934a56cae6580fc8e37)", - "reqwest 0.12.24", + "reqwest 0.12.26", "serde", "serde_json", "spin-common", @@ -9523,7 +9266,7 @@ version = "3.6.0-pre0" dependencies = [ "anyhow", "futures-util", - "http 1.3.1", + "http 1.4.0", "ip_network", "ip_network_table", "spin-expressions", @@ -9542,7 +9285,7 @@ dependencies = [ "fd-lock", "flate2", "path-absolutize", - "reqwest 0.12.24", + "reqwest 0.12.26", "semver", "serde", "serde_json", @@ -9595,11 +9338,7 @@ dependencies = [ "spin-world", "tempfile", "tokio", -<<<<<<< HEAD - "toml 0.8.19", -======= "toml 0.8.23", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) ] [[package]] @@ -9636,7 +9375,7 @@ version = "3.6.0-pre0" dependencies = [ "anyhow", "base64 0.22.1", - "indexmap 2.12.0", + "indexmap 2.12.1", "schemars 0.8.22", "semver", "serde", @@ -9652,11 +9391,7 @@ dependencies = [ "spin-factors", "spin-sqlite-inproc", "spin-sqlite-libsql", -<<<<<<< HEAD - "toml 0.8.19", -======= "toml 0.8.23", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) ] [[package]] @@ -9689,7 +9424,7 @@ version = "3.6.0-pre0" dependencies = [ "anyhow", "http 0.2.12", - "http 1.3.1", + "http 1.4.0", "opentelemetry", "opentelemetry-appender-tracing", "opentelemetry-otlp", @@ -9710,7 +9445,7 @@ dependencies = [ "flate2", "fs_extra", "heck 0.5.0", - "indexmap 2.12.0", + "indexmap 2.12.1", "itertools 0.14.0", "lazy_static 1.5.0", "liquid", @@ -9719,7 +9454,7 @@ dependencies = [ "path-absolutize", "pathdiff", "regex", - "reqwest 0.12.24", + "reqwest 0.12.26", "semver", "serde", "spin-common", @@ -9728,13 +9463,8 @@ dependencies = [ "tempfile", "terminal", "tokio", -<<<<<<< HEAD - "toml 0.8.19", - "toml_edit", -======= "toml 0.8.23", "toml_edit 0.22.27", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "url", "walkdir", ] @@ -9774,21 +9504,14 @@ dependencies = [ "anyhow", "clap 3.2.25", "futures", - "http 1.3.1", + "http 1.4.0", "http-body 1.0.1", "http-body-util", -<<<<<<< HEAD "hyper 1.8.1", "hyper-util", "pin-project-lite", - "rand 0.9.1", - "rustls 0.23.18", -======= - "hyper 1.7.0", - "hyper-util", - "pin-project-lite", - "rustls 0.23.34", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) + "rand 0.9.2", + "rustls 0.23.35", "rustls-pki-types", "serde", "serde_json", @@ -9867,11 +9590,7 @@ dependencies = [ "spin-expressions", "spin-factors", "tempfile", -<<<<<<< HEAD - "toml 0.8.19", -======= "toml 0.8.23", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) ] [[package]] @@ -9891,8 +9610,6 @@ version = "3.6.0-pre0" dependencies = [ "anyhow", "async-trait", - "opentelemetry", - "opentelemetry_sdk", "wasmtime", ] @@ -9988,7 +9705,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -10020,9 +9737,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.108" +version = "2.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" dependencies = [ "proc-macro2", "quote", @@ -10064,7 +9781,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -10148,11 +9865,7 @@ dependencies = [ "cap-std", "fd-lock", "io-lifetimes", -<<<<<<< HEAD - "rustix 0.38.40", -======= "rustix 0.38.44", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "windows-sys 0.59.0", "winx", ] @@ -10239,7 +9952,7 @@ version = "0.0.0" dependencies = [ "heck 0.5.0", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -10258,7 +9971,7 @@ dependencies = [ "anyhow", "fslock", "regex", - "reqwest 0.12.24", + "reqwest 0.12.26", "temp-dir", "tokio", ] @@ -10268,11 +9981,11 @@ name = "testing-framework" version = "0.1.0" dependencies = [ "anyhow", - "http 1.3.1", + "http 1.4.0", "http-body-util", "log", "nix 0.29.0", - "reqwest 0.12.24", + "reqwest 0.12.26", "spin-app", "spin-http", "spin-loader", @@ -10315,7 +10028,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -10326,7 +10039,7 @@ checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -10470,11 +10183,7 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", -<<<<<<< HEAD - "socket2 0.6.0", -======= "socket2 0.6.1", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "tokio-macros", "windows-sys 0.61.2", ] @@ -10487,7 +10196,7 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -10553,7 +10262,7 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.34", + "rustls 0.23.35", "tokio", ] @@ -10597,17 +10306,11 @@ version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ - "indexmap 2.12.0", + "indexmap 2.12.1", "serde", -<<<<<<< HEAD - "serde_spanned 0.6.8", - "toml_datetime 0.6.8", - "toml_edit", -======= - "serde_spanned", + "serde_spanned 0.6.9", "toml_datetime 0.6.11", "toml_edit 0.22.27", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) ] [[package]] @@ -10616,13 +10319,13 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" dependencies = [ - "indexmap 2.12.0", + "indexmap 2.12.1", "serde_core", "serde_spanned 1.0.3", "toml_datetime 0.7.3", "toml_parser", "toml_writer", - "winnow 0.7.13", + "winnow", ] [[package]] @@ -10637,18 +10340,6 @@ dependencies = [ [[package]] name = "toml_datetime" version = "0.7.3" -<<<<<<< HEAD -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" -dependencies = [ - "serde_core", -] - -[[package]] -name = "toml_edit" -version = "0.22.22" -======= ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" dependencies = [ @@ -10661,17 +10352,9 @@ version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.12.0", + "indexmap 2.12.1", "serde", -<<<<<<< HEAD - "serde_spanned 0.6.8", - "toml_datetime 0.6.8", - "winnow 0.6.20", -] - -[[package]] -======= - "serde_spanned", + "serde_spanned 0.6.9", "toml_datetime 0.6.11", "toml_write", "winnow", @@ -10679,33 +10362,22 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.23.7" +version = "0.23.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" +checksum = "5d7cbc3b4b49633d57a0509303158ca50de80ae32c265093b24c414705807832" dependencies = [ - "indexmap 2.12.0", + "indexmap 2.12.1", "toml_datetime 0.7.3", "toml_parser", "winnow", ] [[package]] ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) name = "toml_parser" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" dependencies = [ -<<<<<<< HEAD - "winnow 0.7.13", -] - -[[package]] -name = "toml_writer" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" -======= "winnow", ] @@ -10714,7 +10386,12 @@ name = "toml_write" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) + +[[package]] +name = "toml_writer" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" [[package]] name = "tonic" @@ -10727,19 +10404,11 @@ dependencies = [ "axum", "base64 0.22.1", "bytes", -<<<<<<< HEAD - "h2 0.4.6", - "http 1.3.1", - "http-body 1.0.1", - "http-body-util", - "hyper 1.8.1", -======= "h2 0.4.12", - "http 1.3.1", + "http 1.4.0", "http-body 1.0.1", "http-body-util", - "hyper 1.7.0", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) + "hyper 1.8.1", "hyper-timeout", "hyper-util", "percent-encoding", @@ -10797,17 +10466,22 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.6" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" dependencies = [ + "async-compression", "bitflags 2.10.0", "bytes", + "futures-core", "futures-util", - "http 1.3.1", + "http 1.4.0", "http-body 1.0.1", + "http-body-util", "iri-string", "pin-project-lite", + "tokio", + "tokio-util", "tower 0.5.2", "tower-layer", "tower-service", @@ -10827,9 +10501,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "2d15d90a0b5c19378952d479dc858407149d7bb45a14de0142f6c534b16fc647" dependencies = [ "log", "pin-project-lite", @@ -10839,20 +10513,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] name = "tracing-core" -version = "0.1.34" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" dependencies = [ "once_cell", "valuable", @@ -10899,9 +10573,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.20" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" +checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" dependencies = [ "matchers", "nu-ansi-term", @@ -11152,9 +10826,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.18.1" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" +checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" dependencies = [ "getrandom 0.3.4", "js-sys", @@ -11169,9 +10843,9 @@ checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "value-bag" -version = "1.11.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943ce29a8a743eb10d6082545d861b24f9d1b160b7d741e0f2cdf726bec909c5" +checksum = "7ba6f5989077681266825251a52748b8c1d8a4ad098cc37e440103d0ea717fc0" [[package]] name = "vaultrs" @@ -11182,12 +10856,8 @@ dependencies = [ "async-trait", "bytes", "derive_builder 0.12.0", - "http 1.3.1", -<<<<<<< HEAD - "reqwest 0.12.9", -======= - "reqwest 0.12.24", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) + "http 1.4.0", + "reqwest 0.12.26", "rustify", "rustify_derive", "serde", @@ -11237,7 +10907,7 @@ checksum = "d511e0c9462a5f6369e7e17e9f0f3b566eab2a235076a23f2db19ca7bf36d32c" dependencies = [ "anyhow", "id-arena", - "indexmap 2.12.0", + "indexmap 2.12.1", "log", "petgraph", "semver", @@ -11256,7 +10926,7 @@ checksum = "64fdef742a5198856c7c754944b329ed684f703dca477d0a77b474b37d990121" dependencies = [ "anyhow", "id-arena", - "indexmap 2.12.0", + "indexmap 2.12.1", "semver", "wasm-encoder 0.239.0", "wasmparser 0.239.0", @@ -11293,7 +10963,7 @@ version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f98505d42b5289563c6d659f625b6789a97980166508bd00862c4328bf41c261" dependencies = [ - "indexmap 2.12.0", + "indexmap 2.12.1", "itertools 0.12.1", "serde", "serde_with", @@ -11312,11 +10982,11 @@ dependencies = [ "async-recursion", "async-trait", "bytes", - "clap 4.5.51", + "clap 4.5.53", "dialoguer", "dirs 5.0.1", "futures-util", - "indexmap 2.12.0", + "indexmap 2.12.1", "itertools 0.12.1", "keyring", "libc", @@ -11324,7 +10994,7 @@ dependencies = [ "once_cell", "pathdiff", "ptree", - "reqwest 0.12.24", + "reqwest 0.12.26", "secrecy", "semver", "serde", @@ -11397,7 +11067,7 @@ dependencies = [ "anyhow", "base64 0.21.7", "hex", - "indexmap 2.12.0", + "indexmap 2.12.1", "pbjson-types", "prost 0.12.6", "prost-types", @@ -11418,7 +11088,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b8d8110b6800c43422676201a6a62167769b015ca29a8fcab67d789ac8b9c63" dependencies = [ "anyhow", - "indexmap 2.12.0", + "indexmap 2.12.1", "prost 0.12.6", "thiserror 1.0.69", "warg-crypto", @@ -11441,8 +11111,6 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" name = "wasi-otel" version = "3.6.0-pre0" dependencies = [ - "anyhow", - "async-trait", "opentelemetry", "opentelemetry_sdk", "wasmtime", @@ -11465,9 +11133,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.105" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" +checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" dependencies = [ "cfg-if", "once_cell", @@ -11478,9 +11146,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.55" +version = "0.4.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" +checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" dependencies = [ "cfg-if", "js-sys", @@ -11491,9 +11159,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.105" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" +checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -11501,22 +11169,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.105" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" +checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.105" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" dependencies = [ "unicode-ident", ] @@ -11530,7 +11198,7 @@ dependencies = [ "anyhow", "heck 0.4.1", "im-rc", - "indexmap 2.12.0", + "indexmap 2.12.1", "log", "petgraph", "serde", @@ -11551,7 +11219,7 @@ dependencies = [ "anyhow", "heck 0.4.1", "im-rc", - "indexmap 2.12.0", + "indexmap 2.12.1", "log", "petgraph", "serde", @@ -11614,26 +11282,23 @@ dependencies = [ ] [[package]] -<<<<<<< HEAD name = "wasm-encoder" -version = "0.241.2" +version = "0.243.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01164c9dda68301e34fdae536c23ed6fe90ce6d97213ccc171eebbd3d02d6b8" +checksum = "c55db9c896d70bd9fa535ce83cd4e1f2ec3726b0edd2142079f594fc3be1cb35" dependencies = [ "leb128fmt", - "wasmparser 0.241.2", + "wasmparser 0.243.0", ] [[package]] -======= ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) name = "wasm-metadata" version = "0.224.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c93c9e49fa2749be3c5ab28ad4be03167294915cd3b2ded3f04f760cef5cfb86" dependencies = [ "anyhow", - "indexmap 2.12.0", + "indexmap 2.12.1", "serde", "serde_derive", "serde_json", @@ -11652,7 +11317,7 @@ dependencies = [ "anyhow", "auditable-serde", "flate2", - "indexmap 2.12.0", + "indexmap 2.12.1", "serde", "serde_derive", "serde_json", @@ -11671,7 +11336,7 @@ dependencies = [ "anyhow", "auditable-serde", "flate2", - "indexmap 2.12.0", + "indexmap 2.12.1", "serde", "serde_derive", "serde_json", @@ -11690,7 +11355,7 @@ dependencies = [ "anyhow", "auditable-serde", "flate2", - "indexmap 2.12.0", + "indexmap 2.12.1", "serde", "serde_derive", "serde_json", @@ -11715,7 +11380,7 @@ dependencies = [ "futures-util", "oci-client", "oci-wasm", - "reqwest 0.12.24", + "reqwest 0.12.26", "secrecy", "serde", "serde_json", @@ -11723,11 +11388,7 @@ dependencies = [ "thiserror 1.0.69", "tokio", "tokio-util", -<<<<<<< HEAD - "toml 0.8.19", -======= "toml 0.8.23", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "tracing", "tracing-subscriber", "url", @@ -11749,18 +11410,14 @@ dependencies = [ "bytes", "etcetera", "futures-util", - "http 1.3.1", + "http 1.4.0", "semver", "serde", "serde_json", "sha2", "thiserror 1.0.69", "tokio", -<<<<<<< HEAD - "toml 0.8.19", -======= "toml 0.8.23", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) ] [[package]] @@ -11783,7 +11440,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9dbe55c8f9d0dbd25d9447a5a889ff90c0cc3feaa7395310d3d826b2c703eaab" dependencies = [ "bitflags 2.10.0", - "indexmap 2.12.0", + "indexmap 2.12.1", "semver", ] @@ -11795,7 +11452,7 @@ checksum = "04f17a5917c2ddd3819e84c661fae0d6ba29d7b9c1f0e96c708c65a9c4188e11" dependencies = [ "bitflags 2.10.0", "hashbrown 0.15.5", - "indexmap 2.12.0", + "indexmap 2.12.1", "semver", ] @@ -11807,7 +11464,7 @@ checksum = "161296c618fa2d63f6ed5fffd1112937e803cb9ec71b32b01a76321555660917" dependencies = [ "bitflags 2.10.0", "hashbrown 0.15.5", - "indexmap 2.12.0", + "indexmap 2.12.1", "semver", ] @@ -11819,7 +11476,7 @@ checksum = "8c9d90bb93e764f6beabf1d02028c70a2156a6583e63ac4218dd07ef733368b0" dependencies = [ "bitflags 2.10.0", "hashbrown 0.15.5", - "indexmap 2.12.0", + "indexmap 2.12.1", "semver", "serde", ] @@ -11831,23 +11488,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b722dcf61e0ea47440b53ff83ccb5df8efec57a69d150e4f24882e4eba7e24a4" dependencies = [ "bitflags 2.10.0", -<<<<<<< HEAD - "hashbrown 0.15.2", - "indexmap 2.12.0", + "hashbrown 0.15.5", + "indexmap 2.12.1", "semver", "serde", ] [[package]] name = "wasmparser" -version = "0.241.2" +version = "0.243.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46d90019b1afd4b808c263e428de644f3003691f243387d30d673211ee0cb8e8" +checksum = "f6d8db401b0528ec316dfbe579e6ab4152d61739cfe076706d2009127970159d" dependencies = [ "bitflags 2.10.0", -======= ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) - "indexmap 2.12.0", + "indexmap 2.12.1", "semver", ] @@ -11874,19 +11528,11 @@ dependencies = [ [[package]] name = "wasmtime" -<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "511bc19c2d48f338007dc941cb40c833c4707023fdaf9ec9b97cf1d5a62d26bb" -dependencies = [ - "addr2line 0.25.1", -======= -version = "37.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1092d79769b1f888940a572ed881eec18f837cb96201985eb5928226759ebc3e" dependencies = [ "addr2line", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "anyhow", "async-trait", "bitflags 2.10.0", @@ -11897,14 +11543,9 @@ dependencies = [ "encoding_rs", "futures", "fxprof-processed-profile", -<<<<<<< HEAD - "gimli 0.32.3", - "hashbrown 0.15.2", -======= "gimli", "hashbrown 0.15.5", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) - "indexmap 2.12.0", + "indexmap 2.12.1", "ittapi", "libc", "log", @@ -11945,26 +11586,16 @@ dependencies = [ [[package]] name = "wasmtime-environ" -<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3b0d53657fea2a8cee8ed1866ad45d2e5bc21be958a626a1dd9b7de589851b3" -======= -version = "37.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "484db5c4dd06e96559217b60893b5dbb9fe3cd28489c83a4257b277c9ead959c" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "anyhow", "cpp_demangle", "cranelift-bitset", "cranelift-entity", -<<<<<<< HEAD - "gimli 0.32.3", -======= "gimli", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) - "indexmap 2.12.0", + "indexmap 2.12.1", "log", "object", "postcard", @@ -11981,26 +11612,10 @@ dependencies = [ ] [[package]] -<<<<<<< HEAD name = "wasmtime-internal-cache" version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35e065628d2a6eccb722de71c6d9b58771f5c3c4f9d35f6cb6d9d92370f4c2b4" -======= -name = "wasmtime-internal-asm-macros" -version = "37.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60d3903b8db592bb4f5e847bd6dc38f485791d4d9ebc9e2df167d3c7f072115c" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "wasmtime-internal-cache" -version = "37.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab11f58f3b24a4a47d7d99b45ca22635c33cf26acdda1fe77612180e7285e2f" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "anyhow", "base64 0.22.1", @@ -12011,31 +11626,21 @@ dependencies = [ "serde", "serde_derive", "sha2", -<<<<<<< HEAD "toml 0.9.8", -======= - "toml 0.8.23", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "windows-sys 0.60.2", "zstd", ] [[package]] name = "wasmtime-internal-component-macro" -<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c933104f57d27dd1e6c7bd9ee5df3242bdd1962d9381bc08fa5d4e60e1f5ebdf" -======= -version = "37.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73c7d26d0c0d6da9f35dd56e3651a84bc4741646803e78886a3144aaf15c941e" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "anyhow", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", "wasmtime-internal-component-util", "wasmtime-internal-wit-bindgen", "wit-parser 0.240.0", @@ -12043,7 +11648,6 @@ dependencies = [ [[package]] name = "wasmtime-internal-component-util" -<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63ef2a95a5dbaa70fc3ef682ea8997e51cdd819b4d157a1100477cf43949d454" @@ -12053,17 +11657,6 @@ name = "wasmtime-internal-cranelift" version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73122df6a8cf417ce486a94e844d3a60797217ce7ae69653e0ee9e28269e0fa5" -======= -version = "37.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb62647125f7a0833cefb9a8862bc7886d206fe4e7131201bddd8d3979abbb02" - -[[package]] -name = "wasmtime-internal-cranelift" -version = "37.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d802c0a214c82fbf3e60ead87bf4d5dff7fc957c9a4449ceeae74bd89283ee57" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "anyhow", "cfg-if", @@ -12072,11 +11665,7 @@ dependencies = [ "cranelift-entity", "cranelift-frontend", "cranelift-native", -<<<<<<< HEAD - "gimli 0.32.3", -======= "gimli", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "itertools 0.14.0", "log", "object", @@ -12093,61 +11682,36 @@ dependencies = [ [[package]] name = "wasmtime-internal-fiber" -<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54ead059e58b54a7abbe0bfb9457b3833ebd2ad84326c248a835ff76d64c7c6f" -======= -version = "37.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43fdeb4c50dbbb3ebf01f7e6d270ba4239c8db5ff1e68725386abad2e5250be4" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "anyhow", "cc", "cfg-if", "libc", "rustix 1.1.2", -<<<<<<< HEAD -======= - "wasmtime-internal-asm-macros", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "wasmtime-internal-versioned-export-macros", "windows-sys 0.60.2", ] [[package]] name = "wasmtime-internal-jit-debug" -<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3af620a4ac1623298c90d3736644e12d66974951d1e38d0464798de85c984e17" -dependencies = [ - "cc", - "object 0.37.3", -======= -version = "37.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fe059ecd3f572ec2f616f036e5f31a88649a5f16e4838147cb3af6c3b5cedd5" dependencies = [ "cc", "object", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "rustix 1.1.2", "wasmtime-internal-versioned-export-macros", ] [[package]] name = "wasmtime-internal-jit-icache-coherence" -<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b97ccd36e25390258ce6720add639ffe5a7d81a5c904350aa08f5bbc60433d22" -======= -version = "37.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a03f55a9dbfa30f2ed269fa9735c2994b8423461d45c3ca08aa7a103daeff20" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "anyhow", "cfg-if", @@ -12157,22 +11721,15 @@ dependencies = [ [[package]] name = "wasmtime-internal-math" -<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd1b856e1bbf0230ab560ba4204e944b141971adc4e6cdf3feb6979c1a7b7953" -======= -version = "37.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed7f491d2c7f1be3f6e5485ab5a26f26f177860c8b5c16d3ab87df4b24f28e40" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "libm", ] [[package]] name = "wasmtime-internal-slab" -<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8908e71a780b97cbd3d8f3a0c446ac8df963069e0f3f38c9eace4f199d4d3e65" @@ -12182,17 +11739,6 @@ name = "wasmtime-internal-unwinder" version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb9c2f8223a0ef96527f0446b80c7d0d9bb0577c7b918e3104bd6d4cdba1d101" -======= -version = "37.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce79a933dd9c5fdcc1ce1f6b46e89e72ccb6767619557f0468d97fbfb0475db6" - -[[package]] -name = "wasmtime-internal-unwinder" -version = "37.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0e12be7ff91e956c6e7cee17654982669493c4aaa861e3536f7b1c22999519d" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "anyhow", "cfg-if", @@ -12203,40 +11749,24 @@ dependencies = [ [[package]] name = "wasmtime-internal-versioned-export-macros" -<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b0fb82cdbffd6cafc812c734a22fa753102888b8760ecf6a08cbb50367a458a" -======= -version = "37.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67d114c747409b6f76ddf86deb2c5976f809baed3eea8fdca493063ea182246b" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] name = "wasmtime-internal-winch" -<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1cfd68149cef86afd9a6c9b51e461266dfa66b37b4c6fdf1201ddbf7f906271" -dependencies = [ - "anyhow", - "cranelift-codegen", - "gimli 0.32.3", -======= -version = "37.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc9d9e984025efce72ec4b90b95790e857f2fef7601c317abedf61226e21585" dependencies = [ "anyhow", "cranelift-codegen", "gimli", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "log", "object", "target-lexicon", @@ -12248,34 +11778,22 @@ dependencies = [ [[package]] name = "wasmtime-internal-wit-bindgen" -<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a628437073400148f1ba2b55beb60eb376dc5ca538745994c83332b037d1f3fa" -======= -version = "37.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fb054d6661ef694d1d90e1c01233cb8ef0d7f84b73980709d3facef1373e189" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "anyhow", "bitflags 2.10.0", "heck 0.5.0", - "indexmap 2.12.0", + "indexmap 2.12.1", "wit-parser 0.240.0", ] [[package]] name = "wasmtime-wasi" -<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "517604b1ce13a56ae3e360217095d7d4db90e84deaa3fba078877c2b80cc5851" -======= -version = "37.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da6617d09fda0be82e11227418e5561c67a8469709215d7c05a9d9f4d2192dc7" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "anyhow", "async-trait", @@ -12304,28 +11822,18 @@ dependencies = [ [[package]] name = "wasmtime-wasi-http" -<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63d735c8a0ef1bb49810f4da75acfdba2390cb4e9de7385bffb8cda77d20d401" -======= -version = "37.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3822921e191aa0b6aaf7015f12dad4703e54dad0a9b41b68d846c79ea19e7d21" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "anyhow", "async-trait", "bytes", "futures", - "http 1.3.1", + "http 1.4.0", "http-body 1.0.1", "http-body-util", -<<<<<<< HEAD "hyper 1.8.1", -======= - "hyper 1.7.0", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "rustls 0.22.4", "tokio", "tokio-rustls 0.25.0", @@ -12339,15 +11847,9 @@ dependencies = [ [[package]] name = "wasmtime-wasi-io" -<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ec66fc94ceb9497d62a3d082bd2cce10348975795516553df4cd89f7d5fc14b" -======= -version = "37.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdca5f5ac3e7814f184f44e49add8e99a3e92bc1ceb45c05ba013b2822b7b705" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "anyhow", "async-trait", @@ -12367,43 +11869,24 @@ dependencies = [ [[package]] name = "wast" -<<<<<<< HEAD -version = "241.0.2" +version = "243.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63f66e07e2ddf531fef6344dbf94d112df7c2f23ed6ffb10962e711500b8d816" -======= -version = "240.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0efe1c93db4ac562b9733e3dca19ed7fc878dba29aef22245acf84f13da4a19" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) +checksum = "df21d01c2d91e46cb7a221d79e58a2d210ea02020d57c092e79255cc2999ca7f" dependencies = [ "bumpalo", "leb128fmt", "memchr", -<<<<<<< HEAD - "unicode-width 0.2.0", - "wasm-encoder 0.241.2", -======= "unicode-width 0.2.2", - "wasm-encoder 0.240.0", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) + "wasm-encoder 0.243.0", ] [[package]] name = "wat" -<<<<<<< HEAD -version = "1.241.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45f923705c40830af909c5dec2352ec2821202e4a66008194585e1917458a26d" -dependencies = [ - "wast 241.0.2", -======= -version = "1.240.0" +version = "1.243.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec9b6eab7ecd4d639d78515e9ea491c9bacf494aa5eda10823bd35992cf8c1e" +checksum = "226a9a91cd80a50449312fef0c75c23478fcecfcc4092bdebe1dc8e760ef521b" dependencies = [ - "wast 240.0.0", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) + "wast 243.0.0", ] [[package]] @@ -12492,9 +11975,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.82" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" +checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" dependencies = [ "js-sys", "wasm-bindgen", @@ -12552,15 +12035,9 @@ dependencies = [ [[package]] name = "wiggle" -<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb9c745158119785cf3098c97151cfcc33104ade6489bfa158b73d3f5979fa24" -======= -version = "37.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e45c8d34846d01d20157c00cd61e207e4f4d8889cfc69b45d43e5114834e71e" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "anyhow", "bitflags 2.10.0", @@ -12572,39 +12049,27 @@ dependencies = [ [[package]] name = "wiggle-generate" -<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8a98d02cd1ba87ca6039f28f4f4c0b53a9ff2684f5f2640f471af9bc608b9d9" -======= -version = "37.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "772a63dfce3a1bce1cc019720e43603633c5a2cb84291bec77f438ec38b55bf2" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "anyhow", "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", "witx", ] [[package]] name = "wiggle-macro" -<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a111938ed6e662d5f5036bb3cac8d10d5bea77a536885d6d4a4667c9cba97a2" -======= -version = "37.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3636c0c0352f54b28f45d1327784176e134009db4230024be6509966c88adf74" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", "wiggle-generate", ] @@ -12641,24 +12106,14 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "winch-codegen" -<<<<<<< HEAD version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1de5a648102e39c8e817ed25e3820f4b9772f3c9c930984f32737be60e3156b" -======= -version = "37.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61aeea98b13a9d2f537b9aec71a168397aefd5a3faebdc6b3d96ff7df4592e59" ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) dependencies = [ "anyhow", "cranelift-assembler-x64", "cranelift-codegen", -<<<<<<< HEAD - "gimli 0.32.3", -======= "gimli", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) "regalloc2", "smallvec", "target-lexicon", @@ -12736,7 +12191,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -12747,7 +12202,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -12774,13 +12229,13 @@ dependencies = [ [[package]] name = "windows-registry" -version = "0.5.3" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" dependencies = [ - "windows-link 0.1.3", - "windows-result 0.3.4", - "windows-strings 0.4.2", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", ] [[package]] @@ -12808,8 +12263,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ "windows-link 0.1.3", -<<<<<<< HEAD -======= ] [[package]] @@ -12819,7 +12272,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ "windows-link 0.2.1", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) ] [[package]] @@ -12867,15 +12319,6 @@ dependencies = [ "windows-link 0.2.1", ] -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link 0.2.1", -] - [[package]] name = "windows-targets" version = "0.48.5" @@ -12913,17 +12356,6 @@ version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ -<<<<<<< HEAD - "windows-link 0.1.3", - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", -======= "windows-link 0.2.1", "windows_aarch64_gnullvm 0.53.1", "windows_aarch64_msvc 0.53.1", @@ -12933,7 +12365,6 @@ dependencies = [ "windows_x86_64_gnu 0.53.1", "windows_x86_64_gnullvm 0.53.1", "windows_x86_64_msvc 0.53.1", ->>>>>>> 919fcacf (feat(wasi-otel): A WASI OTel host component) ] [[package]] @@ -13085,9 +12516,9 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "0.7.13" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" dependencies = [ "memchr", ] @@ -13132,7 +12563,7 @@ checksum = "923637fe647372efbbb654757f8c884ba280924477e1d265eca7e35d4cdcea8b" dependencies = [ "anyhow", "bitflags 2.10.0", - "indexmap 2.12.0", + "indexmap 2.12.1", "log", "serde", "serde_derive", @@ -13151,7 +12582,7 @@ checksum = "64a57a11109cc553396f89f3a38a158a97d0b1adaec113bd73e0f64d30fb601f" dependencies = [ "anyhow", "bitflags 2.10.0", - "indexmap 2.12.0", + "indexmap 2.12.1", "log", "serde", "serde_derive", @@ -13170,7 +12601,7 @@ checksum = "7dc5474b078addc5fe8a72736de8da3acfb3ff324c2491133f8b59594afa1a20" dependencies = [ "anyhow", "bitflags 2.10.0", - "indexmap 2.12.0", + "indexmap 2.12.1", "log", "serde", "serde_derive", @@ -13203,7 +12634,7 @@ checksum = "e3477d8d0acb530d76beaa8becbdb1e3face08929db275f39934963eb4f716f8" dependencies = [ "anyhow", "id-arena", - "indexmap 2.12.0", + "indexmap 2.12.1", "log", "semver", "serde", @@ -13221,7 +12652,7 @@ checksum = "0a1f95a87d03a33e259af286b857a95911eb46236a0f726cbaec1227b3dfc67a" dependencies = [ "anyhow", "id-arena", - "indexmap 2.12.0", + "indexmap 2.12.1", "log", "semver", "serde", @@ -13239,7 +12670,7 @@ checksum = "9875ea3fa272f57cc1fc50f225a7b94021a7878c484b33792bccad0d93223439" dependencies = [ "anyhow", "id-arena", - "indexmap 2.12.0", + "indexmap 2.12.1", "log", "semver", "serde", @@ -13350,7 +12781,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", "synstructure 0.13.2", ] @@ -13362,7 +12793,7 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", "synstructure 0.13.2", ] @@ -13413,7 +12844,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", "zvariant_utils", ] @@ -13430,22 +12861,22 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.27" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.27" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -13465,7 +12896,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", "synstructure 0.13.2", ] @@ -13486,7 +12917,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -13519,7 +12950,7 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -13532,7 +12963,7 @@ dependencies = [ "crc32fast", "crossbeam-utils", "displaydoc", - "indexmap 2.12.0", + "indexmap 2.12.1", "num_enum", "thiserror 1.0.69", ] @@ -13587,7 +13018,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", "zvariant_utils", ] @@ -13599,5 +13030,5 @@ checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] diff --git a/crates/wasi-otel/Cargo.toml b/crates/wasi-otel/Cargo.toml index b923f7b938..6d4a0a8af1 100644 --- a/crates/wasi-otel/Cargo.toml +++ b/crates/wasi-otel/Cargo.toml @@ -5,8 +5,8 @@ authors = { workspace = true } edition = { workspace = true } [dependencies] -anyhow = { workspace = true } -async-trait = { workspace = true } +# anyhow = { workspace = true } +# async-trait = { workspace = true } opentelemetry = { workspace = true } opentelemetry_sdk = { workspace = true } wasmtime = { workspace = true } diff --git a/crates/wasi-otel/src/lib.rs b/crates/wasi-otel/src/lib.rs index fc9619e675..a58f2bd18b 100644 --- a/crates/wasi-otel/src/lib.rs +++ b/crates/wasi-otel/src/lib.rs @@ -1,8 +1,6 @@ #![allow(missing_docs)] #![allow(non_camel_case_types)] // bindgen emits Host_Pre and Host_Indices -pub use async_trait::async_trait; - wasmtime::component::bindgen!({ inline: r#" package fermyon:runtime; @@ -21,25 +19,25 @@ wasmtime::component::bindgen!({ exports: { default: async }, // The following is a roundabout way of saying "the host implementations for these interfaces don't trap" trappable_error_type: { - "fermyon:spin/config/error" => v1::config::Error, - "fermyon:spin/http-types/http-error" => v1::http_types::HttpError, - "fermyon:spin/llm@2.0.0/error" => v2::llm::Error, - "fermyon:spin/llm/error" => v1::llm::Error, - "fermyon:spin/mqtt@2.0.0/error" => v2::mqtt::Error, - "fermyon:spin/mysql/mysql-error" => v1::mysql::MysqlError, - "fermyon:spin/postgres/pg-error" => v1::postgres::PgError, - "fermyon:spin/rdbms-types@2.0.0/error" => v2::rdbms_types::Error, - "fermyon:spin/redis-types/error" => v1::redis_types::Error, - "fermyon:spin/redis@2.0.0/error" => v2::redis::Error, - "fermyon:spin/sqlite@2.0.0/error" => v2::sqlite::Error, - "fermyon:spin/sqlite/error" => v1::sqlite::Error, - "fermyon:spin/variables@2.0.0/error" => v2::variables::Error, - "spin:postgres/postgres@3.0.0/error" => spin::postgres3_0_0::postgres::Error, - "spin:postgres/postgres@4.0.0/error" => spin::postgres4_0_0::postgres::Error, - "spin:sqlite/sqlite/error" => spin::sqlite::sqlite::Error, - "wasi:config/store@0.2.0-draft-2024-09-27/error" => wasi::config::store::Error, - "wasi:keyvalue/store/error" => wasi::keyvalue::store::Error, - "wasi:keyvalue/atomics/cas-error" => wasi::keyvalue::atomics::CasError, + "fermyon:spin/config.error" => v1::config::Error, + "fermyon:spin/http-types.http-error" => v1::http_types::HttpError, + "fermyon:spin/llm@2.0.0.error" => v2::llm::Error, + "fermyon:spin/llm.error" => v1::llm::Error, + "fermyon:spin/mqtt@2.0.0.error" => v2::mqtt::Error, + "fermyon:spin/mysql.mysql-error" => v1::mysql::MysqlError, + "fermyon:spin/postgres.pg-error" => v1::postgres::PgError, + "fermyon:spin/rdbms-types@2.0.0.error" => v2::rdbms_types::Error, + "fermyon:spin/redis-types.error" => v1::redis_types::Error, + "fermyon:spin/redis@2.0.0.error" => v2::redis::Error, + "fermyon:spin/sqlite@2.0.0.error" => v2::sqlite::Error, + "fermyon:spin/sqlite.error" => v1::sqlite::Error, + "fermyon:spin/variables@2.0.0.error" => v2::variables::Error, + "spin:postgres/postgres@3.0.0.error" => spin::postgres3_0_0::postgres::Error, + "spin:postgres/postgres@4.0.0.error" => spin::postgres4_0_0::postgres::Error, + "spin:sqlite/sqlite.error" => spin::sqlite::sqlite::Error, + "wasi:config/store@0.2.0-draft-2024-09-27.error" => wasi::config::store::Error, + "wasi:keyvalue/store.error" => wasi::keyvalue::store::Error, + "wasi:keyvalue/atomics.cas-error" => wasi::keyvalue::atomics::CasError, }, }); diff --git a/crates/world/Cargo.toml b/crates/world/Cargo.toml index 4508fb7e6a..ad557e95dd 100644 --- a/crates/world/Cargo.toml +++ b/crates/world/Cargo.toml @@ -7,6 +7,4 @@ edition = { workspace = true } [dependencies] anyhow = { workspace = true } async-trait = { workspace = true } -opentelemetry = { workspace = true } -opentelemetry_sdk = { workspace = true } wasmtime = { workspace = true } From 1a0d74f1db1539e20ccded3da266a125e44e753d Mon Sep 17 00:00:00 2001 From: Andrew Steurer <94206073+asteurer@users.noreply.github.com> Date: Thu, 18 Dec 2025 00:06:59 +0000 Subject: [PATCH 17/18] feat(wasi-otel): implementing logs Signed-off-by: Andrew Steurer <94206073+asteurer@users.noreply.github.com> --- Cargo.lock | 59 ++-- Cargo.toml | 7 +- crates/factor-otel/src/host.rs | 12 + crates/factor-otel/src/lib.rs | 20 +- crates/wasi-otel/Cargo.toml | 5 +- crates/wasi-otel/src/common_conversions.rs | 234 ++++++++++++++-- crates/wasi-otel/src/lib.rs | 6 +- crates/wasi-otel/src/log_conversions.rs | 262 ++++++++++++++++++ ...s_conversions.rs => metric_conversions.rs} | 0 crates/world/Cargo.toml | 2 + tests/test-components/components/Cargo.lock | 178 ++++++------ .../components/otel-smoke-test/Cargo.toml | 12 + .../components/otel-smoke-test/src/lib.rs | 22 ++ .../components/wasi-otel-tracing/Cargo.toml | 1 + wit/deps/otel/logs.wit | 36 +++ wit/deps/otel/metrics.wit | 10 +- wit/deps/otel/types.wit | 30 +- wit/deps/otel/world.wit | 1 + 18 files changed, 734 insertions(+), 163 deletions(-) create mode 100644 crates/wasi-otel/src/log_conversions.rs rename crates/wasi-otel/src/{metrics_conversions.rs => metric_conversions.rs} (100%) create mode 100644 tests/test-components/components/otel-smoke-test/Cargo.toml create mode 100644 tests/test-components/components/otel-smoke-test/src/lib.rs create mode 100644 wit/deps/otel/logs.wit diff --git a/Cargo.lock b/Cargo.lock index 74b46d4a5b..ee763c6ee0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -700,9 +700,9 @@ dependencies = [ [[package]] name = "aws-smithy-json" -version = "0.61.8" +version = "0.61.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6864c190cbb8e30cf4b77b2c8f3b6dfffa697a09b7218d2f7cd3d4c4065a9f7" +checksum = "49fa1213db31ac95288d981476f78d05d9cbb0353d22cdf3472cc05bb02f6551" dependencies = [ "aws-smithy-types", ] @@ -728,9 +728,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "1.9.5" +version = "1.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a392db6c583ea4a912538afb86b7be7c5d8887d91604f50eb55c262ee1b4a5f5" +checksum = "65fda37911905ea4d3141a01364bc5509a0f32ae3f3b22d6e330c0abfb62d247" dependencies = [ "aws-smithy-async", "aws-smithy-http", @@ -1223,9 +1223,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.19.0" +version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" dependencies = [ "allocator-api2", ] @@ -1670,9 +1670,9 @@ dependencies = [ [[package]] name = "cmake" -version = "0.1.56" +version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b042e5d8a74ae91bb0961acd039822472ec99f8ab0948cbf6d1369588f8be586" +checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" dependencies = [ "cc", ] @@ -6671,7 +6671,7 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ - "toml_edit 0.23.9", + "toml_edit 0.23.10+spec-1.0.0", ] [[package]] @@ -7810,9 +7810,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "708c0f9d5f54ba0272468c1d306a52c495b31fa155e91bc25371e6df7996908c" +checksum = "21e6f2ab2928ca4291b86736a8bd920a277a399bba1589409d72154ff87c1282" dependencies = [ "web-time", "zeroize", @@ -8210,9 +8210,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" +checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" dependencies = [ "serde_core", ] @@ -9610,6 +9610,8 @@ version = "3.6.0-pre0" dependencies = [ "anyhow", "async-trait", + "opentelemetry", + "opentelemetry_sdk", "wasmtime", ] @@ -10315,14 +10317,14 @@ dependencies = [ [[package]] name = "toml" -version = "0.9.8" +version = "0.9.9+spec-1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" +checksum = "eb5238e643fc34a1d5d7e753e1532a91912d74b63b92b3ea51fde8d1b7bc79dd" dependencies = [ "indexmap 2.12.1", "serde_core", - "serde_spanned 1.0.3", - "toml_datetime 0.7.3", + "serde_spanned 1.0.4", + "toml_datetime 0.7.4+spec-1.0.0", "toml_parser", "toml_writer", "winnow", @@ -10339,9 +10341,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.3" +version = "0.7.4+spec-1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +checksum = "fe3cea6b2aa3b910092f6abd4053ea464fab5f9c170ba5e9a6aead16ec4af2b6" dependencies = [ "serde_core", ] @@ -10362,21 +10364,21 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.23.9" +version = "0.23.10+spec-1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d7cbc3b4b49633d57a0509303158ca50de80ae32c265093b24c414705807832" +checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" dependencies = [ "indexmap 2.12.1", - "toml_datetime 0.7.3", + "toml_datetime 0.7.4+spec-1.0.0", "toml_parser", "winnow", ] [[package]] name = "toml_parser" -version = "1.0.4" +version = "1.0.5+spec-1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +checksum = "4c03bee5ce3696f31250db0bbaff18bc43301ce0e8db2ed1f07cbb2acf89984c" dependencies = [ "winnow", ] @@ -10389,9 +10391,9 @@ checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" [[package]] name = "toml_writer" -version = "1.0.4" +version = "1.0.5+spec-1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" +checksum = "a9cd6190959dce0994aa8970cd32ab116d1851ead27e866039acaf2524ce44fa" [[package]] name = "tonic" @@ -11111,8 +11113,11 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" name = "wasi-otel" version = "3.6.0-pre0" dependencies = [ + "base64 0.22.1", "opentelemetry", "opentelemetry_sdk", + "serde", + "serde_json", "wasmtime", ] @@ -11626,7 +11631,7 @@ dependencies = [ "serde", "serde_derive", "sha2", - "toml 0.9.8", + "toml 0.9.9+spec-1.0.0", "windows-sys 0.60.2", "zstd", ] diff --git a/Cargo.toml b/Cargo.toml index baf5cb6345..f8233f29d0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -149,7 +149,12 @@ lazy_static = "1.5" opentelemetry = "0.28" # The default `reqwest-blocking-client` causes a runtime panic opentelemetry-otlp = { version = "0.28", default-features = false, features = ["http-proto", "reqwest-client", "logs"]} -opentelemetry_sdk = {version = "0.28", features = ["experimental_metrics_periodicreader_with_async_runtime", "experimental_trace_batch_span_processor_with_async_runtime", "experimental_logs_batch_log_processor_with_async_runtime"]} +opentelemetry_sdk = {version = "0.28", features = [ + "experimental_metrics_periodicreader_with_async_runtime", + "experimental_trace_batch_span_processor_with_async_runtime", + "experimental_logs_batch_log_processor_with_async_runtime", + "experimental_async_runtime" +]} path-absolutize = "3" pin-project-lite = "0.2.16" quote = "1" diff --git a/crates/factor-otel/src/host.rs b/crates/factor-otel/src/host.rs index aeae4ea08c..e722972a6f 100644 --- a/crates/factor-otel/src/host.rs +++ b/crates/factor-otel/src/host.rs @@ -3,6 +3,7 @@ use anyhow::anyhow; use anyhow::Result; use opentelemetry::trace::TraceContextExt; use opentelemetry_sdk::error::OTelSdkError; +use opentelemetry_sdk::logs::LogProcessor; use opentelemetry_sdk::metrics::exporter::PushMetricExporter; use opentelemetry_sdk::trace::SpanProcessor; use tracing_opentelemetry::OpenTelemetrySpanExt; @@ -85,3 +86,14 @@ impl wasi::otel::metrics::Host for InstanceState { } } } + +impl wasi::otel::logs::Host for InstanceState { + async fn on_emit( + &mut self, + data: wasi::otel::logs::LogRecord, + ) -> spin_core::wasmtime::Result<()> { + let (mut record, scope) = wasi_otel::parse_wasi_log_record(data); + self.log_processor.emit(&mut record, &scope); + Ok(()) + } +} diff --git a/crates/factor-otel/src/lib.rs b/crates/factor-otel/src/lib.rs index 626944a0e4..1300759e17 100644 --- a/crates/factor-otel/src/lib.rs +++ b/crates/factor-otel/src/lib.rs @@ -8,6 +8,7 @@ use opentelemetry::{ }; use opentelemetry_otlp::MetricExporter; use opentelemetry_sdk::{ + logs::{log_processor_with_async_runtime::BatchLogProcessor, LogProcessor}, resource::{EnvResourceDetector, ResourceDetector, TelemetryResourceDetector}, runtime::Tokio, trace::{span_processor_with_async_runtime::BatchSpanProcessor, SpanProcessor}, @@ -21,6 +22,7 @@ use tracing_opentelemetry::OpenTelemetrySpanExt; pub struct OtelFactor { span_processor: Arc>, metric_exporter: Arc, + log_processor: Arc>, } impl Factor for OtelFactor { @@ -31,6 +33,7 @@ impl Factor for OtelFactor { fn init(&mut self, ctx: &mut impl spin_factors::InitContext) -> anyhow::Result<()> { ctx.link_bindings(wasi_otel::wasi::otel::tracing::add_to_linker::<_, FactorData>)?; ctx.link_bindings(wasi_otel::wasi::otel::metrics::add_to_linker::<_, FactorData>)?; + ctx.link_bindings(wasi_otel::wasi::otel::logs::add_to_linker::<_, FactorData>)?; Ok(()) } @@ -52,6 +55,7 @@ impl Factor for OtelFactor { })), span_processor: self.span_processor.clone(), metric_exporter: self.metric_exporter.clone(), + log_processor: self.log_processor.clone(), }) } } @@ -83,7 +87,6 @@ impl OtelFactor { }; let mut span_processor = BatchSpanProcessor::builder(span_exporter, Tokio).build(); - span_processor.set_resource(&resource); let metric_exporter = match OtlpProtocol::metrics_protocol_from_env() { @@ -96,9 +99,23 @@ impl OtelFactor { OtlpProtocol::HttpJson => bail!("http/json OTLP protocol is not supported"), }; + let log_exporter = match OtlpProtocol::logs_protocol_from_env() { + OtlpProtocol::Grpc => opentelemetry_otlp::LogExporter::builder() + .with_tonic() + .build()?, + OtlpProtocol::HttpProtobuf => opentelemetry_otlp::LogExporter::builder() + .with_http() + .build()?, + OtlpProtocol::HttpJson => bail!("http/json OTLP protocol is not supported"), + }; + + let log_processor = BatchLogProcessor::builder(log_exporter, Tokio).build(); + log_processor.set_resource(&resource); + Ok(Self { span_processor: Arc::new(span_processor), metric_exporter: Arc::new(metric_exporter), + log_processor: Arc::new(log_processor), }) } } @@ -107,6 +124,7 @@ pub struct InstanceState { pub(crate) state: Arc>, pub(crate) span_processor: Arc>, pub(crate) metric_exporter: Arc, + pub(crate) log_processor: Arc>, } impl SelfInstanceBuilder for InstanceState {} diff --git a/crates/wasi-otel/Cargo.toml b/crates/wasi-otel/Cargo.toml index 6d4a0a8af1..8078806f3b 100644 --- a/crates/wasi-otel/Cargo.toml +++ b/crates/wasi-otel/Cargo.toml @@ -5,8 +5,9 @@ authors = { workspace = true } edition = { workspace = true } [dependencies] -# anyhow = { workspace = true } -# async-trait = { workspace = true } opentelemetry = { workspace = true } opentelemetry_sdk = { workspace = true } +serde = { workspace = true } +serde_json = { workspace = true } wasmtime = { workspace = true } +base64 = { workspace = true} diff --git a/crates/wasi-otel/src/common_conversions.rs b/crates/wasi-otel/src/common_conversions.rs index 06c53fce1f..3f13b88933 100644 --- a/crates/wasi-otel/src/common_conversions.rs +++ b/crates/wasi-otel/src/common_conversions.rs @@ -1,40 +1,206 @@ use super::wasi::{self, clocks0_2_0::wall_clock}; -use std::time::{Duration, SystemTime, UNIX_EPOCH}; +use serde::{ + de::{self, SeqAccess, Visitor}, + Deserialize, +}; +use std::{ + fmt, + time::{Duration, SystemTime, UNIX_EPOCH}, +}; impl From for opentelemetry::KeyValue { fn from(kv: wasi::otel::types::KeyValue) -> Self { - opentelemetry::KeyValue::new(kv.key, kv.value) + let owned: OwnedValue = from_json(&kv.value); + let value: opentelemetry::Value = owned.into(); + opentelemetry::KeyValue::new(kv.key, value) } } impl From<&wasi::otel::types::KeyValue> for opentelemetry::KeyValue { fn from(kv: &wasi::otel::types::KeyValue) -> Self { - opentelemetry::KeyValue::new(kv.key.to_owned(), kv.value.to_owned()) + let owned: OwnedValue = from_json(&kv.value); + let value: opentelemetry::Value = owned.into(); + opentelemetry::KeyValue::new(kv.key.to_owned(), value) } } -impl From for opentelemetry::Value { - fn from(value: wasi::otel::types::Value) -> Self { +impl From for opentelemetry::Value { + fn from(value: OwnedValue) -> Self { match value { - wasi::otel::types::Value::String(v) => v.into(), - wasi::otel::types::Value::Bool(v) => v.into(), - wasi::otel::types::Value::F64(v) => v.into(), - wasi::otel::types::Value::S64(v) => v.into(), - wasi::otel::types::Value::StringArray(v) => opentelemetry::Value::Array( - v.into_iter() - .map(opentelemetry::StringValue::from) - .collect::>() - .into(), - ), - wasi::otel::types::Value::BoolArray(v) => opentelemetry::Value::Array(v.into()), - wasi::otel::types::Value::F64Array(v) => opentelemetry::Value::Array(v.into()), - wasi::otel::types::Value::S64Array(v) => opentelemetry::Value::Array(v.into()), + OwnedValue::String(s) => opentelemetry::Value::String(s.into()), + OwnedValue::Bool(v) => opentelemetry::Value::Bool(v), + OwnedValue::F64(v) => opentelemetry::Value::F64(v), + OwnedValue::I64(v) => opentelemetry::Value::I64(v), + OwnedValue::Array(arr) => opentelemetry::Value::Array(match arr { + OwnedArray::Bool(v) => opentelemetry::Array::Bool(v), + OwnedArray::F64(v) => opentelemetry::Array::F64(v), + OwnedArray::I64(v) => opentelemetry::Array::I64(v), + OwnedArray::String(v) => opentelemetry::Array::String( + v.iter() + .map(|e| opentelemetry::StringValue::from(e.to_owned())) + .collect(), + ), + }), } } } +enum OwnedValue { + Bool(bool), + I64(i64), + F64(f64), + String(String), + Array(OwnedArray), +} + +enum OwnedArray { + Bool(Vec), + I64(Vec), + F64(Vec), + String(Vec), +} + +impl<'de> Deserialize<'de> for OwnedValue { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + struct ValueVisitor; + + impl<'de> Visitor<'de> for ValueVisitor { + type Value = OwnedValue; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("a boolean, number, string, or array") + } + + fn visit_bool(self, value: bool) -> Result + where + E: de::Error, + { + Ok(OwnedValue::Bool(value)) + } + + fn visit_i64(self, value: i64) -> Result + where + E: de::Error, + { + Ok(OwnedValue::I64(value)) + } + + fn visit_f64(self, value: f64) -> Result + where + E: de::Error, + { + Ok(OwnedValue::F64(value)) + } + + /// u64 isn't an option in the OpenTelemetry Rust SDK; however, Serde may interpret a JSON number as u64. + fn visit_u64(self, value: u64) -> Result + where + E: de::Error, + { + i64::try_from(value) + .map(|v| Ok(OwnedValue::I64(v as i64))) + .map_err(|_| de::Error::custom("Integer too large for i64"))? + } + + fn visit_str(self, value: &str) -> Result + where + E: de::Error, + { + Ok(OwnedValue::String(value.to_owned())) + } + + fn visit_seq(self, mut seq: A) -> Result + where + A: SeqAccess<'de>, + { + let mut elements = Vec::new(); + + // Determine the type by looking at the first element + if let Some(first) = seq.next_element::()? { + elements.push(first); + + // Collect remaining elements + while let Some(elem) = seq.next_element::()? { + elements.push(elem); + } + + if elements.is_empty() { + return Ok(OwnedValue::Array(OwnedArray::Bool(vec![]))); + } + + match &elements[0] { + serde_json::Value::Bool(_) => { + let bools: Result, _> = elements + .iter() + .map(|v| { + v.as_bool() + .ok_or_else(|| de::Error::custom("Mixed types in array")) + }) + .collect(); + Ok(OwnedValue::Array(OwnedArray::Bool(bools?))) + } + serde_json::Value::Number(n) if n.is_i64() => { + let ints: Result, _> = elements + .iter() + .map(|v| { + v.as_i64() + .ok_or_else(|| de::Error::custom("Mixed types in array")) + }) + .collect(); + Ok(OwnedValue::Array(OwnedArray::I64(ints?))) + } + serde_json::Value::Number(n) if n.is_f64() => { + let nums: Result, _> = elements + .iter() + .map(|v| { + v.as_f64() + .ok_or_else(|| de::Error::custom("Mixed types in array")) + }) + .collect(); + Ok(OwnedValue::Array(OwnedArray::F64(nums?))) + } + serde_json::Value::String(_) => { + let strings: Result, _> = elements + .iter() + .map(|v| match v.as_str() { + Some(s) => Ok(s.to_string()), + None => Err(de::Error::custom("Mixed types in array")), + }) + .collect(); + Ok(OwnedValue::Array(OwnedArray::String(strings?))) + } + _ => Err(de::Error::custom("Unsupported array element type")), + } + } else { + // Empty array using bool as the default + Ok(OwnedValue::Array(OwnedArray::Bool(vec![]))) + } + } + } + + deserializer.deserialize_any(ValueVisitor) + } +} + +// Deserialize a JSON string to a Serde-serializable struct +pub(crate) fn from_json Deserialize<'de>>(json: &str) -> T { + serde_json::from_str(json).unwrap_or_else(|e| { + panic!( + "Failed to deserialize JSON to {}\ + \n Input: {}\ + \n Error: {}", + std::any::type_name::(), + json, + e + ) + }) +} + impl From for opentelemetry::InstrumentationScope { - fn from(value: wasi::otel::tracing::InstrumentationScope) -> Self { + fn from(value: wasi::otel::types::InstrumentationScope) -> Self { let builder = Self::builder(value.name).with_attributes(value.attributes.into_iter().map(Into::into)); match (value.version, value.schema_url) { @@ -56,3 +222,33 @@ impl From for SystemTime { + Duration::from_nanos(timestamp.nanoseconds as u64) } } + +#[cfg(test)] +mod tests { + use super::*; + + macro_rules! compare_json_and_literal { + ($json:expr, $literal:expr) => {{ + let left: serde_json::Value = from_json($json); + let right: serde_json::Value = serde_json::json!($literal); + assert_eq!(left, right); + }}; + } + + #[test] + fn deserialize_from_json_to_otel_value() { + compare_json_and_literal!("false", false); + compare_json_and_literal!("[false,true,true]", vec![false, true, true]); + compare_json_and_literal!("6", 6); + compare_json_and_literal!("[1,2,3,4]", vec![1, 2, 3, 4]); + compare_json_and_literal!("-6", -6); + compare_json_and_literal!("[-1,-2,-3,-4]", vec![-1, -2, -3, -4]); + compare_json_and_literal!("123.456", 123.456); + compare_json_and_literal!("[1.0,2.1,3.2,4.3]", vec![1.0, 2.1, 3.2, 4.3]); + compare_json_and_literal!("\"test\"", "test"); + compare_json_and_literal!( + "[\"Hello, world!\",\"Goodnight, moon.\"]", + vec!["Hello, world!", "Goodnight, moon."] + ); + } +} diff --git a/crates/wasi-otel/src/lib.rs b/crates/wasi-otel/src/lib.rs index a58f2bd18b..35e0c51785 100644 --- a/crates/wasi-otel/src/lib.rs +++ b/crates/wasi-otel/src/lib.rs @@ -45,5 +45,9 @@ pub use fermyon::spin as v1; pub use fermyon::spin2_0_0 as v2; mod common_conversions; -mod metrics_conversions; +mod log_conversions; +mod metric_conversions; mod trace_conversions; + +use common_conversions::from_json; +pub use log_conversions::parse_wasi_log_record; diff --git a/crates/wasi-otel/src/log_conversions.rs b/crates/wasi-otel/src/log_conversions.rs new file mode 100644 index 0000000000..d98c99c7d7 --- /dev/null +++ b/crates/wasi-otel/src/log_conversions.rs @@ -0,0 +1,262 @@ +use super::wasi; +use crate::from_json; +use base64::Engine; +use opentelemetry::logs::{LogRecord, Logger, LoggerProvider}; +use opentelemetry_sdk::logs::SdkLoggerProvider; +use serde::de::{SeqAccess, Visitor}; +use serde::{de, Deserialize}; +use std::borrow::Cow; +use std::collections::HashMap; +use std::fmt; + +pub fn parse_wasi_log_record( + wasi_log_record: wasi::otel::logs::LogRecord, +) -> ( + opentelemetry_sdk::logs::SdkLogRecord, + opentelemetry::InstrumentationScope, +) { + let log_provider = { + let mut provider = SdkLoggerProvider::builder(); + if let Some(resource) = wasi_log_record.resource { + let otel_resource = resource.into(); + provider = provider.with_resource(otel_resource); + } + provider.build() + }; + + let logger = log_provider.logger("spin-logger"); + + // Parse LogRecord + let mut otel_log_record = logger.create_log_record(); + if let Some(body) = wasi_log_record.body { + let owned: OwnedAnyValue = from_json(&body); + let otel_body: opentelemetry::logs::AnyValue = owned.into(); + otel_log_record.set_body(otel_body); + } + if let Some(name) = wasi_log_record.event_name { + otel_log_record.set_event_name(Box::leak(name.into_boxed_str())); + } + if let Some(timestamp) = wasi_log_record.observed_timestamp { + otel_log_record.set_observed_timestamp(timestamp.into()); + } + if let Some(number) = wasi_log_record.severity_number { + otel_log_record.set_severity_number(severity_from_u8(number)); + } + if let Some(text) = wasi_log_record.severity_text { + otel_log_record.set_severity_text(Box::leak(text.into_boxed_str())); + } + if let Some(timestamp) = wasi_log_record.timestamp { + otel_log_record.set_timestamp(timestamp.into()); + } + if let Some(trace_id) = wasi_log_record.trace_id { + if let Some(span_id) = wasi_log_record.span_id { + // Both the span ID and trace ID are required values to set trace context. + otel_log_record.set_trace_context( + opentelemetry::TraceId::from_hex(&trace_id).expect("Failed to parse trace ID"), + opentelemetry::SpanId::from_hex(&span_id).expect("Failed to parse span ID"), + wasi_log_record.trace_flags.map(Into::into), + ); + } + } + + // Parse InstrumentationScope + let otel_scope = if let Some(wasi_scope) = wasi_log_record.instrumentation_scope { + let attrs: Vec = wasi_scope + .attributes + .iter() + .map(|e| { + let kv: opentelemetry::KeyValue = e.into(); + kv + }) + .collect(); + let mut scope = opentelemetry::InstrumentationScope::builder(Cow::Owned(wasi_scope.name)) + .with_attributes(attrs); + if let Some(url) = wasi_scope.schema_url { + scope = scope.with_schema_url(Cow::Owned(url)); + } + if let Some(version) = wasi_scope.version { + scope = scope.with_version(version); + } + scope.build() + } else { + opentelemetry::InstrumentationScope::default() + }; + + (otel_log_record, otel_scope) +} + +fn severity_from_u8(n: u8) -> opentelemetry::logs::Severity { + use opentelemetry::logs::Severity::*; + match n { + 0 => { + // In the spec, there is a brief mention of SeverityNumber=0 used to represent an unspecified severity; + // however, this version of OpenTelemetry Rust doesn't implement it. + // See https://opentelemetry.io/docs/specs/otel/logs/data-model/#comparing-severity + unimplemented!() + } + 1 => Trace, + 2 => Trace2, + 3 => Trace3, + 4 => Trace4, + 5 => Debug, + 6 => Debug2, + 7 => Debug3, + 8 => Debug4, + 9 => Info, + 10 => Info2, + 11 => Info3, + 12 => Info4, + 13 => Warn, + 14 => Warn2, + 15 => Warn3, + 16 => Warn4, + 17 => Error, + 18 => Error2, + 19 => Error3, + 20 => Error4, + 21 => Fatal, + 22 => Fatal2, + 23 => Fatal3, + 24 => Fatal4, + num => panic!("{num} is not a valid severity number"), + } +} + +#[derive(Clone)] +enum OwnedAnyValue { + Int(i64), + Double(f64), + String(String), + Boolean(bool), + Bytes(Vec), + ListAny(Vec), + Map(HashMap), +} + +impl From for opentelemetry::logs::AnyValue { + fn from(value: OwnedAnyValue) -> Self { + use opentelemetry::logs::AnyValue; + match value { + OwnedAnyValue::Boolean(v) => AnyValue::Boolean(v), + OwnedAnyValue::Bytes(v) => AnyValue::Bytes(Box::new(v.to_vec())), + OwnedAnyValue::Double(v) => AnyValue::Double(v), + OwnedAnyValue::Int(v) => AnyValue::Int(v), + OwnedAnyValue::String(v) => AnyValue::String(v.clone().into()), + OwnedAnyValue::ListAny(v) => { + AnyValue::ListAny(Box::new(v.iter().map(|e| e.clone().into()).collect())) + } + OwnedAnyValue::Map(v) => AnyValue::Map(Box::new( + v.iter() + .map(|(k, v)| (k.clone().into(), v.clone().into())) + .collect(), + )), + } + } +} + +impl<'de> Deserialize<'de> for OwnedAnyValue { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + struct AnyValueVisitor; + + impl<'de> Visitor<'de> for AnyValueVisitor { + type Value = OwnedAnyValue; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("a boolean, number, string, or array") + } + + fn visit_bool(self, value: bool) -> Result + where + E: de::Error, + { + Ok(OwnedAnyValue::Boolean(value)) + } + + fn visit_i64(self, value: i64) -> Result + where + E: de::Error, + { + Ok(OwnedAnyValue::Int(value)) + } + + fn visit_f64(self, value: f64) -> Result + where + E: de::Error, + { + Ok(OwnedAnyValue::Double(value)) + } + + fn visit_str(self, value: &str) -> Result + where + E: de::Error, + { + if let Some(stripped) = value.strip_prefix("{base64}:") { + // Handle byte array + base64::engine::general_purpose::STANDARD + .decode(stripped) + .map(OwnedAnyValue::Bytes) + .map_err(|e| de::Error::custom(e)) + } else { + // Handle String + Ok(OwnedAnyValue::String(value.to_owned())) + } + } + + fn visit_map(self, mut map: A) -> Result + where + A: de::MapAccess<'de>, + { + let mut result = HashMap::new(); + // Recursively deserialize each key-value pair. + while let Some((key, value)) = map.next_entry::()? { + result.insert(key, value); + } + + Ok(OwnedAnyValue::Map(result)) + } + + fn visit_seq(self, mut seq: A) -> Result + where + A: SeqAccess<'de>, + { + let mut elements = Vec::new(); + + // Recursively deserialize each element. + while let Some(elem) = seq.next_element::()? { + elements.push(elem); + } + + Ok(OwnedAnyValue::ListAny(elements)) + } + } + + deserializer.deserialize_any(AnyValueVisitor) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn deserialize_json_to_otel_log_any_value() { + let test_json = "{\"key1\": false, \"key2\": 123.456, \"key3\": 41, \"key4\": \"{base64}:SGVsbG8sIHdvcmxkIQ==\", \"key5\": \"This is a string\", \"key6\": [1, 2, 3], \"key7\": {\"nestedkey1\": \"Hello, from within!\"}}"; + let expected: serde_json::Value = serde_json::json!({ + "key1": false, + "key2": 123.456, + "key3": 41, + //'Hello, world!' encoded to base64 + "key4": "{base64}:SGVsbG8sIHdvcmxkIQ==", + "key5": "This is a string", + "key6": [1, 2, 3], + "key7": { + "nestedkey1": "Hello, from within!" + } + }); + let actual: serde_json::Value = from_json(test_json); + assert_eq!(expected, actual); + } +} diff --git a/crates/wasi-otel/src/metrics_conversions.rs b/crates/wasi-otel/src/metric_conversions.rs similarity index 100% rename from crates/wasi-otel/src/metrics_conversions.rs rename to crates/wasi-otel/src/metric_conversions.rs diff --git a/crates/world/Cargo.toml b/crates/world/Cargo.toml index ad557e95dd..4508fb7e6a 100644 --- a/crates/world/Cargo.toml +++ b/crates/world/Cargo.toml @@ -7,4 +7,6 @@ edition = { workspace = true } [dependencies] anyhow = { workspace = true } async-trait = { workspace = true } +opentelemetry = { workspace = true } +opentelemetry_sdk = { workspace = true } wasmtime = { workspace = true } diff --git a/tests/test-components/components/Cargo.lock b/tests/test-components/components/Cargo.lock index d8a2eb79df..caffe4952c 100644 --- a/tests/test-components/components/Cargo.lock +++ b/tests/test-components/components/Cargo.lock @@ -51,7 +51,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -83,9 +83,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.19.0" +version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" [[package]] name = "byteorder" @@ -95,15 +95,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" [[package]] name = "cc" -version = "1.2.44" +version = "1.2.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37521ac7aabe3d13122dc382493e20c9416f299d2ccd5b3a5340a2570cdeb0f3" +checksum = "90583009037521a116abf44494efecd645ba48b6622457080f080b85544e2215" dependencies = [ "find-msvc-tools", "shlex", @@ -145,9 +145,9 @@ dependencies = [ [[package]] name = "crypto-common" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", "typenum", @@ -172,7 +172,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -189,9 +189,9 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "find-msvc-tools" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" [[package]] name = "fnv" @@ -270,7 +270,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -305,9 +305,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.9" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -345,9 +345,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" [[package]] name = "head-rust-sdk-redis" @@ -426,12 +426,11 @@ dependencies = [ [[package]] name = "http" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ "bytes", - "fnv", "itoa", ] @@ -516,9 +515,9 @@ checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" dependencies = [ "icu_collections", "icu_locale_core", @@ -530,9 +529,9 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" [[package]] name = "icu_provider" @@ -578,12 +577,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.12.0" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" dependencies = [ "equivalent", - "hashbrown 0.16.0", + "hashbrown 0.16.1", "serde", "serde_core", ] @@ -691,9 +690,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "js-sys" -version = "0.3.82" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" +checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" dependencies = [ "once_cell", "wasm-bindgen", @@ -736,9 +735,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.177" +version = "0.2.178" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" +checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" [[package]] name = "litemap" @@ -748,9 +747,9 @@ checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] name = "log" -version = "0.4.28" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "md-5" @@ -776,7 +775,7 @@ checksum = "560f32b6891d8d9bade8942c45a27694f16d789d3b4b8e6b7135a5240de0a8af" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -858,6 +857,15 @@ dependencies = [ "thiserror 2.0.17", ] +[[package]] +name = "otel-smoke-test" +version = "0.1.0" +dependencies = [ + "anyhow", + "http 0.2.12", + "spin-sdk 2.2.0", +] + [[package]] name = "outbound-http-component" version = "0.1.0" @@ -981,7 +989,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -995,9 +1003,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.41" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] @@ -1102,7 +1110,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -1299,7 +1307,7 @@ dependencies = [ "chrono", "form_urlencoded", "futures", - "http 1.3.1", + "http 1.4.0", "once_cell", "routefinder", "serde", @@ -1322,7 +1330,7 @@ dependencies = [ "chrono", "form_urlencoded", "futures", - "http 1.3.1", + "http 1.4.0", "once_cell", "postgres_range", "routefinder", @@ -1387,9 +1395,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.108" +version = "2.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" dependencies = [ "proc-macro2", "quote", @@ -1404,7 +1412,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -1441,7 +1449,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -1452,7 +1460,7 @@ checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -1491,9 +1499,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "2d15d90a0b5c19378952d479dc858407149d7bb45a14de0142f6c534b16fc647" dependencies = [ "pin-project-lite", "tracing-attributes", @@ -1502,20 +1510,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] name = "tracing-core" -version = "0.1.34" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" dependencies = [ "once_cell", "valuable", @@ -1553,9 +1561,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.20" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" +checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" dependencies = [ "nu-ansi-term", "sharded-slab", @@ -1639,9 +1647,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.18.1" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" +checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" dependencies = [ "js-sys", "wasm-bindgen", @@ -1750,9 +1758,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.105" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" +checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" dependencies = [ "cfg-if", "once_cell", @@ -1763,9 +1771,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.105" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" +checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1773,22 +1781,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.105" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" +checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.105" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" dependencies = [ "unicode-ident", ] @@ -2039,7 +2047,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -2050,7 +2058,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -2279,7 +2287,7 @@ dependencies = [ "heck 0.5.0", "indexmap", "prettyplease", - "syn 2.0.108", + "syn 2.0.111", "wasm-metadata 0.215.0", "wit-bindgen-core 0.30.0", "wit-component 0.215.0", @@ -2295,7 +2303,7 @@ dependencies = [ "heck 0.5.0", "indexmap", "prettyplease", - "syn 2.0.108", + "syn 2.0.111", "wasm-metadata 0.235.0", "wit-bindgen-core 0.43.0", "wit-component 0.235.0", @@ -2311,7 +2319,7 @@ dependencies = [ "heck 0.5.0", "indexmap", "prettyplease", - "syn 2.0.108", + "syn 2.0.111", "wasm-metadata 0.239.0", "wit-bindgen-core 0.46.0", "wit-component 0.239.0", @@ -2327,7 +2335,7 @@ dependencies = [ "heck 0.5.0", "indexmap", "prettyplease", - "syn 2.0.108", + "syn 2.0.111", "wasm-metadata 0.240.0", "wit-bindgen-core 0.47.0", "wit-component 0.240.0", @@ -2342,7 +2350,7 @@ dependencies = [ "anyhow", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", "wit-bindgen-core 0.13.1", "wit-bindgen-rust 0.13.2", "wit-component 0.17.0", @@ -2357,7 +2365,7 @@ dependencies = [ "anyhow", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", "wit-bindgen-core 0.16.0", "wit-bindgen-rust 0.16.0", "wit-component 0.18.2", @@ -2373,7 +2381,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", "wit-bindgen-core 0.30.0", "wit-bindgen-rust 0.30.0", ] @@ -2388,7 +2396,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", "wit-bindgen-core 0.43.0", "wit-bindgen-rust 0.43.0", ] @@ -2403,7 +2411,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", "wit-bindgen-core 0.46.0", "wit-bindgen-rust 0.46.0", ] @@ -2418,7 +2426,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", "wit-bindgen-core 0.47.0", "wit-bindgen-rust 0.47.0", ] @@ -2668,28 +2676,28 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.27" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.27" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -2709,7 +2717,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", "synstructure", ] @@ -2743,5 +2751,5 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] diff --git a/tests/test-components/components/otel-smoke-test/Cargo.toml b/tests/test-components/components/otel-smoke-test/Cargo.toml new file mode 100644 index 0000000000..521468b790 --- /dev/null +++ b/tests/test-components/components/otel-smoke-test/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "otel-smoke-test" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +anyhow = "1" +http = "0.2" +spin-sdk = "2.2.0" diff --git a/tests/test-components/components/otel-smoke-test/src/lib.rs b/tests/test-components/components/otel-smoke-test/src/lib.rs new file mode 100644 index 0000000000..85c4326102 --- /dev/null +++ b/tests/test-components/components/otel-smoke-test/src/lib.rs @@ -0,0 +1,22 @@ +use spin_sdk::{ + http::{Method, Params, Request, Response, Router}, + http_component, +}; + +#[http_component] +fn handle(req: http::Request<()>) -> Response { + let mut router = Router::new(); + router.get_async("/one", one); + router.get_async("/two", two); + router.handle(req) +} + +async fn one(_req: Request, _params: Params) -> Response { + let req = Request::builder().method(Method::Get).uri("/two").build(); + let _res: Response = spin_sdk::http::send(req).await.unwrap(); + Response::new(200, "") +} + +async fn two(_req: Request, _params: Params) -> Response { + Response::new(201, "") +} diff --git a/tests/test-components/components/wasi-otel-tracing/Cargo.toml b/tests/test-components/components/wasi-otel-tracing/Cargo.toml index 858383c4d2..959b2932a5 100644 --- a/tests/test-components/components/wasi-otel-tracing/Cargo.toml +++ b/tests/test-components/components/wasi-otel-tracing/Cargo.toml @@ -11,6 +11,7 @@ anyhow = "1" http = "0.2" opentelemetry = "0.31.0" opentelemetry_sdk = "0.31.0" +# TODO: asteurer opentelemetry-wasi = { git = "https://github.com/calebschoepp/opentelemetry-wasi", rev = "3c2c38478e02a1a4d3bfb56c02cbc39daaccd0e4" } spin-sdk = "5.1.1" wit-bindgen = "0.30.0" diff --git a/wit/deps/otel/logs.wit b/wit/deps/otel/logs.wit new file mode 100644 index 0000000000..91aa219a68 --- /dev/null +++ b/wit/deps/otel/logs.wit @@ -0,0 +1,36 @@ +interface logs { + use types.{instrumentation-scope, %resource, value, key-value}; + use tracing.{span-id, trace-id, trace-flags}; + use wasi:clocks/wall-clock@0.2.0.{datetime}; + + /// Called when a log is emitted. + on-emit: func(data: log-record); + + /// Represents the recording of an event. + record log-record { + /// Time when the event occurred. + timestamp: option, + /// Time when the event was observed. + observed-timestamp: option, + /// The severity text(also known as log level). + severity-text: option, + /// The numerical value of the severity ranging from 1-24. + severity-number: option, + /// The body of the log record. + body: option, + /// Additional information about the specific event occurrence. + attributes: option>, + /// Name that identifies the class / type of event. + event-name: option, + /// Describes the source of the log. + %resource: option<%resource>, + /// Describes the scope that emitted the log. + instrumentation-scope: option, + /// Request trace id. + trace-id: option, + /// Request span id. + span-id: option, + /// W3C trace flag. + trace-flags: option, + } +} diff --git a/wit/deps/otel/metrics.wit b/wit/deps/otel/metrics.wit index 8255684a4e..cd84cecfbb 100644 --- a/wit/deps/otel/metrics.wit +++ b/wit/deps/otel/metrics.wit @@ -1,7 +1,7 @@ interface metrics { use wasi:clocks/wall-clock@0.2.0.{datetime}; use wasi:clocks/monotonic-clock@0.2.0.{duration}; - use types.{key-value, instrumentation-scope}; + use types.{key-value, instrumentation-scope, %resource}; use tracing.{span-id, trace-id}; /// Exports a resource's metric data. @@ -18,14 +18,6 @@ interface metrics { scope-metrics: list, } - /// An immutable representation of the entity producing telemetry as attributes. - record %resource { - /// Attributes that identify the resource. - attributes: list, - /// The schema URL to be recorded in the emitted resource. - schema-url: option, - } - /// A collection of `metric`s produced by a meter. record scope-metrics { /// The instrumentation scope that the meter was created with. diff --git a/wit/deps/otel/types.wit b/wit/deps/otel/types.wit index f9c30c9869..6f8ce21aad 100644 --- a/wit/deps/otel/types.wit +++ b/wit/deps/otel/types.wit @@ -11,23 +11,17 @@ interface types { type key = string; /// The value part of attribute `key-value` pairs. - variant value { - /// A string value. - %string(string), - /// A boolean value. - %bool(bool), - /// A double precision floating point value. - %f64(f64), - /// A signed 64 bit integer value. - %s64(s64), - /// A homogeneous array of string values. - string-array(list), - /// A homogeneous array of boolean values. - bool-array(list), - /// A homogeneous array of double precision floating point values. - f64-array(list), - /// A homogeneous array of 64 bit integer values. - s64-array(list), + /// + /// This corresponds with the `AnyValue` type defined in the [attribute spec](https://opentelemetry.io/docs/specs/otel/common/#anyvalue). + /// Because WIT doesn't support recursive types, the data needs to be serialized. JSON is used as the encoding format. + type value = string; + + /// An immutable representation of the entity producing telemetry as attributes. + record %resource { + /// Attributes that identify the resource. + attributes: list, + /// The schema URL to be recorded in the emitted resource. + schema-url: option, } /// Describes the instrumentation scope that produced telemetry. @@ -39,7 +33,7 @@ interface types { version: option, /// Schema URL used by this library. - /// https://github.com/open-telemetry/opentelemetry-specification/blob/v1.9.0/specification/schemas/overview.md#schema-url + /// https://opentelemetry.io/docs/specs/otel/schemas/#schema-url schema-url: option, /// Specifies the instrumentation scope attributes to associate with emitted telemetry. diff --git a/wit/deps/otel/world.wit b/wit/deps/otel/world.wit index 5824151cba..776e5b47cb 100644 --- a/wit/deps/otel/world.wit +++ b/wit/deps/otel/world.wit @@ -4,4 +4,5 @@ world imports { import types; import tracing; import metrics; + import logs; } From cc558b2ec0cb2cd0619c6a410325bd165f632f1e Mon Sep 17 00:00:00 2001 From: Andrew Steurer <94206073+asteurer@users.noreply.github.com> Date: Wed, 17 Dec 2025 22:04:46 -0600 Subject: [PATCH 18/18] fix: linting Signed-off-by: Andrew Steurer <94206073+asteurer@users.noreply.github.com> --- crates/wasi-otel/src/common_conversions.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/wasi-otel/src/common_conversions.rs b/crates/wasi-otel/src/common_conversions.rs index 3f13b88933..9b5c3c88b0 100644 --- a/crates/wasi-otel/src/common_conversions.rs +++ b/crates/wasi-otel/src/common_conversions.rs @@ -101,7 +101,7 @@ impl<'de> Deserialize<'de> for OwnedValue { E: de::Error, { i64::try_from(value) - .map(|v| Ok(OwnedValue::I64(v as i64))) + .map(|v| Ok(OwnedValue::I64(v))) .map_err(|_| de::Error::custom("Integer too large for i64"))? }