diff --git a/Cargo.toml b/Cargo.toml index 88ecb078..437900be 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,6 +12,10 @@ members = [ # "opentelemetry-zpages", "examples/traceresponse", ] +exclude = [ + "opentelemetry-datadog", + "opentelemetry-stackdriver", +] resolver = "2" [profile.bench] diff --git a/opentelemetry-contrib/Cargo.toml b/opentelemetry-contrib/Cargo.toml index b860bc9c..8207ccc7 100644 --- a/opentelemetry-contrib/Cargo.toml +++ b/opentelemetry-contrib/Cargo.toml @@ -23,7 +23,7 @@ api = [] default = [] base64_format = ["base64", "binary_propagator"] binary_propagator = [] -jaeger_json_exporter = ["serde_json", "futures-core", "futures-util", "async-trait", "opentelemetry-semantic-conventions"] +jaeger_json_exporter = ["opentelemetry_sdk", "serde_json", "futures-core", "futures-util", "async-trait", "opentelemetry-semantic-conventions"] rt-tokio = ["tokio", "opentelemetry_sdk/rt-tokio"] rt-tokio-current-thread = ["tokio", "opentelemetry_sdk/rt-tokio-current-thread"] rt-async-std = ["async-std", "opentelemetry_sdk/rt-async-std"] diff --git a/opentelemetry-contrib/src/trace/exporter/jaeger_json.rs b/opentelemetry-contrib/src/trace/exporter/jaeger_json.rs index 38b25aa0..22ad2a60 100644 --- a/opentelemetry-contrib/src/trace/exporter/jaeger_json.rs +++ b/opentelemetry-contrib/src/trace/exporter/jaeger_json.rs @@ -4,7 +4,13 @@ use async_trait::async_trait; use futures_core::future::BoxFuture; use futures_util::FutureExt; -use opentelemetry::trace::{SpanId, TraceError}; +use opentelemetry::trace::SpanId; +#[cfg(any( + feature = "rt-tokio", + feature = "rt-async-std", + feature = "rt-tokio-current-thread" +))] +use opentelemetry::trace::TraceError; use opentelemetry_sdk::{ export::trace::{ExportResult, SpanData, SpanExporter}, runtime::RuntimeChannel, diff --git a/opentelemetry-datadog/Cargo.toml b/opentelemetry-datadog/Cargo.toml index abdd5204..93078f1e 100644 --- a/opentelemetry-datadog/Cargo.toml +++ b/opentelemetry-datadog/Cargo.toml @@ -46,7 +46,7 @@ base64 = "0.13" bytes = "1" futures-util = { version = "0.3", default-features = false, features = ["io"] } isahc = "1.4" -opentelemetry_sdk = { version = "0.21", features = ["trace", "testing"] } +opentelemetry_sdk = { git = "https://github.com/open-telemetry/opentelemetry-rust.git", branch = "main" , features = ["trace", "testing"] } [[example]] name = "datadog" diff --git a/opentelemetry-datadog/src/exporter/mod.rs b/opentelemetry-datadog/src/exporter/mod.rs index 9b071833..576b5cb2 100644 --- a/opentelemetry-datadog/src/exporter/mod.rs +++ b/opentelemetry-datadog/src/exporter/mod.rs @@ -212,7 +212,7 @@ impl DatadogPipelineBuilder { cfg.resource = Cow::Owned(Resource::new( cfg.resource .iter() - .filter(|(k, _v)| **k != semcov::resource::SERVICE_NAME) + .filter(|(k, _v)| k.as_str() != semcov::resource::SERVICE_NAME) .map(|(k, v)| KeyValue::new(k.clone(), v.clone())), )); cfg @@ -226,7 +226,7 @@ impl DatadogPipelineBuilder { } else { let service_name = SdkProvidedResourceDetector .detect(Duration::from_secs(0)) - .get(semcov::resource::SERVICE_NAME) + .get(semcov::resource::SERVICE_NAME.into()) .unwrap() .to_string(); ( diff --git a/opentelemetry-stackdriver/src/lib.rs b/opentelemetry-stackdriver/src/lib.rs index af6232f5..960c551b 100644 --- a/opentelemetry-stackdriver/src/lib.rs +++ b/opentelemetry-stackdriver/src/lib.rs @@ -37,10 +37,7 @@ use opentelemetry_sdk::{ }, Resource, }; -use opentelemetry_semantic_conventions::resource::SERVICE_NAME; -use opentelemetry_semantic_conventions::trace::{ - HTTP_METHOD, HTTP_ROUTE, HTTP_STATUS_CODE, HTTP_TARGET, HTTP_URL, -}; +use opentelemetry_semantic_conventions as semconv; use thiserror::Error; #[cfg(any(feature = "yup-authorizer", feature = "gcp_auth"))] use tonic::metadata::MetadataValue; @@ -54,8 +51,11 @@ use yup_oauth2::authenticator::Authenticator; #[allow(clippy::derive_partial_eq_without_eq)] // tonic doesn't derive Eq for generated types pub mod proto; -const HTTP_HOST: Key = Key::from_static_str("http.host"); -const HTTP_USER_AGENT: Key = Key::from_static_str("http.user_agent"); +const HTTP_HOST: &str = "http.host"; +const HTTP_PATH: &str = "http.path"; +const HTTP_USER_AGENT: &str = "http.user_agent"; + +const GCP_HTTP_PATH: &str = "/http/path"; use proto::devtools::cloudtrace::v2::span::time_event::Annotation; use proto::devtools::cloudtrace::v2::span::{ @@ -738,14 +738,14 @@ impl From<(Vec, &Resource)> for Attributes { return None; } - if k == SERVICE_NAME { + if k.as_str() == semconv::resource::SERVICE_NAME { return Some((GCP_SERVICE_NAME.to_owned(), v.into())); - } else if key == HTTP_PATH_ATTRIBUTE { + } else if key == HTTP_PATH { return Some((GCP_HTTP_PATH.to_owned(), v.into())); } for (otel_key, gcp_key) in KEY_MAP { - if otel_key == &k { + if otel_key == k.as_str() { return Some((gcp_key.to_owned(), v.into())); } } @@ -783,14 +783,15 @@ fn transform_links(links: &opentelemetry_sdk::trace::SpanLinks) -> Option } // Map conventional OpenTelemetry keys to their GCP counterparts. -const KEY_MAP: [(&Key, &str); 7] = [ - (&HTTP_HOST, "/http/host"), - (&HTTP_METHOD, "/http/method"), - (&HTTP_TARGET, "/http/path"), - (&HTTP_URL, "/http/url"), - (&HTTP_USER_AGENT, "/http/user_agent"), - (&HTTP_STATUS_CODE, "/http/status_code"), - (&HTTP_ROUTE, "/http/route"), +const KEY_MAP: [(&str, &str); 8] = [ + (HTTP_HOST, "/http/host"), + (semconv::trace::HTTP_METHOD, "/http/method"), + (semconv::trace::HTTP_TARGET, "/http/path"), + (semconv::trace::HTTP_URL, "/http/url"), + (HTTP_USER_AGENT, "/http/user_agent"), + (semconv::trace::HTTP_STATUS_CODE, "/http/status_code"), + (semconv::trace::HTTP_ROUTE, "/http/route"), + (HTTP_PATH, GCP_HTTP_PATH), ]; impl From for SpanKind { @@ -822,8 +823,6 @@ fn status(value: opentelemetry::trace::Status) -> Option { } const TRACE_APPEND: &str = "https://www.googleapis.com/auth/trace.append"; const LOGGING_WRITE: &str = "https://www.googleapis.com/auth/logging.write"; -const HTTP_PATH_ATTRIBUTE: &str = "http.path"; -const GCP_HTTP_PATH: &str = "/http/path"; const GCP_SERVICE_NAME: &str = "g.co/gae/app/module"; const MAX_ATTRIBUTES_PER_SPAN: usize = 32; @@ -839,33 +838,40 @@ mod tests { let mut attributes = Vec::with_capacity(capacity); // hostAttribute = "http.host" - attributes.push(HTTP_HOST.string("example.com:8080")); + attributes.push(KeyValue::new(HTTP_HOST, "example.com:8080")); // methodAttribute = "http.method" - attributes.push(semcov::trace::HTTP_METHOD.string("POST")); + attributes.push(KeyValue::new(semcov::trace::HTTP_METHOD, "POST")); // pathAttribute = "http.path" - attributes.push(KeyValue::new( - "http.path", - Value::String("/path/12314/?q=ddds#123".into()), - )); + attributes.push(KeyValue::new(HTTP_PATH, "/path/12314/?q=ddds#123")); // urlAttribute = "http.url" - attributes.push( - semcov::trace::HTTP_URL.string("https://example.com:8080/webshop/articles/4?s=1"), - ); + attributes.push(KeyValue::new( + semcov::trace::HTTP_URL, + "https://example.com:8080/webshop/articles/4?s=1", + )); // userAgentAttribute = "http.user_agent" - attributes.push(HTTP_USER_AGENT.string("CERN-LineMode/2.15 libwww/2.17b3")); + attributes.push(KeyValue::new( + HTTP_USER_AGENT, + "CERN-LineMode/2.15 libwww/2.17b3", + )); // statusCodeAttribute = "http.status_code" - attributes.push(semcov::trace::HTTP_STATUS_CODE.i64(200)); + attributes.push(KeyValue::new(semcov::trace::HTTP_STATUS_CODE, 200i64)); // statusCodeAttribute = "http.route" - attributes.push(semcov::trace::HTTP_ROUTE.string("/webshop/articles/:article_id")); + attributes.push(KeyValue::new( + semcov::trace::HTTP_ROUTE, + "/webshop/articles/:article_id", + )); // serviceAttribute = "service.name" - let resources = Resource::new([semcov::resource::SERVICE_NAME.string("Test Service Name")]); + let resources = Resource::new([KeyValue::new( + semcov::resource::SERVICE_NAME, + "Test Service Name", + )]); let actual: Attributes = (attributes, &resources).into(); @@ -919,7 +925,10 @@ mod tests { #[test] fn test_too_many() { - let resources = Resource::new([semcov::resource::SERVICE_NAME.string("Test Service Name")]); + let resources = Resource::new([KeyValue::new( + semcov::resource::SERVICE_NAME, + "Test Service Name", + )]); let mut attributes = Vec::with_capacity(32); for i in 0..32 { attributes.push(KeyValue::new( @@ -942,7 +951,10 @@ mod tests { #[test] fn test_attributes_mapping_http_target() { - let attributes = vec![semcov::trace::HTTP_TARGET.string("/path/12314/?q=ddds#123")]; + let attributes = vec![KeyValue::new( + semcov::trace::HTTP_TARGET, + "/path/12314/?q=ddds#123", + )]; // hostAttribute = "http.target" diff --git a/opentelemetry-user-events-metrics/examples/basic.rs b/opentelemetry-user-events-metrics/examples/basic.rs index 83e52a38..9266b345 100644 --- a/opentelemetry-user-events-metrics/examples/basic.rs +++ b/opentelemetry-user-events-metrics/examples/basic.rs @@ -4,7 +4,7 @@ use opentelemetry::{ KeyValue, }; use opentelemetry_sdk::{ - metrics::{PeriodicReader, MeterProvider as SdkMeterProvider}, + metrics::{MeterProvider as SdkMeterProvider, PeriodicReader}, runtime, Resource, }; use opentelemetry_user_events_metrics::MetricsExporter; diff --git a/scripts/lint.sh b/scripts/lint.sh index f6b69701..3c19c88f 100755 --- a/scripts/lint.sh +++ b/scripts/lint.sh @@ -14,43 +14,30 @@ if rustup component add clippy; then `# Exit with a nonzero code if there are clippy warnings` \ -Dwarnings - cargo_feature opentelemetry "trace,metrics,logs,logs_level_enabled,testing" - - cargo_feature opentelemetry-otlp "default" - cargo_feature opentelemetry-otlp "default,tls" - cargo_feature opentelemetry-otlp "default,tls-roots" - cargo_feature opentelemetry-otlp "trace,grpc-sys" - cargo_feature opentelemetry-otlp "trace,grpc-sys,openssl" - cargo_feature opentelemetry-otlp "trace,grpc-sys,openssl-vendored" - cargo_feature opentelemetry-otlp "http-proto" - cargo_feature opentelemetry-otlp "http-proto, reqwest-blocking-client" - cargo_feature opentelemetry-otlp "http-proto, reqwest-client" - cargo_feature opentelemetry-otlp "http-proto, reqwest-rustls" - cargo_feature opentelemetry-otlp "http-proto, surf-client, surf/curl-client" - cargo_feature opentelemetry-otlp "metrics" - - cargo_feature opentelemetry-jaeger "surf_collector_client, surf/curl-client" - cargo_feature opentelemetry-jaeger "isahc_collector_client" - cargo_feature opentelemetry-jaeger "reqwest_blocking_collector_client" - cargo_feature opentelemetry-jaeger "reqwest_collector_client" - cargo_feature opentelemetry-jaeger "hyper_collector_client" - cargo_feature opentelemetry-jaeger "hyper_tls_collector_client" - cargo_feature opentelemetry-jaeger "collector_client" - cargo_feature opentelemetry-jaeger "wasm_collector_client" - cargo_feature opentelemetry-jaeger "collector_client, wasm_collector_client" - cargo_feature opentelemetry-jaeger "default" - - cargo_feature opentelemetry-proto "default" - cargo_feature opentelemetry-proto "full" - cargo_feature opentelemetry-proto "gen-tonic,trace" - cargo_feature opentelemetry-proto "gen-tonic,trace,with-serde" - cargo_feature opentelemetry-proto "gen-tonic,metrics" - cargo_feature opentelemetry-proto "gen-tonic,logs" - cargo_feature opentelemetry-proto "gen-grpcio,trace" - cargo_feature opentelemetry-proto "gen-grpcio,trace,with-serde" - cargo_feature opentelemetry-proto "gen-grpcio,metrics" - cargo_feature opentelemetry-proto "gen-grpcio,logs" - cargo_feature opentelemetry-proto "gen-grpcio,zpages" - cargo_feature opentelemetry-proto "gen-grpcio,zpages,with-serde" - + cargo_feature opentelemetry-aws "default" + +# TODO: Can re-enable once back in the workspace. +# cargo_feature opentelemetry-datadog "reqwest-blocking-client" +# cargo_feature opentelemetry-datadog "reqwest-client" +# cargo_feature opentelemetry-datadog "surf-client" + + cargo_feature opentelemetry-contrib "default" + cargo_feature opentelemetry-contrib "api" + cargo_feature opentelemetry-contrib "base64_format" + cargo_feature opentelemetry-contrib "binary_propagator" + cargo_feature opentelemetry-contrib "jaeger_json_exporter" + cargo_feature opentelemetry-contrib "rt-tokio" + cargo_feature opentelemetry-contrib "rt-tokio-current-thread" + cargo_feature opentelemetry-contrib "rt-async-std" + +# TODO: Can re-enable once back in the workspace. +# cargo_feature opentelemetry-stackdriver "default" +# cargo_feature opentelemetry-stackdriver "yup-authorizer" +# cargo_feature opentelemetry-stackdriver "tls-native-roots" +# cargo_feature opentelemetry-stackdriver "tls-webpki-roots" + + cargo_feature opentelemetry-user-events-logs "default" + cargo_feature opentelemetry-user-events-logs "logs_level_enabled" + + cargo_feature opentelemetry-user-events-metrics "" fi diff --git a/scripts/test.sh b/scripts/test.sh index 611f1714..b431df19 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -5,7 +5,9 @@ set -eu cargo test --all --all-features "$@" -- --test-threads=1 cargo test --manifest-path=opentelemetry-contrib/Cargo.toml --all-features -cargo test --manifest-path=opentelemetry-datadog/Cargo.toml --all-features -cargo test --manifest-path=opentelemetry-stackdriver/Cargo.toml --all-features +# TODO: Test like others when they're back in the workspace +#cargo test --manifest-path=opentelemetry-datadog/Cargo.toml --all-features +#cargo test --manifest-path=opentelemetry-stackdriver/Cargo.toml --all-features + cargo test --manifest-path=opentelemetry-user-events-logs/Cargo.toml --all-features cargo test --manifest-path=opentelemetry-user-events-metrics/Cargo.toml --all-features