From 66e3ea5335e883b0f9d8fb8659a01d55d37ff433 Mon Sep 17 00:00:00 2001 From: Mark Ingram Date: Thu, 13 Jun 2024 21:02:26 +0100 Subject: [PATCH 1/5] [opentelemetry-otlp] basic-otlp-http example - trivial cleanup (#1878) Co-authored-by: Cijo Thomas --- opentelemetry-otlp/examples/basic-otlp-http/src/main.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/opentelemetry-otlp/examples/basic-otlp-http/src/main.rs b/opentelemetry-otlp/examples/basic-otlp-http/src/main.rs index 205ac0362a..4e73537ce8 100644 --- a/opentelemetry-otlp/examples/basic-otlp-http/src/main.rs +++ b/opentelemetry-otlp/examples/basic-otlp-http/src/main.rs @@ -50,7 +50,7 @@ fn init_tracer_provider() -> Result { } fn init_metrics() -> Result { - let provider = opentelemetry_otlp::new_pipeline() + opentelemetry_otlp::new_pipeline() .metrics(opentelemetry_sdk::runtime::Tokio) .with_exporter( opentelemetry_otlp::new_exporter() @@ -58,11 +58,7 @@ fn init_metrics() -> Result Ok(provider), - Err(err) => Err(err), - } + .build() } #[tokio::main] @@ -85,6 +81,7 @@ async fn main() -> Result<(), Box> { ); let meter_provider = result.unwrap(); + global::set_meter_provider(meter_provider.clone()); // Opentelemetry will not provide a global API to manage the logger // provider. Application users must manage the lifecycle of the logger From 50c574a18b2af173c2d909bba6e6a37102c93208 Mon Sep 17 00:00:00 2001 From: Utkarsh Umesan Pillai <66651184+utpilla@users.noreply.github.com> Date: Thu, 13 Jun 2024 18:05:27 -0700 Subject: [PATCH 2/5] Add criterion to workspace dependencies (#1883) --- Cargo.toml | 1 + opentelemetry-appender-tracing/Cargo.toml | 4 ++-- opentelemetry-proto/Cargo.toml | 2 +- opentelemetry-sdk/Cargo.toml | 2 +- opentelemetry/Cargo.toml | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 7864f2b31e..f5d93d6b8a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,6 +19,7 @@ debug = 1 async-std = "1.10" async-trait = "0.1" bytes = "1" +criterion = "0.5" futures-core = "0.3" futures-executor = "0.3" futures-util = { version = "0.3", default-features = false } diff --git a/opentelemetry-appender-tracing/Cargo.toml b/opentelemetry-appender-tracing/Cargo.toml index 7f94e9ec0a..87db2e115f 100644 --- a/opentelemetry-appender-tracing/Cargo.toml +++ b/opentelemetry-appender-tracing/Cargo.toml @@ -24,8 +24,8 @@ log = { workspace = true } opentelemetry-stdout = { path = "../opentelemetry-stdout", features = ["logs"] } opentelemetry_sdk = { path = "../opentelemetry-sdk", features = ["logs", "testing"] } tracing-log = "0.2" -async-trait = "0.1" -criterion = "0.5.1" +async-trait = { workspace = true } +criterion = { workspace = true } [features] experimental_metadata_attributes = ["dep:tracing-log"] diff --git a/opentelemetry-proto/Cargo.toml b/opentelemetry-proto/Cargo.toml index 65836b58e7..626542884d 100644 --- a/opentelemetry-proto/Cargo.toml +++ b/opentelemetry-proto/Cargo.toml @@ -60,4 +60,4 @@ hex = { version = "0.4.3", optional = true } tonic-build = { workspace = true } prost-build = { workspace = true } tempfile = "3.3.0" -serde_json = "1.0" +serde_json = { workspace = true } \ No newline at end of file diff --git a/opentelemetry-sdk/Cargo.toml b/opentelemetry-sdk/Cargo.toml index e57aa5d612..59d2abc1c1 100644 --- a/opentelemetry-sdk/Cargo.toml +++ b/opentelemetry-sdk/Cargo.toml @@ -34,7 +34,7 @@ all-features = true rustdoc-args = ["--cfg", "docsrs"] [dev-dependencies] -criterion = { version = "0.5", features = ["html_reports"] } +criterion = { workspace = true, features = ["html_reports"] } temp-env = { workspace = true } [target.'cfg(not(target_os = "windows"))'.dev-dependencies] diff --git a/opentelemetry/Cargo.toml b/opentelemetry/Cargo.toml index f9e7d9c42e..ac5e5f69d3 100644 --- a/opentelemetry/Cargo.toml +++ b/opentelemetry/Cargo.toml @@ -41,7 +41,7 @@ otel_unstable = [] [dev-dependencies] opentelemetry_sdk = { path = "../opentelemetry-sdk", features = ["logs_level_enabled"]} # for documentation tests -criterion = { version = "0.3" } +criterion = { workspace = true } rand = { workspace = true } [[bench]] From 3e49f2313e7091bf10bb7b59086b31bf637601d3 Mon Sep 17 00:00:00 2001 From: Utkarsh Umesan Pillai <66651184+utpilla@users.noreply.github.com> Date: Fri, 14 Jun 2024 17:40:41 -0700 Subject: [PATCH 3/5] Remove "logs_level_enabled" from cargo toml for appender crates (#1885) --- opentelemetry-appender-log/Cargo.toml | 1 - opentelemetry-appender-tracing/Cargo.toml | 1 - 2 files changed, 2 deletions(-) diff --git a/opentelemetry-appender-log/Cargo.toml b/opentelemetry-appender-log/Cargo.toml index 17bf2c3049..f383b0b322 100644 --- a/opentelemetry-appender-log/Cargo.toml +++ b/opentelemetry-appender-log/Cargo.toml @@ -18,7 +18,6 @@ serde = { workspace = true, optional = true, features = ["std"] } [features] logs_level_enabled = ["opentelemetry/logs_level_enabled"] with-serde = ["log/kv_serde", "serde"] -default = ["logs_level_enabled"] [dev-dependencies] opentelemetry_sdk = { path = "../opentelemetry-sdk", features = [ "testing", "logs_level_enabled" ] } diff --git a/opentelemetry-appender-tracing/Cargo.toml b/opentelemetry-appender-tracing/Cargo.toml index 87db2e115f..7ce1834746 100644 --- a/opentelemetry-appender-tracing/Cargo.toml +++ b/opentelemetry-appender-tracing/Cargo.toml @@ -30,7 +30,6 @@ criterion = { workspace = true } [features] experimental_metadata_attributes = ["dep:tracing-log"] logs_level_enabled = ["opentelemetry/logs_level_enabled"] -default = ["logs_level_enabled"] [[bench]] From da368d4085bcc3bbc8c3b2932a07827bc600dbbd Mon Sep 17 00:00:00 2001 From: Utkarsh Umesan Pillai <66651184+utpilla@users.noreply.github.com> Date: Mon, 17 Jun 2024 15:55:13 -0700 Subject: [PATCH 4/5] Simplify tracing-grpc example (#1886) --- examples/tracing-grpc/src/client.rs | 10 ++++------ examples/tracing-http-propagator/src/client.rs | 2 +- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/examples/tracing-grpc/src/client.rs b/examples/tracing-grpc/src/client.rs index c35dee079e..38a7c93f92 100644 --- a/examples/tracing-grpc/src/client.rs +++ b/examples/tracing-grpc/src/client.rs @@ -50,9 +50,9 @@ pub mod hello_world { async fn greet() -> Result<(), Box> { let tracer = global::tracer("example/client"); let span = tracer - .span_builder(String::from("Greeter/client")) + .span_builder("Greeter/client") .with_kind(SpanKind::Client) - .with_attributes(vec![KeyValue::new("component", "grpc")]) + .with_attributes([KeyValue::new("component", "grpc")]) .start(&tracer); let cx = Context::current_with_span(span); let mut client = GreeterClient::connect("http://[::1]:50051").await?; @@ -75,10 +75,8 @@ async fn greet() -> Result<(), Box Date: Tue, 18 Jun 2024 13:53:41 -0700 Subject: [PATCH 5/5] fix otlp/json exporter (#1882) --- opentelemetry-otlp/CHANGELOG.md | 2 ++ .../integration_test/src/trace_asserter.rs | 2 +- .../tests/integration_test/tests/traces.rs | 27 +++++++++++++++++++ opentelemetry-proto/src/proto.rs | 22 +++++++++++---- 4 files changed, 47 insertions(+), 6 deletions(-) diff --git a/opentelemetry-otlp/CHANGELOG.md b/opentelemetry-otlp/CHANGELOG.md index 5ec7699d2a..476be0026b 100644 --- a/opentelemetry-otlp/CHANGELOG.md +++ b/opentelemetry-otlp/CHANGELOG.md @@ -16,6 +16,8 @@ now use `.with_resource(RESOURCE::default())` to configure Resource when using These methods would also no longer set the global tracer provider. It would now be the responsibility of users to set it by calling `global::set_tracer_provider(tracer_provider.clone());`. Refer to the [basic-otlp](https://github.com/open-telemetry/opentelemetry-rust/blob/main/opentelemetry-otlp/examples/basic-otlp/src/main.rs) and [basic-otlp-http](https://github.com/open-telemetry/opentelemetry-rust/blob/main/opentelemetry-otlp/examples/basic-otlp-http/src/main.rs) examples on how to initialize OTLP Trace Exporter. - **Breaking** Correct the misspelling of "webkpi" to "webpki" in features [#1842](https://github.com/open-telemetry/opentelemetry-rust/pull/1842) - Bump MSRV to 1.70 [#1840](https://github.com/open-telemetry/opentelemetry-rust/pull/1840) +- Fixing the OTLP HTTP/JSON exporter. [#1882](https://github.com/open-telemetry/opentelemetry-rust/pull/1882) - The exporter was broken in the + previous release. ## v0.16.0 diff --git a/opentelemetry-otlp/tests/integration_test/src/trace_asserter.rs b/opentelemetry-otlp/tests/integration_test/src/trace_asserter.rs index 47af933a83..00c7c2300d 100644 --- a/opentelemetry-otlp/tests/integration_test/src/trace_asserter.rs +++ b/opentelemetry-otlp/tests/integration_test/src/trace_asserter.rs @@ -216,6 +216,6 @@ fn span_eq(left: &Span, right: &Span) -> bool { pub fn read_spans_from_json(file: File) -> Vec { let reader = std::io::BufReader::new(file); - let trace_data: TracesData = serde_json::from_reader(reader).unwrap(); + let trace_data: TracesData = serde_json::from_reader(reader).expect("Failed to read json file"); trace_data.resource_spans } diff --git a/opentelemetry-otlp/tests/integration_test/tests/traces.rs b/opentelemetry-otlp/tests/integration_test/tests/traces.rs index 6fac7749ff..a6a3980e01 100644 --- a/opentelemetry-otlp/tests/integration_test/tests/traces.rs +++ b/opentelemetry-otlp/tests/integration_test/tests/traces.rs @@ -8,9 +8,11 @@ use opentelemetry::{ trace::{TraceContextExt, Tracer}, Key, KeyValue, }; +use opentelemetry_proto::tonic::trace::v1::TracesData; use opentelemetry_sdk::{runtime, trace as sdktrace, Resource}; use std::error::Error; use std::fs::File; +use std::io::Write; use std::os::unix::fs::MetadataExt; fn init_tracer_provider() -> Result { @@ -83,3 +85,28 @@ pub fn test_assert_span_eq() { TraceAsserter::new(spans.clone(), spans).assert(); } + +#[test] +pub fn test_serde() { + let spans = read_spans_from_json( + File::open("./expected/traces.json").expect("Failed to read traces.json"), + ); + let json = serde_json::to_string_pretty(&TracesData { + resource_spans: spans, + }) + .expect("Failed to serialize spans to json"); + + // Write to file. + let mut file = File::create("./expected/serialized_traces.json").unwrap(); + file.write_all(json.as_bytes()).unwrap(); + + let left = read_spans_from_json( + File::open("./expected/traces.json").expect("Failed to read traces.json"), + ); + let right = read_spans_from_json( + File::open("./expected/serialized_traces.json") + .expect("Failed to read serialized_traces.json"), + ); + + TraceAsserter::new(left, right).assert(); +} diff --git a/opentelemetry-proto/src/proto.rs b/opentelemetry-proto/src/proto.rs index fd7ddd7652..8bc372b889 100644 --- a/opentelemetry-proto/src/proto.rs +++ b/opentelemetry-proto/src/proto.rs @@ -46,14 +46,26 @@ pub(crate) mod serializers { // AnyValue <-> KeyValue conversion pub fn serialize_to_value(value: &Option, serializer: S) -> Result - where - S: Serializer, + where + S: Serializer, { - // Serialize any_value::Value using its own implementation - // If value is None, it will be serialized as such match value { Some(any_value) => match &any_value.value { - Some(Value::IntValue(i)) => serialize_i64_to_string(i, serializer), + Some(Value::IntValue(i)) => { + // Attempt to create a struct to wrap the intValue + let mut state = match serializer.serialize_struct("Value", 1) { + Ok(s) => s, + Err(e) => return Err(e), // Handle the error or return it + }; + + // Attempt to serialize the intValue field + if let Err(e) = state.serialize_field("intValue", &i.to_string()) { + return Err(e); // Handle the error or return it + } + + // Finalize the struct serialization + state.end() + }, Some(value) => value.serialize(serializer), None => serializer.serialize_none(), },