diff --git a/Cargo.lock b/Cargo.lock index 2a8663d..c4f7c3b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,21 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "aho-corasick" version = "1.1.2" @@ -157,6 +172,21 @@ dependencies = [ "tracing", ] +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "base64" version = "0.21.0" @@ -183,9 +213,9 @@ checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "bytes" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "cc" @@ -431,6 +461,12 @@ dependencies = [ "wasi", ] +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + [[package]] name = "glob" version = "0.3.1" @@ -807,16 +843,24 @@ version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + [[package]] name = "mio" -version = "0.8.6" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" dependencies = [ "libc", - "log", "wasi", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] @@ -866,6 +910,15 @@ dependencies = [ "libc", ] +[[package]] +name = "object" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.17.1" @@ -942,8 +995,10 @@ dependencies = [ "async-trait", "bytes", "http 0.2.9", + "hyper 0.14.25", "opentelemetry", "reqwest", + "tokio", ] [[package]] @@ -1089,9 +1144,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pin-utils" @@ -1307,6 +1362,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + [[package]] name = "rustc_version" version = "0.4.0" @@ -1526,6 +1587,7 @@ dependencies = [ "futures-util", "http 1.0.0", "http-body-util", + "hyper 0.14.25", "hyper 1.1.0", "opentelemetry", "opentelemetry-http", @@ -1606,20 +1668,19 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.26.0" +version = "1.35.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03201d01c3c27a29c8a5cee5b55a93ddae1ccf6f08f65365c2c918f8c1b76f64" +checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" dependencies = [ - "autocfg", + "backtrace", "bytes", "libc", - "memchr", "mio", "num_cpus", "pin-project-lite", - "socket2 0.4.9", + "socket2 0.5.5", "tokio-macros", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] @@ -1634,13 +1695,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "1.8.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.48", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index a2e69ee..d5f40ea 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ opentelemetry = { version = "0.21.0", default-features = false, features = [ "trace", ] } tracing-opentelemetry = "0.22" -opentelemetry-http = "0.10.0" +opentelemetry-http = { version = "0.10.0", optional = true, features = ["hyper", "tokio"] } opentelemetry-otlp = { version = "0.14", optional = true, features = ["http-proto"] } opentelemetry-zipkin = { version = "0.19", features = [], optional = true } opentelemetry_sdk = { version = "0.21", default-features = false, features = [ @@ -34,7 +34,8 @@ tower = { version = "0.4", optional = true } axum = { version = "0.7.4", optional = true } pin-project-lite = { version = "0.2", optional = true } futures-util = { version = "0.3", default_features = false, features = [], optional = true } -hyper = { version = "1.1.0", default-features = false, features = ["http1", "client"], optional = true } +hyper = { version = "0.14", default-features = false, features = ["http1", "client"], optional = true } +hyper-v1 = { package = "hyper", version = "1.1", default-features = false, features = ["http1", "client"], optional = true } http-body-util = { version = "0.1.0", optional = true } [dev-dependencies] @@ -42,13 +43,14 @@ assert2 = "0.3" rstest = "0.18" [features] -full = ["integration_test"] +full = ["test"] default = ["otlp", "zipkin"] zipkin = ["dep:opentelemetry-zipkin"] -otlp = ["opentelemetry-otlp/http-proto", "tracer", "dep:tracing-opentelemetry-instrumentation-sdk"] +otlp = ["opentelemetry-otlp/http-proto", "tracer", "dep:tracing-opentelemetry-instrumentation-sdk", "dep:opentelemetry-http", "dep:hyper"] tracer = ["dep:opentelemetry-semantic-conventions"] -integration_test = ["axum", "dep:serde", "dep:serde_json", "dep:opentelemetry_api", "dep:rand", "dep:hyper", "dep:http-body-util"] +test = ["axum", "dep:serde", "dep:serde_json", "dep:opentelemetry_api", "dep:rand", "dep:hyper"] axum = ["dep:axum", "dep:tower", "dep:futures-util", "dep:pin-project-lite", "dep:tracing-opentelemetry-instrumentation-sdk"] +hyper-v1 = ["dep:hyper-v1", "dep:http-body-util"] [profile.dev] lto = false diff --git a/src/lib.rs b/src/lib.rs index 0bb6e3c..e71c646 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -23,7 +23,7 @@ pub use tracing_opentelemetry_instrumentation_sdk; #[cfg(feature = "otlp")] pub mod otlp; -#[cfg(feature = "integration_test")] +#[cfg(feature = "test")] pub mod test; mod filter; diff --git a/src/otlp.rs b/src/otlp.rs index 08e3053..ba2ee7c 100644 --- a/src/otlp.rs +++ b/src/otlp.rs @@ -5,11 +5,13 @@ use std::{collections::HashMap, str::FromStr}; use opentelemetry::trace::TraceError; +use opentelemetry_http::hyper::HyperClient; use opentelemetry_otlp::SpanExporterBuilder; use opentelemetry_sdk::{ trace::{Sampler, Tracer}, Resource, }; +use std::time::Duration; use tracing::Level; #[must_use] @@ -36,6 +38,10 @@ where let exporter: SpanExporterBuilder = match protocol.as_str() { "http/protobuf" => opentelemetry_otlp::new_exporter() .http() + .with_http_client(HyperClient::new_with_timeout( + hyper::Client::new(), + Duration::from_millis(1500), // TODO: make configurable + )) .with_endpoint(endpoint) .with_headers(read_headers_from_env()) .into(), diff --git a/src/test/mod.rs b/src/test/mod.rs index edb83d0..89604cf 100644 --- a/src/test/mod.rs +++ b/src/test/mod.rs @@ -1,19 +1,29 @@ pub mod jaegar; +#[cfg(feature = "hyper-v1")] use http_body_util::BodyExt; -use hyper::{header::HeaderValue, HeaderMap, Response}; +#[cfg(not(feature = "hyper-v1"))] +use hyper::{body::Bytes, header::HeaderValue, HeaderMap, Result}; +#[cfg(feature = "hyper-v1")] +use hyper_v1::{header::HeaderValue, HeaderMap, Result}; + pub use opentelemetry_api::trace::{SpanId, TraceId}; use rand::Rng; +#[cfg(feature = "hyper-v1")] +type Response = hyper_v1::Response; +#[cfg(not(feature = "hyper-v1"))] +type Response = hyper::Response; + #[derive(Debug)] pub struct TracedResponse { - resp: Response, + resp: Response, pub trace_id: TraceId, pub span_id: SpanId, } impl TracedResponse { - pub fn new(resp: Response, traceparent: Traceparent) -> Self { + pub fn new(resp: Response, traceparent: Traceparent) -> Self { Self { resp, trace_id: traceparent.trace_id, @@ -21,14 +31,24 @@ impl TracedResponse { } } - #[cfg(feature = "axum")] - pub async fn into_axum_bytes(self) -> hyper::Result { + #[cfg(not(feature = "hyper-v1"))] + pub async fn get_bytes(&mut self) -> Result { + hyper::body::to_bytes(self.body_mut()).await + } + + #[cfg(not(feature = "hyper-v1"))] + pub async fn into_bytes(self) -> Result { + hyper::body::to_bytes(self.resp).await + } + + #[cfg(all(feature = "axum", feature = "hyper-v1"))] + pub async fn into_axum_bytes(self) -> Result { Ok(self.resp.into_body().collect().await?.to_bytes()) } } impl std::ops::Deref for TracedResponse { - type Target = Response; + type Target = Response; fn deref(&self) -> &Self::Target { &self.resp