Skip to content

Commit 656b1e6

Browse files
lalitbTommyCpp
andauthored
Enable integration test for Span validation (#1753)
Co-authored-by: Zhongyang Wu <zhongyang.wu@outlook.com>
1 parent e726892 commit 656b1e6

File tree

4 files changed

+96
-17
lines changed

4 files changed

+96
-17
lines changed

opentelemetry-otlp/tests/integration_test/expected/failed_traces.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@
8686
{
8787
"key": "bogons",
8888
"value": {
89-
"intValue": 100
89+
"intValue": "100"
9090
}
9191
}
9292
]

opentelemetry-otlp/tests/integration_test/expected/traces.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@
8686
{
8787
"key": "bogons",
8888
"value": {
89-
"intValue": 100
89+
"intValue": "100"
9090
}
9191
}
9292
]

opentelemetry-otlp/tests/integration_test/tests/traces.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,12 @@ pub async fn traces() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
5858
Ok(())
5959
}
6060

61-
pub fn assert_traces_results(result: &str, _: &str) {
62-
// let left = read_spans_from_json(File::open(expected).unwrap());
63-
// let right = read_spans_from_json(File::open(result).unwrap());
61+
pub fn assert_traces_results(result: &str, expected: &str) {
62+
let left = read_spans_from_json(File::open(expected).unwrap());
63+
let right = read_spans_from_json(File::open(result).unwrap());
64+
65+
TraceAsserter::new(left, right).assert();
6466

65-
// TraceAsserter::new(left, right).assert();
66-
//
6767
// we cannot read result json file because the timestamp was represents as string instead of u64.
6868
// need to fix it on json file exporter
6969

opentelemetry-proto/src/proto.rs

+89-10
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
/// See https://opentelemetry.io/docs/specs/otlp/#json-protobuf-encoding for more details
44
#[cfg(all(feature = "with-serde", feature = "gen-tonic-messages"))]
55
pub(crate) mod serializers {
6-
use crate::tonic::common::v1::any_value::Value;
6+
use crate::tonic::common::v1::any_value::{self, Value};
77
use crate::tonic::common::v1::AnyValue;
88
use serde::de::{self, MapAccess, Visitor};
99
use serde::ser::SerializeStruct;
@@ -52,23 +52,86 @@ pub(crate) mod serializers {
5252
// Serialize any_value::Value using its own implementation
5353
// If value is None, it will be serialized as such
5454
match value {
55-
Some(value) => value.value.serialize(serializer),
55+
Some(any_value) => match &any_value.value {
56+
Some(Value::IntValue(i)) => serialize_i64_to_string(i, serializer),
57+
Some(value) => value.serialize(serializer),
58+
None => serializer.serialize_none(),
59+
},
5660
None => serializer.serialize_none(),
5761
}
58-
5962
}
6063

6164
pub fn deserialize_from_value<'de, D>(deserializer: D) -> Result<Option<AnyValue>, D::Error>
62-
where
63-
D: Deserializer<'de>,
64-
{
65-
// Deserialize any_value::Value using its own implementation
66-
let value = Option::<Value>::deserialize(deserializer)?;
65+
where
66+
D: Deserializer<'de>,
67+
{
68+
struct ValueVisitor;
69+
70+
impl<'de> de::Visitor<'de> for ValueVisitor {
71+
type Value = AnyValue;
72+
73+
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
74+
formatter.write_str("a JSON object for AnyValue")
75+
}
6776

68-
// Wrap the deserialized value in AnyValue
69-
Ok(Some(AnyValue { value }))
77+
fn visit_map<V>(self, mut map: V) -> Result<AnyValue, V::Error>
78+
where
79+
V: de::MapAccess<'de>,
80+
{
81+
let mut value: Option<any_value::Value> = None;
82+
83+
while let Some(key) = map.next_key::<String>()? {
84+
let key_str = key.as_str();
85+
match key_str {
86+
"stringValue" => {
87+
let s = map.next_value()?;
88+
value = Some(any_value::Value::StringValue(s));
89+
},
90+
"boolValue" => {
91+
let b = map.next_value()?;
92+
value = Some(any_value::Value::BoolValue(b));
93+
},
94+
"intValue" => {
95+
let value_str = map.next_value::<String>()?;
96+
let int_value = value_str.parse::<i64>()
97+
.map_err(de::Error::custom)?;
98+
value = Some(any_value::Value::IntValue(int_value));
99+
},
100+
"doubleValue" => {
101+
let d = map.next_value()?;
102+
value = Some(any_value::Value::DoubleValue(d));
103+
},
104+
"arrayValue" => {
105+
let a = map.next_value()?;
106+
value = Some(any_value::Value::ArrayValue(a));
107+
},
108+
"kvlistValue" => {
109+
let kv = map.next_value()?;
110+
value = Some(any_value::Value::KvlistValue(kv));
111+
},
112+
"bytesValue" => {
113+
let bytes = map.next_value()?;
114+
value = Some(any_value::Value::BytesValue(bytes));
115+
},
116+
_ => {
117+
//skip unknown keys, and handle error later.
118+
continue
119+
}
120+
}
121+
}
122+
123+
if let Some(v) = value {
124+
Ok(AnyValue { value: Some(v) })
125+
} else {
126+
Err(de::Error::custom("Invalid data for AnyValue, no known keys found"))
127+
}
128+
}
70129
}
71130

131+
let value = deserializer.deserialize_map(ValueVisitor)?;
132+
Ok(Some(value))
133+
}
134+
72135
pub fn serialize_u64_to_string<S>(value: &u64, serializer: S) -> Result<S::Ok, S::Error>
73136
where
74137
S: Serializer,
@@ -84,6 +147,22 @@ pub(crate) mod serializers {
84147
let s: String = Deserialize::deserialize(deserializer)?;
85148
s.parse::<u64>().map_err(de::Error::custom)
86149
}
150+
151+
pub fn serialize_i64_to_string<S>(value: &i64, serializer: S) -> Result<S::Ok, S::Error>
152+
where
153+
S: Serializer,
154+
{
155+
let s = value.to_string();
156+
serializer.serialize_str(&s)
157+
}
158+
159+
pub fn deserialize_string_to_i64<'de, D>(deserializer: D) -> Result<i64, D::Error>
160+
where
161+
D: Deserializer<'de>,
162+
{
163+
let s: String = Deserialize::deserialize(deserializer)?;
164+
s.parse::<i64>().map_err(de::Error::custom)
165+
}
87166
}
88167

89168
#[cfg(feature = "gen-tonic-messages")]

0 commit comments

Comments
 (0)