From bfbd517d777236820a5dcdaaa70ecc35a204034f Mon Sep 17 00:00:00 2001 From: Lalit Date: Wed, 5 Jun 2024 00:24:48 -0700 Subject: [PATCH 1/4] test serde for i64 --- .../expected/serialized_traces.json | 135 ++++++++++++++++++ .../integration_test/src/trace_asserter.rs | 2 +- .../tests/integration_test/tests/traces.rs | 17 +++ opentelemetry-proto/src/proto.rs | 7 +- 4 files changed, 159 insertions(+), 2 deletions(-) create mode 100644 opentelemetry-otlp/tests/integration_test/expected/serialized_traces.json diff --git a/opentelemetry-otlp/tests/integration_test/expected/serialized_traces.json b/opentelemetry-otlp/tests/integration_test/expected/serialized_traces.json new file mode 100644 index 0000000000..849e66dd7b --- /dev/null +++ b/opentelemetry-otlp/tests/integration_test/expected/serialized_traces.json @@ -0,0 +1,135 @@ +{ + "resourceSpans": [ + { + "resource": { + "attributes": [ + { + "key": "service.name", + "value": { + "stringValue": "basic-otlp-tracing-example" + } + } + ], + "droppedAttributesCount": 0 + }, + "scopeSpans": [ + { + "scope": { + "name": "ex.com/basic", + "version": "", + "attributes": [], + "droppedAttributesCount": 0 + }, + "spans": [ + { + "traceId": "9b458af7378cba65253d7042d34fc72e", + "spanId": "cd7cf7bf939930b7", + "traceState": "", + "parentSpanId": "d58cf2d702a061e0", + "flags": 0, + "name": "Sub operation...", + "kind": 1, + "startTimeUnixNano": "1703985537070566698", + "endTimeUnixNano": "1703985537070572718", + "attributes": [ + { + "key": "lemons", + "value": { + "stringValue": "five" + } + } + ], + "droppedAttributesCount": 0, + "events": [ + { + "timeUnixNano": "1703985537070567697", + "name": "Sub span event", + "attributes": [], + "droppedAttributesCount": 0 + } + ], + "droppedEventsCount": 0, + "links": [], + "droppedLinksCount": 0, + "status": { + "message": "", + "code": 0 + } + } + ], + "schemaUrl": "" + } + ], + "schemaUrl": "" + }, + { + "resource": { + "attributes": [ + { + "key": "service.name", + "value": { + "stringValue": "basic-otlp-tracing-example" + } + } + ], + "droppedAttributesCount": 0 + }, + "scopeSpans": [ + { + "scope": { + "name": "ex.com/basic", + "version": "", + "attributes": [], + "droppedAttributesCount": 0 + }, + "spans": [ + { + "traceId": "9b458af7378cba65253d7042d34fc72e", + "spanId": "d58cf2d702a061e0", + "traceState": "", + "parentSpanId": "", + "flags": 0, + "name": "operation", + "kind": 1, + "startTimeUnixNano": "1703985537070558635", + "endTimeUnixNano": "1703985537070580454", + "attributes": [ + { + "key": "ex.com/another", + "value": { + "stringValue": "yes" + } + } + ], + "droppedAttributesCount": 0, + "events": [ + { + "timeUnixNano": "1703985537070563326", + "name": "Nice operation!", + "attributes": [ + { + "key": "bogons", + "value": { + "intValue": "100" + } + } + ], + "droppedAttributesCount": 0 + } + ], + "droppedEventsCount": 0, + "links": [], + "droppedLinksCount": 0, + "status": { + "message": "", + "code": 0 + } + } + ], + "schemaUrl": "" + } + ], + "schemaUrl": "" + } + ] +} \ No newline at end of file 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..f7f3a132fc 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,18 @@ 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(); +} \ No newline at end of file diff --git a/opentelemetry-proto/src/proto.rs b/opentelemetry-proto/src/proto.rs index fd7ddd7652..51dca24c0c 100644 --- a/opentelemetry-proto/src/proto.rs +++ b/opentelemetry-proto/src/proto.rs @@ -53,7 +53,12 @@ pub(crate) mod serializers { // 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)) => { + // Create a struct to wrap the intValue + let mut state = serializer.serialize_struct("Value", 1)?; + state.serialize_field("intValue", &i.to_string())?; + state.end() + }, Some(value) => value.serialize(serializer), None => serializer.serialize_none(), }, From d9ab817d1b2e4f7b7cbf0e20cbc85a3e01e155bb Mon Sep 17 00:00:00 2001 From: Lalit Kumar Bhasin Date: Thu, 13 Jun 2024 14:36:07 -0700 Subject: [PATCH 2/4] remove generated json --- .../expected/serialized_traces.json | 135 ------------------ .../tests/integration_test/tests/traces.rs | 20 ++- 2 files changed, 15 insertions(+), 140 deletions(-) delete mode 100644 opentelemetry-otlp/tests/integration_test/expected/serialized_traces.json diff --git a/opentelemetry-otlp/tests/integration_test/expected/serialized_traces.json b/opentelemetry-otlp/tests/integration_test/expected/serialized_traces.json deleted file mode 100644 index 849e66dd7b..0000000000 --- a/opentelemetry-otlp/tests/integration_test/expected/serialized_traces.json +++ /dev/null @@ -1,135 +0,0 @@ -{ - "resourceSpans": [ - { - "resource": { - "attributes": [ - { - "key": "service.name", - "value": { - "stringValue": "basic-otlp-tracing-example" - } - } - ], - "droppedAttributesCount": 0 - }, - "scopeSpans": [ - { - "scope": { - "name": "ex.com/basic", - "version": "", - "attributes": [], - "droppedAttributesCount": 0 - }, - "spans": [ - { - "traceId": "9b458af7378cba65253d7042d34fc72e", - "spanId": "cd7cf7bf939930b7", - "traceState": "", - "parentSpanId": "d58cf2d702a061e0", - "flags": 0, - "name": "Sub operation...", - "kind": 1, - "startTimeUnixNano": "1703985537070566698", - "endTimeUnixNano": "1703985537070572718", - "attributes": [ - { - "key": "lemons", - "value": { - "stringValue": "five" - } - } - ], - "droppedAttributesCount": 0, - "events": [ - { - "timeUnixNano": "1703985537070567697", - "name": "Sub span event", - "attributes": [], - "droppedAttributesCount": 0 - } - ], - "droppedEventsCount": 0, - "links": [], - "droppedLinksCount": 0, - "status": { - "message": "", - "code": 0 - } - } - ], - "schemaUrl": "" - } - ], - "schemaUrl": "" - }, - { - "resource": { - "attributes": [ - { - "key": "service.name", - "value": { - "stringValue": "basic-otlp-tracing-example" - } - } - ], - "droppedAttributesCount": 0 - }, - "scopeSpans": [ - { - "scope": { - "name": "ex.com/basic", - "version": "", - "attributes": [], - "droppedAttributesCount": 0 - }, - "spans": [ - { - "traceId": "9b458af7378cba65253d7042d34fc72e", - "spanId": "d58cf2d702a061e0", - "traceState": "", - "parentSpanId": "", - "flags": 0, - "name": "operation", - "kind": 1, - "startTimeUnixNano": "1703985537070558635", - "endTimeUnixNano": "1703985537070580454", - "attributes": [ - { - "key": "ex.com/another", - "value": { - "stringValue": "yes" - } - } - ], - "droppedAttributesCount": 0, - "events": [ - { - "timeUnixNano": "1703985537070563326", - "name": "Nice operation!", - "attributes": [ - { - "key": "bogons", - "value": { - "intValue": "100" - } - } - ], - "droppedAttributesCount": 0 - } - ], - "droppedEventsCount": 0, - "links": [], - "droppedLinksCount": 0, - "status": { - "message": "", - "code": 0 - } - } - ], - "schemaUrl": "" - } - ], - "schemaUrl": "" - } - ] -} \ No newline at end of file diff --git a/opentelemetry-otlp/tests/integration_test/tests/traces.rs b/opentelemetry-otlp/tests/integration_test/tests/traces.rs index f7f3a132fc..a6a3980e01 100644 --- a/opentelemetry-otlp/tests/integration_test/tests/traces.rs +++ b/opentelemetry-otlp/tests/integration_test/tests/traces.rs @@ -88,15 +88,25 @@ pub fn test_assert_span_eq() { #[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"); + 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")); + 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(); -} \ No newline at end of file +} From 5d8c432ceaf4f34eba72801befd125b65530e86c Mon Sep 17 00:00:00 2001 From: Lalit Date: Fri, 14 Jun 2024 13:24:59 -0700 Subject: [PATCH 3/4] fix --- opentelemetry-otlp/CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) 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 From 8561bd88e1f75bdc4c464cab83d1a356c40d1072 Mon Sep 17 00:00:00 2001 From: Lalit Date: Mon, 17 Jun 2024 08:59:07 -0700 Subject: [PATCH 4/4] improve error handling --- opentelemetry-proto/src/proto.rs | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/opentelemetry-proto/src/proto.rs b/opentelemetry-proto/src/proto.rs index 51dca24c0c..8bc372b889 100644 --- a/opentelemetry-proto/src/proto.rs +++ b/opentelemetry-proto/src/proto.rs @@ -46,19 +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)) => { - // Create a struct to wrap the intValue - let mut state = serializer.serialize_struct("Value", 1)?; - state.serialize_field("intValue", &i.to_string())?; - state.end() - }, + // 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(), },