add logfire opentelemetry instrumentation #1

merged
opened by zzstoatzz.io targeting main from feature/logfire-integration
  • replace env_logger with logfire for structured observability
  • add opentelemetry middleware for automatic http request tracing
  • instrument search operations with custom spans:
    • embedding generation
    • vector search
    • bm25 search
    • reciprocal rank fusion
  • remove unused upsert method and struct from turbopuffer client (ingestion script calls api directly, not used by main application)

🤖 Generated with Claude Code

Co-Authored-By: Claude noreply@anthropic.com

+889 -140
Cargo.lock
···
"mime",
"percent-encoding",
"pin-project-lite",
-
"rand",
"sha1",
"smallvec",
"tokio",
···
checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
[[package]]
-
name = "anstream"
-
version = "0.6.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a"
dependencies = [
-
"anstyle",
-
"anstyle-parse",
-
"anstyle-query",
-
"anstyle-wincon",
-
"colorchoice",
-
"is_terminal_polyfill",
-
"utf8parse",
]
[[package]]
-
name = "anstyle"
-
version = "1.0.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78"
[[package]]
-
name = "anstyle-parse"
-
version = "0.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2"
dependencies = [
-
"utf8parse",
]
[[package]]
-
name = "anstyle-query"
-
version = "1.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2"
dependencies = [
-
"windows-sys 0.60.2",
]
[[package]]
-
name = "anstyle-wincon"
-
version = "3.0.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a"
dependencies = [
-
"anstyle",
-
"once_cell_polyfill",
-
"windows-sys 0.60.2",
]
-
[[package]]
-
name = "anyhow"
-
version = "1.0.100"
-
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61"
-
[[package]]
name = "atomic-waker"
version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
[[package]]
name = "base64"
version = "0.22.1"
···
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
[[package]]
-
name = "colorchoice"
-
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
[[package]]
name = "cookie"
···
"libc",
]
[[package]]
name = "core-foundation-sys"
version = "0.8.7"
···
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f"
[[package]]
name = "encoding_rs"
version = "0.8.35"
···
"regex",
]
-
[[package]]
-
name = "env_logger"
-
version = "0.11.8"
-
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f"
-
dependencies = [
-
"anstream",
-
"anstyle",
-
"env_filter",
-
"jiff",
-
"log",
-
]
-
[[package]]
name = "equivalent"
version = "1.0.2"
···
"anyhow",
"base64",
"dotenv",
-
"env_logger",
"log",
"reqwest",
"serde",
"serde_json",
-
"thiserror",
"tokio",
]
[[package]]
···
checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592"
dependencies = [
"cfg-if",
"libc",
"wasi",
]
[[package]]
···
"wasm-bindgen",
]
[[package]]
name = "governor"
version = "0.10.1"
···
"parking_lot",
"portable-atomic",
"quanta",
-
"rand",
"smallvec",
"spinning_top",
"web-time",
···
"futures-sink",
"futures-util",
"http 0.2.12",
-
"indexmap",
"slab",
"tokio",
"tokio-util",
···
"futures-core",
"futures-sink",
"http 1.3.1",
-
"indexmap",
"slab",
"tokio",
"tokio-util",
"tracing",
]
[[package]]
name = "hashbrown"
version = "0.14.5"
···
"http 1.3.1",
"http-body",
"httparse",
"itoa",
"pin-project-lite",
"pin-utils",
···
"hyper",
"hyper-util",
"rustls",
"rustls-pki-types",
"tokio",
"tokio-rustls",
"tower-service",
]
[[package]]
name = "hyper-tls"
version = "0.6.0"
···
"windows-registry",
]
[[package]]
name = "icu_collections"
version = "2.0.0"
···
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e8a5a9a0ff0086c7a148acb942baaabeadf9504d10400b5a05645853729b9cd2"
[[package]]
name = "indexmap"
version = "2.12.0"
···
]
[[package]]
-
name = "is_terminal_polyfill"
-
version = "1.70.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
[[package]]
name = "itoa"
···
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
-
[[package]]
-
name = "jiff"
-
version = "0.2.15"
-
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "be1f93b8b1eb69c77f24bbb0afdf66f54b632ee39af40ca21c4365a1d7347e49"
-
dependencies = [
-
"jiff-static",
-
"log",
-
"portable-atomic",
-
"portable-atomic-util",
-
"serde",
-
]
-
-
[[package]]
-
name = "jiff-static"
-
version = "0.2.15"
-
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4"
-
dependencies = [
-
"proc-macro2",
-
"quote",
-
"syn",
-
]
-
[[package]]
name = "jobserver"
version = "0.1.34"
···
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388"
[[package]]
name = "libc"
version = "0.2.177"
···
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432"
[[package]]
name = "memchr"
version = "2.7.6"
···
"openssl-probe",
"openssl-sys",
"schannel",
-
"security-framework",
"security-framework-sys",
"tempfile",
]
···
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21"
[[package]]
name = "num-conv"
version = "0.1.0"
···
checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
[[package]]
-
name = "once_cell"
-
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 = "openssl"
···
]
[[package]]
-
name = "parking_lot"
-
version = "0.12.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a"
dependencies = [
-
"lock_api",
-
"parking_lot_core",
]
[[package]]
-
name = "parking_lot_core"
-
version = "0.9.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
dependencies = [
-
"cfg-if",
-
"libc",
-
"redox_syscall",
-
"smallvec",
-
"windows-link 0.2.1",
]
[[package]]
-
name = "percent-encoding"
-
version = "2.3.2"
-
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
-
-
[[package]]
-
name = "pin-project-lite"
-
version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
[[package]]
-
name = "pin-utils"
-
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
[[package]]
-
name = "pkg-config"
-
version = "0.3.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
[[package]]
-
name = "portable-atomic"
-
version = "1.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483"
[[package]]
-
name = "portable-atomic-util"
-
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507"
dependencies = [
-
"portable-atomic",
]
[[package]]
name = "potential_utf"
version = "0.1.3"
···
"unicode-ident",
]
[[package]]
name = "quanta"
version = "0.12.6"
···
"winapi",
]
[[package]]
name = "quote"
version = "1.0.41"
···
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
[[package]]
name = "rand"
version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
dependencies = [
-
"rand_chacha",
-
"rand_core",
]
[[package]]
···
checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
dependencies = [
"ppv-lite86",
-
"rand_core",
]
[[package]]
···
"base64",
"bytes",
"encoding_rs",
"futures-core",
"futures-util",
"h2 0.4.12",
···
"native-tls",
"percent-encoding",
"pin-project-lite",
"rustls-pki-types",
"serde",
"serde_json",
···
"sync_wrapper",
"tokio",
"tokio-native-tls",
-
"tower",
"tower-http",
"tower-service",
"url",
···
"windows-sys 0.52.0",
]
[[package]]
name = "rustix"
version = "1.1.2"
···
checksum = "6a9586e9ee2b4f8fab52a0048ca7334d7024eef48e2cb9407e3497bb7cab7fa7"
dependencies = [
"once_cell",
"rustls-pki-types",
"rustls-webpki",
"subtle",
"zeroize",
]
[[package]]
name = "rustls-pki-types"
version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79"
dependencies = [
"zeroize",
]
···
checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02"
dependencies = [
"bitflags",
-
"core-foundation",
"core-foundation-sys",
"libc",
"security-framework-sys",
···
"digest",
]
[[package]]
name = "shlex"
version = "1.3.0"
···
checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b"
dependencies = [
"bitflags",
-
"core-foundation",
"system-configuration-sys",
]
···
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
dependencies = [
-
"thiserror-impl",
]
[[package]]
···
"syn",
]
[[package]]
name = "time"
version = "0.3.44"
···
"zerovec",
]
[[package]]
name = "tokio"
version = "1.48.0"
···
"tokio",
]
[[package]]
name = "tokio-util"
version = "0.7.16"
···
"tokio",
]
[[package]]
name = "tower"
version = "0.5.2"
···
"http-body",
"iri-string",
"pin-project-lite",
-
"tower",
"tower-layer",
"tower-service",
]
···
checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678"
dependencies = [
"once_cell",
]
[[package]]
···
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
-
[[package]]
-
name = "utf8parse"
-
version = "0.2.2"
-
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
-
[[package]]
name = "v_htmlescape"
version = "0.15.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e8257fbc510f0a46eb602c10215901938b5c2a7d5e70fc11483b1d3c9b5b18c"
[[package]]
name = "vcpkg"
version = "0.2.15"
···
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "windows-link"
version = "0.1.3"
···
checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e"
dependencies = [
"windows-link 0.1.3",
-
"windows-result",
-
"windows-strings",
]
[[package]]
···
"windows-link 0.1.3",
]
[[package]]
name = "windows-strings"
version = "0.4.2"
···
"windows-link 0.1.3",
]
[[package]]
name = "windows-sys"
version = "0.52.0"
···
"mime",
"percent-encoding",
"pin-project-lite",
+
"rand 0.9.2",
"sha1",
"smallvec",
"tokio",
···
checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
[[package]]
+
name = "android_system_properties"
+
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
dependencies = [
+
"libc",
]
[[package]]
+
name = "anyhow"
+
version = "1.0.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61"
[[package]]
+
name = "async-stream"
+
version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476"
dependencies = [
+
"async-stream-impl",
+
"futures-core",
+
"pin-project-lite",
]
[[package]]
+
name = "async-stream-impl"
+
version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d"
dependencies = [
+
"proc-macro2",
+
"quote",
+
"syn",
]
[[package]]
+
name = "async-trait"
+
version = "0.1.89"
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
dependencies = [
+
"proc-macro2",
+
"quote",
+
"syn",
]
[[package]]
name = "atomic-waker"
version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
+
[[package]]
+
name = "autocfg"
+
version = "1.5.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
+
+
[[package]]
+
name = "axum"
+
version = "0.7.9"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f"
+
dependencies = [
+
"async-trait",
+
"axum-core",
+
"bytes",
+
"futures-util",
+
"http 1.3.1",
+
"http-body",
+
"http-body-util",
+
"itoa",
+
"matchit",
+
"memchr",
+
"mime",
+
"percent-encoding",
+
"pin-project-lite",
+
"rustversion",
+
"serde",
+
"sync_wrapper",
+
"tower 0.5.2",
+
"tower-layer",
+
"tower-service",
+
]
+
+
[[package]]
+
name = "axum-core"
+
version = "0.4.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199"
+
dependencies = [
+
"async-trait",
+
"bytes",
+
"futures-util",
+
"http 1.3.1",
+
"http-body",
+
"http-body-util",
+
"mime",
+
"pin-project-lite",
+
"rustversion",
+
"sync_wrapper",
+
"tower-layer",
+
"tower-service",
+
]
+
[[package]]
name = "base64"
version = "0.22.1"
···
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
[[package]]
+
name = "cfg_aliases"
+
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
+
+
[[package]]
+
name = "chrono"
+
version = "0.4.42"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2"
+
dependencies = [
+
"iana-time-zone",
+
"js-sys",
+
"num-traits",
+
"wasm-bindgen",
+
"windows-link 0.2.1",
+
]
[[package]]
name = "cookie"
···
"libc",
]
+
[[package]]
+
name = "core-foundation"
+
version = "0.10.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6"
+
dependencies = [
+
"core-foundation-sys",
+
"libc",
+
]
+
[[package]]
name = "core-foundation-sys"
version = "0.8.7"
···
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f"
+
[[package]]
+
name = "either"
+
version = "1.15.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
+
[[package]]
name = "encoding_rs"
version = "0.8.35"
···
"regex",
]
[[package]]
name = "equivalent"
version = "1.0.2"
···
"anyhow",
"base64",
"dotenv",
"log",
+
"logfire",
+
"opentelemetry 0.26.0",
+
"opentelemetry-instrumentation-actix-web",
+
"opentelemetry-otlp 0.26.0",
"reqwest",
"serde",
"serde_json",
+
"thiserror 1.0.69",
"tokio",
+
"tracing",
]
[[package]]
···
checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592"
dependencies = [
"cfg-if",
+
"js-sys",
"libc",
"wasi",
+
"wasm-bindgen",
]
[[package]]
···
"wasm-bindgen",
]
+
[[package]]
+
name = "glob"
+
version = "0.3.3"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280"
+
[[package]]
name = "governor"
version = "0.10.1"
···
"parking_lot",
"portable-atomic",
"quanta",
+
"rand 0.9.2",
"smallvec",
"spinning_top",
"web-time",
···
"futures-sink",
"futures-util",
"http 0.2.12",
+
"indexmap 2.12.0",
"slab",
"tokio",
"tokio-util",
···
"futures-core",
"futures-sink",
"http 1.3.1",
+
"indexmap 2.12.0",
"slab",
"tokio",
"tokio-util",
"tracing",
]
+
[[package]]
+
name = "hashbrown"
+
version = "0.12.3"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+
[[package]]
name = "hashbrown"
version = "0.14.5"
···
"http 1.3.1",
"http-body",
"httparse",
+
"httpdate",
"itoa",
"pin-project-lite",
"pin-utils",
···
"hyper",
"hyper-util",
"rustls",
+
"rustls-native-certs",
"rustls-pki-types",
"tokio",
"tokio-rustls",
"tower-service",
]
+
[[package]]
+
name = "hyper-timeout"
+
version = "0.5.2"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0"
+
dependencies = [
+
"hyper",
+
"hyper-util",
+
"pin-project-lite",
+
"tokio",
+
"tower-service",
+
]
+
[[package]]
name = "hyper-tls"
version = "0.6.0"
···
"windows-registry",
]
+
[[package]]
+
name = "iana-time-zone"
+
version = "0.1.64"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb"
+
dependencies = [
+
"android_system_properties",
+
"core-foundation-sys",
+
"iana-time-zone-haiku",
+
"js-sys",
+
"log",
+
"wasm-bindgen",
+
"windows-core",
+
]
+
+
[[package]]
+
name = "iana-time-zone-haiku"
+
version = "0.1.2"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+
dependencies = [
+
"cc",
+
]
+
[[package]]
name = "icu_collections"
version = "2.0.0"
···
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e8a5a9a0ff0086c7a148acb942baaabeadf9504d10400b5a05645853729b9cd2"
+
[[package]]
+
name = "indexmap"
+
version = "1.9.3"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
+
dependencies = [
+
"autocfg",
+
"hashbrown 0.12.3",
+
]
+
[[package]]
name = "indexmap"
version = "2.12.0"
···
]
[[package]]
+
name = "itertools"
+
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285"
+
dependencies = [
+
"either",
+
]
[[package]]
name = "itoa"
···
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
[[package]]
name = "jobserver"
version = "0.1.34"
···
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388"
+
[[package]]
+
name = "lazy_static"
+
version = "1.5.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
+
[[package]]
name = "libc"
version = "0.2.177"
···
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432"
+
[[package]]
+
name = "logfire"
+
version = "0.8.2"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "ecdeef502337c0cb7ab6646e79a8198aedddbbaa6351b6f9a2ccfb1bb0ed2cf7"
+
dependencies = [
+
"chrono",
+
"env_filter",
+
"futures-util",
+
"log",
+
"nu-ansi-term",
+
"opentelemetry 0.30.0",
+
"opentelemetry-otlp 0.30.0",
+
"opentelemetry_sdk 0.30.0",
+
"rand 0.9.2",
+
"regex",
+
"serde",
+
"serde_json",
+
"thiserror 2.0.17",
+
"tokio",
+
"tracing",
+
"tracing-opentelemetry",
+
"tracing-subscriber",
+
]
+
+
[[package]]
+
name = "lru-slab"
+
version = "0.1.2"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154"
+
+
[[package]]
+
name = "matchers"
+
version = "0.2.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9"
+
dependencies = [
+
"regex-automata",
+
]
+
+
[[package]]
+
name = "matchit"
+
version = "0.7.3"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94"
+
[[package]]
name = "memchr"
version = "2.7.6"
···
"openssl-probe",
"openssl-sys",
"schannel",
+
"security-framework 2.11.1",
"security-framework-sys",
"tempfile",
]
···
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21"
+
[[package]]
+
name = "nu-ansi-term"
+
version = "0.50.3"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5"
+
dependencies = [
+
"windows-sys 0.61.2",
+
]
+
[[package]]
name = "num-conv"
version = "0.1.0"
···
checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
[[package]]
+
name = "num-traits"
+
version = "0.2.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
+
dependencies = [
+
"autocfg",
+
]
[[package]]
+
name = "once_cell"
+
version = "1.21.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
[[package]]
name = "openssl"
···
]
[[package]]
+
name = "opentelemetry"
+
version = "0.26.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "570074cc999d1a58184080966e5bd3bf3a9a4af650c3b05047c2621e7405cd17"
dependencies = [
+
"futures-core",
+
"futures-sink",
+
"js-sys",
+
"once_cell",
+
"pin-project-lite",
+
"thiserror 1.0.69",
]
[[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"
+
version = "0.31.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "b84bcd6ae87133e903af7ef497404dda70c60d0ea14895fc8a5e6722754fc2a0"
+
dependencies = [
+
"futures-core",
+
"futures-sink",
+
"js-sys",
+
"pin-project-lite",
+
"thiserror 2.0.17",
+
"tracing",
+
]
[[package]]
+
name = "opentelemetry-http"
+
version = "0.26.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "6351496aeaa49d7c267fb480678d85d1cd30c5edb20b497c48c56f62a8c14b99"
+
dependencies = [
+
"async-trait",
+
"bytes",
+
"http 1.3.1",
+
"opentelemetry 0.26.0",
+
"reqwest",
+
]
[[package]]
+
name = "opentelemetry-http"
+
version = "0.30.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "50f6639e842a97dbea8886e3439710ae463120091e2e064518ba8e716e6ac36d"
+
dependencies = [
+
"async-trait",
+
"bytes",
+
"http 1.3.1",
+
"opentelemetry 0.30.0",
+
"reqwest",
+
]
[[package]]
+
name = "opentelemetry-instrumentation-actix-web"
+
version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "936e41b4ed3365bae2a4a9216f52d3fb9ad30e848dde33ed229c8c454ccba31d"
+
dependencies = [
+
"actix-http",
+
"actix-web",
+
"futures-util",
+
"opentelemetry 0.31.0",
+
"opentelemetry-semantic-conventions",
+
"serde",
+
]
[[package]]
+
name = "opentelemetry-otlp"
+
version = "0.26.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "29e1f9c8b032d4f635c730c0efcf731d5e2530ea13fa8bef7939ddc8420696bd"
dependencies = [
+
"async-trait",
+
"futures-core",
+
"http 1.3.1",
+
"opentelemetry 0.26.0",
+
"opentelemetry-http 0.26.0",
+
"opentelemetry-proto 0.26.1",
+
"opentelemetry_sdk 0.26.0",
+
"prost",
+
"reqwest",
+
"thiserror 1.0.69",
+
"tokio",
+
"tonic 0.12.3",
+
]
+
+
[[package]]
+
name = "opentelemetry-otlp"
+
version = "0.30.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "dbee664a43e07615731afc539ca60c6d9f1a9425e25ca09c57bc36c87c55852b"
+
dependencies = [
+
"http 1.3.1",
+
"opentelemetry 0.30.0",
+
"opentelemetry-http 0.30.0",
+
"opentelemetry-proto 0.30.0",
+
"opentelemetry_sdk 0.30.0",
+
"prost",
+
"reqwest",
+
"thiserror 2.0.17",
+
]
+
+
[[package]]
+
name = "opentelemetry-proto"
+
version = "0.26.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "c9d3968ce3aefdcca5c27e3c4ea4391b37547726a70893aab52d3de95d5f8b34"
+
dependencies = [
+
"opentelemetry 0.26.0",
+
"opentelemetry_sdk 0.26.0",
+
"prost",
+
"tonic 0.12.3",
+
]
+
+
[[package]]
+
name = "opentelemetry-proto"
+
version = "0.30.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "2e046fd7660710fe5a05e8748e70d9058dc15c94ba914e7c4faa7c728f0e8ddc"
+
dependencies = [
+
"opentelemetry 0.30.0",
+
"opentelemetry_sdk 0.30.0",
+
"prost",
+
"tonic 0.13.1",
+
]
+
+
[[package]]
+
name = "opentelemetry-semantic-conventions"
+
version = "0.31.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "e62e29dfe041afb8ed2a6c9737ab57db4907285d999ef8ad3a59092a36bdc846"
+
+
[[package]]
+
name = "opentelemetry_sdk"
+
version = "0.26.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "d2c627d9f4c9cdc1f21a29ee4bfbd6028fcb8bcf2a857b43f3abdf72c9c862f3"
+
dependencies = [
+
"async-trait",
+
"futures-channel",
+
"futures-executor",
+
"futures-util",
+
"glob",
+
"once_cell",
+
"opentelemetry 0.26.0",
+
"percent-encoding",
+
"rand 0.8.5",
+
"serde_json",
+
"thiserror 1.0.69",
+
]
+
+
[[package]]
+
name = "opentelemetry_sdk"
+
version = "0.30.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "11f644aa9e5e31d11896e024305d7e3c98a88884d9f8919dbf37a9991bc47a4b"
+
dependencies = [
+
"futures-channel",
+
"futures-executor",
+
"futures-util",
+
"opentelemetry 0.30.0",
+
"percent-encoding",
+
"rand 0.9.2",
+
"serde_json",
+
"thiserror 2.0.17",
+
"tokio",
+
"tokio-stream",
+
]
+
+
[[package]]
+
name = "parking_lot"
+
version = "0.12.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a"
+
dependencies = [
+
"lock_api",
+
"parking_lot_core",
+
]
+
+
[[package]]
+
name = "parking_lot_core"
+
version = "0.9.12"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
+
dependencies = [
+
"cfg-if",
+
"libc",
+
"redox_syscall",
+
"smallvec",
+
"windows-link 0.2.1",
+
]
+
+
[[package]]
+
name = "percent-encoding"
+
version = "2.3.2"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
+
+
[[package]]
+
name = "pin-project"
+
version = "1.1.10"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a"
+
dependencies = [
+
"pin-project-internal",
+
]
+
+
[[package]]
+
name = "pin-project-internal"
+
version = "1.1.10"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861"
+
dependencies = [
+
"proc-macro2",
+
"quote",
+
"syn",
]
+
[[package]]
+
name = "pin-project-lite"
+
version = "0.2.16"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
+
+
[[package]]
+
name = "pin-utils"
+
version = "0.1.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
+
[[package]]
+
name = "pkg-config"
+
version = "0.3.32"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
+
+
[[package]]
+
name = "portable-atomic"
+
version = "1.11.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483"
+
[[package]]
name = "potential_utf"
version = "0.1.3"
···
"unicode-ident",
]
+
[[package]]
+
name = "prost"
+
version = "0.13.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5"
+
dependencies = [
+
"bytes",
+
"prost-derive",
+
]
+
+
[[package]]
+
name = "prost-derive"
+
version = "0.13.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d"
+
dependencies = [
+
"anyhow",
+
"itertools",
+
"proc-macro2",
+
"quote",
+
"syn",
+
]
+
[[package]]
name = "quanta"
version = "0.12.6"
···
"winapi",
]
+
[[package]]
+
name = "quinn"
+
version = "0.11.9"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20"
+
dependencies = [
+
"bytes",
+
"cfg_aliases",
+
"pin-project-lite",
+
"quinn-proto",
+
"quinn-udp",
+
"rustc-hash",
+
"rustls",
+
"socket2 0.6.1",
+
"thiserror 2.0.17",
+
"tokio",
+
"tracing",
+
"web-time",
+
]
+
+
[[package]]
+
name = "quinn-proto"
+
version = "0.11.13"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31"
+
dependencies = [
+
"bytes",
+
"getrandom 0.3.4",
+
"lru-slab",
+
"rand 0.9.2",
+
"ring",
+
"rustc-hash",
+
"rustls",
+
"rustls-pki-types",
+
"slab",
+
"thiserror 2.0.17",
+
"tinyvec",
+
"tracing",
+
"web-time",
+
]
+
+
[[package]]
+
name = "quinn-udp"
+
version = "0.5.14"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd"
+
dependencies = [
+
"cfg_aliases",
+
"libc",
+
"once_cell",
+
"socket2 0.6.1",
+
"tracing",
+
"windows-sys 0.60.2",
+
]
+
[[package]]
name = "quote"
version = "1.0.41"
···
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
+
[[package]]
+
name = "rand"
+
version = "0.8.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+
dependencies = [
+
"libc",
+
"rand_chacha 0.3.1",
+
"rand_core 0.6.4",
+
]
+
[[package]]
name = "rand"
version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
dependencies = [
+
"rand_chacha 0.9.0",
+
"rand_core 0.9.3",
+
]
+
+
[[package]]
+
name = "rand_chacha"
+
version = "0.3.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+
dependencies = [
+
"ppv-lite86",
+
"rand_core 0.6.4",
]
[[package]]
···
checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
dependencies = [
"ppv-lite86",
+
"rand_core 0.9.3",
+
]
+
+
[[package]]
+
name = "rand_core"
+
version = "0.6.4"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+
dependencies = [
+
"getrandom 0.2.16",
]
[[package]]
···
"base64",
"bytes",
"encoding_rs",
+
"futures-channel",
"futures-core",
"futures-util",
"h2 0.4.12",
···
"native-tls",
"percent-encoding",
"pin-project-lite",
+
"quinn",
+
"rustls",
+
"rustls-native-certs",
"rustls-pki-types",
"serde",
"serde_json",
···
"sync_wrapper",
"tokio",
"tokio-native-tls",
+
"tokio-rustls",
+
"tower 0.5.2",
"tower-http",
"tower-service",
"url",
···
"windows-sys 0.52.0",
]
+
[[package]]
+
name = "rustc-hash"
+
version = "2.1.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d"
+
[[package]]
name = "rustix"
version = "1.1.2"
···
checksum = "6a9586e9ee2b4f8fab52a0048ca7334d7024eef48e2cb9407e3497bb7cab7fa7"
dependencies = [
"once_cell",
+
"ring",
"rustls-pki-types",
"rustls-webpki",
"subtle",
"zeroize",
]
+
[[package]]
+
name = "rustls-native-certs"
+
version = "0.8.2"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923"
+
dependencies = [
+
"openssl-probe",
+
"rustls-pki-types",
+
"schannel",
+
"security-framework 3.5.1",
+
]
+
[[package]]
name = "rustls-pki-types"
version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79"
dependencies = [
+
"web-time",
"zeroize",
]
···
checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02"
dependencies = [
"bitflags",
+
"core-foundation 0.9.4",
+
"core-foundation-sys",
+
"libc",
+
"security-framework-sys",
+
]
+
+
[[package]]
+
name = "security-framework"
+
version = "3.5.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef"
+
dependencies = [
+
"bitflags",
+
"core-foundation 0.10.1",
"core-foundation-sys",
"libc",
"security-framework-sys",
···
"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"
···
checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b"
dependencies = [
"bitflags",
+
"core-foundation 0.9.4",
"system-configuration-sys",
]
···
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 = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8"
+
dependencies = [
+
"thiserror-impl 2.0.17",
]
[[package]]
···
"syn",
]
+
[[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",
+
]
+
+
[[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 = "time"
version = "0.3.44"
···
"zerovec",
]
+
[[package]]
+
name = "tinyvec"
+
version = "1.10.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa"
+
dependencies = [
+
"tinyvec_macros",
+
]
+
+
[[package]]
+
name = "tinyvec_macros"
+
version = "0.1.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
+
[[package]]
name = "tokio"
version = "1.48.0"
···
"tokio",
]
+
[[package]]
+
name = "tokio-stream"
+
version = "0.1.17"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047"
+
dependencies = [
+
"futures-core",
+
"pin-project-lite",
+
"tokio",
+
]
+
[[package]]
name = "tokio-util"
version = "0.7.16"
···
"tokio",
]
+
[[package]]
+
name = "tonic"
+
version = "0.12.3"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52"
+
dependencies = [
+
"async-stream",
+
"async-trait",
+
"axum",
+
"base64",
+
"bytes",
+
"h2 0.4.12",
+
"http 1.3.1",
+
"http-body",
+
"http-body-util",
+
"hyper",
+
"hyper-timeout",
+
"hyper-util",
+
"percent-encoding",
+
"pin-project",
+
"prost",
+
"socket2 0.5.10",
+
"tokio",
+
"tokio-stream",
+
"tower 0.4.13",
+
"tower-layer",
+
"tower-service",
+
"tracing",
+
]
+
+
[[package]]
+
name = "tonic"
+
version = "0.13.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "7e581ba15a835f4d9ea06c55ab1bd4dce26fc53752c69a04aac00703bfb49ba9"
+
dependencies = [
+
"async-trait",
+
"base64",
+
"bytes",
+
"http 1.3.1",
+
"http-body",
+
"http-body-util",
+
"percent-encoding",
+
"pin-project",
+
"prost",
+
"tokio-stream",
+
"tower-layer",
+
"tower-service",
+
"tracing",
+
]
+
+
[[package]]
+
name = "tower"
+
version = "0.4.13"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c"
+
dependencies = [
+
"futures-core",
+
"futures-util",
+
"indexmap 1.9.3",
+
"pin-project",
+
"pin-project-lite",
+
"rand 0.8.5",
+
"slab",
+
"tokio",
+
"tokio-util",
+
"tower-layer",
+
"tower-service",
+
"tracing",
+
]
+
[[package]]
name = "tower"
version = "0.5.2"
···
"http-body",
"iri-string",
"pin-project-lite",
+
"tower 0.5.2",
"tower-layer",
"tower-service",
]
···
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 0.30.0",
+
"opentelemetry_sdk 0.30.0",
+
"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 = [
+
"matchers",
+
"nu-ansi-term",
+
"once_cell",
+
"regex-automata",
+
"sharded-slab",
+
"smallvec",
+
"thread_local",
+
"tracing",
+
"tracing-core",
+
"tracing-log",
]
[[package]]
···
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
[[package]]
name = "v_htmlescape"
version = "0.15.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e8257fbc510f0a46eb602c10215901938b5c2a7d5e70fc11483b1d3c9b5b18c"
+
[[package]]
+
name = "valuable"
+
version = "0.1.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65"
+
[[package]]
name = "vcpkg"
version = "0.2.15"
···
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+
[[package]]
+
name = "windows-core"
+
version = "0.62.2"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb"
+
dependencies = [
+
"windows-implement",
+
"windows-interface",
+
"windows-link 0.2.1",
+
"windows-result 0.4.1",
+
"windows-strings 0.5.1",
+
]
+
+
[[package]]
+
name = "windows-implement"
+
version = "0.60.2"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
+
dependencies = [
+
"proc-macro2",
+
"quote",
+
"syn",
+
]
+
+
[[package]]
+
name = "windows-interface"
+
version = "0.59.3"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
+
dependencies = [
+
"proc-macro2",
+
"quote",
+
"syn",
+
]
+
[[package]]
name = "windows-link"
version = "0.1.3"
···
checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e"
dependencies = [
"windows-link 0.1.3",
+
"windows-result 0.3.4",
+
"windows-strings 0.4.2",
]
[[package]]
···
"windows-link 0.1.3",
]
+
[[package]]
+
name = "windows-result"
+
version = "0.4.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5"
+
dependencies = [
+
"windows-link 0.2.1",
+
]
+
[[package]]
name = "windows-strings"
version = "0.4.2"
···
"windows-link 0.1.3",
]
+
[[package]]
+
name = "windows-strings"
+
version = "0.5.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091"
+
dependencies = [
+
"windows-link 0.2.1",
+
]
+
[[package]]
name = "windows-sys"
version = "0.52.0"
+8 -2
Cargo.toml
···
anyhow = "1.0"
thiserror = "1.0"
dotenv = "0.15"
-
env_logger = "0.11"
-
log = "0.4"
base64 = "0.22"
actix-governor = "0.10.0"
···
anyhow = "1.0"
thiserror = "1.0"
dotenv = "0.15"
base64 = "0.22"
actix-governor = "0.10.0"
+
+
# observability with logfire
+
logfire = "0.8"
+
tracing = "0.1"
+
log = "0.4" # keep for compatibility with existing debug logs
+
opentelemetry = { version = "0.26", features = ["trace", "metrics"] }
+
opentelemetry-instrumentation-actix-web = { version = "0.23", features = ["metrics"] }
+
opentelemetry-otlp = { version = "0.26", features = ["trace", "http-proto", "reqwest-client", "reqwest-rustls"] }
+16 -2
src/main.rs
···
use actix_web::{middleware, web, App, HttpResponse, HttpServer};
use anyhow::Result;
use config::Config;
async fn index() -> HttpResponse {
HttpResponse::Ok()
···
#[actix_web::main]
async fn main() -> Result<()> {
dotenv::dotenv().ok();
-
env_logger::init();
let config = Config::from_env()?;
let host = config.host.clone();
let port = config.port;
-
log::info!("starting bufo search server on {}:{}", host, port);
// rate limiter: 10 requests per minute per IP
let governor_conf = GovernorConfigBuilder::default()
···
let cors = Cors::permissive();
App::new()
.wrap(middleware::Logger::default())
.wrap(cors)
.app_data(web::Data::new(config.clone()))
···
use actix_web::{middleware, web, App, HttpResponse, HttpServer};
use anyhow::Result;
use config::Config;
+
use opentelemetry_instrumentation_actix_web::{RequestMetrics, RequestTracing};
async fn index() -> HttpResponse {
HttpResponse::Ok()
···
#[actix_web::main]
async fn main() -> Result<()> {
dotenv::dotenv().ok();
+
+
// initialize logfire
+
let logfire = logfire::configure()
+
.finish()
+
.map_err(|e| anyhow::anyhow!("failed to initialize logfire: {}", e))?;
+
+
let _guard = logfire.shutdown_guard();
let config = Config::from_env()?;
let host = config.host.clone();
let port = config.port;
+
logfire::info!("starting bufo search server",
+
host = &host,
+
port = port as i64
+
);
// rate limiter: 10 requests per minute per IP
let governor_conf = GovernorConfigBuilder::default()
···
let cors = Cors::permissive();
App::new()
+
// opentelemetry tracing and metrics FIRST
+
.wrap(RequestTracing::new())
+
.wrap(RequestMetrics::default())
+
// existing middleware
.wrap(middleware::Logger::default())
.wrap(cors)
.app_data(web::Data::new(config.clone()))
+52 -29
src/search.rs
···
use crate::turbopuffer::{QueryRequest, TurbopufferClient};
use actix_web::{web, HttpResponse, Result as ActixResult};
use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize)]
pub struct SearchQuery {
···
pub score: f32, // normalized 0-1 score for display
}
pub async fn search(
query: web::Json<SearchQuery>,
config: web::Data<Config>,
···
config.turbopuffer_namespace.clone(),
);
-
// Run vector search
-
let query_embedding = embedding_client
-
.embed_text(&query.query)
-
.await
-
.map_err(|e| {
-
log::error!("failed to generate embedding: {}", e);
-
actix_web::error::ErrorInternalServerError(format!(
-
"failed to generate embedding: {}",
-
e
-
))
-
})?;
let vector_request = QueryRequest {
rank_by: vec![
···
include_attributes: Some(vec!["url".to_string(), "name".to_string(), "filename".to_string()]),
};
-
let vector_results = tpuf_client.query(vector_request).await.map_err(|e| {
-
log::error!("failed to query turbopuffer (vector): {}", e);
-
actix_web::error::ErrorInternalServerError(format!(
-
"failed to query turbopuffer (vector): {}",
-
e
-
))
-
})?;
-
-
// Run BM25 text search
-
let bm25_results = tpuf_client.bm25_query(&query.query, query.top_k * 2).await.map_err(|e| {
-
log::error!("failed to query turbopuffer (BM25): {}", e);
-
actix_web::error::ErrorInternalServerError(format!(
-
"failed to query turbopuffer (BM25): {}",
-
e
-
))
-
})?;
-
-
// Combine results using Reciprocal Rank Fusion (RRF)
use std::collections::HashMap;
let mut rrf_scores: HashMap<String, f32> = HashMap::new();
let k = 60.0; // RRF constant
···
})
.collect();
Ok(HttpResponse::Ok().json(SearchResponse { results }))
}
···
use crate::turbopuffer::{QueryRequest, TurbopufferClient};
use actix_web::{web, HttpResponse, Result as ActixResult};
use serde::{Deserialize, Serialize};
+
use tracing::instrument;
#[derive(Debug, Deserialize)]
pub struct SearchQuery {
···
pub score: f32, // normalized 0-1 score for display
}
+
#[instrument(skip(config), fields(query = %query.query, top_k = query.top_k))]
pub async fn search(
query: web::Json<SearchQuery>,
config: web::Data<Config>,
···
config.turbopuffer_namespace.clone(),
);
+
// run vector search
+
let query_embedding = {
+
let _span = logfire::span!("generate_embedding", query = &query.query);
+
embedding_client
+
.embed_text(&query.query)
+
.await
+
.map_err(|e| {
+
logfire::error!("failed to generate embedding", error = e.to_string());
+
actix_web::error::ErrorInternalServerError(format!(
+
"failed to generate embedding: {}",
+
e
+
))
+
})?
+
};
let vector_request = QueryRequest {
rank_by: vec![
···
include_attributes: Some(vec!["url".to_string(), "name".to_string(), "filename".to_string()]),
};
+
let vector_results = {
+
let _span = logfire::span!("vector_search", top_k = query.top_k * 2);
+
tpuf_client.query(vector_request).await.map_err(|e| {
+
logfire::error!("vector search failed", error = e.to_string());
+
actix_web::error::ErrorInternalServerError(format!(
+
"failed to query turbopuffer (vector): {}",
+
e
+
))
+
})?
+
};
+
+
// run BM25 text search
+
let bm25_top_k = query.top_k * 2;
+
let bm25_results = {
+
let _span = logfire::span!("bm25_search", query = &query.query, top_k = bm25_top_k as i64);
+
tpuf_client.bm25_query(&query.query, bm25_top_k).await.map_err(|e| {
+
logfire::error!("bm25 search failed", error = e.to_string());
+
actix_web::error::ErrorInternalServerError(format!(
+
"failed to query turbopuffer (BM25): {}",
+
e
+
))
+
})?
+
};
+
+
// combine results using Reciprocal Rank Fusion (RRF)
+
let _span = logfire::span!("reciprocal_rank_fusion",
+
vector_results = vector_results.len(),
+
bm25_results = bm25_results.len()
+
);
+
use std::collections::HashMap;
let mut rrf_scores: HashMap<String, f32> = HashMap::new();
let k = 60.0; // RRF constant
···
})
.collect();
+
logfire::info!("search completed",
+
query = &query.query,
+
results_count = results.len() as i64,
+
top_score = results.first().map(|r| r.score as f64).unwrap_or(0.0)
+
);
+
Ok(HttpResponse::Ok().json(SearchResponse { results }))
}
-35
src/turbopuffer.rs
···
use reqwest::Client;
use serde::{Deserialize, Serialize};
-
#[derive(Debug, Serialize)]
-
pub struct UpsertRequest {
-
pub ids: Vec<String>,
-
pub vectors: Vec<Vec<f32>>,
-
pub attributes: serde_json::Value,
-
}
-
#[derive(Debug, Serialize)]
pub struct QueryRequest {
pub rank_by: Vec<serde_json::Value>,
···
}
}
-
pub async fn upsert(&self, request: UpsertRequest) -> Result<()> {
-
let url = format!(
-
"https://api.turbopuffer.com/v1/vectors/{}",
-
self.namespace
-
);
-
-
let response = self
-
.client
-
.post(&url)
-
.header("Authorization", format!("Bearer {}", self.api_key))
-
.json(&request)
-
.send()
-
.await
-
.context("failed to send upsert request")?;
-
-
if !response.status().is_success() {
-
let status = response.status();
-
let body = response.text().await.unwrap_or_default();
-
anyhow::bail!(
-
"turbopuffer upsert failed with status {}: {}",
-
status,
-
body
-
);
-
}
-
-
Ok(())
-
}
-
pub async fn query(&self, request: QueryRequest) -> Result<QueryResponse> {
let url = format!(
"https://api.turbopuffer.com/v1/vectors/{}/query",
···
use reqwest::Client;
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize)]
pub struct QueryRequest {
pub rank_by: Vec<serde_json::Value>,
···
}
}
pub async fn query(&self, request: QueryRequest) -> Result<QueryResponse> {
let url = format!(
"https://api.turbopuffer.com/v1/vectors/{}/query",